diff --git a/docs/tutorials/lkprf_aperture_example.ipynb b/docs/tutorials/lkprf_aperture_example.ipynb new file mode 100644 index 0000000..1af6d51 --- /dev/null +++ b/docs/tutorials/lkprf_aperture_example.ipynb @@ -0,0 +1,2268 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "3b6e7a24-6180-401d-9e0b-7e7af0540ebe", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "id": "69bf5f55-8649-4c72-b0b6-fd07309f6fea", + "metadata": {}, + "source": [ + "# lkprf aperture tutorial\n", + "\n", + "## Author\n", + "Rebekah Hounsell- TESS Science Support Center" + ] + }, + { + "cell_type": "markdown", + "id": "c781e743-26f4-434e-8233-61f11653f410", + "metadata": {}, + "source": [ + "## Tutorial Goals\n", + "\n", + "This tutorial is a follow on from the lkprf TPF example tutorial. It demostrates how a user can calculate an aperture for an object of interest using knowledge of its PRF. \n", + "\n", + "There are three kinds of aperture that we will implement:\n", + "\n", + "- Simple: This computes that aperture that covers the total light of the targets PRF. This is a very simple aperture which should only be used for bright isolated stare. The user determines the level of target flux to be included within the aperture using a completeness metric.\n", + "- Strict: This aperture is calculated using a measurement of the target flux / flux from all other contaminating sources. In this method the PRF is computed for the target and for other contaminating stars within the surronding region. The cumulative signal to noise is then calculated for the target and the local minima derived. This is then used to compute the size of the aperture mask.\n", + "- Balanced: This aperture is calculated based on the level of crowding acceptable to the user and the level of flux to be excluded. It has two input parameters, the flux fraction and the crowding fraction." + ] + }, + { + "cell_type": "markdown", + "id": "12d6dcc6-d41e-4854-86d1-6548906c0925", + "metadata": {}, + "source": [ + "# Why is it important to select your aperture carefully?\n", + "\n", + "When a planet transits its host star, it blocks a small fraction of the star's light. The observed dip in brightness, or transit depth, is used to determine the planet's size. However, if other stars are included in the aperture, the measured light comes from multiple sources and as such the measured transit depth inaccurate or \"diluted\". \n", + "\n", + "This dilution can be calculated via the following equation:\n", + "\n", + "Di = Ftarget / [Ftarget + Fcontamination] \n", + "\n", + "Where a dilution factor of 1 implies no contaminating sources and less than one indicates contamination.\n", + "\n", + "The dilution factor of a given aperture is returned with each `get_aperture` call.\n", + "\n", + "An example of all three apertures and their calculated dilution factors are shown below, first for a bright isolated source, AU Mic, and then a faint crowded source TIC 120916706." + ] + }, + { + "cell_type": "markdown", + "id": "23fca8b1-c716-4117-9ede-d69ff81dfaaf", + "metadata": {}, + "source": [ + "## Downloading Relevant Packages\n", + "\n", + "In this notebook we will utilize basic packages such as numpy and matplotlib, and more advanced astronomy packages such as astropy, lightkurve, lksearch, and of course lkprf." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e300d81c-e6da-4103-b910-c6e1900cacfb", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import lkprf\n", + "import lkprf.aperture as aper\n", + "import lksearch\n", + "from lksearch.catalogsearch import query_region\n", + "\n", + "import lightkurve as lk\n", + "\n", + "from astropy.wcs import WCS\n", + "from astropy.io import fits\n", + "import astropy.units as u\n", + "from astropy.time import Time\n", + "from astropy.coordinates import SkyCoord, Angle, Distance\n", + "from astroquery.vizier import Vizier\n", + "from astropy.table import Table, vstack\n", + "\n", + "from typing import Union\n", + "\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "a3e077cf-7150-4668-92af-2a52e53cdd69", + "metadata": {}, + "source": [ + "### Defining a simple function\n", + "\n", + "Much of this tutorial depends on deriving fundamental information from the header of the DataCube. This includes WCS infomration which will be used to convert object R.A and Dec values into x, y pixel positions such that a PRF model can be created. To enable this we have defined the following `get_surronding_objects` function." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "942791a0-a996-45e0-869d-0b8eca82476e", + "metadata": {}, + "outputs": [], + "source": [ + "def get_surronding_objects(tpf_file: pd.DataFrame,\n", + " catalog: str = 'tic', \n", + " pixel_size = float,\n", + " radius: float = None,\n", + " output_epoch: Time = Time.now(),\n", + " max_results: int = 15):\n", + "\n", + "\n", + " #Read in the DataCube file\n", + " tess_hdulist = fits.open(tpf_file['Local Path'].values[0])\n", + " \n", + " #Get the WCS information\n", + " wcs = WCS(tess_hdulist[2].header)\n", + "\n", + " #Get the x, y origin pixel values \n", + " origin_row = tess_hdulist[1].header['2CRV4P'] \n", + " origin_col = tess_hdulist[1].header['1CRV4P']\n", + " \n", + " #Get the shape of the tpf\n", + " shape = tess_hdulist[1].data['FLUX'].shape[1:]\n", + " \n", + " #Get the ra and dec of the target\n", + " ra = tess_hdulist[0].header['RA_OBJ'] \n", + " dec = tess_hdulist[0].header['DEC_OBJ'] \n", + "\n", + " radius = (np.round(max(shape)/2) -1) * pixel_size *u.arcsec\n", + "\n", + " #Allowed catalogs\n", + " allowed_catalogs = ['tic','kic','epic','gaiadr3']\n", + "\n", + " if catalog in allowed_catalogs:\n", + " \n", + " surronding_objects = query_region(SkyCoord(ra=ra, dec=dec, unit='deg'), output_epoch=output_epoch, catalog=catalog, radius=radius, max_results=max_results)\n", + "\n", + " else: \n", + " print(\"Allowed catalogs are 'tic','kic','epic','gaiadr3'\")\n", + " \n", + " df_cleaned = surronding_objects.dropna(subset=['RA']).reset_index(drop=True)\n", + " \n", + " TESS_mags = df_cleaned['TESSmag'].values\n", + " surronding_objects_ra = df_cleaned['RA'].values\n", + " surronding_objects_dec = df_cleaned['Dec'].values\n", + " \n", + " column, row = wcs.world_to_pixel(SkyCoord(surronding_objects_ra,surronding_objects_dec, unit=\"deg\"))\n", + " \n", + " target_col = column + origin_col \n", + " target_row = row + origin_row\n", + " \n", + " target_list = list(zip(target_row, target_col))\n", + "\n", + " return df_cleaned, TESS_mags, target_list, origin_row, origin_col\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "7009ad6b-2bd6-485a-bac7-2ca1136b19a8", + "metadata": {}, + "source": [ + "## Step 1: Get a the TPF\n", + "We will start by getting the Target Pixel File for a relatively isolated (low contamination) star, AU Mic. We limit the search using pipeline='SPOC', which restricts the search results to files produced by the mission pipeline. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "832d9aa1-5df2-4935-8bd3-6b6c1324e293", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "TESSSearch object containing 5 data products \n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
target_namepipelinemissionsectorexptimedistanceyeardescription
0441420236SPOCTESS1120.00.02018Target pixel files
1441420236SPOCTESS2720.00.02020Target pixel files
2441420236SPOCTESS27120.00.02020Target pixel files
3441420236SPOCTESS9520.00.02025Target pixel files
4441420236SPOCTESS95120.00.02025Target pixel files
\n", + "
" + ], + "text/plain": [ + "TESSSearch object containing 5 data products \n", + " target_name pipeline mission sector exptime distance year \\\n", + "0 441420236 SPOC TESS 1 120.0 0.0 2018 \n", + "1 441420236 SPOC TESS 27 20.0 0.0 2020 \n", + "2 441420236 SPOC TESS 27 120.0 0.0 2020 \n", + "3 441420236 SPOC TESS 95 20.0 0.0 2025 \n", + "4 441420236 SPOC TESS 95 120.0 0.0 2025 \n", + "\n", + " description \n", + "0 Target pixel files \n", + "1 Target pixel files \n", + "2 Target pixel files \n", + "3 Target pixel files \n", + "4 Target pixel files " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf_bright_search= lksearch.TESSSearch('Au Mic', pipeline='SPOC').cubedata\n", + "tpf_bright_search" + ] + }, + { + "cell_type": "markdown", + "id": "3d7b47a7-5180-478d-9ee6-706205ac8d38", + "metadata": {}, + "source": [ + "The search result contains a table showing all of the observations of the target for which SPOC data is available to download. The exptime column indicates the observing cadence by TESS. \n", + "\n", + "As we know from the previous tutorials the TPF will be different for this target for every observing sector, as the target will fall on different pixels and different camera and CCDs. Let's just pick a single sector to model. In the download command below, we specify the 1st element of the table, corresponding to the 20-second cadence TPF from sector 27." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d6eb4320-2a15-48de-920d-f016fa7bf7e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Local PathStatusMessageURL
0/Users/rhounsel/.lksearch/cache/mastDownload/T...COMPLETENoneNone
\n", + "
" + ], + "text/plain": [ + " Local Path Status Message URL\n", + "0 /Users/rhounsel/.lksearch/cache/mastDownload/T... COMPLETE None None" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf_bright = tpf_bright_search[1].download()\n", + "tpf_bright" + ] + }, + { + "cell_type": "markdown", + "id": "c6997a85-3a8e-425f-86cc-5c1825ff4b6a", + "metadata": {}, + "source": [ + "We now have our dataframe containing the local file path it is downloaded to. However, it does not read it in to a lightkurve object. We will read it in using the fits file handling package in astropy. If you need a refresher on fits file handling, you can see this [astropy tutorial](https://learn.astropy.org/tutorials/FITS-images.html). " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "39847d40-b701-4957-b153-c22ecf9b965a", + "metadata": {}, + "outputs": [], + "source": [ + "tess_hdulist = fits.open(tpf_bright['Local Path'].values[0])" + ] + }, + { + "cell_type": "markdown", + "id": "c8d8a8f3-63e1-43f0-bd67-cb0c68e701e3", + "metadata": {}, + "source": [ + "## Step 2: Initializing a PRF model\n", + "\n", + "Now that we have our file, we can set up our PRF model. \n", + "To initiate a PRF object, we need to know which camera and CCD (TESS) or channel (Kepler) the target is on. We also can optionally provide the observing Sector for TESS. This is because two sets of PRF engineering models were produced for TESS. The first models were made during commissioning and are used for the early Sectors (Sectors 1-3). The commissioning observations were re-run after Sector 3, and these files can be used for subsequent TESS sectors. If the sector is not specified, the models produced for Sectors 4 onwards are used." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2a381cd3-5f4a-46ed-a162-b30fe541cc73", + "metadata": {}, + "outputs": [], + "source": [ + "camera = tess_hdulist[0].header['CAMERA']\n", + "ccd = tess_hdulist[0].header['CCD']\n", + "sector = tess_hdulist[0].header['SECTOR'] \n", + "\n", + "shape = tess_hdulist[1].data['FLUX'].shape[1:]\n", + "\n", + "# initialize the PRF object\n", + "prf_initial = lkprf.TESSPRF(camera=camera, ccd=ccd, sector=sector) " + ] + }, + { + "cell_type": "markdown", + "id": "5d3d6e9b-e873-4b3a-a303-da9e02705272", + "metadata": {}, + "source": [ + "## Step 3: Searching for objects in the surronding region\n", + "\n", + "Now we want to assess what other objects might be in the surronding field. We can do this using the `get_surronding_objects` function defined above. This uses lksearch and some information from the header of our object, including it's WCS. We specify the number of targets to collect information for via the max_results input, we can also select the catalog we wish to search. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c26f4367-3f7a-42a9-92da-67f4d8cfb35e", + "metadata": {}, + "outputs": [], + "source": [ + "object_table, TESS_mags, target_list, origin_row, origin_col = get_surronding_objects(tpf_file = tpf_bright, catalog = 'tic', pixel_size = 21, output_epoch = Time.now(), max_results = 15)" + ] + }, + { + "cell_type": "markdown", + "id": "99fd0fc6-1344-4b1a-9e98-c01546514a81", + "metadata": {}, + "source": [ + "This function has provided us with a list of objects within our region of interest, an array of TESS magnitudes for these objects, the x, y postion of the objects within the TPF, and the origin_row, origin_col for our TPF. We can view each as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f3a851e8-a2ec-4237-b1a1-496768a39ab1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDRADecSeparationRelative_FluxpmRApmDETESSmagMassRadTefflogg
0TIC 441420236311.292080-31.3434800.0000001.000000281.424-359.8956.7550000.6620.698NaN4.5713
1TIC 441420238311.298135-31.34186619.5044350.0002007.181-7.00316.0049990.8500.8865070.04.4727
2TIC 441420240311.284206-31.34438424.4264060.000240-3.239-0.23815.8040000.6500.6813945.04.5842
3TIC 441420232311.295374-31.33404935.4310210.00017218.273-14.82116.1670000.6500.7294133.04.5258
4TIC 441420230311.294068-31.33143943.7777390.00103711.049-11.27014.2160001.0401.1235799.04.3544
.......................................
8TIC 1992412623311.291374-31.36360772.4886860.004238-15.717-18.76712.6870001.1001.1675980.04.3452
9TIC 441420254311.291696-31.36492077.1936210.002004-15.638-18.90513.5000000.9800.8575571.04.5634
10TIC 441420231311.267326-31.33147787.5257740.00007313.025-17.76517.1019990.5140.5163479.04.7232
11TIC 441420225311.269880-31.32649691.6432210.00016814.283-0.97416.1919990.3590.3723498.04.8532
12TIC 441420219311.283255-31.315915102.8777100.0001493.916-14.23816.3220010.9701.0175507.04.4104
\n", + "

13 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " ID RA Dec Separation Relative_Flux pmRA \\\n", + "0 TIC 441420236 311.292080 -31.343480 0.000000 1.000000 281.424 \n", + "1 TIC 441420238 311.298135 -31.341866 19.504435 0.000200 7.181 \n", + "2 TIC 441420240 311.284206 -31.344384 24.426406 0.000240 -3.239 \n", + "3 TIC 441420232 311.295374 -31.334049 35.431021 0.000172 18.273 \n", + "4 TIC 441420230 311.294068 -31.331439 43.777739 0.001037 11.049 \n", + ".. ... ... ... ... ... ... \n", + "8 TIC 1992412623 311.291374 -31.363607 72.488686 0.004238 -15.717 \n", + "9 TIC 441420254 311.291696 -31.364920 77.193621 0.002004 -15.638 \n", + "10 TIC 441420231 311.267326 -31.331477 87.525774 0.000073 13.025 \n", + "11 TIC 441420225 311.269880 -31.326496 91.643221 0.000168 14.283 \n", + "12 TIC 441420219 311.283255 -31.315915 102.877710 0.000149 3.916 \n", + "\n", + " pmDE TESSmag Mass Rad Teff logg \n", + "0 -359.895 6.755000 0.662 0.698 NaN 4.5713 \n", + "1 -7.003 16.004999 0.850 0.886 5070.0 4.4727 \n", + "2 -0.238 15.804000 0.650 0.681 3945.0 4.5842 \n", + "3 -14.821 16.167000 0.650 0.729 4133.0 4.5258 \n", + "4 -11.270 14.216000 1.040 1.123 5799.0 4.3544 \n", + ".. ... ... ... ... ... ... \n", + "8 -18.767 12.687000 1.100 1.167 5980.0 4.3452 \n", + "9 -18.905 13.500000 0.980 0.857 5571.0 4.5634 \n", + "10 -17.765 17.101999 0.514 0.516 3479.0 4.7232 \n", + "11 -0.974 16.191999 0.359 0.372 3498.0 4.8532 \n", + "12 -14.238 16.322001 0.970 1.017 5507.0 4.4104 \n", + "\n", + "[13 rows x 12 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "object_table" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8da87a53-257a-48f3-817e-8af980708239", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 6.755, 16.005, 15.804, 16.167, 14.216, 15.663, 14.966, 17.405,\n", + " 12.687, 13.5 , 17.102, 16.192, 16.322], dtype=float32)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "TESS_mags" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3ede9983-6325-48b6-a3bf-aec247153a32", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1246.966007448939, 475.4225154658521),\n", + " (1246.9680947225622, 474.4484169248344),\n", + " (1246.7628613580305, 476.61839653286455),\n", + " (1245.532001568138, 474.3867213885503),\n", + " (1245.035240101073, 474.42178309291944),\n", + " (1244.410348894742, 475.6294437558784),\n", + " (1244.1289487478136, 476.1637804374784),\n", + " (1244.7486741508628, 477.64092499434673),\n", + " (1250.3111651478607, 476.71545753610866),\n", + " (1250.5460864032154, 476.7463262999267),\n", + " (1243.8368527564137, 478.3048298097157),\n", + " (1243.1160512600845, 477.6397119679501),\n", + " (1241.9432638656988, 475.07282519260525)]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "target_list" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2e3a6d58-9369-4f80-8c4b-55d5c8eea3e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1240, 470)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "origin_row, origin_col" + ] + }, + { + "cell_type": "markdown", + "id": "7b9d57fb-1004-40f7-bf43-67cfb76df07e", + "metadata": {}, + "source": [ + "## Step 4: Creating the 3D PRF model\n", + "\n", + "We can now use the TESS magnitudes and x,y postions obtained above to construct our 3D PRF model data cube." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "62511192-5aae-4173-9488-480ae4d67db3", + "metadata": {}, + "outputs": [], + "source": [ + "prf_mod = prf_initial.evaluate(targets=target_list,origin=(origin_row,origin_col),shape=shape)" + ] + }, + { + "cell_type": "markdown", + "id": "a6971405-86d4-4f47-8d0f-745e1669d597", + "metadata": {}, + "source": [ + "We now have a model PRF's for our object and 14 other objects in the field that can be contaminating our source. Lets plot the target, and its PRF model. Red crosses mark the postion of all targets within the field." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d9aefb55-fbdf-4aa1-afd6-286fb88af8a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0QAAAF2CAYAAABONFihAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAaNpJREFUeJzt3Qm8TeX6wPFnn2M4gxyZ5ynKPEdKUeYk/lQqRZRu4ma4ISVEZQhRRBNyI9S9dUtSMlaU+WaIKEWZy3yO4Zyz/5/n1dp37zNw9j57nz2s3/f/Wf9tr73W2oub83jW+7zP63A6nU4BAAAAABuKCvYNAAAAAECwkBABAAAAsC0SIgAAAAC2RUIEAAAAwLZIiAAAAADYFgkRAAAAANsiIQIAAABgWyREAAAAAGyLhAgAAACAbZEQ2cDs2bPF4XDIL7/84tpXvnx5ueOOO3LsHv75z39KlSpVJHfu3FKgQAEJVStXrjR/Vvrqjz9nAAAAhDYSIgTczp075aGHHpJrrrlG3nzzTXnjjTeCfUsAAJuxHlpZW0xMjJQsWVJat24tr7zyipw+fdqn665Zs0ZGjhwpJ06c8Ps9A8gZuXLoe2BjOtqSmpoqU6ZMkUqVKgX7dgAANjZq1CipUKGCXLx4UQ4dOmRiVP/+/WXSpEny8ccfS61atbxOiJ577jnz4C+UKyAAZI6ECAFz9uxZiY+PlyNHjpj3BAoAQLC1bdtWGjRo4Ho/dOhQWb58uSkjv/POO+WHH36Q2NjYoN4jgJxFyRxc3nnnHcmVK5cMGjTIvNe5MFpWMGHCBHn55ZelXLlyJkg0bdpUtm3b5nGuPhnLly+f/PTTT3L77bfLVVddJV27djVzlUaMGGGOKVKkiLmelhZkxrrOvn37THDSX5cqVUqmTZtmPt+6davcdtttJtHS+5k3b166a/z8889y9913S8GCBSUuLk5uuOEG+fTTT9Md99tvv0nHjh3NtYoWLSoDBgyQ8+fPZ3hf3333nbRp00YSEhLMNfXP4JtvvvHyTxgAEIo0rjz77LPy66+/yrvvvmv2ff/99yYmVaxY0ZTXFS9eXHr27Cl//PGH6zyNZ1bM1FEnqxzPmks6a9Ysc22NMXnz5pVq1arJ9OnTg/S7BJAZRohg6Lyexx57TJ5++ml5/vnnPT6bM2eOqa3u06ePnDt3zpS+6Q94TU6KFSvmOi45OdnUYjdp0sQkUZo4aDDR8z/88EMTBDTBuVI5QkpKinmCd8stt8j48eNl7ty50rdvX5O4PPPMMybR6tSpk8yYMUO6desmjRs3NoFIHT58WG688UZJTEyUJ554QgoVKmQSPX3q98EHH8j//d//meOSkpKkefPmJvHS47SOXBs/6FPCtHSf3k/9+vVNchcVFeUKcl999ZU0bNjQT/8rAACC5cEHHzQx8IsvvpBevXrJ0qVLzQO2Hj16mGRo+/btJlbq67fffmsSH41FP/74o7z33nvmwWHhwoVdDwCVxr3q1aubGKQPHD/55BN5/PHHTRm5xlQAIcKJiDdr1iyn/k+9d+9e175y5co527VrZ349ZcoUp8PhcI4ePdrjPD1ez4uNjXX+9ttvrv3fffed2T9gwADXvu7du5t9Tz31VLrvHzFihPns6NGjV7xX6zovvviia9/x48fNPeg9zp8/37V/586d5li9vqV///5m31dffeXad/r0aWeFChWc5cuXd6akpJh9kydPNsctXLjQddzZs2edlSpVMvtXrFhh9qWmpjorV67sbN26tfm1JTEx0VyzZcuWl/1zBgCEButn9Pr16zM9JiEhwVm3bl3Xz/m03nvvPXON1atXu/a99NJLmf7sz+gaGk8qVqyYjd8JAH+jZM7mdASmX79+Mm7cOBk2bFiGx2hZmZatWXREpFGjRrJ48eJ0x/bu3dsv9/XII4+4fq1zj6677jozQnTPPfe49us+/Uyf4Fn0nvT+dJTKoqNSjz76qClh2LFjh+u4EiVKyF133eU6Tke09Dh3W7Zskd27d8v9999vyiSOHTtmNp0fpSNMq1evNk/6AADhT+OF1W3OfR6RVkfoz34twVabNm3K0vXcr3Hy5ElzDS251ril7wGEBkrmbGzVqlVmbs2QIUNcNdAZqVy5crp91157rSxcuNBjn5YDlC5dOtv3pbXaVrmBRefu6LW1RCHt/uPHj7vea/23JmtpVa1a1fV5jRo1zKt2vEt7PU2y3GkypLp3757p/WpQu/rqq736PQIAQs+ZM2fMfB/1559/mu5x8+fPdzUHsmQ1mdG5plpqvXbtWlPKnfYaGsMABB8JkY1pXbOum6BzZ/72t7+55uH4SieM6vya7IqOjvZqv9Op1QqBYY3+vPTSS1KnTp1MnygCAMKbNtrRJMVaHkIrErSltj4w1J//+rNeY4I22MlKZYA2GdJKAl2UXFt6lylTRvLkyWMqFHS+EdUFQOggIbIxnfypjQa0vEx/aH/99demuUBa1iiJO51Eqh3kQo12ntu1a1eGi8Nan1uv2ilPkyn3UaK05+pisip//vzSokWLAN89ACBY9OGg0uZAWnmwbNkyM0I0fPjwy8bDtJUGFm2goJ1LdW2jsmXLuvavWLEiIPcPwHfMIbI5LUP78ssvTde1li1berQTtXz00Ufy+++/u96vW7fOtKHWzmuhRlt+6/1peYJF5/toZyBN4LTlqXXcgQMHTEJo0XIGPc6ddpbTpEi75mkpRVpHjx4N6O8HABB42k109OjRplJCO5laFQlpKxAmT56c7lyd36q04sJdRtfQESjtUgogtDBCBFMeoG1GmzVrZp6MaWDQERH3z3UUSRsm6NMuDQjaznrw4MESap566inT/lSTNW2nrWsRadvtvXv3yr/+9S9XSZ+2VJ06dapp271x40bTYEGfDmpjBXd6/FtvvWWupyWG2n5VG0xogqhP+fTPSZ8CAgDCw2effWaqBnSpCF2qQWOettjWygEdzdF5rLpZSz9cvHjR/NzXOKmxJC19cKZ0WYh7771XcufOLe3bt5dWrVqZEjn9tZal60O1N99808xROnjwYBB+5wAyQ0IEo2bNmiZIaFmY/vBesmSJ6zNNGjQx0ERIJ5ZqFzdNJjSJCDW6LpLWfGujiFdffdV0BtJ1jzRpadeunes4TXy0HOLvf/+7OU7f61NBTXy0PtydJoo64qRPD/X3rUFN16TQ5g0a5AAA4cMqgdNkRR+aafzT+KYPvHRRcYsu/K0xQhcG11EeTXA0TqYtLb/++utNfNC18TR26twgTZy0SY9WIWgH1yeffNLEDX2wqE2DdIFXAKHDob23g30TCE3aplrLB7ShgP4wBwAAACINc4gAAAAA2BYJEQAAAADbIiECAAAAYFskRMiUtqnWKWbMHwIAAIgcY8eONWto9e/f37VPG1H16dPHdBLWhYg7d+5sOjG627dvn2lSpc2otGOiLlysHRvdrVy5UurVqyd58+Y1nYpnz56d7vu1WYn+O1M7OmqTKl0yJZhIiAAAAACbWL9+vbz++uumC6+7AQMGmK6877//vqxatcqs19ipUyfX5ykpKSYZunDhgunoq8uaaLLjvnixdljUY2699VbZsmWLSbgeeeQR+fzzz13HLFiwQAYOHCgjRoyQTZs2Se3atc2yL9rJOFjoMgcAAADYgC4doqM3r732mjz//PNSp04d03ZeFw3WlvDabv6uu+4yx+p6XVWrVjVLj9xwww2m7fwdd9xhEiVd5kRpu3ld6kQXqtdW9vrrTz/9VLZt2+b6Tl2fSxcutpZ00REhbVevS5kobVVfpkwZ0+Ze15MMhpBbh0j/UPQPWtcC0KE8APamz2xOnz5t1v6wFtb1lZYD6JMtX+gPeh3ahz0RmwAEIjZlJy5Z95H2Z5KWqumWES2J0xEcXXdSEyLLxo0bzSLEut9SpUoVKVu2rCsh0lddt8tKhpSO7Oj6Wtu3b5e6deuaY9yvYR1jlebp71W/a+jQoa7P9c9Pz9FzgyXkEiINOJolAoC7/fv3S+nSpbMVdCqUyyeHjqT4dL4uqqilACRF9kRsAuDv2JTduKR0ro+O+rjTUrSRI0emO3b+/PmmRE1L5tI6dOiQefBXoEABj/2a/Ohn1jHuyZD1ufXZ5Y45deqUJCUlyfHjx03pXUbH6IhUsIRcQmStEt1EbpdckjvYtwMgyJLlonwtiz1WkPeFPpXSoLN3YznJf5V3T/NOnU6VCvV/NdcgIbInYhMAf8em7MQl99ikSVn+/Pld+zMaHdJj+vXrJ0uXLiWOhUNCZA37acDJ5SDoALb31yxHf5UpadDxJfDA3ohNAAIVm7IblzQZck+IMqJlatq0QOcPWXSkZvXq1WYujzY90ARN5/q4jxJplzmtkFD6mrYbnNWFzv2YtJ3p9L3eX2xsrERHR5sto2OsawQD/yoAYCspzlSfNgAAQikueRObmjdvLlu3bjWd36ytQYMG0rVrV9evc+fOLcuWLXOds2vXLtNmu3Hjxua9vuo13LvB6YiTJjvVqlVzHeN+DesY6xpalle/fn2PY3SOpr63jgmGkBshAoBAShWn2bw9BwCAUIlL1nlZpaV9NWrU8NgXHx9v1hyq8df+hx9+2LTDLliwoElytOubJinaUEG1atXKJD4PPvigjB8/3swXGjZsmGnUYJXpPfbYY2bEafDgwdKzZ09Zvny5LFy40HSes+h3dO/e3SRhDRs2NF3uzp49Kz169JBgISECYCup5v+8PwcAgFCJS9Z5/vTyyy+bjm+6IOv58+dNdzhtz23RUrdFixaZrnKaKGlCpYnNqFGjXMdUqFDBJD+6ptGUKVNMw4m33nrLXMvSpUsX06Zb1y/SpEpbf2tL7rSNFmy9DpF2oUhISJBm0oE6bQCS7LwoK+U/Zo2EK9VIZ+Vny/6dpXxqqlCmyu/ZvgeEL2ITAH/HpuzEJXM+sclvGCECYCuUzAEA7FYyh8vzOh3VbhTt27c3C1FpZ42PPvrI9Zku6KQr1OqiTTqMpsd069bNrN8AAEAgEJcAADmaEOmkp9q1a8u0adPSfZaYmGgWfHr22WfN67///W/ToeLOO+/M1k0CgL/oE7UULzeewoU24hIAu8UlYlOQS+batm1rtoxoHaS21nOnnSa0g4S27StbtqzvdwoAfkDJXOQhLgEIZ5TM2WAOkU700hIG90We3GkXC93cJ5gBQKCkOJ1m8/YcRI4rxSVFbAIQynHJOg9hsDDruXPnTO32fffdl2n3izFjxpgneNZWpkyZQN4SAJtL9XFDZMhKXFLEJgChHpeITWGQEOlE1nvuuUe0q/f06dMzPW7o0KHmaZ217d+/P1C3BACwsazGJUVsAgD7yBXIoPPrr7+aFWov9xROV7a1VrcFgECzJqN6ew7CmzdxSRGbAIRyXLLOQ4gmRFbQ2b17t6xYsUIKFSrk768AAJ+lOC9t3p6D8EVcAhBpcck6D0FKiM6cOSN79uxxvd+7d69s2bJFChYsKCVKlJC77rrLtDZdtGiRpKSkyKFDh8xx+nmePHn8dNsA4Btf6q6p0w5txCUA4czX+UDEpiAmRBs2bJBbb73V9X7gwIHmtXv37jJy5Ej5+OOPzfs6dep4nKdP5Zo1a5b9OwaAbEgVh6SIw+tzELqISwDsFpes8xCkhEiDh05IzczlPgOAYEt1Xtq8PQehi7gEwG5xyToPYdB2GwAAAABsvTArAISSFB9KE3wpZQAAIFBxyToP/kFCBMBWSIgAAKGEhCj4SIgA2Eqq02E2b88BACBU4pJ1HvyDhAiArTBCBAAIJYwQBR8JEXKWg7+8maITVo5IkSizeXcOgIgWwNjkiI6WcOZMCfBPQGKfT3Hp0nnwF7rMAQAAALAtRogA2IrTh1ptPQcAgFCJS9Z58A8SIgC2whwiAEAoYQ5R8JEQAbCVFGeU2bw7J2C3AwCwOV/i0qXzAnI7tkRCBMBWUsUhqV5On0wVog4AIHTi0qXziE3+QkIEwFYomQMAhBJK5oKPLnMAAAAAbIsRIgC24tscIsoSAAChNoeI2OQvjBABsGGttvebL6ZNmybly5eXmJgYadSokaxbty7TY9988025+eab5eqrrzZbixYt0h3vdDpl+PDhUqJECYmNjTXH7N6926d7AwCEd1zyNTYhPRIiALaiE1dTvNx8mey6YMECGThwoIwYMUI2bdoktWvXltatW8uRI0cyPH7lypVy3333yYoVK2Tt2rVSpkwZadWqlfz++++uY8aPHy+vvPKKzJgxQ7777juJj4831zx37ly2/kwAAOEVl7yNTdOnT5datWpJ/vz5zda4cWP57LPPXJ83a9ZMHA6Hx/bYY495XGPfvn3Srl07iYuLk6JFi8qgQYMkOTk5XSyrV6+e5M2bVypVqiSzZ8/O1sPCnEJCBMCWpQnebt6aNGmS9OrVS3r06CHVqlUzSYwGkZkzZ2Z4/Ny5c+Xxxx+XOnXqSJUqVeStt96S1NRUWbZsmWt0aPLkyTJs2DDp0KGDCWxz5syRAwcOyEcffZTtPxcAQHjFJW9iU+nSpWXs2LGyceNG2bBhg9x2220mlmzfvt11jMasgwcPujZ9COe6x5QUkwxduHBB1qxZI++8845JdrRqwbJ3715zzK233ipbtmyR/v37yyOPPCKff/65zw8LcwoJEQBb0Sdqvmzq1KlTHtv58+cz/A4NGBp0tKTNEhUVZd7r6E9WJCYmysWLF6VgwYKuQHPo0CGPayYkJJina1m9JgAgcuKSNyNE7du3l9tvv10qV64s1157rbzwwguSL18++fbbb13H6EO74sWLuzYdSbJ88cUXsmPHDnn33XfNg7u2bdvK6NGjzWiPxjylD/4qVKggEydOlKpVq0rfvn3lrrvukpdfftnnh4U5hYQIALJIy9g0CbG2MWPGZHjcsWPHzNO0YsWKeezX95rUZMWQIUOkZMmSrgTIOi871wQAQOPT/Pnz5ezZs6Z0zr1SoXDhwlKjRg0ZOnSoeTBn0QdvNWvW9IhBOrKjDwetUSY9xv2hnXWM9dDOHw8LA4UucwBsJcXpMJu356j9+/d7PDHTGulA0LIGDVZai6011gCAyOVLXLLOU5qUuNPYlFF82rp1q0mAdN6pjg59+OGHZpRG3X///VKuXDnzIO777783D+V27dol//73v83n+uAtowdy1meXO0bvLykpSY4fP57pw8KdO3dKMJEQAbAVazKqd+dcam1qTUa9En3CFh0dLYcPH/bYr++1DOFyJkyYYBKiL7/80swTsljn6TW0y5z7NbV8AQBgn7jkHpu0esGdzs8ZOXJkuuOvu+46M7fn5MmT8sEHH0j37t1l1apVJil69NFHXcfpSJDGmebNm8tPP/0k11xzjUQ6SuYA2EqqM8qnzRt58uSR+vXruxoimO/9q0GCe3lCWjqBVWuylyxZIg0aNPD4TOuyNSlyv6Y+ddNuc5e7JgAgMuOSFZu0ekGTHGvTcrfMYpN2ftP4pCXf2tBgypQpGR6r81PVnj17zKvGn4we8lmfXe4YfZCoS0Vk52FhoJEQAbAVX1qb+vLkTrvo6NpC2onnhx9+kN69e5t6bZ1Iqrp16+YRtMaNGyfPPvusmViq7Ui19EC3M2fOmM+1Bap27Hn++efl448/NqUPeg0tb+jYsaMf/4QAAOEQl6zYZFUvWFtWy7n1QV1mzYG2bNliXq2KBH3wpnHHvRvc0qVLzfdZZXd6jPtDO+sY66Gdrw8LcwIlcwBsJdWt7tqbc7zVpUsXOXr0qGlJqomNlrXpyI9VO63rOehkUvc1InTCqXbkyaz0YfDgwSap0tKGEydOSJMmTcw1mWcEIM55QeIkWY454tJ9VtiZKImSSxIdeYJyb/B/XLLOyyp9AKed4cqWLSunT5+WefPmmXmq2hL7p59+Mu+1C12hQoXMHKIBAwbILbfc4ird1nXxNPF58MEHTTWDxjVdBqJPnz6uBEzXLZo6daqJVT179pTly5fLwoUL5dNPP/V4WKileloF0bBhQ7OchPvDwmAhIQKAANGWo7plRAORu19++eWK19NRolGjRpkNANyToRdTVkkB5zkZlOs2OeqId31WxHlWXkpeLiccMfJ0dFOSIpvSkR2tKtD1hbRLqiY6mgy1bNnSlNzpvFUrOdE5SZ07dzYJj0VL3RYtWmSqHXQ0RxcG18TGPR5pabcmP5pMaSmern2ka+ppp7msPiwMFhIiALbi7doN1jkAEKp0ZEiToZJyKfmxkiIrGdL9Ov9ej0sUEqJIiEvWeVn19ttvZ/pZmTJlTHOFK9EudIsXL77sMc2aNZPNmzf7/LAwWIjyAGwl0KuBA0BO0zI5TYIOSLwrKaqWesyVDOl+/TyjcjqEb1wiNvkPf5IAbCVVHD5tABDKdETIPSmanPKlRzLkXkaHyIhLxCb/oWQOnhyB/cvliI4O3LVzBfY/Z2dycmCvn5IS0OuL89J6BXbny1M1nsIBER6bcuUO3LVjArOAs0tq6qWGCs6LciyqoLyUcou8nPSZ6+M38l4vibnyicPHuUPOpHMSWL60rYmsuOfraA+xyX9IiADYim8LsxJ0AIQmTYZeSPpSCjiTZGzeW2TQ+a88Ph92fpX8fOFqGRLXmoYKEbcwK7HJX/iTBAAACFM6MqTJUEnnGZl07jPzesCRT57L20ySxSG5xCkVnceldMrJYN8qELJIiADYSqrT4dMGAKHoWFS8GRmykh99fTNPA+l1YYPrvb4OPb9aCqeeDfbtwo9xidjkPyREAGwl1YeVwGm7DSCU7Y9OkL1RV7uSnxHnV7pGigbGtDWvJxyxkugI3Fwp5GxcIjb5F3OIANhKqjPKbN6eAwChSucGDY5tLbVTDsrIc/9b9PmlmJtlV3QRGRTVxiRDzCGKnLhknQf/4E8SgK2kiMOnDQBCWbzzojx6foPHvkHnvpIiqWdNWR3JUOTFJWKT/5AQAbDlkzhvNwAIVZr0jE9a4iqTGxB7qUxO3+t+/RyRF5eITf7j9Z/k6tWrpX379lKyZElxOBzy0UcfeXzudDpl+PDhUqJECYmNjZUWLVrI7t27/XjLAAD8D3EJdlY4TTI0OLaN7Igual7dkyIaKgB+TIjOnj0rtWvXlmnTpmX4+fjx4+WVV16RGTNmyHfffSfx8fHSunVrOXcu0At7AcCV6fK33pclIJQRl2BnOjdIGyZYydDRqHizX1+tpIiGCpEYl4hNQW2q0LZtW7NlRJ/CTZ48WYYNGyYdOnQw++bMmSPFihUzT+zuvffe7N8xAGQDTRUiD3EJdqZzg56JbWHWI9K5Qu40KRoUS0OFUEdTheDz65/k3r175dChQ6YcwZKQkCCNGjWStWvX+vOrAMAnKc4onzaEJ+IS7ECTnbTJkIWGCpEbl4hNIdp2W4OO0idv7vS99Vla58+fN5vl1KlT/rwlAPDgFIeketmZR89BePIlLiliE4BQjkvWefCPoKeWY8aMMU/rrK1MmTLBviUAEYyncMgKYhOAnMIIUfD59U+yePHi5vXw4cMe+/W99VlaQ4cOlZMnT7q2/fv3+/OWAAA25ktcUsQmALAPvyZEFSpUMAFm2bJlHmUG2tWncePGGZ6TN29eyZ8/v8cGAIGS6nT4tCE8+RKXFLEJQKjHJWJTEOcQnTlzRvbs2eMxYXXLli1SsGBBKVu2rPTv31+ef/55qVy5sglEzz77rFkbomPHjn68bQDwTYpEmc3bcxC6iEsA7BaXrPMQpIRow4YNcuutt7reDxw40Lx2795dZs+eLYMHDzZrQjz66KNy4sQJadKkiSxZskRiYmL8dMsA4DtfnqrxFC60EZcAhDNfR3uITUFMiJo1a2bWdciMrhI+atQoswFAqEmVKLN5ew5CF3EJQDjzJS5Z5yEE224DQKhLcTrM5u05AACESlyyzoN/kFoCAAAAsC1GiADYCnOIAAChhDlEwUdCBMBWnM4oSfVyMTs9BwCAUIlL1nnwDxIiALaSIg6zeXsOAAChEpes8+AfJETw5Ajs04aohMAtbuiIi5NAciYlBfT6qSdPB/T6zuSLAbx45h2+Qk2q0/syAz0HQPA4oqMDev3owgUDdm1n/nwSSI4ziQG9vqSkBPTyqefPi935Epes8+AfJEQAbCXVh9IEX0oZAAAIVFyyzoN/8CcJAAAARLDp06dLrVq1JH/+/GZr3LixfPbZZ67Pz507J3369JFChQpJvnz5pHPnznL48GGPa+zbt0/atWsncXFxUrRoURk0aJAkJyd7HLNy5UqpV6+e5M2bVypVqmQWx05r2rRpUr58ebM4dqNGjWTdunUSbCREAGwlVRw+bQAAhFJc8iY2lS5dWsaOHSsbN26UDRs2yG233SYdOnSQ7du3m88HDBggn3zyibz//vuyatUqOXDggHTq1Ml1fkpKikmGLly4IGvWrJF33nnHJDvDhw93HbN3715zzK233ipbtmyR/v37yyOPPCKff/6565gFCxbIwIEDZcSIEbJp0yapXbu2tG7dWo4cOSLBREIEwJYL4Hm7AQAQSnHJm9jUvn17uf3226Vy5cpy7bXXygsvvGBGgr799ls5efKkvP322zJp0iSTKNWvX19mzZplEh/9XH3xxReyY8cOeffdd6VOnTrStm1bGT16tBnt0SRJzZgxQypUqCATJ06UqlWrSt++feWuu+6Sl19+2XUf+h29evWSHj16SLVq1cw5OuI0c+ZMCSYSIgC2rNX2dgMAIJTikhWbTp065bGdv0KjCh3tmT9/vpw9e9aUzm3cuFEuXrwoLVq0cB1TpUoVKVu2rKxdu9a819eaNWtKsWLFXMfoyI5+nzXKpMe4X8M6xrqGJk76Xe7HREVFmffWMcFClAdgK6bMwOnlRskcACCU4pJbbCpTpowkJCS4tjFjxmT4PVu3bjWjQjq/57HHHpMPP/zQjNIcOnRI8uTJIwUKFPA4XpMf/Uzpq3syZH1ufXa5YzRpSkpKkmPHjplkLKNjrGsEC13mANiK04c5QXoOAAChEpes89T+/ftNowSLJjwZue6668zcHi2R++CDD6R79+5mvhBIiAAAAICwZXWOuxIdBdLOb0rnCa1fv16mTJkiXbp0MeVsJ06c8Bgl0i5zxYsXN7/W17Td4KwudO7HpO1Mp+/13mJjYyU6OtpsGR1jXSNYKJkDYCs+lSXQVAEAEGJxKbuxKTU11cw3ql+/vuTOnVuWLVvm+mzXrl2mzbbOMVL6qiV37t3gli5dapIdLbuzjnG/hnWMdQ1NyPS73I/Re9D31jHBwggRAFthYVYAgN0WZh06dKjpDKeNEk6fPi3z5s0zawZpS+yEhAR5+OGHTTvsggULmiTn73//u0lSbrjhBnN+q1atTOLz4IMPyvjx482cn2HDhpm1i6wSPZ2XNHXqVBk8eLD07NlTli9fLgsXLpRPP/3UdR/6HVqq16BBA2nYsKFMnjzZNHfQrnPBREIEwFZ8earGCBEAIFB8He3x5hwd2enWrZscPHjQJEC6SKsmQy1btjSfa2ts7fimC7LqqJF2h3vttddc52up26JFi6R3794mUYqPjzeJzahRo1zHaMttTX50TSMtxdO1j9566y1zLYuW5x09etSsX6RJlbbwXrJkSbpGCzmNhAiArfiy0Cpd5gAAgeLrAuDenKPrDF1OTEyMWVNIt8yUK1dOFi9efNnrNGvWTDZv3nzZY3R9It1CCQkRAFthhAgAYLcRIlwehfEAAAAAbIsRIgC2wggRACCUMEIUfCREAGyFhAgAEEpIiIKPhAiArZAQAQBCCQlR8JEQAbAVpw9d4/QcAABCJS5Z58E/aKoAAAAAwLYYIQJgK5TMAQBCCSVzwUdCBMBWSIgAAKGEhCj4SIgA2AoJEQAglJAQBR8JEQBbISECAIQSEqLgIyEKN47A/scffXVCQK9/8N4qAbt2zPFUCaQC204E9PpRFy4G9PopZ1ICd3FnAK/tZ06nw2zengMgeLEpqlDBgF7/h2HlAnbtuP3REkglvkkK6PVzJycH9Ppy9A+xe2zyJS5Z58E/6DIHAAAAwLYYIQJgK7rWg7frPfiyPgQAAIGKS9Z58A8SIgC2whwiAEAoYQ5R8JEQAbAV5hABAEIJc4iCjzlEAGz5JM7bzRfTpk2T8uXLS0xMjDRq1EjWrVuX6bHbt2+Xzp07m+MdDodMnjw53TEjR440n7lvVaoErlEJACB04xIjRP5DQgTAlk/ivN28tWDBAhk4cKCMGDFCNm3aJLVr15bWrVvLkSNHMjw+MTFRKlasKGPHjpXixYtnet3q1avLwYMHXdvXX3/t9b0BAMI/LjFCFMIJUUpKijz77LNSoUIFiY2NlWuuuUZGjx4tTqfT318FACFr0qRJ0qtXL+nRo4dUq1ZNZsyYIXFxcTJz5swMj7/++uvlpZdeknvvvVfy5s2b6XVz5cplEiZrK1y4cAB/F5GBuAQAyNE5ROPGjZPp06fLO++8Y55kbtiwwfyDICEhQZ544gl/fx0AeMXpQ5mBt0/hLly4IBs3bpShQ4e69kVFRUmLFi1k7dq1kh27d++WkiVLmjK8xo0by5gxY6Rs2bLZumakIy4BiLS4ZJ2HEE2I1qxZIx06dJB27dqZ91oP/9577122dh4AcoqOCXg7MGAdfurUKY/9OpKT0WjOsWPHzKhEsWLFPPbr+507d4qvdB7S7Nmz5brrrjPlcs8995zcfPPNsm3bNrnqqqt8vm6kIy4BiLS4ZJ2HEC2Zu/HGG2XZsmXy448/mvf//e9/TY1727Zt/f1VAODzeg/ebqpMmTJmVMHadHQmJ+nP0bvvvltq1apl5iMtXrxYTpw4IQsXLszR+wg3xCUAkRiXWIcohEeInnrqKfMUVTsfRUdHm6ekL7zwgnTt2jXD48+fP282yeQJLACEStvt/fv3S/78+V37M5vro/N69Off4cOHPfbr+8s1TPBWgQIF5Nprr5U9e/b47ZqRyNu4pIhNAHIKbbcjcIRIn1TOnTtX5s2bZzorac32hAkTzGtG9Amr+xNXfQILAIGSndammgy5b5klRHny5JH69eubUQnX96ammvc678dfzpw5Iz/99JOUKFHCb9eMRN7GJUVsApBTaLsdgSNEgwYNMk/jtFOSqlmzpvz6668muHTv3j3d8TrpWFvTuj+FI/AACHf6c01/5jVo0EAaNmxo1hU6e/asmcyvunXrJqVKlXKV3Wkjhh07drh+/fvvv8uWLVskX758UqlSJbP/ySeflPbt20u5cuXkwIEDpqW3jnjcd999Qfydhj5v45IiNgGAffg9IdK1NLSbkjsN2Pp0NCOZTUoGgEDQiateN1XwYeZqly5d5OjRozJ8+HA5dOiQ1KlTR5YsWeJqtLBv3z6Pn5Wa4NStW9f1XkcwdGvatKmsXLnS7Pvtt99M8vPHH39IkSJFpEmTJvLtt9+aX8N/cUkRmwCEclyyzkOIJkT69FJrs7UNrLY33bx5s1mPo2fPnv7+KgDI0TlE3urbt6/ZMmIlORbtfHaldXHmz5/v033YHXEJQChjDlEEziF69dVX5a677pLHH39cqlatako8/va3v5lF8AAg2FgN3H6ISwAiMS55E5u0RFgXANclGooWLSodO3aUXbt2eRzTrFkzcTgcHttjjz3mcYxWN+gSBrrQuF5HS5KTk5PTPfCrV6+eGWXXkm9dLiKtadOmmQeBuqaeLikR7GUQ/D5CpH/QWiuvGwCEGp2E6vAywWHiangjLgGItLhknZdVq1atkj59+pikSBOYp59+Wlq1amXmrsbHx7uO69Wrl4waNcr1XhMfi3bo1GRIu6Xq+m66Hp7Oh82dO7e8+OKL5pi9e/eaYzSR0mY22kzokUceMc1/dLkItWDBAjNHc8aMGSYZ0p/N+pkmaJpkRURCBAChLKfmEAEAECpziHQOqzsdtdHkY+PGjXLLLbd4JECZLQ/xxRdfmATqyy+/NPNhdW6sjrQPGTJERo4caTqsapJToUIFmThxojlHR+V13beXX37ZlRBpybImXlaTIT3n008/lZkzZ5oGOBFRMgcACD3nzp3L9DN9ygcAsI+TJ0+a14IFC3rs11EdXUuvRo0aptumNqWxrF271nTptJoDKU1ytAvn9u3bXce0aNHC45p6jO63uqhqEuZ+jDa90ffWMcFAQgTAhk/ivK3TlrCn9dzaxjutf/3rX1KrVq2g3BMAwNe49L/YpAmJ++a+qHRGtMNm//795aabbjKJj+X++++Xd999V1asWGGSoX/+85/ywAMPuD7XjqnuyZCy3utnlztG7yspKUmOHTtmSu8yOsa6RjBQMgfAVnKyy1wo0cmyN9xwgzz33HOmvEHXRNJ6cl20VDuwAQDCs8tc2jXSdI06LWHLjP7s37Ztmyllc/foo4+6fq0jQTrvp3nz5mYB8GuuuUYiGQkRAFvRB2reDvhEwACRvPbaa2aiq05uXbRokSmT00VftbOP+xNCAEDoxyXrPLV//37Jnz+/a//l1lDTpSA0BqxevVpKly592es3atTIvO7Zs8ckRDq3KG03uMOHD5tXa96Rvlr73I/R+4uNjTVrwOmW0TGZzV3KCZTMAbAVO7fdbtu2rXTq1Em++eYb0zp13LhxJEMAEOZttzXZcN8ySoh0nTtNhj788ENZvny5aXxwJVv+KrPWkSLVuHFj2bp1qxw5csR1zNKlS813VqtWzXWMdpZzp8fofqWNF+rXr+9xjJbw6XvrmGBghCjcOAKbw6ZWLBXQ629+5rWAXbvX/pskkPb9vWJArx+dm7+OOcKmQ0Ra8qD14Vqj/fnnn5sWrHfeeaf069fPlMxp21TAV47o6IBe/3wNz5Igf/v5/16XcNVsa6+AXj9PrsDGJkdU4B44OVPFHkNEWaBlcvPmzZP//Oc/ZikCa75OQkKCGbnRGKGf33777VKoUCH5/vvvZcCAAaYDnTXPVNt0a+Lz4IMPyvjx4801hg0bZq5tJWHabnvq1KkyePBgs/i1Jl9amq1d5Czacrt79+7SoEEDadiwoWm7rWXcVte5YOBfYABgA9oeVUvmNBkqUKCAtGzZ0gQ+XUNCn95t3rw52LcIAAiQ6dOnu+aTups1a5Y89NBDZuRG22lbyYnOS+rcubNJeCxa6qbldr179zajObp+kSY27usW6ciTJj+aTE2ZMsWU5b311luultuqS5cucvToURk+fLhJqjQ+aVvwtI0WchIJEQB78aUELgJK5nQOkT7Vc3fjjTeaREi7DQEAgsTX0mwvztGSucspU6aMqRy4knLlysnixYsve4wmXVd6yKble7qFChIiALZi14VZ0yZDFi2dePvtt3P8fgAAObcwKy6PhAiArdi17facOXMy/czhcGSaMAEAQrvtNrKPhAiAvWgAsWHJnDZPcHfx4kWzArnWjcfFxZEQAUA4xSXrPPgFCREAW7Frydzx48fT7du9e7eZHDto0KCg3BMAgJI5X+hDPW3IoA/2ihQpIgULFpTsYB0iALCpypUry9ixY9ONHgGRKj75nBQ+dzLjDw8ki5xK8f3ieq5eIxDXBiCnT5823fKaNm1q1j4qX768VK1a1SRE2uyhV69esn79ep+uTUIEwF6cPm4RKleuXHLgwIFg3waQI8nQuM0zZfLGN6TIuROeH/5+URydfhPH/Qd8S1xOpZhz9Rp6Lb9eG5HP17gUwbEprUmTJpkESNuEt2jRQj766COzcOyPP/4oa9eulREjRkhycrJZK6lNmzamAsIblMwBsBW7NlX4+OOP07VgPXjwoFlA76abAruoMRAKYpPPS4ELZ6VU0p/y8sY3ZUD9XnI0poBJjhydfxfHr8mX/n15ximS38uL6znHUsw1pPPv4vxXKZFSuS8lQ9m9NiIeTRWuTEd+Vq9eLdWrV8/wc13gVReCnTFjhkmavvrqK1MFkVUkRADsx0ZP1SwdO3ZM11lOywxuu+02mThxYtDuC8gpx2ISTBKkyZCVFI2pfo8M3b5QHEnJ4iyX61IiU9KHfxqV/Ovcv5IfkxS9Wkwcfz98KRnKzrVhDzaMS9547733snRc3rx55bHHHhNv8TcTgK3YdYQoNTU12LcABJ2OCLknRVM3zDD7XQmLjur4qlRuj6TIcefv/rs2IhojRNlz6tQpWb58uVx33XVmTpEvmEMEwF6o0wbE7kmRjgy509EcvyQsmhTptQJx7YycSpEiSWnmQ/1F98dfTArM98K/mEPklXvuuceUe6ukpCRp0KCB2VerVi3517/+Jb5ghAgAItTAgQO9mrAK2IHOGdIyOXda2uaXURydM/T3w4G5diaNHF754XXp1/hvciS2gOujokknZMra1+V4nnwyqFFPOZs71r/fDQSRziV65plnzK8//PBDMyf2xIkT8s4778jzzz8vnTt39vqaJEQAbEZLDLwtMwjPsoTNmzdn6TidTwTYJRmyyuV+jy3omkNU6tc/PZsh+MK9gYKWybnNIcr2tS/TyKFU4p8m+bGSIisZ0v0qLvk8CVFExiXrPPs5efKka92hJUuWmARIFxhv166dz+vqkRABsBdfygzCtCxhypQppiNPdHR0sG8FCDpdf8g9GbK6zOnrgv0T/5e4/Lu0980PDiR7JkN/JT/pGi34cu0rNHI4cMtpV1L0Qp0u8syWBeb973EFTZJ01G3kCCHK1/K3MI1N2VWmTBnTaluTIk2I5s+f71qAPCYmxqdrMocIgL3YqE67bt268uefl54SV6xYUf74449g3xIQNEm58sqJPPEeyZDSV00sNJGRwtEi+Xx46q7nFI5O30Dhr6QoW9e+nFK5TdKjyY8mQa+tme6RDLmX0SGEMYfIK/3795euXbtK6dKlpWTJktKsWTNXKV3NmjXFF4wQAbAX7crjbWeeMO3kU6BAAfn5559Ne+1ffvmFTnOwtbO5YmRI3Z5mPSJtwe1BExcdvdGEJb8PI6r5o8U5r+SlMra0I0DZvfYVaNKjI0OaDFn0PclQhMcl6zwbevzxx826Q/v375eWLVtKVFSU68GfziHyBQkRAFtxOi9t3p4TjrSuumnTplKiRAkzT0g78WRWPqeJE2CHpEi3DGW3lE2TncwWXQ3g+kM6Z0jL5Nzpe0aIIjsuWefZyc033ywdOnQwm8Yz3dzpHCJfkRABQIR64403pFOnTrJnzx554oknpFevXnLVVVcF+7YA+MvvF10NFLRMzn0OkXujBSAS9OrVS/7zn//Ic889Z8rl7rzzTrPdeOON2W4OREIEwF5s1FRBtWnTxrxu3LhR+vXrR0IERIq/GjmUSkz2mDOkr1aSpK9P0Fgh9NFUIUu6detmtvPnz8uyZctMcnT33XdLSkqKGR3S5Kh169YSG+t9V0WaKgCwZ622t1uYmzVrFskQEEn+auSQtoGClRTpfl2HKDFX3mDfKQIVlyIgNvkib968cvvtt8vrr78uBw4ckI8//tiUhj/77LNSqFAhueOOO+Sbb77x6pqMEAGwFYfz0ubtOQAQUv5q5PDE4/emGwHSpEhHhjQZYg2iyIxL1nkQadSokdleeOEF+emnn0yCdPDgQa+uQUIED9EHL7XoDZTa4x4P2LVza3efACp2zLu/XN5KvXAxoNeHPUvmgEiQ54+kgF7/+k33BOzapxMDO0JT/rRIzOlz6b9XLjWPiJH0n3nDSWwKPErmvHbixAn54IMPTAKki7HqmkSbNm2SYsWKyYABA7y+HgkRAHuxUdttAEAYoO22V77//ntp0aKFJCQkmCUltNmCJkT//ve/Zd++fTJnzhzvLsgcIgAAAADhYuDAgfLQQw/J7t27JSbmf230dV6RLs7qCxIiAPZi49XA//nPf8pNN91kVvb+9ddfzb7JkyebTj0AgDCLSxESm7y1fv16+dvf/pZuf6lSpeTQoUPiCxIiAPZi06Azffp081RNn6Bp7bW2KVUFChQwSREAIEhIiLzuMnfq1Kl0+3/88UcpUqSI+IKECIC92DTovPrqq/Lmm2/KM888I9HR0a79utL31q1bg3pvAGBrJERe0fWGRo0aJRcvXmr4oYuy6tyhIUOGSOfOncUXJEQA7MWmaz3s3btX6tatm+GTtrNnzwblngAArEPkrYkTJ8qZM2ekaNGikpSUJE2bNpVKlSqZtfa09bYv6DIHwFbsug5RhQoVZMuWLVKuXDmP/UuWLJGqVasG7b4AwO5Yh8g72l1u6dKlZvHV//73vyY5qlevnuk856uAjBD9/vvv8sADD5jVYmNjY6VmzZqyYcOGQHwVACALdP5Qnz59ZMGCBeJ0OmXdunXmSdrQoUNl8ODBEumISwDsbMyYMXL99debURQdWenYsaPs2rXL45hz586ZOKE/J/Ply2fKzw4fPuxxjJamtWvXTuLi4sx1dA2g5ORkj2NWrlxpEhStQNCRm9mzZ6e7n2nTpkn58uVNlzhdVFVjkre0SdDjjz9uYlh2kqGAJETHjx83N5g7d2757LPPZMeOHWZo6+qrr/b3VwGA92xap/3II4/IuHHjZNiwYZKYmCj333+/abQwZcoUuffeeyWSEZcA2H0O0apVq0yy8+2335rRFZ1/06pVK4+S6QEDBsgnn3wi77//vjn+wIED0qlTJ9fn2oxHk6ELFy7ImjVr5J133jHJzvDhwz3Ks/WYW2+91VQl9O/f38Sfzz//3HWMPpjTh3QjRowwi6nWrl1bWrduLUeOHMn0/ufPn5/l3+v+/fvN6FFQS+Y04JYpU0ZmzZrlUaoBAAiurl27mk0TIqv+2g6ISwDsTsuj3WkiozFg48aNcsstt8jJkyfl7bfflnnz5sltt91mjtGfmVpSrUnUDTfcIF988YV5oPTll19KsWLFpE6dOjJ69GjTzGDkyJGSJ08emTFjhvn5qg+dlJ7/9ddfy8svv2ySHjVp0iSzmGqPHj3Mez3n008/lZkzZ8pTTz2V4f3rA7znnnvOnNO+fft0pd56/5oEvfvuuybh099LUEeIPv74Y9O16O677zZ/0DqJVzsbZeb8+fOmdZ77BgCB4nCr187yJuHv+eefN0/ulFXqYBfexiVFbAIQ0nHJLTal/VmlP7+uRBMIVbBgQfOqiZGOGrmXnlWpUkXKli0ra9euNe/1VcuNNRmyaJKj37l9+3bXMWnL1/QY6xo6uqTf5X5MVFSUeW8dkxEdsdKHW5rs1KhRQ/Lnzy+VK1c291O6dGlT5tezZ09zv9u2bTOd6IKaEP38888mi9Ob1OGx3r17yxNPPGGG1TKradTJUdamT/EAIGBs2slHSyC0lvvGG2+U1157TY4dOyZ24W1cUsQmAOHSZU5/Prn/vNKfX5eTmppqStm0lFiTC6ULmuoIj65N506TH2uxU311T4asz63PLneMJk3aEU5jj5beZXTMlRZV1SRHEyKd1zRnzhzp27evqXrQ0anvvvvOlPiNHTs23bWDUjKnf8j6JO7FF1807/VJnGZqOhzWvXv3dMfrhF6tI7ToHxiBB0DA+DInKALmEGknHn2CN3fuXJkwYYIJhi1btjTBRCfX6qhRpPI2LiliE4Ac4+tcVef/5szoiIlFmxlcjs4l0p+BWsoWjgoXLmzilj/5fYSoRIkSUq1aNY99WuenXSkyov+j6f+I7hsAwP+qV69ukgIdMVmxYoXp8KOJUfHixSWSeRuXFLEJQLhI+7PqcgmRjqosWrTIxAAtNbMUL17clLOdOHHC43gdjbFihL6m7Tpnvb/SMXpf2uFTkxldHDyjY4IZi/yeEOnwW9o2fj/++GO6tS8AIChs2mUurfj4eBOctETCWu07UhGXANi9y5wut6DJ0IcffijLly9P11imfv36phPnsmXLXPv056Y+OGrcuLF5r69bt2716AanJWya7FgPnfQY92tYx1jX0Jij3+V+jI7i63vrmIhIiLRln3aj0KeQe/bsMd0q3njjDTM8BwDB5tPE1QhJiLSpgq49pCNFWkK2efNm07XnSnXb4Y64BCAS45I3sUl/3mkHNv35p2sR6c993XRej9K5Rw8//LApFdbRI218oB3dNEnRDnNK23Rr4vPggw+aMmydk6lLOei1rVGpxx57zFQh6NpAO3fuNHNWFy5caH4OW/Q7tLGNzuP84YcfzLxObf9tdZ0LBr/PIdJFnzT71PrrUaNGmQx08uTJpk4dAILOpnOINKCtX79eatWqZYLOfffdJ6VKlRI7IC4BiOQ5RFmhjWVUs2bNPPZra+2HHnrI/FpbY2vHN12QVTvVaXc4TWgsWuqm5XaawGiipJUGOg9Tf65a9OerttDWBEjXudOyvLfeesvVclt16dJFjh49atYv0qRM23drW3BfmiGEbEKk7rjjDrMBQMixaULUvHlzs8ZD2rk0dkFcQlzKOYlLuSDH8qSfD1b02ClJjM0jZ+JjgnJvsLkcSIi0ZO5KYmJiZNq0aWbLjJYaL168+LLX0aRLKxAuR8v3dPPFuXPnzL1m5ODBg2beaNBL5gAglNm1ZE5L5eyaDAGaDL2wZ668tPsdKXLh0vorFn3/5pB35dXhCyTf2XNBu0fYV06UzEWSevXqyZYtW9Lt/9e//mWqIEJmhAgAEHxap62riGtZg3sL6YzoyuFApNKRoQLJiVLywnEZv3uODK7cTY7mSTDJkL4veeFSZ624pAuMEgEhTkegtAxc58AOGTLEzD/SeUw6V0kf/vmChAiAvfiy0GqYLsyqJQtWB7krlS8AkUzL5DQJupT8XEqKXirXUQb9+pF5/1vxAvLo2AfkSGHaqyMIfF0APExjU3bpvKZ27drJI488YuY0aZlcvnz5ZN26da6FZr1FQgTAXmw0h0g7BWX0a8COdETIPSl6efcss/9Anqvl0bFd5XARkiFE7hyiSNO2bVvp1KmTaRaRK1cu+eSTT3xOhhRziADYil3rtHv27CmnT59Ot19LDfQzwC5JkY4MudP3JEMIJuYQeeenn34yXe50dEhbf2uL7zvvvNO8+rquHiNE4SY1JaCXTz4Q2PVISrx2NHAXjwrs0HFg/+RFnBeTA/wFqYG9friw0QiRO13vYezYsWb9CXe6BsWcOXNMBzrAV87kAP/82vajXy5TxHlWBiUv99g3aPdCOXp3WzkaFS+BUFgCLAvdw7IjNcCxyZkS6OgaBhgh8oq26daSOU2GChQoIC1btpTbb79dunXrZhaB9aVEnBEiAIhgp06dkpMnT5qWqzpCpO+t7fjx46Z9atGiRYN9m0DAaTL0UvJyKSln5YDES//oFuZV349PWiJFUs8G+xYBZHEO0fz5800yZLnxxhtNIqQd6HxBQgTAXnwpSfDxKZyu5VC+fHmzXkKjRo3MhM/MbN++3SyGp8c7HA6zcGh2r6k0YBQsWNBc89prr5Wrr77atRUuXNiUy2l3HiCSFXYmeiRDg3LdJjuiCptXkxQ5z5ikqDBJEYLB13I5m44QPfjggxnu1wqIt99+26drUjIHwF5yqGRuwYIFptX1jBkzTOKiCY6u1L1r164MR2QSExOlYsWKcvfdd5sVvv1xTauZgo4O3XbbbWaNBk2OLHny5DGL7JUsWdL73yAQRhIll5xwxJi/y5oEHXVcKo/TV33/UsoKOeGIlURH7mDfKuyIkjmvaJl3ZvThX2YJ0+WQEAGwlxxKiHRdn169ekmPHj3Me01iPv30UzNX56mnnkp3/PXXX282ldHnvlxTNW3a1Lzu3btXypQpI1FRFAbAfhIdeeTp6KYSJ8lyzBHn8ZlJimLbmGRIjwNyHAmRV/r16+fxXhsp6ENFfcgXFxdHQgQAV+JLZx5vj79w4YJs3LhRhg4d6tqniUiLFi1k7dq13l3MT9fUkSClQWPfvn3meu58Xd0bCBea7CRKxgnPsQA1VACywteOcXbtMnf8+PF0+3bv3i29e/eWQYMG+XRNEiIAyCJtROAub968Zkvr2LFjkpKSIsWKFfPYr+937tzp03dn95pHjx41I0ufffZZhp/rtYFIF+e8kOEokdL5Q4wSAeGpcuXKppPqAw884FOcpXYCALJIS84SEhJc25gxYyRc9O/fX06cOCHfffedxMbGypIlS0wrbg0iH3/8cbBvD8iRZOjFlFUyIXmZ6TjnTjvMvZS0RF5I+tIcByD86AKtBw4c8O1cv98NAEToHKL9+/dL/vz/W8Axo9Ehpd3boqOj5fDhwx779X3x4sW9v2c/XHP58uXyn//8Rxo0aGBK7bSETtdu0N+PJna6pgMQyXRkqIDznOk0px3nrOYKmhyNT1phOs2Z45wXGSVCzmIOkVfSPsTTxkEHDx6UqVOnyk033SS+ICECYCvZmUOkyYN7QpQZndhZv359WbZsmXTs2NHsS01NNe/79u3r031n95pnz551daLTlttaQqdtuGvWrCmbNm3y6Z6AcKJlcqaj3F/tt/V1fHRjGZyy9lI7bkc+GRzbhvlEyHHMIfKOFQPdO8sVKVLEdFOdOHGi+IKECID95EAQ0fbY3bt3NyMyDRs2NC2yNSmxOsTpitqlSpVyld1pk4MdO3a4fv3777/Lli1bJF++fFKpUqUsXfNyrrvuOtOeW9cwql27trz++uvm19qprkSJEgH9swBChavN9l9J0eSUL81+Kxk6SjKEYLFpcuMLfRjobyREAOwlh9pud+nSxYzCDB8+XA4dOiR16tQx83aspgja6c29BbbWPdetW9f1fsKECWbTttkrV67M0jWv1KZUSwrUiBEjpE2bNjJ37lwz8jR79mzvf4NAGCdFOjJkJUPqpZibSYYQPJTMBR0JEQBbyYm22xYtZcusnM1Kciw6WqN10Nm55uVo5x2Llt79+uuvphNP2bJlzfwkwC50zpCWybkbdO4rRogQNJTMXZlWSGSVrtnnLRIiALAhXbyuXr16wb4NIMeTIatc7oDE/28OkfOMjE9aQlKUhnbci3Wey7hNuTNREiUXDSiQIzZv3pyl43Q+kS9IiADYSw6VzNnhiRoQTvQf8O7JkNVlbpDjNnkpZYUrKRpEYwVXMvTCuS+lQOo5GZS7ufmz8kgsLy6TE4688nSuW0mKsouSuSuaMmWKVK9e3XRbDQQSIgC2kpMlc5H+RA0IJzqaccIRY/4RaSVDSl91ZEiToROOWLM4Ky61H7/UpvyMSX6spMhKhnS//llqO/NEISHKDkrmrkzn2OrcWe0mV7FiRVm/fr0UKlRI/IWECIC92GiEaMWKFcG+BSBk6CjG09FNzT/g05aAaZmcjgxpMsRoxyU6SjY4prWMT/rclRSNz9VYBidrm/IzckDymSQpo3I6eIkRoisqUKCA/PzzzyYh+uWXX/zeaY6ECIC92CghysiePXvkp59+kltuuUViY2NNIwdGiGAXmuxkNppBmVx6JlHM3dw1IjQ5eanZbyVD7mV0yAYSoivq3Lmz6bqqy0RozNLlJzIrn9PEyVskRABsxU4lc+7++OMPueeee8yokQaT3bt3m7KDhx9+2CzU6utidgBs0KY8V2NXMqT0PcmQ/1Ayd2VvvPGGdOrUyTzUe+KJJ6RXr15y1VVXib+QEAGADQwYMEBy585t1j+qWrWqa7+ubaTNF0iIAGTapjzZs025vmeECDlN189TGzduNGvr+TMh+t+qgABgp9IEb7cw98UXX8i4ceOkdOnSHvsrV65s1iQCgLSKpP6vgYKWyfXP1dK8WnOKNFlCEONSBMQmX8yaNcuvyZAiIQJgLzYNOmfPnjVrD6X1559/St68eYNyT4AdWlcXTs04adD9+nmo0vsbf+5SQwVrztCOqCLm1T0p0nbmyCYSoqAjIQJgy1ptb7dwd/PNN8ucOXNc73UekXbpGT9+vNx6661BvTcgYtfxSfpSXkpaYkZa0o28JC0xn4dqUqQd97RNedoGCmbtpr+SIl2HSNuZIzhxydvYtHr1amnfvr2ULFnSxICPPvrI4/OHHnrI7HffrDI194doXbt2lfz585vObzoP9cyZMx7HfP/99ybmxMTESJkyZUycSev999+XKlWqmGNq1qwpixcvlmDiv2IA9mLTLnMakJo3by4bNmyQCxcuyODBg2X79u0muH3zzTfBvj0gQtfxSXIt+KprHWnXNk2G9L3ut44LxVbfek/PxLSQ2Ivn0rcpd8TLk7lbmGQoFO897ORQlzmtFKhdu7b07NnTNCjISJs2bUxJmiVtBYEmQwcPHpSlS5fKxYsXpUePHvLoo4/KvHnzzOenTp2SVq1aSYsWLWTGjBmydetW832aPOlxas2aNXLffffJmDFj5I477jDnduzYUTZt2iQ1atSQYCAhgqfUlIBe3hng6wdUoFsTOyPgX91hwK5d5jTI/PjjjzJ16lRTe61P9DQg9unTx7QxBUKZMzk5sNdP8X9sOiIOeVKaygRZeSkpSvxMxjkayhDnOikpZ+WAxJvPj57T2BKaZWeasp0RXaj2YrrPjpr9kuFnXiH25ViXubZt25rtcvLmzSvFixfP8LMffvhBlixZYhZF1bbX6tVXX5Xbb79dJkyYYEae5s6dax66zZw5U/LkySPVq1eXLVu2yKRJk1wJ0ZQpU0ziNWjQIPN+9OjRJsHS+KRJVDBQMgcAEU6f4uno0JEjR+SZZ56RhQsXmvKE559/nmQICKCjjjh50tHMJD+aBE1xrvhfMuRoZj4HQsnKlSulaNGict1110nv3r3Nkg2WtWvXmpEeKxlSOhIUFRUl3333nesYXedOkyFL69atZdeuXXL8+HHXMXqeOz1G9wcLCREAe7HhxFVtt6013QByniY9OjLkTt+TDMFfTRW0TM19O3/+vE+30aZNGzPXdNmyZaYr6apVq8yIUspfI6iHDh0yyZK7XLlyScGCBc1n1jHFihXzOMZ6f6VjrM+DgYQIgL3YMCFSDzzwgLz99tvBvg3Adoo4E02ZnDt9r/sBfyRE2rggISHBtencHF/ce++9cuedd5omBzqnZ9GiRaY8TkeNIh1ziADYilbrezsbLMCzx3JEcnKyqen+8ssvpX79+hIf77mgotZ3A/AvTXomOFe6yuTc5xDp/iclfdmcNlmIk4vpGhkobXGdKLlNBzjYOy5Z56n9+/ebrm8Wfy2lULFiRSlcuLDs2bPHlF3r3CItvU4bW7Q5jzXvSF8PHz7scYz1/krHZDZ3KScwQgTAXmw6QrRt2zapV6+eaaigzRU2b97s2nTCKwD/KpwmGdI5QzschT3mFOnn7uv4aDI0xrlaJjpXphtB0ve6Xz/X4xBBsjlCpMmQ++avhOi3334zc4isuaaNGzeWEydOyMaNG13HLF++3Czh0KhRI9cx2t5b565atGGCzkm6+uqrXcdoWZ47PUb3BwsjRABsxa5d5lasWBHsWwBsRUdyTsilf5i6N1AwjRakmUmG9HM9zqIjQwXkfLoRJPeRJus49/MQ3nKqy5x2F9XRHsvevXvNA7GCBQua7bnnnpPOnTubkZqffvrJLM9QqVIl0/BAVa1a1cwz6tWrl+kGp0lP3759TamddphT999/v7mOrk80ZMgQ8zBOu8q9/PLLru/t16+fNG3aVCZOnCjt2rWT+fPnmyUh3njjDYnYEaKxY8eahZ369+8f6K8CAOCKiEvICVrWNtRxi/wjg25y+l736+fu5W9aJpd2BKma81i6kaaMyumAK9Gko27dumZTAwcONL8ePny4REdHm+Y7Oofo2muvNQmNlld/9dVXHiNO2lZbF1TVEjptt92kSROPREbnMH3xxRcm2dLz//GPf5jrWy231Y033mjWHtLzdF2kDz74wCwSG6w1iAI+QqQTsV5//XWpVatWIL8GALLOpguz4hLiEnKSJjuZjeRkltS4jyBZrboVrbojWA4tzNqsWTNxXmbdp88///yK19CRJGsR1szoz1dNpC7n7rvvNluoCNgIkQ7L6Wq2b775pqtmEABCgs3mD+ES4hLCBa26bciGc1tDScASIl39XOsC0y68BAChUKvt7YbwR1xCuKBVt734GpeITSFeMqeTozZt2mRKE65EF49yX0BKF5QCgIChZM6WvIlLitiEcGrVHaqy1EKc/l45VjKHHBwh0l7o2j1CJ13FxMRc8XhdPMp9MSldXAoAAoWncPbjbVxSxCaES6vuUEUL8axjhCgCEyLtTa6LNul6F7ly5TLbqlWr5JVXXjG/TklJ8Th+6NChcvLkSdemgQsAgGDFJUVsQjBbdadtoGAaLfyVFKVt1R2q0rYQt5Ii9xEw/VyPA4LN7+OU2oZv69atHvt69OhhWvRpP3Jt6+dOW/n5awEpALgiSuZsx9u4pIhNCFqrbrklwzIz06pbml0qM3Nr1R2qjqXplqev4+R/5X+uFuISG+xbDT5K5iIvIdJV0NP2EY+Pj5dChQoFtb84ANh5YVY7Iy4h0lt1h6ostRC/TBtou8iphVkRxIVZASDsW5sSdADAJ7QQD2BcIjb5TY609li5cmVOfA0AXBklcyAuAUFvIR5O3fICjpK5oGOECICt0MkHAILTQryf41aPbnmsq3QJXeaCj4QIAAAAfhVJLcQR+UiIANgLddoAEHCR1EI84JhDFHQsDwzAVhxOp9m8PQcAEIAW4vxT1Ke4ZJ0H/+C/QgD2QlMFAAidFuL8o56mCiGAhAjIKn5oRwTWIQKQDj/fEUSsQxR8JEQA7IURIgBAKGGEKOhoqgAAAADAthghAmArlMwBAEIJJXPBR0IEwF4omQMAhBJK5oKOhAiArTBCBABZE+e8mGHbbKULqpq22Q7WEcouRoiCjzlEAOyFxe8AIEvJ0Bj5SibKKiniTPT4TN/rfv1cj0M2sTBr0JEQAbDt07isbgBgNzoyVEDOS0k5KxPckiJ91fe6Xz/X45DzcYnY5F8kRAAAAPCgZXJPSlM5IPGupKia85grGdL9+nlG5XRAuCEhAmC/BRh92QDAZo6mSYqmyEqPZEg/RxDjErHJb0iIANiKL2UJlCYAsCtNesbJ9R779D3JUPDjErHJf0iIANgLE1cBIMt0ztAQWe+xT9+nbbSAbKCpQtCREAGwFUeqbxsA2I17AwUtk+snzTzmFJEUBTcuEZv8h4QIgL3wFA4ArkjXGUrbQGGHo3C6Rgt6HLKJEaKgIyECAACAB1109YTkTddAwb3Rgn6uxyE8rF69Wtq3by8lS5YUh8MhH330kcfnTqdThg8fLiVKlJDY2Fhp0aKF7N692+OYP//8U7p27Sr58+eXAgUKyMMPPyxnzpzxOOb777+Xm2++WWJiYqRMmTIyfvz4dPfy/vvvS5UqVcwxNWvWlMWLF0swkRABsBUmrgLAlSU6cstQuVn+kUE3OX2v+/VzPQ7h0VTh7NmzUrt2bZk2bVqGn48fP15eeeUVmTFjhnz33XcSHx8vrVu3lnPnzrmO0WRo+/btsnTpUlm0aJFJsh599FHX56dOnZJWrVpJuXLlZOPGjfLSSy/JyJEj5Y033nAds2bNGrnvvvtMMrV582bp2LGj2bZt2ybBkito3wwAweBLq1JamwKwIU12MhsBYv0hP/K1hbaX57Rt29ZsGV/KKZMnT5Zhw4ZJhw4dzL45c+ZIsWLFzEjSvffeKz/88IMsWbJE1q9fLw0aNDDHvPrqq3L77bfLhAkTzMjT3Llz5cKFCzJz5kzJkyePVK9eXbZs2SKTJk1yJU5TpkyRNm3ayKBBg8z70aNHmwRr6tSpJhkLBkaIANgKI0QAgEgaIdJRGfft/PnzXt/D3r175dChQ6ZMzpKQkCCNGjWStWvXmvf6qmVyVjKk9PioqCgzomQdc8stt5hkyKKjTLt27ZLjx4+7jnH/HusY63uCgYQIgL0wcRUAEEFNFXSejiYv1jZmzBivb+HQoUPmVUeE3Ol76zN9LVq0qMfnuXLlkoIFC3ock9E13L8js2Osz4OBkjkAtuLLiA8jRACAQPG1EsE6Z//+/abJgSVv3rx+vDt7YIQIAAAACFOaDLlvviRExYsXN6+HDx/22K/vrc/09ciRIx6fJycnm85z7sdkdA3378jsGOvzYCAhAmDPyavebgAAhFJc8mNsqlChgklIli1b5tqn85F0blDjxo3Ne309ceKE6R5nWb58uaSmppq5RtYx2nnu4sWLrmO0YcJ1110nV199tesY9++xjrG+JxhIiADYCk0VAAB2bLut6wVpxzfdrEYK+ut9+/aZdYn69+8vzz//vHz88ceydetW6datm+kcpy2xVdWqVU13uF69esm6devkm2++kb59+5oOdHqcuv/++01DBW2pre25FyxYYLrKDRw40HUf/fr1M93qJk6cKDt37jRtuTds2GCuFSwkRADsJQebKuhaD+XLlzcLz+nTMw0gl3OlheoeeughE7TcNw1OAAD7NlXIKk066tatazalSYr+evjw4eb94MGD5e9//7tpj3399debBEoTF41JFm2rrXGqefPmpt12kyZNPNYY0qYOX3zxhUm26tevL//4xz/M9d3XKrrxxhtl3rx55jxdF+mDDz4wrb1r1KghwUJTBQC2klNNFfSpmAYbXVNBkyFd38FqPZq2S4/7QnXaHeiOO+4wwUKfym3atMkjSGgCNGvWLNd7Js9GEIcjcNem7BOI2KYKWdWsWTOz3lCm13M4ZNSoUWbLjHaU0/h0ObVq1ZKvvvrqssfcfffdZgsVjBABsJdUp2+bl3QROi0r6NGjh1SrVs0kRnFxcWaxuoy4L1SnZQm6UF29evXMQnXuNAHSOm9rs2qyAQA2i0s+xCZkjIQIALIoq4vf6SrdOunUfeE5XbhO32e28FxWF6pbuXKlGWHSCaq9e/eWP/74wy+/NwAA7IqECIC95MDid8eOHZOUlBSvFp7LykJ1OoI0Z84c051n3LhxsmrVKmnbtq35LgBAmMqhOUTIHHOIANiKztLw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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig,axs = plt.subplots(1,2,figsize=(10,4))\n", + "\n", + "model = axs[0].imshow(prf_mod[0,:,:], origin='lower')\n", + "axs[0].set_title('lkprf model')\n", + "fig.colorbar(model, ax = axs[0], label='relative flux')\n", + "\n", + "# Plot the real data. We randomly select the 100th observation from the TPF data cube\n", + "data = axs[1].imshow(tess_hdulist[1].data['FLUX'][100,:,:], vmin=0, vmax=40000, origin='lower')\n", + "axs[1].set_title('Data')\n", + "for a in range(len(target_list)):\n", + " axs[1].scatter(target_list[a][1]-origin_col, target_list[a][0]-origin_row, color=\"red\", marker=\"x\")\n", + "fig.colorbar(data, ax = axs[1], label = 'flux (e/s)')\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d37e34a0-8e88-4b9e-b46e-ed6db0336a54", + "metadata": {}, + "source": [ + "## Step 5: Creating the apertures and calculating the dilution factor\n", + "\n", + "Now lets generate the three possible apertures for our object using the `get_aperture` function and see what is selected. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e42517db-3bec-4bf4-ad17-95d9f87a8373", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dilution Factor: 0.9930311782891152\n" + ] + } + ], + "source": [ + "simple_ap, di_simple = prf_initial.get_aperture(aperture_type=\"simple\", completeness=0.99, tess_mag = TESS_mags)\n", + "print(\"Dilution Factor:\", di_simple)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fd874bf1-61b7-4c35-93d3-88daf4f5208f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dilution Factor: 0.9994431185627324\n" + ] + } + ], + "source": [ + "strict_ap, di_strict = prf_initial.get_aperture(aperture_type=\"strict\", tess_mag = TESS_mags)\n", + "print(\"Dilution Factor:\", di_strict)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "af64f550-92ab-4bf2-a5e1-1fbb4c165871", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dilution Factor: 0.9986946254369692\n" + ] + } + ], + "source": [ + "balanced_ap, di_balanced = prf_initial.get_aperture(aperture_type=\"balanced\", crowding_metric = 0.8, fluxfrac_metric = 0.9,tess_mag = TESS_mags)\n", + "print(\"Dilution Factor:\", di_balanced)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a4b5b972-e009-49eb-b88c-fb614bc68e10", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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aJ24/PLLzb5cdNFF4S/+2mjRk1X6O3fp0sXUG60NWieiL3PV/dfn0UBNa0ePHj1MTdPn1dqjtU5pIy4VzzzzjKl9ui8apGmDz27NA4BUbd68WdatW2eO79pjWb+7btu2TX7+859XW0+/n+uxU0MUPbH/0ksvmfqgl4DqifN4li5dao6ruq6e3CgrK5O//e1vJhTS8Kd169bV1r/33nvNMAQavum+3X///eY1tZ5YJk2aZGpCq1at5JprrjHtJR0/U/dFb6tkj6OrV6824Zf2CLbW0zaX1ptk6UkYfc7f/OY35rbWnwsvvNA8t+5bNG0zaGB10003mfdc66OGb59//nn4dbX2aPtFA0s98aPvidYLbSPpySWt24lq9WGHHSarVq0y75XW+nToe6O97DSg00BVQz2loZmGbvq7aucPPdGlQ0lou0cDv9q1a6f1uoDrQgicd999N1SrVi2z9O/fP3TjjTeG3nnnnVB5efk+6x5wwAGhCy64IHz7mWee0ZZKaMiQIaGqqqrw/fo8eXl5ocsuuyx83549e0Jt2rQJHXvsseH7li1bZravW7du6LvvvgvfP336dHP/ddddF77vjjvuMPdZli9fbvb57rvvrraPc+fODRUUFOxzfyyzZs0yzzlp0iRzW38H3cdrrrmm2np29vOEE04Ide/ePbRr167wffq8Rx55ZKhTp077vHdHHXWUeW8iPfDAA+Yxfd1Y+6HbRtP79T2Kfr9+9rOfVVvPifcNAPyoQfXq1atWg2o63kU+Zlm8eHEoPz8/dPrpp4cqKyurrRtZx7p27VqtXiVDj/0jR44M37711ltDzZo1C1VUVFRbT59X9+nBBx8M37d79+5Qz549Qy1atAj/7v/617/Mvn700UfVth8zZozZ/pNPPgnfp7d13fnz51dbd+3atfvUh8j9iPU76nus9T669jRo0CC0Zs2aausmW/MAIFXWd+bopU6dOqFnn312n/V37NhR7bYeU7t16xY6/vjjE7Zr9DgWXRf0+Kevc+edd4bve//9983rd+nSxRy7LY8++qi5X79TK/1+3759e/M6GzdujFtvkj2OXnvtteb5tf1h0WNyw4YNY7YbYvnPf/5j1tVaqLZs2RIqKioKPfzww9XWs37H/fbbz6xjefnll839+rta+6n7GN0W1M9Af/ef/OQnSdXqK664olqtjt4P/bem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DSg906TTZ+tg2tpjQRspNbEaUbfddpucc8455izV8OHDTZHRQVV1um39V3tsaGGxejEkI533DQD8rEF6bNSzynqpo44xpg2UWOPFJKLHcT226hdqHRhaTy5or4WZM2ea57znnnvCrzV69GhzvNRttLFjDfIfSWuB9oDQQYy1F0QsWmv00iO9xNMao0Vf67777jPHYe0drL+vjufz5JNPhseqPO+888wYnDowswaOejZdGwMafun92uMicrygWPTsu15uqs+vr6OXKmmPBF308iV9L/VyIp0cSPdPe2Lr5VFbtmxJ6v10ouYBQDJ0WBI9/ik9XmkPKu0xdfPNN5uTzUrHo9Tj2oknnmgGwNf19Dilx3GdFCYRPcGuJ1m07hx55JFmAhltC1i9xuzSkzZaR/Q7vPaA1ufVS031d5g/f354Ippkj6Pa3vjXv/5lfrdrrrnGtAu0ZmjYVNPvpu+Vhnfx2j4a0un4Yvr7RtZVrRm6b7rvuk/a9tH3UvfT+h3//ve/m2BNa4eup+O5afiodUs/l3HjxiXd9rn66qtNTdLwTNtAOr72WWedJX/5y19MQKrtGB0Dz864ZjoRj07mo/Vd66wO3aN1Vv92NCjV+qxhIhBofk8bin29/fbboYsuuijUuXPnUP369UOFhYWhjh07hq666qpQWVlZwmmiremoZ86cWW09a3rjtWvXVrtft61Xr94+Uxc/8MADoQcffDDUtm1bM8X00UcfHfriiy9iPme0V199NXTUUUeZ59VFfw+dQnnRokVxf+fhw4ebqZ63b98ed51f/OIXodq1a4fWrVtnaz/VN998Ezr//PNDLVu2NM+hU0cPGzbMTDld03tn+eMf/2i2y8/PrzaltU4nffHFF5uprktKSkI//elPzdTXuo6+RzV9Bum8bwDgZw1auHBh6JhjjgnVrVvXHN+sepToeBevdjz99NOhww47zBzLGzduHDr22GNDkyZNCj++evXq0NChQ81xVrfXx+MdS/Xxf/zjH3F/xylTpph1Hn30UXNbn6tr166hWbNmhfr372/qkdbXxx9/fJ9ty8vLQ/fdd59Z39rXXr16hf7whz+ENm/eHF5Pn1+P4bFMnTrVbKPvbXSt+Pe//x3q0KGDeaxnz56hd955x7yvuj+WyBoYSzI1DwBSZX1njlz0uKnHrNGjR4eqqqqqra/H406dOpljptYW3T5WLYhu1+zatSv0m9/8JtSqVStTZwYMGBCaNm2aOWZH1oD333/fPNcrr7xS7fmsY6W+XqSPP/449JOf/MTUE/3Ofeihh4b+8pe/pHQc/fLLL82+6O+v62h7QX/fyLZCLN27dw/tv//+Cd/ngQMHhlq0aBGqqKgI/44vvvhi6JZbbjH363uidfHbb7/dZ9vPPvssdMYZZ4SaNm1q3nd9b7WNMnny5PA6iWr1nj17TN1v3rx5KC8vr9pnpeuPGDEiVFxcbGrgr371q9C8efP2ea+j25nRnnzySVML9ffQz0LfkxtvvDG0atWqhO8LEAR5+n9+h3kIDj0Trz0KdIDKIPeCypT9BAAEn17Gs27dOjNuDgAAQTNlyhQzXpz22KK3FuA/xkgDAAAAAAAAkkCQBgAAAAAAACSBIA0AAAAAAABIAmOkAQAAAAAAAEmgRxoAAAAAAACQBII0AAAAAAAAIAkFEjBVVVWyatUqKSkpkby8PL93B4DP9OrzrVu3SuvWrSU/P/Xsf9euXVJeXp7StoWFhVJUVJTyayN4qDUAglRnFLUmu1BnAASt1lBnsjhI04LTtm1bv3cDQMCsXLlS2rRpk3LBaX9AfVm9pjKl7Vu2bCnLli2j8GQRag2AINUZRa3JLtQZALHQpskOgQvS9KyNOkpOlgKp7ffuAPDZHqmQj+Wt8LEhFXrWRgvOstkHSIMSe2eAtmytkva9vjXPQdHJHtQaAEGpM4pak32oMwCCVGuoM1kepFldn7XgFORRdICc9795hZ24LEILTioNHGQfag2AMOoMXECdAVANtSarBC5IAwC3VIaqpDJkfxsAANyqM9Z2AAAkgzaN/wjSAOSMKgmZxe42AAC4VWes7QAASAZtGv8RpAHIGVXmf/a3AQDArTpjbQcAQDJo0/iPIA1AzqgMhcxidxsAANyqM9Z2AAAkgzaN/xihDkDOdYO2u9j1/fffy89//nNp2rSp1K1bV7p37y6zZs0KPx4KhWTUqFHSqlUr8/igQYNk8eLF1Z5jw4YNMnLkSGnQoIE0atRILr74Ytm2bVu1db788ks5+uijzcw7bdu2lfvvv3+ffXnllVekc+fOZh3dj7feesv27wMAcLfO2K011BkAyF20abr7XmtsB2kffvihDB8+XFq3bm1mnHj99dfDj1VUVMhNN91kfrF69eqZdc4//3xZtWqV0/sNAIG0ceNGGTBggNSuXVvefvtt+eqrr+TBBx+Uxo0bh9fR4vDYY4/JmDFjZPr06eZ4OWTIENm1a1d4HS048+fPl0mTJsn48ePNsffSSy8NP75lyxYZPHiwHHDAATJ79mx54IEH5Pe//708+eST4XWmTp0qP/vZz0zB+uyzz+S0004zy7x58yTIqDMAEB91Jn3UGQBIjFqTWF5IY0Qb9E385JNPpFevXnLGGWfIa6+9Zn4JtXnzZjnzzDPlkksukR49epg3/5prrpHKyspqyWUi+kY2bNhQBsqpTBUNQPaEKmSKvGGOL3omIxXWcWXZwlZSYnOq6K1bq6R95x+Sfv2bb77ZHCM/+uijmI/rIVe/lP/mN7+R3/72t+Y+fe7S0lJ59tln5ZxzzpEFCxbIIYccIjNnzpTevXubdSZOnCgnn3yyfPfdd2b70aNHy2233SarV6+WwsLC8GtrY2DhwoXm9tlnny3bt283RctyxBFHSM+ePU3BCyq364yi1gAISp2xW2uoM+mjzgDItVpDm8ZZtiv9SSedJHfddZecfvrp+zymH6omjT/96U/l4IMPNr/c448/bpLFFStWOLXPAOB5N2gtXJHL7t27Y77Gm2++aQrFWWedJS1atJDDDjtMnnrqqfDjy5YtM4VCuz5HHjv79esn06ZNM7f1X+36bBUcpevn5+ebsz3WOsccc0y44Cg9A7Ro0SLzpd9aJ/J1rHWs1wkq6gyAXL20M5laQ51JH3UGQCajTSO+1xrXx0jTVFK7TOsbGIt+cNEfJgC4OTCn3UXp9fpaHKzlnnvuifkaS5cuNWdWOnXqJO+8845cfvnlcvXVV8tzzz1nHteCo/RsTSS9bT2m/2rBilRQUCBNmjSptk6s54h8jXjrWI9ni5rqjKLWAAhynbFTa6gz3qPOAAgS2jTie61xddZOvTZWxxjQ61njdR/UD+4Pf/iDm7sBAIZO+mx/qui9Vq5cWe04VqdOndjrV1WZsy5/+tOfzG09e6PX72u34wsuuCDlfUfqdUZRawAEtc5Y2yVba6gz3qLOAAga2jT+c61Hmg7UqV2i9dpZTTLjueWWW8xZHmvRDxYAgkYLTuQSr+jorDU6FkCkLl26hC8Hadmypfm3rKys2jp623pM/12zZk21x/fs2WNmvYlcJ9ZzRL5GvHWsxzNdsnVGUWsAZEutoc54hzoDINvQpglwkGYVnW+//daMMZDo7I1+cNEfJgC4oVJCKS126Ow2ek1/pK+//trMRKPat29vDvqTJ08OP66Xf+g4Af379ze39d9NmzaZ8Vgs7733njkzpOMOWOvorDd6vLXo8VbHc7Fm09F1Il/HWsd6nUxmp84oag2AINcZO7WGOuMN6gyAoKJNI77Xmny3is7ixYvl//7v/6Rp06ZOvwQApKQylNpix3XXXSeffvqp6Qa9ZMkSeeGFF8z0zVdccYV5XMdYufbaa80gxzqI59y5c+X88883s9ZYM4bp2Z4TTzzRzBg2Y8YMM2POlVdeaWa/0fXUueeeawbl1GmgdUrpsWPHyqOPPirXX399eF90ljGdGUenqtZZb3QqaZ1xTJ8rk1FnAGRbnbFTa6gz7qPOAAgy2jS/973W2B4jbdu2beaNjJyt4fPPPzcDxmn3P50ues6cOWZqUp0m2hoATh+PnIkBADJpPIFk9enTR1577TVzicedd95pztY88sgjMnLkyPA6N954o5nC+dJLLzVnaY466ihTHIqKisLrPP/886Y4nHDCCWZmmxEjRshjjz0WflwHB3333XdNMevVq5c0a9ZMRo0aZZ7TcuSRR5qid/vtt8utt95qBgvVqaS7desmQUadAZCrY6QlgzqTPuoMgExGm6aT77UmL6QX/dswZcoUOe644/a5Xwec02RQ3+BY3n//fRk4cGCNz6/dAfXNHCinSkFebTu7BiAL7QlVyBR5w4w3kuplEtZxZc5XpVK/xF5H3G1bq+TwQ8rSen3Y43adUdQaAEGpM4pa4y3qDIBcqzXUGZ97pGnxSJS92czlAMAzVaG9i91t4C3qDIBcqjPWdvAOdQZAJqNNk8WzdgIAAAAAAAA53SMNADJVpeSZxe42AAC4VWes7QAASAZtGv8RpAHIGRQdAICbCNIAAG6jTeM/gjQAOaMqlGcWu9sAAOBWnbG2AwAgGbRp/EeQhoymg8FWSZXkSZ7k5+U7tq5dVaEqCUlI8iVf8vI4SAUVZ28AAG6iRxoAwG20afxHkAZPdey+w7HnKtuxSSYsnSGNi0pkaPs+Uli7sOZttm+UCd9Ml8Z1S2Roh35SWCu9/wTKK/fIhKXTZePOrTL0wH5SWq9xys+15IuitPYFNauUfLPY2wYAIjh8IsZzoSq/9yCrpVJn9m4HAP9DnUENaNP4L8P/K0Wu2idESzIQ06BLAy8NvjQA0yAsCCEaAAAAAAAIPoI05EyI5mSYRoiWmUL/G0/AzqLbAADgVp2h1gAA7KBN4z+CNORUiOZEmEaIlvnjCdhdAABws85QawAAyaLO+I8gDTkXoqUTphGiZbbKUH5KCwAAbtYZag0AIFnUGf/xbsJ3u/aUy4L1Kz0N0VIJ0wjRMp/O2Vol+TYXzt4AANysM9QaAEDyaNP4jyANvlu2uUw++H6uzC5b4mmIZidMI0TLDnSDBgC4iUs7AQBuo874jyANvuvStK30KT1IZpZ9vU+Y5naIlkyYRogGAAAAAACUO6kEYFOv0o7mXw3TrNtehWjRYdqEb6ab4Gxoh37mfkK07JHK+ACVoZBr+wMAyC6pjkNDrQEAJIs2jf8I0hDIMG3tzk2yatsGz0K0WGHaG4s/MfdtLd9JiJZV4wnY69bMeAIAADfrjLUdAADJoE3jP4I0BC5M0xBt+ZY15raXIZpFA7PB7XvL+G8+NbeHHXgEIVqW0IE2K21e0V4lnL0BALhXZ/ZuR60BACSHNo3/CNIQKHo5p/ZEs8xdtzzcU80rOibazNWLwrf15xbFjTwP9OA8ukEDANzEpZ0AALfRpvEfyQACI3pMNA3RIsdM80LkxAKndxpg7oscM40wLbNZ0z/b24aiAwBwr87s3Y5aAwBIDm0a/zFrJwIh1sQCGp7Fm83TDbFm50w0mycAAAAAAMgtBGnwXaLZOb0K02KFaBYvw7SloQWyKPS5a8+f6ypDeSktAAC4WWeoNQCAZFFn/EeQhsCGaF6FaYlCNC/DNA3Rlsp8qS11HH9u7KWDcqayAADgZp2h1gAAkkWd8R8DPiHQIZrFGiPN6THTkgnRosM0N8ZMm716sSyVRdJBukqHvC6OPCf2VRXKN4u9bRhPAADgXp3Zux21BgCQHNo0/iOWROBDNLd6ptkJ0dzsmaYhms4MSojmPs7eAADcRI80AIDbqDP+491ERoRoTodpqYRoboRpVojWp+XBhGgeqEphTAHdBgAAt+oMtQYAYAdtGv8RpCFjQjSnwrR0QjQnw7TIEK1Xy062twcAAAAAAN4iSINnNoc2pB2ipRumORGiORGmEaL5o0ryU1oAAHCzzlBrAADJos74j8kGkLaqUJXk5+XXGKLNkQ+lmQMhWtwJCFod5FmIls4EBIRo/qkM5ZvF7jYAALhVZ6ztAABIBm0a//FuIi17QhUyRz4wQVlNIVp9aehYiBazZ9rqxZ6GaKn0TCNE81eV5KW0AADgZp2h1gAAkkWd8R890lBNx+47bK1fUbVHFiytki92fShDO/SV0uJG+4yJ9uHSGf/ridZLCmsXOrzH/+uJlpdnAqq8WvnSu/XB1R4vr6yQt5bMkI27tsrwgwdIaf3UQrREMwa3bNhchh00QMYv/kTeWjpDhh7UXwpr1a62zuxVi8w+9m3dRXpF7aPqeOhOcdOSL+tKruPsDZAjauglndZT13b3q1PI7enpKxhu2E30SANyBHUmPuqM62jT+I93E2mpnV9gepnpuGc6/pkGZ05OLJAs7d3Vd78uMuP7BTJr1aJqIdr4r6fJhp1bZPhBqYdoydDnHtZpgGzYtUUmfD3NvHZkiDZj1YK4IRq8wVTRAIAg1hlqDQAgWdQZ//FuIm0akEWHaV6GaBbtiRYZpnkZoiUK0wjRAAAAAADIDlzaCUfDtAnLZsprS6aa+0qLG3sWolmsyzo1TNNFX9urEC06TNPLPP/x2QRzHyFaMFSF8sxidxsAANyqM9Z2AAAkgzaN/+iRBsdoaNWn9McB9PVnL0M0y6GlHcI/ty5p5mmIZtHX1Ne2dI/YJ/inKoUu0EwVDQBws85QawAAdtCm8R/vJhyjl3O+++0caVpUYhb9OXLMNC9Yl3NqgNeuUUtZvml1tTHTvKKXc+pr6z7ovkSPmQZ/VIXyU1oAAHCzzlBrAADJos74j0s74YjoMdGUXuap98WazdMNscZE0xBNL/FU0bN5uiV6TLSybRvNZZ4apsWazRPeqZQ8s9jdBgAAt+qMtR0AAMmgTeM/YkmkLdbEArEmIHBTeeWemBMLRE9A4LZYEwskms3TDVvLd7r6/JmMszcAADfRIw0A4DbqjP9sv5sffvihDB8+XFq3bi15eXny+uuvV3s8FArJqFGjpFWrVlK3bl0ZNGiQLF682Ml9RoAkmp3TqzBNQ7QJS6fHnZ3TqzAt0eycXoVp+h6/suhD+XLtMleeH/ACdQYA4CbqDADA0yBt+/bt0qNHD3niiSdiPn7//ffLY489JmPGjJHp06dLvXr1ZMiQIbJr1660dhSZFaLFDdO2b3QlRNu4c2vC2TndDtMShWhehWnm8/hmunmvOzdp6+hzZ4vKiK7QyS/2/P73vzdfyiOXzp07hx/XY+EVV1whTZs2lfr168uIESOkrKys2nOsWLFChg4dKsXFxdKiRQu54YYbZM+ePdXWmTJlihx++OFSp04d6dixozz77LP77Isep9u1aydFRUXSr18/mTFjhmQC6gyA3Koz1BqvUWcAZDLaNDMk44K0k046Se666y45/fTT93lMz9488sgjcvvtt8upp54qhx56qPzzn/+UVatW7XOmB9kfosUM076Z7liYFhmiDT2wX42zc7oVpiUTorkdpkWGaDomnR+zpWYCr7pBd+3aVX744Yfw8vHHH4cfu+6662TcuHHyyiuvyAcffGCOj2eccUb48crKSlNwysvLZerUqfLcc8+ZgqJnxi3Lli0z6xx33HHy+eefy7XXXiu//OUv5Z133gmvM3bsWLn++uvljjvukDlz5pgGgzYC1qxZI0FHnQGQqby8tJNakzrqDIBMRp0Z4nudcfRCWX0jVq9ebbo/Wxo2bGhSw2nTpjn5UsiQEG2fMK2uM2HaPiFavcQhmlthmp0Qza0wjRAteZWh/JQWuwoKCqRly5bhpVmzZub+zZs3yz/+8Q956KGH5Pjjj5devXrJM888Y4rLp59+atZ599135auvvpJ///vf0rNnT/Nl/49//KM5E6OFSOkZ8vbt28uDDz4oXbp0kSuvvFLOPPNMefjhh8P7oK9xySWXyIUXXiiHHHKI2UbPBj399NOSyagzALKxzlBrgoM6AyDoqDPFvtcZR4M0LTqqtLS02v1623os2u7du2XLli3VFmRXiFYtTOvQL+0wLdUQzekwLZUQzekwjRDNnpDkSZXNRbexS8dR0XFXOnToICNHjjTdmtXs2bOloqKi2pdz7SK9//77h7+c67/du3evdhzVsy56bJw/f354ncjnsNaxnkOLk75W5Dr5+fnmdqY3AlKpM4paAyCodYZaEyzUGQBBR5tmkO91xvepG+655x5zlsda2rZlbKdsDNGcCtPSDdGcCtPSCdHih2nVrxevCSGat2dvor8c6xfmWPSMtXZbnjhxoowePdqc2T766KNl69at5gt4YWGhNGrUKO6Xc/031pd367FE6+h+7dy5U9atW2e6U9ttBGQzag2ATOiRRq3JXNQZAF6hzpT6XmccDdK0u5+KHmROb1uPRbvllltM10BrWblypZO7hACFaOmGaU6FaOmGaU6EaDHDtKUz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0TBNi8qXy+Z7EqJFh2njF3xswrThXY4x9+d8iKZnH0J7F7vb5KqGDRvKpEmT5JNPPpEvvvjCFKDDDz9cBg0a5PeuAY43hpQ2htSBx/YmRINndcbaLhdRZ+CGAqntWfsjCPXDCtM+/NtY0/Y56pKfypKPZnkSokWHactWf+v6a4E2TRBqjSut6e+//950k3v77bdlx44dJu175plnpHfv3m68XM6LDNOenjvR3OdViBYrTHvl03HmvpYaKnlUxGKFaboUFNXxLESLFaY99c4/zX1ehWixwrRX5733499JDodoSN2AAQPMEiTUGbjZGNJF6wchGuAN6gyc1ECaeNr+CEL9iAzT3rjtYXOfVyFaZJjWsXUH+WZJpWevCfhVaxy/tHPjxo1m52rXrm0Kz1dffWW60jVu3Njpl0IEDUla128avt29eXvP90ELls5iY9GfvSxiFu2JZml+YFtPQ7TIMK1101bh24e27+r5PmiY1rftIeHbGq7mfIjGeAI1eumll5Jed+XKlebMjteoM3CL9iSwNOvYlhAN9jFGWo2oM3Bbfl5+TtYPbfNo2ydWm8grtfJref6aOYk643utcfwoc99990nbtm3NGZu+fftK+/btZfDgwXLggQc6/VKIoGOiLd9SJu0alEphfkGNs3m6QcdEe/uzydK0pLFZ9OdEs3m6wRoTTc8EteraUX6YvyThbJ5u0THRlpetkHal+5swsabZPN2g46NNXDRNmhY3NMu7y2aZcdKAREaPHi1dunSR+++/XxYsWLDP45s3b5a33npLzj33XNMlev369Z7vI3UGbrDGtNH60bJbR1k9b0nC2dgApIY6Ay8mG8jF+qFtHm37aBtI96Wm2TzdwGQDyJVa43iQ9uabb5ouz2eddZYZzO2www6Tp556Ku76u3fvNlORRi6wJ3JigRM79KlxNk83RE4sMKLfMLMkms3TDdETCwy46MyYExC4LXJigaG9B9c4m6dbIZqOj6aTDpzebaBZdHw0vfw3l8O0vIgxBZJeJLd88MEHpgGh4wh069ZNGjRoIJ06dZLu3btLmzZtpGnTpnLRRRfJ/vvvL/PmzTOz4HjNbp1R1BokEj0wdP9Lz0w4GxvgaJ3JsVpDnYEXkw142f4IQv2InFhA20A1zebphrJNa5hswCO0afyvNY5f57V06VKT/l1//fVy6623ysyZM+Xq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+57p+58r+06dgdNysU2Tyfue6fvPvvuHWpObmGwAABykXa579eolkydPDt9XVVVlbvfv39/XfQMAZD7qDADAbdSaDOuRBgCZTqeJvuCCC6R3797St29feeSRR2T79u1mxhsAANJFnQEAuI1ak8VBml7TqwPkZeq1vZm8/+y7fzJ5/zN535N19tlny9q1a2XUqFGyevVq6dmzp0ycOHGfwTqRGTL9bzaT9z+T9z3T9599DzbqTPbJ5L/bTN73TN9/9t0/mb7/yaDWxJcXcmL+VQAAAAAAACDLMUYaAAAAAAAAkASCNAAAAAAAACAJBGkAAAAAAABAEgjSAAAAAAAAgFwI0p544glp166dFBUVSb9+/WTGjBkSdPfcc4/06dNHSkpKpEWLFnLaaafJokWLJBPde++9kpeXJ9dee61kiu+//15+/vOfS9OmTaVu3brSvXt3mTVrlgRdZWWl/O53v5P27dub/T7wwAPlj3/8owR1vpAPP/xQhg8fLq1btzZ/I6+//nq1x3W/dQaYVq1amd9n0KBBsnjxYt/2F4iHOuO/TKs1mVpnMq3WUGeQLTKxzmRbraHOeIc6g2yQ0UHa2LFj5frrrzfTzs6ZM0d69OghQ4YMkTVr1kiQffDBB3LFFVfIp59+KpMmTZKKigoZPHiwbN++XTLJzJkz5W9/+5sceuihkik2btwoAwYMkNq1a8vbb78tX331lTz44IPSuHFjCbr77rtPRo8eLY8//rgsWLDA3L7//vvlL3/5iwSR/j3rf5P65TAW3ffHHntMxowZI9OnT5d69eqZ/3537drl+b4C8VBn/JdptSaT60ym1RrqDLJBptaZbKo11BlvUWeQFUIZrG/fvqErrrgifLuysjLUunXr0D333BPKJGvWrNH4PfTBBx+EMsXWrVtDnTp1Ck2aNCl07LHHhq655ppQJrjppptCRx11VCgTDR06NHTRRRdVu++MM84IjRw5MhR0+vf92muvhW9XVVWFWrZsGXrggQfC923atClUp06d0IsvvujTXgL7os74KxNrTSbXmUyuNdQZZKpsqTOZWmuoM96jziAbZGyPtPLycpk9e7bpPmnJz883t6dNmyaZZPPmzebfJk2aSKbQs09Dhw6t9v5ngjfffFN69+4tZ511lumCfthhh8lTTz0lmeDII4+UyZMny9dff21uf/HFF/Lxxx/LSSedJJlm2bJlsnr16mp/Pw0bNjSXM2Taf7/IXtQZ/2VircnkOpNNtYY6g0yQTXUmU2sNdcZ71BlkgwLJUOvWrTPXV5eWlla7X28vXLhQMkVVVZW5Fl+753br1k0ywUsvvWS6nms36EyzdOlS05VYu9Dfeuut5ne4+uqrpbCwUC644AIJsptvvlm2bNkinTt3llq1apm//7vvvltGjhwpmUaLjor136/1GOA36oy/MrXWZHKdyaZaQ51BJsiWOpOptYY64w/qDLJBxgZp2ULPgsybN8+k8Jlg5cqVcs0115hxEHRA1EyjRV7P4PzpT38yt/UMjr7/el170AvPyy+/LM8//7y88MIL0rVrV/n888/NFxYd/DLo+w7AP5lWZzK91mRynVHUGgC5UGuoM/6hziAbZOylnc2aNTMJdllZWbX79XbLli0lE1x55ZUyfvx4ef/996VNmzaSCbT7uQ5+evjhh0tBQYFZdKBRHWRRf9YzCkGmM6occsgh1e7r0qWLrFixQoLuhhtuMGdwzjnnHDMzz3nnnSfXXXedmTEp01j/jWbyf7/IftQZ/2RyrcnkOpNNtYY6g0yQDXUmU2sNdcY/1Blkg4wN0rTraq9evcz11ZHpvN7u37+/BJmOVagF57XXXpP33nvPTP2bKU444QSZO3euOXNgLXpGRLvi6s/6ZSDItLt59LTcen3+AQccIEG3Y8cOM25GJH2/9e8+0+jfvBaYyP9+tYu3znYT9P9+kTuoM/7J5FqTyXUmm2oNdQaZIJPrTKbXGuqMf6gzyAqhDPbSSy+ZWTGeffbZ0FdffRW69NJLQ40aNQqtXr06FGSXX355qGHDhqEpU6aEfvjhh/CyY8eOUCbKlBlu1IwZM0IFBQWhu+++O7R48eLQ888/HyouLg79+9//DgXdBRdcENpvv/1C48ePDy1btiz03//+N9SsWbPQjTfeGArqLEifffaZWfRQ89BDD5mfv/32W/P4vffea/57feONN0Jffvll6NRTTw21b98+tHPnTr93HQijzgRHptSaTK4zmVZrqDPIBplaZ7Kx1lBnvEGdQTbI6CBN/eUvfwntv//+ocLCQjN99KeffhoKOv2PMNbyzDPPhDJRphQdy7hx40LdunUzX1o6d+4cevLJJ0OZYMuWLeZ91r/3oqKiUIcOHUK33XZbaPfu3aEgev/992P+nWvxtKaM/t3vfhcqLS01n8UJJ5wQWrRokd+7DeyDOhMMmVRrMrXOZFqtoc4gW2RincnGWkOd8QZ1BtkgT//P715xAAAAAAAAQNBl7BhpAAAAAAAAgJcI0gAAAAAAAIAkEKQBAAAAAAAASSBIAwAAAAAAAJJAkAYAAAAAAAAkgSANAAAAAAAASAJBGgAAAAAAAJAEgjQAAAAAAAAgCQRpAAAAAAAAQBII0gAAAAAAAIAkEKQBAAAAAAAASSBIAwAAAAAAAKRm/w8T61CVTbEyXQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig,axs = plt.subplots(1,3,figsize=(15,4))\n", + "\n", + "data = axs[0].imshow(tess_hdulist[1].data['FLUX'][100,:,:], origin='lower')\n", + "axs[0].imshow(simple_ap, alpha=0.2, origin='lower')\n", + "axs[0].contourf(\n", + " simple_ap, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[0].set_title('Simple Aperture')\n", + "fig.colorbar(data, ax = axs[0], label = 'flux (e/s)')\n", + "\n", + "data = axs[1].imshow(tess_hdulist[1].data['FLUX'][100,:,:], origin='lower')\n", + "axs[1].imshow(strict_ap, alpha=0.2, origin='lower')\n", + "axs[1].contourf(\n", + " strict_ap, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[1].set_title('Strict Aperture')\n", + "fig.colorbar(data, ax = axs[1], label = 'flux (e/s)')\n", + "\n", + "data = axs[2].imshow(tess_hdulist[1].data['FLUX'][100,:,:], origin='lower')\n", + "axs[2].imshow(balanced_ap, alpha=0.2,origin='lower')\n", + "axs[2].contourf(\n", + " balanced_ap, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[2].set_title('Balanced Aperture')\n", + "fig.colorbar(data, ax = axs[2], label = 'flux (e/s)')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "17916baf-92fe-446e-a3b7-351235519058", + "metadata": {}, + "source": [ + "As we can see the simple aperture with 99% completeness is quite large, the strict aperture is quite small and will contain the maximum amount of flux from our target with the lest amount of contamination, as indicated by the dilution factor. The final balanced aperture tries to get 90% of the target flux while only allowing 20% contamination from surronding stars. \n", + "\n", + "## Step 6: Testing on a crowded object\n", + "\n", + "Now lets repeat the experiment with a much fainter object, TIC 120916706." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "ae241e7c-2a92-42cd-abc3-cdd3fb953d86", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "TESSSearch object containing 2 data products \n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
target_namepipelinemissionsectorexptimedistanceyeardescription
0120916706SPOCTESS3120.00.02018Target pixel files
1120916706SPOCTESS30120.00.02020Target pixel files
\n", + "
" + ], + "text/plain": [ + "TESSSearch object containing 2 data products \n", + " target_name pipeline mission sector exptime distance year \\\n", + "0 120916706 SPOC TESS 3 120.0 0.0 2018 \n", + "1 120916706 SPOC TESS 30 120.0 0.0 2020 \n", + "\n", + " description \n", + "0 Target pixel files \n", + "1 Target pixel files " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpf_faint_search = lksearch.TESSSearch(\"TIC 120916706\", pipeline='SPOC').cubedata\n", + "tpf_faint_search" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "4ecadb71-4897-4ff4-849d-4813e1762d98", + "metadata": {}, + "outputs": [], + "source": [ + "tpf_faint = tpf_faint_search[0].download()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "29efb803-b194-49c1-9f25-cb649c441d30", + "metadata": {}, + "outputs": [], + "source": [ + "tess_hdulist_faint = fits.open(tpf_faint['Local Path'].values[0])" + ] + }, + { + "cell_type": "markdown", + "id": "ac0ebc70-3bc3-48db-86a4-ed5bef5bf486", + "metadata": {}, + "source": [ + "Let's plot this up and see what the target and its surronding region looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "845b6ef3-7155-4def-9eb3-798a36bb6949", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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2clBCACkECAAUgzIALW1tcXVV19dfW12tkVvtsdHbIuP2BY526LhDkIAoDkMyBkQAI1PgABIIUAApBAgAFIMyADdfvvtccABB8TQoUPj+OOPj5UrV0azaW9vj2OPPbY6o8Q+++wTZ511VqxduzZ7WA3hhhtuqM6yMWvWrGhGb7/9dpx77rmx1157xbBhw+Kwww6LVatWRTPq7u6OOXPmxMSJE6ttceCBB8a11177uecwGwiWLVsWZ555ZnW2gvL/w0MPPdTr++U2mDt3bowbN67aNlOmTIl169bVdQwDLkAPPPBAXHbZZdVhhGvWrIkjjjgiTj/99Ni4cWM0k6eeeipmzpwZK1asiCeeeCK2b98ep512WmzZsiWa2XPPPRd33nlnHH744dGM3n///TjppJNi8ODB8dhjj8Urr7wSv/rVr2LUqFHRjG688caYP39+3HbbbfHnP/+5un3TTTfFrbfeGgPdli1bqtfH8g377pTb4ZZbbok77rgjnn322Rg+fHj1Wrpt27b6DaIYYI477rhi5syZu253d3cX48ePL9rb24tmtnHjxvItXfHUU08VzWrTpk3FQQcdVDzxxBPFt771reKSSy4pms2VV15ZnHzyydnDaBhTp04tzj///F73ffe73y2mT59eNJOIKBYvXrzrdk9PTzF27NjiF7/4xa77Pvjgg6Ktra24//7767beATUD+vDDD2P16tXVVPHj55Yrby9fvjyaWUdHR/V19OjR0azKGeHUqVN7PT+azSOPPBLHHHNMnH322dWu2SOPPDLuvvvuaFYnnnhiLFmyJF599dXq9osvvhhPP/10nHHGGdHM3njjjdiwYUOv/yvlud3KjzTq+VracCcj/TLee++9ap/umDFjet1f3v7LX/4Szao8w3j5eUe562Xy5MnRjBYtWlTtki13wTWz119/vdrlVO6m/slPflJtj4svvjiGDBkSM2bMiGZz1VVXVWd/njRpUrS2tlavH9ddd11Mnz49mtmGDRuqr7t7Ld35vXoYUAHis9/5v/zyy9U7u2ZUnlb+kksuqT4LKw9MaWblm5FyBnT99ddXt8sZUPncKPfzN2OAHnzwwViwYEEsXLgwDj300HjhhReqN2vlB/PNuD3+1QbULri99967ehfz7rvv9rq/vD127NhoRhdddFE8+uij8eSTT9btMhf9TblbtjwI5aijjopBgwZVS3mQRvkBa/nn8l1vsyiPaDrkkEN63XfwwQfHW2+9Fc3o8ssvr2ZB55xzTnU04Pe///249NJLq6NIm9nY//d62devpQMqQOVuhKOPPrrap/vxd3zl7RNOOCGaSfm5YhmfxYsXxx//+MfqMNNmdeqpp8ZLL71UvbvduZSzgHI3S/nn8k1Lsyh3w37ycPzy84/9998/mtHWrVs/dcG08vlQvm40s4kTJ1ah+fhrabmrsjwarq6vpcUAs2jRoupIjXvvvbd45ZVXigsuuKD4yle+UmzYsKFoJhdeeGExcuTIYunSpcXf/va3XcvWrVuzh9YQmvUouJUrVxaDBg0qrrvuumLdunXFggULij322KP47W9/WzSjGTNmFF/72teKRx99tHjjjTeK3/3ud8Xee+9dXHHFFUUzHBX6/PPPV0uZgptvvrn685tvvll9/4YbbqheOx9++OHiT3/6UzFt2rRi4sSJxT/+8Y+6jWHABah06623Fvvtt18xZMiQ6rDsFStWFM2mfELtbrnnnnuyh9YQmjVApd///vfF5MmTqzdqkyZNKu66666iWXV2dlbPg/L1YujQocXXv/714qc//WnR1dVVDHRPPvnkbl8jyijvPBR7zpw5xZgxY6rnyqmnnlqsXbu2rmNwOQYAUgyoz4AA6D8ECIAUAgRACgECIIUAAZBCgABIIUAApBAgAFIIEAApBAiAFAIEQAoBAiAy/F9ifO/p7yXQAAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(tess_hdulist_faint[1].data['FLUX'][100,:,:], vmin=5, vmax=200, origin='lower')" + ] + }, + { + "cell_type": "markdown", + "id": "a7894803-8fd7-442d-82ba-95ffde9a3980", + "metadata": {}, + "source": [ + "We can also use lightkurves `interact_sky()` funcation to examine the region surronding our object and gain some insight into the objects surronding it" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "f4fe6484-4212-422f-8252-cea7f99f687a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: 31% (6097/19692) of the cadences will be ignored due to the quality mask (quality_bitmask=17087).\n", + "WARNING:lightkurve.utils:Warning: 31% (6097/19692) of the cadences will be ignored due to the quality mask (quality_bitmask=17087).\n" + ] + }, + { + "data": { + "application/javascript": [ + "'use strict';\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " const 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", + "const JS_MIME_TYPE = 'application/javascript';\n", + " const HTML_MIME_TYPE = 'text/html';\n", + " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " const CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " const 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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\n", + " const cell = handle.cell;\n", + "\n", + " const id = cell.output_area._bokeh_element_id;\n", + " const server_id = cell.output_area._bokeh_server_id;\n", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(id)\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " const cmd_clean = \"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_clean, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " const id = msg.content.text.trim()\n", + " drop(id)\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd_destroy);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " const output_area = handle.output_area;\n", + " const output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " const 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", + " const bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " const script_attrs = bk_div.children[0].attributes;\n", + " for (let i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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", + " const 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", + " const 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", + " const events = require('base/js/events');\n", + " const 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", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " const 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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 100);\n", + " }\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + "\n", + " function on_error(url) {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " for (let i = 0; i < css_urls.length; i++) {\n", + " const url = css_urls[i];\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " for (let i = 0; i < js_urls.length; i++) {\n", + " const url = js_urls[i];\n", + " const element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.0.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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", + " const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(css_urls, js_urls, function() {\n", + " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const 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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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 const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"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": [ + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "1bbd19f0c6b74840b6c4b9a9ee0be204" + } + }, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/rhounsel/miniforge3/lib/python3.12/site-packages/lightkurve/interact.py:559: LightkurveWarning: interact_sky() - cannot obtain nearby TICs. Skip it. The error: 'GAIA DR2'\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "lk.search_targetpixelfile(\"TIC 120916706\")[0].download().interact_sky()" + ] + }, + { + "cell_type": "markdown", + "id": "fe58ca29-7459-489b-bcfd-28d47c35fec1", + "metadata": {}, + "source": [ + "In the plot above our object is in the center of the field and is very faint and surronded by lots of other faint and bright objects. Using `interact` we can observe how the lightcurve of our target changes with the aperture selected. " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cac32301-fd0c-4e6b-be8d-561e319c8ab7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning: 31% (6097/19692) of the cadences will be ignored due to the quality mask (quality_bitmask=17087).\n", + "WARNING:lightkurve.utils:Warning: 31% (6097/19692) of the cadences will be ignored due to the quality mask (quality_bitmask=17087).\n" + ] + }, + { + "data": { + "application/javascript": [ + "'use strict';\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " const 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", + "const JS_MIME_TYPE = 'application/javascript';\n", + " const HTML_MIME_TYPE = 'text/html';\n", + " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " const CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " const 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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\n", + " const cell = handle.cell;\n", + "\n", + " const id = cell.output_area._bokeh_element_id;\n", + " const server_id = cell.output_area._bokeh_server_id;\n", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(id)\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " const cmd_clean = \"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_clean, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " const id = msg.content.text.trim()\n", + " drop(id)\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd_destroy);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " const output_area = handle.output_area;\n", + " const output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " const 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", + " const bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " const script_attrs = bk_div.children[0].attributes;\n", + " for (let i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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", + " const 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", + " const 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", + " const events = require('base/js/events');\n", + " const 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", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " const 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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 100);\n", + " }\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + "\n", + " function on_error(url) {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " for (let i = 0; i < css_urls.length; i++) {\n", + " const url = css_urls[i];\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " for (let i = 0; i < js_urls.length; i++) {\n", + " const url = js_urls[i];\n", + " const element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.0.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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", + " const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(css_urls, js_urls, function() {\n", + " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const 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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"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.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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 const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"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": [ + "" + ] + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "server_id": "d0c4a274ca604e959afdbc1efcd90cd9" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "lk.search_targetpixelfile(\"TIC 120916706\")[0].download().interact()" + ] + }, + { + "cell_type": "markdown", + "id": "6115e966-d6a1-4b38-a0b7-8aa01f5b30bf", + "metadata": {}, + "source": [ + "To calculate an aperture we must take the surronding objects into accont and be very selective about what pixels we include in our aperture mask. To do this we first gather information about the location of our target, and the surronding objects. " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "819960f8-0852-4da1-af50-39d1904a9554", + "metadata": {}, + "outputs": [], + "source": [ + "camera_faint = tess_hdulist_faint[0].header['CAMERA']\n", + "ccd_faint = tess_hdulist_faint[0].header['CCD']\n", + "sector_faint = tess_hdulist_faint[0].header['SECTOR'] \n", + "\n", + "shape_faint = tess_hdulist_faint[1].data['FLUX'].shape[1:]\n", + "\n", + "# initialize the PRF object\n", + "prf_initial_faint = lkprf.TESSPRF(camera=camera_faint, ccd=ccd_faint, sector=sector_faint) " + ] + }, + { + "cell_type": "markdown", + "id": "8d2a64bb-375a-45a4-a358-35bd6ae2ec85", + "metadata": {}, + "source": [ + "Now examine objects within the surronding region." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "1ba59280-1231-4844-adfe-368ee323ca5c", + "metadata": {}, + "outputs": [], + "source": [ + "object_table_faint, TESS_mags_faint, target_list_faint, origin_row_faint, origin_col_faint = get_surronding_objects(tpf_file = tpf_faint, catalog = 'tic', pixel_size = 21, output_epoch = Time.now(), max_results = 25)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "edfa988e-7eb1-4e48-b635-d80ada0d57ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
IDRADecSeparationRelative_FluxpmRApmDETESSmagMassRadTefflogg
0TIC 12091670637.108373-25.0973000.0000001.00000030.33310.14215.6200000.4360.4403423.04.7907
1TIC 12091670937.097679-25.08763349.2597721.221237-0.4178.09815.4030000.7600.6524721.04.6905
2TIC 12091671037.114387-25.08354653.2544101.0884298.141-1.31415.5280001.0000.9795625.04.4562
3TIC 12091670537.130260-25.10178773.1587350.2818386.393-5.94916.9950010.6500.9614130.04.2859
4TIC 12091670737.135359-25.09144390.4731460.97633862.346-1.40515.6460001.0300.5775741.04.9287
5TIC 12091670437.124030-25.11902893.4009840.5618235.918-5.03616.2460000.7200.8234567.04.4645
\n", + "
" + ], + "text/plain": [ + " ID RA Dec Separation Relative_Flux pmRA \\\n", + "0 TIC 120916706 37.108373 -25.097300 0.000000 1.000000 30.333 \n", + "1 TIC 120916709 37.097679 -25.087633 49.259772 1.221237 -0.417 \n", + "2 TIC 120916710 37.114387 -25.083546 53.254410 1.088429 8.141 \n", + "3 TIC 120916705 37.130260 -25.101787 73.158735 0.281838 6.393 \n", + "4 TIC 120916707 37.135359 -25.091443 90.473146 0.976338 62.346 \n", + "5 TIC 120916704 37.124030 -25.119028 93.400984 0.561823 5.918 \n", + "\n", + " pmDE TESSmag Mass Rad Teff logg \n", + "0 10.142 15.620000 0.436 0.440 3423.0 4.7907 \n", + "1 8.098 15.403000 0.760 0.652 4721.0 4.6905 \n", + "2 -1.314 15.528000 1.000 0.979 5625.0 4.4562 \n", + "3 -5.949 16.995001 0.650 0.961 4130.0 4.2859 \n", + "4 -1.405 15.646000 1.030 0.577 5741.0 4.9287 \n", + "5 -5.036 16.246000 0.720 0.823 4567.0 4.4645 " + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "object_table_faint" + ] + }, + { + "cell_type": "markdown", + "id": "b4c32387-320e-4b65-a02e-adbb89c98696", + "metadata": {}, + "source": [ + "There are lots of similarly bright objects in this region, we must model these." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "fc92c12c-0cfc-4275-8354-f8bb45f35eb2", + "metadata": {}, + "outputs": [], + "source": [ + "prf_mod_faint = prf_initial_faint.evaluate(targets=target_list_faint,origin=(origin_row_faint,origin_col_faint),shape=shape_faint)" + ] + }, + { + "cell_type": "markdown", + "id": "fc799cd1-13f0-4c53-9097-926ab257b860", + "metadata": {}, + "source": [ + "We can plot our model vz. our data and we can examine the relative flux scale to see how faint this object is with respect to other stars in the field." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "c1388d46-3518-4c97-b9fb-1bf9eaacaa75", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig,axs = plt.subplots(1,2,figsize=(10,4))\n", + "\n", + "model = axs[0].imshow(prf_mod_faint[0,:,:], origin='lower')\n", + "axs[0].set_title('lkprf model')\n", + "fig.colorbar(model, ax = axs[0], label='relative flux')\n", + "\n", + "# Plot the real data. We randomly select the 100th observation from the TPF data cube\n", + "data = axs[1].imshow(tess_hdulist_faint[1].data['FLUX'][100,:,:], vmin=5, vmax=80, origin='lower')\n", + "axs[1].set_title('Data')\n", + "for a in range(len(target_list_faint)):\n", + " axs[1].scatter(target_list_faint[a][1]-origin_col_faint, target_list_faint[a][0]-origin_row_faint, color=\"red\", marker=\"x\")\n", + "fig.colorbar(data, ax = axs[1], label = 'flux (e/s)')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d2885c31-642c-41fd-8017-38ab85c5dca4", + "metadata": {}, + "source": [ + "Now lets compute our apertures based on the PRF. " + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "8285b6b7-03fe-4d86-af34-dbc8eab688a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dilution Factor for Simple Aperture: 0.5250268375560881\n", + "Dilution Factor for Strict Aperture: 0.7488265347319966\n", + "Dilution Factor for Balanced Aperture: 0.8829742695902985\n" + ] + } + ], + "source": [ + "simple_ap_faint, di_simple_faint = prf_initial_faint.get_aperture(aperture_type=\"simple\", completeness=0.9,tess_mag = TESS_mags_faint)\n", + "print(\"Dilution Factor for Simple Aperture:\", di_simple_faint)\n", + "strict_ap_faint, di_strict_faint = prf_initial_faint.get_aperture(aperture_type=\"strict\", tess_mag = TESS_mags_faint)\n", + "print(\"Dilution Factor for Strict Aperture:\", di_strict_faint)\n", + "balanced_ap_faint, di_balanced_faint = prf_initial_faint.get_aperture(aperture_type=\"balanced\", crowding_metric = 0.8, fluxfrac_metric = 0.9,tess_mag = TESS_mags_faint)\n", + "print(\"Dilution Factor for Balanced Aperture:\", di_balanced_faint)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "0cc16006-3e1d-4045-9fdc-5c02fa52abd4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9ZipxQGdx9fdrmaPfkfXwqMea/U10bzQNpKeJNLcTpfV/fv3N9Oh6GulWd8Y+tporzcttGlh1G13aPFLC0v6XLUThxY6br31VtPu0cJdkyZNMiqYJtJjk+aL7rd+dvSx9TXU91PfF/2vtosburCPFlG1GKo9HrWn3l/+8hdTYNPXUwt42j7TfdZhe1qc1O8Cyv1vFNGmScNBzj377LNOSUmJWYYMGeJcfPHFzjPPPONUVVXtct8999zTOfPMM+t+njZtmrY4nOHDhzu1tbV1t+vjFBUVOT/96U/rbtuxY4ezxx57OEcddVTdbR999JFZv1mzZs6nn35ad/urr75qbp84cWLdbZdddpm5zfXxxx+bfb7qqqvq7eOSJUuc0tLSXW73snDhQvOYzz33nPlZn4Pu40UXXVTvfn7289hjj3X69u3rbN++ve42fdzDDjvM6dmz5y6v3eGHH25em0TXXXed+Z1u12s/dN1keru+Rsmv1/e///1692vs6+but9eivvzyy13WmTt3rvn9fffdV3fb888/b27T/7r0s5F8v8rKSqdz587O2LFj625bsGBBytchrr766iunc6eSlO9NQ0vLli13uS3x85TogQceMH8n+t8333zTvF/t27d37r33XvP7l19+2ay/cuXKeuuNGzfOOfXUU/PyeiCaGdSiRYt6GdTQ8S7xd65ly5Y5xcXFzsknn+zU1NTUu29ijvXu3bteXmVCj/2nn3563c+//e1vnY4dOzrV1dX17uce666//vp6x7qDDjrI6dSpU91z/7//+z+zry+++GK99e+44w6zvv6tufRnve/bb79d776ff/55yr9n3Q+v56ivseZ9cva0bt3aWbt2bb37Zpp5qaQ6JrnH9+RM0demT58+zjHHHJPR95Nhw4bVe181r/WztnHjxka913HU2JzxkzXkDDL57lleXl73mUiU7XFDj2PJuaDHP93O5Zdfvst32P33398cu11//vOfze36nVrp9/sePXqY7WzYsKHe4yYelzI9jk6YMME8vrY/XHpMbtOmjWe7wcujjz5q7qtZqDZv3uw0bdrUufHGG+vdz32Ou+++u7mP6+GHHza363N191P3MbktqO+BPvfjjjsuo6weP358vaxO115I1SbS91Jv+81vflPvvpqhevvf//73erfPnDnT8/Zk7n4nL25OerV99Nil95kzZ84un+PE90kfI/l++p7qZ+4Xv/hF3W2PPPKI5+sQRbRp0qOHmKXJbPXs/JQpU+SZZ54x/9YzHNoj6f/9v/9nzrA0RCvaiZVYtxuh3u7Sqqt2/9UhIsn0DIieFXHpmQR9DO1VdsMNN3huU8e769lzPbueeGZZK/N61uH55583VfR09My9Vnj1bItyr7aiQ2muv/76XcZ5N7SfeuZAz5JojwPtSaaLS89W6FmTzz77rN5j6CTSNseT//SnP83566a0a7PO+5Is8SxVdXW1qbrrUB/tdfbaa6+ZCSXT0bP0iWf6tLeEvs565gWp6VmU1Wtr5KNFe0rrVv5Gl2/eUis9Bn5iusDr8ICG5uTRIb16RsUdN6+993SorB5D9MyWe4ZRz6zqGVGX/sxFEGAjg1Id77zo2X89Bmov0+RJ2Bs6i9vQkAntvaXPw6Vn3vUMuD6v5F4JOsRHz1gnHuv0Z+3NpTl56KGHmgn69QywnrlMPF7rWXelx+vE3mfai0GHwdgyduzYuiGYKpvM86LzcmivrUR6Vjw5U7RXnZ691Z7B2hsvE9qbLfF91XW1h50es7LtKRdXjckZv1lDzqCh7576Xuv3de05rD1K3R6wjTluJH4WdR2d+kW/l+o0IPodNpn2CEqcR9EdtaDfWbXHs/Y+0p5IesxJHn3hHpf8HEe1vaHZkNjjSo/J2ptFLw6SCW37aHvMvYCYvnaaT3r7hAkTdrm/jupJnHBfezLp35zui/Za0p5iesU9nWMpeYigDiHVHl+auYl5m0lWN4bmaCLNUh3mpt83ErNUe2Dp+6tZqkM4G6I96xKPXe7nLPHzpj2btNeivk9KPzfu5yIVze3E++h7qp+5uLZ9aNOkR0HMEh0eqIUS/QDq2NknnnjCHLz1oKcHuoa+YOuwyER60FE610ny7V5jtbUQk0wDT7sLp6IHXz257LWuaqjrqwaddqHWYpiGlUsLXFoM0/HEOnTGz35ql1fdJx2OqIsX7W6c2DhIvlJjriU/fmNfN5eGsdek+nrlSD2IaFdpDfDEYUvanbwhOswyuVGq3ZG1sYmGtWi5c/Gj5uu3SIMjMTzSXbUuuZCgRV13Dgv9zGmA6N+QGxZaGNUhBMlfUoBcZJCf46nOLaKf31wXjrRhpsNXdO4Pdw4ZnQtE5wfRhkZyQUyH3iRP9Os29HRon36Z1uO1Dq1JLEKlu+hAvvMkm8xLddxPnJ8jkQ4r0jly9HOQOG9apsXL5O8nmicqF/PGxFU2OeM3a8gZZPLdU0866HA7LajrsES3OJXtcUM/XzrcUotL2jbQtoJL5yPze3zRvFHppgPwcxzVhrrXVQ21eJIJLfBpIUtfr8S5znS4phZ7dCh+8snu5PaCvoZaTHPnwdKcUukm5dfv/+5rYzur9GSTZkoi3Ufdh+S5sf1ewEeHLnpNqq9FTZ2KQduVyY+VSdsn+XOk9PWKe07RpvFGQcwyDRJtmOiiB0Q986FV9Yauupiqh5PX7enmdfFDP6h6UH766ac9t5N8WdxkejZm1apV5uClSzJtwCQXxDLZJ6VzCehZHS/uGRmXn3H/qYI8MbCTJT9+Y1+3huhcLFoM07NMQ4YMMUVQ3Z5W3jOZ9DPVZylXn5uoqxXHLH7X8WP06NFmfL0GuPbi0DOg2kPSnfdI3299//XLqH6Rci9RrAUA7WUJ5DqDsjme2riEvc4D6VVo0y/IesbY7/FVj5l6tjJVT+nkk05+n7/+rXodW1Nlilee+M08P3TuGe0hqI0QbaDq2Vk9aaMZo1fwzASZEoyccdfLFDmDTGhDVk9saxFLix76WWnMcUN79OrnSD9nV1xxhZknUbehnzWv77C5OL7YPo4m0jzVAqGe+NfFq+2jhR0/3P3XeaJT9ZhJzj6bbR/tCZRc4NB91GKY18UDVKqTTpnSUTc6f7L2NtLXQJ+vblPnRKbtkz3aNN4oiOWRewZGi0a2uWcXEulZisSrXCXTyYr1QKEfTK+hew3Rg6IeHN2rmiTSngraQ0Gv0JV40G5oP7VngNLgTXW2uzEHf/fsip7hSaRnjDLV2NetIToJvp4lSgxa7T6cvM+N0ZhhTVFXa/7nfx0/dBJbDQO9IIQ29DUUdKiXDkFz6VXwtDigw5X0vdfJTWfOnGl6zADZZlAu/vb1GKhfUHWC5HTd3f1sS69QqJew1yEvyZPc6hle/TvQoZqJw8F1AuHky8G7VzlyM0X3VXvM6bCTbJ97uvU0U7yGZGSaKbnKvFS0x4IeM3TIaeJwB23Y5hKZYj9n3PUyRc7AzyTqSk86NPa4od9htcB2zz331LtdP19ePYMa4l74RS8ak+oY6ec4qheh8WqLLF26NOO2j/ZW8zrJpBcP0IJhckEseXvahtDeZe6Qc/c5am+cILd9/v3vf5uecLk+caYZr72H9HVLPD55vU+NEcecok3jzf+EBWiQjpv2qkBrl1o/3XAbQxsKOrzONX/+fNMV0b3kqRedK0Ar6noASt5//Tl5HHvysD4temn3ah2Sk7xoV2Idw598ueOG9lMLbHo1RQ0Vr0JipleJdBtIyQd/DRsN5Dlz5tS7PdN5Axr7umVCHzv5cfVgk64Xm1+pXh/kh84loVcZ0i8j+rekQwL0zEniPBoa3Foc0CuwaEFUv4jYKMAiXhmkf/uN/bvXM3p69lg/n8lnbhP3w8+23OGSenY4OU90nkg9q5h8ZlobcZoVLh0uqj/rmWqd18Q966yZc/fdd++yTf3b0y9oDXGvsOX1XLSR8O6779bLJi3A6RW3MpGrzEuXJ3osScwPHaaTfHXNxsrF5wq5Rc4gEzpX7bPPPms+F+7JiMYcN7y+w2qvqsTv/n4MGDDAnIDWz3LyMcbdjp/jqF6ZWK9aqO2PxN+n6vmUSOdU0vaD5opX20d7ZGuhK/EKmeq+++6rN6+ZFg11P922j+aVZole0dEtSqba/2y+22sRUN+XxrR99Dnr50F7/SXTLG7M8d/t3ZX8udH3PJdo+9jRKoRZQw8xC3SIm46f1Uv66sS9+qVcu33qJcn1LLUeIG3TrsBabdWxuNqVVz+YOlZfK7Kp6MFXP7CTJ082QaeNHP1Q65h/7d2lVVztfuxFC116cE81WbPO3aKNEg0YnWTfz35qjzO9jw5z0YaQnvnRifd0omjtQaCNjYa4jSG9BLwONdSzRtqlUw+GOnmoXuZZ/6s9KDQg3F4FmWjM65YJLTLqBJo6VFKHDunz1gOH19wL2dLnoJOTag8+3Xd9XXROBdvz54RBjeOYxe86QBgySI+NejzR7ux6Fk//5r3mU0lHj+N6bNUvxjqJrZ4k0F4ECxYsMI/pToqv25o6dao5Xuo62mhxJ7P3uoS9Ttab6myhZo0O6dGzj+4cJrqta665xhyH9YuVPl+d70Yv1e7O5agXIdE5KnUCYi0c6tlt/VKvRSy9XXtAeM3lmEjPhuuxWB9ft6NDgLSHgC46JEBfSx2moxfB0f3T46oOG9A5MjKRi8xLRedd0/3TYSc64bHun25P349cziuZ6XuN7HPGXQ9oDJ3uQ49/So8H2qNJe+LopNjufEGNOW7od1ht+Gru6AVL9EIp2hZwe3H5pSdf9Nii3+G1R7I+rg7h1Ofw9ttvm2O4n+Ootjf0O7Y+t4suush8/9XM0KJRQ89NXyst2qRq+2ixTeff0uebmKuaGbpvuu+6T9r20ddS99N9jnoBHC2QaXbo/XS+My0iam7p+zJjxoyM2z46Ub9mkhaatA2k7Ylx48aZk+tamNA2gM4Rl+m8X+4FZ7TXj+a75qxOiaM5q58dLXhqPmtRMBv6/HR4rl4MSAu0+ty1SJs4P3Uu6OdHXxP93qDzkun3Fs2pVPOiRQFtmhQauAolsvD0008755xzjtOrVy9zmdKysjJn3333dS644AJnzZo1GV3WfMGCBZ6Xp9XLvSfSdVu0aLHLJXOvu+46c/n5bt26mcvMHnHEEc4bb7zh+ZjJHnvsMefwww83j6uLPg+9dO/SpUtTPufRo0ebSwxv27Yt5X3OOussp0mTJs66det87af64IMPnDPOOMPp3LmzeQy9ZPGoUaPMpY4beu1cV1xxhVmvuLi43iV69dK+5557rrnEcqtWrcwlX/XyvMmXlE31HjTmdctkv/Wy0meffbbTsWNH83nSyzC/++67u3x2vC6jrJe979279y6Pqeu5lzZ2/eMf/3AOOOAAp7S0dJfLLsfRpk2bzOvwybtdnQ2f7eFr0XV0XX0MIMgZpMeSI4880mnWrJn5zLrHlHTHu1TZ8Ze//MXp37+/OZa3a9fOHH+ee+65ut+vXr3aGTlypDnO6vr6+1THUv39Pffck/I5zp49u95l6t1j3cKFC50hQ4aYPNJj3K233rrLulVVVc4111xj7u/u68CBA50//OEP9f5m9fH1GO7llVdeMevoa5ucFX/729+cvffe2/zuoIMOcp555pldjrmJGeglk8xLJd1+K31de/bsaZ67fkb0WO/1nmb6/cQrezJ9r+OuMTlD1qAx3L/nxEWPm3rMmjp1qlNbW5uT48b27dudX/ziF06XLl1MzgwdOtSZO3euOSYkHhfc48gjjzxS7/HcY2Xyd9KXXnrJOe6448wxRr9z9+vXz7nllluyOo6++eabZl/0+et9tL2gzzexreClb9++Tvfu3dO+zkcffbTTqVMnp7q6uu45PvDAA87kyZPN7fqa6LHyk08+2WXdxYsXO6eccorToUMH87rra6ttlFmzZtXdJ11W79ixw+T+brvt5hQVFdV7r/T+Y8eOdZo3b24y8Cc/+Ynz1ltv7fJaJ7czk911110mC/V56Huhr8nFF1/srFy5Mu3r0lCb6tNPP3VOPvlkp23btqZ9Nm7cOPOYyXnrfo4T3yd9nfQ1TZb8mVN33323yeuSkpJdcixKaNOkV6T/l6pYhvDRM+N6hl8nYmxMryTbwrKfiC/tzaFn0T56t4u08nmJ4i16ieJeq8wZp0yuyAKgcXR4jF76XeeVAeKQM4qsAcJj9uzZZj417UGVbe8pIBu0adJjyCQAFPiKLACA+MrHVSYBAPFGm8YbBTEASIPx9gAAm5hDDABgG20ab1xlEgAAAAAAALFCD7GI0SuIhWFauLDsJ1D79eJ3HQD5nZsFiFPOuOsBCM9cl7R9UEi0abxREAOANGrEMYvfdQAAsJUz7noAAGSCNo03CmIAkEaNs3Pxuw4AALZyxl0PAIBM0KbxRkEMANKgezEAwCaGTAIAbKNNE5KCWG1traxcuVJatWolRUVFhd4dACGkczRs2bJFunbtKsXFjbt2SK0USY0U+V4HwUbWAAhzzrjrIbjIGQBByRlFmyYkBTENjm7duhV6NwBEwIoVK2SPPfYo9G4ggMgaALlAziAVcgZALpAzMSuI6VkUdbh8R0qliYRZcauW9jeSh6uV1FZWWd9GcefdrD5+UWW1WLdjh/1tNLH/N3HN1Jcl7LZ+WSNH/3Bp3fGkMWqdnYvfdRBsZI1PZE1GyJr4ZE2hc8ZdD8FFzvhEzmSEnMkcOVMfbZqQFMTcLsUaHKVFIQ+PorI8bCUP4VFkfxvFxeVWH7+oOA/dPXPQlbXhbdj/m2jZokSiIhdDFGqy6F6czdAX5BdZ4xdZkwmyJn5ZU6iccddDcJEzfpEzmSBnMkfO1EebJiQFMQAIEsIDAGATBTEAgG20abxREAOANGqdIrP4XQcAAFs5464HAEAmaNN4oyAGAGlwNgUAYBM9xAAAttGm8ZaHAcIAAAAAAABAcNBDDADSqJFis/hbBwAAezmzcz0AADJDm8ab7/SdM2eOjB49Wrp27WquePDkk0/W+73jOHLppZdKly5dpFmzZjJs2DBZtmyZ380AQCA4X4+397PoOsgeOQMgTrLJGbKmccgZAHFDmyZHBbFt27bJgQceKLfddpvn76+99lq5+eab5Y477pBXX31VWrRoIcOHD5ft27f73RQABGa8vd8F2SNnAMRJtjlD1mSPnAEQN+RMjoZMjhgxwixe9GzKTTfdJL/73e/kpJNOMrfdd999UlFRYc68nHbaaX43BwAFVeMUm8XfOtZ2JxbIGQBxkk3O7FzPyu7EAjkDIG5o0+RhUv2PPvpIVq9ebboVu9q0aSODBw+WuXPneq5TWVkpmzdvrrcAQFDUSpHUSrHPJfpnUwolm5xRZA2AaOUMWWMLOQMgimjT5KEgpuGh9AxKIv3Z/V2yKVOmmJBxl27duuVylwAAEZJNziiyBgCQCXIGAOIjpwWxbEyePFk2bdpUt6xYsaLQuwQAdRhvHw1kDYCgYg6xaCBnAAQZOZOjOcTS6dy5s/nvmjVrzFVZXPrzQQcd5LlOeXm5WQAgOuPtYzDgvkCyyRlF1gCI3hxiZI0N5AyAKKJNk4ceYj169DAhMmvWrLrbdPy8Xp1lyJAhudwUAORxvL3/BXaQMwCiJtucIWvsIGcARBE5k6MeYlu3bpX333+/3sSTr7/+urRv3166d+8uEyZMkCuvvFJ69uxpAuWSSy6Rrl27ypgxY/xuCgAKTieUrPF57qBWon82xSZyBkCcZJMzO9cja7JFzgCIG9o03nyn78KFC6V///5mUZMmTTL/vvTSS83PF198sVxwwQXy4x//WA4++GATODNnzpSmTZv63RQABKZ7sd/Fj7322kuKiop2WcaPH29+v337dvPvDh06SMuWLWXs2LFm6EZUkTMA4iTbnCFrskfOAIgbciZHPcSOPvpocdKMJdUnfPnll5sFANCwBQsWSE1NTd3Pb731lhx33HEybtw48/PEiRPln//8pzzyyCPmylXnn3++nHLKKfLyyy9LFJEzAJB7ZM03yBkAyL0w5kxOJ9UHgCh2L9bFZvfi3Xbbrd7PV199teyzzz5y1FFHmStV3XPPPXL//ffLMcccY34/bdo02X///WXevHly6KGH+toWACD8ObNzPbIGAJAZ2jR5mFQfAKKmxinKanEn4U1cKisrG9xeVVWV/O1vf5NzzjnHnKFetGiRVFdXy7Bhw+ru06tXLzPHydy5c60+dwBAcHOGrAEAZIqc8UZBDADS0Mkns1lUt27dTHdgd5kyZUqD23vyySdl48aNctZZZ5mfV69eLWVlZdK2bdt696uoqDC/AwDEM2fIGgBApsgZbwyZBIA0ap1is/hbZ2f34hUrVkjr1q3rbi8vL29wXe1KPGLECHM1KwBA9GWTMzvXI2sAAJmhTeONghgApJF4diTzdXaGhwZHYng05JNPPpF///vf8vjjj9fd1rlzZ9PlWM+wJJ5R0Suy6O8AAPHLmZ3rkTUAgMzQpvEW24JYccuW1rdR1KK59W3Ijh32t/HVV9Y34axdZ/Xxi9q2EdvSXa0oV3aO4rZrWXWV9W30bFJmfRthpBNLdurUSUaOHFl328CBA6VJkyYya9Ysc2litXTpUlm+fLkMGTKkgHuLTJA1PpA1GSFrMkfWeCNrooWc8YGcyQg5kzlyJvw5E9uCGABkovbrSSj9ruN7O7W1JjzOPPNMKS395tCs4/TPPfdcmTRpkrRv396cnbngggtMcHDVLwCIZ8646/leh6wBgFiiTeONghgA5PwSxf6Hvmi3Yj1DoldiSXbjjTdKcXGxOZuiV3UZPny43H777b63AQCIRs646/lF1gBAPNGm8UZBDADSqHGKzeJ3Hb+OP/74lF3UmzZtKrfddptZAADRkk3OuOv5RdYAQDzRpvFGQQwA0qiVIrP4XQcAAFs5464HAEAmaNN4oyAGAAE4mwIAiKd89hADAMQTbRpv0X+GAAAAAAAAQAJ6iAFAGjVSbBa/6wAAYCtn3PUAAMgEbRpvFMQAII1ap8gsftcBAMBWzrjrAQCQCdo03iiIAUADlxuuycMligEA8ZRNzrjrAQCQCdo03iiIAUAatU6xWfyuAwCArZxx1wMAIBO0abxREAOANGqkyCx+1wEAwFbOuOsBAJAJ2jTeol/yAwAAAAAAABLQQwwA0qB7MQDAJoZMAgBso03jjYIYAKRRk0V3YV0HAABbOeOuBwBAJmjTeKMgBgBpcDYFAGATPcQAALbRpvFGQQwA0qhxis3idx0AAGzljLseAACZoE3jjYIYAKThSJHU+uxerOsAAGArZ9z1AADIBG0ab9Ev+QEAAAAAAAAJ6CEGAGnQvRgAYBNDJgEAttGm8UZBDADSqHWKzOJ3HQAAbOWMux4AAJmgTeONghgApFEjxWbxuw4AALZyxl0PAIBM0KbxRkEMANLgbAoAwCZ6iAEAbKNN442CGACkUSvFZvG7DgAAtnLGXQ8AgEzQpvEW/WcIAAAAAAAAhKGHWPEeXaS4uNza4xfV1opttS2aWt9G8YYt1rchtY71Tew3oCpnj/XpxjWyYuMa8+/i4mI5oGJvadV0h9i27HV7n1eXU23/eVx+1w+sb+P/xj8qYVHjFJnF7zoIB7ImXllTVGr3a4+z7UuxLg+fKbIm+DnjrofgI2cyQ85khpzJHDlTH22akBXEgGx1atle/vH2C+bfe7XvKq3Kmxd6lxBijLcHANjEHGIAANto03ijIIZIqdpRLTPemSNlJU2ka5vd5OP1K2XhindkUPc+hd41hJTjFEutU+x7HQAAbOWMux4AAJmgTeONghgiVwxb/+VmObH3kVLRqoMphr26/C3twCyDuvcu9C4ihGqkyCx+1wEAwFbOuOsBAJAJ2jTeKIghssUwNajbAea/ry5fsvNnimLIYroJ/92Lre0OACBisskZdz0AADJBm8YbBTFEthjm2lkUK6IoBgAAAAAAjOgPCkWsi2EuLYIN7t7XFMUWLn877/uJ8NKx9tksfn322Wfywx/+UDp06CDNmjWTvn37ysKFC+t+7ziOXHrppdKlSxfz+2HDhsmyZcty/GwBAGHJGb9ZQ84AQHzRpvFGQQyRL4a5KIohG7VSlNXix4YNG2To0KHSpEkTefrpp+Wdd96R66+/Xtq1a1d3n2uvvVZuvvlmueOOO+TVV1+VFi1ayPDhw2X79u0WnjUAIOg54ydryBkAiDfaNHkqiNXU1Mgll1wiPXr0MBW/ffbZR6644gpTCQQKVQxzURSDXzVOUVaLH9dcc41069ZNpk2bJocccog5fh5//PHm+Kn0+HnTTTfJ7373OznppJOkX79+ct9998nKlSvlySeflLghZwBESbY54ydryBl/yBkAUUObJk8FMX0Rpk6dKrfeeqv897//NT9rFfCWW27J9aYQU9kWw3JdFHtz5XuyefvWrNdHOOSje/H06dNl0KBBMm7cOOnUqZP0799f7r777rrff/TRR7J69WrTpdjVpk0bGTx4sMydO1fihpwBECX5GDJJzvhDzgCIGto0eZpU/5VXXjHVvpEjR5qf99prL3nggQdk/vz5ud4UYqixxTCXO7F+thPtayHNXbdf1/2y2gdE3+bNm+v9XF5ebpZkH374ofniPWnSJPntb38rCxYskAsvvFDKysrkzDPPNMGhKioq6q2nP7u/ixNyBgD8ZQ054w85AwDxaNPkvIfYYYcdJrNmzZL33nvP/PzGG2/ISy+9JCNGjMj1phAzuSqGNbanmFsM03UphkWfGT/v+Fy+Hm+vXYb1rIe7TJkyxXsbtbUyYMAA+eMf/2jOpPz4xz+W8847z4ytx67IGQAS95zxmTXkjD/kDICooU2Tpx5iv/nNb0wFsVevXlJSUmLG4F911VVy+umne96/srLSLKmqj4i+Kme7fLFtu3Ro0TZvxbBse4olFsP89ipDODlZTCip66gVK1ZI69at6273OpOi9CorBxxwQL3b9t9/f3nsscfMvzt37mz+u2bNGnNfl/580EEHSdz4zRlF1gCIUs6462WaNeSMP+QMgKihTZOnHmIPP/yw/P3vf5f7779fXnvtNfnrX/8qf/rTn8x/vWh1MbHaqNVHxIdOrPee87o8vuR5WbPli7wWw/z2FKMYFk9ZnbX/egJKDY7EJVV46NVYli5dWu82PSu95557mn/rhJQaIHq2OvGLtl6ZZciQIRI3fnNGkTUAopYzfrKGnPGHnAEQNbRp8tRD7Fe/+pU5q3LaaaeZn/v27SuffPKJCQkdN5ps8uTJZoxp4gtCgMRHUVGR9JKB8m7zOTL97Tm7FLxsF8My7SlGMSy+splQ0u/9J06caIZnaPfiU0891cxRctddd5nF/TuZMGGCXHnlldKzZ08TJnr1q65du8qYMWMkbvzmjCJrAEQpZ9z1MkXO+EPOAIga2jR5Koh9+eWXUlxc/4XTrsY6ntRLqgnZEB+lRU1k9AFHmsJXYlEsX8WwhopiFMPiLfHsiJ91/Dj44IPliSeeMF+mL7/8chMOeknixKEZF198sWzbts2Mxd+4caMcfvjhMnPmTGnatKnEjd+cUWQNgCjljLtepsgZf8gZAFFDmyZPBbHRo0ebMfbdu3eX3r17y+LFi+WGG26Qc845J9ebQoSUldYvip3Q6zCZv/ytvBXDUhXF3H9TDINto0aNMksqekZFg0WXuCNnAMA/ciZz5AwAxCNrcl4Qu+WWW0y3t5///Oeydu1a0/3tJz/5iVx66aW53hQiWhR7fMl/ZPrbL5jbvtvv2LwVw1IVxSiGxVttFhNQZjM5MjJHzgCIe86468EOcgZA1NCmyVNBrFWrVqZbnC4AEHb56F4Mf8gZAFGSjyGT8IecARA1tGnyVBADsuXOGbal8ks5sfdRZsik10T7tiXOGZZuon3EA+EBALCJghgAwDbaNN4oiCEQvCbQr2jZfpeJ9m1LNYE+RbH4IjwAADZREAMA2Eabxpv/azwDObbD8b6apDunWPvmrU1RbM2WLwpSDNN/6236O70P4hkefhcAAGzmDFkDAMgUOeONghgKXgxb7OxaDHPlqyiWqhjmoigGAAAAAEB0UBBDwYthW8W7GJavolhDxTAXRbF4chKuypLpousAAGArZ8gaAIAftGm8URBDwYthA4oanh/MVlEs02KYi6JY/NC9GABgE0MmAQC2kTNhm1R/42aRojJrD79j7y5iW8mWSuvbkCb238JvHdEk9xPoL3lRvtq2WU7ud4xUtO4oToc2Da6nezGq08ny1MtPyfR3XpTRh4+WivYVGW2zaO36RhfDXO59kyfa3/eALeJXTW2NlBSXZHz/917L7Xvhpf2iz61v4/xJI60+/o4a/dt7JyePxQSUEUfWBCZritu0tr6Nfb9t771W7//7K7HNqamxv43t261vI+xZU+iccddDCJAzmSFnMkLOZI6cqY82jTd6iCGvdhbD/iPrt22SE78uhvlR1qRMRg0dJe1bt5cZL82QNevXZLUf2RbDctlTbM3W9fLI28/Ltir7wYbscTYFAGATPcQAALaRM94oiCE0xbBcFcUaWwzLRVFMi2Ezlr4kZSWlUlZiv9cXskd4AABsoiAGALCNnPFGQQyN5jhO3ophjS2K5aoY5lkU++xdX8Ww9s1ay6hvDZUmJcEduQwAAAAAQBRREEOjfFW1XZ579xVT8MpXMSzboliui2HJRbH5n73TYFEsuRhG77Dgc5yirBYA0Tmxs/DdhfLiGy/mbX8QL9nmDFkDAMgUOeONghga5cuqr+STLz4zBS+vopitYpjfopitYphLH/OQ3Q9IWxSjGBZOfi9P7C4AwkEvbjJz3szU+fHuQpn/znxpVt4s7/uGeMg2Z8gaAECmyBlvFMTQKB1atjOFLi14JRfFbBfDMi2KaWPGZjHMNWj3XimLYhTDwovx9kD0e4d9VflVyvzQYtghBxwig3oNKtg+ItqYQwwAYBs5442CGBpNC13JRbF8FcMaKoq5jRnbxbB0RTGKYeFG92Ig2kpLStPmB8Uw2MaQSQCAbeSMN2bzRk6LYtPf/I88/vqz5rYt27flpRiWXBR76uWnTKOm625d5eNVH+9szLTfW/JFi2JKi2Jrt22QlVs+pxgWYtmcHYnD2RQgStLmB8UwWJbtWXiyBgCQKdo03ughhpzRwtcJvY+UL7ZtNIv+O1/FsORGTdWOKtOY2avLXgVpzGhRbK+2XeTjjaukqmYHxTAACLig5AcAAADyg4IYckaHSc7/+I26n/Xf6a4+acubH7xZ9++Vn69s8OqTNugwSe0ZVrdPqz/I+z4gN+heDMRHEPID8cOQSSBa3lj2BvmBwCFnvFEQQ04kzhn23f7DzeI10b5tiXO+/Gj0j76ZE2bLF3nbh8Q5w340cHSDV59EsDlZTD4Zh/AAoiZlftCoQQBzhqwBgnvl4g8++4D8QODQpvFGQQyN5jWBvtdE+7YlT4CcONH+9Ldm56Uo5jWBfrqrTyL4HBMgPpdC7zSAnOUHjRoEMmfIGiCQSopLyA8EEm0abxTE0CjpriaZz6JYqquB1TVqmrexXhRLdzVJimLhVStFWS0AwqHB/KBRg4DmDFkDBBP5gSAiZ7xREIOVYlg+i2KpGjOJoTS691FWi2L6mKmKYS6KYuHEeHsgujLJDxo1sI05xIDoIT8QNOSMNwpisFYMy0dRrKHGjKustIm1opg+lj5mumKYi6IYAARDxvlBowYAkAXyAwg+CmKwWgyzWRTLtDFjsyhWVwxr3qbBYpiLoli4ZDPRsS4Agst3ftCoQQBzhqwBgo/8QFCQM94oiMF6McxGUcxvY8ZGUSyxGKaPmUkxLNdFsRpnh1Q6X2W9PhqW1UTHcZiBEgiprPODRg0CljNkDRAOucyPWqcmp/uG+CBnvFEQQ16KYbksimXbmMllUWyXYlhp5sWwXBXFdjjV8lrNbLMQjvYw3h6IjkbnB0UxWMAcYkD05SI/dJ1K50sr+4foI2e8URBD3ophuSiKNbYxk4uiWC6KYY0timkxbHHNC7JVNssBJYdIcVFJ1vuA9AgPIBo+/GpxbvKDohhyjIIYEA+NyQ+9r65TJHznR3bIGW8UxJDXYljKolh1Vd6KYY0piuWyGJZtUSyxGDag5ChpU9Sh0fuAwo63//3vfy9FRUX1ll69etX9fvv27TJ+/Hjp0KGDtGzZUsaOHStr1tAIB/wUw97fvih3+ZFFo+ar2q2N3i6iKR9ziJEzQDBkkx9uMUzXKS9qlpf9RPTQpvFGQQxpOY6T82KYV1HsqZefSlsUy3UxLJuimI1imN+iGMWw6Ordu7esWrWqbnnppZfqfjdx4kSZMWOGPPLII/LCCy/IypUr5ZRTTino/gJBoUPGdT7Fhoph+zYdmNv88NGo2VTzuczd+qR8Uvl2zrYP+EXOAMHgJz8Si2G6jhYYgCDrHbKsoSCGtL6s2WSlGLZLUWzz+pRFMVvFMD9FMZvFsEyLYlU1FMOiPAFlaWmpdO7cuW7p2HHn39umTZvknnvukRtuuEGOOeYYGThwoEybNk1eeeUVmTdvXu6fMBCykzZvbPuPLNryL9nhVKUthu3drL/1Ro0WvpLpbYu2PSMtS9rJ7mX75XwfEH75mlSfnAHCVRRLLobpOkC2aNN4oyCGtGqdHdaKYS597NGHj/YsitkuhmVSFMtHMayhopgWw55a+jLFsALYGQZ+x9vvXHfz5s31lsrKypTbWbZsmXTt2lX23ntvOf3002X58uXm9kWLFkl1dbUMGzas7r7a9bh79+4yd+5c+y8AEGB6pnzvpgfK1poN8tqWmfWKYraLYV6NGi18JRbFEothA5ofL6VF9vIDccsZ/1lDzgDhKYpRDEOu0abxRkEMaTUvaWO1GOaqaF+xS1EsX8WwdEWxfBbDUhXF3GLY+q8ohoVtAspu3bpJmzZt6pYpU6Z4bmPw4MFy7733ysyZM2Xq1Kny0UcfyRFHHCFbtmyR1atXS1lZmbRt27beOhUVFeZ3QNy1Ke0kA1uNqFcUy1cxLLlRo4UvtyhGMQz5mlQ/k6whZ4DwFMUohsEG2jTeSiWodHy0xTHSpas3inXF4a83lkipFDW1fxCu7Nhc2nXsISe0HSdP//MR+X8z/p+5feCgodJvwBBpeMr99Moy/Chpc2VUpzGmKPfoG8+Z2zp36GzCqEmTMknXa7RozXrJlYN79JOikhJ5dfkSUxgrK2kiJ/b5tlS0bKeHM7HpvYW5ex6plFQ29h1Nz6nN3eM7Wbzi7v1XrFghrVu3rru9vLzc8/4jRoyo+3e/fv1MmOy5557y8MMPS7NmTJ5qFVkTGPsdUtOItTtI943D5R+LnpH/bLzP3DJ43/5y8D79ROSbx93esbnY01y+O/JEkx+vfvFUvfzIZWPm/Z3RZFVRqf2vh7Xrwp01hc4Zd71Ms4acKSByJjCKmnp/D8ulqo7Z/D01l+NPPFVmPv2oPDb7MXNLp4qucvyI74qUldVrBzkVNnNsp6I1X9jfBjmT15wxj0ebxlM0jm6IjE6dukiXrt3qfu7dZ2De90EbLtorzaX/LsSZmX5dv5lrpmubTlLRip5hYTubosGRuKQKj2R65mS//faT999/34y9r6qqko0b63/h1Suy6O8A7FTRdjfZvd03fxMH7tk7tvmBePUQyyZryBkgWLTnjHYEcOm/9TYgV2jTeKMghkBZ/NpcWf7JB9J9z31Mjyw9U6J/OPmk3ZRnzp0pHdp0MIv+O5NLIudS1Y5qmfH2C6Zn2F7td5eP138mC5dzdbK42Lp1q3zwwQfSpUsXM+FkkyZNZNasWXW/X7p0qRmPP2TIkILuJxAkCz54XT76fIX02K2bGd4+fdGz5lgat/wAMkHOAMGydu0q+fez/5D27Xczi/5bbwPCbGsIsoaCGNKqrPkyr8WwRQtfNmdEjh9+sowYOU42rF+X16KYGbP/4gxp36a9nHzUyWbRf+tt+WrUuMWw9V9ukhP7HC0jDzhCBnfva4ZPLlzxTl72AR79i/0uPvzyl780lx7++OOPzZVWTj75ZCkpKZHvf//7Zpz+ueeeK5MmTZLnn3/eTEh59tlnm+A49NBDbT1rIHTFsFffX2yGSY4cMExOGjhc1m/dkNeimDZcCp0fiFnO+MgacgYILs0PnTKmXfuOMurE75tF/623URRDztCm8URBDGlV1m4zDY18FsP6DxhSN3wyn0WxxGKYO+dL3USXeWrUJBfD3GGSg7r3/roo9hZFsXzLpmvx192LM/Xpp5+aoPjWt74lp556qnTo0MFcfni33XYzv7/xxhtl1KhRMnbsWDnyyCNNt+LHH3/c0hMGwlsMO3ifg+qGT+azKOY2ZgqZHwixbIex+MgacgYIfjHshBHfNcMkddF/UxRDTtGmCdmk+giE8uIWMvv9xebfbkPDRmNm0fuL6xXDXG5RTMNAi2JuUOSjGOZyGzU6UbLeZ/QRo81VMfNVDHNpUUzL9FoUMz93OyDn+4BUlyj2v44fDz74YNrfN23aVG677TazAEhfDHO5RTGdaF+LYicOPN7+mf3B3ylIfiB+OeOulylyBghHMczlFsW0/aP30faQtouAbNGm8UYPMaRVXtLcNDS0wWGjp5jbmPEqhrls9xRLVwxz2T7T31AxzKVFsMHd+9BTLCQTUAIoTDHMtUtPsRznxy6NmQLkB8KvsZPqA4hWMcxFTzHkEjnjjYIYGqQNDRtFscTGTKpimO2iWCbFMNuNmkyLYS6KYnnmdhf2uwAoaDHMqyiWy/zIpDHjoigGKzlD1gCh5Cs/kopitbU78rqviBByJn8Fsc8++0x++MMfmjGjzZo1k759+8rChQttbAohLYr5aczYKor5KYbZatT4LYa5KIohG9XV1bJixQpzRZf169dLmJEz8ZVNfrhFsVzlh5/GjIuiGOKAnAEs5EdCUayyZlte9hOIS87kvCC2YcMGGTp0qLmk5tNPPy3vvPOOXH/99dKuXbtcbwohLYpl05jJdVEsm2JYrhs12RbDcl0Ue3PlMtm8fWvW68dlvL3fJSi2bNkiU6dOlaOOOkpat24te+21l+y///5mcss999xTzjvvPFmwYIGECTkTX43JDy2K5SI/smnMuCiKIZc5E5SsIWeAPOTH10WxoqISq/uI6CJn8lQQu+aaa6Rbt24ybdo0OeSQQ6RHjx5y/PHHyz777JPrTSGERbHGNGZyVRRrTDEsV42axhbDclUU03Ve/GixfLyeOQkKeYliW2644QYTGHo8HjZsmDz55JPy+uuvy3vvvSdz586Vyy67THbs2GGO0SeccIIsW7ZMwoCciacg5EdjGjMuimLIWc4EIGvIGSCP+VFWJuUlLazsH2KAnMlPQWz69OkyaNAgGTdOr4TRSfr37y933313rjeDEBbFctGYaWyjJhfFsJSNmi1f5LUY1tiimN5X19F1+3Xt2ah9iLIwT0CpZ0rmzJkj8+fPl0suuUSGDx9uhnzsu+++5gv+OeecY8Jl9erVMmbMGHnxxRclDMiZ+AlCfuSiMeOiKIaoTKpPzgD5zY+iosL/3SOcyJk8FcQ+/PBD052tZ8+e8swzz8jPfvYzufDCC+Wvf/2r5/0rKytl8+bN9RZEryiWy8ZMto2aXBbDvBo109+a3WBRLNfFsGyLYonFMF0XDQjZmRTXAw88IL17927wfuXl5fLTn/7UBEoY+M0ZRdaEVxDyI5eNmWyLYlXVVfLOR8wZGVkhPGuvyJlvkDPIV34AWSNn7BfEamtrZcCAAfLHP/7RnE358Y9/bMZ03nHHHZ73nzJlirRp06Zu0e7JiFZRzEZjxm+jxkYxbJdGTfM2aYtitophfotiFMPicTalIfpFXbsc//e//5Ww8ZsziqwJpyDkh83GTKZFMS2GPfXyU7JizYqcbRvBEeYeYumQM+RM3FEMQ5CQM3kqiHXp0kUOOKB+I1snPFu+fLnn/SdPniybNm2qW/SKAYhOUcxmYybTRo2Gka1imEsfc3Tvo1IWxWwXwzItilEMi69TTz1Vbr31VvPvr776ygwF0dv69esnjz32mISJ35xRZE34BCU/bDdmGiqKucWw9ZvWy+Deg3O+fSBXyBlyBt+gGAaEI2dyXhDTK7LoJTAT6YRnOvt/qq5teqWAxAXRKIrlozHTUKPGDSObxTBXWWkTz6JYvophDRXFKIbFawLKZDr2/ogjjjD/fuKJJ8RxHNm4caPcfPPNcuWVV0qY+M0ZRdaES5DyIx+NmVRFscRi2OgjRkvbVm2t7QMKKMST6iciZ8gZfNPDcP6rL1AMQ7CQM/kpiE2cOFHmzZtnuhi///77cv/998tdd90l48ePz/WmEOCiWD4bM6kaNZ999kldY8Z2MSxVUWzFxtV5LYalKopRDGuMoiyXYNGz1e3btzf/njlzpowdO1aaN28uI0eODM1Vv1zkTLRtr66Utz9dGpj8yFdjJrko9unaT+sVwyraV1jfB4QtZ4KVNeQMsFNxcbEcP/wU+c7IcRTDECDkTF4KYgcffLCp1unkZ3369JErrrhCbrrpJjn99NNzvSkEuCiW72JYcqNm7ZqVpjHTqlWbnY2ZPBTDkotircpbmKLY6i3r8loM8yqKUQyL99kUpXOZ6KWJt23bZgJEL02sNmzYIE2bNpUwIWeirWmTcjntsDHByY88NmbcolirFq1k+ovTZfUXqymGxUFEeoiRM8A3NDtKS5sUejeAb5AznkrFglGjRpkFAEIvmzAIWHioCRMmmC/yLVu2NEM+jj766Lqux3rp4rAhZ6JfFANiI9tGR8CyhpwBgACLQJtmgoWcyXkPMcRX4jDJTK4+aYM750uniq7mTP+WLZt2zglT7X31MBvcOcO2VG4zPcM6t+qY9uqTtiQOk8zk6pNIQa+uks0SMD//+c/NGZW//OUv8tJLL5nu/GrvvfcO3dwuQF7zI8XVJ21w5wzbsm2LnHjEidK5Q+e0V59EzHMmYFlDzgBAgJEz+eshhvhJNWeY3qbyMfTFawJkbdTobdrAyMc8Yl4T6Fe07GBu06JYvoZOppozTG9TDJ2MD5148qSTTjKLXolFl0Q65h6Iu3T5oUWxfAydTJ5AX4dJdmrXydymRTGGTiKoyBkAQFhzhh5isFYMS3X1SRtSXQ3MnRNGGxjaqLDZUyzV1SRTXX0y38WwVFefRHqOk90SFOedd545kzJgwABzyfhf//rX8vLLL5ursgBoOD+Srz6Zr2KY10T7G7dstLYPCF/OBOUwTs4AQPCRM94oiKFRGrqaZD6KYqkaMy5t1GgDw2ZRTB8z3dUk81UUa+hqkhTF4jcB5RlnnCGPPfaYrFu3Tq6//npzaeJx48ZJ586d5ZxzzpEnn3xSvvrqq0LvJlAQmeSH7aJYqmKYK7Eo9urbr+Z8+wiAkE+qT84AQAiQM54oiMFaMSwfRbGGGjMubWDYKorVNWZSFMPyVRRrqBjmoigWv/H2qry8XL7zne/InXfeKStXrpTp06dLly5d5JJLLpEOHTqYiYP1TAsQF5nmh82iWEPFsOSiWMvmLXO2bQRIROYQI2cAIMDIGU8UxGC1GGazKJZpY8ZmUSyxMZPJ/GC2imKZFsNcFMUyV+RktwTd4MGD5aqrrpIlS5aY5dhjj5VVq1YVereAvPCbHzaKYpkWwxKLYoN7D270dhGdnAl61pAzABAc5EzYJtUvKREpKrH28E5lpdhWs6f9yW+rWzexvg1xttX7ccGHb3xTDNv7wIwHF5v7Jk60//XP2ZRm165ZJU//6+vGzMiGGzM1rcvNfzu27i4jW4yVfz7zmMyY90/5zvGnZD3RvjZm/vXiP2XD5vUy8oSxUrE5s/V0X0f3PVpmvDV750T7fb8tFa0znGi/pvHFMJd73+SJ9p3qHWKbU1Vt9/GdHD5+BC5R7NLuxY8++qh88MEH8qtf/Urat28vr732mlRUVMjEiRMllsiawGTNsjfs/+F06+E/P1ydOneREaMSJtr3WNfNGr/50XG3zl6H910USblISYZh0xg7Mtmbxgl71hQ8Z9z1Aoac8UDOBCZnmi1bZ30by95qbvXxS1rbPz6XrstDnxlyJr85E6E2zcYc5ww9xODLLsUwn3Sdup5iH76R1T6Yxoye2W/nrzHj6rRbZxk5fKxs2PCF/OvZx7PqKWYaM88+bh5DH0sf0w/TU6zP0dK+RRuZvuR5WbM5u55i2RbDXPQUi48333xT9ttvP7nmmmvkT3/6kwkT9fjjj8vkyZMLvXtAXjQ6Pyq+7im2YZ3M/Gd2PcUamx9AUJEzAICw5QwFMeStGJaLolhjGzO5KIrlqjHT2KJYY4thLopi0R9vryZNmiRnnXWWLFu2TJo2bVp3u47DnzNnTkH3DciHjVVrcpMfjSiKUQxDlOcQI2cAIMDIGU8UxJDXYlhjimK5KoY1piiW68ZMtkWxXBXDvIpi1Y79rvehEuIrsiRasGCB/OQnP9nl9t13311Wr15dkH0C8lkMW7RhRu7yI4uiGMUwRPUqky5yBgACjJzxREEMeS+GeRXFFi+am9diWDZFMVuNGb9FsVwXw5KLYtWSuyuoRUIEwsO9KsvmzbvOPfTee+/JbrvtVpB9AvJZDGtZ2j63+eGjKEYxDHEoiJEzABBg5IwnCmJIq6pqq5ViWHJRbNGCl1MWxWwVw/wUxWw3ZjItitkqhrn0MZtIbl/f0ItAeKgTTzxRLr/8cqmu3jlBZ1FRkSxfvlx+/etfy9ixYwu9e4D1YtjAdqNynx/JRbEC5AciICIFMXIGAAKMnPFEQQwNFsRsFcNc+tgDDx7qWRSzXQzLpCiWr8ZMQ0WxhZ+8ZbUY5mpSlNlV0mIjAuPt1fXXXy9bt26VTp06yVdffSVHHXWU7LvvvtKqVStzuWIg6sWw0mJL+ZFQFCtUfiDkIjKHGDkDAAFGzngq9b4Z2KmsrKUMslgMc/UfOMT8V4ti7s/5KoYlF8X++cxjpgHzneNPMbfnszHjFsVmvDXbFMVO7PttqWjdYWcx7JMl1othiK42bdrIc889Jy+//LK88cYbJkwGDBggw4YNK/SuATm3uXpdXophyUWxmU89UrD8AAqNnAEAhC1n6CGGBgti+aJFMLen2LMzn8hrMcyrp9g//vmQWfLdmEnuKfbPt+fsLIbt2ZdiWAEUOdktjXH11VebLsATJkyou2379u0yfvx46dChg7Rs2dJ0C16zZo3vxx46dKj8/Oc/l4svvphGCiKrtKhM2pftnpdiWGJRrND5gXjlTGOyhpwBgHghZ7xREEOgaFGs+177yPKPP5Dqqqq8FsNc2nA57pjRsn7DOrPov/PdmHGLYlU11fLxF5/JXh12l0F79snrPqAw4+316il33nmn9OvXr97tEydOlBkzZsgjjzwiL7zwgqxcuVJOOWVnL5RUHnzwwYy3u2LFCnO2BYiC5qWt5aC2J+StGBak/EAI5XkOMXIGAGKInPFEQQyBosMkV61cUffz20sW5X0fdM6XhYtfqftZ/53u6pO2vPnZ0rp/r9y4tsGrTyL8tNvv6aefLnfffbe0a9eu7vZNmzbJPffcIzfccIMcc8wxMnDgQJk2bZq88sorMm/evJSPN3XqVNl///3l2muvlf/+97+7/F4f91//+pf84Ac/MN2Nv/iCzxiiQ89KxjU/gFTIGQCATVtDljMUxJBWTc3OKzjkQ+KcYWecc2HKifZtSpwA+eRR3zdLuqtP2lI3Z9iefeW8w777zUT7W/gimW/apPbdvTjLbWkX4pEjR+7S9XfRokXmaiqJt/fq1Uu6d+8uc+em/vvQMy/XXHONGWvfp08fad26tfTs2VP69u0re+yxh+mufM4555jHeeutt8yVWwBkp6oqGPmBmORMlllDzgBAPOWrTTM+ZDnDpPpIa8eO7bJ28zrp1Lqj1e14TaDvNdG+TamuBpY80X5Zk7K8FcPcYZJ1E+2/PUdO7H2kVLTqYHUfkBubN2+u93N5eblZUnUHfu2110wX42SrV682fxNt27atd3tFRYX5XToaCrqsW7dOXnrpJfnkk0/MVVk6duwo/fv3N0txMedGgMYWw2b+81HZWOD8QDxlmjXkDAAgG5sjnDMUxJBWeXkrqamstVoUW7Ppc3l69nOeE+jnqyiWqhiW6uqTtho1XsWwelefXPI8RbF8y+aSw1/fv1u3bvVuvuyyy+T3v/+953j3iy66yJz5aNq0qdiggTFmzBgrjw3EmVsM27BhnYwqYH4gxLK9tL2PrCFnACDmLLdpVoQ0ZzhdgwZ1adtJamp3FsVsFMP+sejZtFeTTLz6pI3hk+mKYV5Xn7Q1/CVVMaxeUeyAI6V989amKMbwyeBPQKnBoOPa3WXy5Mmem9AuxGvXrjXj3ktLS82i3YNvvvlm8289c6KN7o0bN9ZbT6/K0rkzE3YDQSiGjRg5rmD5gXhPqp9J1pAzABBz5IwnCmIoWFHMLYa1b9muwatJ2iqKZVIMy0ejpqFimIuiWLjCQ8e4Jy6phksee+yxsmTJEnn99dfrlkGDBpkJKd1/N2nSRGbNmlW3ztKlS2X58uUyZIjdocQAMiyGVXRJeV+KYrBZEMska8gZAIg5csYTQybhqyi2auPanAyfTCyGnTjgOKlNUwyzNXzSTzHM5vCXTIthyUWxGe/MYfhkHriTSvpdx49WrVqZSSITtWjRwkwS6d5+7rnnyqRJk6R9+/YmiC644AITHoceeqi/jQHIazHMxfBJ5DJn3PUyRc4AQLzZbtO0CmnO0EMMee8pllwM0wJPpnLVUyybYpiNM/1+i2EueoqF42xKLt14440yatQoGTt2rBx55JGma/Hjjz+e+w0ByHkxzEVPMdjoIZYr5AwARBg544mCGPJaFGtMMSxXRbHGFMNy2ajJthjmoigWbbNnz5abbrqp7mednPK2226T9evXy7Zt20x4+Blvv3379pS/W7VqVaP3F4iDxhTDXBTFEBTkDAAg7jlDQQx5K4rlohjW2KJYLophKRs1O6rzVgxzURSLx9mUXNAJLnX8frLHHntM+vXrV5B9AuJWDHNRFEMQe4g1FjkDAAFGzniiIIa8FMVyWQzLtiiWy2KYV6NmxluzMyqK5aoY5qIolp/x9n6XoDn66KPN+PxrrrnG/KxnZc466yz5n//5H/ntb39b6N0DYlMMc1EUQ2NzJmhZQ84AQHCRM96YVB/WJ9q3UQzzO9G+jWLYLhMlP/2oKYqN7nN0yueY62KYi4n2LXKKdi5+1wmY22+/XUaOHCk/+tGP5KmnnjLdilu2bCnz58/fZQJMAHaLYV4T7S9+Y74MHnR4zh4bEc8Zd70AIWcAIMAi0Ka53ULO0EMMVnuK2SyGZdpTTBsztophLn3ME/t+W9Zv25Syp5itYpiLnmKWRKB7sWvEiBFyyimnyMsvv2wucaxnV2ikAIUphiXmxymjfyCDBhTukuMosIgMmVTkDAAEFDnjiYIYrBXF8lEMa6go9k1jxl4xzFXRukPKopjtYpiLoljuRaF7sfrggw/MZY31bMozzzwjF198sZx44onmv9XVmc9/B8RFPophrjZt2klJcYm1x0ewRWXIJDkDAMFFznijIAYrRbF8FsNSFcUSGzO2i2HpimL5KoZ5FcVmvjtXqmt2WN8mgu+ggw6SHj16yBtvvCHHHXecXHnllfL888+bq7sccsghhd49IFAcx5GXXnhGtm3bIiNHn2q1GAZEBTkDAAhbzgR2DrHqHhXilJRbe/wmazaLbU6p/XqjI/bH9S790HtuMG8dZcNXn8rilY9Jy/LdZP/235WPlpc1uNYevXLzPPoNOUxqS4pk0byXTGGsSVmZDB9zqrTp2lUqxa7Stq3NfyvatpYTW7WQ6XP/KXe/8qi5bXCvg2XQfgMavY33ntmS6d7I/s4xst35Uj5a3NTfRhz7Ezs7lXbfDcfJ4ZnobLoLB+xsijvmXiecTHTYYYfJ4sWLZcKECRJXZE1wsqa2ZXPr23j33RYZ37drt9OkazeRdV/sXDLhFNt/nVq0sX+AcVattb4NcWpDnTUFzxl3vQAhZ7yRM/HKmZoyu89jR1P7nQxK27Syvg1yJs85E5E2ze0WcoYeYsi5ds32kP5dx8q+7Q+X0uKGi2G51vuggXX/7rx7d9mtc/7P7Fe06yRdO36z3X5753/+jNKiJtKyuE3etxs52XQtDlh4qOTwcLVq1UruueeevO8PAOBr2Q5jCVjWkDMAEGDkTLh6iCH8RbGNX62UzdtXS+um9ocquqqrquTZfzxieoZpMWzFR+/L6/PnyoGHHib5tPC91+Tj1Z/IXp33lJXrVsmMuf+S0UO+I2Wl+S8QopEicDZF3XfffSl/V1RUlDJgAACWRaSHGDkDAAEWgTbNfRZyhoIYrGnbrGtei2JuMWzDF+vMMEntGabFsMXzXhLthX3g4MPyVgx79d0FdcMk12xYa4ZPUhQLqQiEh7rooovq/awTT3755ZdSVlYmzZs3p6ECAIUSkYIYOQMAARaBNs1FFnKGIZOwXhSrdWpNUSzfxTB10CFDpP+hh8viuS/JG6++IvkuhrnDJ08cMlLWb9lgimJVO+zP0YXcicIVWdSGDRvqLVu3bpWlS5fK4YcfLg888EChdw8AYisqV5kkZwAguMgZbxTEEPqiWKpimMsUxYbYL4p5FcNcFMUQRD179pSrr756l7MtAADkAjkDAAhyzlAQQ6iLYg0Vw1w6XNJmUUwfM1UxzEVRDEFUWloqK1euLPRuAAAiipwBAAQ1Z5hDDKGdUyzTYpjLnUNMi2KJP+eiGKaPma4YllwUY06xEInAeHs1ffr0ej87jiOrVq2SW2+9VYYOHVqw/QKA2IvIHGLkDAAEWATaNNMt5Iz1gph2X5s8ebLpwnbTTTfZ3hxiUhTzWwyzVRRzi2Ha+2zQbr0zWoeiWLhkM34+aOPt1ZgxY3a5Estuu+0mxxxzjFx//fUSZuQMgDDLdp6WoGUNOQMAwRWFNs0YCzljtSC2YMECufPOO6Vfv342N4OYFcWyLYbluiiWWAwzj/HhpozXpSgWMgELg2zU1tZKFJEzACKBnAkscgZAZIQ8a2ot5Iy1OcR0xv/TTz9d7r77bmnXrp2tzSBmc4o1thiWqznFdimGZYE5xULWvdjvAuvIGQCxzhmyxjpyBkBkkDP57SE2fvx4GTlypAwbNkyuvPLKlPerrKw0i2vz5s22dgkB7ikm0iVvxbDG9hTLRTHMRU8x2DRp0qSM73vDDTdI2GSaM4qsAYDcI2e+Qc4AQPhyxkpB7MEHH5TXXnvNdDFuyJQpU+QPf/iDjd1AiIpi69aulo6dOuetGJZtUSyXxTAXRbFgC/N4+8WLF2d0Px1/HzZ+ckaRNQCCKsxziJEz3yBnAARZWNs0iy3nTM4LYitWrDATTj733HPStGnTBu+vE1QmVv30bEq3bt1yvVsI+vDJmtRFMVvFML9FMRvFMBdFsQAL8RVZ/vznP0vv3r2lpKREosRvziiyBkBghfgqk+TMN8gZAIEW0jbNny3nTM7nEFu0aJGsXbtWBgwYIKWlpWZ54YUX5Oabbzb/rqmpqXf/8vJyad26db0F8dOpy+5SW1NjimL5LIZlOqeYzWKYiznFgn02xe8SBP3795f169ebf++9997yxRdfSBT4zRlF1gCIWs4EIWvImW+QMwCCjJzJUw+xY489VpYsWVLvtrPPPlt69eolv/71ryN3Bgm5LYqtXfVZXU+xfBXDGuoplo9iWOqeYiOlrLSJ1W0immdTVNu2beXDDz80lyP++OOPI3MFMHIGQKSEuIcYOQMAIRHSNk1byzmT84JYq1atpE+fPvVua9GihXTo0GGX24FURbFVny6X1+a+mLdiWKqimPvvfBTDkotiMxc+J1u/2irtW3FVo4IKaXiosWPHylFHHSVdunQx4+oHDRqU8ku8Bk1YkDMAIiXEBTFyBgBCIqRtmrGWc8baVSaBxhTF1qz8VNav+1xOOPl7eSuGpSqK5bMYllgU+8G3T5Um9A5DI9x1111yyimnyPvvvy8XXnihnHfeeeZLPgAAuUDOAADCnDN5KYjNnj07H5tBhFR03UOOP+m7UlQcvqsS5QrFsGAI6xVZXCeccELdfCg6QXBUGyrkDICwCvNVJhU5AwDBF+Y2zQkWc4YeYgh0USxxTrF8SZwzLJOrTyLiQtq9ONm0adMKvQsAgIgNmUxEzgBAgEWgTTPNQs5QEEOoJtq3LdUE+hTFYiwC4QEACLCIFMQAAAFGm8YTBTEEXr6KYqmKYamuPol4CHP3YgBA8IV9yCQAIPho03grTnE7ELiiWG1NjSmK5bMY5tLb9Hd6H70vYng2xe/iw9SpU6Vfv37SunVrswwZMkSefvrput9v375dxo8fb65u1bJlS3O1lTVr1uT+uQIAwpMzPrKGnAGAmKNN44mCGCTuRbGGimEuimKwZY899pCrr77aTBS5cOFCOeaYY+Skk06St99+2/x+4sSJMmPGDHnkkUfkhRdekJUrV5qrrQAAkAlyBgBg2x4hzJrADplceUSJlJTb270uL7UR20q211rfRtmmKuvbKN76pfVtrPhP6wzv2V02fvmZfF68Xlo23S3jx9/esdzz9tUrX5NVKz+QffcbLS3KB8j7r6d/nBblx8q++7WT95YslC1ftJPOXQd887v37L9OTvUO69uQojzUyYstb8MpClX34tGjR9f7+aqrrjJnWObNm2eC5Z577pH777/fhIo7oeT+++9vfn/ooYf62xjqIWvilTVN19n92pMqa3KpqMp+DtSSNYHPGXe9TJEzhUPOZIacyQw54wM5Uw9tmpAVxIBU2jbfPWePpQWtxKKWrXUQzwkoN2/eXO/m8vJys6RTU1Njzpps27bNdDPWMyzV1dUybNiwuvv06tVLunfvLnPnzqWhAgAxn1Tfb9aQMwAQQ7RpPDFkEgAsjbfv1q2btGnTpm6ZMmVKys0sWbLEjKXXcPnpT38qTzzxhBxwwAGyevVqKSsrk7Zt29a7f0VFhfkdACDec4hlmjXkDADEGG0aT/QQA4A0tLOy3w7L7v1XrFhhJpR0pTuT8q1vfUtef/112bRpkzz66KNy5plnmrH1AIBoyyZn3PX8ZA05AwDxRZvGGwUxALDUvdi9wkom9IzJvvvua/49cOBAWbBggfz5z3+W733ve1JVVSUbN26sd0ZFr8jSuXNnnzsGAIjakMlMs4acAYAYo03jiSGTABBAtbW1UllZaYKkSZMmMmvWrLrfLV26VJYvX27G4wMAkA1yBgAQ96yhhxgAFPiKLJMnT5YRI0aYSSW3bNlirr4ye/ZseeaZZ8w4/XPPPVcmTZok7du3N2dnLrjgAhMcTHQMAOGXj6tMkjMAEG+0abxREAMAS92LM7V27Vo544wzZNWqVSYs+vXrZ4LjuOOOM7+/8cYbpbi4WMaOHWvOsAwfPlxuv/12nzsFAIjikMlMkDMAEHO0aTxREAOAhmTTUPHhnnvuSfv7pk2bym233WYWAEAEkTMAANvIml1QEAOAAncvBgDEVz6GTAIA4o02jTcKYgBQ4O7FAIAYy8OQSQBAzNGm8cRVJgEAAAAAABAr9BADgDToXgwAsIkhkwAA22jTeKMgBgDp0L0YAGATQyYBALbRpvFEQQwA0uBsCgDAJnqIAQBso03jjYIYAKTD2RQAgE30EAMA2EabxhMFMQBIh/AAANhEQQwAYBttGk9cZRIAAAAAAACxQg8xAEiD8fYAAJuYQwwAYBttGm8UxAAgHboXAwBsYsgkAMA22jSeKIgBQBpFjmMWv+sAAGArZ9z1AADIBG0abxTEACAdzqYAAGyihxgAwDbaNJ4oiAFAGoy3BwDYxBxiAADbaNN44yqTAAAAAAAAiBV6iAFAOnQvBgDYxJBJAIBttGnCVRB76Ojp0rJFibXHH7tpnNjW8a0d1rdRvmKL9W3UrF1nfRuyfoPVh29WubtYV1VlfRNFTez/yTp5eB5SbLlzqpO7x6d7cbSRNZkhazJD1sQoawqcM+56CD5yJjPkTGbImcyRM/XRpglZQQwAAoGzKQAAm+ghBgCwjTaNJwpiAJAGZ1MAADbRQwwAYBttGm8UxAAgHc6mAABsoocYAMA22jSeuMokAAAAAAAAYoUeYgDQgDh0FwYAFA45AwCwjazZFQUxAEjHcXYuftcBAMBWzrjrAQCQCdo0niiIAUAaTEAJALCJSfUBALbRpvFGQQwA0mECSgCATUyqDwCwjTZNfibVnzJlihx88MHSqlUr6dSpk4wZM0aWLl2a680AQF4U1Wa3wB5yBkCUZJszZI095AyAqCFn8lQQe+GFF2T8+PEyb948ee6556S6ulqOP/542bZtW643BQCIIXIGAGATOQMA8ZDzgtjMmTPlrLPOkt69e8uBBx4o9957ryxfvlwWLVqU600BQP66F/tdcnwmevv27ebLeYcOHaRly5YyduxYWbNmjcQROQMgUhz7WUPO+EPOAIgc2jT5KYgl27Rpk/lv+/btPX9fWVkpmzdvrrcAQNAmoPS75PpM9MSJE2XGjBnyyCOPmPuvXLlSTjnllNw/4RBqKGcUWQMgajnjJ2vImcYhZwCEHW2aAkyqX1tbKxMmTJChQ4dKnz59UlYR//CHP9jcDQAI9CWK9Ux0Ij0TrWdV9Ez0kUceab6I33PPPXL//ffLMcccY+4zbdo02X///U3gHHrooRJXmeSMImsARCpn3PUyRM5kj5wBEAm0afLfQ0yrg2+99ZY8+OCDKe8zefJk88K4y4oVK2zuEgAE7mxKQ2eiNUT0DMuwYcPq7tOrVy/p3r27zJ07V+Isk5xRZA2AOPcQS0bOZI6cARAFtGny3EPs/PPPl6eeekrmzJkje+yxR8r7lZeXmwUAoiZ5uEQmxzuvM9GrV6+WsrIyadu2bb37VlRUmN/FVaY5o8gaAFHlN2vImcyRMwAgkW7T5LyHmOM4JjyeeOIJ+c9//iM9evTI9SYAIBQTUHbr1k3atGlTt+hwilydiY4zcgZApDj5zRpypmHkDIDIoU2Tnx5i+sR1TOg//vEPc3UBt9KnL1yzZs1yvTkAsCqb7sLu/XW4ROvWretub+hMSqoz0Z07d5aqqirZuHFjvTMqekUW/V3ckDMAoiTbYSnZZA05kxlyBkDU0KbJUw+xqVOnmrGiRx99tHTp0qVueeihh3K9KQDI3wSUfhcRExyJS6rwaOhM9MCBA6VJkyYya9asutv0EsZ6CfghQ4ZI3JAzACIl25zxkTXkjD/kDIDIoU2Tnx5i+iIAQFQ05mxKrs5E63/PPfdcmTRpkpmUUoPoggsuMMERxyt/kTMAoqSxPcQyQc74Q84AiBraNHmeVB8AIiFh/LyvdXyeiVZ6JjqRXob4rLPOMv++8cYbpbi4WMaOHSuVlZUyfPhwuf32233uGAAgEjnjrpchcgYAYo42jScKYgAQgjPRTZs2ldtuu80sAAD4Qc4AAGxzQpg1FMQAoMDdiwEA8ZWPIZMAgHijTeONghgApFPr7Fz8rgMAgK2ccdcDACATtGk8URADgAKPtwcAxFge5hADAMQcbZpwFcTeqd4hzavsvQMtV9SKbWXrvrS+jaIdNda3IY7916q4vLndDXy+3u7ji0jNps3WtyElJRIFRWVN7D6+jl/P0Z9fURbdhXUdhANZkxmyJkNkTWyyptA5466H4CNnMkPOZIicCZSw5Ix5PNo04SqIAUAgaBj5vfw6l2sHANjMGXc9AAAyQZvGU7H3zQAAAAAAAEA00UMMANLgiiwAAJu4yiQAwDbaNN4oiAFAOkxACQCwiUn1AQC20abxREEMABqY0NJMaulzHQAAbOWMux4AAJmgTeONghgApKMXJPJ7USL7FzECAMQ5Z9z1AADIBG0aTxTEACANzqYAAGyihxgAwDbaNN64yiQAAAAAAABihR5iAJAOE1ACAGxiUn0AgG20aTxREAOAdLSrsN/uwjHoXgwAKGDOuOsBAJAJ2jSeKIgBQBpFzs7F7zoAANjKGXc9AAAyQZvGGwUxAEiHsykAAJvoIQYAsI02jScKYgCQRlHtzsXvOgAA2MoZdz0AADJBm8YbV5kEAAAAAABArNBDDADSoXsxAMAmhkwCAGyjTeOJghgApMMligEAQcsZdz0AADJBm8YTBTEASKPIcczidx0AAGzljLseAACZoE3jjYIYAKRD92IAgE0MmQQA2EabxhMFMQBIR3PA7xVWop8dAIBC5oy7HgAAmaBN44mrTAIAAAAAACBW6CEGAGkw3h4AYBNziAEAbKNN442CGAA0eEUWv+Ptbe0MACBysskZdz0AADJBm8YTBTEASIcJKAEANjGpPgDANto0niiIAUA6OvlkURbrAABgK2fc9QAAyARtmnAVxP5y2UgpLSm39vitq7aKbUU19j9BzvZK69uQUvsfk9qtdt+P4hYtxLaisjLr23Cqd1jfRlHTpta3Ubt1m93Hd6pDN95+zpw5ct1118miRYtk1apV8sQTT8iYMWPqfu84jlx22WVy9913y8aNG2Xo0KEydepU6dmzp+9t4RtkTWbImsyQNfHJmkLnjLueH+RMYZAzmSFnMkPOZI6cyX+bZk4Ic4arTAJAAGzbtk0OPPBAue222zx/f+2118rNN98sd9xxh7z66qvSokULGT58uGzfvj3v+woACB9yBgBg07YQ5kxge4gBQJzG248YMcIs3g/nyE033SS/+93v5KSTTjK33XfffVJRUSFPPvmknHbaab63BwCI1xxi5AwAxFge2jQjQpgz9BADgEzCw+8iIps3b663VFZmNxzgo48+ktWrV8uwYcPqbmvTpo0MHjxY5s6dm7OnCgAIUc7kMGvIGQCIOHLGEwUxALAUHt26dTMHeneZMmVKVrug4aH0DEoi/dn9HQAgngWxXGQNOQMAEUfOeGLIJABYuiLLihUrpHXr1nU3l5fbm1QXABDPq0ySNQCABtGm8UQPMQDI4IosfhelwZG4ZBsenTt3Nv9ds2ZNvdv1Z/d3AIB45Uwus4acAYBoI2e8URADgIDr0aOHCYpZs2bV3abj9/XqLEOGDCnovgEAwo+cAQDEMWesFcT0Upt77bWXNG3a1EyUNn/+fFubAoBAjrf3Y+vWrfL666+bxZ14Uv+9fPlyKSoqkgkTJsiVV14p06dPlyVLlsgZZ5whXbt2lTFjxkhckTMAIqGRc4hlipzxj5wBEBnkTP7mEHvooYdk0qRJcscdd5jw0MtrDh8+XJYuXSqdOnWysUkAsKPW0T7G/tfxaeHChfLtb3+77mc9hqozzzxT7r33Xrn44otl27Zt8uMf/1g2btwohx9+uMycOdN8SY8jcgZArHPGXc8HcsYfcgZApOShTbMwhDlT5DhZdGVogIbGwQcfLLfeeqv5uba21lyZ4IILLpDf/OY3adfVbnN65YKje02U0hJ7k7UVVe2w9th126j5ehY6mzZstr6J2q1brW9Ddth9P4pbtBDbnOrqPGwjD5/b8jLr23Asv987nGqZveMx2bRpU70JIP1wj0XD9r7I97FoR02l/PvDPzdq+7CXM4qs8YmsyQhZE5+sKXTOmH0ga6wiZxK2Qc5kjpzJcBvkTD5yRtGmyfOQyaqqKlm0aJEMGzbsm40UF5uf586dm+vNAYBl2XQtzvl5BiQgZwBES7bDWMgaW8gZANFDzuRlyOS6deukpqZGKioq6t2uP7/77ru73L+ystIsiRVMAAiMbOYEy33HWzQiZxRZAyCwspx7kqyxh5wBEDm0aYJ5lckpU6aYLnzuol2RAQDIJbIGAGATOQMA4ZPzgljHjh2lpKRE1qxZU+92/Vkvs5ls8uTJZkyqu6xYsSLXuwQA2dPJJLNZYI3fnFFkDYDI5QxZYw05AyByyJn8FMTKyspk4MCBMmvWrLrbdBJK/XnIkCG73L+8vNxM0Ja4AEBgOLXZLbDGb84osgZA5HKGrLGGnAEQOeRMfuYQcy+vqZfWHDRokBxyyCHmMsV6ec2zzz7bxuYAwB7G2wcSOQMgMphDLJDIGQCRQpsmfwWx733ve/L555/LpZdeKqtXr5aDDjpIZs6cucvElAAQeKarsM8wiEH34kIjZwDEOmfq1oMt5AyASKFNk7+CmDr//PPNAgChxtmUwCJnAEQCPcQCi5wBEBm0aYJ5lUkAAAAAAAAgEj3EACASTO9iv2dTbO0MACBysskZdz0AADJBm8YTBTEASIfuxQAAmxgyCQCwjTaNJwpiAJBOrV5uuDaLdQAAsJQzdesBAJAB2jSeKIgBQDqcTQEA2EQPMQCAbbRpwlEQc75+0XfUVFrdTlHNDquPb7aRj4qqU2V9E7VOtfVtiGP3/SjOw+vkWH4O+dpGUR6Oe45TY/Xxd3z9mXWPJ41CeEQSWeMTWZMRsiY+WVPwnHHXQ2CRMz6RMxkhZzJHziShTROOgtiWLVvMf19adnuhdwVRsq3QOxAi2yUy9HjSpk2bQu8GAoisgRVkTeyyhpxBKuQMrCBnMkfOIIwFsa5du8qKFSukVatWUlRUlNE6mzdvlm7dupn1WrduLWEVhecRheegeB7hfg56JkXDQ48njVZrLsmSxToIMr9ZE4W/JcXzCI4oPIc4P4+C50zdeggqcobnEQRReB5ReA4FzxlFmyYcBbHi4mLZY489slpXP1hh/iOJ0vOIwnNQPI/wPodcnUlxnFqz+F0HwZZt1kThb0nxPIIjCs8hrs+jkDnjrofgImd4HkEShecRhedQqJxRtGlCUhADgEDRsfN+z47EYLw9AKCAOeOuBwBAJmjTeKIgBgANBgHhAQAIUM7UrQcAQAZo00S3IFZeXi6XXXaZ+W+YReF5ROE5KJ5HcBT8OeiVlYp8dheOQffiuCn45zBHeB7BEYXnoHgeBcoZRdZECn9LwcLzCI4oPIdAPA/aNJ6KnJxdxxMAokMnvtRx+8e2Ol1Ki8p8rbvDqZJZW/4umzZtisRcBwCAYOWMImsAAA2hTRODHmIAYA3diwEANjFkEgBgG20aTxTEACANp7ZWHJ/di+NwRRYAQOFyxqxH1gAAMkSbxhsFMQBIh7MpAACb6CEGALCNNo0nCmIAkI5enriI8AAABChnFFkDAMgUbRpPxRJyt912m+y1117StGlTGTx4sMyfP1/CZMqUKXLwwQdLq1atpFOnTjJmzBhZunSphN3VV18tRUVFMmHCBAmbzz77TH74wx9Khw4dpFmzZtK3b19ZuHChhEVNTY1ccskl0qNHD7P/++yzj1xxxRUS9OtnzJkzR0aPHi1du3Y1n50nn3yy3u91/y+99FLp0qWLeV7Dhg2TZcuW2d8xfd20u7CvJdivNeKVNeRM8IQ9Z8KaNdHKGbImasKcM1HNGnKmsMKYM9HLGkeiLtQFsYceekgmTZpkLl/62muvyYEHHijDhw+XtWvXSli88MILMn78eJk3b54899xzUl1dLccff7xs27ZNwmrBggVy5513Sr9+/SRsNmzYIEOHDpUmTZrI008/Le+8845cf/310q5dOwmLa665RqZOnSq33nqr/Pe//zU/X3vttXLLLbdIkOlnXv+G9QuhF30ON998s9xxxx3y6quvSosWLczf+/bt2/O+r4iXsGcNORMsUciZsGYNOYOgCnvORDFryJnCC2POKLImXIqcoJdY09CzJ3omQv9IVG1trXTr1k0uuOAC+c1vfiNh9Pnnn5uzKhoqRx55pITN1q1bZcCAAXL77bfLlVdeKQcddJDcdNNNEhb6uXn55ZflxRdflLAaNWqUVFRUyD333FN329ixY80ZiL/97W8SBno25YknnjBnF5UepvQsyy9+8Qv55S9/aW7Ty//q87z33nvltNNOs3aJ4m+XfldKi5r4WneHUy3P73jU9yWKNTivu+46Wb16tQlSDfxDDjkki71HLkUta8iZwopCzkQha8KeM9lmDTkTTFHLmbBnDTkTDGHPmShkzY4YtGlC20OsqqpKFi1aZLoYuoqLi83Pc+fOlbDSD5tq3769hJGeGRo5cmS99yVMpk+fLoMGDZJx48aZEO/fv7/cfffdEiaHHXaYzJo1S9577z3z8xtvvCEvvfSSjBgxQsLqo48+MgfUxM+VHtj1C6T1v/eshrHUxvLscBRFMWvImcKKQs5EMWtCmTM+s4acCaYo5kzYs4acCYao5Uxos8ansGVNaAti69atM+OKtZqaSH/WD1kY6dkgHaOuXVz79OkjYfPggw+aD73OIRBWH374oema27NnT3nmmWfkZz/7mVx44YXy17/+VcJ0VkjPLvTq1ct0ldYQ1M/V6aefLmHl/k0X4u/dqXWyWvy64YYb5LzzzpOzzz5bDjjgANONunnz5vKXv/zFyvNCPLOGnCm8KORMFLMmjDnjN2vImWCKWs6EPWvImeCIWs6ENWv8ClvWcJXJgJ2NeOutt0zlO2xWrFghF110kZkzQCcDDSsNcD2j8sc//tH8rAdefU/0D/nMM88s9O5l5OGHH5a///3vcv/990vv3r3l9ddfN+Gh3XPD8hwCxZwZ8Xl2xOfZFPfs8OTJkyN1dhjBQ84UXhRyRpE1Bc6ZuvUyQ84gn8KaNeRMsJAzOUabJloFsY4dO0pJSYmsWbOm3u36c+fOnSVszj//fHnqqafMVSn22GMPCRv94Gs3SB1v79KzXfp8dD6EyspK834FnV7tQyvZifbff3957LHHJCx+9atf1Z1RUXpVmU8++cSc6QpreLh/0/r3re+RS3/WeR1s2iHVIk4W63w9Zj9ReXm5WfycHX733Xez2W3kSJSyhpwJhijkTBSzJmw54zdryJngilLOhD1ryJlgiVrOhDFrdsSgTRPaglhZWZkMHDjQjCt2J6nTarj+rAfisNCJ9XTCTJ1sb/bs2eaysmF07LHHypIlS+rdpt0ktYvrr3/961CEh9Ku3cmXiNZx63vuuaeExZdffmkq8Yn09de/j7DSvwsNEP37dsNCD8x6ZRbtBm7rGKPbfGn1v7Jav2XLlmZC3EQ6lv73v/99jvYQ+RCFrCFngiUKORPFrAljziiyJvyikDNRyRpyJliiljNhzZqWEc+Z0BbElE7WptVh7RKqVy3Qq3/oZU71wBWmLsXaDfQf//iHtGrVqm7ssE6up1fQCAvd9+Q5AvQSsh06dAjV3AETJ040EzhqF+NTTz1V5s+fL3fddZdZwmL06NFy1VVXSffu3U334sWLF5ux3Oecc44E/Yo+77//fr1JJ7VrtE7Gqs9Fu0jrlX50PgQNk0suucR0mXa/POaadpXXfdCuv9l+MdQryyTyOpMSxbPDURP2rCFngiUKORPWrIlazvjJGnIm2MKeM1HJGnImWMKYM1HMGifqbRon5G655Rane/fuTllZmXPIIYc48+bNc8JE3wKvZdq0aU7YHXXUUc5FF13khM2MGTOcPn36OOXl5U6vXr2cu+66ywmTzZs3m9dd/y6aNm3q7L333s7//u//OpWVlU6QPf/8855/C2eeeab5fW1trXPJJZc4FRUV5r059thjnaVLlzpRocev888/v+7nmpoaZ/fdd3emTJlS0P1C+LOGnAmesOdMWLOGnCFngizMORPlrCFnCieMOaPImkNClTVF+n+FLsoBQNzpJYr17PCdd95Zd3ZYJxPV8fbJ4/ABAPCLnAEA2PZQyLIm1EMmASAqvve978nnn38ul156qRlmoPMKzJw5M5DBAQAIH3IGAGDb90KWNfQQAwAAAAAAQKzUv2wDAAAAAAAAEHEUxAAAAAAAABArFMQAAAAAAAAQKxTEAAAAAAAAECsUxAAAAAAAABArFMQAAAAAAAAQKxTEAAAAAAAAECsUxAAAAAAAABArFMQAAAAAAAAQKxTEAAAAAAAAECsUxAAAAAAAABArFMQAAAAAAAAgcfL/AcbcxzywznZcAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig,axs = plt.subplots(1,3,figsize=(15,4))\n", + "\n", + "data = axs[0].imshow(tess_hdulist_faint[1].data['FLUX'][100,:,:], origin='lower',vmin=0, vmax=80)\n", + "axs[0].contourf(\n", + " simple_ap_faint, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[0].imshow(simple_ap_faint, alpha=0.2, origin='lower')\n", + "axs[0].set_title('Simple Aperture Faint')\n", + "fig.colorbar(data, ax = axs[0], label = 'flux (e/s)')\n", + "\n", + "data = axs[1].imshow(tess_hdulist_faint[1].data['FLUX'][100,:,:], origin='lower',vmin=0, vmax=80)\n", + "axs[1].imshow(strict_ap_faint, alpha=0.2, origin='lower')\n", + "axs[1].contourf(\n", + " strict_ap_faint, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[1].set_title('Strict Aperture Faint')\n", + "fig.colorbar(data, ax = axs[1], label = 'flux (e/s)')\n", + "\n", + "data = axs[2].imshow(tess_hdulist_faint[1].data['FLUX'][100,:,:], origin='lower',vmin=0, vmax=80)\n", + "axs[2].imshow(balanced_ap_faint, alpha=0.2, origin='lower')\n", + "axs[2].contourf(\n", + " balanced_ap_faint, \n", + " levels=[0.5, 1.5], # Contour levels to isolate the True values\n", + " hatches=['', 'x'], # First for False, second for True\n", + " colors='none', # Use 'none' for colors to ensure transparency\n", + " extend='both' # This is important for handling out-of-range values\n", + ")\n", + "axs[2].set_title('Balanced Aperture Faint')\n", + "fig.colorbar(data, ax = axs[2], label = 'flux (e/s)')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0119fa88-95b8-40e3-93e0-77d2852d7efd", + "metadata": {}, + "source": [ + "We can see here that the crowded aperture is probably the best one here as we want to reduce contamination while maximizing flux contained, this also indicated by it having the highest dilution factor. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/lkprf/__init__.py b/src/lkprf/__init__.py index fa7660a..cf6252c 100644 --- a/src/lkprf/__init__.py +++ b/src/lkprf/__init__.py @@ -10,3 +10,4 @@ from .data import * # noqa from .keplerprf import KeplerPRF # noqa from .tessprf import TESSPRF # noqa +from .aperture import aperture diff --git a/src/lkprf/aperture.py b/src/lkprf/aperture.py new file mode 100644 index 0000000..749691a --- /dev/null +++ b/src/lkprf/aperture.py @@ -0,0 +1,262 @@ +"""Class to create apertures for PRF models""" + +from typing import Tuple, List +import numpy as np + +from .utils import LKPRFWarning +from .data import get_tess_prf_file +from . import PACKAGEDIR +import warnings + +from scipy.interpolate import RectBivariateSpline +from scipy.signal import argrelextrema + +class aperture: + + def __init__( + self, + model_prf = [], #Must be an 3D array + target_index: int = 0, # The index that the target prf is stored in + tess_mag = list[float]) -> float: # Must match length of self[0:] and must be an array + + self.model_prf = model_prf + self.tess_mag = tess_mag + self.target_index = target_index + + def _compute_prf_flux(self): + """Converts the prf model(s) into flux using input tess magnitudes + """ + + zpt = 20.44 + + # Creates empty areay to store flux model values + model_prf_flux = [] + for a in range(len(self.tess_mag)): + tess_flux = 10 ** ((zpt - self.tess_mag[a]) / 2.5) + model_prf_flux.append(self.model_prf[a] * tess_flux) + + return np.array(model_prf_flux) + + def _compute_cumulative_FLFRCSAP(self): + """This will calculate the FLFRCSAP for an aperture that starts from the brightest pixel in the target PRF and then includes the second brightest + and so on in decreasing value. The flux fraction is similar to excess flux leaking into the aperture, a fraction of the PRF of the target may not + be captured in it. To account for this missing fraction, the flux fraction is computed.""" + + # Grab only the target from the prf cube and flatten the data + target_flatten = self.model_prf[self.target_index].flatten() + + # Next sort by brightest to faintest + sort_index = np.argsort(target_flatten) + + # Now decending values + descending_indices = sort_index[::-1] + + # Create new sorted target array based only on this + target_flatten_decending = target_flatten[descending_indices] + + # Cumulative sum of this value as if adding pixels to the aperture + target_cumsum = np.cumsum(target_flatten_decending) + + # Divite the target flux within the aperture by the total flux + cumulative_FLFRCSAP = target_cumsum / target_cumsum[-1:] + + return cumulative_FLFRCSAP, descending_indices + + def _compute_cumulative_CROWDSAP(self): + """This will calculate the CROWDSAP for an aperture that starts from the brightest pixel in the + target PRF and then includes the second brightest and so on in decreasing value. + + The crowding metric reflects what fraction of the flux in the aperture is due to the target itself + not the nearby light sources. Should be flux of source/total flux of everything.""" + + # Need to convert into flux first + model_prf_flux = self._compute_prf_flux() + + # Grab the target from the prf cube and flatten the data + target_flatten = model_prf_flux[self.target_index].flatten() + + # Sort by brightest to faintest + sort_index = np.argsort(target_flatten) + + # Now decending values + descending_indices = sort_index[::-1] + + # Create new sorted target array based only on this + target_flatten_decending = target_flatten[descending_indices] + + # Cumulative sum of this value as if you were adding pixels to the aperture + target_cumsum = np.cumsum(target_flatten_decending) + + # Add up flux for each pixel for every object in whole cube + model_prf_cube_sum = np.sum(model_prf_flux, axis=0) + + # flatten + model_prf_cube_sum_flatten = model_prf_cube_sum.flatten() + + # Cumulative sum on index from above + model_prf_cumsum = np.cumsum(model_prf_cube_sum_flatten[descending_indices]) + + cumulative_CROWDSAP = target_cumsum / model_prf_cumsum + + return cumulative_CROWDSAP + + def _compute_cumulative_signaltonoise(self): + """This will calculate the S/N for an aperture that starts from the brightest pixel in the target + PRF and then includes the second brightest and so on in decreasing value. + The flux fraction is similar to excess flux leaking into the aperture, a fraction of the PRF of the + target may not be captured in it. + To account for this missing fraction, the flux fraction is computed.""" + + # Need to convert into flux first + model_prf_flux = self._compute_prf_flux() + + # Grab only the target from the prf cube and flatten the data + target_flatten = model_prf_flux[self.target_index].flatten() + + # Sort by brightest to faintest + sort_index = np.argsort(target_flatten) + + # Decending values + descending_indices = sort_index[::-1] + + # Create new sorted target array based only on this + target_flatten_decending = target_flatten[descending_indices] + + # Cumulative sum of this value as if you were adding pixels to the aperture + target_cumsum = np.cumsum(target_flatten_decending) + + noise = model_prf_flux[1:] + noise_sum = np.sum(noise, axis=0) + noise_flatten = noise_sum.flatten() + noise_cumsum = np.cumsum(noise_flatten[descending_indices]) + + cumulative_SN = target_cumsum / noise_cumsum + + return cumulative_SN, descending_indices + + def _get_local_minima(self,cumulative_SN): + """This code computes the local minima of the cumulative signal to noise.""" + + # Find indices of local minima + minima_indices = argrelextrema(cumulative_SN, np.less) + + # It is likely there will be a large drop at 1 pixel as pixel 0 will contain the most flux + # We dont want 1 as the firt minima, as such removing + minima_indices_fix = np.array( + tuple(item for item in minima_indices[0] if item != 1) + ) + + return minima_indices_fix[0] + + + def _calculate_dilution_factor(self,aperture): + #Calculates the dilution factor as a function of the aperture selected + + # Convert into flux model + model_prf_flux = self._compute_prf_flux() + + # Get sum of target flux in aperture + target_flux = model_prf_flux[self.target_index] + sum_target_flux = np.sum(model_prf_flux[self.target_index] * aperture) + + # Get sum of all flux in aperture + all_flux = np.sum(model_prf_flux * aperture) + + Di = sum_target_flux/all_flux + + return Di + + def simple_aperture(self, completeness: float = 0.9): + + # Calclate the flux fraction + FLFRCSAP, descending_indices = self._compute_cumulative_FLFRCSAP() + + # Now you want to select the number of pixels based on the input completness from the user + index_pixel = np.where(FLFRCSAP >= completeness) + index_pixel = index_pixel[0][0] + + # Get the initial data so you can determine correct size + target_data = self.model_prf[self.target_index] + + # Create boolean array which is all false based on the above shape + all_false_array = np.full(target_data.shape, False, dtype=bool).flatten() + + # Create masks which are true for index of descending_indices + indexes_to_set_true = descending_indices[0:index_pixel + 1] + + for index in indexes_to_set_true: + all_false_array[index] = True + + # Re-shape the array into what it was before so we can see what the mask looks like + simple_aperture = all_false_array.reshape(target_data.shape) + + #Calculate Dilution factor + Di = self._calculate_dilution_factor(simple_aperture) + + + return simple_aperture, Di + + def strict_aperture(self): + + # Convert into flux model + model_prf_flux = self._compute_prf_flux() + + # Calculate the cumulative SN + cumulative_SN, descending_indices = self._compute_cumulative_signaltonoise() + + # Calculate the minima + minima_indices = self._get_local_minima(cumulative_SN) + + # Get the initial data so you can determine correct size + target_data = self.model_prf[self.target_index] + + # Create boolean array which is all false based on the above shape + all_false_array = np.full(target_data.shape, False, dtype=bool).flatten() + + # Create masks which are true for index of descending_indices + indexes_to_set_true = descending_indices[0: minima_indices + 1] + + for index in indexes_to_set_true: + all_false_array[index] = True + + # Re-shape the array into what it was before so we can see what the mask looks like + strict_aperture = all_false_array.reshape(target_data.shape) + + #Calculate Dilution factor + Di = self._calculate_dilution_factor(strict_aperture) + + return strict_aperture, Di + + + def balanced_aperture( + self, crowding_metric: float = 0.8, fluxfrac_metric: float = 0.9 + ): + + # Convert model into flux model + model_prf_flux = self._compute_prf_flux() + + # Calculate the cumulative crowdfrac + crowding = self._compute_cumulative_CROWDSAP() + + # Calculate the cumulative fluxfrac + flfrac, idx = self._compute_cumulative_FLFRCSAP() + + vals = [] + for a in range(len(crowding)): + if flfrac[a] < fluxfrac_metric and crowding[a] > crowding_metric: + vals.append(a) + + shape = self.model_prf.shape[1:] + all_false_array = np.full(shape, False, dtype=bool).flatten() + indexes_to_set_true = idx[vals] + + for index in indexes_to_set_true: + all_false_array[index] = True + + # Re-shape the array into what it was before so we can see what the mask looks like + balanced_aperture = all_false_array.reshape(shape) + + #Calculate Dilution factor + Di = self._calculate_dilution_factor(balanced_aperture) + + return balanced_aperture, Di diff --git a/src/lkprf/prfmodel.py b/src/lkprf/prfmodel.py index 946e6b9..2236d75 100644 --- a/src/lkprf/prfmodel.py +++ b/src/lkprf/prfmodel.py @@ -4,6 +4,7 @@ from typing import Tuple, List import numpy.typing as npt import numpy as np +from .aperture import aperture class PRF(ABC): @@ -149,7 +150,80 @@ def evaluate( """ self.check_coordinates(targets=targets, shape=shape) self._prepare_supersamp_prf(targets=targets, shape=shape) - return self._evaluate(targets=targets, shape=shape, origin=origin, dx=0, dy=0) + #Need to define model_prf as a proprety of self here so it can be used in get_aperture + self.model_prf = self._evaluate(targets=targets, shape=shape, origin=origin, dx=0, dy=0) + return self.model_prf + + def get_aperture(self, + aperture_type: str = "strict", + completeness: float = 0.9, + crowding_metric: float = 0.8, + fluxfrac_metric: float = 0.9, + target_index: int = 0, + tess_mag = list[float]) -> float: + + """Calculates an aperture for the user based on the PSF. The user may pick from three options depending on the + object of interest and the level of crowding. + + Parameters + ---------- + + aperture_type : A string in which the user can specify the kind of aperture they want calculated. + + strict --> Based on the cumulative S/N of the target vs other objects in the data cube. + Computes the local minima of the cumulative S/N and returns the pixel index for which this occurs. + This is then used to create the aperture. + simple --> Computed using the target prf model only. Calculates the cumulative relative flux and uses a completness + parameter input by the user to determine the aperture. + balanced --> This is computes the aperture based on user input crowdsap and flfrcsap values. + + completeness : Float + The relative fraction of flux within a given aperture divided by the total flux of the object. This value is used to + compute the simple aperture. + crowding_metric: Float + The crowding metric reflects what fraction of the flux in the aperture is due to the target itself not the nearby + light sources. Should be flux of source/total flux of everything in the prf data cube. + fluxfrac_metric: Float + The flux fraction is similar to excess flux leaking into the aperture, a fraction of the prf of the target may not + be captured in it. To account for this missing fraction, the flux fraction is computed. + target_index: int + The index of the target within the prf data cube. + tess_mag: List[float]) + The Tess magnitudes of all objects within the prf data cube. Magnitudes must be listed in the order present within the + data cube. + + Returns + ------- + A boolean array which can be used as an aperture within lightkurve. + + """ + + self.aperture_model = aperture(model_prf=self.model_prf, tess_mag=tess_mag, target_index=target_index) + + #Want to restrict input of apertures to those allowed + allowed_apertures = ["strict", "simple", "balanced"] + + if aperture_type in allowed_apertures: + + if (aperture_type == "strict") and (tess_mag is not None): + + ap, Di = self.aperture_model.strict_aperture() + + elif (aperture_type == "simple") and (completeness is not None) and (tess_mag is not None): + + ap, Di = self.aperture_model.simple_aperture(completeness) + + elif (aperture_type == "balanced") and (crowding_metric is not None) and (fluxfrac_metric is not None) and (tess_mag is not None): + + ap, Di = self.aperture_model.balanced_aperture(crowding_metric, fluxfrac_metric) + + else: + print("You must specify which aperture type to generate and input relvant parameters") + + else: + print("User did not enter valid aperture type. Types allowed are 'strict', 'simple', and 'balanced'") + + return ap, Di def gradient( self, diff --git a/src/lkprf/tessprf.py b/src/lkprf/tessprf.py index 96eddc1..d3260eb 100644 --- a/src/lkprf/tessprf.py +++ b/src/lkprf/tessprf.py @@ -30,6 +30,7 @@ def __init__( self.mission = "TESS" self.cache_dir = cache_dir self._prepare_prf() + #self._prfmodel = Null def __repr__(self): return f"TESSPRF Object [Camera {self.camera}, CCD {self.ccd}, Sector {self.sector}]"