diff --git a/.ipynb_checkpoints/Research-checkpoint.ipynb b/.ipynb_checkpoints/Research-checkpoint.ipynb new file mode 100644 index 0000000..ee7abe6 --- /dev/null +++ b/.ipynb_checkpoints/Research-checkpoint.ipynb @@ -0,0 +1,6633 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import scipy as sp\n", + "import lightkurve as lk\n", + "from scipy import stats\n", + "from ipywidgets import interact, interactive, fixed, interact_manual\n", + "import ipywidgets as widgets\n", + "from astropy import units as u\n", + "from astropy.coordinates import SkyCoord, Angle\n", + "import scipy.optimize as opt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import bokeh \n", + "from bokeh.io import show, output_notebook, push_notebook\n", + "from bokeh.plotting import figure, ColumnDataSource\n", + "from bokeh.models import LogColorMapper,LinearColorMapper, Selection, Slider, RangeSlider, Span, ColorBar, LogTicker, Range1d, Ticker, BasicTicker, Range1d\n", + "from bokeh.layouts import layout, Spacer\n", + "from bokeh.models.tools import HoverTool\n", + "from bokeh.models.widgets import Button, Div\n", + "from bokeh.models.formatters import PrintfTickFormatter" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "#just setting up sample data\n", + "search_result = lk.search_targetpixelfile('TIC425064757', mission='TESS', sector=1)\n", + "tpf = search_result.download(quality_bitmask='default')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "#just setting up sample data\n", + "search_result = lk.search_targetpixelfile('TIC142875987', mission='TESS', sector=4)\n", + "tpf = search_result.download(quality_bitmask='default')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def plotperiodograph(targetpixelfile):\n", + " #This is the mask from lightkurve for the aperture\n", + " aperture = targetpixelfile.pipeline_mask\n", + " \n", + " #This is a postage stamp x and y values for pixels that are part of the aperture\n", + " postagestamp = np.where(aperture == True)\n", + " \n", + " #Setting up the pixel subplots so They create a rectangle of pixels based off the min and max of the row and column values from the aperture mask.\n", + " #Could make ploting functions optional for the user and set this to default\n", + " fig,ax = plt.subplots(len(np.arange(postagestamp[0].min(),postagestamp[0].max()+1)),\n", + " len(np.arange(postagestamp[1].min(),postagestamp[1].max()+1)),\n", + " figsize=(20,20),sharex='col', sharey='row')\n", + "\n", + " #Just making the subplot spacings 0 pixel width and height separation\n", + " fig.subplots_adjust(wspace=0,hspace=0)\n", + " \n", + " \n", + " #iterating through the columns of the postage stamp pixels\n", + " for i in np.arange(postagestamp[0].min(),postagestamp[0].max()+1):\n", + " \n", + " #iterating through the rows of the postage stamp pixels\n", + " for j in np.arange(postagestamp[1].min(),postagestamp[1].max()+1):\n", + " \n", + " #Creating a false mask to alter each iteration\n", + " mask = np.empty((len(aperture),len(aperture[0])), dtype=bool)\n", + " \n", + " #setting one pixel in the postage stamp to have a lightcurve extracted and plotted\n", + " mask[i][j] = True\n", + " \n", + " #extracting the light curve for the target pixel\n", + " \n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " #lightcurve = lightcurve[lightcurve.quality==0]\n", + " periodogram = lightcurve.to_periodogram(oversample_factor=5)\n", + " \n", + " \n", + " #Plotting the target pixel periodograph -- This can also be set up to have looks based on user input if desired\n", + " ax[i-postagestamp[0].min()][j-postagestamp[1].min()].plot(periodogram.frequency,periodogram.power);\n", + " #ax[i-postagestamp[0].min()][j-postagestamp[1].min()].set_yscale('log')\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplotperiodograph\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtpf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m;\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplotperiodograph\u001b[1;34m(targetpixelfile)\u001b[0m\n\u001b[0;32m 30\u001b[0m \u001b[1;31m#extracting the light curve for the target pixel\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 32\u001b[1;33m \u001b[0mlightcurve\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtargetpixelfile\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_lightcurve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maperture_mask\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmask\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 33\u001b[0m \u001b[1;31m#lightcurve = lightcurve[lightcurve.quality==0]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 34\u001b[0m \u001b[0mperiodogram\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlightcurve\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_periodogram\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moversample_factor\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\lightkurve\\targetpixelfile.py\u001b[0m in \u001b[0;36mto_lightcurve\u001b[1;34m(self, method, **kwargs)\u001b[0m\n\u001b[0;32m 369\u001b[0m \"\"\"\n\u001b[0;32m 370\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'aperture'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 371\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextract_aperture_photometry\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 372\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'prf'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 373\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprf_lightcurve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\lightkurve\\targetpixelfile.py\u001b[0m in \u001b[0;36mextract_aperture_photometry\u001b[1;34m(self, aperture_mask)\u001b[0m\n\u001b[0;32m 1562\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0maperture_mask\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1563\u001b[0m \u001b[0mlog\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarning\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Warning: aperture mask contains zero pixels.'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1564\u001b[1;33m \u001b[0mcentroid_col\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcentroid_row\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mestimate_centroids\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maperture_mask\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1565\u001b[0m \u001b[1;31m# Ignore warnings related to zero or negative errors\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1566\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcatch_warnings\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\lightkurve\\targetpixelfile.py\u001b[0m in \u001b[0;36mestimate_centroids\u001b[1;34m(self, aperture_mask)\u001b[0m\n\u001b[0;32m 493\u001b[0m \"\"\"\n\u001b[0;32m 494\u001b[0m \u001b[0maperture_mask\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parse_aperture_mask\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maperture_mask\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 495\u001b[1;33m \u001b[0myy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindices\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 496\u001b[0m \u001b[0myy\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrow\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0myy\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 497\u001b[0m \u001b[0mxx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumn\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mxx\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\lightkurve\\targetpixelfile.py\u001b[0m in \u001b[0;36mshape\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 160\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 161\u001b[0m \u001b[1;34m\"\"\"Return the cube dimension shape.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 162\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflux\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 163\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 164\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\lightkurve\\targetpixelfile.py\u001b[0m in \u001b[0;36mflux\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 185\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mflux\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 186\u001b[0m \u001b[1;34m\"\"\"Returns the flux for all good-quality cadences.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 187\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhdu\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'FLUX'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mquality_mask\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 188\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 189\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plotperiodograph(tpf);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Generalized way to convert each pixel into a light curve.\n", + "2. apply tpf mask to that (bool in def : true,false) to get desired pixels to graph\n", + "3. Make a periodogram for each relevant pixel\n", + "4. Graph that nicely." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Class for the periodograph data/array\n", + "Pass kwargs through" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normalization\n", + "x-xmin / (xmax -xmin)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "class PixelMapPeriodogram:\n", + " def __init__(self , targetpixelfile):\n", + " #Defining an aperture that will be used in plotting and making empty 2-d arrays of the correct size for masks\n", + " aperture = targetpixelfile.pipeline_mask\n", + " \n", + " #Initiating a python list since this is computational slightly faster than a numpy array when initially storing periodogram\n", + " pg = []\n", + "\n", + " \n", + " #Iterating through columns of pixels\n", + " for i in np.arange(0,len(aperture)):\n", + " \n", + " #Iterating through rws of pixels\n", + " for j in np.arange(0,len(aperture[0])):\n", + " \n", + " #Making an empty 2-d array\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " \n", + " #Iterating to isolate pixel by pixel to get light curves\n", + " mask[i][j] = True\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " lc = lc.remove_outliers()\n", + " \n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(method = 'bls')\n", + " periodogram.power = periodogram.power / np.median(periodogram.power)\n", + " periodogram.power[np.where(periodogram.power<0)] = 0\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " \n", + " #Taking the final list and turning it into a 2-d numpy array witht he same dimensions of the full postage stamp \n", + " pg = np.reshape(np.asarray(pg),(len(aperture),len(aperture[0])))\n", + " \n", + " #Defining self.periodogram as this 2-d array of periodogram data\n", + " self.periodogram = pg\n", + " \n", + " #def plotpixels(self):\n", + " \n", + " \n", + " \n", + " \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class PixelMapPeriodogram:\n", + " def __init__(self , targetpixelfile):\n", + " #Defining an aperture that will be used in plotting and making empty 2-d arrays of the correct size for masks\n", + " aperture = targetpixelfile.pipeline_mask\n", + " \n", + " #Initiating a python list since this is computational slightly faster than a numpy array when initially storing periodogram\n", + " pg = []\n", + "\n", + " \n", + " #Iterating through columns of pixels\n", + " for i in np.arange(0,len(aperture)):\n", + " \n", + " #Iterating through rws of pixels\n", + " for j in np.arange(0,len(aperture[0])):\n", + " \n", + " #Making an empty 2-d array\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " \n", + " #Iterating to isolate pixel by pixel to get light curves\n", + " mask[i][j] = True\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " lc = lc.remove_outliers()\n", + " \n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(oversample_factor=5)\n", + " periodogram = periodogram.flatten()\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " \n", + " #Taking the final list and turning it into a 2-d numpy array witht he same dimensions of the full postage stamp \n", + " pg = np.reshape(np.asarray(pg),(len(aperture),len(aperture[0])))\n", + " \n", + " #Defining self.periodogram as this 2-d array of periodogram data\n", + " self.periodogram = pg\n", + " \n", + " #def plotpixels(self):\n", + " \n", + " \n", + " \n", + " \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "metadata": {}, + "outputs": [], + "source": [ + "tpfperiod=PixelMapPeriodogram(tpf)" + ] + }, + { + "cell_type": "code", + "execution_count": 258, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty,~-\\infty] \\; \\mathrm{}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 258, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpfperiod.periodogram[0][0].power[np.where(tpfperiod.periodogram[0][0].power<0)]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 58.9 ms\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%%time \n", + "import time\n", + "\n", + "plt.plot(tpfperiod.periodogram[0][0].frequency, tpfperiod.periodogram[0][0].power)\n", + "plt.xlim(1,350)\n", + "plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 261, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)],\n", + " [LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679),\n", + " LombScarglePeriodogram(ID: TIC 261136679)]], dtype=object)" + ] + }, + "execution_count": 261, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpfperiod.periodogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Interactive plot\n", + "1. Allow for user defined frequency range selection (Slider)\n", + "2. Integrate the power of that range over the frequency width\n", + "3. Plot a heat map\n", + "4. Create sample data and test." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "aperture = tpf.pipeline_mask\n", + "mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + "mask[0][0] = True" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "lcc=tpf.to_lightcurve(aperture_mask=mask)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['2018-07-25 19:07:39.356', '2018-07-25 19:09:39.354',\n", + " '2018-07-25 19:11:39.352', ..., '2018-08-22 16:11:00.470',\n", + " '2018-08-22 16:13:00.467', '2018-08-22 16:15:00.464'], dtype=' low)].sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(self.aperture),len(self.aperture[0])))\n", + " \n", + " def frequency_heat_plot(self,low=1,high=2):\n", + " heat_stamp = []\n", + " \n", + " for i in np.arange(0,len(self.aperture)):\n", + " for j in np.arange(0,len(self.aperture[0])):\n", + " mask = np.zeros((len(self.aperture),len(self.aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = self.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(self.aperture),len(self.aperture[0])))\n", + " plt.imshow(heat_stamp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make it so the frequency_data in the heat stamp can take a tuple of (freq,range centered) and store that in a sep. array, make plot function capable of plotting combination of heat stamps." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'PixelMapPeriodogram' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtpfperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPixelMapPeriodogram\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtpf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'PixelMapPeriodogram' is not defined" + ] + } + ], + "source": [ + "tpfperiod = PixelMapPeriodogram(tpf)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'aperture' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtpfperiod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfrequency_heat_plot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mfrequency_heat_plot\u001b[1;34m(self, low, high)\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[0mheat_stamp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0msums\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 62\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 63\u001b[1;33m \u001b[0mheat_stamp\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mheat_stamp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maperture\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maperture\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 64\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mheat_stamp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'aperture' is not defined" + ] + } + ], + "source": [ + "tpfperiod.frequency_heat_plot()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "metadata": {}, + "outputs": [], + "source": [ + "def frequency_heat_plot(tpfperiod,low=0,high=1):\n", + " heat_stamp = []\n", + " aperture = tpf.pipeline_mask\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = tpfperiod.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))\n", + " plt.imshow(heat_stamp)\n", + " #interact(frequency_heat_plot,low = widgets.IntSlider(min=0,max=freq.max(),step=2,value=1), high = widgets.IntSlider(min=0,max=freq.max(),step=2,value=1))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 282, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "frequency_heat_plot(tpfperiod,65,72)\n", + "#freq =np.asarray(tpfperiod.periodogram[0][0].frequency)\n", + "#interact(frequency_heat_plot(tpfperiod),low = widgets.IntSlider(min=0,max=freq.max(),step=2,value=1), high = widgets.IntSlider(min=0,max=freq.max(),step=2,value=1));\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. if tuple, integrate over each value in tuple\n", + "2. if list use 1 over length of period as the width and integrate frequencies" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class PixelMapPeriodogram:\n", + " def __init__(self , targetpixelfile):\n", + " #Defining an aperture that will be used in plotting and making empty 2-d arrays of the correct size for masks\n", + " aperture = targetpixelfile.pipeline_mask\n", + " \n", + " #Initiating a python list since this is computational slightly faster than a numpy array when initially storing periodogram\n", + " pg = []\n", + "\n", + " \n", + " #Iterating through columns of pixels\n", + " for i in np.arange(0,len(aperture)):\n", + " \n", + " #Iterating through rws of pixels\n", + " for j in np.arange(0,len(aperture[0])):\n", + " \n", + " #Making an empty 2-d array\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " \n", + " #Iterating to isolate pixel by pixel to get light curves\n", + " mask[i][j] = True\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " \n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(oversample_factor=5)\n", + " \n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " \n", + " #Taking the final list and turning it into a 2-d numpy array witht he same dimensions of the full postage stamp \n", + " pg = np.reshape(np.asarray(pg),(len(aperture),len(aperture[0])))\n", + " \n", + " #Defining self.periodogram as this 2-d array of periodogram data\n", + " self.periodogram = pg\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " #def interact(self):\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import division, print_function\n", + "import logging\n", + "import warnings\n", + "import numpy as np\n", + "from astropy.stats import sigma_clip\n", + "import os\n", + "from astropy.coordinates import SkyCoord, Angle\n", + "import astropy.units as u\n", + "\n", + "\n", + "def prepare_periodogram_datasource(pg):\n", + " \"\"\"Prepare a bokeh ColumnDataSource object for tool tips.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve object\n", + " The light curve to be shown.\n", + " Returns\n", + " -------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " \"\"\"\n", + " # Convert time into human readable strings, breaks with NaN time\n", + " # See https://github.com/KeplerGO/lightkurve/issues/116\n", + "\n", + "\n", + "\n", + "\n", + " pg_source = ColumnDataSource(data=dict(power=pg.power,frequency=pg.frequency))\n", + " return pg_source\n", + "\n", + "\n", + "def prepare_tpf_datasource(tpf, aperture_mask):\n", + " \"\"\"Prepare a bokeh DataSource object for selection glyphs\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to be shown.\n", + " aperture_mask : boolean numpy array\n", + " The Aperture mask applied at the startup of interact\n", + " Returns\n", + " -------\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object to be shown.\n", + " \"\"\"\n", + " npix = tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(tpf.flux[0].shape)\n", + " xx = tpf.column + np.arange(tpf.shape[2])\n", + " yy = tpf.row + np.arange(tpf.shape[1])\n", + " xa, ya = np.meshgrid(xx, yy)\n", + " preselected = Selection()\n", + " preselected.indices = pixel_index_array[aperture_mask].reshape(-1).tolist()\n", + " tpf_source = ColumnDataSource(data=dict(xx=xa+0.5, yy=ya+0.5),\n", + " selected=preselected)\n", + " return tpf_source\n", + "\n", + "\n", + "def get_periodogram_y_limits(pg_source):\n", + " \"\"\"Compute sensible defaults for the Y axis limits of the lightcurve plot.\n", + " Parameters\n", + " ----------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " The lightcurve being shown.\n", + " Returns\n", + " -------\n", + " ymin, ymax : float, float\n", + " Flux min and max limits.\n", + " \"\"\"\n", + " #ask about this sigma clip\n", + " power = pg_source.data['power']\n", + "\n", + " low = float(power.min())\n", + " high = float(power.max())\n", + " margin = 0.10 * (high - low)\n", + " return low, high\n", + "\n", + "\n", + "def make_periodogram_figure_elements(pg, pg_source,lc):\n", + " \"\"\"Make the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve\n", + " Lightcurve to be shown.\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object that enables the visualization.\n", + " Returns\n", + " ----------\n", + " fig : `bokeh.plotting.figure` instance\n", + " step_renderer : GlyphRenderer\n", + " vertical_line : Span\n", + " \"\"\"\n", + " if lc.mission == 'K2':\n", + " title = \"Periodogram for {} (K2)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'Kepler':\n", + " title = \"Periodogram for {} (Kepler)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'TESS':\n", + " title = \"Periodogram for {} (TESS)\".format(\n", + " pg.label)\n", + " else:\n", + " title = \"Periodogram for target {}\".format(pg.label)\n", + "\n", + " fig = figure(title=title, plot_height=340, plot_width=600,\n", + " tools=\"pan,wheel_zoom,box_zoom,tap,reset\",\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + " fig.title.offset = -10\n", + " fig.yaxis.axis_label = 'Power (unit)'\n", + " fig.xaxis.axis_label = 'Frequency (unit)'\n", + "\n", + "\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig.y_range = Range1d(start=ylims[0], end=ylims[1])\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " # Add step lines, circles, and hover-over tooltips\n", + " fig.step('frequency', 'power', line_width=1, color='gray',\n", + " source=pg_source, nonselection_line_color='gray',\n", + " nonselection_line_alpha=1.0)\n", + " circ = fig.circle('frequency', 'power', source=pg_source, fill_alpha=0.3, size=8,\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0,\n", + " nonselection_fill_color=\"grey\",\n", + " nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0,\n", + " fill_color=None, hover_fill_color=\"firebrick\",\n", + " hover_alpha=0.9, hover_line_color=\"white\")\n", + " tooltips = [(\"frequency\", \"@frequency\"),\n", + " (\"power\", \"@power\")]\n", + " fig.add_tools(HoverTool(tooltips=tooltips, renderers=[circ],\n", + " mode='mouse', point_policy=\"snap_to_data\"))\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " # Vertical line to indicate the frequency\n", + " #vertical_line = Span(location=pg.frequency[0], dimension='height',\n", + " #line_color='firebrick', line_width=4, line_alpha=0.5)\n", + " #fig.add_layout(vertical_line)\n", + "\n", + " return fig#, vertical_line\n", + "\n", + "\n", + "def add_gaia_figure_elements(tpf, fig, magnitude_limit=18):\n", + " \"\"\"Make the Gaia Figure Elements\"\"\"\n", + " # Get the positions of the Gaia sources\n", + " c1 = SkyCoord(tpf.ra, tpf.dec, frame='icrs', unit='deg')\n", + " # Use pixel scale for query size\n", + " pix_scale = 4.0 # arcseconds / pixel for Kepler, default\n", + " if tpf.mission == 'TESS':\n", + " pix_scale = 21.0\n", + " # We are querying with a diameter as the radius, overfilling by 2x.\n", + " from astroquery.vizier import Vizier\n", + " Vizier.ROW_LIMIT = -1\n", + " result = Vizier.query_region(c1, catalog=[\"I/345/gaia2\"],\n", + " radius=Angle(np.max(tpf.shape[1:]) * pix_scale, \"arcsec\"))\n", + " no_targets_found_message = ValueError('Either no sources were found in the query region '\n", + " 'or Vizier is unavailable')\n", + " too_few_found_message = ValueError('No sources found brighter than {:0.1f}'.format(magnitude_limit))\n", + " if result is None:\n", + " raise no_targets_found_message\n", + " elif len(result) == 0:\n", + " raise too_few_found_message\n", + " result = result[\"I/345/gaia2\"].to_pandas()\n", + " result = result[result.Gmag < magnitude_limit]\n", + " if len(result) == 0:\n", + " raise no_targets_found_message\n", + " radecs = np.vstack([result['RA_ICRS'], result['DE_ICRS']]).T\n", + " coords = tpf.wcs.all_world2pix(radecs, 1) ## TODO, is origin supposed to be zero or one?\n", + " year = ((tpf.astropy_time[0].jd - 2457206.375) * u.day).to(u.year)\n", + " pmra = ((np.nan_to_num(np.asarray(result.pmRA)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " pmdec = ((np.nan_to_num(np.asarray(result.pmDE)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " result.RA_ICRS += pmra\n", + " result.DE_ICRS += pmdec\n", + "\n", + " # Gently size the points by their Gaia magnitude\n", + " sizes = 64.0 / 2**(result['Gmag']/5.0)\n", + " one_over_parallax = 1.0 / (result['Plx']/1000.)\n", + " source = ColumnDataSource(data=dict(ra=result['RA_ICRS'],\n", + " dec=result['DE_ICRS'],\n", + " source=result['Source'].astype(str),\n", + " Gmag=result['Gmag'],\n", + " plx=result['Plx'],\n", + " one_over_plx=one_over_parallax,\n", + " x=coords[:, 0]+tpf.column,\n", + " y=coords[:, 1]+tpf.row,\n", + " size=sizes))\n", + "\n", + " r = fig.circle('x', 'y', source=source, fill_alpha=0.3, size='size',\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0, nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0, fill_color=\"firebrick\",\n", + " hover_fill_color=\"firebrick\", hover_alpha=0.9,\n", + " hover_line_color=\"white\")\n", + "\n", + " fig.add_tools(HoverTool(tooltips=[(\"Gaia source\", \"@source\"),\n", + " (\"G\", \"@Gmag\"),\n", + " (\"Parallax (mas)\", \"@plx (~@one_over_plx{0,0} pc)\"),\n", + " (\"RA\", \"@ra{0,0.00000000}\"),\n", + " (\"DEC\", \"@dec{0,0.00000000}\"),\n", + " (\"x\", \"@x\"),\n", + " (\"y\", \"@y\")],\n", + " renderers=[r],\n", + " mode='mouse',\n", + " point_policy=\"snap_to_data\"))\n", + " return fig, r\n", + "\n", + "\n", + "def make_tpf_figure_elements(tpf, tpf_source,pg, pedestal=None, fiducial_frame=None,\n", + " plot_width=370, plot_height=340):\n", + " \"\"\"Returns the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to show.\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " TPF data source.\n", + " pedestal: float\n", + " A scalar value to be added to the TPF flux values, often to avoid\n", + " taking the log of a negative number in colorbars.\n", + " Defaults to `-min(tpf.flux) + 1`\n", + " fiducial_frame: int\n", + " The tpf slice to start with by default, it is assumed the WCS\n", + " is exact for this frame.\n", + " Returns\n", + " -------\n", + " fig, stretch_slider : bokeh.plotting.figure.Figure, RangeSlider\n", + " \"\"\"\n", + "\n", + " low = float(np.min(pg.frequency*u.d))\n", + " high = float(np.max(pg.frequency*u.d))\n", + "\n", + " if tpf.mission in ['Kepler', 'K2']:\n", + " title = 'Pixel data (CCD {}.{})'.format(tpf.module, tpf.output)\n", + " elif tpf.mission == 'TESS':\n", + " title = 'Pixel data (Camera {}.{})'.format(tpf.camera, tpf.ccd)\n", + " else:\n", + " title = \"Pixel data\"\n", + "\n", + " fig = figure(plot_width=plot_width, plot_height=plot_height,\n", + " x_range=(tpf.column, tpf.column+tpf.shape[2]),\n", + " y_range=(tpf.row, tpf.row+tpf.shape[1]),\n", + " title=title, tools='tap,box_select,wheel_zoom,reset',\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + "\n", + " fig.yaxis.axis_label = 'Pixel Row Number'\n", + " fig.xaxis.axis_label = 'Pixel Column Number'\n", + "\n", + " color_mapper = LinearColorMapper(palette=\"Viridis256\", low=low, high=high)\n", + "\n", + " \n", + "\n", + " \n", + " def origin(tpf):\n", + " tpfperiod=PixelMapPeriodogram(tpf)\n", + " heat_stamp = []\n", + " aperture = tpf.pipeline_mask\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = tpfperiod.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))\n", + " return heat_stamp,tpfperiod\n", + " \n", + " heat_stamp,tpfperiod = origin(tpf)\n", + " fig.image(image = [heat_stamp], x=tpf.column, y=tpf.row,\n", + " dw=tpf.shape[2], dh=tpf.shape[1], dilate=True,\n", + " color_mapper=color_mapper, name=\"tpfimg\")\n", + " \n", + " \n", + " # The colorbar will update with the screen stretch slider\n", + " # The colorbar margin increases as the length of the tick labels grows.\n", + " # This colorbar share of the plot window grows, shrinking plot area.\n", + " # This effect is known, some workarounds might work to fix the plot area:\n", + " # https://github.com/bokeh/bokeh/issues/5186\n", + " color_bar = ColorBar(color_mapper=color_mapper,\n", + " ticker=BasicTicker(desired_num_ticks=8), #LogTicker\n", + " label_standoff=-10, border_line_color=None,\n", + " location=(0, 0), background_fill_color='whitesmoke',\n", + " major_label_text_align='left',\n", + " major_label_text_baseline='middle',\n", + " title='Power', margin=0)\n", + " fig.add_layout(color_bar, 'right')\n", + "\n", + " color_bar.formatter = PrintfTickFormatter(format=\"%14u\")\n", + "\n", + " if tpf_source is not None:\n", + " fig.rect('xx', 'yy', 1, 1, source=tpf_source, fill_color='gray',\n", + " fill_alpha=0.4, line_color='white')\n", + "\n", + " # Configure the stretch slider and its callback function\n", + " stretch_slider = RangeSlider(start=low,\n", + " end=high,\n", + " step=.1,\n", + " title='Frequency Range',\n", + " value=(low, high),\n", + " orientation='horizontal',\n", + " width=200,\n", + " height=10,\n", + " direction='ltr',\n", + " show_value=True,\n", + " sizing_mode='fixed',\n", + " name='frequencyrange')\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " def stretch_change_callback(attr, old, new):\n", + " \"\"\"TPF stretch slider callback.\"\"\"\n", + "\n", + " \n", + " aperture = tpf.pipeline_mask\n", + " heat_stamp=[]\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = tpfperiod.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < new[1]) & (freq > new[0]))]).sum()\n", + " heat_stamp.extend([sums])\n", + " fig.select('tpfimg')[0].data_source.data['image'] = [np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))]\n", + " fig.select('tpfimg')[0].glyph.color_mapper.high = max(heat_stamp)\n", + " fig.select('tpfimg')[0].glyph.color_mapper.low = min(heat_stamp)\n", + "\n", + " stretch_slider.on_change('value', stretch_change_callback)\n", + "\n", + " return fig, stretch_slider\n", + "\n", + "\n", + "def make_default_export_name(tpf, suffix='custom-pg'):\n", + " \"\"\"makes the default name to save a custom intetract mask\"\"\"\n", + " fn = tpf.hdu.filename()\n", + " if fn is None:\n", + " outname = \"{}_{}_{}.fits\".format(tpf.mission, tpf.targetid, suffix)\n", + " else:\n", + " base = os.path.basename(fn)\n", + " outname = base.rsplit('.fits')[0] + '-{}.fits'.format(suffix)\n", + " return outname\n", + "\n", + "\n", + "def show_interact_widget(tpf, notebook_url='localhost:8888',\n", + " aperture_mask='pipeline',\n", + " exported_filename=None):\n", + " \"\"\"Display an interactive Jupyter Notebook widget to inspect the pixel data.\n", + " The widget will show both the lightcurve and pixel data. The pixel data\n", + " supports pixel selection via Bokeh tap and box select tools in an\n", + " interactive javascript user interface.\n", + " Note: at this time, this feature only works inside an active Jupyter\n", + " Notebook, and tends to be too slow when more than ~30,000 cadences\n", + " are contained in the TPF (e.g. short cadence data).\n", + " Parameters\n", + " ----------\n", + " tpf : lightkurve.TargetPixelFile\n", + " Target Pixel File to interact with\n", + " notebook_url: str\n", + " Location of the Jupyter notebook page (default: \"localhost:8888\")\n", + " When showing Bokeh applications, the Bokeh server must be\n", + " explicitly configured to allow connections originating from\n", + " different URLs. This parameter defaults to the standard notebook\n", + " host and port. If you are running on a different location, you\n", + " will need to supply this value for the application to display\n", + " properly. If no protocol is supplied in the URL, e.g. if it is\n", + " of the form \"localhost:8888\", then \"http\" will be used.\n", + " max_cadences : int\n", + " Raise a RuntimeError if the number of cadences shown is larger than\n", + " this value. This limit helps keep browsers from becoming unresponsive.\n", + " \"\"\"\n", + "\n", + "\n", + " aperture_mask = tpf._parse_aperture_mask(aperture_mask)\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = tpf.to_lightcurve(aperture_mask=aperture_mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " #lc = lc.remove_outliers()\n", + " \n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(oversample_factor=5)\n", + " periodogram= periodogram.flatten()\n", + " pg = periodogram\n", + " \n", + " \n", + "\n", + " \n", + "\n", + " npix = tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(tpf.flux[0].shape)\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " pg_source = prepare_periodogram_datasource(pg)\n", + " tpf_source = prepare_tpf_datasource(tpf, aperture_mask)\n", + "\n", + " # Create the lightcurve figure and its vertical marker\n", + " fig_pg = make_periodogram_figure_elements(pg, pg_source,lc)\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(tpf, tpf_source,pg,\n", + " fiducial_frame=0)\n", + "\n", + " r_button = Button(label=\">\", button_type=\"default\", width=30)\n", + " l_button = Button(label=\"<\", button_type=\"default\", width=30)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " message_on_save = Div(text=' ',width=600, height=15)\n", + "\n", + "\n", + " # Callbacks\n", + " def update_upon_pixel_selection(attr, old, new):\n", + " \"\"\"Callback to take action when pixels are selected.\"\"\"\n", + " # Check if a selection was \"re-clicked\", then de-select\n", + " if ((sorted(old) == sorted(new)) & (new != [])):\n", + " # Trigger recursion\n", + " tpf_source.selected.indices = new[1:]\n", + "\n", + " if new != []:\n", + " selected_indices = np.array(new)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(oversample_factor=5)\n", + " pg_new = pg_new.flatten()\n", + " pg_source.data['power'] = pg_new.power\n", + " pg_source.data['frequency'] = pg_new.frequency\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig_pg.y_range.start = ylims[0]\n", + " fig_pg.y_range.end = ylims[1]\n", + " else:\n", + " pg_source.data['power'] = pg.power * 0.0\n", + " fig_pg.y_range.start = -1\n", + " fig_pg.y_range.end = 1\n", + "\n", + " message_on_save.text = \" \"\n", + " export_button.button_type = \"success\"\n", + "\n", + " #def update_upon_cadence_change(attr, old, new):\n", + " # \"\"\"Callback to take action when cadence slider changes\"\"\"\n", + " # if new in tpf.cadenceno:\n", + " # frameno = tpf_index_lookup[new]\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[frameno, :, :] + pedestal]\n", + " # vertical_line.update(location=tpf.time[frameno])\n", + " #else:\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[0, :, :] * np.NaN]\n", + " #lc_source.selected.indices = []\n", + "\n", + " def go_right_by_one():\n", + " \"\"\"Step forward in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value < np.max(tpf.cadenceno):\n", + " cadence_slider.value = existing_value + 1\n", + "\n", + " def go_left_by_one():\n", + " \"\"\"Step back in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value > np.min(tpf.cadenceno):\n", + " cadence_slider.value = existing_value - 1\n", + "\n", + " def save_periodogram():\n", + " \"\"\"Save the lightcurve as a fits file with mask as HDU extension\"\"\"\n", + " if tpf_source.selected.indices != []:\n", + " selected_indices = np.array(tpf_source.selected.indices)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(oversample_factor=5)\n", + " pg_new = pg_new.flatten()\n", + " pg_new.to_fits(exported_filename, overwrite=True,\n", + " power_column_name='SAP_POWER',\n", + " aperture_mask=selected_mask.astype(np.int),\n", + " SOURCE='lightkurve interact',\n", + " NOTE='custom mask',\n", + " MASKNPIX=np.nansum(selected_mask))\n", + " if message_on_save.text == \" \":\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " export_button.button_type = \"success\"\n", + " else:\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " else:\n", + " text = 'No pixels selected, no mask saved'\n", + " export_button.button_type = \"warning\"\n", + " message_on_save.text = text\n", + "\n", + " #def jump_to_lightcurve_position(attr, old, new):\n", + " # if new != []:\n", + " # cadence_slider.value = lc.cadenceno[new[0]]\n", + "\n", + " # Map changes to callbacks\n", + " r_button.on_click(go_right_by_one)\n", + " l_button.on_click(go_left_by_one)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " tpf_source.selected.on_change('indices', update_upon_pixel_selection)\n", + " export_button.on_click(save_periodogram)\n", + " #cadence_slider.on_change('value', update_upon_cadence_change)\n", + "\n", + " # Layout all of the plots\n", + " sp1, sp2, sp3, sp4 = (Spacer(width=15), Spacer(width=30),\n", + " Spacer(width=80), Spacer(width=60))\n", + " widgets_and_figures = layout([fig_pg, fig_tpf],\n", + " [l_button, sp1, r_button, sp2, sp3, stretch_slider],\n", + " [export_button, sp4, message_on_save])\n", + " #removed cadence slider\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " tpf_source = None\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(tpf, tpf_source,pg,\n", + " fiducial_frame=fiducial_frame,\n", + " plot_width=640, plot_height=600)\n", + " fig_tpf, r = add_gaia_figure_elements(tpf, fig_tpf,\n", + " magnitude_limit=magnitude_limit)\n", + "\n", + " # Optionally override the default title\n", + " if tpf.mission == 'K2':\n", + " fig_tpf.title.text = \"Skyview for EPIC {}, K2 Campaign {}, CCD {}.{}\".format(\n", + " tpf.targetid, tpf.campaign, tpf.module, tpf.output)\n", + " elif tpf.mission == 'Kepler':\n", + " fig_tpf.title.text = \"Skyview for KIC {}, Kepler Quarter {}, CCD {}.{}\".format(\n", + " tpf.targetid, tpf.quarter, tpf.module, tpf.output)\n", + " elif tpf.mission == 'TESS':\n", + " fig_tpf.title.text = 'Skyview for TESS {} Sector {}, Camera {}.{}'.format(\n", + " tpf.targetid, tpf.sector, tpf.camera, tpf.ccd)\n", + "\n", + " # Layout all of the plots\n", + " widgets_and_figures = layout([fig_tpf, stretch_slider])\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "lc =tpf.to_lightcurve()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "pg =lc.to_periodogram()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "show_interact_widget(tpf,notebook_url='localhost:8889')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Flatten\n", + "2. Remove outliers\n", + "periodograms\n", + "1. Divide periodogram values by the median" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "tpf.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [], + "source": [ + "lcc = tpf.to_lightcurve(aperture_mask = tpf.pipeline_mask)\n", + "lcc = lcc[np.where(lcc.quality == 0)]\n", + "lcc = lcc.flatten(window_length= 3001)\n", + "pgg = lcc.to_periodogram()\n", + "#pgg = pgg.flatten()" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " }\n", + " finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.bokehjs_exec.v0+json": "", + "text/html": [ + "\n", + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "b3423fd1f0814a5bb263e0c7aafa5484" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "tpf.interact(notebook_url='localhost:8890')" + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$9.6636799 \\times 10^{-5} \\; \\mathrm{\\frac{e^{-}}{s}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 227, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import division, print_function\n", + "import logging\n", + "import warnings\n", + "import numpy as np\n", + "from astropy.stats import sigma_clip\n", + "import os\n", + "from astropy.coordinates import SkyCoord, Angle\n", + "import astropy.units as u\n", + "\n", + "\n", + "def prepare_periodogram_datasource(pg):\n", + " \"\"\"Prepare a bokeh ColumnDataSource object for tool tips.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve object\n", + " The light curve to be shown.\n", + " Returns\n", + " -------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " \"\"\"\n", + " # Convert time into human readable strings, breaks with NaN time\n", + " # See https://github.com/KeplerGO/lightkurve/issues/116\n", + "\n", + "\n", + "\n", + "\n", + " pg_source = ColumnDataSource(data=dict(power=pg.power,frequency=pg.frequency))\n", + " return pg_source\n", + "\n", + "\n", + "def prepare_tpf_datasource(tpf, aperture_mask):\n", + " \"\"\"Prepare a bokeh DataSource object for selection glyphs\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to be shown.\n", + " aperture_mask : boolean numpy array\n", + " The Aperture mask applied at the startup of interact\n", + " Returns\n", + " -------\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object to be shown.\n", + " \"\"\"\n", + " npix = tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(tpf.flux[0].shape)\n", + " xx = tpf.column + np.arange(tpf.shape[2])\n", + " yy = tpf.row + np.arange(tpf.shape[1])\n", + " xa, ya = np.meshgrid(xx, yy)\n", + " preselected = Selection()\n", + " preselected.indices = pixel_index_array[aperture_mask].reshape(-1).tolist()\n", + " tpf_source = ColumnDataSource(data=dict(xx=xa+0.5, yy=ya+0.5),\n", + " selected=preselected)\n", + " return tpf_source\n", + "\n", + "\n", + "def get_periodogram_y_limits(pg_source):\n", + " \"\"\"Compute sensible defaults for the Y axis limits of the lightcurve plot.\n", + " Parameters\n", + " ----------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " The lightcurve being shown.\n", + " Returns\n", + " -------\n", + " ymin, ymax : float, float\n", + " Flux min and max limits.\n", + " \"\"\"\n", + " #ask about this sigma clip\n", + " power = pg_source.data['power']\n", + "\n", + " low = float(power.min())\n", + " high = float(power.max())\n", + " margin = 0.10 * (high - low)\n", + " return low, high\n", + "\n", + "\n", + "def make_periodogram_figure_elements(pg, pg_source,lc):\n", + " \"\"\"Make the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve\n", + " Lightcurve to be shown.\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object that enables the visualization.\n", + " Returns\n", + " ----------\n", + " fig : `bokeh.plotting.figure` instance\n", + " step_renderer : GlyphRenderer\n", + " vertical_line : Span\n", + " \"\"\"\n", + " if lc.mission == 'K2':\n", + " title = \"Periodogram for {} (K2)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'Kepler':\n", + " title = \"Periodogram for {} (Kepler)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'TESS':\n", + " title = \"Periodogram for {} (TESS)\".format(\n", + " pg.label)\n", + " else:\n", + " title = \"Periodogram for target {}\".format(pg.label)\n", + "\n", + " fig = figure(title=title, plot_height=340, plot_width=600,\n", + " tools=\"pan,wheel_zoom,box_zoom,tap,reset\",\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + " fig.title.offset = -10\n", + " fig.yaxis.axis_label = 'Power (unit)'\n", + " fig.xaxis.axis_label = 'Frequency (unit)'\n", + "\n", + "\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig.y_range = Range1d(start=ylims[0], end=ylims[1])\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " # Add step lines, circles, and hover-over tooltips\n", + " fig.step('frequency', 'power', line_width=1, color='gray',\n", + " source=pg_source, nonselection_line_color='gray',\n", + " nonselection_line_alpha=1.0)\n", + " circ = fig.circle('frequency', 'power', source=pg_source, fill_alpha=0.3, size=8,\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0,\n", + " nonselection_fill_color=\"grey\",\n", + " nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0,\n", + " fill_color=None, hover_fill_color=\"firebrick\",\n", + " hover_alpha=0.9, hover_line_color=\"white\")\n", + " tooltips = [(\"frequency\", \"@frequency\"),\n", + " (\"power\", \"@power\")]\n", + " fig.add_tools(HoverTool(tooltips=tooltips, renderers=[circ],\n", + " mode='mouse', point_policy=\"snap_to_data\"))\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " # Vertical line to indicate the frequency\n", + " #vertical_line = Span(location=pg.frequency[0], dimension='height',\n", + " #line_color='firebrick', line_width=4, line_alpha=0.5)\n", + " #fig.add_layout(vertical_line)\n", + "\n", + " return fig#, vertical_line\n", + "\n", + "\n", + "def add_gaia_figure_elements(tpf, fig, magnitude_limit=18):\n", + " \"\"\"Make the Gaia Figure Elements\"\"\"\n", + " # Get the positions of the Gaia sources\n", + " c1 = SkyCoord(tpf.ra, tpf.dec, frame='icrs', unit='deg')\n", + " # Use pixel scale for query size\n", + " pix_scale = 4.0 # arcseconds / pixel for Kepler, default\n", + " if tpf.mission == 'TESS':\n", + " pix_scale = 21.0\n", + " # We are querying with a diameter as the radius, overfilling by 2x.\n", + " from astroquery.vizier import Vizier\n", + " Vizier.ROW_LIMIT = -1\n", + " result = Vizier.query_region(c1, catalog=[\"I/345/gaia2\"],\n", + " radius=Angle(np.max(tpf.shape[1:]) * pix_scale, \"arcsec\"))\n", + " no_targets_found_message = ValueError('Either no sources were found in the query region '\n", + " 'or Vizier is unavailable')\n", + " too_few_found_message = ValueError('No sources found brighter than {:0.1f}'.format(magnitude_limit))\n", + " if result is None:\n", + " raise no_targets_found_message\n", + " elif len(result) == 0:\n", + " raise too_few_found_message\n", + " result = result[\"I/345/gaia2\"].to_pandas()\n", + " result = result[result.Gmag < magnitude_limit]\n", + " if len(result) == 0:\n", + " raise no_targets_found_message\n", + " radecs = np.vstack([result['RA_ICRS'], result['DE_ICRS']]).T\n", + " coords = tpf.wcs.all_world2pix(radecs, 1) ## TODO, is origin supposed to be zero or one?\n", + " year = ((tpf.astropy_time[0].jd - 2457206.375) * u.day).to(u.year)\n", + " pmra = ((np.nan_to_num(np.asarray(result.pmRA)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " pmdec = ((np.nan_to_num(np.asarray(result.pmDE)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " result.RA_ICRS += pmra\n", + " result.DE_ICRS += pmdec\n", + "\n", + " # Gently size the points by their Gaia magnitude\n", + " sizes = 64.0 / 2**(result['Gmag']/5.0)\n", + " one_over_parallax = 1.0 / (result['Plx']/1000.)\n", + " source = ColumnDataSource(data=dict(ra=result['RA_ICRS'],\n", + " dec=result['DE_ICRS'],\n", + " source=result['Source'].astype(str),\n", + " Gmag=result['Gmag'],\n", + " plx=result['Plx'],\n", + " one_over_plx=one_over_parallax,\n", + " x=coords[:, 0]+tpf.column,\n", + " y=coords[:, 1]+tpf.row,\n", + " size=sizes))\n", + "\n", + " r = fig.circle('x', 'y', source=source, fill_alpha=0.3, size='size',\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0, nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0, fill_color=\"firebrick\",\n", + " hover_fill_color=\"firebrick\", hover_alpha=0.9,\n", + " hover_line_color=\"white\")\n", + "\n", + " fig.add_tools(HoverTool(tooltips=[(\"Gaia source\", \"@source\"),\n", + " (\"G\", \"@Gmag\"),\n", + " (\"Parallax (mas)\", \"@plx (~@one_over_plx{0,0} pc)\"),\n", + " (\"RA\", \"@ra{0,0.00000000}\"),\n", + " (\"DEC\", \"@dec{0,0.00000000}\"),\n", + " (\"x\", \"@x\"),\n", + " (\"y\", \"@y\")],\n", + " renderers=[r],\n", + " mode='mouse',\n", + " point_policy=\"snap_to_data\"))\n", + " return fig, r\n", + "\n", + "\n", + "def make_tpf_figure_elements(tpf, tpf_source,pg, pedestal=None, fiducial_frame=None,\n", + " plot_width=370, plot_height=340):\n", + " \"\"\"Returns the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to show.\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " TPF data source.\n", + " pedestal: float\n", + " A scalar value to be added to the TPF flux values, often to avoid\n", + " taking the log of a negative number in colorbars.\n", + " Defaults to `-min(tpf.flux) + 1`\n", + " fiducial_frame: int\n", + " The tpf slice to start with by default, it is assumed the WCS\n", + " is exact for this frame.\n", + " Returns\n", + " -------\n", + " fig, stretch_slider : bokeh.plotting.figure.Figure, RangeSlider\n", + " \"\"\"\n", + "\n", + " low = float(np.min(pg.frequency*u.d))\n", + " high = float(np.max(pg.frequency*u.d))\n", + "\n", + " if tpf.mission in ['Kepler', 'K2']:\n", + " title = 'Pixel data (CCD {}.{})'.format(tpf.module, tpf.output)\n", + " elif tpf.mission == 'TESS':\n", + " title = 'Pixel data (Camera {}.{})'.format(tpf.camera, tpf.ccd)\n", + " else:\n", + " title = \"Pixel data\"\n", + "\n", + " fig = figure(plot_width=plot_width, plot_height=plot_height,\n", + " x_range=(tpf.column, tpf.column+tpf.shape[2]),\n", + " y_range=(tpf.row, tpf.row+tpf.shape[1]),\n", + " title=title, tools='tap,box_select,wheel_zoom,reset',\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + "\n", + " fig.yaxis.axis_label = 'Pixel Row Number'\n", + " fig.xaxis.axis_label = 'Pixel Column Number'\n", + "\n", + " color_mapper = LinearColorMapper(palette=\"Viridis256\", low=low, high=high)\n", + "\n", + " \n", + "\n", + " \n", + " def origin(tpf):\n", + " tpfperiod=PixelMapPeriodogram(tpf)\n", + " heat_stamp = []\n", + " aperture = tpf.pipeline_mask\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = tpfperiod.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))\n", + " return heat_stamp,tpfperiod\n", + " \n", + " heat_stamp,tpfperiod = origin(tpf)\n", + " fig.image(image = [heat_stamp], x=tpf.column, y=tpf.row,\n", + " dw=tpf.shape[2], dh=tpf.shape[1], dilate=True,\n", + " color_mapper=color_mapper, name=\"tpfimg\")\n", + " \n", + " \n", + " # The colorbar will update with the screen stretch slider\n", + " # The colorbar margin increases as the length of the tick labels grows.\n", + " # This colorbar share of the plot window grows, shrinking plot area.\n", + " # This effect is known, some workarounds might work to fix the plot area:\n", + " # https://github.com/bokeh/bokeh/issues/5186\n", + " color_bar = ColorBar(color_mapper=color_mapper,\n", + " ticker=BasicTicker(desired_num_ticks=8), #LogTicker\n", + " label_standoff=-10, border_line_color=None,\n", + " location=(0, 0), background_fill_color='whitesmoke',\n", + " major_label_text_align='left',\n", + " major_label_text_baseline='middle',\n", + " title='Power', margin=0)\n", + " fig.add_layout(color_bar, 'right')\n", + "\n", + " color_bar.formatter = PrintfTickFormatter(format=\"%14u\")\n", + "\n", + " if tpf_source is not None:\n", + " fig.rect('xx', 'yy', 1, 1, source=tpf_source, fill_color='gray',\n", + " fill_alpha=0.4, line_color='white')\n", + "\n", + " # Configure the stretch slider and its callback function\n", + " stretch_slider = RangeSlider(start=low,\n", + " end=high,\n", + " step=.1,\n", + " title='Frequency Range',\n", + " value=(low, high),\n", + " orientation='horizontal',\n", + " width=200,\n", + " height=10,\n", + " direction='ltr',\n", + " show_value=True,\n", + " sizing_mode='fixed',\n", + " name='frequencyrange')\n", + "\n", + " def stretch_change_callback(attr, old, new):\n", + " \"\"\"TPF stretch slider callback.\"\"\"\n", + "\n", + " \n", + " aperture = tpf.pipeline_mask\n", + " heat_stamp=[]\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = tpfperiod.periodogram[mask][0]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < new[1]) & (freq > new[0]))]).sum()\n", + " heat_stamp.extend([sums])\n", + " fig.select('tpfimg')[0].data_source.data['image'] = [np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))]\n", + " fig.select('tpfimg')[0].glyph.color_mapper.high = max(heat_stamp)\n", + " fig.select('tpfimg')[0].glyph.color_mapper.low = min(heat_stamp)\n", + "\n", + " stretch_slider.on_change('value', stretch_change_callback)\n", + "\n", + " return fig, stretch_slider\n", + "\n", + "\n", + "def make_default_export_name(tpf, suffix='custom-pg'):\n", + " \"\"\"makes the default name to save a custom intetract mask\"\"\"\n", + " fn = tpf.hdu.filename()\n", + " if fn is None:\n", + " outname = \"{}_{}_{}.fits\".format(tpf.mission, tpf.targetid, suffix)\n", + " else:\n", + " base = os.path.basename(fn)\n", + " outname = base.rsplit('.fits')[0] + '-{}.fits'.format(suffix)\n", + " return outname\n", + "\n", + "\n", + "def show_interact_widget(tpf, notebook_url='localhost:8888',\n", + " aperture_mask='pipeline',\n", + " exported_filename=None):\n", + " \"\"\"Display an interactive Jupyter Notebook widget to inspect the pixel data.\n", + " The widget will show both the lightcurve and pixel data. The pixel data\n", + " supports pixel selection via Bokeh tap and box select tools in an\n", + " interactive javascript user interface.\n", + " Note: at this time, this feature only works inside an active Jupyter\n", + " Notebook, and tends to be too slow when more than ~30,000 cadences\n", + " are contained in the TPF (e.g. short cadence data).\n", + " Parameters\n", + " ----------\n", + " tpf : lightkurve.TargetPixelFile\n", + " Target Pixel File to interact with\n", + " notebook_url: str\n", + " Location of the Jupyter notebook page (default: \"localhost:8888\")\n", + " When showing Bokeh applications, the Bokeh server must be\n", + " explicitly configured to allow connections originating from\n", + " different URLs. This parameter defaults to the standard notebook\n", + " host and port. If you are running on a different location, you\n", + " will need to supply this value for the application to display\n", + " properly. If no protocol is supplied in the URL, e.g. if it is\n", + " of the form \"localhost:8888\", then \"http\" will be used.\n", + " max_cadences : int\n", + " Raise a RuntimeError if the number of cadences shown is larger than\n", + " this value. This limit helps keep browsers from becoming unresponsive.\n", + " \"\"\"\n", + "\n", + "\n", + " aperture_mask = tpf._parse_aperture_mask(aperture_mask)\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = tpf.to_lightcurve(aperture_mask=aperture_mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " #lc = lc.remove_outliers()\n", + " \n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(method='bls')\n", + " periodogram.power= periodogram.power / np.median(periodogram.power)\n", + " periodogram.power[np.where(periodogram.power<0)] = 0\n", + " pg = periodogram\n", + " \n", + " \n", + "\n", + " \n", + "\n", + " npix = tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(tpf.flux[0].shape)\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " pg_source = prepare_periodogram_datasource(pg)\n", + " tpf_source = prepare_tpf_datasource(tpf, aperture_mask)\n", + "\n", + " # Create the lightcurve figure and its vertical marker\n", + " fig_pg = make_periodogram_figure_elements(pg, pg_source,lc)\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(tpf, tpf_source,pg,\n", + " fiducial_frame=0)\n", + "\n", + " r_button = Button(label=\">\", button_type=\"default\", width=30)\n", + " l_button = Button(label=\"<\", button_type=\"default\", width=30)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " message_on_save = Div(text=' ',width=600, height=15)\n", + "\n", + "\n", + " # Callbacks\n", + " def update_upon_pixel_selection(attr, old, new):\n", + " \"\"\"Callback to take action when pixels are selected.\"\"\"\n", + " # Check if a selection was \"re-clicked\", then de-select\n", + " if ((sorted(old) == sorted(new)) & (new != [])):\n", + " # Trigger recursion\n", + " tpf_source.selected.indices = new[1:]\n", + "\n", + " if new != []:\n", + " selected_indices = np.array(new)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(method='bls')\n", + " pg_new.power= pg_new.power / np.median(pg_new.power)\n", + " pg_new.power[np.where(pg_new.power<0)] = 0\n", + " #pg_new = pg_new.flatten()\n", + " pg_source.data['power'] = pg_new.power\n", + " pg_source.data['frequency'] = pg_new.frequency\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig_pg.y_range.start = ylims[0]\n", + " fig_pg.y_range.end = ylims[1]\n", + " else:\n", + " pg_source.data['power'] = pg.power * 0.0\n", + " fig_pg.y_range.start = -1\n", + " fig_pg.y_range.end = 1\n", + "\n", + " message_on_save.text = \" \"\n", + " export_button.button_type = \"success\"\n", + "\n", + " #def update_upon_cadence_change(attr, old, new):\n", + " # \"\"\"Callback to take action when cadence slider changes\"\"\"\n", + " # if new in tpf.cadenceno:\n", + " # frameno = tpf_index_lookup[new]\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[frameno, :, :] + pedestal]\n", + " # vertical_line.update(location=tpf.time[frameno])\n", + " #else:\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[0, :, :] * np.NaN]\n", + " #lc_source.selected.indices = []\n", + "\n", + " def go_right_by_one():\n", + " \"\"\"Step forward in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value < np.max(tpf.cadenceno):\n", + " cadence_slider.value = existing_value + 1\n", + "\n", + " def go_left_by_one():\n", + " \"\"\"Step back in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value > np.min(tpf.cadenceno):\n", + " cadence_slider.value = existing_value - 1\n", + "\n", + " def save_periodogram():\n", + " \"\"\"Save the lightcurve as a fits file with mask as HDU extension\"\"\"\n", + " if tpf_source.selected.indices != []:\n", + " selected_indices = np.array(tpf_source.selected.indices)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(method='bls')\n", + " pg_new = pg_new.power / np.median(pg_new.power)\n", + " pg_new.power[np.where(pg_new.power<0)] = 0\n", + " #pg_new = pg_new.flatten()\n", + " pg_new.to_fits(exported_filename, overwrite=True,\n", + " power_column_name='SAP_POWER',\n", + " aperture_mask=selected_mask.astype(np.int),\n", + " SOURCE='lightkurve interact',\n", + " NOTE='custom mask',\n", + " MASKNPIX=np.nansum(selected_mask))\n", + " if message_on_save.text == \" \":\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " export_button.button_type = \"success\"\n", + " else:\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " else:\n", + " text = 'No pixels selected, no mask saved'\n", + " export_button.button_type = \"warning\"\n", + " message_on_save.text = text\n", + "\n", + " #def jump_to_lightcurve_position(attr, old, new):\n", + " # if new != []:\n", + " # cadence_slider.value = lc.cadenceno[new[0]]\n", + "\n", + " # Map changes to callbacks\n", + " r_button.on_click(go_right_by_one)\n", + " l_button.on_click(go_left_by_one)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " tpf_source.selected.on_change('indices', update_upon_pixel_selection)\n", + " export_button.on_click(save_periodogram)\n", + " #cadence_slider.on_change('value', update_upon_cadence_change)\n", + "\n", + " # Layout all of the plots\n", + " sp1, sp2, sp3, sp4 = (Spacer(width=15), Spacer(width=30),\n", + " Spacer(width=80), Spacer(width=60))\n", + " widgets_and_figures = layout([fig_pg, fig_tpf],\n", + " [l_button, sp1, r_button, sp2, sp3, stretch_slider],\n", + " [export_button, sp4, message_on_save])\n", + " #removed cadence slider\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " tpf_source = None\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(tpf, tpf_source,pg,\n", + " fiducial_frame=fiducial_frame,\n", + " plot_width=640, plot_height=600)\n", + " fig_tpf, r = add_gaia_figure_elements(tpf, fig_tpf,\n", + " magnitude_limit=magnitude_limit)\n", + "\n", + " # Optionally override the default title\n", + " if tpf.mission == 'K2':\n", + " fig_tpf.title.text = \"Skyview for EPIC {}, K2 Campaign {}, CCD {}.{}\".format(\n", + " tpf.targetid, tpf.campaign, tpf.module, tpf.output)\n", + " elif tpf.mission == 'Kepler':\n", + " fig_tpf.title.text = \"Skyview for KIC {}, Kepler Quarter {}, CCD {}.{}\".format(\n", + " tpf.targetid, tpf.quarter, tpf.module, tpf.output)\n", + " elif tpf.mission == 'TESS':\n", + " fig_tpf.title.text = 'Skyview for TESS {} Sector {}, Camera {}.{}'.format(\n", + " tpf.targetid, tpf.sector, tpf.camera, tpf.ccd)\n", + "\n", + " # Layout all of the plots\n", + " widgets_and_figures = layout([fig_tpf, stretch_slider])\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " }\n", + " finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.bokehjs_exec.v0+json": "", + "text/html": [ + "\n", + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "db00256820434182a0023df69d629e05" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "show_interact_widget(tpf,notebook_url='localhost:8889')" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " }\n", + " finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.bokehjs_exec.v0+json": "", + "text/html": [ + "\n", + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "937c1070a2c24eb7a178bf6d1d51f1c7" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "tpf.interact_sky(notebook_url='localhost:8889')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tpf.to_lightcurve" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# $$\\text{Putting it all together}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import division, print_function\n", + "import logging\n", + "import warnings\n", + "import numpy as np\n", + "from astropy.stats import sigma_clip\n", + "import os\n", + "from astropy.coordinates import SkyCoord, Angle\n", + "import astropy.units as u\n", + "import bokeh \n", + "from bokeh.io import show, output_notebook, push_notebook\n", + "from bokeh.plotting import figure, ColumnDataSource\n", + "from bokeh.models import LogColorMapper,LinearColorMapper, Selection, Slider, RangeSlider, Span, ColorBar, LogTicker, Range1d, Ticker, BasicTicker, Range1d\n", + "from bokeh.layouts import layout, Spacer\n", + "from bokeh.models.tools import HoverTool\n", + "from bokeh.models.widgets import Button, Div\n", + "from bokeh.models.formatters import PrintfTickFormatter\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import scipy as sp\n", + "import lightkurve as lk\n", + "from scipy import stats\n", + "from ipywidgets import interact, interactive, fixed, interact_manual\n", + "import ipywidgets as widgets\n", + "from astropy import units as u\n", + "\n", + "class PixelMapPeriodogram:\n", + " \n", + " \n", + " def __init__(self , targetpixelfile, method = 'LombScargle'):\n", + " \n", + " #Defining an aperture that will be used in plotting and making empty 2-d arrays of the correct size for masks\n", + " self.aperture = targetpixelfile.pipeline_mask\n", + " self.tpf = targetpixelfile\n", + " #Initiating a python list since this is computational slightly faster than a numpy array when initially storing periodogram\n", + " pg = []\n", + "\n", + " \n", + " #Iterating through columns of pixels\n", + " for i in np.arange(0,len(self.aperture)):\n", + " \n", + " #Iterating through rws of pixels\n", + " for j in np.arange(0,len(self.aperture[0])):\n", + " \n", + " \n", + " #Making an empty 2-d array\n", + " mask = np.zeros((len(self.aperture),len(self.aperture[0])), dtype=bool)\n", + " \n", + " #Iterating to isolate pixel by pixel to get light curves\n", + " mask[i][j] = True\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " lc = lc.remove_outliers()\n", + " if method == 'bls':\n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(method = 'bls')\n", + " periodogram.power = periodogram.power / np.median(periodogram.power)\n", + " periodogram.power[np.where(periodogram.power<0)] = 0\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " elif method == 'LombScargle':\n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(oversample_factor=5)\n", + " periodogram = periodogram.flatten()\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " \n", + " #Taking the final list and turning it into a 2-d numpy array witht he same dimensions of the full postage stamp \n", + " pg = np.reshape(np.asarray(pg),(len(self.aperture),len(self.aperture[0])))\n", + " \n", + " #Defining self.periodogram as this 2-d array of periodogram data\n", + " self.periodogram = pg\n", + " \n", + " def plot(self):\n", + " fig,ax = plt.subplots(len(self.aperture[0]),\n", + " len(self.aperture[1]),\n", + " figsize=(20,20),sharex='col', sharey='row')\n", + "\n", + " #Just making the subplot spacings 0 pixel width and height separation\n", + " fig.subplots_adjust(wspace=0,hspace=0)\n", + " \n", + " \n", + " #iterating through the columns of the postage stamp pixels\n", + " for i in np.arange(0,len(self.aperture[0])):\n", + " \n", + " #iterating through the rows of the postage stamp pixels\n", + " for j in np.arange(0,len(self.aperture[1])):\n", + " \n", + " #Creating a false mask to alter each iteration\n", + " mask = np.empty((len(self.aperture),len(self.aperture[0])), dtype=bool)\n", + " \n", + " #setting one pixel in the postage stamp to have a lightcurve extracted and plotted\n", + " mask[i][j] = True\n", + " \n", + " \n", + " #Plotting the target pixel periodograph -- This can also be set up to have looks based on user input if desired\n", + " ax[i][j].plot(self.periodogram[i][j].frequency,self.periodogram[i][j].power);\n", + " \n", + " def frequency_heat(self,low=0,high=1):\n", + " heat_stamp = []\n", + " for i in np.arange(0,len(self.aperture)):\n", + " for j in np.arange(0,len(self.aperture[0])):\n", + " mask = np.zeros((len(self.aperture),len(self.aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = self.periodogram[i][j]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(self.aperture),len(self.aperture[0])))\n", + " return heat_stamp\n", + " \n", + "\n", + "\n", + "\n", + " def prepare_periodogram_datasource(pg):\n", + " \"\"\"Prepare a bokeh ColumnDataSource object for tool tips.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve object\n", + " The light curve to be shown.\n", + " Returns\n", + " -------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " \"\"\"\n", + " # Convert time into human readable strings, breaks with NaN time\n", + " # See https://github.com/KeplerGO/lightkurve/issues/116\n", + "\n", + "\n", + "\n", + "\n", + " pg_source = ColumnDataSource(data=dict(power=pg.power,frequency=pg.frequency))\n", + " return pg_source\n", + "\n", + "\n", + " def prepare_tpf_datasource(tpf, aperture_mask):\n", + " \"\"\"Prepare a bokeh DataSource object for selection glyphs\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to be shown.\n", + " aperture_mask : boolean numpy array\n", + " The Aperture mask applied at the startup of interact\n", + " Returns\n", + " -------\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object to be shown.\n", + " \"\"\"\n", + " npix = tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(tpf.flux[0].shape)\n", + " xx = tpf.column + np.arange(tpf.shape[2])\n", + " yy = tpf.row + np.arange(tpf.shape[1])\n", + " xa, ya = np.meshgrid(xx, yy)\n", + " preselected = Selection()\n", + " preselected.indices = pixel_index_array[aperture_mask].reshape(-1).tolist()\n", + " tpf_source = ColumnDataSource(data=dict(xx=xa+0.5, yy=ya+0.5),\n", + " selected=preselected)\n", + " return tpf_source\n", + "\n", + "\n", + " def get_periodogram_y_limits(pg_source):\n", + " \"\"\"Compute sensible defaults for the Y axis limits of the lightcurve plot.\n", + " Parameters\n", + " ----------\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " The lightcurve being shown.\n", + " Returns\n", + " -------\n", + " ymin, ymax : float, float\n", + " Flux min and max limits.\n", + " \"\"\"\n", + " #ask about this sigma clip\n", + " power = pg_source.data['power']\n", + "\n", + " low = float(power.min())\n", + " high = float(power.max())\n", + " margin = 0.10 * (high - low)\n", + " return low, high\n", + "\n", + "\n", + " def make_periodogram_figure_elements(pg, pg_source,lc):\n", + " \"\"\"Make the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " lc : LightCurve\n", + " Lightcurve to be shown.\n", + " lc_source : bokeh.plotting.ColumnDataSource\n", + " Bokeh object that enables the visualization.\n", + " Returns\n", + " ----------\n", + " fig : `bokeh.plotting.figure` instance\n", + " step_renderer : GlyphRenderer\n", + " vertical_line : Span\n", + " \"\"\"\n", + " if lc.mission == 'K2':\n", + " title = \"Periodogram for {} (K2)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'Kepler':\n", + " title = \"Periodogram for {} (Kepler)\".format(\n", + " pg.label)\n", + " elif lc.mission == 'TESS':\n", + " title = \"Periodogram for {} (TESS)\".format(\n", + " pg.label)\n", + " else:\n", + " title = \"Periodogram for target {}\".format(pg.label)\n", + "\n", + " fig = figure(title=title, plot_height=340, plot_width=600,\n", + " tools=\"pan,wheel_zoom,box_zoom,tap,reset\",\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + " fig.title.offset = -10\n", + " fig.yaxis.axis_label = 'Power (unit)'\n", + " fig.xaxis.axis_label = 'Frequency (unit)'\n", + "\n", + "\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig.y_range = Range1d(start=ylims[0], end=ylims[1])\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " # Add step lines, circles, and hover-over tooltips\n", + " fig.step('frequency', 'power', line_width=1, color='gray',\n", + " source=pg_source, nonselection_line_color='gray',\n", + " nonselection_line_alpha=1.0)\n", + " circ = fig.circle('frequency', 'power', source=pg_source, fill_alpha=0.3, size=8,\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0,\n", + " nonselection_fill_color=\"grey\",\n", + " nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0,\n", + " fill_color=None, hover_fill_color=\"firebrick\",\n", + " hover_alpha=0.9, hover_line_color=\"white\")\n", + " tooltips = [(\"frequency\", \"@frequency\"),\n", + " (\"power\", \"@power\")]\n", + " fig.add_tools(HoverTool(tooltips=tooltips, renderers=[circ],\n", + " mode='mouse', point_policy=\"snap_to_data\"))\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " # Vertical line to indicate the frequency\n", + " #vertical_line = Span(location=pg.frequency[0], dimension='height',\n", + " #line_color='firebrick', line_width=4, line_alpha=0.5)\n", + " #fig.add_layout(vertical_line)\n", + "\n", + " return fig#, vertical_line\n", + "\n", + "\n", + " def add_gaia_figure_elements(tpf, fig, magnitude_limit=18):\n", + " \"\"\"Make the Gaia Figure Elements\"\"\"\n", + " # Get the positions of the Gaia sources\n", + " c1 = SkyCoord(tpf.ra, tpf.dec, frame='icrs', unit='deg')\n", + " # Use pixel scale for query size\n", + " pix_scale = 4.0 # arcseconds / pixel for Kepler, default\n", + " if tpf.mission == 'TESS':\n", + " pix_scale = 21.0\n", + " # We are querying with a diameter as the radius, overfilling by 2x.\n", + " from astroquery.vizier import Vizier\n", + " Vizier.ROW_LIMIT = -1\n", + " result = Vizier.query_region(c1, catalog=[\"I/345/gaia2\"],\n", + " radius=Angle(np.max(tpf.shape[1:]) * pix_scale, \"arcsec\"))\n", + " no_targets_found_message = ValueError('Either no sources were found in the query region '\n", + " 'or Vizier is unavailable')\n", + " too_few_found_message = ValueError('No sources found brighter than {:0.1f}'.format(magnitude_limit))\n", + " if result is None:\n", + " raise no_targets_found_message\n", + " elif len(result) == 0:\n", + " raise too_few_found_message\n", + " result = result[\"I/345/gaia2\"].to_pandas()\n", + " result = result[result.Gmag < magnitude_limit]\n", + " if len(result) == 0:\n", + " raise no_targets_found_message\n", + " radecs = np.vstack([result['RA_ICRS'], result['DE_ICRS']]).T\n", + " coords = tpf.wcs.all_world2pix(radecs, 1) ## TODO, is origin supposed to be zero or one?\n", + " year = ((tpf.astropy_time[0].jd - 2457206.375) * u.day).to(u.year)\n", + " pmra = ((np.nan_to_num(np.asarray(result.pmRA)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " pmdec = ((np.nan_to_num(np.asarray(result.pmDE)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " result.RA_ICRS += pmra\n", + " result.DE_ICRS += pmdec\n", + "\n", + " # Gently size the points by their Gaia magnitude\n", + " sizes = 64.0 / 2**(result['Gmag']/5.0)\n", + " one_over_parallax = 1.0 / (result['Plx']/1000.)\n", + " source = ColumnDataSource(data=dict(ra=result['RA_ICRS'],\n", + " dec=result['DE_ICRS'],\n", + " source=result['Source'].astype(str),\n", + " Gmag=result['Gmag'],\n", + " plx=result['Plx'],\n", + " one_over_plx=one_over_parallax,\n", + " x=coords[:, 0]+tpf.column,\n", + " y=coords[:, 1]+tpf.row,\n", + " size=sizes))\n", + "\n", + " r = fig.circle('x', 'y', source=source, fill_alpha=0.3, size='size',\n", + " line_color=None, selection_color=\"firebrick\",\n", + " nonselection_fill_alpha=0.0, nonselection_line_color=None,\n", + " nonselection_line_alpha=0.0, fill_color=\"firebrick\",\n", + " hover_fill_color=\"firebrick\", hover_alpha=0.9,\n", + " hover_line_color=\"white\")\n", + "\n", + " fig.add_tools(HoverTool(tooltips=[(\"Gaia source\", \"@source\"),\n", + " (\"G\", \"@Gmag\"),\n", + " (\"Parallax (mas)\", \"@plx (~@one_over_plx{0,0} pc)\"),\n", + " (\"RA\", \"@ra{0,0.00000000}\"),\n", + " (\"DEC\", \"@dec{0,0.00000000}\"),\n", + " (\"x\", \"@x\"),\n", + " (\"y\", \"@y\")],\n", + " renderers=[r],\n", + " mode='mouse',\n", + " point_policy=\"snap_to_data\"))\n", + " return fig, r\n", + "\n", + "\n", + " def make_tpf_figure_elements(tpf, tpf_source,pg, pedestal=None, fiducial_frame=None,\n", + " plot_width=370, plot_height=340):\n", + " \"\"\"Returns the lightcurve figure elements.\n", + " Parameters\n", + " ----------\n", + " tpf : TargetPixelFile\n", + " TPF to show.\n", + " tpf_source : bokeh.plotting.ColumnDataSource\n", + " TPF data source.\n", + " pedestal: float\n", + " A scalar value to be added to the TPF flux values, often to avoid\n", + " taking the log of a negative number in colorbars.\n", + " Defaults to `-min(tpf.flux) + 1`\n", + " fiducial_frame: int\n", + " The tpf slice to start with by default, it is assumed the WCS\n", + " is exact for this frame.\n", + " Returns\n", + " -------\n", + " fig, stretch_slider : bokeh.plotting.figure.Figure, RangeSlider\n", + " \"\"\"\n", + "\n", + " low = float(np.min(pg.frequency*u.d))\n", + " high = float(np.max(pg.frequency*u.d))\n", + "\n", + " if tpf.mission in ['Kepler', 'K2']:\n", + " title = 'Pixel data (CCD {}.{})'.format(tpf.module, tpf.output)\n", + " elif tpf.mission == 'TESS':\n", + " title = 'Pixel data (Camera {}.{})'.format(tpf.camera, tpf.ccd)\n", + " else:\n", + " title = \"Pixel data\"\n", + "\n", + " fig = figure(plot_width=plot_width, plot_height=plot_height,\n", + " x_range=(tpf.column, tpf.column+tpf.shape[2]),\n", + " y_range=(tpf.row, tpf.row+tpf.shape[1]),\n", + " title=title, tools='tap,box_select,wheel_zoom,reset',\n", + " toolbar_location=\"below\",\n", + " border_fill_color=\"whitesmoke\")\n", + "\n", + " fig.yaxis.axis_label = 'Pixel Row Number'\n", + " fig.xaxis.axis_label = 'Pixel Column Number'\n", + "\n", + " color_mapper = LinearColorMapper(palette=\"Viridis256\", low=low, high=high)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " fig.image(image = [self.heat_stamp], x=tpf.column, y=tpf.row,\n", + " dw=tpf.shape[2], dh=tpf.shape[1], dilate=True,\n", + " color_mapper=color_mapper, name=\"tpfimg\")\n", + "\n", + "\n", + " # The colorbar will update with the screen stretch slider\n", + " # The colorbar margin increases as the length of the tick labels grows.\n", + " # This colorbar share of the plot window grows, shrinking plot area.\n", + " # This effect is known, some workarounds might work to fix the plot area:\n", + " # https://github.com/bokeh/bokeh/issues/5186\n", + " color_bar = ColorBar(color_mapper=color_mapper,\n", + " ticker=BasicTicker(desired_num_ticks=8), #LogTicker\n", + " label_standoff=-10, border_line_color=None,\n", + " location=(0, 0), background_fill_color='whitesmoke',\n", + " major_label_text_align='left',\n", + " major_label_text_baseline='middle',\n", + " title='Power', margin=0)\n", + " fig.add_layout(color_bar, 'right')\n", + "\n", + " color_bar.formatter = PrintfTickFormatter(format=\"%14u\")\n", + "\n", + " if tpf_source is not None:\n", + " fig.rect('xx', 'yy', 1, 1, source=tpf_source, fill_color='gray',\n", + " fill_alpha=0.4, line_color='white')\n", + "\n", + " # Configure the stretch slider and its callback function\n", + " stretch_slider = RangeSlider(start=low,\n", + " end=high,\n", + " step=.1,\n", + " title='Frequency Range',\n", + " value=(low, high),\n", + " orientation='horizontal',\n", + " width=200,\n", + " height=10,\n", + " direction='ltr',\n", + " show_value=True,\n", + " sizing_mode='fixed',\n", + " name='frequencyrange')\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " def stretch_change_callback(attr, old, new):\n", + " \"\"\"TPF stretch slider callback.\"\"\"\n", + "\n", + "\n", + " aperture = tpf.pipeline_mask\n", + " heat_stamp=[]\n", + " for i in np.arange(0,len(aperture)):\n", + " for j in np.arange(0,len(aperture[0])):\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " mask[i][j] = True\n", + "\n", + " period = self.periodogram[mask]\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(period.power[np.where((freq < new[1]) & (freq > new[0]))]).sum()\n", + " heat_stamp.extend([sums])\n", + " fig.select('tpfimg')[0].data_source.data['image'] = [np.reshape(np.asarray(heat_stamp),(len(aperture),len(aperture[0])))]\n", + " fig.select('tpfimg')[0].glyph.color_mapper.high = max(heat_stamp)\n", + " fig.select('tpfimg')[0].glyph.color_mapper.low = min(heat_stamp)\n", + "\n", + " stretch_slider.on_change('value', stretch_change_callback)\n", + "\n", + " return fig, stretch_slider\n", + "\n", + "\n", + " def make_default_export_name(tpf, suffix='custom-pg'):\n", + " \"\"\"makes the default name to save a custom intetract mask\"\"\"\n", + " fn = tpf.hdu.filename()\n", + " if fn is None:\n", + " outname = \"{}_{}_{}.fits\".format(tpf.mission, tpf.targetid, suffix)\n", + " else:\n", + " base = os.path.basename(fn)\n", + " outname = base.rsplit('.fits')[0] + '-{}.fits'.format(suffix)\n", + " return outname\n", + "\n", + "\n", + " def show_interact_widget(self, notebook_url='localhost:8888',\n", + " aperture_mask='pipeline',\n", + " exported_filename=None):\n", + " \"\"\"Display an interactive Jupyter Notebook widget to inspect the pixel data.\n", + " The widget will show both the lightcurve and pixel data. The pixel data\n", + " supports pixel selection via Bokeh tap and box select tools in an\n", + " interactive javascript user interface.\n", + " Note: at this time, this feature only works inside an active Jupyter\n", + " Notebook, and tends to be too slow when more than ~30,000 cadences\n", + " are contained in the TPF (e.g. short cadence data).\n", + " Parameters\n", + " ----------\n", + " tpf : lightkurve.TargetPixelFile\n", + " Target Pixel File to interact with\n", + " notebook_url: str\n", + " Location of the Jupyter notebook page (default: \"localhost:8888\")\n", + " When showing Bokeh applications, the Bokeh server must be\n", + " explicitly configured to allow connections originating from\n", + " different URLs. This parameter defaults to the standard notebook\n", + " host and port. If you are running on a different location, you\n", + " will need to supply this value for the application to display\n", + " properly. If no protocol is supplied in the URL, e.g. if it is\n", + " of the form \"localhost:8888\", then \"http\" will be used.\n", + " max_cadences : int\n", + " Raise a RuntimeError if the number of cadences shown is larger than\n", + " this value. This limit helps keep browsers from becoming unresponsive.\n", + " \"\"\"\n", + "\n", + "\n", + " aperture_mask = self.tpf._parse_aperture_mask(aperture_mask)\n", + "\n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = self.tpf.to_lightcurve(aperture_mask=aperture_mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)\n", + " #lc = lc.remove_outliers()\n", + "\n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(oversample_factor=5)\n", + " periodogram= periodogram.flatten()\n", + " pg = periodogram\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " npix = self.tpf.flux[0, :, :].size\n", + " pixel_index_array = np.arange(0, npix, 1).reshape(self.tpf.flux[0].shape)\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " pg_source = prepare_periodogram_datasource(pg)\n", + " tpf_source = prepare_tpf_datasource(self.tpf, aperture_mask)\n", + "\n", + " # Create the lightcurve figure and its vertical marker\n", + " fig_pg = make_periodogram_figure_elements(pg, pg_source,lc)\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(self.tpf, tpf_source,pg,\n", + " fiducial_frame=0)\n", + "\n", + " r_button = Button(label=\">\", button_type=\"default\", width=30)\n", + " l_button = Button(label=\"<\", button_type=\"default\", width=30)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " message_on_save = Div(text=' ',width=600, height=15)\n", + "\n", + "\n", + " # Callbacks\n", + " def update_upon_pixel_selection(attr, old, new):\n", + " \"\"\"Callback to take action when pixels are selected.\"\"\"\n", + " # Check if a selection was \"re-clicked\", then de-select\n", + " if ((sorted(old) == sorted(new)) & (new != [])):\n", + " # Trigger recursion\n", + " tpf_source.selected.indices = new[1:]\n", + "\n", + " if new != []:\n", + " selected_indices = np.array(new)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = self.tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(oversample_factor=5)\n", + " pg_new = pg_new.flatten()\n", + " pg_source.data['power'] = pg_new.power\n", + " pg_source.data['frequency'] = pg_new.frequency\n", + " ylims = get_periodogram_y_limits(pg_source)\n", + " fig_pg.y_range.start = ylims[0]\n", + " fig_pg.y_range.end = ylims[1]\n", + " else:\n", + " pg_source.data['power'] = pg.power * 0.0\n", + " fig_pg.y_range.start = -1\n", + " fig_pg.y_range.end = 1\n", + "\n", + " message_on_save.text = \" \"\n", + " export_button.button_type = \"success\"\n", + "\n", + " #def update_upon_cadence_change(attr, old, new):\n", + " # \"\"\"Callback to take action when cadence slider changes\"\"\"\n", + " # if new in tpf.cadenceno:\n", + " # frameno = tpf_index_lookup[new]\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[frameno, :, :] + pedestal]\n", + " # vertical_line.update(location=tpf.time[frameno])\n", + " #else:\n", + " # fig_tpf.select('tpfimg')[0].data_source.data['image'] = \\\n", + " # [tpf.flux[0, :, :] * np.NaN]\n", + " #lc_source.selected.indices = []\n", + "\n", + " def go_right_by_one():\n", + " \"\"\"Step forward in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value < np.max(self.tpf.cadenceno):\n", + " cadence_slider.value = existing_value + 1\n", + "\n", + " def go_left_by_one():\n", + " \"\"\"Step back in time by a single cadence\"\"\"\n", + " existing_value = cadence_slider.value\n", + " if existing_value > np.min(self.tpf.cadenceno):\n", + " cadence_slider.value = existing_value - 1\n", + "\n", + " def save_periodogram():\n", + " \"\"\"Save the lightcurve as a fits file with mask as HDU extension\"\"\"\n", + " if tpf_source.selected.indices != []:\n", + " selected_indices = np.array(tpf_source.selected.indices)\n", + " selected_mask = np.isin(pixel_index_array, selected_indices)\n", + " lc_new = self.tpf.to_lightcurve(aperture_mask=selected_mask)\n", + " lc_new = lc_new[np.where(lc_new.quality == 0)]\n", + " lc_new = lc_new.flatten(window_length=3001)\n", + " #lc_new = lc_new.remove_outliers()\n", + " pg_new = lc_new.to_periodogram(oversample_factor=5)\n", + " pg_new = pg_new.flatten()\n", + " pg_new.to_fits(exported_filename, overwrite=True,\n", + " power_column_name='SAP_POWER',\n", + " aperture_mask=selected_mask.astype(np.int),\n", + " SOURCE='lightkurve interact',\n", + " NOTE='custom mask',\n", + " MASKNPIX=np.nansum(selected_mask))\n", + " if message_on_save.text == \" \":\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " export_button.button_type = \"success\"\n", + " else:\n", + " text = 'Saved file {} '\n", + " message_on_save.text = text.format(exported_filename)\n", + " else:\n", + " text = 'No pixels selected, no mask saved'\n", + " export_button.button_type = \"warning\"\n", + " message_on_save.text = text\n", + "\n", + " #def jump_to_lightcurve_position(attr, old, new):\n", + " # if new != []:\n", + " # cadence_slider.value = lc.cadenceno[new[0]]\n", + "\n", + " # Map changes to callbacks\n", + " r_button.on_click(go_right_by_one)\n", + " l_button.on_click(go_left_by_one)\n", + " export_button = Button(label=\"Save Periodogram\",\n", + " button_type=\"success\", width=120)\n", + " tpf_source.selected.on_change('indices', update_upon_pixel_selection)\n", + " export_button.on_click(save_periodogram)\n", + " #cadence_slider.on_change('value', update_upon_cadence_change)\n", + "\n", + " # Layout all of the plots\n", + " sp1, sp2, sp3, sp4 = (Spacer(width=15), Spacer(width=30),\n", + " Spacer(width=80), Spacer(width=60))\n", + " widgets_and_figures = layout([fig_pg, fig_tpf],\n", + " [l_button, sp1, r_button, sp2, sp3, stretch_slider],\n", + " [export_button, sp4, message_on_save])\n", + " #removed cadence slider\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n", + "\n", + "\n", + " def create_interact_ui(doc):\n", + " # The data source includes metadata for hover-over tooltips\n", + " tpf_source = None\n", + "\n", + " # Create the TPF figure and its stretch slider\n", + " fig_tpf, stretch_slider = make_tpf_figure_elements(self.tpf, tpf_source,pg,\n", + " fiducial_frame=fiducial_frame,\n", + " plot_width=640, plot_height=600)\n", + " fig_tpf, r = add_gaia_figure_elements(self.tpf, fig_tpf,\n", + " magnitude_limit=magnitude_limit)\n", + "\n", + " # Optionally override the default title\n", + " if self.tpf.mission == 'K2':\n", + " fig_tpf.title.text = \"Skyview for EPIC {}, K2 Campaign {}, CCD {}.{}\".format(\n", + " self.tpf.targetid, self.tpf.campaign, self.tpf.module, self.tpf.output)\n", + " elif self.tpf.mission == 'Kepler':\n", + " fig_tpf.title.text = \"Skyview for KIC {}, Kepler Quarter {}, CCD {}.{}\".format(\n", + " self.tpf.targetid, self.tpf.quarter, self.tpf.module, self.tpf.output)\n", + " elif self.tpf.mission == 'TESS':\n", + " fig_tpf.title.text = 'Skyview for TESS {} Sector {}, Camera {}.{}'.format(\n", + " self.tpf.targetid, self.tpf.sector, self.tpf.camera, self.tpf.ccd)\n", + "\n", + " # Layout all of the plots\n", + " widgets_and_figures = layout([fig_tpf, stretch_slider])\n", + " doc.add_root(widgets_and_figures)\n", + "\n", + " output_notebook(verbose=False, hide_banner=True)\n", + " return show(create_interact_ui, notebook_url=notebook_url)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 41.7 s\n" + ] + } + ], + "source": [ + "%%time\n", + "pmp =PixelMapPeriodogram(tpf[:1000])" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " }\n", + " finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.bokehjs_exec.v0+json": "", + "text/html": [ + "\n", + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "47604b9bb5d24c468ffdac3104025500" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "pmp.show_interact_widget(notebook_url = 'localhost:8889')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[358.03475074, 344.82649896, 344.54874566, 343.10694532,\n", + " 349.38352515, 348.87361353, 338.78543162, 344.55139163,\n", + " 342.53857564, 344.83478669, 335.72208425],\n", + " [360.76869663, 339.73901922, 371.75593382, 345.41684843,\n", + " 340.5694529 , 341.14464127, 350.16815091, 357.74581839,\n", + " 329.98507957, 339.85915529, 331.29377578],\n", + " [354.19234993, 341.03492116, 345.92900364, 339.17920826,\n", + " 354.07019195, 352.79611308, 342.24785325, 344.34490824,\n", + " 338.55856351, 337.10514697, 339.61990441],\n", + " [357.68029527, 345.32846716, 361.58705072, 353.02927928,\n", + " 327.9441054 , 337.13401256, 351.33801749, 356.24186195,\n", + " 334.14923355, 339.63186027, 349.08003986],\n", + " [358.64688387, 352.75600675, 339.18444002, 357.58795294,\n", + " 338.1068074 , 349.29338038, 338.60343706, 355.33835133,\n", + " 338.67106656, 340.32286218, 343.32330107],\n", + " [357.89569132, 360.4712817 , 347.27640094, 336.95947578,\n", + " 326.01253605, 348.50589242, 352.1833025 , 341.67838555,\n", + " 352.55565047, 364.36797615, 337.26181194],\n", + " [346.13077295, 355.87454334, 352.95454401, 346.26177658,\n", + " 336.78026505, 349.25199256, 331.87383201, 338.54176561,\n", + " 330.27261896, 352.05592264, 355.37231689],\n", + " [350.21848769, 339.08214238, 342.54113619, 350.00701687,\n", + " 351.35737273, 351.97036311, 355.98721942, 364.14477166,\n", + " 344.98051897, 343.27363221, 332.5237457 ],\n", + " [350.05866705, 353.96293736, 345.71909403, 342.91752648,\n", + " 347.74180979, 344.91142493, 326.9141297 , 348.74924481,\n", + " 345.89550866, 334.2600599 , 351.96470468],\n", + " [351.41203253, 357.58912519, 348.5259286 , 355.08294449,\n", + " 339.51763286, 357.38289578, 345.65995855, 336.38609732,\n", + " 336.94250552, 341.39160943, 359.27492029],\n", + " [342.72308272, 342.62003368, 348.4240653 , 352.46502913,\n", + " 350.80846724, 336.26307759, 338.76509312, 351.49683223,\n", + " 346.48931161, 330.12868115, 339.24940034]])" + ] + }, + "execution_count": 223, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pmp.frequency_heat(low=276.34,high=343.54)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": {}, + "outputs": [], + "source": [ + "frequency=np.linspace(0,400,69999)\n", + "frequency.size\n", + "tpf.flux.shape\n", + "power = np.zeros((frequency.size,tpf.flux.shape[1],tpf.flux.shape[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(69999, 11, 11)" + ] + }, + "execution_count": 178, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "power[:,0,0] = .to_periodogrmam(frequency=frequency).power\n" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 189, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(pmp.periodogram[5][5].frequency,pmp.periodogram[5][5].power)" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": {}, + "outputs": [], + "source": [ + "t= tpf.time" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [], + "source": [ + "df = 1./(t[-1]-t[0])/5.\n", + "nyq = 2/np.median(np.diff(t))\n", + "freq = np.arange(df,nyq,df)" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [], + "source": [ + "lc = tpf.to_lightcurve()" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [], + "source": [ + "lc_new = lc[np.where(lc.quality == 0)]" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(200739,)" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t= lc.time\n", + "df = 1./(t[-1]-t[0])/5.\n", + "nyq = 2/np.median(np.diff(t))\n", + "freq = np.arange(df,nyq,df)\n", + "freq.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(200739,)" + ] + }, + "execution_count": 207, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t=lc_new.time\n", + "df = 1./(t[-1]-t[0])/5.\n", + "nyq = 2/np.median(np.diff(t))\n", + "freq = np.arange(df,nyq,df)\n", + "freq.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 211, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, ..., 0, 0, 0])" + ] + }, + "execution_count": 211, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf.quality" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1000, 11, 11)" + ] + }, + "execution_count": 217, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf[:1000].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(18104, 11, 11)" + ] + }, + "execution_count": 214, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Frequency range input for to_periodogram" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def Simulate_Random_Image(imageshape=(30,30),separation=None):\n", + " time = np.arange(1000)*1./48.\n", + " freq1 = np.random.uniform()*15 #per day\n", + " freq2 = np.random.uniform()*15 #per day\n", + " relamp = 1\n", + " signal1 = relamp * np.sin(time*2*np.pi*freq1)\n", + " signal2 = relamp * np.sin(time*2*np.pi*freq2)\n", + " \n", + "\n", + " #Images\n", + " if(separation == None):\n", + " star1pos = [np.random.uniform()*imageshape[0],np.random.uniform()*imageshape[1]]\n", + " star2pos = [np.random.uniform()*imageshape[0],np.random.uniform()*imageshape[1]]\n", + " star1flux = np.random.randint(300,2000)\n", + " star2flux = np.random.randint(300,2000)\n", + " seeingsigma = 1.\n", + " \n", + " imagestack = np.zeros((imageshape[0],imageshape[1],len(time)))\n", + " xcoord,ycoord = np.meshgrid(np.arange(imageshape[1]),np.arange(imageshape[0])) #strange order\n", + "\n", + "\n", + "\n", + " backgroundnoise = 10.\n", + "\n", + " #add starlight\n", + "\n", + " distance1 = np.sqrt((xcoord-star1pos[0])**2 + (ycoord-star1pos[1])**2)\n", + " distance2 = np.sqrt((xcoord-star2pos[0])**2 + (ycoord-star2pos[1])**2)\n", + "\n", + " for i in range(len(time)):\n", + " #star 1\n", + " imagestack[:,:,i] += stats.norm.pdf(distance1,scale=seeingsigma) * star1flux * (1. + signal1[i])\n", + "\n", + " #star 2\n", + " imagestack[:,:,i] += stats.norm.pdf(distance2,scale=seeingsigma) * star2flux * (1. + signal2[i])\n", + "\n", + " #add measurement noise\n", + " #should probably be Poisson\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(imagestack[:,:,i])\n", + "\n", + " #background\n", + " imagestack[:,:,i] += backgroundnoise\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(backgroundnoise)\n", + "\n", + " stars = imagestack[:,:,:].T\n", + " return [stars,freq1,freq2,star1pos,star2pos,star1flux,star2flux,time,imageshape,separation]\n", + " \n", + " \n", + " else:\n", + " star1pos = [np.random.uniform()*imageshape[0],np.random.uniform()*imageshape[1]]\n", + " star2pos = [np.random.randint(star1pos[0]-separation,star1pos[0]+separation,size=1)]\n", + " star2pos.extend(np.sqrt(separation**2 - (star2pos[0]-star1pos[0])**2)+star1pos[1])\n", + " star1flux = np.random.randint(300,2000)\n", + " star2flux = np.random.randint(300,2000)\n", + " seeingsigma = 1.\n", + "\n", + " imagestack = np.zeros((imageshape[0],imageshape[1],len(time)))\n", + " ycoord,xcoord = np.meshgrid(np.arange(imageshape[1]),np.arange(imageshape[0])) #strange order\n", + "\n", + "\n", + "\n", + " backgroundnoise = 10.\n", + "\n", + " #add starlight\n", + "\n", + " distance1 = np.sqrt((xcoord-star1pos[0])**2 + (ycoord-star1pos[1])**2)\n", + " distance2 = np.sqrt((xcoord-star2pos[0])**2 + (ycoord-star2pos[1])**2)\n", + "\n", + " for i in range(len(time)):\n", + " #star 1\n", + " imagestack[:,:,i] += stats.norm.pdf(distance1,scale=seeingsigma) * star1flux * (1. + signal1[i])\n", + "\n", + " #star 2\n", + " imagestack[:,:,i] += stats.norm.pdf(distance2,scale=seeingsigma) * star2flux * (1. + signal2[i])\n", + "\n", + " #add measurement noise\n", + " #should probably be Poisson\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(imagestack[:,:,i])\n", + "\n", + " #background\n", + " imagestack[:,:,i] += backgroundnoise\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(backgroundnoise)\n", + " \n", + " stars = imagestack[:,:,:].T\n", + " diction = {\n", + " 'stars':stars,\n", + " 'Frequencystar1':freq1,\n", + " 'Frequencystar2':freq2,\n", + " 'star1position':star1pos,\n", + " 'star2position':star2pos,\n", + " 'star1flux':star1flux,\n", + " 'star2flux':star2flux,\n", + " 'time':time,\n", + " 'imageshape':imageshape,\n", + " 'separation':separation\n", + " }\n", + " return diction" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "def Simulate_Image(imageshape=(30,30),star1pos = [15,15],star1flux = 1000 , freq=10):\n", + "\n", + " time = np.arange(1000)*1./48.\n", + " relamp = 1\n", + " signal = relamp * np.sin(time*freq*2*np.pi)\n", + "\n", + " #Images\n", + " seeingsigma = 1.\n", + "\n", + " imagestack = np.zeros((imageshape[0],imageshape[1],len(time)))\n", + " xcoord,ycoord = np.meshgrid(np.arange(imageshape[1]),np.arange(imageshape[0])) #strange order\n", + "\n", + "\n", + "\n", + " backgroundnoise = 10.\n", + "\n", + " #add starlight\n", + " distance1 = np.sqrt((xcoord-star1pos[0])**2 + (ycoord-star1pos[1])**2)\n", + "\n", + " for i in range(len(time)):\n", + " #star 1\n", + " imagestack[:,:,i] += stats.norm.pdf(distance1,scale=seeingsigma) * star1flux * (1. + signal[i])\n", + "\n", + "\n", + " #add measurement noise\n", + " #should probably be Poisson\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(imagestack[:,:,i])\n", + "\n", + " #background\n", + " #imagestack[:,:,i] += backgroundnoise\n", + " imagestack[:,:,i] += stats.norm.rvs(size=imagestack[:,:,i].size).reshape(imageshape) * np.sqrt(backgroundnoise)\n", + " stars = imagestack[:,:,:].T\n", + " diction = {\n", + " 'stars':stars,\n", + " 'frequency':freq,\n", + " 'starposition':star1pos,\n", + " 'starflux':star1flux,\n", + " 'time':time,\n", + " 'imageshape':imageshape\n", + " }\n", + " return diction" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "test = Simulate_Image(imageshape=(31,31),star1pos=[5,5])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def Create_LightCurve(*simulatedimage):\n", + " imageshape = simulatedimage[0]['imageshape']\n", + " time = simulatedimage[0]['time']\n", + " lc_array = np.zeros(imageshape,dtype=object)\n", + " fluxtype = simulatedimage[0]['stars']\n", + " for i in np.arange(0,imageshape[0]):\n", + " for j in np.arange(0,imageshape[1]):\n", + " lc_array[j][i] = lk.LightCurve(time = time, flux = fluxtype.T[i,j,:])\n", + " return lc_array" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "lc = Create_LightCurve(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def Create_Periodogram(lc):\n", + " pg = np.zeros(shape = (len(lc[0]),len(lc[1])),dtype=object)\n", + " for i in np.arange(0,len(lc[0])):\n", + " for j in np.arange(0,len(lc[1])):\n", + " pg[i][j] = lc[i][j].to_periodogram(oversample_factor = 5,)\n", + " return pg" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "pg = Create_Periodogram(lc) #21 seconds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Flatten lightcurve and pick peaks to look at on the periodogram image eventually" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def frequency_heat_plot(pg,low=1,high=2):\n", + " heat_stamp = []\n", + " \n", + " for i in np.arange(0,len(pg)):\n", + " for j in np.arange(0,len(pg[0])):\n", + " mask = np.zeros((len(pg),len(pg[0])), dtype=bool)\n", + " mask[j][i] = True\n", + " \n", + " period = pg[mask][0]\n", + " normperiod = np.asarray(period.power)/np.median(np.asarray(period.power))\n", + " freq = np.asarray(period.frequency)\n", + " sums = np.asarray(normperiod[np.where((freq < high) & (freq > low))]).sum()\n", + " heat_stamp.extend([sums-len(np.where((freq < high) & (freq > low))[0])])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(pg),len(pg[0])))\n", + " return heat_stamp" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fhp = frequency_heat_plot(pg,9,11)\n", + "plt.imshow(fhp,origin=0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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mDHq0qWLzpw5o4MHD+qDDz7QU089pffff1/PP/+8zGaztm7dqqFDh+qTTz7RL37xC/n5+amwsLDWa/L19VXTpk01ePDgWr229OjRQ23atNHOnTs1d+7cWr8ulZWVWb8OCAjQ22+/rbffflvNmjXTlStXbGpnzpyp+++/X0ePHtWgQYOsx0tLS+Xm5iYXFxdZLBYdPXpUXl5eCgkJ0dmzZ2UymVRaWqqwsDCb65nNZqWmpioqKqpWawYAVO+eCuqpqanat2+fpk6dqsGDB0uSIiIilJ2dreTkZEVFRdl8tLczKyws1Nq1azVixAi7PuXQaDSqUaNGdtU6Wnl5eZX+fmdXVlam3NxctWjRosba1NRUbd++XVOmTKmx9tSpU2rSpImaNGli1zr27dsnd3d3hYWFqbCwsMYWhrKyMuuO8I3+W5tMJm3ZskW9e/eu9vmdPn1abdu2VXl5uYqLi2/Y43zt2jX94Q9/UFJSkho1amQ9fvHiRf30009atmyZxo8fr+DgYOva9u/fr969eysnJ0cmk0klJSUKCQnR7t275eHhYW0VcXFxUZ8+ffT1119rxIgRKi4uVlFRkQ4cOKDCwkJ99913+uc//6nmzZvrs88+U3p6unbv3q2XX35ZkZGR2rp1q3r27CkvLy998803atu2rTp06KBt27bps88+U1pamvLy8iRJ77//viRp7ty51udw/Phxubu73/CTRQMCApSfn29zzNPTU0FBQZo6daqmTJkif39/NW/evMooRns0bdpU8+fPlyT97ne/07/+9S8VFxdXW3uzf0gYDAYdOnRIkqqEdEn6y1/+Il9fXxUWFuqTTz7RihUrdPr0aV25ckXNmzdX37595evra/0zeu2117R8+XLt3btXktSqVSv94he/UEFBgUJCQnTw4EFt2LBBERERevrpp9WqVSsFBgaqTZs2ysnJ0XvvvafS0lKNHz9eISEh1paiP//5z5o7d+5Nd/cPHz6soKAgubm5aebMmZo5c6ZcXFyUl5ennJwcdezY0Vp77tw5tWrVSufOndPVq1cVERGhPXv2qHfv3na9BmZnZ6tly5bW7zMzM3Xs2DEtXbpUM2bMUPPmzZWTkyMPDw81btxYZrNZu3fvVmRkpN0tkiUlJfL09Lzh+TfffFOjR49W69at7X69uF5ZWVm172mVX0vMZrNycnL03HPPacmS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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pg[5][5].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[2.362452968394556,\n", + " 1.3332392386246288,\n", + " [10.773326006527324, 22.279953907529595],\n", + " [18.6411113522353, 15.410720759799736],\n", + " 1606,\n", + " 482]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test[1:7:]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def Find_Centroid(fhp):\n", + " x=0\n", + " y=0\n", + " for i in np.arange(0,len(fhp)):\n", + " for j in np.arange(0,len(fhp[0])):\n", + " x += j*fhp[i][j]/fhp.sum()\n", + " y += i*fhp[i][j]/fhp.sum()\n", + " return x,y" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(14.913443604667416, 14.756152587364843)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Find_Centroid(fhp)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "def Flat_lc(*simulatedimage):\n", + " flux = np.zeros(shape=len(simulatedimage[0][7]))\n", + " for i in np.arange(0,len(simulatedimage[0][7])):\n", + " flux[i] = simulatedimage[0][0][i].sum()\n", + " lc = lk.LightCurve(time = simulatedimage[0][7], flux = flux)\n", + " return lc" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvkAAAF1CAYAAAByJvVGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsvXuQXVWVP75ud6e7b6df6YSQkAZakZdIwARHsCAwSpVTNuNjBkZD6QBVmnmUjkWC1Ig6oyUyXwcqKio4BVa0eIQMjig4JWEEAQkPK6SCIGJiAh06kFcn3X277+2+/bi/P/jt9vTp/Vhr3b3OPbfv/lRZJel999nnsff+7M/+rLUzpVKpBAEBAQEBAQEBAQEB8wZ1lW5AQEBAQEBAQEBAQIBfBJIfEBAQEBAQEBAQMM8QSH5AQEBAQEBAQEDAPEMg+QEBAQEBAQEBAQHzDIHkBwQEBAQEBAQEBMwzBJIfEBAQEBAQEBAQMM8QSH5AQEBAQEBAQEDAPEMg+QEBAQEBAQEBAQHzDIHkBwQEBAQEBAQEBMwzBJIfEBAQEBAQEBAQMM/QUOkGmPDCCy/A448/Dn/4wx/gyJEjsHDhQjj11FPhE5/4BLzjHe+YVbZQKMDdd98NTz31FORyOeju7obLL78c1qxZM6debFmJOgMCAgICAgICAgKSQGpJ/i9/+UvI5XLw4Q9/GE488UQYHh6GBx54AK677jr42te+Buecc85M2Ztuugl2794NV111FaxYsQKeeOIJuPnmm2F6ehouueSSWfViy0rUGRAQEBAQEBAQEJAEUkvy//Ef/xE6Oztn/duqVatg3bp1cP/998+Q/O3bt8POnTvhuuuug4svvhgAAFauXAmHDh2CTZs2wUUXXQT19fWkshJ1BgQEBAQEBAQEBCSF1JL8OMEHAMhms3DSSSfBkSNHZv7tmWeegWw2CxdeeOGsspdeeinccsstsGvXLjjzzDNJZSXqjGJ6ehqOHj0K2WwWMpkM8ckEBAQEBAQEBATUKkqlEhQKBejq6oK6OnN4bWpJvg6jo6OwZ88eWLly5cy/9fX1QXd39xy1vKenZ+bvimRjy0rUGcXRo0fhmmuuod18QEBAQEBAQEBAwP+PTZs2wZIlS4x/ryqS/4Mf/ADGxsbg7/7u72b+LZfLwbJly+aUbWtrm/k7taxEnVFks1nN3Zlx+eWXwxVXXEH6TUBAQEBAQEBAwPxDPp+Ha665xsknq4bk33333fD444/DP/zDP8zJrlNtUBadTZs2QUtLi7P8ggULYMGCBdLNCggICAgICAgIqBK4LN9VQfI3b94MW7ZsgU996lNw2WWXzfpbW1ubVi1X/6YUdUpZiTp1aGlpQZH8gICAgICAgICAAApSfxjW5s2b4d5774Urr7xylk1HoaenB/r7+2FqamrWv/f19QEAwMknn0wuK1FnQEBAQEBAQEBAQFJINcm/77774N5774WPf/zjsHbtWm2Z888/HwqFAjz99NOz/v3RRx+Frq4uOO2008hlJeoMCAgICAgICAgISAqptes88MADcM8998CqVavgvPPOg1deeWXW38844wwAADjvvPPg3HPPhdtuuw3y+TwsX74cnnzySdixYwds2LBhVtYbbFmJOgMCAgICAgICAgKSQqZUKpUq3QgdvvjFL8JLL71k/PtDDz008/8LhQLcdddd8NRTT0Eul4Pu7m644oorYM2aNXN+hy0rUadCPp+Hj3/847Bly5bgyQ8ICAgICAgICEADyyNTS/LnMwLJDwgICAgICAgI4ADLI1PtyQ8ICAgICAgICAgIoCOQ/ICAgICAgICAgIB5hkDyAwICAgICAgICAuYZAskPCAgICKg6hHCygICAADsCyQ8ICAgIqCrs27cPvv/971e6GQEBAfMQ9913H0xOTla6GV6Q2jz5tYD169dDXd3sdVZvby/09vZWqEUBAQEB6ccbb7wBr776aqWbERAQMA/x61//Gi688ELo7u6udFPKRiD5FcTGjRtDCs2AgHmOxx9/HNasWTNnQR/Ax5EjR+DAgQOVbkZAQMA8RC6Xg/37988Lkh9mnQAxFIvFSjchIKDiuPfee+Hll1+udDPmFY4cOQIDAwOVbkYAAWNjY3Dw4MFKNyMgwImRkRHYv39/pZvhBYHkB4jh61//ehjUA2oe+Xwetm3bVulmzCscPnwYli5dCoVCodJNmTcoFovw+uuvi9X/0ksvwZYtW8Tqr0WMjIzAT3/6U5ienq50U+YVMplMIPkBAS7s2bMHBgcHK92MeYVjx46JZhWZmJgQq7tW0dTUBG+++WalmzGvcOTIEXjnO98Jhw4dqnRT5g127doF1113nRhhHB8fF11E1CJ27twJt9xySxhfPGJ6ehqWLVs2bwTKQPIDRDA9PQ19fX0wNDRU6abMG7zyyitw9dVXw3//93+LXeOGG26AkZERsfrTiFKpJDqgt7a2Qi6XE6u/FlEsFmHRokWQz+cr3ZR5g1wuB/39/WJEvFgsQn9/v0jdacWBAwfgF7/4hVj9Y2NjcNppp4UgdI/I5/OwdOlSGB0drXRTvCCQ/AARHDx4EBoaGgLJ94jh4WG44oor4LnnnhO7xtDQEOzbt0+s/jSir68Pvv3tb4vVX1dXF7bTBdDS0hJIvkcMDQ3BihUrYHh4WKR+peTX0vkGe/fuha9+9ati9RcKBTjzzDPhtddeE7tGrWFkZARaW1sr3QxvCCQ/QAQHDx6EU089NZB8jygWi9Dc3Cw6SRYKBejr6xOrP4145ZVXYGxsTKTuWiI0SSObzYp68m+99VYxwptG5HI56O7uFhuzi8UiNDU11VTAdGNjo2j9hUIBzjjjjJobsyWRy+Wgra2t0s3whkDyA0QwMjIiOmHUIiYmJmDBggWi1xgbG6u5CeOPf/wjjI+Pi9Q9Pj4Ozc3NInXXOqSV/F27dtXUTsHw8DCcdNJJYnFUxWIRTjnllJry5asYJ6nFYqFQmFfWkjRAkfz6+vp5cSBWIPk1DEmVcWRkBFasWBFIvkdMTEyIK0Otra3zJuAIi/7+fqivrxepO5/PQzabBYCg6vuGNMkfGBioqUB0peRL2nVqjeQXi0Xo6OiAw4cPi9Q/NjYG7e3tNfWdSmN0dBRaWlqgs7NzXiQOCSS/RrF//354z3veI5bLPpfLifo7axHFYlFcyc9ms2LWlbRicnISGhpkzgXM5/PQ0tICzc3NYrsFacRrr70G999/v+g1pO06R44cqamzPoaHh8XtOrVG8icmJmDp0qVw7NgxkfoLhQIsXLhwXijOacH4+Dg0NTXBokWL4OjRo5VuTtkIJL9GoQYdqSDLkZEROOGEE0JWEY9Iwq7T1NRUcyRfEoVCAVpaWqC9vb2mdrX+67/+C5599lmx+jOZjKiSPzk5CceOHasphVSRfClhplgsQk9PT02leywWi7B06VIxRbhQKMzsFErhe9/7Xk31AzXPzhfBK5D8GsXw8DAsWbJE7CMeGRmBtra2YFHwiGKxKGrXmZycFLOt1CqUkt/W1lZTC96xsTGxjELqO5VU8lVwaC2Rm6mpKViyZIkYIR0fH4fOzs6a2tEqFotw/PHHiyr50iR/x44d8Ic//EH0GmmCmmcbGxvnxU6ezB51AArr16+HurrZ66ze3l7o7e0Vv/bw8DAcd9xxYiRfBa8Eku8P0kq+mjBCEJc/qGc6OTkp1teuvfZaWLVqFXzqU58SqT9tUMHMkkr+m2++CW1tbfNikqdAcidPZQerJWtJEnYdaZI/NjYGO3bsgJUrV4peJy1QJH/BggXzYpEfSH4FsXHjRmhpaanItXO5nCjJn2+5ZtMA6cDbWiT5Y2Nj0NTUJKYu5vP5GT++FGGcnp6G559/vmZIvnpnLS0tYkr+tm3b4KKLLpoXkzwFmUwGMpmMSN21mGlKKfkvv/yySP2Tk5PiFs76+np44403RK9BxdTUFBw+fBiWLVvmve75RvKDXadGkcvlYOnSpWIkPwmFodagAm8zmQxMTU15r1+9s1rafcnlctDe3g4AMtlv1MJMciFRV1cHmUwmdQqpVAq6sbExaG5uhmw2K6bk79q1C1auXDkvJvm0QNpumEZIK/kKUgszAICFCxemTvj51re+BTfffLNI3WrHfL7YdQLJr1EoJV/SHyk58AC8NRF/5CMfEb0GFZIEWQ0+TU1NIoOPChKtJQwNDUFHR4fYM1VKmyTJBwBYtmyZWJo+Ljo6OkSCjVX2C8lJuK6uTuybqFXUIskvFovQ1tYmHocgOe9ILqa52Ldvn1jMjzq0LSj5AVUNaU++NF5//XW48cYbU9cJv/vd74plj1CTpFQ6xkKhAM3NzeKLszRheHgY2traxLzIExMT0NDQIE7y05iic9GiRSJBnErJl/5O58skT4UUYaxFkp/E2Sa1BunvSO2Yz5f+H0h+jaLaSf6rr74Kq1atgtNPP73STZmFP/3pT2KHSUWtHxLvTdl16urqROxAaYTavZAiySoHv/TWbxpTn0pt8yslXxrzZbs+LSiVSnMSTcx3JHG2CYDcrnkaM6699tpr8La3vU2s/vmWXae2elzADCYnJ6GtrU2cGGQyGRFlKJ/PwxlnnOG93nJx4MABsRR0UbuOBCFV6R6lDxlKE5Qq3NzcLNIXFMmXVvLTaC1ZsGCBSJvUO5NGY2Nj6pS8u+++G/r7+73XOzU1VVM7eEkhqd0Lqd2XNAZLDw4OwqJFi8TqV2JaUPIDqh5JqH9S5CaN/vFSqQQHDx4UC7JSqpDUM40SXimSPzIyAjt37hSpmwOlCkv1haQ8+dL1c9DY2CgSeJuUkt/Q0JC6Sf7ZZ58V2SlMI5mbD0jiAEMFCaKfxgQa0nP/+Pj4jJKftv7PQSD5NYwkfLxSCmkaSf7Q0BAsXrxY7Chs6UwtakCXTE24a9cu2Lp1K7r8Cy+8AJ/85CdF2gIwe2Ej8UyjnnwJVVtN7I2Njakh+VNTU1BfXy+q5NeiXadUKsEf//hHcQtUUPT9QSn5mUxGLFAU4K1dM8lMVgCywb0UqNgxKUSV/DT1fy4Cya9hSBHwKKQU0nw+nzqF4dChQ3DGGWeI2XWklfwk7DoHDhyAkZERdPnp6Wl45ZVXRNoCkJySL0XCp6amoKGhIZG+jEU0z7RkxiIpRBdOaZrkBwYGoFgskvoPFlElv5pjcqTGXi4UYVy4cKFohhqpb1WR/DT1hajAJ7HwCIG3AfMGSRADyUwwaSP5AwMDcOqpp4rZdaanp2cUUonBZ2xsDLLZrKiN6+DBg5DL5dDlFdmQUpGSUvKl6o8u/NIyCUdTXEp8pyrOQQpq4SSljnLxxhtvwGmnnSai5Ed3R9JE6KjYsGFDana0AP7cP6VzzUvvmkkvUihQc7/kmB0CbwPmBaTIXJSQSS0klOqcJgwMDMCJJ54ofnBIQ0ODCPlQ26CS/u4DBw6Qno8aZKUyFilCKhl4K6nkRzNBpIXcqGcqtRiVJvlRJS9Nk/ybb74J73jHO8SUfEXy0xjfgUGpVIJXX301VWq+EmakSb7UIl8JPwsXLhT57jhQJF8qf3+pVIJMJpO6RT4XgeTXIKampqCurk5sElaeXAC5hYQafNKEI0eOwJIlS8SvI0Xy1cJJcpI/fPgw6b0Vi0VYvXo17NixQ6Q9SslPIk9+NR+2RYG0XUc6mDGq5KVpu16RfGlPvrSCKeVPP3bsGAwPD4ufLsuBBElW8ziA3JkO0judHERJvmQWuLQt8rmQk0MCnFi/fv2cvMG9vb3Q29srel3pw2SinlmpwSGNnvyBgQFYvHix+HUklXxl15Ea0EulEinvcrFYhAsuuACef/55+NCHPuS9PcqL3NzcLKIASpNwpTqnaRKudruOWkSkbZI/cOAAvPvd74bdu3d7rztJkq++C9/B06+99hocf/zxqSX5vhdn0X4gtZOnuEKa/OlJkfz5YtcJJL+C2LhxY0UsJ9KZaaIHgEjaFNQ11PZapXH06NFESH59fb1IYJzaHUlbEGd3dze88MILIvUrz2m15slXqnmalHxpu460kp/WwLvDhw9DT0+PuJIv0ReiY7R6rr5J/rFjx+CUU04hk/x77rkHPvCBD8CyZcu8ticKCcIYJ/kS32qhUICFCxemasGbpJIf7DoBVYmkUlAByKnOmUwGMpkMNDQ0pCYTRFJxAlLPNKmDmyjb9dKHyUhvR6tnKpVzXdrzz0ES2XWklfw02nWmp6ehra1NLPBWzQkShDTajyWtJcuXLyeT/J07d8Lhw4e9tycKiTE7TvIls+ukacEb7Do0BJJfg5DOTBNV2qQIqUKabAoK9fX1ovcs/UylST5l61qa5EsH3ipPvtROk3RaVQ6kD5NJwpOfRrsOwFvpLSUyTUnbdZIg+YVCAZYvX0623fX39yeSLMG3GBUl+dKnS6dJ1Va7r9IZxdK0sCkHgeTXIKTtOtFJWMpaksZDgBSkMylUO8lvbW1FB6FFd4WkkMlkRJV8aWtJY2Njqha7xWJxJrd2NXry1cJJ2pOblmwlALO/U4n+rxZ+ALKq8/HHH08i+aVSCfbv3y/+LiSEn2g/kM6ukzbCm8lkxOcpqQV10ggkvwYRtetIDD5Rv7ykXQcgXcExqk2B5NtBIaRRciAJ6ew6UlATfZoWu+qdSVqU1DOVOLhJiRTScT7//u//nprYl8nJyZmAeIlvqVgszuwUSI1fY2Nj0NnZSWr74OAg1NfXV2Xa4ySUfMUV0kTy0zj3pxmB5NcgonYdCUJa63YdilKNRVRRqNZnqu6BMiEloeQDyJ3noPJkSyGtgbeSh8lEyY2EDULaDqQwPDyMHieKxWIiB4ABJGPXkfguxsfHoaOjg9QP9u/fL3bAWDTuSGJHO74wk7brpIVQp3kXP40IJL8GEfVfVivJT2NHV22SeKbRSTIJJV9S1aZMSNKefPXO0kSSKYgehpWWSThq10mC5EvsRCaxsMzlcmiSPzIyAm1tbWJtiZ5tUl9f7z2PfdzzLxV4297eTvrm+vv7xUi+6gcAMt+p9MIMIBlP/sjICOzZswddXin5aTrlO81IbQrNfD4PW7Zsgb1798LevXtheHgY1q5dC1deeeWcsnv27IHNmzfD7t27YWRkBI477ji4+OKL4WMf+9icLDKFQgHuvvtueOqppyCXy0F3dzdcfvnlsGbNGlY5atk0YHJycua5VCvJV5Ak+T/96U/hYx/7GHnbXkLJj06S1WrXUTnpKVu/inCpe/atZkbT+lXjhKGeSRpSyCpE7ToS36n0+JKUkk8h+blcDtrb28XaElWFJVTnuEghFXhLzRq3f/9+OP300+FPf/qTaHukA28bGxshl8t5rR9gtid/eHjYe/0AAE8//TTs2rULPvvZz5J+lyZhI81ILcnP5XKwdetW6OnpgfPPPx8eeeQRbbl9+/bB9ddfDytWrIBPf/rT0N7eDr///e/hvvvugz179sCXv/zlWeVvuukm2L17N1x11VWwYsUKeOKJJ+Dmm2+G6elpuOSSS8jlqGXTgOjgIEXyk1KdGxsbxer/xS9+Ae973/vQ+ZMV0ZKwfsRJvmTaUGmSz1Hy1TNtbW313i6AP6dkrTZwVedbb70VrrjiCli+fLn3NiVp15GIKUqK5I+MjJBIvtS3DzBbFa6vr/f+3uKBt1JKPjVr3P79++Giiy4SOYcj2h7pwFvJw7BUOlwpT/7vfvc71u+qdfc1aaSW5C9duhQ2b94MmUwGhoaGjCT/iSeegGKxCF/84hdnJqxzzjkHjh49Clu3boWRkZGZwXH79u2wc+dOuO666+Diiy8GAICVK1fCoUOHYNOmTXDRRRdBfX09uhylzjQhOji0traKkHzJ7fTowSpSqhDAW0rMnj17yIekSJBwRZAB5FN0Sg2eKvUZVclfsGDBTE5kSaJTjZkUisUiK1NWX18fPPfcc/DRj35UpE2SwXpxJV/Cky9t15mcnITR0dHU2HXiSr6EBUqJFJJ58qkHbB07dgy6u7tFsuvElXzpwFuJZ1oqlaCuro6803nkyBHo6uqCujq3I3zXrl1w0kknkdsmISJU4xzgQmo9+VhlTX3k8YmutbUV6urqZm3vP/PMM5DNZuHCCy+cVfbSSy+Fo0ePwq5du0jlqGXTgqj/sqWlxfsAF1fyfU/C0fZTB09KJ87n87B3715y3RKTZHQCk5gwpqenZy2cJHYK1G4EVcmXzGNf7eBamAqFAuzYsQNVdnR0FA4cOICuW6m2mUxGZNJMwpMvreSPjo6SbH35fF70bJOoki/R/5MIvI3eAwXZbFZkbIkeMCZN8qX86VE7I6X93/72t9E++7q6OtLzj8bj+b5n7jeUZqSW5GPx/ve/HxYuXAi33347HDhwAPL5PPz2t7+Fhx9+GD70oQ/N8uj19fVBd3f3HGW9p6dn5u+UctSyceTzedT/fK/QpY/Djk6SUtuUXE/uZZddBjt37kSVXbhwIezfv5/cPokBXdqTL53PHYBP8qNKviRqya7T1NSE9vC++OKL8Mtf/pLVJolnOj09PaMQVqsnP5fLwfLly0nZdSR3F+IWKImdyCjJT8vBSpI2vahdp1oPw4pmRKPwhL1798KhQ4dQZZuamlhju8SOs/QZHJVA1d/N8ccfDzfffDPcdNNN8JnPfGbm3//6r/961n8DvDWw6qwXahtUTXrYctSycVxzzTXGv0VhCjjmQloJm5iYEFUwopMwZcIolUpw8OBB9GBLDaCNKuHVRvKl87kD/PkeFixYAPl8HvUblYIyCZJfjUgiE0yhUEC/L4DZ1jJpSHudM5nMrJ1DXxgZGYFly5aRSL60J1/arqPaXysBk0nadaSfKUUMnJqagv7+fjh8+DCqfF1dHSubk8Q9B5KfQhw8eBC+/vWvQ2dnJ/zrv/4rdHR0wK5du2DLli0wNjYG//Iv/1LpJhqxadMmlJ/Wt6okTfKTWERE68cOPgcOHIBMJoMii9PT0+SgZKV6SHnyJQNvk1byh4aGSL+Vsusk7cGMxpP4QBKTEofkq4WH9POVVkiVDcK3VaZcJV/yO5JS8ru6ugAASIv8akbSgbcSnnxO7Nubb74Jp5xyCprkUxD97qWU/LTFUJaLqif5P/7xj6FQKMCtt946s2p+17veBe3t7fCd73wH/vIv/xLOPvtsAHhLXdcp6+rflPqOLUctG0dLSwsraK5cJEHCpQPjovVjO/rhw4fh5JNPRpHFsbExaGlpQU9GUTIjMaBHSb5URhFpsljOwSrzwZOv+oLP58xR8qempkjqGZXkS9t1opAWKdTBcL5JvjqECZvVJTrmKRLu8zuKxzlVYwrNtCFpJV/6AEPsOxscHITTTz8dbdehQPqe56OSX/We/L1798KJJ544Z3v41FNPBYC3Umwq9PT0QH9//5wBTPnmTz75ZFI5atm0QPrESOmtX26e7CNHjsCJJ56IUvLz+TxpASYduJZEEFeSSj51kpfIHuFbDXVBakFNJfnRjGMYcEg+NcsJF0kENEosLvv6+uCMM85AP1fpw/Ckx+wkVGcFSvsld5qiO1pJePIllXxK/SMjI3DiiSfC0aNHvbcnbtX1fc8S1rxKo+pJ/uLFi2Hfvn1ziNsrr7wy83eF888/HwqFAjz99NOzyj766KPQ1dUFp512GqkctWxaIJ1nOmk7ELajHzlyBLq7u1Ekn5pzWfqZSmfXSULB4ATeKkioNkkP6BKTEmcHJpfLQVtbGzQ0NKDew9jYGCkeIrp4SsKuI03yJRTS/v5+ePvb347uB9w4JCySEH6kCalCWvKnx88eqMbsOtFMNhSS39HRgdoppI4P8XgZ35iPSn6q72b79u0wPj4+M8Hs27cPtm3bBgAAq1evhubmZvjwhz8M3/jGN+ArX/kKfOQjH4H29nb44x//CD/5yU/gxBNPhNWrV8/Ud95558G5554Lt912G+TzeVi+fDk8+eSTsGPHDtiwYcPMhI8tRy2bFlS7J5+bXUdSyZeeJKPqaDUH3i5evJg1yTc2Nno/zyE+oGcymVmZW3xDwqbAseuonOv5fB5GRkZmvNImUJX8JOMckiBPEoSRugMjHXgfV/IlVGdVv/Tp0uqdLVy4UOwaGMR3dyW+U7W7K/FMo/2YMnaNjo5CR0cHqqzqa9hnI535aj6m0Ez13dx+++2zfF3btm2bIfl33nknNDc3w3vf+1648cYb4Sc/+QnccccdMDo6Cscddxx88IMfhCuuuGLOB3HDDTfAXXfdBffccw/kcjno7u6GL3zhC7BmzRpWOWrZNCCJwUcyiKscu86qVatQPth8Pj8zgGJsHUlalKSfqRTKVfKlcyKra0hlhpFQYDl2ncHBQejo6Jg5jAlD8rmZjerq6kR3TNLkdZ6cnIS9e/eidm+pKiR3zMNCesyOW0uq8TA/KpJYOEnvvnCsMSMjI3DCCSegyirxCvs9SCvtusDbpG2dvpFqkv/DH/4QVW7lypWwcuVKVNlsNgvr1q2DdevWeSlHLZsGxE83lNyalVadKRPG4OAgLFu2DJ599lln2UKhAC0tLTOpG12qvvSAGyf5nJRjNiThyY8G3nI8+RLp0qIDumqXL5KvAlzj9fsEZwdGkfzh4WFUdhd1tD0W0QlRBUxLqapJBd5i8Pjjj8PDDz8Mt9xyi9f2AMh78pMk+RKe/Ohhfth3liRhrEaLJdf/rg56w0Cdg4LdRZUWo+LPVCJZQtKoek9+AB1J2GkkBzeuqlUqlaClpQWlShYKBchms+hc+UnGOUggKbtOc3MzW8mXCLKK3rNvEq6bMCTtOiqnuwtDQ0PQ2dkJra2tqAOxVF/AIrrNL32+QZo8+f/3f/8nZkOJnyJejXadqDAjsWBXcwI2WDounFRbnEOSJL+urg5tw6ME9kdPNE/Dwiy+6yjRF5JGIPk1CGmSL51pJp4nn9J+LOlQqjM2V36SgWsSSDq7ThrsOnEl3/c14qqTlF2HGpA5ODgInZ2dkM1mURNrNEsIFdlsVjT1aRJZS7DvbHx8XKyPRk8Rlyb50gunJPoBZjEdXSBLZWqpduEnOn5RSD52505dA5siOYndl2j9Eu8taQSSX4NIQmFQE4by5PqunzvhUUg+hZAmOUlKIOkTbzETanQLXkIF0/fGAAAgAElEQVT9S0LJj06SEt8FwOw0dxSSj/Wbl0olUj+O23WklXzf5IyTvUvn5TUhTpYw5EnarhO1SkhZOCUDb6OEFDtmRxdOEtlpktwdkQB3TqDYdZSAgB0nklDydXadakYg+TWIJK0lUmmuuLlysZ1WWUuwxCnJjEUSKKf+/v5+1P1SlfyoRYGisj/00EOo9sS3Zn0r+fFnKp06EEtIFcmnWFEopz8naddJIp0kpv7+/n7o7u5G1R8lElhyGVfypfPMV1tO97jnH/tMo0o+5jcHDx6Exx9/HNWm6PhSjekeddnHMKBk/FJjPHbHLwlPfrDrBFQ9krTrSEA60wTAnwkpRclLKnBNAjq7DkZhHBgYgCuvvHLmXAobos8U88442+l/+MMf4Gtf+xoMDg46y5oCb30hCU9+FFjCq6xoFPWyq6sLjh07Rm5TtZN8bP1HjhyB4447biaA0IYoYcc+n+npadExO4pqJPkcJZ8jIvz617+eyfDnAmV3h4NKzAm+EVXy02rXqXaSX70hw/MA69evnxNN3tvbC729vaLXVdvvAPKBtxLgkPzobzDkVdl1sJO8tF1H2k4TV0iwWQX27NkDxx13HIpUK5KfyWTIFgUsIR0cHIT6+nrWhOGbfMTfmXTqQMp3l8lkSOkhu7q64OjRo6gTvKOKn2+SH/9upFVh7MJMfasLFy6EfD5vtStE+1o2m4V8Pg+dnZ3o9gWSPxfRvoYN0o+OL9jfPP/882hvehJxVEnNs9LXaGhoQCv5SZJ86b6WBALJryA2btxIOnBJAtUYJDoxMTHz3LCT8Ojo6EwwEGbbMWrXqQUlPz54qsHNdc3XX38dVq5ciTrCPJpvGPMOOMF0o6Oj0NXVxSL5EnadeOAtltxwDuWiTkgUu05XVxcMDAygykZJEFahw2J6enrO7ouklxr7zpQq3NbWBrlczknyFbnEZvuKQpp4JJGiE5sCuFAowNatW+GjH/2otVxcycd819EdFWzfpzwX6RO1k9wxp4BiTYoe8ogds5NOoVntJD/YdWocUp58aYWBup0eJfkYUHO6zwdPPidItL+/H8455xwUyaciesondhLO5/OwaNEi1IQRn4SllXyKXeeWW26B/fv3k65HtQNR7Tqcd+xbyY+PLVIWKGowsyJEiuS7yqrvghOYjG3TfffdB8PDw6g6o8RMOvCWgjfeeAN+9atfOctx4rSiiy3MYpF6knOa46gwKFc1x+zYqoUWth9IK/nxhdN8sOsEkl/jSJMn/0c/+hHk83lnOU52nXw+T9o1oWaCmQ9KfpTkYxd//f398K53vYvl16a0CavY5vN56OrqQil5ac6us3PnTjRBU6DagSh2ncWLF6NIvi6Y2ecz1dUvqbRR0zG2trY631uUXFIO21LAfkcPPvgg3HXXXag6o2RMQvjhkvzDhw/POvXehCj5wy5eo6lhMSLC0NAQdHR0IFr9FqSV/LSTfIxLQPUbiic/Oqb6zt6nC7wNSn5AVSNNhPT3v/89HDlyxFmO48nnKPmUwNsk0qVJblPGB3TsPUxOTsLxxx8vQvKjW7nYLWCKkh8f0CXy5HM8+WNjY7Bnzx7UgjeKNCj50oFr0guzOCiefKXkuw7Pi9pEOHYjbJsWLFjA2n2hHHxEQbQPY+s/dOgQHDx40FkuruRjA28pdp2DBw/C0qVL0YvjWg28Ve8W850qkk/JriOZ4lJn1wlKfkBVQyq1F2dwy+fzKLLIUfKjJB8zwUSVfGoKTQlUIuAIO7hhT06lIkqGsMjn87B48eLUKvmY+vv7+6G1tZVM8qntx3jyVV9etGgRqm/G1UtppU3Ckx8Fth/EPfk2RL8LSlxEtE2uMWlychI6OjrQaU8l5gEfOHToEHR2djoXTtw8+ZTA24MHD8Lxxx8PixYtQiUaSCLwNsndXcy8SQ2w5ij5cRHBp9Ie7DoBNYuhoSF49tln0eU5k0ahUEARiejgg70ONYhIBfhx7DpY9Pf3w3333UdqDxU7duxAq04cuw4A/h1QvwlKvmUFpeRjSX6SSj52wjh69CisWLGCRfJ923UUeeUudn0rYbrDatJi18F68uMBn9SFJeaeBwYGYNmyZegFhIRyb6sfOxYcPnwYzjrrLDh8+LC1XJzkYz35lIVB9KRoTsyPb+jmHJ/vkaPkj42NQTabBQBc31HluSTfd/8PefIDahavv/46/OY3vxG9Rj6fRykkcfKEGdi4R3RLk/z//d//Jf2Gin/6p3+CH/3oR85yuoBGyuCGmbSpExCX5FOy63ACb6+99lqUT5hrXTl27BiL5GN2CqLvAGPXiQY/Y8C958HBQXjooYfI9WPf2cGDB+HBBx90losDu/tCDbyNKsgSSv7AwAAsWbKEVC8HN998M/k7BcCPBQMDA3DKKafA0NCQtRw3u476tjE7Qqo8dvcoaZJPGbOpdiYA3BhfKBSgubkZAPAkv7m5me3J903ykxYRkkAg+QEojIyMoLd+ucAq+RxCzc1+QyH51AF9cHAQXnvtNdTCRgfMRHneeefBa6+95iyn26akDG6YtlA9udJKPpcwvvzyy3DPPfeQ68emDsSS/PgzxHzXUeKBIUPUdxAnNliSv2fPHnjuueec5bgLszfffJMlUlCy66jAW4y1hBokSm3TwMAALF68GF0nZ+d1cHAQtmzZ4iTg5VxvamoKstms8xlx8+RTlHyVVpmSbjNJkk9JlvDNb37TWY5jEY0q+ZjxiEPyqWLUc889B+vWrUO0PgTeBtQwcrmcc/IqFwsWLCDbdbCIDogUWwZWyeMsPIaGhuA973kP/O53vyP9TrULQ54oQWKSNovp6elE7DqTk5PQ2trKnjAwA3pPTw8qZ7zOAkVR8l0p5Thb19G+gwmwjL4DzPvjKvmvv/46KptQfDGKJXSjo6PQ19fnLBcHNbsOR8nnBN663vPIyIg1V38cHJvHq6++CgCASn1Yjucf84w443v8PWD945R3Rr3vsbExOHDgAKps3MJJSXuMTXBBndOSUPKpC5t8Pg87duxA8ZcQeBtQs0hCyccG93G2ETmeTQC8khcfHDBtGhoagjVr1sCLL76Iaku8Xdh7wEzgcQWWuk3pul/OwoxD8kulEjotIXf3Ajsh6Tz5mPoVyXf1t3JJPgbRd4AJouWS/P3796NJPidP/ujoKLz++utkVY5q11m4cCE5SJRj18ESUkmMjo7C4sWLvR52pgOGVHMCb6kpNFV5zjvDYvv27XDZZZexFl0Ukk9NcAGA6/+KtAPg5k61KMCOqRw7zejoKJxzzjnw0ksvkesPSn5AzUBayZ+amoK2tjaUv7PcqH+KEiPpyR8aGoLVq1fDnj17SL+jtAsLnc3Cp12HQ/K5Jy6WM2FgCCklvWhcycfadU444QSWko/NS41FtDzGisJdLPb3989s89vAteuMjo7C0qVL0SpptH5M+9Vzwr4D6cDbaN+hWumwKBQK6PgXDmlVv8Eq+eWk0MT8RsWn+D77QQdXoLEO2L62f/9+1jyLqb9QKJADb8u162CU/AsuuABeeOEFVv1ByQ+oCeRyOVElv1AowMKFC1EkKEm7DpZEcNKlDQ0NwaJFi1gTIIXkYyZwDjmjWHCiqhkWnIVTJpOBpqYmUbsOFuWcPdDR0eGciDmqOTVjRjTwFpseMtombArNqAJoAzfF3ejoKPT09JDJE/aboIxJ1BSa8X6GaVM0NaGU6jw6Ooom+RwoDzxmrIs+f2ycQzyFJjbwthwl3zXWj42NwcknnwxvvvkmuW7st/rGG2/A0qVLneU4Qa7RfozZcVLlsW3nzFP5fB7e9a53oex68zGFplyS1QAn1q9fD3V1s9dZvb290NvbW6EWmTEyMoKahE0olUpWQqgUAI5vDoO4akOx60gp+dQDujjtwkI3eGIUSexhVVH/K8Bb5G96enrO9x//DScPNNeug1VtsIsyznY3wFvPMpvNski+S/2nnj0Q7Tft7e1OSw3XrqPg+ia4GUvKIfnUIE5M2fb2dgDAkUuO91oR2IULF8Lo6Khz7OYIDZRMVpzrqRNmm5qanPaS6HeK3YWkWjijnnzO2KvGbJvYMTY2Bm9729vgwIEDcM4555DqxxLlYrEIHR0ds1R3HXQHT1FIPmaOoooOnDGbshgtd/xKIwLJryA2btwILS0tlW4GCtRArihUR7QRtnw+j34W5WbXoQbecjz5WHAD0iTyA1O9iBR1Pm4TUe23/Z77TLlKvm//ZTmnM2LKciYk6i5YVMnnLjwwu3MAMHMAmG2c4WYsUSQfE3AYBXaSp9igqIG3uixQGJKvYgSUd94ElwBjQj6fhyVLlqD6Gqf+4eFhaG9vRyv56hlhrxUVKbCefKXkczKiqcWBi+T39PSIKvkAf45/c5F8qpI/MTExy67j28/OsZWOjo5Ca2sr2dYLEFJoBlQhuIdljI6OQnt7O0vBoHr5XOBM9NHO65o0pqamZiYKil1HMl1aHEl48qn+btu3FS/LVXkw3y/2FFHO7gUF3Ow6lPqpiwgXyYgj+t4wk3Y5Fqj29nZnOkbuwm90dBROPvlkspKPJYwURTKe7tH1rXIsChMTE9DU1IQ6uKmc3ZGuri5Udh0OhoaGoL29nezJx4IarBsNvC1HybdBkfyDBw+S66f0tc7OTnJfw9RPmWc54Np1uAJiCLwNqDpwB/RSqQRtbW0sXz42zVU2mxU7PZWi5MeDuKTsOuUA0y7Kgo5DeJVnFtOeuJ2BOmFgfqPuF6secwZ0ynuOK/nKouQLnPZTLVDR3RrOO6MsbLCBvVySj1HyuSIIpV3U1I2chZPqb5iARu7Ypc6k4ATeZjIZlD89m82inhEnTiv6bWPG06hdh+PJx1i/xsfH4YQTToCjR4+y6scS0paWFueuHEfJj35LDQ0NXk8Qj9ePbRPFFhsCbwOqHuWQ0dbWVmfgnQ7YSampqQnq6+tFMhfEFQbb4MPx78efKybbTDmLAqwS3tDQgCIucd8vhjDGVV4XyS9XyXcpydTMMTq7DiVFnAvSQVycCY/6jKKElPLNKVDuGRMwybXrjI+PQ1dXFzk7kATiQaIYJZ/7nqVJPjeFJua7iNpjKCk0seCcPKwC+znkFavkt7W1sXfMsX0tm806d2C4JD962F4alHzKLs98DLwNJL/GUA7J7+rqQuXXjQMbsNPU1AStra0iWXwoW7M+lHzXToPaiuYCqwo1NzdDJpNB+bs5Sj6WAMZtIljLQZzc2K5BzeDDCeKK7l5Q04ZKx1Fg7TpUTz5FyedMkmrixlpXuOMX9TwNCig7ANFrYPox164jreQXCgW0kh8HNrC/sbERld6SI5pwU5lybSiYa0RPjKWCYi3BKPmc7DrRbwlrm6Sg3PNcXJDOuFYJBJJfYyiH5C9atIi9jYjN1KICxXyDatdRZbEDZ3zwcU36KnMEF42NjajA2KamJpTyxDkEJBqU6Zr44gScY/1wKfnR9mDAuWe1GMU80zhhxNp1sISRk6Iz3ibXb6LBiVJKvorHwZACrpKPBTVmwQTbO4y+A6n0tkko+VNTU6jTpXWBvVglv7GxEb3DQ12cRXcvKcSdS16xSn5TU5PYYVhTU1NQV1eHVvKpO0jRMZXznFzjYxIkPyj5AVUN3Xa0i3yogYGr5FMytXBIPsbfSQkIok7C8foVbG0aGhqCzs5OVN06YCYM9UwxKSXVO1agWKwA3CoVN1ND/DeuhQQlzStHtVELCQx5ohJqgLnvwQZOYG+8TZRYCq4nH7Nwam5uRi9GJUk+NcWoDi5Rg2Mro5IttViRJPkAuIPndO8MG9jf1NTEWlxSUVdXhybWXCUfs2tDsQPq6sckuGhpaRG163BJfnNzM7n/+yb5wa4TUPXQDYaujqICV7q6usQCghR54pB8KmF0KfnlHral2mQbHChKvo74YUm+Up1dE3E8PznV3+3aUo8uCLDtT1rJx9rKsCc0ckg+RUnmEGpqbARVyddlaXKpc0rJl7brYMBRhONwkTnq+MJV8hcsWIDq+9IkX1c/heRLefLjwJJ8rpKPsetQhYoosCQ/m82i7Toc6x2W5Me/a863RCH52MQKwa4TUNXQDbiuyVvlyFe5dW3QDZRUhZSakg2jkHCVfCyog4PKAY2BTgnDZC5QEwYnUIzqyXfdb1JKPoXkcwJvKUo+Z5Kk3APHk69bOLkWZ+Vk18FYlFSKO0m7DiV3erlkETO+UEg19zTq+vr6VCj5JpKP3d1NiuRjgVXy498cNd8/FZjvQmWxSyLw1tWf4/VjvyXqmK2ATSdLFU7SjkDyawwckp/L5aCtrQ2l5OuUNopqw1FJqORDQsmnqsJxZduGeOYbAFzO8qinlfpMsekYsYFrcU9+GpV8bHYdil2HWn+UVLveAWcREVfyMe9NPVPqYhqLQqGAXoxyCSklzoFDFqOEzvWdUn3/OmKDJR5cEo6NH+Es/NTvKHadJEg+diGIHU/j3xym/1DaEYdvuw43kw1WyY9/F1jrF1fJx9Yf39EOdp2AqgLHrqOUfMzAwKkfgOYfjwNDeOMH0GADb7GgbiPGJyUbCdGpl1S7DmfhRFGFKWlJVf1UcuD6TZyQYoLEos8V48tVk6SUXSd6Dy4Cztm61v0Gu6vFeaYYJG3XsZFXbuBt9LuhnhnhQvyeKSRQ0k6DBVfJVwvS+vp68ZTEFEhm18GCu2NOsetw6qfYdXRKvsTCI1o/9XRmrPAjdSCcDwSSX2MoR8nH1q+zlmBIvlLzqCnZsAqJWqFL2XW4JN9VNu6XB8BNNNGsJdRnivUvYlMBcj35FAVTqewAvK1fDJS1JAkln6qEUWwcChQlH3viLZVsqZgfqTz5UULkCu7zQRZd3zb1GZUTbMztB0mQfMqCF7MTw1XAFbC7PVyfts8TYE0WTp92nTiodh3qjjnmW6XGjk1OTs6Ux5L8KDD3/Jvf/AYee+wxUr1JIrkjOgPmYP369XPIW29vL/T29opdk0PyoyfGuQZSndJG8XdzlHxMR4wO4C4y4cOTT/HlKvJkuqbJroMl+VNTUyJKftyu47IncXLGU2wQ0aA1tbBpbW01lucQUnUAEGbCKJVKZP9olORTd5ww9eu+U0lPPgYDAwNw0kknsQ6GAviztcSUlSj6G/XeTMGNPlJoYp4ThZDqSDj291wl32fAYTmBt+W8C13qznLqokLnyfd1AqzpnbnUeUoyhjio/d/17cXnWe7Cw/YdRfszJ94PmwLYNs9UGoHkVxAbN26ElpaWRK/JIfkTExPsY6EB8FuzXGsJRmGMl/et5FO3EaOkXrXHdAiKaXcEQ/K7urqgWCyKe/IpZBEAv/sSBSbwVu04YRaLXJKPVfLjwGSaidt1XCQ/SlYpB08pUE4R5uy+YHD06FF497vfjQqwNKUAtqUeje4iud4bJ/B2enp6zmLUl2ILUJ5FKSm7jo1Qc3cKonE8VLKuyB/ludmuYRNhdNB9jw0NDayDw0ztKWfhxFn8UO06VCWfY2dyzVMU0cRUv+uZ5vN5WLp0KaneJBHsOjUGDsmP/oaSj14Ba9fBkHyuFzEKzOBDnVQzmcysgZNi13E9f27gLSVrSRzYdI/R3QjXwol6GFYcFEKKUap0hNH1fY+OjrJJviKjNkQJKdWug1mYxb8l1+Iseg3MwoxDSAcGBmDx4sXs7DouNS9K3F3vjUrmAOhnD1DB+U4VsM+UShijJNa1oObOCdG+QFXSOSKC6wCzci1WLhJLPSOD80zLCVCm2nVcMU6c8Yvapui8QxUDMfUDlHe2QRIIJL/GwPHyURRPrlcwepIodRKmDuiYRQ11IIwPZpTdAgzJL9eTLxV4i72H+CTJHXCx/nHsAWBUQqoCbznb3RhE1UuqXQfzzuJEgqKeSXnyjx07Bp2dnWy7jouQxr8L30p+fAGbBMnHAhNMziH50XtubW2FkZERY9lyMq5xdzA444tvJZ9qsVQCgmoLhSAD0M82oQJrB8S+s/icwBF+MMkYonZDzk4B9sTutCKQ/BpDuUo+p35KphZqRL6qn6rkU67BCULzGXirUy8pJF8q4Cj6rl3tKSf1mYJvJZ/jdS5HycfUH7frUJV8ymE1ALSJD1OWY9dRuwtcu47rvqPfBcYnHCdBrh0Y6nkOVHCeaRQSJD+6GGpra4NcLkeqHzMnAPy5v2QyGVRKz2j9trGCujPgQ8l37ZqNjIzM2A05c3ISSj51fLEhvnDCfhOUNkX7s8QiAuDPO+ZpRSD5NQYTyccq+ZzAW+w2XCaTcSqwusGWQ/IpnnwMoY4/F8ruiIsUlBN4y7XrYCeMqP+SMilx1E7Xc6L6L0ulEnp7XIGSQtN0TRviCxWqko/xzFKUfErgs6q/HP+4hLUkruTbgu9M4wuW8KryvoJWAcpPG+oaszmEMfqdupR8H57/trY26zXi4OyO2hZzVCWfM8+qVNWqrATJL1fJp9h1XNCJadR+g/HkU1IAx4FZeIyNjQUlPyA9SELJ59h1FFwKrCl7DzXwlhIQhCHJ5dp1bO032XVc90yx68SJACeFJpWQUkk+Rcn3TbQUolmg0mbXkfDkR79r6u4OFurbq6+vZx22hbGWYD35OqWTYl0B8G/X4ew4Uesv55liSD4n8DZ6jx0dHTA4OGgtHwXHgmp7b1QF3ETCbd9FJUg+ZUeDE9hvA+fslDgoi1FO/ZgxVR3ml1YEkl9j4Aw+UWLtGhTKJeGYYMNyFhEA7iwncTWPE5VPsetgBvRy7DqY/ONxYBQMSgrN+D1IePKpmWB0wObj5qR6Vb+1oZzAWwzx02XXodh1JEi+Aqf9ADglH7s7orPrUKwrALxv2/bdUZV8qhWFa9fhLkZV/ZRn1NHRAUNDQ+jyrrGCSpKp37UpNs32THO53CyST32mVLsONZsN1WLlQhKe/HLnhODJD6g6lKvku/yp5ZJwjoLBmVRtiG/NckmyL5LPtesocsPNrkOZMKiTEkfJl1ZtKEjCriNxMjOV5MczRnGUdhcopJSjCkcXTphUr9SYn7g6SiUTLvJEza5DDdQtV8nnqOaY8SV6j1SST7GgKkiTfNczjXryqfZHAHrGIuqpt5zYNFfwsHTsmw8l39Um3fycJqQ2T34+n4ctW7bA3r17Ye/evTA8PAxr166FK6+8Ulv+97//Pdx///3wyiuvwMTEBCxevBje//73wyc+8YlZ5QqFAtx9993w1FNPQS6Xg+7ubrj88sthzZo1rHLUspXG5OTknK0lyoCoBh/TR80dfBS4h235JHQ6T76L5Os8+dhsMxhPPie7jmoX9+ATnyk04+9NIp1ZNZB8F+KBtzaLApfkc7Pr+M6uAUA/sIiTqSUe5+B6phy7Tny8oCyqVf2m5zY1NUWyA1DfAYeEx0k+pe+r31DsOp2dnYnYdUy/iavOKhAYcwAbtk2jo6OwaNGimbZIB96q+JTOzk7rbxQw/T9O6m1924ddh9I3OXOOz5OfK4XUkvxcLgdbt26Fnp4eOP/88+GRRx4xln388cfhW9/6Flx44YWwfv16aG5uhjfffBOOHj06p+xNN90Eu3fvhquuugpWrFgBTzzxBNx8880wPT0Nl1xyCbkctWylYRrcsIFTSl00TTrlknwXTDsFPj2wPjz5mHtWAyBmQirnnqWU/CghwiwUKYeF6UD15FNUKiqkUmiWE3iLQTmefAwZpwTeqfLRvoYJEuXYdbAHjOmUfAzhjZ8BQQkSxeSkpzxTqr2nXLtOQ4P9kCdO/XG0trbCwMAAujzXrmP6jWl31zYPUg+FjO84SXvyW1pajEHoOgWeExjrOntA2pMf7fu+eUK1ILUkf+nSpbB582bIZDIwNDRkJPkDAwPw/e9/Hz74wQ/CP//zP8/8+8qVK+eU3b59O+zcuROuu+46uPjii2fKHTp0CDZt2gQXXXQR1NfXo8tR6kwLTAoDdkDhWAh8k/yklXzOSXw+LUrcw7AUJPPkR5V8F1mMql7cAR3ryed+E1hVGZN/nAOKXYea1g/AT5YjG6gEk5qX3mSDcJGnqA/Zlb0r7sl39QWKJ1+3c+EivJyFU7kkn2o3lAi8xbaHc0BiuUq+Gu9MJJ/jyY9+RxxPPvbsAXWNbDZrFEI4O1oAc8dP247HxMTErNSTWM9/FNTvVHJ3N61IrSc/foKoCY888giMjY3B5Zdf7iz7zDPPQDabhQsvvHDWv1966aVw9OhR2LVrF6kctWwc+Xwe9T/pTA0U1YBqywCgnZ7ogq5+CU9+fECnkmRKmzjZdSiTJPc4b+kgLt/ZdaLvjUvyfRF3Uz2UPPmYwFtqzuv4t2SbWDmHMFEJZnxBzQnsdwXSxxdOWBtdtH6qXcfU3zjZe3TP1HZYko9FAYaQYhfUPpR813dKXaT4UvIp9VOyNCWh5GezWaOSbzqPhkrCbf0t3tckTryNf6ccLuUzk1UlkFolH4uXXnoJ2traoL+/H2688Ubo6+uDtrY2uOCCC+Caa66ZtVLs6+uD7u7uOQNgT0/PzN/PPPNMdDlKnTpcc801qHu0xSJQQR3c4r/BHNBDDbyl5JnlWFemp6dJHTX+jDCBt9Q8+VFwsutQwBmkqOnSqAOohCefW1YCJkU7bYG3tomVc3BOJVRnDEmOLkYlsuvE7TqUZ+r6Vm0kVvd+knim8awlLkIdV7zr6+uddrdoX7F9p1RV3vYbbApN13fECbyNnzsilV0natcxKfmcxagO6pkq4SKK+D1wd3d9BYibILFjmySqnuQPDAzA+Pg4/L//9//giiuugM985jOwe/duuOeee6Cvrw+++c1vzpCcXC4Hy5Ytm1OHimhXp/Zhy1HLxrFp0ybUSWnUidaGcgdElxLGCbKipKDiDG7lqovYg5UobYrCtVNgit6XVJ2pCwNORhHqwoxyDUxZ6vOjZoGhEnAAmn/cB8l3EdJy7UAuxEk15+AmCnnCnKhdjnUFwG374JB8k3Dig+Rzdl+lA2/ju9EjQ6oAACAASURBVLu28r4XTqZrRMtjSH45Sn42m3WeF8PJYhddhLuU/HJ3XwDs43D8++XsFLjU/+h4ytkxnw+oepJfKpWgWCzC3//938MVV1wBAABnn302NDQ0wB133AEvvPACnHvuuRVupR4tLS2JH4fsg+S7iAdVwRgbG5uj9JiybnBJPmWhpAu8pdpdqPnHbZ5W6cHHRwowql0HM+CWk4q1HE++6duj+M1NKjjFroPZNfNB8ik2CBeopwhzPPk66xp2/HL1S46CWSwWZ/KbA9hJL6d+E6GbmJjQiiPx78K1OC1XyedaY1y7L9HFH3XHiZoIQLXJRkgpJJ+zox29D5tfXtceTP0KagzKZrPa5CSm+jkk3/acfATeYs4doaR6TVP8pC9U/bJFKearVq2a9e+rV68GAIA9e/bMKqtT1tW/qbqw5ahl0wDqNmX8NxKe/PiJcbaDhrjb9eUo+Q0N9tNcAcq361Ry8OF4r+PApBmNAmMRKyejEOb56yYI27dEUbZNZV2Eq9wtexd0nnyKDYKDTCaDVmFdz0e3iKD0f+oBY6p+rO8XgK7kc0k+9r1xxkdKCk2O3ZCy+wLAU/J9nrcSL+8a7zhKe/Q+XDnsuSQ/fu6F6ZnqhDGOZ55igZKwWEaDo33v+ANUh5Wn6km+8r7HoR5+9KPu6emB/v7+OR92X18fAACcfPLJpHLUsmmAbvChDNIcTz5GyY8qUrZtRI4qRLUd6AYfW/2lUqksuw7GukIl4dRg5nJ3CqgTAEfJp/j4uRMG1U9tAsfqoqDGLA4hdYFi1/FF8qlkgjpxugJvqTuR5YoItmcaXxBg6jeN2dj3JqG0SwfexvsaVcnn3rPtmVJ2d7me/HJIvqsfxOGKc6BmB9Kh0iR/bGwMnUKTI3b5EMikUfUk/33vex8AADz//POz/n379u0AAHD66afP/Nv5558PhUIBnn766VllH330Uejq6oLTTjuNVI5aNg3gpNAE+DPxkIj6j3vybQMcR3XSEQnbyb3USZKzcKKU5dh1KITUx0CFzYalgBlw4/echF3HpRjGCZoJU1NTLLtOFJhYEGrsBCXw1ifJt5FeH75cX4G3XGsJlqz42omkXEOChMcDb6lzAmWnQN0DdrzmtomyAyOR4hKbw95UPxW278K0I08dU239Tbfj5NszT/Hkc56przFSEqlu3fbt22F8fHzmY9+3bx9s27YNAN6y4zQ3N8OqVavgL/7iL+C+++6DUqkEp59+OuzevRvuu+8+eM973gNnnXXWTH3nnXcenHvuuXDbbbdBPp+H5cuXw5NPPgk7duyADRs2zEx+2HLUsmmAydOKVQAksgrESb5NyecEcdkGdN37if+7q35OCjddW2ztp35HFJJfiYGKs3BKguT7yjbjY3eEcz6DC/F4gySUfIqap/oC5boYwqjq46h51Dz2tmvolHzfqnN8POKScOyYyl1EuN5ZOZ58zpxge2/x8hwlv66uzjrPlqvkU+FaOFH7gekavpR8zphKOQzLFINkE1ICyS8Tt99+Oxw6dGjmv7dt2zZD8u+8884Zr9X1118Pmzdvhocffhg2b94MXV1d8JGPfATWrl07p84bbrgB7rrrLrjnnnsgl8tBd3c3fOELX4A1a9awylHLVhrSOdc5E0Y88Nal5HO8jqYBXZfaC2B2x6YE9mHbFAVGydeRfNvgoyMTJlRiy9GlQJsCb3168nWwfauUAZ0TtBqHLRe6L1AVUu41bARN53U2HTKkA0XJd+04mTz/lP5PtXy56i/Xk88l4a6TgbF2HY4wo/PkY78h1X6O8ENZjPqOl4nObZzAWwywaUk5i10dXHnyKSSfc89xks+p3zYGB5JfJn74wx+iyjU1NcHVV18NV199tbNsNpuFdevWwbp167yUo5atNEydF0uIGhsbYXR01Ph3DskvFArQ2dk589+uk/h0nlaqXcenv5uzXUypn2vXwZJ8XwOVT0KqU22oB4xxVHAqQTPBtHBKW6BWpe068f7MeW+uncg4CaS+A8xOXvRdc1JocrPr6OCL5GOVdkz95fjTXdfQje9cYQZ7cJNrLOIKJ2oBWmkln5NAQwdXdp24XYe6Y+5CsOvMA09+AA0+lHxOdgqqki9t16EovdTtelf9cUIicRiWTt2ynZCZtoGKOslQbCiqvA62a+jSPZrqMU3yaTs9MQm7ju0a8WfKJfkUzzwVVPJBsShg609j4C0lNSF1TqCQfM4zpQoz8W+Ik2WOAptlVbWn3L7p2rUsxy4Z/U0llfy4rcz3PJvGuTOOQPJrDOXmH+cMbtTtXKpdB6PaSPq7qfccnzBcgw8nu47uFE6balOO6mT673JA9V9STh0FMD9T23OiBAOanqkt4LsSSINdB3uQlAlU1Zb6nVLtNC4l30d2nSTsOtKBt9TsOrZ+We6c4/qN7pn6ztQSbwt1keJC/De+7Tq6Awxtdp34PFhXVydijVFt4tZf7Z78QPJrDKYJw6cnnzo4xAdc3yk0dUoe1d/tc6dAR2wksuvEbRDYLAdYSFpPqPesy9LC2U532Vew1zDVz7URUUB5L7ZgQI5HVQeX11nnyaeA6u+WtuvYxpZisejFP+6T5Jeb7rHSSr5pfOfsvmItUBK7rxRwxuyRkZE5h7ZRFviuxbFpx8nXvCP9TE27L9XuyQ8kv8bgw67jW7WJDw42Tz7HK6hTeiiKoe/AW6p6aRrcXOpW9BqUVGZpAHW7u1gszgqi5viEXb+jLM449fsAJVOWC5y+rIPrmZbryXftjiRh14m+a5tiGI9BUPX73ImMl3c9U90Jz642xQNvfe/uUpV8X3Yd6THbFzhj9ujoKCxcuHDmv30lGbD9hjNGmuAjmYEN89Wuk+7WzXOsX79+DuHu7e2F3t5esWuWGzXv8uRz6o9bMygTmKu8+o1ukvEVGMtRhahKvokwTkxMaP+m8zr79F7rSIx04K0NHCVfd88Uku9S8qn1+4Dqaz4Ihm3xSvlefO5q6eBa2JQ7EdfX18PY2JiX+ovF4pxT0JOwlnAsUC7hRJH8+vp6stqJ2X2JWzlM79gXyfdt15EmpOWSfM5OJLVNjY2NkMvljL+hWOcqtXBy2XXKERCSQCD5FcTGjRuhpaUl0WvqyJMrf28UHP+lS2nTbXdTFAZO4B1VyadG/btUIcokbLKuqIlGl26QkvKNM3hSJjEO+afGIcSVfNfk4WN3xDbRmxYptnftY5GkFFhsZiUbOORMhzR48qPvmurJ9+mP9pldx0ZIo2MCh+S7fhNfVFNJPtWuY4MuFXISKTQ5IoIvcEl+3K5DFSlsoNp1qJB+prb6dbtdAPILDx8Idp0aA8ffHQXmMCyOl48SEMTZ+pVW8imTGFW9tFk/bJlgokTP9t44gyfFs+lrwrBBl/mGU7+LkMZ9uVQlzPfEqqvfV2Cv6bv2SRiT8OQDlBcUzgmMNcFXdh3XApOiOuvgeqaURXgSJJ/6nfqwWEoG3rrgy65D2THntMlnDFISSj5V+KkGu04g+TWGcgcfjCefowrHlfwk7DpYssL1d5tA8ZsC8DPBxL3OPu06pklYp+hxvwmqXcd0sJkOpnv2qeSbAm99voc4OJ55E5JS8n3kyZfMWETNrmMDl+TH+wLFWiKxO0KBrv+76qeQfM74zvGPUxZOnDGPal2hjhUjIyNoT74vu45Pkl8pJZ/S19KIQPJrDJVQ8l3QefLTZNfh+rtNoExgAOZ3Rkkrx81yYAsg1NkOdM+JMxBKK/lcko9dONkmDEogGpXA+vT8J6Xkl+vJl05L6lvJp6bQBJhLAKU9+T6/o3Kz97jAsUCZCOl8VvLjJN/2jHzt7rr4ArV+0zP1ESPG2TEPJD8gdZAm+T6UfNc2os4mYuvQPuw6vjy53PLUbUSKXcdGeG3BbroBXfdMORMeJ4UmRclPIvDWh12HarWQVmBtfcHUB5Pw5FNJPoUAcDzzJnCsJaY2UUg+x67j6zsqlUqknQgAupLvK/CWkkKz2j351WbXMT1T07v2NS9T+UjaEEh+DYKyLRhX2V2eWa6Sj1WeuAoDVnU2pRilbv3awFHyyyX5HP84NW2d6dvgKvmU38TvF1M/556x5Mlm16Eo+VTSK+3J5/RNKsmX8ORH4crGoyvvq//rlHzfSrsPuw7nNxRIK/ncOAcs6fVt4aSmveUIJ+Pj43PSDPtUqE0ihc/xiCKcjI+Pk+cE6u5uIPkBVY/4pCSRrq7c7DouUE5EpCwIor+hevIpg4/NrmOblCjZdcr1p6tr6Nrjw8LlApXkUycM9RtpJR9LPEzPx0VuyvX9clQtX3Ydk/pOVfKpyjlmJw/b/3W2Mt9xDpWw63BOEa40yacsYDOZzKx7xNh1qCoyNXGArn6bdS3+G0pZDEw7f5L2Qds1pqamyBbOYNcJqDlQV8O+SL7P7TGK/9JXzmUbqEq+jTDalPxyD8OiKhg2JZ/ipQTgpdD0pdqYvj3q2QPUwFtdm0xkgrO1TIVJyadOeJTUhJydAg7J910eS3I544sOlADuJOw6VP+zK21zuYG3mN0X3a4ZdoHJzYhmK6/7tm0xURwRISoMuPK/6+rnnIdQSZLv4x0Eu07AvAZVdeZ68imHYfkg+aaJT6f6206w5LRJdw0bONYSnZLvU4Gl+C+5iwhJks+ZJH158ql2HV/PlArqpF2pZ0oNvDUtVHztFNjgi+QnoeT78lJz4CPw1nbPOhGB8pxcz4ej5FMW1KbdXdviiUJ6fdhuAfyKDjY7oO45+ST5QckPmLegKvkA9K3beOdNKiDIZNfxsYhwlfeVXcdGnuK+XOphWK76dXYdU+AtZXAGMN9zJpPRTmK+lHyXUo21lvgMvKV8p9KefNs3wblnCsnnbKfrYLoH22LaF1HhZteJw/ac4kHoHJIv7cl3gTKm+jxgjJKMwUXyKXZDU1+jWu9s900h7hzPv8muI+3Jp/ZnW/0+xK60IZD8GoOJgJtULKqSz4G0XYeStYRqpeG0yZddh6Lkc+w6FMILYFedqe23nQ2g+zY4trJyg41t3ym1/apN1WDX8XnPlNOfOYG9OpjeMccWR4XOk+87u87Y2JiXE28rqeRTFu268ZR6yjrAW+8BaztyEXjbnGA6S8SHCu7y2WMXHr7EtKSUfKwQwolDCJ78gHmNeES+BOIDru/tsXI9+QB2LyJ1azMpkh9X8qkLJ2rgrSmFpk+7ju29JW3X4Xjype06Pj2w1OBEjpIfXxjYno8vpZ26O5KEBcqnkh8n+dy0pNSML1TYdnzLPfHWZbE0fUum35S7O61getem5BDU78L23iph1zHdw/T0NPmZUsdsX3bDavfkp7t18xzr16+fs7Lu7e2F3t7eCrVoLjjKNhVxhcE2QPv05FNIPrV+G3wehoUdfCSy6+ieqe4anEUKVRX2GXhLUfJthJRKwqvBruOyA5gWZj7OpOAszEzXoD5TrqIab69JQfap5BcKhbLtOjZwCJoOrrNNysmT7wLVyuHzYCXdd8ax6+hg+w2V5Puw65i+bddOh+77mpqamrV4VaB48tXz1wmXnDkhkPwAKzZu3AgtLS2VboYVlVDyXfChAJiIB5fkU9rvK/DWRogoNghfJJ8a5+AivLqFjem9cQJvqW3SKfmFQkFb1kZ4Kb9JKvBWN7FyPPm6d0YhmVy7jo9sOT6fqboP3TegO72Wk10Hu8C0LUa5imr8OakDCX2Qf9M1qGVdSn45h0Jy22T79nzYuHyR/EqJaaov6K7tw5NPPack2ibTb9JO8sv6yg8ePIgu+9vf/racSwV4AlWRSELJB6ATdwp8KKQ2UH9DVZ44JD9+DYnsOuXadXxaP0wk3/S9c3YXfByGRd0u9mktMREbCunlKPm+SD4nDkH3/k334JPkUywyvgNvKW2RJnNcUD35PqwlPkFVhX3ZuFyec0mSb9ql0tmHTHMgd5GPJfm+x5d5T/I///nPw2OPPWYtUywW4bbbboNvfOMb5VwqoEJIQsmXBoU8mRY1tkWIbcLQkQyfdh1fhNTH4EY98ZajOlGUfBchpd5z/L2ZFjWu9lMmMeqOE2dC8uVp9REYy/HMUttEtRBw7TRYi5I0yecQGxtMfd9noC6FuJu+O9eYLa3kU1RnXwsnmyefcvYI166DfWc2Jd9X/zcp+dTxq9rtOmV95RMTE/Cd73wH/vM//xNGRkbm/P1Pf/oTfP7zn4eHH34Yjj/++HIuFVAhUG0QaQRlRe/Tk28imdTgXg5J9qHkUwNvfVpLTAsbm5JPyZXNIYw6kj8+Pq4ta1O1fQTeura7TfVTvtP5YNeheJ05O2YmUO45CZJv++bSqOSXSqU535IpfS4H0hZR02989TUTXIt8ipKvK2vLw+/DYsVZkPoSKXzMCWlEWST/29/+NvT09MBTTz0Fn/vc5+B3v/vdzN/uv/9+uP7662H//v1w6aWXwq233lp2YwPkYBrEqDaINMJk15H25FMWEq6sCBzVOa7kcwY37CICwLyQ4CgkVOuHT9XZ1KY48bAp+VzVWbcYTULJxy7ObM/HpBRSA299ZtehfBdJ2HVM9iEqmaM8U992HVM8jnTKTc5iywTbORySkLbrSGfXcQlL2Pp9j1+mZ0qx68xXJb+s1p144omwceNGuOuuu+CBBx6Ar3zlK3DZZZfBnj174OWXX4a2tjb47Gc/CxdccIGv9gYkjGKxCG1tbbP+TXWUtK9gFUwKqYmA6zotJ4Umh5DqBknb1i928OF6EalKvsmuQ22/NMnnkPA4bEq+jfD6IKSmxTfnPVMCpuvr6627F+Uq+Zy0pDZiQ1HyOeqiCVQlX7J+CbsO9YRZH1DPCTvvuIQoHaGXFq8o4xdncWnz5Puw6yhCrXsH0nYdqthFEfcAeHPCvCf5AG894KuvvhpWr14N3/jGN+AXv/gFAACcc845sH79eli0aFHZjQxIBrrsCDoyoSZiKsn3mX2BAkpn59wXlRxQj7a3DbimtJhx1ZmzZc/JruMr8JaqCvsi+ZSJlePJp74HUzYemxLGOfTMh5LvI/sNZ5K3QfedUj35roOVdKCS8ErZdTjP1PRdVJOST4HP8wIoC0zu4o8aeK+DbXz00T9NYppr97hcT75vsasaSL6XyJN8Pg+PPPII5PN5KJVKUCqVoL+/H/bt2+ej+oAEYPqQTQGN1AHdprZJqycm8oQl4Jz6AWhWC9vgY1ocUQipT4UEgBZ8x7FZUFVh6oDOuec4uJ58SptsnnyTkk9ZmKn7wJ5U7Go/NUA8Ds7CzAaK6mwj+dQxytT3y+3H0Xp0bdKlxOTsjthAGU99ju1J7Bbo4HPXmhp4y7Hr+FgI+Yp/McH0TDmLCMqcwAm89XXPlULZJP+ll16Cz33uc/DEE0/A29/+drj11lvh8ssvh6NHj8K//du/wZ133lnR47EDZsOkpJs+ZJOSzyH50iqMLXC1XK+zDaaJkrKQsD0f0zujPFPu6aySgbcu1Ymi5OsC9TiqDWVibWxsJKvmrkkGG3irCzQGoAVjR69huo/4t+eahKmLuThciwgqIaWcJMpRtU3wlULT5B0H0I8LxWJxTjY0CbsOdteMYhFxgUryfebs5+xa62D69pKw61Ceh7SqbVPyfc1TlBgnVb8PsSttKKt1P/7xj+GBBx6AUqkEf/M3fwOf/OQnoaGhAXp6emD16tWwceNGeOihh+CFF16ADRs2QE9Pj6dmB/gGRcnnHpPuY/AxQXV0U4fDqls+U2hS7DoclYpKnqQHN5MizAloop54qwPHpkC165jIMdeuEz/R0abk6w7S40xIlP7MIeGUhRPVX++CjqDZLBM+CamPFJrUhc3Y2Nicb8iXxUKBQvJ9kqBKKfmcPPwmSNt1fO2Yc+yMlG+JY+Gk7r5SdpxsbeJYINOEspT8//mf/4FFixbBjTfeCFdfffWsmz3rrLPgu9/9LqxZswb6+vpgw4YNZTc2QA5J2HUklXzqBGAj4LpOaxsgfXidbc/HdG2fSj5nm1K3UMHaPgB4BzdRM7VwCCnFrsMh+ZRJ0tQeW+AtVWmzKfm6+jlKvq5NptNWqalkbUgbIdXdG2d3xFSXjuS7BAofdh3bM/W1cEpiNxhg7nP1bdehZNeRFH5cMFnLfFi/ODsFnGQMVCV/PgbelkXyL7zwQvjud78LZ599tvbvLS0tsGHDBrjuuuuqPtf6fIepc5lsGdSBRFqF4Wzl6iZJzoDuw67DeT6VVLV190w98ZajClHvmTohURdOtmdK9adTtpe5Keh092wLII7Dtogw7b6Y2mSKKzCBG3hLUfJ92nWwz9RGwqltGh8fJz9T6qFQJoWUsovHAXWM5MQD6L5vk/BjyxlvQhKefFObqKTdVL8vTz7HrkP15FMWTtIWpUqhrNZdf/31qHJr1qyBd77zneVcKkAYtokYS0htg6q0CuOrfht5MikJnMGHEtDow5NvCx70tTVrUoQ5Qa7UwFsdOFu/lPo5Fi7qwolqK+Mo+ZSdOdczpeQep8a/+FKdfZJ8026EL1HDpo7qrkt9RjbPv+nv81nJV/cRvT+XnVG3qLLFvmFJPkeVt3nydeO/Wpxhv3vOmKoD165TbnYdlzBDVfJ9xpxIIbElyJIlS5K6VNVg/fr1cwbQ3t5e6O3tTbwtPvzjtk6eBMn3NalSSb6NMPogTyb4eqY2BXZsbEz7GxMhpdh1XIOnieSb2kSpn9MmCqjWFdUmrEJqsutwPfkU/7gvf7eJXJgIEocwmgJvdWlJuSSfsotHBdWuQ70H2ztT9xD/zkwkn6rkKyUcu5OQhCdfdw0XIaXsnJgW4T6VfMpvlOUwm82WXb8Puw5XpPAhpumSNwAkZxOTQlkk/9ChQ6TyS5cuLedy8w4bN27UBs9VAjZ1i5JFxdTJk/DkSyr5tgHdRp6wkxLn+VTymZoIKcXrTPWnq9/4UvLLzQQDYN694tRPeaZcJV/3G192Har1g6Pk+/Dkm96Br/oB9KSXc04ItU0ckm96Z6Yxz0ffB/jz+IX9ZqjjHSehg27MGB8fn5OxiNMe228oO06m3SNOmyh931W/D7sOR6SgknysSBT9Tc2S/E9/+tOkjvTzn/+8nMsFCMLmyfeh2nAGxPikaPM/+rTrcBQGH5lgKqXk2+qnElKqXYcTeOvLk09tEwWcrV9fnvy0Bd6awCGk1NguikI6OTk3uxGnfnWN+HPi2I1sv9HNvdRnalPSKcSdQrQU1Lca/459WPW40AlYnNOlTaDMs6bx12YRsXnydaDsNqv6qcKMDpOTk9rdA86YTbFApXGelUZZJP+ss87SDjTT09Nw5MgROHz4MJRKJTjjjDPICkmAf6iDynSgKAy2wd80+FBXw6o8xhupykvbdWz1m3y5PtLomSA96VGVfJ+Btz5SaNpsKKY2mWIXTOqZSeSwERVqnEMSdh2dfUUH1yTvQ5mnxo7YoOvPFFKAqd9EPOKKIaf+JBZOtjEV25+pZ2So+k3vgbqANYG6e2JS8qmZrEygBt5SbWXU05ltGcJ08GXXmZiYgLa2tjn/7hoffXjyOSRfenEpibKY93/8x39Y/97f3w+33norZDIZ+OpXv1rOpQI8wKba2Eg+Vl3EbM1ioTpWtL4kPP8uu44O1CAralkfKTQ5oKrClAlMlaemoPSZQpNqg6BmXdJ9F7ZJ2NTXKHYdrpI/NDSk/U0cvpV8SQJr+o3PwFvbMx0ZGZn1b5x867Y2+fLkc5R8XVpl3enPrjmBakWjkC31ninPw6Tk6+w6nDHbRGJ17bTZynyJaRy7DlVEoJR11W8i+ZQ4B2r672q365R94q0N3d3d8KUvfQn27dsH9957r+SlAhCwkXwKiTUN/pitWSx07UlCyeeQJ9uAXs2efJdqG3/X1IBJ7oAu6ck3gXMSsg62LEcUJd+UftI2IZlIJmWit70zaqYJKgHjeOYpNgjfSn78maZRyXfNCaZvD0ueXGM2ZbFlem++/OkANLsOR+GlKvnUeZaq5FOseqpNVKU9k8nMsRBRrTcA9sBYiie/1pR8UZIPANDR0QGnn346PPnkk9KXCnDAlxKehJKvG0wqSfI59fsipLadAt0z5eSH1kFateH4L30p+VQV2RfJt0HXJtOCulgskr9TCiE1wTXJUwJvTe3xmV3HZNeRVvKpIoWtfoon3+fCyabkUyxQNuGHQmJN16Cq5jaY7DpUJd9WP0V1Nqn+vjz5lPFU1U/dKTT1Bel51mTX4Sj5geQjMDg4mNSlAgzg2HV0sHUq6tYsAP4USJ+LCBNsgbfUjl6p7DqcAD8dbJOkyeuqe5em78JWP2dhQClLJUM+j7Y3wUSefB6GJblw4ligJJV/dY1K2XWklXyTXYf6TKm7u1TVmark20h+vLzvs1l0/c2m5HOy32CfKWd8p6rOSZF8rGDnm+Rjv1NX/dVs1xGPht2zZw+8+OKL5PSZ+XwetmzZAnv37oW9e/fC8PAwrF27Fq688krr77Zu3Qrf+973oLm5Ge6///45fy8UCnD33XfDU089BblcDrq7u+Hyyy+HNWvWsMpRy1YSHJKvG6xMgXou1cakOmMPk0lCyfc9+PggTzZPPlZp48DXNqXNrsPxj1dKyTdlduGkRjRdI37PplM1bUq+7ZlSUmiaTsiUVvJNcC1ede/BdOKtL7sORRTg9EsbSVandkfv2bddB/ucuCk0TeQMm13Hd5yWSclftGgRqiy3TSaSz3mmFCVfF3jLmccBaGmDfYpplMUiN/C2Zkn+5s2bjX8bGxuD/fv3w/PPPw/T09PwV3/1V6S6c7kcbN26FXp6euD888+HRx55xPmbgYEB2LRpE3R1dUE+n9eWuemmm2D37t1w1VVXwYoVK+CJJ56Am2++Gaanp+GSSy4hl6OWrSR8eeZN5FVatUlCyffhBef8RnrrlwPbMzWRWkpaP19bvyb4VvJNyrmvUw8pJLBUKqVu4UTdQTKV52TXUX0hfn+6ezZldmdjQQAAIABJREFUFPG1UwCgJxO+lXz1LqLfDGfhRBVOqEo+NUjU1CYdWfSpagPo35st8JaqtFPGbE7sm4/sOjZrouuZmgQ7SSXfthjCJg3h1F8tKJvkKzXBhKamJvjYxz4GH/3oR0l1L126dKb+oaEhFMn//ve/D2eddRa0trbC008/Pefv27dvh507d8J1110HF198MQAArFy5Eg4dOgSbNm2Ciy66COrr69HlKHWmAS4lH/shl3PwCfY3VLuOT98cVcE0gWrXMZWlBpb5Ivm+tiltCo8kyXcdYe7j4Cb13ih93DReUk+A1cEXyTdZDmzfqXSQKMYOGP+77pk2NTVpSb5Pu46OTHCz61BJPuWARRfJl0yhyfHkx6/BWaTYoPsNNfDW1zxoeqY+E1zo5ihTDAKAvzgHk6Dha/cFwJzIQFKsSyPKYgKf//znzRU3NEBXVxeceuqp5ANGAOin1f3617+Gl156CW677Ta46667tGWeeeYZyGazcOGFF87690svvRRuueUW2LVrF5x55pnocpQ60wCOwqAjJLbBnzr4UMhcEkq+CUnYdXQp6DhnG/jyj/vcHcEu5KLA2ri42Y0oY4zrOzVNihT4sFnZnqnpu9Bl2DD1Zdsz86Xkq2wc8UUYhvDGoXumTU1N5HSPJiSh5LtIePRQIdM1lMIbf36cw7AoXmeukm8SBeI2Ua61xAQdsbYF3lJFFsrCgPNMOSSfquT7Ivk+7ToUJT+QfAI+8IEP+GpHWRgcHIQ77rgDrrrqKliyZImxXF9fH3R3d8958T09PTN/P/PMM9HlKHXqYLIUxbFgwQIvHmuX/xLbeX36LylWDt8kX/0GQ0x8DW42lWp0dHTOv7tONzRNMr48+bbAW+y/cwJvTdBNwrb6fQ3OnNSqVJi+b0q2JNszNdWv8+RzCKmvFJpqfImrpxw7oMmuwyH5Os+/qa9RRQoTbOMTZSGhysbrcpFwrDpPKavAUfLj79iXcKVAyZNva78PC1QSSn5jY+McHmLauQDwR5I5nnzqeTS658RpP0f9TxPEA2+TwO233w7d3d3woQ99yFoul8vBsmXL5vy7Onktl8uRylHLxnHNNddY26uACTjGwFd2He7WrKSSb+q8LqVqYmICRUx8DQ62FJ0UfyqA/TAZippngi+STAmk47SJowpR04xyUlaa4DNFZBw2JZ9iLeESUmrgrS3+JU40fIkIHLuO6p/xv/sav0yg7l5Qd5yoiwjTNbinoFNIPseTz/HMY+06toWlL08+Z54tN4WmLclAfX39nJOcOdewfadcsS4Oyo6TDZQd+TSi6kn+tm3b4Le//S185zvf8ZLhIkls2rQJ5Z/0lZ+7oaEBTjrpJO3fqIG3HAWDSvKpSr6vScZUP0fJxw5uVFXL9hubmhdf1HBT0FECb03/7ivOwefWrwnUxRkX5Y5htt+7vgtMWRuogavUHRiuXUen5JtIvoswUki+9DOl7hTqiArnMCyKks9VtbFKPkdYsu04LViwYM4uj8muwx2zsQsPG8mnzgmmDGC6vjA+Pm4l+T52X007YJwgV6qS7ytPvq/zaKRBGnE+/elPsy+UyWTgjjvuYP9eh0KhAD/4wQ/gsssug66urpljxNULGRkZgYaGhpmYgLa2Nq2yrv5Nqe/YctSycbS0tJCCpMrFkiVLYO3atdq/mToX1hcN4NeT7yvw1ldgls9tSgpZtD1TE6EzXYPqE7YNuD4GOOmFE2fr1wSfkxIVvsQL0z34suv4VvJ19VNFBF1fMCWLwPSFONmj2A44B6pR7TQuuw61fh9KfjRmIF4/hYSblHxfdiDVprht0kR6Kc8n2iascMK16+iUfNNvTEo+N7uODlQln1q/6Z514wvHesMZL9IEUgsPHTok1Q4WhoeHYXBwEH72s5/Bz372szl/X7t2Lbz3ve+FL3/5ywDwlk/+ySefnPPB9/X1AQDAySefTCpHLZtmmLbhKIG3rgFX2q6j89lyJrFyyypQ7DqcCckEX+oiV6XG5o3nkHxd3ngqWeTA50nIlYKNkEof3AQw97uYnJzUJmWwjS++drV04PQFyu6IjTxxgo197Gq5VG3dnGBS8jnCD2XMM80JvupX18AehkW1G6k2Se6Ym1JoUki+y5MvLcxIxjiZxhaXaEVJDZ02kFr44IMPSrWDhUWLFsFNN900599/8pOfwEsvvQRf/epXob29febfzz//fNi6dSs8/fTTcNFFF838+6OPPgpdXV1w2mmnkcpRy6YZlM7F8V/W19eTfLBUkk9dRKj7wG7d+Qq85Sj51IHEdA3TwSecTAquICiMYukraJWqXnKQROCtCb62hU3PydcEZiOM6vuO1kklpK7xRafmUTJN+RxfTLsjtr6mI/lTU1PWdIblknzb7ovpN7q+wFG1TWMeheT7zN5juoZNyfeVXUfXx30q+SZblm5OsJF8znhH2Sn0uTNqOgjPtNNBHe/mJclPGtu3b4fx8fGZtFn79u2Dbdu2AQDA6tWrobm5Gc4+++w5v/vVr34FdXV1c/523nnnwbnnngu33XYb5PN5WL58OTz55JOwY8cO2LBhw0zHwZajlk0zdJ3XlCs7rUo+Z5JJi13HhxLp+o1JXeRsLZuIp7oGhuT7UsGTyq5jSqNXLUq+jSTrynK+O5eqGq2T+t64/m6sRYZL8nV2FN0YaesXqv3x6/uy63BUZ9NvdEHonHdGjaPSkWouyaekDS2VStryJuGK0yZTWV87Wr6UfJ+efOndV0q2L8rYGP1NIPll4vbbb59lEdq2bdsMyb/zzjtZ+fdvuOEGuOuuu+Cee+6BXC4H3d3d8IUvfAHWrFnDKkctm1boOq9pguQEBNlUD8rWLGcS9hV4q9u6pk6SPj2zJlBIvq9FkIJOtTHB14CelF1n4cKFXq5BVeZ9efIpapVvJd80vpiIhy8bBOU+fPnTAfTvbGJiwjhn+SLhPu06NiU/TgJNhJSr5GNVXo6w5MooRBm/4nn7AfyNqRSvOfc3HE++D5IPgD8dNwm4xsaa8eR/6UtfglWrVsHf/u3fzvlbPp+HhoYG4wqQgx/+8Ies31177bVw7bXXav+WzWZh3bp1sG7dOmsd2HLUsmmFaRKmENLJSfNpi5zAW0omBY6SpBt8qLl4XYsI7ADK2Zo1wZeFgHpEOgAte4G0Xacckh/3j1N3YNIIaZLvsn7oVFiqXYdK6CjBribF1lY/5TlxyBNVpLD1BdP4Qj0MS9cmDqG2qc6mlLvYhaKrfl8knGMrK3fM43rysXYdzu6LDdQ5oRLj6XxW8vGpEADgxRdfhP7+fu3f1q5dCz/4wQ+8NCogeeg6l80/7uuQDl92HWkl35cdiPNMqQOJbSGhO93QNmFQVWeKkp9Wkq8jE6bc0UnYdVRQZrmQtutQVVXqDgyHPPmaiH3Y6TjWOCoh5VigKCKFQlwMsZ39QFXyKdl1ON+Ea2FDUfKp78wHieXYgSYn5547AaBfyHHtRqa5ohK7u1S4+nE1B96SSL4NpVKpavKGBsyFSSWhKvkc/6VpUqIo+RzVJj6gm2IQTO3B1I8l+RwLlAmU98YdqEzPSTqYWQdKoB4G1MWZ9Payr4mvkko+xWphu1/Td2f6lrCZnlyw7RRUg5JvGrM5dh0KuHMCxZPva85R1/Ch5FMXNhTYSLhJyadkB/O9E0FdOJm+U2o/pvDR+Rx4643kB1Q3dJ3XZ5Aox65DIaRcO030Nzbrii8LAfU4b65dB6vk2+7ZBNuCXncNE3wRZN9WGtOuFva9+RY7fGUJspHwOGzBd7b6KQqgjcxRD6zhvGvKe7IppNj+4zpJ1IeI4NuuU+5Jn5w4B1+efNs7o1g4TbAJP9J2HY4n37T4i98vJ84BwI/wwxHTfCDYdQLmPSgeeJ9bs77sOpwBNz7x+VbadLARcOoixQQTIdVtm1KUSAUq8TCB4/nXwfTeuAquiZBiU2i6JiTTRGxCfJKkkPU4sM/ERkhNoKrCHCXfBOozpS4wpT35XDsNheT7qJ8KjjBj25nT9TWqtSQJTz6HJGPBiUPQZUQCMGdo8rlIoSzaOXEOJlDG//kceBtIfgAA0ANddeAoAL7sOlRVSPcbG+HlKPk6UD35XK8gZUD3uU0ZV/JtdgnTSYJUcAipDbqJxjZJUjytqn5dX7BZxeIkX3pysR1tbwKVfFA9+TZQyUdTU5P28Dxb/eX2f67dkOKZ92nX8bGDxCXhppSVPggp1QJlQqUWTpzdC9tup+5wQep3ahvHKZ580xiYRiWfc4J1JZD+Zcg8xvr16+cMZr29vdDb25t4Wyh2HRO4A64Puw5nQI9PYratd47nXwdOdh3q4EZR8iVIfnx3hFq/y0cd/5uJgLuuYYJuoqQchoUl+fH6TG3S2cqoExIVnIUTldD5VvIpJF9lFdGlRdWBY/2Iw6XkU3ciFyxYAKOjo6j2cOw6HNtUHD4XNqYYJ5sFCntirwLlnjnfRBKBt7r6KXN5JS1QJkiPeVwxrRqUfHILH3vsMXjsscfm/HsmkzH+TeHnP/859XLzGhs3bjSmnEwaVHuMDlwSbjra3hfJpyj51EmYo+RTDlVKwpPPsevYiEd0QPft7dbBt6JiWmD6VPLjvzGdSAkw970lMbmMj49DZ2en9m9qByY+8VFTUFKtJTZQyVNjYyNZyZck+T4Dbym7I66+XAnVmbL442QschFSSSXfRxA4h+RTYkd8xlEA0FJVm8AZ83wG3taUXUcF3XH+F5Be+FDyXQFBlO1uX3YdqurMCbylElJde0zpKn0q+dTDsEzw9Uw59etAXUjYCDUAXcmnknwTOTM9p/gOjNTkEv3+OEGiNlB25jgk30QYqedemODDrsMh+S6SjD1kqJLZdahzgs2TryP51N1XX6qzj2+CA848SxmHfe+Y694blQ9KP1POTkG1kHxSCx988EGpdgRUGJRMMCa4SDglO4Uvu45rkoyqeb4nYR1sZM6kFtgGH4rCYCL5HBJualOckLpsHz62QScmJkg7YhzPvC2WIn7qpav91L6mC7z1vXWtSKC6R5snX03alHdkygRjInM6m4UNpv6JtUC5IG3X8bETaUNDQwOMjIzM+XeXXccHyeco+brvwuQf51igfD1TH8kYOISXulNAsTT6FOsA9AduUUGdZ30vIurq6uaIQ9VC8kPgbQAAmLfTqUq+r61Tn0o+dju6koG3JnDtOlhPvu/sOg0NDbMGdI5dB+OPjE72nGdqq5+iGJrsOradAmpfi5N8icklbgmyLc64Sjs2VR+nfmqmJhNBM4FDwuOEyGUtkbTTcKwlFH+6CRx/OmXM41osTfUrMoeBLyWfOsZzd3d92XWqwZPPEd9s5X2eMZM0AskPAAB/Sr6vwFtfnnzKdrfvbUodfAYz234j6cmneFpd3xDH6xi/BjXw1vVMKd5fjl2H2tc4dp1yTyq2Lc44JJyq5FPrp1qIqB5+H9YPzsLJV6YWU1mbda1SSj5lzLP1fR9xFNQAfQD/BFNX3tecQG0PN86hXE8+5pnG7Ya2+42/V9c70C14A8kPqCpQSbUOvpV8Sns4k6SOkPo8DEsH2zV8RfDbPPm6Z0q169ieKYUsmkAdcKnXwNhpsN+e7ruw+ZxV/dRdqujizDXhcTzzumdK7QuU+gHM98EJ+KQq877sOpSAQ9dOITW7DkVp54yPuu+IunjkWD9c/ScKzu4IZUzltJ+qzFNJNWd315eSz3mmum/Pp0VJdw3bnKAbXzi7u4HkB1QVTB+xzxSalMHBF8m3tSk+SSZB8m3luYG3OlUCq+Rz7Dou1SZu+/AdeEtZnOnAGdAB9IswzuBP/Q1VyeeQfN3iTJcFilu/6Z6llXyfgbdUEh73IlOzD7nq96HkUzPBcOYEnwsbSnt8KPncnQjqnIC16gHI23V875jH+8H09LR3JT/+fbvmcsp5CwD+klZUAoHkBwCA/GFY1AExqcDbNCn5OmCsH3EPaRJ58m27I5TAW1P9FCWfeg3XgE4hsbrvGpNdh9LXqJ58qqqtrhGPpfCp5FPUM58k31fgLdczT8nUwrFBYO/Bll2Hcnoy1QYBQF9o+fLk+0iW4JpzpJV83TPiKPkUS6OtPbbT7rH9gLt77MqIhp3Lg5IfUJOgZBQxwaeXj9qpbDsFWCWsGgNvKUGcJgWDM+BiiYfLSsOxKFEGdB24Sr4Ovjz5lN0Rn4uU6DXi782k5HNJvk6R1E3cFBuKAvWe4wshl33AtHCykWTKSZ9JZNfRtYVijQHgCSG2Nvkg+dQ4B1f/iZeVPjslCZJPGed9JnsAoMW+cepX14i+C99KfiD5AVUPX4G3Pkk+hQiZ8sxTBlDprV8AvwsnU7tsSv58sOtQ/Jc6cJR2SlkOyad4uzHfBIeEY5V8X3YdALwFykXCTYstmz0mWp7zzlzQ2eNs9VMJrw+7DoXwAtAVUht8eOY5cQ4+7TqVUPI55NKXJ5/zm3gf57QfM2Zj54QkLJZpQiD5AQCgT0FnI73xNIaqPEdp92HXMYFig+AcrOI76l9Xvy8l3+dhWNitWdc2MedsAN2A7jO7DoUkc5Q207eNDWaWsutgPfm+lHwTTM+Uuth1qbBUkq+7Z9vio9x7drWL8h5sbaH4o30r+SY7DdZC5BJmyl1E+JzTfF1DOvBWQmmPt4VD8qm7u9h5n1M/QCD5AVUG3UBPHdBtREXnHVe/wdp1qFvLAP48+ZydAoC55IMzAfjaRvR5GBZ2AJXIrkP1eMbfm7Rdh2OncSn5cbuOr/ZHrxF/ppSsK9T6beBMqJyMRfFdPN8LJ8ohQKZn6kpxWe4iggqqDcIGH9l1pFNo2sqaFke+lXzp7Dpxgc+3XUdXNglPPlXJn6+Bt+lv4TzG+vXr53y4vb290NvbW6EWzYaLzE1OTs7pSNSoedM1KH5WV/2UIFEO4bWdtqoGFHWPSdh1TPfMHahKpdKs90oh+ZOTk5DNZq31x+HTrqPKRp85ZuEkbdehqHNxGwRH1XaBksuaQxipqjOH5FN2Fqkkn5q9B4C+sImfnIz5TfQebFlLOGlJdaCmJrTBpuRLBt76Ivm+fpOUku+ay1WdnOw91IxISdh1QuDtW0h/C+cxNm7caCWIlYbL7+iLhGOVfA6oSr7vAZ2yW6ADl9DpJnvOYVhqIo6Wsf1Gl4qxo6PDWL8OGCVfkuRT7Dq6si4lUkduXHYdauAtte9QVGcuyS9HdXb1TWrigPg7wJB8SYuSjzgHnyq7Ca6FE+UaptNlqdaPaiT5UeHE1p99Kvm2xdnExMSMPc81vugg/UypwgnFqqfKh8DbgJoDRsmXvIYPUBRS7jaiL6+gLs7BZ0CgbruTY/1wLZwonnxudh2stYTaftNvbGV9Bd5SUtBRrSWuVInShJQyXujIIuc7pSikXCXfBh92HRt050X4UtlNoAbeUg89AvCnCpv6sa8UmrbfUAgjVcnntIliveWQfNczjY7zLqFLFx9IHbN9B95Ws10nkPwAI1yrYR/KEEc9N8FEGG0EsNz8vRgvX3RAsR2IY9pG9J31IwqOQupSnaXz5OueE8VawiGMtrLUdGycFJrlHobF8ZyaIG3X4byzcj35GBIhGYfA2SmI3zMnBTAVLvKEtXzZQA28pajg6jcUku+b8FIWZz6VfCzJz2QyLNutrU3RxR5HpKB68l3nfPgQETj23kogkPwAIzA+vnLhczVMPTFWN9hKp3u0gaMWlDt5c8gTJUgUo+RTvNQAcwdp24TEVfLj92zzOusyNXBIvk3Jjz5Truffds9U1Zmq2PoIvLV9Rz4CbyVSaFLuuZzFOgBdveQgiTmBSmJNfbOc7Dfqe5awlsTHL6rlCPN8dKegY0UEzu6Lz4UTJw5B15+pdh3KnIP5TVoQSH6AEdSOwgEnYw4FtgElPphwSL5P6weHMPog+dLkyWf96hrlpmOkTjKmic90irDtnqkLDx8pNF33LJ3ikmrX0alm/1975x4jV3Xf8e/s2rszOzO7s+v1+rEPLw+72Li2MaZxxDMNEUmXEpCowY4SgpKa/NOmMiZK3SgRLSKpkFyhqASpIKvi4VDUUAlVKSQgQDyqxnLASYBCbWHj5z68j5mdfXqnf1hnuXt3du/vd+793bkz8/tIUfDu3TN37uOc7/md7+93FmufWwKYY5lY6Jy88Dtx4rJYRDiI9oHFr2lQn7HYs1rsPi/EYp58as6MROCHE1yy6b+Kvf9eiah+V+W5It/GIsqZhHO/r03/pSJfKXvCSOSSZrGX1x0BCiPxdjGC6Ny4BG3XcV9TrxKaNiLfLXoXizwtFLUJauJU7D2wuaZeqyOcsqQ2Pl6/ibeUa0qdqNhG2ool3i72GdzEWz+R/GIJpoudjw2LCRsb28xCnyG9WhBUcMk28db5GWFF8hf6jIWi2hzrivkMqui1eVa83n93dTavIAjXk1+sUl6QJTRt+qSooCJfWRCvJb4gOnRpuBGGoD35fqPOEuKD075N1NYpur0Eqc139itIpRNvvfIQuINMsTr53EGSEl30Yy3htr/Yc1FsT4qgV4TCSrw133l6en65Yb/tu7HZk4ICdTO/IC2cnET6hVgo6i8t8rnvgs0GY1yLolcumLRdh+PJt5nYFMsF4zynatdRqpJyi+TbVGpxUmpPvk0ENoxIPvecOJUUgojacAe8ICP5xfDKQ+D6bDkDmGmf+52l7Truv+EKUokSmlyRz30mnJMzyj3zK/IlEgHd1ymMsspAMHs0LJRAyhF0tpF8r0pWHLuO39KqQR9fjCArFtmsaNfV1WFiYmL239zE20quk68iX1mQcovkL7QjLTXrv9Se/FLYdQqFQqA13U2bBhvBG4a1hGP9cG8G5oWNoFvsPrsHJa9rutDEyWuQNNfUK5JnU73HfR8mJiZm63JTsJnscixB0tV1ylXk+ynTaRMRppwPZyLBLcZgPsNPJB/gBR641hIvuH/jvm+2dh3q+ykh8jl2nYUi+WrXUaoOL5HPjdrYdPp+BwpOpYYoRPJtaq5LTra4/nE3XtYVm5UCzvKyzYBRTAByksODtpYU84/bTCK8Jk7O6GWQicMAbwOzYtiK/KBqg/utkx9kP7EQEnadYv5xaoSU009wzsfvdeKsakkIOc7qiM1zx11RCcOu476mQa/uugM/3BUnyvmryFfKnmI+VWp0UQLny24r9rmC1MZ/KWmDCEMcLIZN1JZj17GJ5DuvqddzEcQ19fq+biirF9xIknT7zvfZK8pua4FyvgfcSD7F9uU+pyATb23eM24k3+97HFYknzpxCsM+ZAPHrsN9Tim43wXOZJTaPteu43cs51gsvcbZhYIIXp58t8jnrI7YVrELKqFdEhX5yizFBGkQ3kgDNypRX18/67Pzmv0vBEeQ2nxGkOLAxmZRKpG/2HfmWKBsJhHuCGnQUWe34OJGJCmJt9KrI34iYRITs2Il7oKM5C9UQpNq17FZKfDC2Z/aWKy4lDqSH8S+I5TzkRb5zu8xOTkZuMjnXCfbSD7XrsOprhOLxYomxge1OmLryafuz2Ib+IlaDiKV6K81VDB79uyZNzvt6elBT09PSc7HvCiJRMLzWD+RLWrE0pxPMpkkRVSKdU4c8cS1ZVDa59p1goowLAbHY77QOVGv6WJVHQC7Dtc5YEhFnTkC0E3Q/nE3NlFtyiDp55pSngnnMxeGXccrki8t8v1OnLhEIZKfz+dFzycIkU/pk5zvQqktUM6EUmr7kpF886w63xdOn21j4eR68rmrI0Hu8xE1VOSXkP3796OhoaHUpzFLsY19FsLmoed2Ps5IPkUUFAqFeQLWa5nPL1z/+GIEIUgpO49yViz8JhxR7DR+Em/Hx8cRj8cXPNZ24sSxcrgJurqOG8pyt1sYUCJtfiP5XufvfBaCTrytqakpunPyQs+Gjcjn9necPIegSmimUiny8RQLpN9IvqSfnXL+NnYK52dI2HWiGMnnTgrc7wtHhNuUVeZ68hf7jKASb8sFtesos7jrcS+GzfIVN1nX+eJSRP5CS95eHT3H78/ZLhzg+8e5588VK5x7vNA5eX1GLBbz3PzH4NeT7yXybawx3BrqbmztOhyRL5nMLBXJd8K1QVCeuWJ/Q43mUZ4JPwmQkpF8069wI+eUe8bx2Rfzmgct8p39F+X8bXK5uCKf+xnFJk7UFSdq+37sOrbVtaiRcK/VkSA8+dwSmkEG66KGinxlFk5pQpuMfD8in9LZ2nSIztUCSudWLFpIjTBIRAu5Ip+zWmPOiRu1ra+vJz9HpRCkNnYdjo3Lto49VRDZ+Lu5y+lcOxD3GnFtEDaCkevJ51bXmZmZWXQCzrHr2EYKneKJK/Ip1zRqibdNTU0YGRkBIBNlB+Z78r0m1NSAhrN9arnHIMYEyvnYRPKdUOwu1ICdTRDErV0Wm+AX+76lzn2TREW+MgtHhLtfFEok0kbkc+w6NtEwp8j3wkbcSA/03IHV1n/pxEscOK+p1yqK3zr5tiKfk0dhk3jLjQpzIvk21g+v78Dxy9vmFDg/w8auY5MUv5gNgjM5LvYcz8zMkC0KNpF8auCEs9rphHLP3NeJU7XE5p55kclkMDg4CEBuh19OECEIEc6ZONm07wV3XLYJ/HDsOjYWS3fwihvJB7xXzDWSr5Q93E2GuDWR/Ubybe06i8ER+Qt16EFG8/z6L8OI5HP9kdz2pUW+tCefYtfxE0myiTpzJhE2nlmbvIUgd7zl/k0QUWev++AuJctdxfOaRABz32eJa1psf4MgI/nFKrUsRktLy6zIl4rkO8c2Sv/it8/2EvnSnnzn96UUZfBrsZTw5LttqIu9OzYTp3JOvFWRr8ziJ5JPWa7nvlzuxFuvDt0mqhKPxzE+Pk461qbD5VbYkI7kcz35NjXX/a6OcGouUzz5XEHKjfIWi3YGXYLS/ZwuNhAHUYdfQuS7E2+jZNexKZUY5OqLbZ4GZ7UAmHsPKNeU47MMO4ZvAAAgAElEQVS3Sbzlrr42NzeHEsmnevJt+uxiY2cpPfmc3JGF2udUp5Gw63AsomEUDYkSKvKVWfxE8qn+TreP3ysKzolSSdt1bCts+Knp7gU3ks9dTbERdNw8Bz811yWSRN0+W8o15YibIET+Yth8ZydhRfKDTLwtxmKCxd3veOU5FIMSaae2X6w6EFXk23qdbT35i9l1qJV4nH/D6fOam5sxNDQEgDYm2FbX4VxTmz6bU0LTz/4M1OOpAhywt+tQV18XsusslngrXTSknEV+ZEto5vN5PPfcczh27BiOHTuGkZER7Ny5E7t27Zpz3HvvvYfXXnsNH3zwAfr7+5FMJrF27VrcfffduPzyy+e1OzY2hqeffhpvvvkmstksOjo6cOedd+KGG26wOo57bJThinzni27jyaf47IxYlEq8jcfjrKizTSSfk9BIFXLOv+FG8rkiX9KuY5MkCnw2eI+PjweeeOuGIvInJyfnrCh4Rdq5kSq/K07Sdh1K+9w6+c4ggK0nP6iJTTGCrIhk2z6nTKe5b+aaUK6pWxBNTk6SI/nU9jl9dmNjI4aHh2fPhfIMcamvr0culwMgU3WJExQotjGfV0loP55824kZJ7gksc+HHxcCBRX5AmSzWbz00kvo7u7G9u3b8fLLLxc97pe//CWy2Sxuu+02dHZ2YmRkBC+88AL27t2LBx98EJs3b55z/MMPP4yPP/4Y99xzD9rb2/H666/jkUcewczMDG666Sb2cdxjowxnhlts8wluJN8r4ulcgpOM5PuJkHoRduItx89OEbu1tbVFy41RJ2de+K00MzExgaampgV/7zeqbY4PaoAB7CJhHJEfhF0nmUwu2r7NxIxTJ9+94Y6NJ58zMbAR+ZxrOjU1teg1Xah9Tp/qtVpgjjWTUapdx/ksLbaRVBCRfC9RXlNTM3uMlF2nvr4eAwMDpGODiOR7+ced7xplsuhH5NvmvlFWIsfGxmY/wysw4x4/vPps53PhRRD3rJyIrMhva2vDwYMHEYvFMDw8vKDI/853voNMJjPnZ1u3bsXu3bvx/PPPzxH5hw4dwrvvvou9e/fixhtvBABs2rQJvb29OHDgAK6//nrU1taSj+O0WQ44BSClpjs38ZZr8amrq8Po6CiAix3DYt5r0z735TUin5pwJC3yuZMUt+DiWIIog3Btbe08cellUzCrI36SuKjvzPj4OFasWLHg722jzu7z8XpO/VqgvN4f5yDpxULX1Ov9MUxOTqK5uXnB39tOnMz+CTU1NZ52nWJRZxu7jnQkn9q+7UpE0HYdrmfePYFd7H3mlNs0cPsv5zlIJd5yc4ok7TTuMYdiK+OuCHPLsNoEZlKpFM6ePTv7GZwcJ8BuN/qFsNEJ7uc0yPORJrKe/FgsRvLTuQU+ACQSCXR1daG/v3/Oz9955x0kEglcd911c35+88034/z58/joo49Yx3GPjTpOscLd5pkyIHGjztzEW1u7zvj4OMbGxpBIJDzb95t4y+3cvCh2TaklPaVWR0wknzIIL1Q60GtJ2kxCve5bGHYdbpSnFHYdrnXFJnHY65pyVuaKPdeSdh0pO42zfe75cyuWca16tpH8xY7lrNQWa5+zIiQVyfeb/+IFxy7ifpdtxkGv/Ryc941a4ILbf6XT6VkLFMDb4NG0H9TO9TZReff5SuwBIUVkRb4fRkdHcfToUXR1dc35+fHjx9HR0THvYezu7p79Pec47rFu8vk86X9hLRNxln5tI/m21hIpQWqiziMjI2hsbFz0WL92nbASb6kDPfWa2n5nr8o3gH+vYz6fR0NDA6t9rl3Ha7LCyUEA7CJViUSCZdfh5lE4GR0dXdRaYuPJBeYGEbgJ07Z2HY7tS1Lk2yT2cj35NhMnyiSCI0j9RvI599nmnlHg5Gm532WKZYTT59lG8t0+fi+7ISeSv1CwazHhnk6nkc1mF23X2b5kJN9GJ7ix6Y9KRXmcJZPHH38c4+Pj2LFjx5yfZ7NZrFy5ct7x6XR69vec47jHurn33nu9vgoAFE04lsAddV6sA+WUATPYiHzpxNtEIoGhoSEMDw8v6u22bT/sOvlenQ9X5Nte03w+T7JY1dbWkgdUJ2ZACSOS7/XsBZHMTFnV4th1bAZJM3EfHR1FKpVa9DibiZN5n9PptKdAs+lfnHYg6t8YpCP5uVxu0Wtq277TrsPdCM8m8ZZj17FJvOWuOFGjzpz33U+eFqXiEqdPDSKS7/VuuiP5EoEfjsj3G6Twwqbikhub/qJUVJzIf/rpp/Haa6/hvvvuK1pdJ0ocOHBg0SikIaxlIW4GvN+lX4qwkY7kJ5NJ5HI5UiTftiYy9ZoGZdehRvIpHZXNNU2n0zh37pxn5Rvg4vnn83lW+4B/uw43km8m7cUII/GWKzxs7DTG9+8lSIuVe6S0z1mZs406T01NzT5zHIuPTVSY8p3NxIMSRHBjU7GMK8JLbdfx48n3ShB3ts8R+dxIPrcsKccuwt2Dw7TPuc+cFXxzTjZjgt9IflB2nSCwWZkrFRUl8g8ePIjnnnsOX//613HrrbfO+/1CD5r5mRnIqcdxj3XT0NBAEvlhwYk623rynUIlaLuOTSQ8lUphdHQUw8PDInYd546OYVTX8RpY6+rqMDIyAoC+9Mu9po2NjRgZGSFH8v3adbgi38au09rauuDvuSK/pqaGvdwdj8dnSwd6YfudjSWIEnV2nys1ku+0rnlFF7lRYWNdMSLf612IxWKzAtAmsZfynU2gghJEcMOZ2FAIwjPvdazzuaZWarHx5BcKBWv/uBd+IvnUiZmtBUrimoaxuut3g0RKnpbBKwchCGxyhEpFdKZGPjl48CCeffZZ7Nq1a55Nx9Dd3Y2TJ0/Oe+mNb37NmjWs47jHRh23v5MjSKUi+Ry7jo1gTKVSs5F8il3Hj5fPa1B1t2+bzBy0J99W5FMi+bb+SDN5st3xlmvXWew6cT35NgOQsbpQPL+2ibGJRAJjY2Ok++aGGsm3Heipnn/nffD6m3g8Pud47n2hRBdNEidlwuuGuzriRRB9Nuca2YhwTm6HTdSZIgDNuEP119v02balqm1KaHqdk/N4KbuOM9jlhd9x1mb3ai6aeBsyP//5z/Hss8/irrvuws6dOxc8bvv27RgbG8Pbb7895+evvPIKWlpasG7dOtZx3GOjDsffWWyTjqBFPqc8nDknm0i+pF3HiZcAd7dv42nlePJtEuMoNDY2IpvNkhJvbUW++R5eEZ6Fok4cseIl0PwmD1MwYm5sbMxz9c/Wk29EPsAXvNzEW6/2beyAbsHr9Z05EdtiUK6pn8+gJt5Kivxiu5RTscmjoqwumNWRfD7Pbp/zHNmsRFIrIlH7C/f9pUTyi2066bWiZbBNvLXZdGyx9v30p1KlVZ2oXScgDh06hImJidmB58SJE3jrrbcAAFdffTXi8TheeOEFPPPMM9i6dSu2bduGDz/8cE4bV1xxxex/b9u2DVu2bMFjjz2GfD6PVatW4Y033sDhw4dx//33z3ao1OO4x0YdTiUY9yBtG3WmevJtBgxKx2OSRKmJt34j+ZxKMLb+S69KMH7LpXnR0NCAXC5nnSxNEZhOQcptn0vQ1XVsMD5hr8o3QPHnlCI+OKUD3e8WRTxxluyLlXsM0p8O8LzXxaCKfNvPCPqehbEjrRObqDDlnMw1/eCDD/CNb3zDs33uSoF5brwqdwHykfxipRuDjuQ7kQqmcbB95owNUqrqkpNyiuRHWuT/7Gc/Q29v7+y/33rrrVmR/8QTTyAej+N//ud/AACHDx/G4cOH57Xx4osvzvn3vn378NRTT+GZZ55BNptFR0cHHnjgAdxwww1Wx3GPjTLcBBwnlAGpWLk0LxuEs04+d8CgDMK1tbWziXFSkXzn5i1emwy5KynYRPIXE4Hu1RGJQd5E1iUj+VES+c73JsiIlhPzLlBEvu2OtCbx1sZOxPXke1HsWK/z4k62OAK5GBxBagOl/+JMVLgBAWD+xIDzbNiU0KVG2gcHB1FXVyfSvoEi8m0j+bZlsW0889z9HLzycWwDM0DwJUadmKCg2nXmEmmR/+STT3oe8+Mf/5jVZiKRwO7du7F79+5AjuMeG2U4JTTd2ETyqduwm2O5ibecBEtqnXwbQUqtBFOskoJEkpW0/9IwMTEhssEYQBdofkS+2bGXUu7RnEuQpd6cGLGYy+VIIr9YHgIl8XZsbIw0EBdbyaOIM9tIvs3feH0PPwIcoA309fX1yOVyVoIgaDtQsdURyqoQ167jfG8oK3k2nvzTp08vutO1odhOpZT3MxaLeSb1A3bn7+yTuAnftnXyKcnMAM0OZBuYqaurw7lz54puYOpu31bkT0xMsHOKbBJ1y0nkV4QnXwkGp5WDu9mDjSffa8btfPFsE3upEQyb8+eW9eKWe6TcA67Y4uRdmHOyXZqNQiTfNmrm/Dsvb66fFTAqJkrlVcMesNuREvjMumZTqo6aJEpd8bCxQLn/hpJg6SeST7nX9fX1OHv2rKewKQblmvrZnZXSvziDAlx7kk3UmXJO8Xgc/f39pGpFxew6lDGhUChYRfI5diCAv2uvTZ18zjgolacFXKw0+OGHH6Kjo2PR42wDM84kd47It9loq5zq5KvIV2ZZsmRJpCL5XGyjNpz2uRESJxSRz7EzFcPLQsDZIRPw57+kVtcpVi7NCyNIvTB2LC5Owcjx5Et1/kaQUuw6xcQttbrOqVOn0NLSwj4/biTfS4DbRvKdIj/oSL57fwCqID116hSWLVtG/hwD1ZPvJ8+BEtjgJOo3NDTMvpfUimg2kfz+/n7S5mI27Ru8+mvAn6AG+CLfJk+L8hyZ/RykSmgCF0X++++/j87OTs/2bcYc8z5zryl3NQUorx1vVeQrs7jr0nMEOHXA4O7ex8HWi2g6OEr7NlEhI2jGx8dZkXybSRClTKcfkU/1nNfU1CCfz4tG8nO5nFhiuzOCSbHrcISQDebdpIj8YlDr5B89ehSrV6/2bM/9HFBrxpvShFKRfM7EgJt4a7NxUzwex+nTp61EPieSb+N1plbXMX9DebaTyeSsyLcZEzginxLJt/XkG7sOxc7kJ/DDTRK1rZPv9Rw1NTVheHiYvEGijchPJpOkSL5t4Mf0LzaRfBuRr5F8pexwLtNzxQo18TbMSD5VhHd1dZHEgc3SLPCZCBwbG2OVYqSICDecSL7N0iy1Q0wkEhgaGiIlxtl68vv6+hbdbM4PTpHptVW9W+RLRHj8inzKu7By5UocPnwYq1atEmnfWI4opQltRb5TtFProVMpVjiAYtc5derUopupLQSlfSPypZJcnX9DjeSPjo4ueowTmz61vr4eAwMD1nYdyvtp7DpcTz7X+sEVixJ5WgDQ2tqK/v5+zzHKtG9r13n//fet7DoUz7ytyOdE8s1ko5xKaKrIV4rCjbLb2nWCjuTbCNIrrriCtOW8bVTILGF7DRpBTIIodfL9lCWlfudEIoHBwUGxHW8bGhrQ19dHWrJ3Q4kKcUSmW+RLRHjMIOcnku/1fra3t6NQKJBEvk3iLUeQ2th1uJF8Y4HibNLDTYyvr69nRfKd50KNalNtXLZ2HafI9/q+TrsOBZtIfn19PdmuYxtpTyaT6O/vt/Lkczfa41gabew0HJFP2e3aj8gvFAoiO8sD8iLf+b3LKfG2PExFFcqePXvmJbn19PSgp6enRGf0GePj41i+fDnreG4kSSKSbyNIN23aNLtD8WLYDhgmSdRrkCwmIoKO5Lur61Ai+TbXNB6P45NPPmEPGFTBlUgk0NfXR6qw4YYSFeKITO7qiB8k7TqxWAybNm1Ce3u7SPtG5FMSGm0i+VxxEI/HMTQ0RN6Ntlgk3+s7NzU1obe3lyTyTf6IEYnT09OekWQzflBruvuN5HsdzxX5tbW1rF2KAZ5dxzaSn8lkcPr0aVx11VWLHmcbWDJQ+mDz3qRSKesSml7ntGzZMgwMDJBEvm1gJp1Oe0bxTfs2m22ZSfvk5CTpfTZVoKgTM3Ndzf+ryFc82b9/v2fHXCooop17fBiRfBtBunr1atx3331W7VM6B+cS9mICs9jGJ9KRfO7SLPWcEokE+vv72TXdOROnvr4+XH755Z7H2uBO4vQ61o/I50T/KPs5LPQZlOv6k5/8xOqdpNp1xsfHSQmNNpH8JUuWzLHfeAkD48mn2DKA4iVuve71pk2b8LWvfY1k1zHvgrmOU1NT5HtN9Y+7I/mcST4lks9dTSnWp3rdCxPJl6yuk8lk8Nvf/jYSkXyuyLfZqDKVSmFgYMAqWZpKOp32TLo17dsUSzDv8/j4uGc1KzOuOYW7F+b9icfjZWXXUZGvFIUr8qlbgHM3e+JE9Px2uF7YLC0D9HKPbiQi+c4O1OaecUR+NpsVWylobGzEyZMnrew6FDgik1uW1A3nb4aGhhbdUG0hqNeVKvBtEm+NWKGIfJtIvvNZ5STqUQQyUPz997pvsVgM3/3udz3bBuxWCgxSkXynYKTmIHDzHLjn1NnZidraWtHqOplMBp988gl7F3RuJJ8ycXKWSbW1cHr9jXOM8lrptF197ejowE033UQ61gZOdR0j2J1i3wuudS0qqCdfKYpNJJ/r76ZE8pPJJDmRy2+H64WtIOUuYRtsS2hSvzO1xKWN8EgkEiRbjO3EacWKFTh58mQoibeUY/1E8jl/MzMzY1XHnrunAxdqJZiJiQmyyLeJ5Jv3kyLAjSignA9gP+GlYlO9x0BZjXDvXsstHTg5OUmy0nAj+dz3/7LLLsOLL75ItljZfOdMJoPR0VG0tbWx2+dG8rkin7vSRnmOqCWJAftS0q2trbj55ptJn2GDc9LOmfBS75m70pREgQUJVOQrRZGI5Nt48pPJJHK5HOkcig0YkpF8jrXERuTbRG04AzflntXU1FgJj3g8ToqO2kbakskk0um0aOItVaw4bRA294xb19mGQqEQqMh3T+Aoib1OTz5FkPrx5FOuqbEPUUQBIC/y/eTkUHI1bO2MzuMpdh1OJL/Yd6acEzWR2fY7Nzc34/LLL2dHtW0mTtTnFLB75ih9UkNDA3m12dYCJQ1nZc65UsuJ5IeVexUkKvKVolBEfiwWm33ZpTz5qVQKQ0NDpBeqWIQhyM7HTyTfxq5jk9zDiTBQ77G7farIpwonW+GxcuVKsUi+beIt9Z4592agXtNYLCYajefg3hgK8F7mNwKQa9exqX5DLT/J8eTbClIqxTz/Qdp13JF87vlTrinXZmVjgeJgK8Lb2tqwceNGz+P89F+FQoEk8p2RfG5dfYBuCaKOUX4ni1yo7386ncbw8DBGR0dFIvlq11EqCmqZO/PQU+06bk++14uSTCYxMDBAWqKUtuvYrhRwa0cbbEQEZ5C06Zw5eQjUEne2kbAVK1awI/mmooIXRqxQ7rGNJ58bdQaAa665xmo3WglsKmyY685NvLXxzFICCJzlfcCfnYaCbf9VKBSQy+VEEm+dcHKoqH2jH5FMwXalsLOzk5RLYXvPnP5xr+fUOXGSCvw0NDQgm82S3zM/qxdcqNd09erVOH36NDmS7xT5lPa5G8NFBRX5yhxqamowPT1NEu3uXUG9jndbPyjiJpVK4fTp06Q69tKJt34i+QMDA+zSh5yOxEQ7pL2CHE8+5fsWswNRz3/Hjh3kMq/m+nA69MnJSfYKFdWuYxMV+spXvoIvf/nLnseFgTuax2FsbIxVQpNa95p7H5yJwDarTtKefGr71113HX7xi1+Ie/KpibfmvaGujkgKRluRD9BK7dpWXEskErPlHjmrI9QghRNqJJ86RklPzNxQ2ze79lI3MasWu055ZA4ooZHJZDA8PEzy8Dofeq9dQYH5nSbVk/9///d/ZJEvHcm3FfknTpxgb23PKe1lvivlPviBGkniiHz3BkDU8//85z9POs6IGxMdppx/XV0dRkdHSWLFXYGEksvCtZYAF9/Nq6++2vO4MLAtowfQIvlOCxR1pYO7OmLsQ/l8nlzHPszEW2r7d9xxB2ZmZkg7iXI3w3JCeffN5JiycyoQfiRfekygWkRNnpZUOVknlHG2pqYGg4OD2LBhg2d7YUfyqe3HYrFZGyRl9dVv4m25iHyN5CtzaGlpweDgIOlYd2SIC6XDTaVSOHXqFHlHWtsSdBRsO7fW1lZ8+OGHbJFP7UhskhSpPkfbc0okEuQ9ILi7fHKxWe42f8NNQOfcM270P0r4jeRzEm9tI/leIt9MMDmefG4JYA62laxqa2uxY8cOUrlHv9V1qJF8qgWqWJ8tvUFiVFZ3x8bGSNYSZ//FjeID9Guay+U8qwkBxSdOkoElzjNBHQudE15OMM1PgYVSoSJfmUNzczNZ5PsZ6Km0tLTg2LFjVnadoKuW2Hboy5YtQ19fH3tre2r73GQ3ZyIXF2qHu2rVKnzpS18itekcuCREvnuzKs41lRL5YSz92k7kKLjFGQdu9JKabGizOhKLxVh2HckIZjERHuRz4Y4Ic8uxchJvbS1QYVxTycAPdcwxia6UJFGbJHQnnGIJVJEfRbsOcNGX39fX53mc87mgTlLcyboq8pWypKWlBefPn7fyI0rQ3t7OiuRLemZtk6xisRja29tJu166OxKqf5yznJtOp5HNZsnHO6GK5GQyiWuuuYbdfhginzrgjY+PW4l8CWsJFz8inILt1vYAraa708ZFrQ3uvKbUiYGJ5EfFky/df/nprynvAqeCkjkn6YmTtOff5p6Zzacoz57NxnBOqH1SIpEgiXzpAhduOO9Be3s7qa9wjgmcSH45rr6qyFfmkMlkWJF8P15BCqlUCplMxnObanM+7ki+5CDJWfrt6OggRfLd1hJOpQYqqVSKvPeAm6hUUuBgc03NIEz1Fhuok6AwRL7kBNxP+9SkTINtJJ96TTnWEhv/NZUwos7O9rnWD44gpVqgolpdh4ptJN/YdSj7GzgFqaRdJ5FIkAoZSFug3HBst6tXrya9y84x00bkS+e+BYkm3paQPXv2zFsu7enpQU9PT4nO6GIk//Dhw6Rj/SYEUWlvb7dKvJ2cnERzc3Ng5+FnEN61axc6Ozs9jzODZDKZJC8J2kbybQYM6WVK6Ug+V+RL2nWcgjTo7xxVkb9kyRKMjo6ydu20ieRzJk62Ij9oiq1ESgpeDtQVD+PJ50Tyw/zOYeyCThXU+XyevDriN5JPOadUKkUS+dKTUTecMae9vZ0s8rmBnzCcCxKoyC8h+/fvJycnhoWx61C8f34Tb6l84QtfIIn1Ykuz0pF8qpC46qqrSMfZdD7cQSCVSlmL/KmpKXYpUA5RtOtwos62gpQzkaAQVZGfSqXQ39/PevaokXyn4OIs8VPKBQP+xRa3/aD7L5v3HfjsXlNEfm1tLaampjA2NkbqJ6TzEKR3Z7VNxk4kErMr5pRN5Pw8d9Rz+od/+Afyexa2XYfafnt7O2699VbP45w7M09PT5P637CCmkGjdh1lDplMBp9++ilpJ1Fj15FM8AOAb37zm1bl2KQTbyU6N2d1AClPvhFanGiqQboOv3R1HY7It7HrUI933jMpu47kgGTr+W9sbMTIyAjpWCN+ONV1zDlxrylngzQp3O1LVC1x9tXUftu5M7CXyDfX0bZikbRnXrp96nNnVgop2CTeunfUppwTxRJr2nYibdfh3LOlS5fii1/8oudxTruOTeJtOaEiX5nDkiVL0NvbS/KPm0h+VDLN3TXXgxZPYXRuNpF8ric/nU6jv7/fKnpcjnYdm3JpXLuO2dTLxqZgs1U9p30JbBNv0+n0rPigYpt4S43OUydD0pE8zrnYYhPNd+4nQFl5NhWLouDJl7aW2O5twNkF3ea5kLYDSpc9diLRvo0nPyznQtCoyFfmUVtbSxL5RjxxfcuSODsf6Q0rpKwl0pH8xsZGfPrpp6Q8BzfleE2dgyT1/GtrazEzM0O26zgnBTYi32ZVhdq+BLbtNzY2suxPgN1mWNRrmkqlWGJLOpLPmaz7hSr4jSCSSmYO004TdP/ivobUa7Rs2TIMDAyQPsOMCdyIdli7s0rZdZylpIM+f+e7TD3/sN/PoFCRr8yjpaWFLPKnp6fJntawkbBBOJHo3JyRfG5Nd+oAmclkcOLECTQ2NpLPy3S4lWDX4bRPtd+Ybeqp74Lbk1+OIt8m6pxOp9kBAapgd0ZVqfchmUxGJpIfVc+vEfkcW6ZtnXzAPndgofbD3LiJ6n9vaWkhi3wzJnDEepiVYCRWtJ2TM4kxxx3Jp5w/JyAQJVTkK/Nobm5GS0uL53FmUJqYmGAP3NyNWKg4B4gwos5Bd242kXxn2TrKwNrU1IQTJ06QI/nuLcDLTeS77TqcZ4K6SmUSdakDapglNC9cuBD4u1ZfXz97TTniL51Os4sNUO1Mznef2ielUiny+YTtyY8KxpPPgTo5dlssgxT4gHwJTTfUMae+vh75fJ68UsupWGT+RnKSL72BobP/kojk29h1OBarKKEiX5nHsmXLSKW0kskkRkdHrew60lH2MD5D2itIjTqZyRZli3TgsxKaHJFvK5K5SEycnHYd7j2j2m+4uwg7BzGJlTC3J1diudv5nFKvqa1dh3t9OJF86vm4RXjQgjQMkW+TeFtfX896tguFAkZHR5FKpdjnFzRhi3zOmDMwMIDu7m7P47i7CAPyiffSnnx3pSzJFXPqOJtMJpHP5wM9jzBQka/M46//+q9x6aWXeh5nxCJHpJgERekoO8DbEMcGaf84QBMSZmJArWhRU1ODxsZGlsjnVqexJSrVdYCL1546geVUywDCjeRLRcJsrilX5BcKBaucBerfJJNJsnAKI/E2ipF8Gy+y7cQ16Ept0om9bgqFAnnVrLm5GVdccYXnceZd5lT6CjNJVMquI9l/OZ9pah9vgprlhop8ZR7UjqSxsXFW5FP/xohYiWRDAPOq65RbwpHNgOqM5FMFS1NTk5VdpxxFvjOqxT1/rl2Hc05hed53+coAACAASURBVPKlE8Q517StrQ3XXnst6VgThbWZBHESb6Ni14myJ5/zvc2zR13pkCzBLJ1464fu7m5ceeWVnsc5y5JyIvlh2nWCHhOkPflOCxp1BTyZTCKXy7Grg5UaFfmKNSaSz/HkGxErHWUHwrHrSFpLOH8zOTlJ2iLdkMlkrCP5koOk1MTJKfK5dp2g614Dc21ZEhNem11+Odh4WoGLvtZbbrmFdKx5rm1KjEqI/EqL5HOq6+RyObKQM+OC5DlRcYtd6cRbDg888ABWrlxJPp7jyQ+zprvEOGu7sR0VZzBtdHSU1AeYYJdNDmIpUZGvWJNKpZDL5awj+RICXDohyImUtYQbyTcCkzMIrFq1ilxdJwxPvrNcmqRdh3P+5l5Qlt/N5llUnJOCiYkJkUiYpKfVpiypzWcYkW9j15FIvHUmGwcdgQ5L5BcKBVYydjweR19fH7m/SKfTVhulSRC2J58Dd0LDFflhrQpJvP/SK5HO1SnOConN8aUmGk+7UpakUikru45kJN898AYdGXIShiefgplscSL5Dz30kNU5SSVZmQh+GHYdTpLoyZMnSccmEgkMDQ2Rz6mhoWFW5M/MzIhWp5COhEmJfDO55NiZuJPF9evXk5IfAbva2hzCEPnGBjE9PU3uf+vr69ki3zbpVsKTH1WRzyVKkfxYLDa7KiIt8qX6L/OucYMInPsQBcrzaa8Q9uzZMy+a0tPTg56enhKdEQ8zYExMTJAHAGckPwq75PohKp58M9nK5/Pkrck5+PG0U9s3g29UNsMCLuYtUG0HnZ2dOHToELnthoYG0UoNtqsXtu1LCCfzGZK2u9raWrIglbZAhbHjrbHeTU1NkYVNXV0d+vr6SEmiwMX+KAqVdYDKEvn5fB4rVqwgHSudeGvezUQiITImOO+bhJ0xFotZl25Vka+Q2b9/f1kt+ywEN5JvBm6JxFvJyL0baWsJlXQ6zY7kc3DvnihdE1nymnL8lI2NjWRxuWbNGnz44Ydob28nHc/18HORvme2FYs4OPfhkM7foSD9ncOI5JvP4Kykmkj+n/zJn5CO9xPJDxp3dR0pT36hUBAfezjVdUxgRiqp2SSuJhIJ8epgUlrBlnIT+erJV3zDmWmbSJJ05RtJpP3j3Gie8ReOjIywdrG1OScpO42J2khvrMIp7dfU1MQaVAuFAtauXUs6vtwj+e7EWymRPzk5ySpLKCm0wrQQSIkzm4lTQ0MDzp49y7LrpNNp8jk575lE4q07PyDozwirKhLHCy6dJOp8/6XtOmHsqUOlpqYGo6OjZSXyNZKv+IYTyTeCVGp2LlmODfhs0JC0lnDtOgYpke+060hske6MtklH8jnPamNjI2uA3L9/P/n6V1okX9KuExWkd9N2VrGSsAICdiupXV1dLE9+Y2OjVT80PT0d+M7M7ki+BOaaSgrRdDqNvr4+duKtVJJoGCJf0q5jS2NjI86dO6ciX6keYrEYe5MOyUi+8fJJlUlz+8ejUELTMDw8LCLypSNVUbXrNDU1sTpzaklSgL+LKBdpz7ztZlgcbJ476Um+QcqHbGpwS1YsMsnMVFEaj8fR1dVF7ls2bdqE9evXs89NIuochn0zjEh+JpPB0aNHyf2RieRLiXxnMEq6hGZU7HrAxT7+zJkzpM1Co4LadRRfJJNJ9PX1RcaTH2Yt66hF8jkVMzhIJwRKi3y3XYcTyZeKIEmLD2m7Thh7J9hE8s2O2tJIJ3BKXVNz37jCaf369eSk/pqaGtZ7Yyq1cN7NKBHGilMmk8GZM2fYkXwp/7jtPhlUwrLrcAN15j6UUy6linzFF6bMIHUAcIp8ydraUlRChQ0uTkEngduTL7E6YmPXaW5uFklkDgNpu05Ynnzuu9DY2IjHH388cNuHmzB2fpbsH7lBlh/+8IesjZs4mCTOcttkyGD6bM7eA1wymQxGRkbIuQ5GJEtF8p07fEsl3jrtOlLPBff6ZDIZnD17Vu06SvWQTqdx/vx58kseRiQ/zK3ng47I2kbylyxZImb/kGwbCNeTz2m/paUF3//+9wM9l7CQjuS771lUJuyZTAZvvvkmDhw4EPj5OJEW+VGrWCT5XROJBMbHx1lJ8VHCWZZUKuKcyWSwefNm8iTCiHzJSL6kXc+ZByZZpCOfz7MCOcauU06TUY3kK75IpVKsF9AM3LlcTqTMmnR94DDat4nkX3LJJdY2Hy+cUVsJnEuzEgmHfpLvpDtzqeifdCTfnYQaFbtOU1MTzp8/L37fwhD5Utd0YmIiUmUJzW7R5W7XkUwQvfTSS1n755R74q1zEiFR7MEwOjrKjuT39vaiq6tL5HwkiGwkP5/P47nnnsOxY8dw7NgxjIyMYOfOndi1a9e8Y8fGxvD000/jzTffRDabRUdHB+68807ccMMN1sdKtFmJpNNptLS0kI83HaJkucfJyUnMzMyI+J6lVwrMOXPP/6abbsKxY8dEzikMkS9ZQjMWi4W6fwIHqeifu/qNZOKalOBtaGhAf38/628ymQwrAdoWKRFukFwd4SbeSmOsH+Uu8iWvaXd3N3lnZuCz6l35fF4kku9ccZawWEqPs+YzhoeH2SJ/w4YNItpFisiK/Gw2i5deegnd3d3Yvn07Xn755QWPffjhh/Hxxx/jnnvuQXt7O15//XU88sgjmJmZwU033WR1rESblUg6nWbtsmo6RMlKMGbpNCo+YRtGR0dZKx3r16/H9773PZFzcfovJZC260QZKYuCe28DydyCqakpkWhhW1sb3n//fdbfZDIZLF++PPBzcSMlwp3tS66OTExMhDIZouAU+VFZXeAQRiSfSyqVmq3nzgnCUYnH4xgaGpr9d9BBlPr6egwPDwfaZrHPGBwcZPVd7e3t+O53vyt4VsET2dG0ra0NBw8eRCwWw/Dw8IIi/9ChQ3j33Xexd+9e3HjjjQAulvDq7e3FgQMHcP3118/OMqnHSrRZqXAj+SYqnMvlWBumUDEiXCp6GZbIHx4eZg3CsVgMbW1tIudiEuOkcNp1OBsflTv19fXI5XJiz6l09RuDlCBduXIlTp06xa5+EYbIL1dPvul/o2jXKdfEWzMmRGl1JJVKIZfLoaGhQdyuI0EY46yNyK+rq8OWLVsEzyp4IjuaUpfY33nnHSQSCVx33XVzfn7zzTfj/Pnz+Oijj9jHSrRZjHw+T/pf1KqtOGltbUVHRwf5+HQ6jWw2KxqpMh2uVCRfenMVQG5jKxuka7o7RX41kUgkMDQ0JBbJd+4NICnopARpU1MTzp07xxJOHR0d2L59e+Dn4kZ6x26piVkymUQ+n49U7XG16wSPEflhJN5K4KeUNBUj8su1ghqVyEbyqRw/fhwdHR3zoj3Gv3b8+PHZjTmox0q0WYx7772X9B0XykWIApdccgkuueQS8vGZTGbOMl/QODfbko6QShIlkS9t1ym29Xw10NDQICbynZEwaZEvZV2JxWLsiHNrayu+/OUvB34uTgqFQtlG8pPJJHK5HGZmZiITyXdW15GwlkhjotpRsuskk0mMjo6GkngrQRilpOvq6jA4OIgrr7xS9HNKTdmL/Gw2W7R+r7GCZLNZ9rESbRbjwIEDpBdQcjAJm3Q6jZGREbH2nXadcvbkc+06khi7jkSCFRDO1vOFQiG03VCpNDQ0YHBwUGQyGua28JJ2oLq6Opw6dUqkbRvM+z89PS1WK7tQKIhNnIxXu7a2NjJR5zCq6xQKBbHk+0QigZGRkUhZoMz7H8ZmWBKEEcmPx+M4e/ZsWW1sZUPZi/xyRsovF2Vqa2tFxZb00mlYIn9kZATt7e3in0PBuZwuMWCEYdeJxWKRS+o1dh1psSUt8iXbf+ihh3DixAmRtm0w/cvU1JRY4QATpJB4Vo2NIx6PR0rkDw4Oiol8Y7GsqakRyfdJJBI4d+5cpCxQBslIvuTqbpiR/Eq360TWk0/FeLzdmJ85kzupx0q0qXxGPp8Xi9hUQuJtXV0dent7I2PXMVEVqQHD6R+XnABKnb8txq4j7UOWTmiUFPltbW3Ytm2bSNs2mPrjUiuF5l2QmpAau45UhNcGU+5xbGxMVJBKvQcmCBKlSL5hbGxM5DtXQiTfJvG2HCl7kd/d3Y2TJ0/O8/QeP34cALBmzRr2sRJtKp9x4cIF/NEf/ZFI285KB1HZhZNLc3Mzjh8/Hhm7jlnmlhLJZpCXRmoDNlvCiuRLlSY0NqsoeZGlca4USot8qb0HRkdHI/UuGJEsNfEwdkMpwWv6rygl3hqkqpWF5cm/cOGCmM2qrq4OQ0NDGsmPOtu3b8fY2BjefvvtOT9/5ZVX0NLSgnXr1rGPlWhT+YxMJiOW7CJt15Hu3ICLIv/o0aNobm4W/RwuUiK/oaFBXOTX19fj/PnzkRE2QPnbdaJYOlAaIz6krGtOO5CEyDd2ySitakmLfBPJl7pnRuRH0a4jRVjVdaampsQCCPX19RgaGorMeyBFdAyqRTh06NDsDBwATpw4gbfeegsAcPXVVyMej2Pbtm3YsmULHnvsMeTzeaxatQpvvPEGDh8+jPvvv39OoiD1WIk2lc+45ZZbxES+dOJtWCI/n89HSpACENs9saGhAfl8PvB2ncTjcfT19UUqaiNZXceJlI3ADPTVFMk31bWkosLO/kv6mkZlF2jp3VlNJL9QKIhH8qP0HphcBwmk7TRmMi3Zt9TX16O9vb3iJ2aRFvk/+9nP0NvbO/vvt956a1bkP/HEE7Mv7L59+/DUU0/hmWeeQTabRUdHBx544AHccMMN89qkHivRpnKRL33pS2JtO/2REi9vGF7B5uZmVlnSsAjDriMlPBoaGtDX1xepiZNknXwnMzMzIsGGKO70KY35zlJRYTNxki7RGaVKU9J18k1gZmZmRtSTH7VIfltb26xtOGhqampQKBQwMzMj0n4Yew/U1dVh48aNIm1HiUiL/CeffJJ0XCKRwO7du7F79+7AjpVoU5HHRIWlBknpcpLARZF/6aWXirTtB0mRLx3JTyQS6O/vx9q1a0U/h4OJ5EdJGHAw4ilqVYskMZF2yUi+pCcfkC0naYMRydL+8QsXLohG8qM22W1raxNPrp6cnBS5pibBXfKadnZ24otf/KJI21GiOnpmpWow/m5pT34ulxOzfmzevHl2M7UoMTY2hmXLlgXebhh2nUQigRMnTuCqq64S/RwOiUQCw8PDkRIGHJwbw0VJNEoiHcl3evKlJk5Lly4VX43kIF2O0fTZU1NTYiWAL1y4ELnclBUrVoj7zaVWX0x/InlNL7vsMlx22WUibUeJsk+8VRQnRjCGIfKlrB9Lly5Fa2urSNu2FAoFjI6Olm11nUQiETlPfkdHBwCIDWJLliwRTY6TTr6LIiaSL1WxyLnZlpTI7+zsjNTKi7F+SOFMvJUsJRs1kb98+XLxSL7Ue2CI2jUtR1TkKxWFtF0nDJEfRZqamnDmzBmx6KV0ZLGhoQH9/f2RumdGaEkJHLO7qRQm6hwlf7c0zu8saS2R9OR3dXVF6j2QRrp6jyFqnvyVK1eKBzWk9+CQnkRUAyrylYrCbJFezpH8KHL55ZfjtddeQ2dnZ+Btm6XZQqEgJhhNdZ2o3bP/+q//wvr160XaNrubShHGnhFRQ/o7m0h+Pp8XE2hr1qypqk0aTR6VdCR/eHg4MnubABftOt/73vdEP0Mj+dEnOmt2VciePXvmRYN6enrQ09NTojMqf4w/UjKSPz4+XnUif+3atWhqahLbhTcWi4n5nIGLkfxsNhupQRiAqC1LWuSHUU42akjveG0mEZL9y8aNG7F8+XKRtqNIPB7H2bNnMTExIRrJl5yY2SJt15FONo5aWdJyREV+Cdm/f3/Fb8RQKqQqwSxZsgTT09NVJ/LXr1+PHTt2iH6GZCTM7EgtGcmLGtIi35l4Wy3U1dXhqaeeEhMedXV1GB8fRzabFc35MfkgUWFmZkYsT8BZjEHq/a+pqRGd/EUVqSpThqhVLCpH1K6jVCSDg4MiO8bGYjHEYjHkcrmqWvJuamrC7bffLtZ+oVDAyMiI2DW97rrr8Ktf/Uqk7aiSSqWQzWbFKt9UayT/yJEjYpOnatx7ALgo5qTefZPYn81mxT5j9erVohWCokhDQwMGBwfVrhNxVOQrFcnQ0BAymYxY+9UWyZempqYGg4ODYnagpUuXikz6okwqlcLp06fFhI3ZlbKaMBMmqehlMpmcTZaulrKkwMX3c8OGDSJtG5E/MDCAlpYWkc9Ys2aNSHnhKNPY2Ij+/n6xd2Hp0qXI5XIq8n2iIl+pSCQ3kwGA0dFRFfkBsnr1anzwwQeR88yXM6lUCqdOnRKb3JiqSBJVZqLK9PQ0ADmvc2NjI0ZGRkTajjLxeBxbtmwRaduI/PHxcTF7bFdXV+TKHkuTSqXQ19cnFsnPZDLo7e2tqhUtCaqnd1aUgCgUChgaGlJBGiBr1qzBkSNHqsoCJU06ncbx48fFntNEIoHBwcGqirTdeOONePXVV7FixQqR9qtV5P/lX/6l2MZEYezDsXXrVtxzzz2inxE1Ghsb0dfXJxbJb25uxtmzZ6uqf5FARb5ScaRSKXGvsKR/vBrp7u7G7373O504BcjKlSvxv//7v2K2tdbWVpw4caKqkpmBi+Jm3759Ym1Xo8hft24damtrRdo2dfIlWbJkSdVF8tPptKhdJ5PJ4Ny5cxrJ94mKfKXi+NznPicuPCSrQVQjV155JQqFgpgnvxppbm7GxMSEmF1n+fLl+P3vf49Vq1aJtB9lpPzy8XgcuVxO+5YAMZVv9JoGixH5UiK8ublZRX4A6FOvVBzXXXedeEJgNe3yGQaJRAIPPfQQ2tvbS30qFUMsFkN7e7tYJN9U11i9erVI+9WIqdxVbVFhaQYGBnDllVeW+jQqinQ6LWrXMZF8tev4QyP5SsWRyWRwxx13iLXf2toqWn+8Wtm+fXvVWT+kWb16tWiVqeXLl6vID5hcLofu7u5Sn0ZFkcvlNIAQMOl0GmNjY2Irhd3d3ZientZIvk9U5CsKk66uLq2so5QF99xzj6idRkV+8DQ2NmrUOWDi8Tg6OztLfRoVRWdnJ37wgx+IrTqtXLkS69ev17HWJyryFYVJZ2enJogqZcGWLVtEl7u//e1vY/ny5WLtVyPr168XqxlfrTQ0NKCrq6vUp1FRpFIp0Q0SAeCpp55Ske8T9eQrCpN169bh1KlTpT4NRSk5W7duLfUpVBx79+4t9SlUHOl0Gh0dHaU+DUUJHY3kKwqT1atX42tf+1qpT0NRFEUh8JOf/ETzfZSqRCP5JWTPnj3zdovs6elBT09Pic5IURRFUSoLqZ1uFSXqqMgvIfv379fOR1EURVEURQkctetUEVNTU3j22WfFa8grlYk+P4ot+uwoftDnR/FDNT8/KvKriKmpKRw8eLAqH3TFP/r8KLbos6P4QZ8fxQ/V/PyoyFcURVEURVGUCkNFvqIoiqIoiqJUGCryFUVRFEVRFKXCUJFfQl566aVSn0Io/Od//mfFf2Y1fMdSofeycj4zbKrlulbDO1IK9F5WzmeGTVS+o4r8EqIiv3I+sxq+Y6nQe1k5nxk21XJdq+EdKQV6LyvnM8MmKt9RRb6iKIqiKIqiVBgq8hVFURRFURSlwlCRryiKoiiKoigVxpJSn0A1UigUAAAzMzPI5/Ohfa75rDA/Ewj/e5biM6vhO1bL81MN9zLsz6yWZ6daPlP7nsr5zGr4jqV4fqS/o2nb6MmFiBW8jlACp7+/H/fee2+pT0NRFEVRFEUpUw4cOIDW1tYFf68ivwTMzMzg/PnzSCQSiMVipT4dRVEURVEUpUwoFAoYGxtDS0sLamoWdt6ryFcURVEURVGUCkMTbxVFURRFURSlwlCRryiKoiiKoigVhop8RVEURVEURakwtIRmFTA2Noann34ab775JrLZLDo6OnDnnXfihhtuKPWpKRHnd7/7Hfbt21f0d4888giuuOKKkM9IiSL5fB7PPfccjh07hmPHjmFkZAQ7d+7Erl275h2r/ZHihvr8aH+kFOO9997Da6+9hg8++AD9/f1IJpNYu3Yt7r77blx++eVzjq22/kdFfhXw8MMP4+OPP8Y999yD9vZ2vP7663jkkUcwMzODm266qdSnp5QB3/jGN/DHf/zHc362Zs2aEp2NEjWy2SxeeukldHd3Y/v27Xj55ZcXPFb7I8UN5/kBtD9S5vLLX/4S2WwWt912Gzo7OzEyMoIXXngBe/fuxYMPPojNmzfPHltt/Y+K/Arn0KFDePfdd7F3717ceOONAIBNmzaht7cXBw4cwPXXX4/a2toSn6USdVavXq1RMmVB2tracPDgQcRiMQwPDy8o0rQ/UopBfX4M2h8pTr7zne8gk8nM+dnWrVuxe/duPP/887Mivxr7H/XkVzjvvPMOEokErrvuujk/v/nmm3H+/Hl89NFHJTozRVEqhVgsRtrzQ/sjpRjU50dRiuEW+ACQSCTQ1dWF/v7+2Z9VY/+jIr/COX78ODo6OubNTru7u2d/ryhePP744/jqV7+KHTt24Ic//CH+8Ic/lPqUlDJE+yMlCLQ/UrwYHR3F0aNH0dXVNfuzaux/1K5T4WSzWaxcuXLez9Pp9OzvFWUhGhoacNttt2Hjxo1obGzEmTNn8Itf/AL79u3Dj370I2zdurXUp6iUEdofKX7Q/kih8vjjj2N8fBw7duyY/Vk19j8q8hVFWZDLLrsMl1122ey/r7zySmzfvh1/9Vd/hQMHDuigqihKaGh/pFB4+umn8dprr+G+++6bV12n2lC7ToWTTqeLzk7Nz8wMVlGopFIpXHPNNfjkk08wMTFR6tNRygjtj5Sg0f5IcXLw4EE899xz+PrXv45bb711zu+qsf9RkV/hdHd34+TJk7hw4cKcnxvvmZYdU2woFAoAoMlyCgvtjxQJtD9SgIsC/9lnn8WuXbvm2HQM1dj/qMivcLZv346xsTG8/fbbc37+yiuvoKWlBevWrSvRmSnlSi6Xw29+8xtceumlqKurK/XpKGWE9kdK0Gh/pADAz3/+czz77LO46667sHPnzqLHVGP/o578Cmfbtm3YsmULHnvsMeTzeaxatQpvvPEGDh8+jPvvv7/iasIqwfLII49g+fLlWLt2LRobG3H69Gm88MILGBoawt/8zd+U+vSUCHHo0CFMTExgbGwMAHDixAm89dZbAICrr74a8Xhc+yNlQSjPj/ZHSjFeeOEFPPPMM9i6dSu2bduGDz/8cM7vzZ4K1dj/xApmnUupWMbGxvDUU0/N2cb5L/7iLyp2G2clOJ5//nm8+eabOHfuHMbGxpBOp7FhwwbceeedFRn1UOz51re+hd7e3qK/e+KJJ7BixQoA2h8pxaE8P9ofKcX427/9W/z+979f8Pcvvvji7H9XW/+jIl9RFEVRFEVRKgz15CuKoiiKoihKhaEiX1EURVEURVEqDBX5iqIoiqIoilJhqMhXFEVRFEVRlApDRb6iKIqiKIqiVBgq8hVFURRFURSlwlCRryiKoiiKoigVhop8RVEURVEURakwlpT6BBRFUZTy4c///M9Zx7e1teHJJ5/EuXPn8O1vfxsbN27Ej3/8Y6GzUxRFUQwq8hVFURQyf/qnfzrvZx988AHOnDmDSy65BJdccsmc3zU2NoZ1aoqiKIqDWKFQKJT6JBRFUZTy5Z/+6Z/w6quvYufOndi1a1fRY6anp3HmzBnU19ejra0t5DNUFEWpPjSSryiKooizZMkSdHZ2lvo0FEVRqgYV+YqiKIo4C3nyf/3rX+PRRx/Fzp078YUvfAH/+q//iiNHjmB6ehrr16/Ht771LXR1deHChQv493//d7zyyivo6+tDa2srvvrVr6Knp2fBz3v++efx29/+FufPn0dDQwM2btyIu+++e56lSFEUpRJRka8oiqKUnHPnzuH+++9HMpnExo0bcebMGRw+fBhHjx7FT3/6U/zzP/8zjhw5giuuuAIrV67EkSNH8Pjjj2PJkiW45ZZb5rT1hz/8AX//93+PfD6Prq4ufO5zn8PAwADeeecdHDp0CD/60Y+wadOmEn1TRVGUcFCRryiKopScV199Fbfffjvuvfde1NTUoFAo4NFHH8Urr7yCv/u7v0NNTQ0ee+wxtLa2AgDee+89/OAHP8C//du/zRH5+Xwe//iP/4jJyUl8//vfx7XXXjv7u3fffRcPPvgg9u/fj3/5l3/B0qVLQ/+eiqIoYaF18hVFUZSSs2rVKnzzm99ETc3FYSkWi+H2228HAHz66afYvXv3rMAHgM2bN+PSSy9Fb28vzp07N/vzX/3qVxgcHMQdd9wxR+ADwJYtW/Bnf/ZnGBgYwG9+85sQvpWiKErpUJGvKIqilJyNGzeitrZ2zs9WrlwJ4GLS7saNG+f9zapVqwAAg4ODsz979913AQDbt28v+jkbNmwAAHz88cf+T1pRFCXCqF1HURRFKTnLli2b97N4PA4AaG5uno3wO6mvrwcATE1Nzf7MRPXvv//+RT9vZGTE+lwVRVHKARX5iqIoSsmJxWJWv3MzMzMDALj22mtnJwHFWLduHf3kFEVRyhAV+YqiKErF0NrailOnTuGuu+7SUpmKolQ16slXFEVRKobNmzcDAP77v/+7xGeiKIpSWlTkK4qiKBXDV77yFTQ1NeH555/Hr3/9axQKhTm/Hx8fx6uvvor+/v4SnaGiKEo4qF1HURRFqRhSqRT27duHhx56CI8++igOHjyIrq4uLF26FH19fTh58iTGx8fx6KOPzinJqSiKUmmoyFcURVEqig0bNuCnP/0p/uM//gOHDh3CkSNHUFtbi5aWFlxzzTX4/Oc/j87OzlKfpqIoiiixgnstU1EURVEURVGUskY9+YqiKIqiKIpSYajIVxRFURRFUZQKQ0W+oiiKoiiKolQYKvIVRVEURVEUpcJQka8oiqIoiqIoFYaKfEVRFEVRFEWpMFTkK4qiKIqiBU3sPAAAAEJJREFUKEqFoSJfURRFURRFUSoMFfmKoiiKoiiKUmGoyFcURVEURVGUCkNFvqIoiqIoiqJUGCryFUVRFEVRFKXC+H+KNt+x1g5pPQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Flat_lc(test).plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulate one star in different locations and brightnesses many times" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "xposition = []\n", + "yposition = []\n", + "for i in np.arange(0,100):\n", + " image = Simulate_Image(imageshape=(11,11),star1pos=[5,5])\n", + " lc = Create_LightCurve(image)\n", + " pg = Create_Periodogram(lc)\n", + " fhp = frequency_heat_plot(pg,low=9.5,high=10.5)\n", + " loc = Find_Centroid(fhp)\n", + " xposition.extend([loc[0]])\n", + " yposition.extend([loc[1]])" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'xposition' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhist2d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mxposition\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0myposition\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mbins\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;31m#plt.scatter(xposition,yposition)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'xposition' is not defined" + ] + } + ], + "source": [ + "plt.hist2d(xposition,yposition,bins=5)\n", + "#plt.scatter(xposition,yposition)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([4.97730812, 5.02160851]), 4.999971650040226)" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#xhist = np.histogram(xposition,bins=100)\n", + "#yhist = np.histogram(yposition,bins=100)\n", + "\n", + "np.quantile(xposition,[.05,.95]),np.mean(xposition)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([4.97901203, 5.02261124]), 5.000342892287856)" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.quantile(yposition,[.05,.95]),np.mean(yposition)" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "xpos = []\n", + "ypos = []\n", + "for i in np.arange(0,100):\n", + " image = Simulate_Image(imageshape=(11,11),star1pos=[1,1])\n", + " lc = Create_LightCurve(image)\n", + " pg = Create_Periodogram(lc)\n", + " fhp = frequency_heat_plot(pg,low=9.5,high=10.5)\n", + " loc = Find_Centroid(fhp)\n", + " xpos.extend([loc[0]])\n", + " ypos.extend([loc[1]])" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[ 2., 2., 1., 1., 0.],\n", + " [ 2., 7., 3., 2., 0.],\n", + " [ 1., 5., 14., 6., 1.],\n", + " [ 3., 3., 16., 7., 4.],\n", + " [ 0., 0., 4., 10., 6.]]),\n", + " array([1.3216241 , 1.34295334, 1.36428258, 1.38561181, 1.40694105,\n", + " 1.42827029]),\n", + " array([1.33093094, 1.35291088, 1.37489083, 1.39687078, 1.41885072,\n", + " 1.44083067]),\n", + " )" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist2d(xpos,ypos,bins=5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([1.34123792, 1.42416661]), 1.3850751759378905)" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.quantile(xpos,[.05,.95]),np.mean(xpos)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([1.35189323, 1.42869432]), 1.3898605964480095)" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.quantile(ypos,[.05,.95]),np.mean(ypos)" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [], + "source": [ + "data = np.asarray([xpos,ypos])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from photutils import centroids as cent" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## New fitting with photutils" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([4.99532993, 4.9851858 ])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cent.centroid_1dg(fhp)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7.317515242428074, 7.245791867238815)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Find_Centroid(fhp)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([7.31751524, 7.24579187])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cent.centroid_com(fhp)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(fhp,origin=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "nostar = Simulate_Image(imageshape=(30,30),star1flux=0,star1pos=[15,15],freq=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(nostar['stars'][0],origin=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.0797886885266915" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean(nostar['stars'][0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "search_result = lk.search_targetpixelfile('TIC239678779', mission='TESS', sector=19)\n", + "tpf = search_result.download(quality_bitmask='default')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "def make_pg(targetpixelfile, method = 'LombScargle'):\n", + " \n", + " #Defining an aperture that will be used in plotting and making empty 2-d arrays of the correct size for masks\n", + " aperture = targetpixelfile.pipeline_mask\n", + " tpf = targetpixelfile\n", + " #Initiating a python list since this is computational slightly faster than a numpy array when initially storing periodogram\n", + " pg = []\n", + "\n", + " \n", + " #Iterating through columns of pixels\n", + " for i in np.arange(0,len(aperture)):\n", + " \n", + " #Iterating through rws of pixels\n", + " for j in np.arange(0,len(aperture[0])):\n", + " \n", + " \n", + " #Making an empty 2-d array\n", + " mask = np.zeros((len(aperture),len(aperture[0])), dtype=bool)\n", + " \n", + " #Iterating to isolate pixel by pixel to get light curves\n", + " mask[i][j] = True\n", + " \n", + " #Getting the light curve for a pixel and excluding any flagged data\n", + " lightcurve = targetpixelfile.to_lightcurve(aperture_mask=mask)\n", + " lc = lightcurve[np.where(lightcurve.quality == 0)]\n", + " lc = lc.flatten(window_length=3001)#ask about this\n", + " lc = lc.remove_outliers()\n", + " if method == 'bls':\n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(method = 'bls')\n", + " periodogram.power = periodogram.power / np.median(periodogram.power)\n", + " periodogram.power[np.where(periodogram.power<0)] = 0\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " elif method == 'LombScargle':\n", + " #Making a periodogram for the pixel\n", + " periodogram = lc.to_periodogram(minimum_frequency = 1,maximum_frequency=1000,freq_unit= u.microHertz)\n", + " periodogram = periodogram.flatten()\n", + " #Extending the list of periodogram data for each pixel\n", + " pg.extend([periodogram])\n", + " \n", + " #Taking the final list and turning it into a 2-d numpy array witht he same dimensions of the full postage stamp \n", + " pg = np.reshape(np.asarray(pg),(len(aperture),len(aperture[0])))\n", + " \n", + " #Defining self.periodogram as this 2-d array of periodogram data\n", + " return [pg,(tpf.astropy_time.max()-tpf.astropy_time.min()).value]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "pg_image = make_pg(tpf)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "def frequency_heat_test(pg,timeserieslength,frequency):\n", + " heat_stamp = []\n", + " \n", + " for i in np.arange(0,len(pg)):\n", + " for j in np.arange(0,len(pg[0])):\n", + " mask = np.zeros((len(pg),len(pg[0])), dtype=bool)\n", + " mask[i][j] = True\n", + " \n", + " period = pg[mask][0]\n", + " normperiod = np.asarray(period.power)/np.nanmedian(np.asarray(period.power))\n", + " freq = np.asarray(period.frequency)\n", + " sums = 0 \n", + " background = 0\n", + " for k in np.arange(len(frequency)):\n", + " sums += np.asarray(normperiod[np.where((freq < frequency[k]+(1/timeserieslength) ) & (freq > frequency[k]-(1/timeserieslength)))]).sum()\n", + " background += len(np.where((freq < frequency[k]+(1/timeserieslength) ) & (freq > frequency[k]-(1/timeserieslength)))[0])\n", + " heat_stamp.extend([sums-background])\n", + " \n", + " heat_stamp = np.reshape(np.asarray(heat_stamp),(len(pg),len(pg[0])))\n", + " return heat_stamp" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "heatmap = frequency_heat_test(pg_image[0],pg_image[1],[97.87963868,92.03828453])" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "def tdg_fit(heatmap_data):\n", + " \n", + " def two_dGaussian( shape , amplitude, xo, yo, sigma_x, sigma_y, offset):\n", + " x,y = np.meshgrid(shape[0],shape[1])\n", + " xo = float(xo)\n", + " yo = float(yo) \n", + " a = 1/(2*sigma_x**2)\n", + " b = 1/(2*sigma_y**2)\n", + " g = offset + amplitude*np.exp( - (a*((x-xo)**2) + b*((y-yo)**2)))\n", + " return g.flatten()\n", + " \n", + " c = cent.centroid_2dg(heatmap_data)\n", + " x = np.arange(0,np.shape(heatmap_data)[0])\n", + " y = np.arange(0,np.shape(heatmap_data)[1])\n", + "\n", + " initial_guess = (heatmap_data.max(),c[0],c[1],1,1,np.nanmedian(heatmap_data))\n", + " popt, pcov = opt.curve_fit(two_dGaussian, (x,y),heatmap_data.flatten(), p0=initial_guess)\n", + " \n", + " return popt,pcov\n" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1. , 1.00000001, 1.00000033, 1.00000403, 1.00001808,\n", + " 1.00002981, 1.00001808, 1.00000403, 1.00000033, 1.00000001,\n", + " 1. ],\n", + " [1.00000001, 1.0000009 , 1.00002981, 1.0003632 , 1.00162775,\n", + " 1.0026837 , 1.00162775, 1.0003632 , 1.00002981, 1.0000009 ,\n", + " 1.00000001],\n", + " [1.00000033, 1.00002981, 1.00098728, 1.01202751, 1.05390358,\n", + " 1.08887197, 1.05390358, 1.01202751, 1.00098728, 1.00002981,\n", + " 1.00000033],\n", + " [1.00000403, 1.0003632 , 1.01202751, 1.14652511, 1.65667999,\n", + " 2.08268227, 1.65667999, 1.14652511, 1.01202751, 1.0003632 ,\n", + " 1.00000403],\n", + " [1.00001808, 1.00162775, 1.05390358, 1.65667999, 3.94303553,\n", + " 5.85224528, 3.94303553, 1.65667999, 1.05390358, 1.00162775,\n", + " 1.00001808],\n", + " [1.00002981, 1.0026837 , 1.08887197, 2.08268227, 5.85224528,\n", + " 9. , 5.85224528, 2.08268227, 1.08887197, 1.0026837 ,\n", + " 1.00002981],\n", + " [1.00001808, 1.00162775, 1.05390358, 1.65667999, 3.94303553,\n", + " 5.85224528, 3.94303553, 1.65667999, 1.05390358, 1.00162775,\n", + " 1.00001808],\n", + " [1.00000403, 1.0003632 , 1.01202751, 1.14652511, 1.65667999,\n", + " 2.08268227, 1.65667999, 1.14652511, 1.01202751, 1.0003632 ,\n", + " 1.00000403],\n", + " [1.00000033, 1.00002981, 1.00098728, 1.01202751, 1.05390358,\n", + " 1.08887197, 1.05390358, 1.01202751, 1.00098728, 1.00002981,\n", + " 1.00000033],\n", + " [1.00000001, 1.0000009 , 1.00002981, 1.0003632 , 1.00162775,\n", + " 1.0026837 , 1.00162775, 1.0003632 , 1.00002981, 1.0000009 ,\n", + " 1.00000001],\n", + " [1. , 1.00000001, 1.00000033, 1.00000403, 1.00001808,\n", + " 1.00002981, 1.00001808, 1.00000403, 1.00000033, 1.00000001,\n", + " 1. ]])" + ] + }, + "execution_count": 169, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_dGaussian( shape , amplitude, xo, yo, sigma_x, sigma_y, offset):\n", + " x,y = np.meshgrid(shape[0],shape[1])\n", + " xo = float(xo)\n", + " yo = float(yo) \n", + " a = 1/(2*sigma_x**2) \n", + " b = 1/(2*sigma_y**2)\n", + " g = offset + amplitude*np.exp( - (a*((x-xo)**2) + b*((y-yo)**2)))\n", + " return g\n", + "x = np.arange(11)\n", + "two_dGaussian((x,x),8,5,5,1,1,1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "test = tdg_fit(heatmap)" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.59470728, 0.07730971, 0.07370782, 0.08235371, 0.0784179 ,\n", + " 0.1103204 ])" + ] + }, + "execution_count": 176, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.sqrt(np.diagonal(test[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'cent' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mheatmap\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0morigin\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcent\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcentroid_2dg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mheatmap\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mmarker\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'X'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'r'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'cent' is not defined" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "plt.imshow(heatmap,origin=0)\n", + "c = cent.centroid_2dg(heatmap)\n", + "\n", + "plt.scatter(c[0],c[1],marker='X',s=100,c='r')\n", + "\n", + "plt.scatter(test[0][1],test[0][2],marker='X',s=100,c='black')\n", + "\n", + "plt.contour(x,x,two_dGaussian((x,x),*test[0]),8,alpha=1,cmap='Greys')\n", + "\n", + "plt.scatter(gaia_data['x'][np.where((gaia_data['x']>=0)&(gaia_data['x']<=len(heatmap[0])-1)&(gaia_data['y']<=len(heatmap[0])-1)&(gaia_data['y']>=0))],\n", + " gaia_data['y'][np.where((gaia_data['x']>=0)&(gaia_data['x']<=len(heatmap[0])-1)&(gaia_data['y']<=len(heatmap[0])-1)&(gaia_data['y']>=0))],\n", + " marker='o',\n", + " alpha=.9,\n", + " s=np.asarray(gaia_data['size'])[np.where((gaia_data['x']>=0)&(gaia_data['x']<=len(heatmap[0])-1)&(gaia_data['y']<=len(heatmap[0])-1)&(gaia_data['y']>=0))]*10,\n", + " c='white')" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection = '3d')\n", + "\n", + "X = np.arange(11)\n", + "Y = np.arange(11)\n", + "X,Y = np.meshgrid(X,Y)\n", + "ax.plot_surface(X,Y,heatmap)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([4.15641899, 7.4578977 ])" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cent.centroid_1dg(heatmap)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " }\n", + " finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.3.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.3.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.3.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.bokehjs_exec.v0+json": "", + "text/html": [ + "\n", + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "ff0c1f5481684a21b5a09695dbff471b" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "tpf.interact_sky()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "def add_gaia_figure_elements(tpf, magnitude_limit=18):\n", + " \"\"\"Make the Gaia Figure Elements\"\"\"\n", + " # Get the positions of the Gaia sources\n", + " c1 = SkyCoord(tpf.ra, tpf.dec, frame='icrs', unit='deg')\n", + " # Use pixel scale for query size\n", + " pix_scale = 4.0 # arcseconds / pixel for Kepler, default\n", + " if tpf.mission == 'TESS':\n", + " pix_scale = 21.0\n", + " # We are querying with a diameter as the radius, overfilling by 2x.\n", + " from astroquery.vizier import Vizier\n", + " Vizier.ROW_LIMIT = -1\n", + " result = Vizier.query_region(c1, catalog=[\"I/345/gaia2\"],radius=Angle(np.max(tpf.shape[1:]) * pix_scale, \"arcsec\"))\n", + " \n", + " no_targets_found_message = ValueError('Either no sources were found in the query region '\n", + " 'or Vizier is unavailable')\n", + " too_few_found_message = ValueError('No sources found brighter than {:0.1f}'.format(magnitude_limit))\n", + " if result is None:\n", + " raise no_targets_found_message\n", + " elif len(result) == 0:\n", + " raise too_few_found_message\n", + " result = result[\"I/345/gaia2\"].to_pandas()\n", + " result = result[result.Gmag < magnitude_limit]\n", + " if len(result) == 0:\n", + " raise no_targets_found_message\n", + " radecs = np.vstack([result['RA_ICRS'], result['DE_ICRS']]).T\n", + " coords = tpf.wcs.all_world2pix(radecs, 0) ## TODO, is origin supposed to be zero or one?\n", + " year = ((tpf.astropy_time[0].jd - 2457206.375) * u.day).to(u.year)\n", + " pmra = ((np.nan_to_num(np.asarray(result.pmRA)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " pmdec = ((np.nan_to_num(np.asarray(result.pmDE)) * u.milliarcsecond/u.year) * year).to(u.arcsec).value\n", + " result.RA_ICRS += pmra\n", + " result.DE_ICRS += pmdec\n", + "\n", + " # Gently size the points by their Gaia magnitude\n", + " sizes = 64.0 / 2**(result['Gmag']/5.0)\n", + " one_over_parallax = 1.0 / (result['Plx']/1000.)\n", + " source = dict(ra=result['RA_ICRS'],\n", + " dec=result['DE_ICRS'],\n", + " source=result['Source'].astype(str),\n", + " Gmag=result['Gmag'],\n", + " plx=result['Plx'],\n", + " one_over_plx=one_over_parallax,\n", + " x=coords[:, 0]+.5,\n", + " y=coords[:, 1]+.5,\n", + " size=sizes)\n", + "\n", + "\n", + " return source" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "gaia_data = add_gaia_figure_elements(tpf)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 7.28808609, 6.48218412, 5.72025714, 5.34355549, 5.91525351,\n", + " 8.09269374, 8.26949941, 5.40659391, 7.79830186, 5.89405286,\n", + " 6.48398161, 5.5505087 , 5.9758337 , 6.85558605, 5.34674177,\n", + " 10.88251422, 15.31167279, 8.58025188, 9.59311931, 5.63829905,\n", + " 6.92896563, 6.42457046, 6.50685317, 10.32679022])" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.asarray(gaia_data['size'])[np.where((gaia_data['x']>=0)&(gaia_data['x']<=len(heatmap[0])-1)&(gaia_data['y']<=len(heatmap[0])-1)&(gaia_data['y']>=0))]" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([65.01419239]), array([32.54329521]))" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "closest_star_mask = np.where(np.square(c[0]-gaia_data['x'])+np.square(c[1]-gaia_data['y'])==(np.square(c[0]-gaia_data['x'])+np.square(c[1]-gaia_data['y'])).min())\n", + "np.asarray(gaia_data['ra'])[closest_star_mask],np.asarray(gaia_data['dec'])[closest_star_mask]" + ] + } + ], + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}