diff --git a/notebooks/region_search/Region Searching Workbook.ipynb b/notebooks/region_search/Region Searching Workbook.ipynb index deb393ea1..440e8e0cc 100644 --- a/notebooks/region_search/Region Searching Workbook.ipynb +++ b/notebooks/region_search/Region Searching Workbook.ipynb @@ -44,17 +44,30 @@ "# Import packages needed to run the notebook\n", "import lsst\n", "import lsst.daf.butler as dafButler\n", + "\n", "import os\n", "import glob\n", + "\n", + "import multiprocessing\n", + "from concurrent.futures import ProcessPoolExecutor, as_completed\n", + "\n", "import time\n", + "from dateutil import parser\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", "from matplotlib import pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "from matplotlib.colors import Normalize\n", + "\n", "import progressbar\n", - "from concurrent.futures import ProcessPoolExecutor, as_completed\n", + "\n", "from astropy.time import Time # for converting Butler visitInfo.date (TAI) to UTC strings\n", "from astropy import units as u\n", - "import pandas as pd\n", - "import pickle\n", - "from dateutil import parser" + "from astropy.coordinates import SkyCoord\n", + "\n", + "import pickle" ] }, { @@ -75,8 +88,6 @@ "# We will use some kind of multiprocessing in a few places. Let's see what the sytsem thinks we have available.\n", "# NOTE: we could set limits on executors later using this value, if desired. 2/6/2024 COC\n", "\n", - "import multiprocessing\n", - "\n", "available_cpus = multiprocessing.cpu_count()\n", "print(f\"{available_cpus} CPUs were reported as available by the multiprocessing module.\")" ] @@ -326,8 +337,6 @@ " \"\"\"\n", " datasetTypes = {}\n", "\n", - " import glob\n", - "\n", " cache_file = f\"{basedir}/dataset_types.csv\"\n", " cache_exists = False\n", " if len(glob.glob(cache_file)) > 0:\n", @@ -472,8 +481,8 @@ "src_schema,8\n", "\n", "Read 46 datasetTypes from disk.\n", - "CPU times: user 1.55 ms, sys: 1.26 ms, total: 2.81 ms\n", - "Wall time: 3.19 ms\n" + "CPU times: user 1.59 ms, sys: 1.52 ms, total: 3.11 ms\n", + "Wall time: 15.4 ms\n" ] } ], @@ -631,8 +640,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.23 s, sys: 122 ms, total: 2.35 s\n", - "Wall time: 2.87 s\n" + "CPU times: user 2.17 s, sys: 89 ms, total: 2.26 s\n", + "Wall time: 2.77 s\n" ] } ], @@ -944,8 +953,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 544 ms, sys: 41.7 ms, total: 586 ms\n", - "Wall time: 649 ms\n" + "CPU times: user 417 ms, sys: 33 ms, total: 450 ms\n", + "Wall time: 544 ms\n" ] } ], @@ -1022,8 +1031,8 @@ "text": [ "Found DECam. Adding to \"desired_instruments\" now.\n", "WARNING: we are not iterating over all rows to find instruments, just taking the first one.\n", - "CPU times: user 1.27 s, sys: 285 ms, total: 1.56 s\n", - "Wall time: 1.61 s\n" + "CPU times: user 1.82 s, sys: 344 ms, total: 2.17 s\n", + "Wall time: 2.51 s\n" ] } ], @@ -1052,8 +1061,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.16 s, sys: 135 ms, total: 1.3 s\n", - "Wall time: 1.33 s\n" + "CPU times: user 1.64 s, sys: 309 ms, total: 1.95 s\n", + "Wall time: 3.52 s\n" ] } ], @@ -1118,7 +1127,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 30, @@ -1500,8 +1509,8 @@ "output_type": "stream", "text": [ "Recycled 47383 paths from /astro/users/coc123/kbmod_tmp/uri_cache.lst as overwrite was False.\n", - "CPU times: user 32 ms, sys: 21.5 ms, total: 53.5 ms\n", - "Wall time: 53.7 ms\n" + "CPU times: user 25.3 ms, sys: 14.2 ms, total: 39.5 ms\n", + "Wall time: 108 ms\n" ] } ], @@ -1562,8 +1571,8 @@ "output_type": "stream", "text": [ "0 DateTime(\"2019-09-27T00:20:59.932016000\", TAI) 120.0 (351.3806941054, -5.2403083277)\n", - "CPU times: user 93.4 ms, sys: 11.5 ms, total: 105 ms\n", - "Wall time: 145 ms\n" + "CPU times: user 114 ms, sys: 13 ms, total: 127 ms\n", + "Wall time: 157 ms\n" ] } ], @@ -1699,8 +1708,8 @@ "text": [ "Overwrite is False, so we will read the timestamps from file now...\n", "Recycled 47383 from /astro/users/coc123/kbmod_tmp/vdr_timestamps.lst.\n", - "CPU times: user 16.8 ms, sys: 5.06 ms, total: 21.9 ms\n", - "Wall time: 21.4 ms\n" + "CPU times: user 24.3 ms, sys: 8.18 ms, total: 32.5 ms\n", + "Wall time: 30.5 ms\n" ] } ], @@ -1935,8 +1944,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 403 ms, sys: 15.8 ms, total: 419 ms\n", - "Wall time: 419 ms\n" + "CPU times: user 499 ms, sys: 14.5 ms, total: 513 ms\n", + "Wall time: 513 ms\n" ] } ], @@ -1997,14 +2006,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.62 s, sys: 71.3 ms, total: 1.69 s\n", - "Wall time: 1.72 s\n" + "CPU times: user 1.48 s, sys: 11.3 ms, total: 1.49 s\n", + "Wall time: 1.49 s\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 53, @@ -2075,7 +2084,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 55, @@ -2291,8 +2300,6 @@ "\n", " Added caching 2/5/2024 COC\n", " \"\"\"\n", - " import glob\n", - "\n", " cache_file = f\"{basedir}/overlapping_sets.pickle\"\n", "\n", " cache_exists = False\n", @@ -2369,8 +2376,8 @@ "output_type": "stream", "text": [ "Recycling /astro/users/coc123/kbmod_tmp/overlapping_sets.pickle as overwrite=False.\n", - "CPU times: user 425 ms, sys: 134 ms, total: 559 ms\n", - "Wall time: 559 ms\n" + "CPU times: user 402 ms, sys: 46.6 ms, total: 449 ms\n", + "Wall time: 446 ms\n" ] } ], @@ -2419,14 +2426,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 481 ms, sys: 18 ms, total: 499 ms\n", - "Wall time: 503 ms\n" + "CPU times: user 367 ms, sys: 17.3 ms, total: 385 ms\n", + "Wall time: 383 ms\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 64, @@ -2491,15 +2498,15 @@ "name": "stderr", "output_type": "stream", "text": [ - ":17: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed two minor releases later. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap(obj)`` instead.\n" + ":14: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed two minor releases later. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap(obj)`` instead.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 9.24 s, sys: 745 ms, total: 9.98 s\n", - "Wall time: 9.51 s\n" + "CPU times: user 9.55 s, sys: 815 ms, total: 10.4 s\n", + "Wall time: 9.86 s\n" ] }, { @@ -2518,9 +2525,6 @@ "\n", "# TIMING NOTE: this requires about 7 seconds\n", "\n", - "from matplotlib.cm import get_cmap\n", - "from matplotlib.colors import Normalize\n", - "\n", "# Convert \"ut\" column to datetime\n", "df[\"ut_datetime\"] = pd.to_datetime(df[\"ut\"])\n", "\n", @@ -2717,8 +2721,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.03 s, sys: 19 ms, total: 1.05 s\n", - "Wall time: 1.06 s\n" + "CPU times: user 931 ms, sys: 22.3 ms, total: 953 ms\n", + "Wall time: 952 ms\n" ] }, { @@ -2813,20 +2817,589 @@ "del tmpdf" ] }, + { + "cell_type": "markdown", + "id": "a2e81bd6", + "metadata": {}, + "source": [ + "### (RA, Dec) searching of image sets" + ] + }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 74, + "id": "f3417ffd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"set_1\" is the first set name in overlapping_sets.\n", + "Its first record dataId: {instrument: 'DECam', detector: 1, visit: 898287}.\n", + "It has an (RA, Dec) coordinate of (351.0695696334572, -4.336293374423113).\n" + ] + } + ], + "source": [ + "# Fetch an (RA, Dec) pair from an image set.\n", + "first_set_name = list(overlapping_sets.keys())[0]\n", + "first_sets_data_id = overlapping_sets[first_set_name][0]\n", + "searching_ra_dec = df.set_index(\"data_id\")[\"center_coord\"].to_dict()[first_sets_data_id]\n", + "\n", + "print(f'\"{first_set_name}\" is the first set name in overlapping_sets.')\n", + "print(f\"Its first record dataId: {first_sets_data_id}.\")\n", + "print(f\"It has an (RA, Dec) coordinate of {searching_ra_dec}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, "id": "bfb23aef", "metadata": {}, "outputs": [], "source": [ - "def ra_dec_search_overlapping_sets(df, overlapping_sets):\n", + "def ra_dec_search_overlapping_sets(df, overlapping_sets, ra_dec, search_radius, verbose=False):\n", " \"\"\"\n", " 2/6/2024 COC\n", " Implementing an extremely basic (RA, Dec) query functionality.\n", " This will work within the overlapping_sets framework.\n", " \"\"\"\n", - " pass" + " ra_dec_coord = SkyCoord(ra=ra_dec[0] * u.degree, dec=ra_dec[1] * u.degree)\n", + "\n", + " all_centers = []\n", + " all_labels = []\n", + "\n", + " id_to_coord = df.set_index(\"data_id\")[\"center_coord\"].to_dict()\n", + "\n", + " for i, set_name in enumerate(list(overlapping_sets.keys())):\n", + " all_labels.append(set_name)\n", + " center_data_id = overlapping_sets[set_name][0]\n", + " center_coord = id_to_coord[center_data_id]\n", + " all_centers.append(center_coord)\n", + "\n", + " all_centers = SkyCoord(\n", + " ra=[x[0] for x in all_centers] * u.degree,\n", + " dec=[x[1] for x in all_centers] * u.degree,\n", + " )\n", + "\n", + " distances = ra_dec_coord.separation(all_centers)\n", + " within_radius = (distances <= search_radius) & (\n", + " distances >= 0\n", + " ) # ≥ (not >) because we could supply the an exact match\n", + "\n", + " results = []\n", + " for i, item in enumerate(within_radius):\n", + " if item == True:\n", + " results.append(all_labels[i])\n", + " if verbose:\n", + " print(f\"We found {len(results)} sets that are within {search_radius} of {ra_dec}.\")\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "0b98b0e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We found 4 sets that are within 14.0 arcmin of (351.0695696334572, -4.336293374423113).\n" + ] + }, + { + "data": { + "text/plain": [ + "['set_1', 'set_3', 'set_4', 'set_68']" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find matching image sets.\n", + "# With 1*u.arcminute we would only find set_1 (where we got searching_ra_dec).\n", + "# With 15*u.arcminute, we find 3 others (for a total of 4).\n", + "search_radius = 14 * u.arcminute\n", + "ra_dec_search_results = ra_dec_search_overlapping_sets(\n", + " df=df,\n", + " overlapping_sets=overlapping_sets,\n", + " ra_dec=searching_ra_dec,\n", + " search_radius=search_radius,\n", + " verbose=True,\n", + ")\n", + "ra_dec_search_results" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "447b9b70", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[(350.9194972863569, -4.410893881734765), (350.9194972863569, -4.261692867111463), (351.2196419805575, -4.410893881734765), (351.2196419805575, -4.261692867111463)], [(350.7636367448476, -4.57504777569875), (350.7636367448476, -4.425558984666654), (351.06385253666514, -4.57504777569875), (351.06385253666514, -4.425558984666654)], [(351.07489718950103, -4.574714132229647), (351.07489718950103, -4.425184883190398), (351.3752749096747, -4.574714132229647), (351.3752749096747, -4.425184883190398)], [(351.1044786505892, -4.535445547532834), (351.1044786505892, -4.385657669534001), (351.40443040247294, -4.535445547532834), (351.40443040247294, -4.385657669534001)]]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAGsCAYAAADew6NRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABn60lEQVR4nO3deVhU1f8H8PedYV9lEUVAwIVwl3JJTXNLNE2ztDQ0zLRMTc3MMsvdNLfcLZfUytJyz3Ihl1xQSwUzNdQURcRERLaBgWHO7w+/zC9SkWWYM8O8X88zT87MnbnvexuGD+ece44ihBAgIiIislIq2QGIiIiIZGIxRERERFaNxRARERFZNRZDREREZNVYDBEREZFVYzFEREREVo3FEBEREVk1G9kBzJ1er8eNGzfg6uoKRVFkxyEiIqJiEEIgIyMD1apVg0pVdNsPi6FHuHHjBgICAmTHICIiolJISEiAv79/kduwGHoEV1dXAPdOppubm+Q0REREVBzp6ekICAgw/B4vCouhRyjoGnNzc2MxREREZGGKM8SFA6iJiIjIqrEYIiIiIqvGYoiIiIisGscMERGRdPn5+cjLy5MdgyyIra0t1Gq1Ud6LxRAREUkjhMDNmzdx9+5d2VHIAlWqVAlVq1Yt8zyALIaIiEiagkLIx8cHTk5OnNyWikUIAY1Gg1u3bgEAfH19y/R+LIaIiEiK/Px8QyHk5eUlOw5ZGEdHRwDArVu34OPjU6YuMw6gJiIiKQrGCDk5OUlOQpaq4LNT1vFmFlcMabVaNG7cGIqiIDY2tshtN2/ejPDwcHh7exdreyIiMj12jVFpGeuzY3HF0NixY1GtWrVibZuVlYVWrVph5syZ5ZyKiIiILJVFjRnauXMn9uzZg02bNmHnzp2P3L5///4AgPj4+HJORkRERJbKYoqhf/75B4MHD8bWrVvLtX9Zq9VCq9Ua7qenp5fbvoiIiEg+i+gmE0JgwIABGDJkCJo0aVKu+5oxYwbc3d0Nt4CAgHLdHxERWY/4+PgSj2E9e/YsXnzxRQQFBUFRFMyfP7/c8lkrqS1DkyZNwuTJk4vc5vfff0d0dDTS09Mxbty4cs80btw4jB492nA/PT2dBRGRBFqtFrm5uXB1dUV2djb2798PjUaD7Oxsw39HjBgBlUqFxYsX49KlSxBCID8/H0IIvPLKK2jVqhWOHz+O7777DnZ2dnBycoKjoyNq1KiB3r17QwiBbdu2wdHREa6urvDy8oK3tzc8PT05qJfMhkajMXxm33nnHdlxKiSpxdDw4cPRp0+fIrcJCgrCtGnTcOzYMdjb2xd6rkmTJoiIiMDatWuNlsne3v6+/RCRcQkhcPfuXSQkJMDPzw9eXl6Ijo7Gpk2bkJKSgpSUFGRmZuKpp57C1KlTkZ2djdmzZ8Pe3t5Q0Dg5OSEvLw/29vbw8PCAj48PFEWBSqWCoihwdXUFADg4OKBy5crQarXIysrC7du3YWNz76tPq9ViyZIl0Ol0hfJt3LgRXl5eWL58OS5fvgxvb2/4+PjA398f9evXh4+Pj8nPmbUQQiA7L9/k+3W0VZeoAN64cSMmT56MS5cuwcnJCWFhYdi2bRucnZ2xevVqzJo1C1euXEFQUBBGjBiBoUOHAgCCg4MBAGFhYQCAp59+GgcOHChyX02bNkXTpk0BAB988EEpjo4eRWox5O3tDW9v70dut3DhQkybNs1w/8aNGwgPD8eGDRvQvHnz8oxIRGUghEBSUhJ8fX2hKApWr16N3377DQkJCcjKygIAvPvuu+jWrRvUajXc3NwQHBxsaJ2pXr06AMDDwwN79+6FSvXgnv2IiIiHZmjUqBEaNWr0wOccHBwQFRUFnU6HtLQ03LlzB7dv30alSpUA3JvqX61W49KlSzh8+DDS0tIMeQ8fPoxNmzbB398f1atXR2BgIEJCQgyvpdLJzstH3Qm7Tb7fc1PC4WRXvF+JSUlJ6Nu3L2bNmoWePXsiIyMDhw4dghACK1aswMSJE7F48WKEhYUhJiYGgwcPhrOzMyIjI/Hbb7+hWbNm+OWXX1CvXj3Y2dmV85FRcVjEAOqCL8QCLi4uAICaNWvC39/f8HhoaChmzJiBnj17AgDu3LmDa9eu4caNGwCAuLg4AEDVqlVRtWpVU0Qnsir5+fk4ePAg4uLicOHCBVy4cAFZWVn44Ycf4O3tDZVKheDgYLRp0wb+/v4ICAgwTJXRvHnzh/5xoyhKuXZb2djYwMvLC15eXqhdu7bh8ZdeegkvvfSS4X5GRoZhlltnZ2dUqlQJf/31F6KioqDVatGiRQt88sknyM7OxqZNmxASEsICqQJKSkqCTqfDCy+8gMDAQABAgwYNAABTp07F3Llz8cILLwC41xJ07tw5fPHFF4iMjETlypUBAF5eXvw9ZEYsohgqrri4OKSlpRnub9++Ha+99prhfkGX3MSJEzFp0iRTxyOqUHQ6Hc6fP4/Y2FikpKRg1KhRUKlUmDdvHpydnRESEoK+ffsiJCTE0GUVGRkpOXXZFBwHcK+bo6Cro6AFLDc3F8C99bY2bNiAzMxMAICPjw8aNGiA8ePHcyzSIzjaqnFuSriU/RZXo0aN0KFDBzRo0ADh4eHo1KkTevXqBZ1Oh4SEBLz++usYPHiwYXudTgd3d/fyiE1GYpHFUFBQEIQQ9z3+38cGDBiAAQMGmCgVkXW4efMmZs+ejbNnz0Kr1cLZ2RlPPPEEhBBQFAUbNmywuuUVFEUpNBlscHAwtm/fjps3byIuLg5xcXHIzMyEoigQQuD1119HUFAQGjdujLCwMPj7+7NI+h9FUYrdXSWLWq1GVFQUoqOjsWfPHixatAjjx4/Hjz/+CABYsWLFfa2cZVk3i8qfeX/iiEiq5ORkREdH4+jRo3BxccFHH32ESpUqwcHBAQMHDkRYWBhq1qxZaCyPtRVCD6MoCnx9feHr64u2bdsaHs/NzUWLFi0QGxuLBQsWQK/Xw9PTE6tWrUKlSpUMRSWZN0VR0KpVK7Rq1QoTJkxAYGAgjhw5Aj8/P1y+fPmh49gKxgjl55t+kDg9HIshIrrPxYsXMXv2bFy8eBEqlQqNGjUyjIlwcHDA9OnTJSe0XPb29oYuFI1Ggz///BMXL140jCt688034enpiZYtW6Jly5bFusiETOv48ePYu3cvOnXqBB8fHxw/fhzJycmoU6cOJk2ahBEjRsDNzQ1dunSBVqvFiRMnkJqaitGjR8PHxweOjo7YtWsX/P394eDg8MgutNzcXJw7d87w78TERMTGxsLFxQW1atUyxSFXeIp4UH8TGaSnp8Pd3R1paWlwc3OTHYfI6IQQiI2Nxa+//go3NzcMHDgQqampWLx4MVq2bIlmzZoVGitD5Uev12PTpk04evQoTp8+Db1ej5CQEEyfPr1CFkU5OTm4cuUKgoOD4eDgIDtOsZ0/fx7vvPMOTp06hfT0dAQGBuLtt9/G8OHDAQDffvstZs+ejXPnzsHZ2RkNGjTAqFGjDBf3rFy5ElOmTEFiYiJat279yEvr4+PjDZfk/1txLsuv6Ir6DJXk9zeLoUdgMUQVVXJyMjZv3oy9e/ciOTkZVapUQdeuXQ1r+pFcGRkZ+O2333Dy5EmMGTPGMLlktWrV0L59+wpxhZqlFkNkPoxVDLGbjMiK3Lp1C8nJyahXrx40Gg1+/vlntGvXDs888wzq1q3LsSpmxNXVFR06dECHDh0A3Gs1+ueff7B161YsWbIETZs2xTPPPIPWrVtzrhqiMmLL0COwZYgsnU6nw+HDh7F9+3bExsaiVq1aWL58ueG5gtmYyTKkp6fjwIEDiIqKwsWLF7F582Y4OTkhOTnZMIeNpWDL0D0Fc+c9yM6dO9G6dWsTprEsbBkiokdKTEzEyJEjkZKSggYNGmDs2LFo06aN4XkWQpbHzc0N3bt3R/fu3ZGeng4nJydoNBpERkaievXq6NGjB9q3b89lhSxIUYu2+vn5mS6IFeM3IVEFIoRATEwMzp49i/79+8PX1xfh4eHo0KEDatSoITseGVnBX7sODg74+OOPsW3bNsyePRvLli1Dly5dMGTIEHZ9WgBeESYfiyGiCiA3Nxe7d+/GDz/8gISEBAQHB+Oll14qdBk3VVwqlQotWrRAixYtcOPGDfz444+4efOmYZLHs2fPol69eiyMiB6CxRCRhcvPz8drr72GpKQktG7dGmPGjEGDBg34i89KVatWDW+++abhfmxsLEaPHo3Q0FBERESgVatW/GwQ/QeLISILdPfuXWzbtg29e/eGk5MTXn/9dYSEhBRauJgIABo3boxPP/0U69atw8cff4zAwEC8/vrrHJRL9C8shogsSHJyMtavX4+ffvoJANCwYUOEhYWhffv2kpORuVIUBc2aNUOzZs1w9uxZrFu3Djdv3gRwby4je3t7XppPVo/FEJGF2LZtG5YsWQIHBwf06dMHPXv25ErYVCL16tXDJ598YljUes2aNTh8+DAGDBiATp06cTFRsloshojMWE5ODtLT0+Hj44OAgAC88soreOmll7gYKpVJwZihnj174s6dO5g1axY2bNiAQYMGcUwRWSXVozchIlPT6XTYtm0bIiIiMHv2bADA448/jgEDBrAQIqPx9/fHxIkT8fnnn8Pb2xsff/wxrl27JjtWhRYfHw9FUYqcW+i/Nm/ejCZNmqBSpUpwdnZG48aN8fXXX5dfSCvEliEiMyKEwKFDh7B8+XLcuHEDzzzzDAYMGCA7FlVwjz32GObMmYPLly8jMDAQer0eCxcuxPPPP4+goCDZ8ayep6cnxo8fj9DQUNjZ2WHHjh147bXX4OPjg/DwcNnxKgS2DBGZkYyMDHz66afw9/fHypUrMW7cOPj6+sqORVaiYGLO27dv48SJExg0aBCWLl0KjUZjuhBCALlZpr+VcGWqjRs3okGDBnB0dISXlxc6duyIrKwsAMDq1atRp04dODg4IDQ0FEuXLjW8rmD1+bCwMCiKgrZt2z5yX23btkXPnj1Rp04d1KxZEyNHjkTDhg1x+PDhEmWmh2PLEJFk2dnZWL9+PXr16gU3NzesXr0aPj4+smORFfPx8cHq1avx/fff4+uvv8a+ffswcuRI01yOn6cBPqlW/vv5rw9vAHbOxdo0KSkJffv2xaxZs9CzZ09kZGTg0KFDEEJgxYoVmDhxIhYvXoywsDDExMRg8ODBcHZ2RmRkJH777Tc0a9YMv/zyC+rVq1fiK/mEENi3bx/i4uLw6aefluZI6QFYDBFJIoTAgQMHsHTpUqSnp6Nu3bpo3rw5CyEyC7a2toiIiMAzzzyDpUuXIjMzE8C9z621D7BOSkqCTqfDCy+8gMDAQABAgwYNAABTp07F3Llz8cILLwC41xJ07tw5fPHFF4iMjDQspuvl5YWqVasWe59paWnw8/ODVquFWq3G0qVL8cwzzxj5yKwXiyEiCRISEvDZZ58hJiYGTz31FIYNG1aiL0YiU/Hx8cGkSZMMl+PPnj0bTk5OGDhwYPkM5rd1utdKY2q2xT+WRo0aoUOHDmjQoAHCw8PRqVMn9OrVCzqdDgkJCXj99dcLLYOj0+nKPA2Gq6srYmNjkZmZib1792L06NGoUaNGsbrZ6NFYDBFJkJ6ejuTkZMycORPNmzeXHYfokQrWOatevbphfqL3338fYWFhxt5RsburZFGr1YiKikJ0dDT27NmDRYsWYfz48fjxxx8BACtWrLjv57qsczipVCrDgq6NGzfG+fPnMWPGDBZDRsIB1EQmcu3aNcyfPx96vR716tXD2rVrWQiRRVEUBX369MHq1avh6+uL0aNHY/78+YZWI2uiKApatWqFyZMnIyYmBnZ2djhy5Aj8/Pxw+fJl1KpVq9CtYOB0wRih/Pz8Mu1fCAGtVlvm46B72DJEVM70ej2+//57fPnll6hSpQpu374NHx8fqFT8W4Qsk6+vL+bNm4ft27cjJSXF6sYQHT9+HHv37kWnTp3g4+OD48ePIzk5GXXq1MGkSZMwYsQIuLm5oUuXLtBqtThx4gRSU1MxevRo+Pj4wNHREbt27YK/vz8cHBwe2YU2Y8YMNGnSBDVr1kRubi5+/vlnfPXVV1i2bJmJjrjiYzFEVI6uXbuGmTNn4q+//kLv3r0xcOBA2Nvby45FVGaKoqBHjx6G+z/88AOuX7+ON998s8JPDOrm5oaDBw9i/vz5SE9PR2BgIObOnYsuXboAAJycnDB79myMHTsWzs7OaNCgAUaNGgUAsLGxwcKFCzFlyhRMmDABrVu3xoEDB4rcX1ZWFoYOHYrr16/D0dERoaGh+Oabb/Dyyy+X85FaD0VYY/tmCaSnp8Pd3R1paWlwc3OTHYcszI4dO7BhwwZ88MEHqFevnuw4ROVmx44dWLJkCSpVqoQJEyagTp06j3xNTk4Orly5guDgYDg4OJggJVU0RX2GSvL7m+30REaWmZmJnTt3AgC6du2KVatWsRCiCq9bt2748ssv4enpibfffhsbNmywyrFEZJlYDBEZ0blz5zBo0CAsW7YMqampUBSlxJOqEVkqX19fLFiwAL1798bJkydlx7EYLi4uD70dOnRIdjyrwDFDREYghMCGDRuwcuVKPPbYY1iwYAE8PDxkxyIyORsbG7z55pvIz8+Hoig4ffo0gHtz89CDFbVoq5+fn+mCWDEWQ0RGsGXLFnzxxRfo27cvBg4cCBsb/miRdSuYV2f79u3Yv38/BgwYgH79+vEqygcomD+I5OE3NlEZ5OTkwMHBAV27dkVwcLDxJ6AjsnDjx483TNR49uxZfPzxx3BxcZEdi6gQluhEpbRv3z706dMH8fHxsLe3ZyFE9AAqlQqRkZGYNWsWzp8/j0mTJsmORHQftgwRlZAQAqtWrcK6devQsWNH+Pr6yo5EZPaaNGmCZcuWGWZN1uv1khMR/T8WQ0QloNFoMH36dBw9ehRvvvkmXn75ZaubfZeotAoGA+fl5eHdd99Fu3btEBoaKjkVEbvJiEokLS0NV65cwYwZM9CnTx8WQkSloFarUb9+fXz33XdIS0tjKxFJx5YhomK4cOEC/P394evri6+++opXixGVgUqlwhtvvIHatWsjJycHN2/eRGBgYJlXdicqLbYMET3CsWPHMGLECHz99dcAwEKIyEhatGgBT09P5OXlISsrS3Yck4iPj4eiKEXOLVSU9evXQ1EUPP/880bNZe1YDBEVYffu3Rg/fjyaNGmCAQMGyI5DVOHY2trC39/fsHaUTqeTnMh8Xb16FWPGjEHr1q1lR6lwWAwRPcT69esxc+ZMdOnSBZMnT+Zq80TlpKB7LD09HZcvX8adjDvQ5GlMeivpOmobN25EgwYN4OjoCC8vL3Ts2NHQurV69WrUqVMHDg4OCA0NxdKlSw2vCw4OBgCEhYVBURS0bdu2WPvLz89HREQEJk+ejBo1apQoKz0a2/uJitC/f3+89tprHChNZALOzs6ALfD05qdNvu/jrxyHk61TsbZNSkpC3759MWvWLPTs2RMZGRk4dOgQhBBYsWIFJk6ciMWLFyMsLAwxMTEYPHgwnJ2dERkZid9++w3NmjXDL7/8gnr16hV77cIpU6agcuXKeP3117leWTlgMUT0LzqdDidPnkTz5s3Rp08f2XGIrIparUa1atVkx3ikpKQk6HQ6vPDCCwgMDAQANGjQAAAwdepUzJ07Fy+88AKAey1B586dwxdffIHIyEhUrlwZAODl5YWqVasWa39HjhzBqlWrSj3OiB6NxRDR/+h0OkyZMgVHjx7FunXr4OPjIzsSkdVxtnPGsb7HcOvWLeTl5cHPz88kLbOONo7F3rZRo0bo0KEDGjRogPDwcHTq1Am9evWCTqdDQkICXn/9dQwePNiwvU6ng7u7e6lyZWRkoF+/flixYgW8vb1L9R70aCyGiHBvErhJkybht99+w5QpU1gIEUmiKAqc7ZwR5BcEIQRUKhXy8/PN6rJ7tVqNqKgoREdHY8+ePVi0aBHGjx+PH3/8EQCwYsUKNG/e/L7XlMbff/+N+Ph4PPfcc4bHCuZlsrGxQVxcHGrWrFnKI6ECLIbI6uXl5WHixIk4ceIEpk2bdt+XGBGZnqIoUBQFOp0OV69ehaenJzw8PGTHMlAUBa1atUKrVq0wYcIEBAYG4siRI/Dz88Ply5cRERHxwNcVjBHKz88v1n5CQ0Nx5syZQo999NFHyMjIwIIFCxAQEFC2AyEALIaIoNVqkZGRgenTp6Np06ay4xDRv6jVari6uuLWrVtQFAWVKlWSHQnHjx/H3r170alTJ/j4+OD48eNITk5GnTp1MGnSJIwYMQJubm7o0qULtFotTpw4gdTUVIwePRo+Pj5wdHTErl274O/vDwcHhyK70BwcHFC/fv1CjxWcg/8+TqXHYoislk6nQ1paGry8vLBw4UJeMUZkhhRFMQw6/ueffwBAekHk5uaGgwcPYv78+UhPT0dgYCDmzp2LLl26AACcnJwwe/ZsjB07Fs7OzmjQoAFGjRoF4F7X1sKFCzFlyhRMmDABrVu3xoEDB+QdDAEAFFHSyRWsTHp6Otzd3ZGWlmaYFIwsn16vx9SpU3Hp0iWsXr2as0oTSZCTk4MrV64gODgYDg4ORW4rhMCtW7eQlpaG4OBg2NramiglmbOiPkMl+f3NSRfJ6gghsHDhQvz666944403WAgRWQBFUeDj44PAwEAWQmR0LIbI6nzzzTfYtm0b3n33XU5rT2RBFEWBvb09hBD4559/kJ2dLTuSUbi4uDz0xgkWTYN/EpNVSUpKwldffYWBAweia9eusuMQUSkIIaDVanH9+nVUr17d4pfKKWoyRT8/P9MFsWIshsiq+Pr6YtWqVbwclciCqVQq+Pn5ISEhwVAQWXLXWa1atWRHsHrsJiOr8Mcff2DJkiXQ6/WoXr06rxwjsnBqtRr+/v4AgOvXrxd73h6iB2ExRBXe1atXMX78ePz999/8wiSqQGxsbBAQEABnZ2eoVPx1RqXHTw9VaBkZGfjwww9RuXJlTJs2zaKb0onofnZ2dvDx8YGiKMjNzQVni6HSYDFEFVZ+fj4mT56MzMxMTJ8+HU5OTrIjEVE5ycvLQ3x8PFJTU2VHIQvEAdRUYen1elStWhURERHw9fWVHYeIypGtrS08PDyQnJwMe3t7ODs7y45EFoTFEFVIGo0GTk5OGDNmjOwoRGQi3t7e0Gq1uHHjBgIDAw2LohI9CrvJqML5888/8fLLL+Ovv/6SHYWITEhRFPj6+sLGxsawjpm5iY+Ph6IoRc4t9CB3797FsGHD4OvrCwcHB9SpUwc///yz4XmdToePPvoIwcHBcHR0RI0aNTBlyhTo9XojH0HFxJYhqlBu3bqFjz/+GDVq1ODcHURWSK1Ww8/Pr0JNn5Gbm4tnnnkGPj4+2LhxI/z9/ZGQkABXV1fDNp9++ik+//xzrF27FvXq1cOJEyfw2muvwd3dHSNHjpSY3jKwGKIKQ6fTYcqUKbCzs8PkyZO55hiRBRJCQJRxmY2Cn/zc7Gxk5+TA1cXlka9RHB1LVEBt3LgRkydPxqVLl+Dk5ISwsDBs27YNzs7OWL16NWbNmoUrV64gKCgII0aMwNChQwEAwcHBAICwsDAAwNNPP/3IVeu//PJL3LlzB9HR0YYrYgMDAwttc/ToUfTo0cMws35QUBC+++47nDhxotjHZM0s7reFVqtF8+bNcfr0acTExKBx48YP3C4vLw8fffQRfv75Z1y+fBnu7u7o2LEjZs6ciWrVqpk2NJnEN998g/Pnz2PhwoWoVKmS7DhEVAoiOxtxjz9h8v0+duoklGJecZqUlIS+ffti1qxZ6NmzJzIyMnDo0CEIIbBixQpMnDgRixcvRlhYGGJiYjB48GA4OzsjMjISv/32G5o1a4ZffvkF9erVK9a4pu3bt6NFixYYNmwYtm3bhsqVK+OVV17B+++/D7VaDQB46qmn8Pnnn+PChQsICQnB6dOncfjwYcyfP78sp8VqWFwxNHbsWFSrVg2nT58ucjuNRoNTp07h448/RqNGjZCamopRo0ahe/furJQrqM6dO8Pf3x/16tWTHYWIKrCkpCTodDq88MILhhaaBg0aAACmTp2KuXPn4oUXXgBwryXo3Llz+OKLLxAZGYnKlSsDALy8vFC1atVi7e/y5cvYt28fIiIi8PPPP+PixYsYNmwYdDodJkyYAAB4//33kZaWhtDQUKjVauTn52P69Ono27evsQ+/QrKoYmjnzp3Ys2cPNm3ahJ07dxa5rbu7O6Kiogo9tmjRIjRr1gzXrl1D9erVyzMqmdDdu3dha2uLqlWrFvvLhYjMk+LoiMdOnTTa++Xl5eFaQgIc7O1RrVq1h3aFKY6OxX7PRo0aoUOHDmjQoAHCw8PRqVMn9OrVCzqdDgkJCXj99dcxePBgw/Y6nQ7u7u6lPga9Xg8fHx8sX74carUaTzzxBG7cuIHZs2cbiqENGzbgm2++wbfffot69eohNjYWo0aNQrVq1RAZGVnqfVsLiymG/vnnHwwePBhbt24t9eR5aWlpUBSlyC4UrVYLrVZruJ+enl6qfZFp6PV6TJkyBXl5eVi4cGGFGjRJZI0URSl2d1Vx2APwVauRmJiIPLUaDg4OZX5PtVqNqKgoREdHY8+ePVi0aBHGjx+PH3/8EQCwYsUKNG/e/L7XlJavry9sbW0LvUedOnVw8+ZN5Obmws7ODu+99x4++OAD9OnTB8C9lqqrV69ixowZLIaKwSIurRdCYMCAARgyZAiaNGlSqvfIycnBBx98gFdeeQVubm4P3W7GjBlwd3c33Li6uXlbt24dYmNjMXDgQBZCRPRALi4uqFGjhlEKoQKKoqBVq1aYPHkyYmJiYGdnhyNHjsDPzw+XL19GrVq1Ct0KBk4XjBEqyTqJrVq1wqVLlwpdJn/hwgX4+voa3k+j0dy3Pptareal9cUktRiaNGnSvb8CiridOHECixYtQnp6OsaNG1eq/eTl5aFPnz7Q6/VYunRpkduOGzcOaWlphltCQkKp9knl79y5c1i9ejX69+9vuDKDiOhBbG1tIYTAnTt3ylwgHD9+HJ988glOnDiBa9euYfPmzUhOTkadOnUwadIkzJgxAwsWLMCFCxdw5swZrF69GvPmzQMA+Pj4wNHREbt27cI///yDtLS0R+7vrbfeQkpKCkaOHIkLFy7gp59+wieffIJhw4YZtnnuuecwffp0/PTTT4iPj8eWLVswb9489OzZs0zHajWERMnJyeL8+fNF3rKzs0WPHj2ESqUSarXacAMg1Gq1ePXVV4vcR25urnj++edFw4YNxe3bt0ucMS0tTQAQaWlppT1MKgf5+fkiMjJSDBkyROh0OtlxiKgUsrOzxblz50R2drZJ9qfVakVcXJy4efNmmd7n3LlzIjw8XFSuXFnY29uLkJAQsWjRIsPz69atE40bNxZ2dnbCw8NDtGnTRmzevNnw/IoVK0RAQIBQqVTi6aefLtY+o6OjRfPmzYW9vb2oUaOGmD59eqHvvvT0dDFy5EhRvXp14eDgIGrUqCHGjx8vtFptmY7V3BX1GSrJ729FCPNf4vfatWuFxu7cuHED4eHh2LhxI5o3bw5/f/8Hvi4vLw8vvfQSLl68iP379xtG8ZdEeno63N3dkZaWVmT3GpleTEwMPD0975tvg4gsQ05ODq5cuYLg4GCjdmEVJTU1Fbdu3UJAQAAXb64AivoMleT3t0UMoP7vlV8u/5tAq2bNmoUKodDQUMyYMQM9e/aETqdDr169cOrUKezYsQP5+fm4efMmAMDT05Nr1liwlJQUeHp6smuMiEqsUqVKyMjIwM2bNxEUFHTfOBuyThXqUxAXF2fof71+/Tq2b9+O69evo3HjxvD19TXcoqOjJSel0tJqtXjnnXewZMkS2VGIyAIpioKqVatCp9OZzdXCLi4uD70dOnRIdjyrYBEtQ/8VFBSEB/Xu/fuxh21Dlm316tW4efMmnnvuOdlRiMhC2dnZISgoyLC0hWxFLdrq5+dnuiBWzCKLIbJOZ8+exffff4833niD44SIqEwKhkpkZmbCyclJancZF5WWr0J1k1HFpdPpMHfuXDz22GPo3bu37DhEVAHodDrcuHEDKSkpsqOQZGwZIougUqnw3HPPoX79+mWayZWIqICNjQ28vLxw+/ZtuLm5wd7eXnYkkoQtQ2T2hBBQqVTo2bMnateuLTsOEVUgHh4esLW1xa1btzjO1IqxGCKz9+mnn2LlypWyYxBRBaRSqeDj4wONRoPMzEzZcUgSFkNk1v744w/s3r2bV1QQUblxcXGBr68vnJ2dZUchSVgMkdnKz8/HggULUKdOHXTu3Fl2HCKqwNzc3KBSqUq0gKo5WbNmDSpVqiQ7hsViMURma+vWrbhy5QpGjRrFFemJqNxpNBpcvnwZWq1WdpQKw1KKNBZDZLb++ecfdO/eHSEhIbKjEJEVcHBwgFqtxu3bt2VHKSQvL092BOny8/Oh1+vL7f1ZDJHZGjp0KEaOHCk7BhFZCZVKBW9vb2RmZiI7O/uh223cuBENGjSAo6MjvLy80LFjR2RlZRmeX716NerUqQMHBweEhoZi6dKlhV7//vvvIyQkBE5OTqhRowY+/vjjQgXPpEmT0LhxY3z55ZeoUaMG7O3tIYTA3bt38cYbb6BKlSpwcHBA/fr1sWPHjkLvvXv3btSpUwcuLi7o3LkzkpKSijzms2fPomvXrnBzc4Orqytat26Nv//+u1jHEh8fD0VRsHnzZrRr1w5OTk5o1KgRjh49CgA4cOAAXnvtNaSlpUFRFCiKgkmTJgEAcnNzMXbsWPj5+cHZ2RnNmzfHgQMHDO9d0KK0Y8cO1K1bF/b29rh69WqRx1IWnGeIzE5KSgqOHj2Kzp07w8aGH1EieoScHKBLl3v/3rkT+M/q5SXh6uqKO3fuIDk5GQEBAfd10SclJaFv376YNWsWevbsiYyMDBw6dMhwWf6KFSswceJELF68GGFhYYiJicHgwYPh7OyMyMhIwz7WrFmDatWq4cyZMxg8eDBcXV0xduxYw34uXbqE77//Hps2bYJarYZer0eXLl2QkZGBb775BjVr1sS5c+cKzbum0WgwZ84cfP3111CpVOjXrx/GjBmDdevWPfBYExMT0aZNG7Rt2xb79u2Dm5sbjhw5Ap1OV+xjAYDx48djzpw5qF27NsaPH4++ffvi0qVLaNmyJebPn48JEyYgLi4OwP8vtP7aa68hPj4e69evR7Vq1bBlyxZ07twZZ86cMUyhotFoMGPGDKxcuRJeXl7w8fEp9f/XRxJUpLS0NAFApKWlyY5iNebOnSuee+45kZGRITsKEZWj7Oxsce7cOZGdnV2WNxEiNVWItm3v3VJT7z1WBhkZGeL69esiPz//vudOnjwpAIj4+PgHvjYgIEB8++23hR6bOnWqaNGixUP3N2vWLPHEE08Y7k+cOFHY2tqKW7duGR7bvXu3UKlUIi4u7oHvsXr1agFAXLp0yfDYkiVLRJUqVR6633Hjxong4GCRm5tbqmO5cuWKACBWrlxpeP7s2bMCgDh//rwhl7u7e6H3uHTpklAURSQmJhZ6vEOHDmLcuHGFjic2Nvah+YUo+jNUkt/f/LObzMr169fx008/4c033zT8BUFE9FAFLUIFeva899/9+0v9lgUrxj9Io0aN0KFDBzRo0ADh4eHo1KkTevXqBQ8PDyQnJyMhIQGvv/46Bg8ebHiNTqeDu7u74f7GjRsxf/58XLp0CZmZmdDpdHBzcyu0n8DAQFSuXNlwPzY2Fv7+/kWOoXRyckLNmjUN9319fXHr1q2Hbh8bG4vWrVs/cMHa4h4LADRs2LDQPgHg1q1bCA0NfeB+T506BSHEfcei1Wrh5eVluG9nZ1fovcsTiyEyK6tWrYKXlxeef/552VGIyMqlp6dDpVIVKozUajWioqIQHR2NPXv2YNGiRRg/fjyOHz8OJycnAPe6l5o3b17ovQq6s44dO4Y+ffpg8uTJCA8Ph7u7O9avX4+5c+cW2v6/cx45Ojo+Mu9/ixpFUYqcVbuo9ywYrFzUsTxovwXdikUNdtbr9VCr1Th58uR97/Xvc+3o6GiyK4lZDJHZ+Pvvv3HgwAGMHTvWsKI0EVGRdu68N2aooEVoy5YyjRn6t4yMDGi1Wjg7Oxf6pawoClq1aoVWrVphwoQJCAwMxJYtWzB69Gj4+fnh8uXLiIiIeOB7HjlyBIGBgRg/frzhseIMDG7YsCGuX7+OCxcuGO0K24YNG2Lt2rXIy8u7r5CqUqXKI4+lOOzs7O6buyksLAz5+fm4desWWrduXer3NiYWQ2Q2goODMXnyZLRq1Up2FCKyFP8tfBwcjFYMeXt7Iz4+HmlpaYa5co4fP469e/eiU6dO8PHxwfHjx5GcnIw6deoAuHcl2IgRI+Dm5oYuXbpAq9XixIkTSE1NxejRo1GrVi1cu3YN69evR9OmTfHTTz9hy5Ytj8zy9NNPo02bNnjxxRcxb9481KpVC3/99RcURSn1pLTDhw/HokWL0KdPH4wbNw7u7u44duwYmjVrhscee+yRx1IcQUFByMzMxN69e9GoUSM4OTkhJCQEERERePXVVzF37lyEhYXh9u3b2LdvHxo0aIBnn322VMdTFry0nsyCXq+HSqVCmzZtuCo9EZWMg8O9MUL79xutEAIAe3t7uLi44M6dO4buJjc3Nxw8eBDPPvssQkJC8NFHH2Hu3Lno8r+xS4MGDcLKlSuxZs0aNGjQAE8//TTWrFmD4OBgAECPHj3wzjvvYPjw4WjcuDGio6Px8ccfFyvPpk2b0LRpU/Tt2xd169bF2LFjyzRjtpeXF/bt24fMzEw8/fTTeOKJJ7BixQpDK9GjjqU4WrZsiSFDhuDll19G5cqVMWvWLAD3Ltl/9dVX8e677+Kxxx5D9+7dcfz4cQQEBJT6eMpCEUV1KBLS09Ph7u6OtLS0+wa4kfF88skncHV1xdtvvy07ChGZSE5ODq5cuYLg4GA4GLGIMaacnBxcvXoV1apVg6urq+w49B9FfYZK8vubLUMkXVJSEn755RdpfxEQET2Mg4ODYWJAqrg4ZoikW79+Pdzd3Q3NzERE5qTgCichBNdJrKDYMkRS3blzBzt37kSvXr1gb28vOw4R0QOlpKTg+vXrsmNQOWExRFKdPXsWzs7OnFeIiMyavb09NBoNNBqN7ChUDthNRlK1bt0azZo1Y6sQkRWzhOt4nJ2dYWdnh9TUVMPkiiSfsT47bBkiaa5duwatVstCiMhKFVzCbQmtLYqiwMPDA5mZmYVWmCe5Cj47D1pSpCTYMkRSCCEwadIk1KhRAx999JHsOEQkgVqtRqVKlQzrZzk5OZn1AOWCmfHT0tK4dqJkQghoNBrcunULlSpVKvP8dCyGSIozZ87gypUrGDZsmOwoRCRR1apVAaDIBUXNiRACycnJSE5Olh2FAFSqVMnwGSoLFkMkxbZt2+Dv74/HH39cdhQikkhRFPj6+sLHx8diup90Oh3S0tIKrbBOpmdra2u0FQtYDJHJ3blzBwcPHsSQIUPMukmciExHrVZbzFI8EyZMQGpqKhYtWiQ7ChkJB1CTyaWlpaFhw4YIDw+XHYWIqMQ6dOiAP//8E5cvX5YdhYyExRCZXHBwMObOncsBiERkkVq1agUvLy9s27ZNdhQyEhZDZFKXL19GTEyMRcwrQkT0IDY2NujSpQv27t2L3Nxc2XHICFgMkUlt2LAB8+bNkx2DiKhMnnnmGfj5+eH27duyo5ARcAA1mYxWq8WhQ4fQp08fDpwmIotWvXp1fPHFF7JjkJGwZYhM5siRI8jOzkbHjh1lRyEiKjMhBP766y9kZmbKjkJlxGKITCYqKgp169ZFtWrVZEchIiqzu3fvYujQoThw4IDsKFRG7CYjk6lfvz58fX1lxygTIQSy8/JlxyCqEBxt1RbdZe7h4YEnnngCUVFR6Natm+w4VAYshshkIiIiZEcoEyEEen1+FCevpsqOQlQhNAn0wA9DWlh0QfTMM89gxowZ+Oeff1ClShXZcaiU2E1GJrFz504kJibKjlEm2Xn5LISIjOjE1VSLb2lt3bo17O3tsX//ftlRqAzYMkTl7u7du5g9ezbGjBkDPz8/2XGM4sRHHeFkZxlLBxCZG01uPppM+0V2DKNwdHTEs88+CwcHB9lRqAxYDFG5O3bsGACgRYsWkpMYj5OdGk52/PEhImDEiBGyI1AZsZuMyl10dDTq1KkDDw8P2VGIiMrFzZs3cfXqVdkxqJRYDFG5ys3Nxe+//46WLVvKjkJEVG6mTZuGVatWyY5BpcRiiMpVdnY2wsPD0bp1a9lRiIjKTYsWLfD7779zrTILxWKIypW7uztGjRqF6tWry45CRFRuWrVqhZycHMTExMiOQqXAYojKjRACO3fuRFpamuwoRETlKjAwEL6+voiOjpYdhUqBxRCVm/j4eMyaNQsXL16UHYWIqFwpioLw8HDY2dnJjkKlwGuDqdzExsbCxsYGDRo0kB2FiKjcRUZGyo5ApcSWISo3sbGxqFOnDuzt7WVHISIyiczMTCQnJ8uOQSXEYojKhRACsbGxCAsLkx2FiMhk3nnnHXz55ZeyY1AJsRiicqHRaPD444+jadOmsqMQEZlMo0aNEBsbKzsGlRCLISoXzs7OmDhxIurXry87ChGRyYSFheHmzZu4efOm7ChUAiyGqFzExcUhKytLdgwiIpNq2LAhFEVh65CFYTFERieEwHvvvYfvv/9edhQiIpNydXVF3bp1kZKSIjsKlQAvrSejS0xMREZGBi+pJyKrtGjRIiiKIjsGlQBbhsjo4uLiAAAhISGSkxARmZ6iKNDr9dDr9bKjUDGxGCKji4uLQ9WqVeHm5iY7ChGRySUlJaFr1644c+aM7ChUTCyGyOjy8/PRsGFD2TGIiKTw8fGBEAIXLlyQHYWKiWOGyOjefvtt2RGIiKRRq9WoVauWYcgAmT+2DJFR6XQ65Ofny45BRCRVSEgIiyELwmKIjOrXX39F165dodFoZEchIpImJCQEiYmJ/C60EBZXDGm1WjRu3LhYk1pNmjQJoaGhcHZ2hoeHBzp27Ijjx4+bJqiVunDhAjw8PODk5CQ7ChGRNG3atMHmzZv5XWghLK4YGjt2LKpVq1asbUNCQrB48WKcOXMGhw8fRlBQEDp16sQVhcvR1atXUaNGDdkxiIikcnJyQqVKlWTHoGKyqGJo586d2LNnD+bMmVOs7V955RV07NgRNWrUQL169TBv3jykp6fjjz/+KOek1ishIQEBAQGyYxARSbd48WJs2LBBdgwqBosphv755x8MHjwYX3/9damaHXNzc7F8+XK4u7ujUaNGD91Oq9UiPT290I2KR6fTISkpCf7+/rKjEBFJd+PGDa5RZiEsohgSQmDAgAEYMmQImjRpUqLX7tixAy4uLnBwcMBnn32GqKgoeHt7P3T7GTNmwN3d3XBjK0fx2djYYOvWrWjfvr3sKERE0vn7++P69euyY1AxSC2GJk2aBEVRirydOHECixYtQnp6OsaNG1fifbRr1w6xsbGIjo5G586d8dJLL+HWrVsP3X7cuHFIS0sz3BISEspyiFbHzc2NAwaJiAAEBATgxo0b0Ol0sqPQI0iddHH48OHo06dPkdsEBQVh2rRpOHbsGOzt7Qs916RJE0RERGDt2rUPfb2zszNq1aqFWrVq4cknn0Tt2rWxatWqhxZW9vb29+2Himf37t04depUqYpWIqKKJiAgAHq9HklJSexlMHNSiyFvb+8iu6wKLFy4ENOmTTPcv3HjBsLDw7FhwwY0b968RPsUQkCr1ZY4Kz3amTNnEB8fLzsGEZFZqFmzJj744ANeVWYBLGI5jurVqxe67+LiAuDeB+3fg3VDQ0MxY8YM9OzZE1lZWZg+fTq6d+8OX19fpKSkYOnSpbh+/Tp69+5t0vzWIiEhgYOniYj+x9XVFeHh4bJjUDFYRDFUXHFxcUhLSwNwb22Yv/76C2vXrsXt27fh5eWFpk2b4tChQ6hXr57kpBVTcnIyzy0R0b/8+uuvcHBwKHEvBpmWRRZDQUFBEELc9/i/H3NwcMDmzZtNGcuqCSFw+/btYnV7EhFZi+3bt8PNzY3FkJmzyGKIzI8QAu+++y5CQ0NlRyEiMhve3t64ceOG7Bj0CCyGyChUKhX7xomI/sPT0xNnzpyRHYMewSImXSTzd+PGDezYsYNX6hER/Yu3tzdSUlIeOLSDzAeLITKKP//8E3PnzpUdg4jIrNSoUQMtW7bkxItmjt1kZBQpKSlwcXHhhJVERP8SFhaGsLAw2THoEdgyREZRMH0BERH9v4IrbTUajewoVAQWQ2QUmZmZcHNzkx2DiMisZGZmonfv3vj9999lR6EisJuMjKJ69eqcY4iI6D8cHR0BgC1DZo7FEBlFRESE7AhERGbHxsYGtra2yM7Olh2FisBuMjKKjIwM5OXlyY5BRGR2nJycWAyZORZDZBQjRozAF198ITsGEZHZcXJyYjeZmStVMdSrVy/MnDnzvsdnz57NFeGtlEajgZOTk+wYRERmZ82aNRg0aJDsGFSEUhVDv/76K7p27Xrf4507d8bBgwfLHIosT3Z2tmGgIBER/T87OzsoiiI7BhWhVMVQZmYm7Ozs7nvc1tYW6enpZQ5Flic7O5stQ0RED7B8+XKsWLFCdgwqQqmKofr162PDhg33Pb5+/XrUrVu3zKHIsgghoNPpYGtrKzsKEZHZuXbtGi5fviw7BhWhVJfWf/zxx3jxxRfx999/o3379gCAvXv34rvvvsMPP/xg1IBkGbZv386lOMg85OQAXbrc+/fOnYCDg9w8ZPVUKhXXJjNzpSqGunfvjq1bt+KTTz7Bxo0b4ejoiIYNG+KXX37B008/beyMZOYURYGrq6vsGET3CqGcnML3ARZEJJVKpYJer5cdg4pQ6kkXu3bt+sBB1GR9dDodPvroI7z88stckJDkKmgRKtCz573/7t9v+ixE/6MoCoQQsmNQEUo9z9Ddu3excuVKfPjhh7hz5w4A4NSpU0hMTDRaOLIM+fn5OH78OG7fvi07ChGR2Xn++ec57YyZK1XL0B9//IGOHTvC3d0d8fHxGDRoEDw9PbFlyxZcvXoVX331lbFzkhlTqe7V1PzLh6TbufNe11hBi9CWLewiI+kaNWokOwI9QqlahkaPHo0BAwbg4sWLcPjXF02XLl04z5AVYjFEZsPBoXDx89/7RBL8/vvvOH78uOwYVIRStQz9/vvvD1x6wc/PDzdv3ixzKLIsBcUQBwiSWXBw4BghMivbt29HXl4emjdvLjsKPUSpWoYcHBweOLliXFwcKleuXOZQZHmGDh3KOaaIiB4gLy+P87CZuVIVQz169MCUKVMMq5QrioJr167hgw8+wIsvvmjUgGT+FEVB7969ERgYKDsKEZHZ4Qz95q9UxdCcOXOQnJwMHx8fZGdn4+mnn0atWrXg6uqK6dOnGzsjWYCjR4/i4sWLsmMQEZkdjUbDtRvNXKnGDLm5ueHw4cPYv38/Tp48Cb1ej8cffxwdO3Y0dj6yEMuWLcOTTz6J2rVry45CRGRWateujeDgYNkxqAglLob0ej3WrFmDzZs3Iz4+HoqiIDg4GFWrVoUQgivzWiknJydkZ2fLjkFEZHbGjh0rOwI9Qom6yYQQ6N69OwYNGoTExEQ0aNAA9erVw9WrVzFgwAD0LJjbg6yOk5MTNBqN7BhERGYnKyuLV9uauRIVQ2vWrMHBgwexd+9exMTE4LvvvsP69etx+vRp/PLLL9i3bx8nXLRSjo6OLIaIiP5Dr9ejW7du2LVrl+woVIQSFUPfffcdPvzwQ7Rr1+6+59q3b48PPvgA69atM1o4shzBwcHw9fWVHYOIyKzk/G+xYA6gNm8lGjP0xx9/YNasWQ99vkuXLli4cGGZQ5HlGTRokOwIRERmJyMjAwDg7OwsOQkVpUQtQ3fu3EGVKlUe+nyVKlWQmppa5lBkmQrmnSIiontSUlIAAF5eXpKTUFFKVAzl5+fDxubhjUlqtRo6na7Mocjy7NmzB+Hh4fz/T0T0LyyGLEOJusmEEBgwYADs7e0f+LxWqzVKKLI87u7uEELgzp078PHxkR2HiMgstGrVCps2bYK7u7vsKFSEEhVDkZGRj9zm1VdfLXUYslwFf/WwGCIi+n8qlQqenp6yY9AjlKgYWr16dXnlIAvn7e0NALh9+7bkJERE5mPdunXIysrCG2+8ITsKFaFUy3EQ/Ze7uzvUarWhf5yIiIAzZ85wxXoLwGKIjEJRFHzzzTdsDiYi+pfbt2+jfv36smPQI7AYIqOpWrWq7AhERGbl1q1bhmEEZL5KdGk9UVF+/vlnLFiwQHYMIiKzkJ6ejoyMDPj7+8uOQo/AYoiM5vbt29i/f7/sGEREZsHGxgZjxoxBvXr1ZEehR2A3GRlNQEAA0tLSkJGRAVdXV9lxiIikcnJyQteuXWXHoGJgyxAZTUFT8PXr1yUnISKS78SJEzh06JDsGFQMLIbIaAqKoYSEBMlJiIjk27FjB7Zs2SI7BhUDiyEyGkdHR7zzzjsIDQ2VHYWISLqEhARUr15ddgwqBhZDZFTdu3fnDz8RWT0hBBITE3klmYVgMURGdeXKFWzbtk12DCIiqW7evAmtVss/Di0EiyEyqnPnzmHBggXIycmRHYWISJrc3Fy0bNkSISEhsqNQMbAYIqMKCQmBEAKXLl2SHYWISJrAwEBMnz4dlSpVkh2FioHFEBlVcHAwbGxscOHCBdlRiIik+fvvv6HRaGTHoGJiMURGZWNjg5o1ayIuLk52FCIiKYQQeOedd7Bx40bZUaiYOAM1GV2HDh2Qn58vOwZRuRFCQGRny45hsfS5OtjrtPf+rdFAr6tYv4pu3rwJbVoaHgsKgp6tQ4+kODpCURS5GYQQQmoCM5eeng53d3ekpaXBzc1NdhySSJOrQ90JuwEA56aEw8muYn2BU/EIIXD1lQhkx8TIjkJUITg+/jgC131j9IKoJL+/2U1GRieEwOXLl5Gamio7CpHRiexsFkJERpR96pT0llb+aUtGl5+fj6FDh+K1117Dyy+/LDsOUbmpfeQwVI6OsmNYHE2uDk9M+wUAcPKjjhWulXXp0qW4m5aGD8eNkx3FrOmzs3Gx1VOyYwBgMUTlwMbGBvXq1cPp06dZDFGFpnJ0hMrJSXYMi6Oy0UFrY3/v305OUFWwYmj4mDEQQkgfB0PFx24yKhdhYWE4ffo0B1ITkVXRarUshCwQiyEqF40bN4ZGo+Hki0RkVb799lu8+uqr4LVJloXFEJWL0NBQVK9eHXfv3pUdhYjIZGJjYxEcHMyWIQtjccWQVqtF48aNoSgKYmNji/26N998E4qiYP78+eWWjf6fjY0N1q5di+bNm8uOQkRkElqtFufOnUPjxo1lR6ESsrhiaOzYsahWrVqJXrN161YcP368xK+jsrt79y7HDRGRVTh79ix0Oh3CwsJkR6ESsqhiaOfOndizZw/mzJlT7NckJiZi+PDhWLduHWxtbcsxHf3XxYsX0bNnT1y8eFF2FCKicnfhwgW4u7sjKChIdhQqIYu5nvGff/7B4MGDsXXrVjgV81JWvV6P/v3747333kO9evWK9RqtVgutVmu4n56eXqq8dG/RVmdnZxw/fhyhoaGy4xARlas+ffqga9euHC9kgSyiZUgIgQEDBmDIkCFo0qRJsV/36aefwsbGBiNGjCj2a2bMmAF3d3fDLSAgoDSRCffGDTVv3hxHjhyRHYWIqFzp9XoAgKurq+QkVBpSi6FJkyZBUZQibydOnMCiRYuQnp6OcSWYzfPkyZNYsGAB1qxZU6Iqfdy4cUhLSzPcEhISSnNo9D8tW7bExYsXkZycLDsKEVG52bFjBwYMGACdTic7CpWC1G6y4cOHo0+fPkVuExQUhGnTpuHYsWOwt7cv9FyTJk0QERGBtWvX3ve6Q4cO4datW6hevbrhsfz8fLz77ruYP38+4uPjH7g/e3v7+/ZDpdesWTO4uLjgypUrqFy5suw4RETlIjo6Gp6enrCxsZjRJ/QvUv+veXt7w9vb+5HbLVy4ENOmTTPcv3HjBsLDw7Fhw4aHXrrdv39/dOzYsdBj4eHh6N+/P1577bWyBadic3V1xdatW6FWq2VHISIqF9nZ2Th16hTeeOMN2VGolCyihP136w4AuLi4AABq1qwJf39/w+OhoaGYMWMGevbsCS8vL3h5eRV6na2tLapWrYrHHnus/EOTgVqtRk5ODtRqNa/oI6IK58SJE8jLy0PLli1lR6FSsogB1MUVFxeHtLQ02THoP1JTU9GjRw8cO3ZMdhQiIqM7efIkgoKCOJedBbOIlqH/CgoKeuC6L49aC+Zh44SofHl4eMDX1xeHDx9G69atZccptX9/vDS5nEjSWulz/3+ArCZXB5UNB8yWVEX7+RkxYgRSUlJkx6AysMhiiCxPu3bt8P3330Or1VrsAPXsvP//Am8y7ReJSUgme50WW//37yem/QKtjWV+nsk49Ho9VCoVLxCxcBWqm4zMV8eOHaHRaBAdHS07ChGZiSaBHnC0teyLK2bOnFmiVRHIPLFliEzCz88P9erVw5UrV9CuXTvZcUrFy9kOJz66d4Wio60anGTWOuk1GiTsGA8AOPlRR6iKOSM+3e/ez5Hl/iBlZ2fj4MGD6N+/v+woVEYshshk5s+fb9FzcCiKAm8XdolYO73u/z/DTnY2UNlZ7meayubw4cPQarXo0KGD7ChURuwmI5OxsbGBXq/nQEMiqhCioqLQsGFDVK1aVXYUKiMWQ2RSM2fOxMSJE2XHICIqk+zsbJw9exbPPPOM7ChkBCyGyKSefPJJnD17Fjdu3JAdhYio1BwdHbFx40YWQxUEiyEyqVatWsHJyQk///yz7ChERKUihEBWVhYcHR0tdqoQKozFEJmUvb09OnfujJ9++gl5eXmy4xARldiZM2fw4osv4tq1a7KjkJHwMgiZhADyNLJTmFyPLh3xx8ljuHX9Cvz8/GTHoYrC1gkPm+9ACIFsXbZRdqPP+//30eRlQ8Wa3ups2r4JnlU84VXVCxor/A53tHG06CkRHoTFkCxCAF+GAwnHZScxueoAVgQBWLtDchKqUAKeBAbuuq8gEkLg1Z2vIjY51ii7sc8V+Pp//277/dPQ2lWsXwpUDAH3bk9+96TsJFKE+YRhbee1FaogYjeZLHkaqyyEiMpNwrEHtrRm67KNVggRERBzK8ZoLa3mgi1D5mDMJcDOumax1ev16N//VTzZ4km8PXy47DhkyXI1wJxaxdr0wEsH4GjjWKbd6TXZSJj71P/e71eonMr2fmRZPvvsM6hUKowcOVJ2FJPL1mWj7fdtZccoFyyGzIGdE2DnLDuFSakAPNO1BzZs2IDXh7wNJy5pQCbgaOMIJ9uyfdb0tv//bydbR6jK+H5kWcaPHW9YnJUqDv7fJGm6deuG3Nxc7Ny5U3YUIqJH+uOPPyCEYCFUAfH/KEnj7e2NDh064Pvvv4dOp5Mdh4joof766y+MHDkSR48elR2FygG7yUiqV155BS4uLtBqtRa9iCsRVWzffvst/P398eST1nkFWUXHliGSKigoCCNGjICzs3WNmSIiy3H16lUcOnQIffr0YRdZBcX/qySdEAI//PADfvvtN9lRiIju891338HLywudOnWSHYXKCfslSDpFURAdHY29e/eiadOmFWoiLyKyfHXq1EHjxo1ha2v76I3JIrFliMxCREQE4uLicOrUKdlRiIgK6dGjBzp37iw7BpUjFkNkFp544gnUrl0b33zzjewoREQAgNTUVCxYsAB3796VHYXKGYshMguKoiAyMhKxsbH4888/ZcchIsI333yDqKgoqNVq2VGonLEYIrPRsmVLzJ07F/Xq1ZMdhYisXFJSErZv346+ffvC1dVVdhwqZyyGyGwoioLHH38ciqIgMzNTdhwismKrV6+Gu7s7evXqJTsKmQCLITI7X331Fd566y3OSk1EUty+fRv79u3Dq6++Cnt7e9lxyARYDJHZadWqFRITE7Fr1y7ZUYjICnl7e2PVqlV49tlnZUchE2ExRGanZs2a6NChA9asWQOtVis7DhFZkZSUFOTn5yMwMJBLBFkRFkNklgYOHIi0tDRs3LhRdhQishJCCEycOBHTpk2THYVMjMUQmSVfX1+89NJLsmMQkRWJiorC2bNn0b17d9lRyMTYBkhma/DgwbIjEJGVyMrKwueff4527dohLCxMdhwyMbYMkVnT6XRYs2YNYmJiZEchogps9erVyM7OxltvvSU7CknAliEya2q1GqdOncKBAwewcuVKDmgkonJRt25dBAUFoXLlyrKjkARsGSKzpigKRo4ciWvXrmHTpk2y4xBRBdW+fXt069ZNdgyShMUQmb2aNWuiZ8+eWLt2LVJSUmTHIaIK5JdffsHkyZM5yauVYzFEFuG1116Dvb099u/fLzsKEVUQGRkZWLZsGYQQ7IK3cvy/TxbBxcUFy5cvZ38+ERnN0qVLkZOTg2HDhsmOQpKxZYgsRkEhdOjQIaSlpUlOQ0SW7NixY9i1axeGDx/OP7KIxRBZlszMTMyePRsLFiyQHYWILFhCQgJatGiBzp07y45CZoDFEFkUFxcXjBw5Evv378fBgwdlxyEiC9W7d29Mnz4diqLIjkJmgMUQWZz27dujVatW+Oyzz9hdRkQlcvz4cXz11VfQ6/UshMiAxRBZHEVRMHr0aOTn52P9+vWy4xCRhcjIyMDs2bNx7tw5FkJUCK8mI4vk6emJefPmITAwUHYUIrIAQgjMnz8f2dnZePfdd1kMUSFsGSKLVatWLdja2uLSpUtITEyUHYeIzNjPP/+Mffv2YcyYMbx6jO7DliGyaEIIfPLJJ7CxscGSJUtga2srOxIRmaGYmBh069YN7dq1kx2FzBBbhsiiKYqCcePG4cqVK/j8889lxyEiMzV+/HiMHDlSdgwyUyyGyOLVrl0bQ4cOxebNm3H48GHZcYjIjCxbtgzHjh2DoihccoMeisUQVQjPP/88WrdujS+++AJ6vV52HCIyA3v37sX333+P1NRU2VHIzLFMpgpBURS899570Gq1UKlY4xNZu+vXr2Pu3Ll45plnOMs0PRJ/a1CF4erqCm9vb2RkZGDz5s0QQsiOREQSZGVl4cMPP0TlypUxatQoXkZPj8RiiCqc33//HYsWLcK2bdtkRyEiCdLT0+Hi4oLp06fDyclJdhyyAOwmowqnffv2OH/+PBYtWoTAwECEhYXJjkREJqLT6eDr64slS5awRYiKjS1DVCENGTIEjz/+OCZOnIikpCTZcYjIBPbs2YMhQ4YgKyuLhRCVCIshqpDUajUmTJiASpUq4cyZM7LjEFE5O3/+PObMmYOQkBB2jVGJsZuMKixXV1esXLkSdnZ2AO7NVs2/Fokqntu3b+Pjjz9GSEgI3nnnHf6cU4mxZYgqtIJC6KuvvsKiRYt4hRlRBZOfn49x48ZBrVZjypQpXJKHSoUtQ2QVPDw8sHr1anh6eqJfv36y4xCRkajVakRERCA4OBienp6y45CFYjFEVuG5555DamoqVq1aBQ8PD3Tt2lV2JCIqA71ej0OHDqFNmzZo27at7Dhk4dhNRlajf//+6NGjB+bOnYuYmBjZcYiolIQQmD9/PqZMmYL4+HjZcagCsLhiSKvVonHjxlAUBbGxsUVuO2DAACiKUuj25JNPmiYomR1FUTBixAi88cYbqFOnjuw4RFRKX331FX788UeMGTMGwcHBsuNQBWBx3WRjx45FtWrVcPr06WJt37lzZ6xevdpwv2BALVknlUqFPn36AADi4+MhhOCXKZEF2b59O9asWYPBgwejS5cusuNQBWFRLUM7d+7Enj17MGfOnGK/xt7eHlWrVjXcOMCOCixcuBDvvvsurl27JjsKERWDEALR0dF44YUX0LdvX9lxqAKxmGLon3/+weDBg/H111+XaEKtAwcOwMfHByEhIRg8eDBu3bpV5PZarRbp6emFblQxTZgwAe7u7hg9ejSuX78uOw4RFUGj0UBRFEydOhXDhw/nXEJkVBZRDAkhMGDAAAwZMgRNmjQp9uu6dOmCdevWYd++fZg7dy5+//13tG/fHlqt9qGvmTFjBtzd3Q23gIAAYxwCmaFKlSph3rx5cHZ2xqhRo5CYmCg7EhE9wN69exEREYGkpCTY2tqyECKjk1oMTZo06b4Bzv+9nThxAosWLUJ6ejrGjRtXovd/+eWX0bVrV9SvXx/PPfccdu7ciQsXLuCnn3566GvGjRuHtLQ0wy0hIaGsh0lmzMPDA/PmzYO3tzfu3r0rOw4R/UdUVBSmT5+OZs2aoWrVqrLjUAUldQD18OHDDYNZHyYoKAjTpk3DsWPHYG9vX+i5Jk2aICIiAmvXri3W/nx9fREYGIiLFy8+dBt7e/v79kMVm5eXF5YtWwZFUaDT6ZCSkoIqVarIjkVk9Xbv3o1PP/0UnTt3xpgxY9giROVGajHk7e0Nb2/vR263cOFCTJs2zXD/xo0bCA8Px4YNG9C8efNi7y8lJQUJCQnw9fUtVV6quAq+ZL/88kvs2rULc+bMQY0aNSSnIrJeGRkZWLx4Mbp27YrRo0ezEKJyZRFjhqpXr4769esbbiEhIQCAmjVrwt/f37BdaGgotmzZAgDIzMzEmDFjcPToUcTHx+PAgQN47rnn4O3tjZ49e0o5DjJ/L730Ery8vDBy5Ej88ccfsuMQWR0hBHQ6HVxdXfH555+zECKTsIhiqLji4uKQlpYG4N56NWfOnEGPHj0QEhKCyMhIhISE4OjRo3B1dZWclMxVpUqVMH/+fNSqVQvvvfcejhw5IjsSkdUQQmDx4sWYPHkyhBDw8/NjIUQmYXGTLgL3xhE9aPXxfz/m6OiI3bt3mzIWVRDOzs6YNWsWpk+fjpiYGLRq1Up2JKIKLy8vD5988gl+/fVXvPPOOyyCyKQsshgiKm+2traYMGGC4Qv5ypUrCAoK4hc0UTnQaDT46KOP8Oeff2Ly5Mlo3bq17EhkZSpUNxmRMalUKiiKgps3b+KNN97AggULoNfrZcciqnB2796NCxcuYM6cOSyESAoWQ0SPULVqVYwcORLbt2/HRx99BI1GIzsSUYWQkZEBAHj++eexatUqNGzYUHIislYshoiKoVu3bpgxYwZOnz6NoUOHIikpSXYkIot28OBB9OnTBzExMVAUhXN7kVQshoiKqXnz5li2bBm8vb3h4OAgOw6RRRJCYO3atZg4cSKaNWuGunXryo5ExAHURCVRvXp1zJkzBwCQmpqKI0eOoGvXrhxYTVQMOTk5mDFjBg4ePIjXX38dERER/Nkhs8CWIaJSOnjwIObOnYu5c+dCp9PJjkNk9vLy8pCUlIRp06ahX79+LITIbLBliKiUevToAQcHB8yZMweXL1/GhAkTuJAk0QMcP34c1atXh6+vL7744gsWQWR22DJEVAbh4eFYtGgRUlNTMXToUOTk5MiORGQ2dDodli1bhg8++ADbt28HABZCZJbYMkRURqGhoVixYgXOnj0LBwcH6HQ66PV62NnZyY5GJE1SUhKmTJmCS5cuYejQoejVq5fsSEQPxZYhIiNwcXFB8+bNAQCrVq3CsGHDcP36dcmpiOTIy8vDiBEjkJaWhkWLFqF3795sESKzxmKIyMg6duwIrVaLwYMHIyoqSnYcIpPJzc2FVquFra0txo8fjxUrViA0NFR2LKJHYjFEZGQ1a9bEF198gTZt2uCTTz7BpEmTeLUZVXjnz5/H4MGDsWTJEgBA48aN4ezsLDkVUfFwzBBROXB0dMS4cePQokUL/Pnnn7CxsYEQgl0FVOHk5uZi9erV2LBhAx577DG8+OKLsiMRlRiLIaJy1LZtW7Rt2xYAEBUVhejoaIwaNQqVKlWSmovIGLRaLd58800kJiZi0KBBePnll6FWq2XHIioxdpMRmYiTkxNiY2MxYMAAHDhwQHYcolLLzc2FEAL29vbo2rUrVqxYgVdeeYWFEFkstgwRmchTTz2F+vXr47PPPsPkyZOxb98+jB07Fi4uLrKjUUkIYfinPjtbYhA5Tp8+jSVLlqDbc8+h+3PP4cWuXQEAeo1GcjIqb/q8bNjn3vv86zXZ0NuW8f3M6OeHxRCRCVWqVAmTJk3Cr7/+il27dsHJyQkAOJ7Iguj/NbHmxVZPSUwihwOAdwHgxEnETZwkNwyZ3Nf/+2/C3Ir12Wc3GZGJKYqCtm3bYubMmVCpVLhw4QIGDBiA3377TXY0IiKTc3z8cSiOjlIzsGWISDJHR0d4enri/fffR+vWrTFs2DBUqVJFdix6CLWnJ2ofOQwAUDk4ABW4Re9aQgKqBwRACIHNW7YgPDwcLrxc3mpp8rLR9vunAQAHXvoVTrbGKWAUR0fpLeMshogkCwgIwLx587B//34sXboUkZGRmDJlCpo1ayY7Gj2Aoiiw8fKSHaNcJSYmYuXKlThw4ACWL1+O2rVro3e/frJjkWSqPEBrd69oUTk5QmXrJDmR8bAYIjIDiqKgffv2ePLJJ/Htt98iJCQEAHDx4kUEBwfDxoY/qlT+7ty5g6+++go7duyAh4cHPvzwQ9SqVUt2LKJyx29YIjPi5OSEQYMGAbi3vtN7770HJycnDBw4EB06dJDelEwV2w8//IB9+/Zh0KBB6NmzJ+zt7WVHIjIJDqAmMlO2traYP38+atSogenTp2PQoEE4fvw4xL8u7SYqC61Wiw0bNmDr1q0AgH79+uHbb79Fnz59WAiRVWExRGTGgoKCMG3aNCxevBguLi74+ut7F7YKIVgUUanl5ORg06ZN6NevH5YvX45bt24BAJydnTnvFVkldpMRWYB69eph/vz5yMrKgqIoiImJwZIlS/DKK6/g6aef5sy/VGzJyckYNGgQMjMz0bFjR/Tv3x/+/v6yYxFJxWKIyEIoimL4q93FxQUeHh6YOnUqVq1ahT59+iA8PBx2dnaSU5I5SklJwa+//ooXXngB3t7e6Nu3L9q2bYuqVavKjkZkFlgMEVmg2rVrY/bs2bhw4QK+/fZbfPbZZ8jMzETfvn1lRyMzcvXqVWzcuBG7du2CnZ0dnnrqKfj4+KBPnz6yoxGZFRZDRBYsJCQEkyZNQkJCAipVqgQAWL16NZKTk9GjRw889thjcgOSNFOmTMH+/fvh4eGB1157DT169IAzJ0wkeiAWQ0QVQEBAgOHfHh4e2LVrF3bu3InQ0FD06NED7dq149VBFdzt27exY8cOdO/eHZ6enmjSpAmeeuoptGnThvNUET0Cf0KIKpjnn38e3bt3x7Fjx7Bt2zZ8+umnqFmzJmrXrg2NRmNYHJYsn16vx6lTp/Djjz/i8OHDsLe3R506ddC8eXM8++yzsuMRWQwWQ0QVkEqlQsuWLdGyZUvcunULPj4+AIARI0ZApVLhmWeeQfv27eFVwZeVqIgKplRQFAULFizA9u3bERgYiLfffhudOnVisUtUCiyGiCq4gkJICIHIyEj88ssvWL58OZYtW4bHH38c48aNY1FkAZKSkrB3715ERUWhf//+6NixI3r27Ilnn30WISEhnJ2cqAxYDBFZCUVR0Lp1a7Ru3RqZmZk4ePAgoqOj4e7uDgBYt24dqlatimbNmsHV1VVyWipw5MgRrF+/Hn/++Sfs7e3Rpk0bw7xAQUFBcsMRVRAshoiskIuLC5599lnDuBKdTofDhw/jr7/+gkqlQqNGjdCiRQt07dqV3S4mpNfrcf78eRw5cgQtW7ZE/fr1kZmZCRcXF4wfPx6tWrWCo6Oj7JhEFQ6LISKCjY0Nli1bhuTkZBw9ehTR0dFYs2YNunbtCgDYu3cvKleujDp16sDW1lZy2ornjz/+wK5du3D06FHcvXsXlSpVQlBQEOrXr4/w8HCEh4fLjkhUobEYIiKDypUro3v37ujevTvy8vJga2sLIQTWrFmD69evw87ODvXq1UPjxo3RrVs3eHp6yo5scTIyMhAbG4vY2Fh06dIFtWrVQmxsLM6dO4dnn30WLVu2RJ06daBScelIIlNhMURED1TQAqQoCtauXYvLly8jJiYGsbGx+OGHH9C5c2cAwObNm5GVlYW6desiJCSE443+5d9Xfn3//ffYs2cPLl++DCEEfH190aRJE9SqVQsRERF49dVXJaclsl4shojokVQqFWrVqoVatWqhd+/e0Ov1hpaLhIQEREVFISsrCwDg6+uLkSNHonnz5rh79y7UarXVFEg3b95EXFwcLly4gAsXLiAuLg5Lly6Fv78/cnJyDOevcePGqFKliuF1XGiXSC4WQ0RUYv/uwhk5ciRGjBiB69evGwqBgsv5N23ahG+++Qa+vr4IDAxEQEAAmjZtiqZNmxZqNbEkOp0OSUlJSEhIwPXr15GWlobBgwcDAIYPH46UlBR4eXnhscceQ69evQwDntnyQ2S+WAwRUZkpioKAgAAEBASgY8eOhse7deuGwMBAXLx4EdeuXcPRo0dhZ2eHpk2b4vz58xg9ejQCAgLg7++PypUrw8/PDz169ABwb14dd3d3ODo6mrRg0mg0SEpKQkpKiuHm6+uLDh064OrVqxg4cCD0ej0AwN7eHoGBgXj99dehUqkwbdo0+Pj4cCwVkYVhMURE5aZKlSqoUqVKoQKpgLe3NwYOHIiEhAQkJibi0qVLcHFxMRRDb775JjIyMmBvbw8vLy/D5eXVq1fHnj178Oeff8LR0RFuDmpE/Ot9U1JScOTIEQD3xuzk5Ofct+/Vq1fj2rVryM7OhkajgUajwVtvvYUnnngC27Ztw/Llyw3buru7o127dujQoQOqVq2KUaNGwd/fHwEBAfDy8ipUqIWGhhrpzBGRKbEYIiIpfHx88NJLLz30+alTpxZqncnKyjJ0Od25cwdxcXHQaDTQ52Qiot7/vy4xMRHz58+HoihQqVQQNgLoc++5gq6527dvIz09HU5OTvD19YWjo6NhRfcOHTqgcePG8PLygqenZ6FFTu3t7fHcc88Z+UwQkWwshojILDVq1Oihz/Xp0wd9+vyvwsnNAj6pZniuYcOG2Ldvn+G+Jk+D5t82B/D/45Pee++9h763j4+PYcwTEVkHFkOy/O8vVABArkZeDiJLV4Kfn2xddjkGIarYKvLPD4shWfL+9aGaU0teDqIK7t9f4G2/bysvCBGZLU5xSkQVQ8CTgC3XUSMqb2E+YXC0qVhr5ClC/Lu/hv4rPT0d7u7uSEtLg5ubm/HeWAgg6/a9f9s6AhY21wqR2bF1euDPkRACd3LuAECF+wInksHRxrTTXZRWSX5/s5tMFkUBXCrLTkFU4SmKAi9HL9kxiMiMsZuMiIiIrBqLISIiIrJqLIaIiIjIqrEYIiIiIqvGYoiIiIisGoshIiIismoshoiIiMiqsRgiIiIiq8ZiiIiIiKwaiyEiIiKyaiyGiIiIyKqxGCIiIiKrxmKIiIiIrBpXrX8EIQQAID09XXISIiIiKq6C39sFv8eLwmLoETIyMgAAAQEBkpMQERFRSWVkZMDd3b3IbRRRnJLJiun1ety4cQOurq5QFEV2nBJLT09HQEAAEhIS4ObmJjuOWeG5eTCelwfjeXk4npsH43l5MFOdFyEEMjIyUK1aNahURY8KYsvQI6hUKvj7+8uOUWZubm78YXwInpsH43l5MJ6Xh+O5eTCelwczxXl5VItQAQ6gJiIiIqvGYoiIiIisGouhCs7e3h4TJ06Evb297Chmh+fmwXheHozn5eF4bh6M5+XBzPG8cAA1ERERWTW2DBEREZFVYzFEREREVo3FEBEREVk1FkNERERk1VgMmally5ahYcOGhkmpWrRogZ07dxqeHzBgABRFKXR78sknC72HVqvF22+/DW9vbzg7O6N79+64fv16kfvV6XT46KOPEBwcDEdHR9SoUQNTpkyBXq8vl+MsDVnnJiMjA6NGjUJgYCAcHR3RsmVL/P777+VyjKVhjPOyfPlytG3bFm5ublAUBXfv3i3WvpcuXYrg4GA4ODjgiSeewKFDh4x5aGUi67wcPHgQzz33HKpVqwZFUbB161YjH1nZyTo3M2bMQNOmTeHq6gofHx88//zziIuLM/bhlZqs8/Ko/com8zumwIwZM6AoCkaNGmWEI/p/LIbMlL+/P2bOnIkTJ07gxIkTaN++PXr06IGzZ88atuncuTOSkpIMt59//rnQe4waNQpbtmzB+vXrcfjwYWRmZqJbt27Iz89/6H4//fRTfP7551i8eDHOnz+PWbNmYfbs2Vi0aFG5HWtJyTo3gwYNQlRUFL7++mucOXMGnTp1QseOHZGYmFhux1oSxjgvGo0GnTt3xocffljs/W7YsAGjRo3C+PHjERMTg9atW6NLly64du2a0Y6tLGSdl6ysLDRq1AiLFy822rEYm6xz8+uvv2LYsGE4duwYoqKioNPp0KlTJ2RlZRnt2MpC1nkpzn5lknVeCvz+++9Yvnw5GjZsWOZjuY8gi+Hh4SFWrlwphBAiMjJS9OjR46Hb3r17V9ja2or169cbHktMTBQqlUrs2rXroa/r2rWrGDhwYKHHXnjhBdGvX7+yhS9n5X1uNBqNUKvVYseOHYUeb9SokRg/fnzZD6CclOS8/Nv+/fsFAJGamvrIbZs1ayaGDBlS6LHQ0FDxwQcflDSuyZjivPwbALFly5aShZTE1OdGCCFu3bolAIhff/21xK81FRnn5b/7NUemOi8ZGRmidu3aIioqSjz99NNi5MiRpQv8EGwZsgD5+flYv349srKy0KJFC8PjBw4cgI+PD0JCQjB48GDcunXL8NzJkyeRl5eHTp06GR6rVq0a6tevj+jo6Ifu66mnnsLevXtx4cIFAMDp06dx+PBhPPvss+VwZGVnqnOj0+mQn58PBweHQo87Ojri8OHDRj6qsivNeSmN3NxcnDx5stC5BIBOnToV+TmTxVTnxRLJPDdpaWkAAE9PT6O/d1nJOi8P26+5MPV5GTZsGLp27YqOHTsa5f3+iwu1mrEzZ86gRYsWyMnJgYuLC7Zs2YK6desCALp06YLevXsjMDAQV65cwccff4z27dvj5MmTsLe3x82bN2FnZwcPD49C71mlShXcvHnzoft8//33kZaWhtDQUKjVauTn52P69Ono27dvuR5rSZn63Li6uqJFixaYOnUq6tSpgypVquC7777D8ePHUbt27XI/3uIqy3kpjdu3byM/Px9VqlQp9PijPmemZurzYklknxshBEaPHo2nnnoK9evXN8p7GoOs81LUfs2BjPOyfv16nDp1qnzHaBq1nYmMSqvViosXL4rff/9dfPDBB8Lb21ucPXv2gdveuHFD2Nraik2bNgkhhFi3bp2ws7O7b7uOHTuKN99886H7/O6774S/v7/47rvvxB9//CG++uor4enpKdasWWOcgzISGefm0qVLok2bNgKAUKvVomnTpiIiIkLUqVPHOAdlBGU5L/9W3CbsxMREAUBER0cXenzatGniscceK/VxGJupz8t/wYy7yWSfm6FDh4rAwECRkJBQmvjlRtZ5Kcl+ZTD1ebl27Zrw8fERsbGxhsfKo5uMxZAF6dChg3jjjTce+nytWrXEzJkzhRBC7N27VwAQd+7cKbRNw4YNxYQJEx76Hv7+/mLx4sWFHps6dapZ/WJ7EFOcmwKZmZnixo0bQgghXnrpJfHss8+WIXn5Ksl5+bfiflFptVqhVqvF5s2bCz0+YsQI0aZNm1JlNoXyPi//Zc7F0H+Z8twMHz5c+Pv7i8uXL5cmqkmZ+jNT3P3KVt7nZcuWLYY/QAtuAISiKEKtVgudTlfWQxBCcMyQRRFCQKvVPvC5lJQUJCQkwNfXFwDwxBNPwNbWFlFRUYZtkpKS8Oeff6Jly5YP3YdGo4FKVfhjoVarzerS+gcxxbkp4OzsDF9fX6SmpmL37t3o0aOHcQ6iHJTkvJSGnZ0dnnjiiULnEgCioqKKdS5lKe/zYslMcW6EEBg+fDg2b96Mffv2ITg4uEzvZwqyPjNF7dcclPd56dChA86cOYPY2FjDrUmTJoiIiEBsbCzUanWp37sQo5RUZHTjxo0TBw8eFFeuXBF//PGH+PDDD4VKpRJ79uwRGRkZ4t133xXR0dHiypUrYv/+/aJFixbCz89PpKenG95jyJAhwt/fX/zyyy/i1KlTon379qJRo0aFKun27duLRYsWGe5HRkYKPz8/sWPHDnHlyhWxefNm4e3tLcaOHWvS4y+KrHOza9cusXPnTnH58mWxZ88e0ahRI9GsWTORm5tr0uN/GGOcl6SkJBETEyNWrFghAIiDBw+KmJgYkZKSYtjmv+dl/fr1wtbWVqxatUqcO3dOjBo1Sjg7O4v4+HiTHv/DyDovGRkZIiYmRsTExAgAYt68eSImJkZcvXrVpMdfFFnn5q233hLu7u7iwIEDIikpyXDTaDQmPf6HkXVeitqvOZB1Xv6L3WRWZODAgSIwMFDY2dmJypUriw4dOhh+IDQajejUqZOoXLmysLW1FdWrVxeRkZHi2rVrhd4jOztbDB8+XHh6egpHR0fRrVu3+7YJDAwUEydONNxPT08XI0eOFNWrVxcODg6iRo0aYvz48UKr1Zb7MReXrHOzYcMGUaNGDWFnZyeqVq0qhg0bJu7evVvux1tcxjgvEydOFADuu61evdqwzX/PixBCLFmyxLDvxx9/3KwukZZ1Xgq6Af57i4yMNMFRF4+sc/Og7f/7GplknZei9msOZH7H/Ft5FEOKEEIYp42JiIiIyPJwzBARERFZNRZDREREZNVYDBEREZFVYzFEREREVo3FEBEREVk1FkNERERk1VgMERERkVVjMURERERWjcUQERERWTUWQ0RUoQ0YMACKokBRFNjY2KB69ep46623kJqaWmi77OxseHh4wNPTE9nZ2ZLSEpEMLIaIqMLr3LkzkpKSEB8fj5UrV+LHH3/E0KFDC22zadMm1K9fH3Xr1sXmzZslJSUiGWxkByAiKm/29vaoWrUqAMDf3x8vv/wy1qxZU2ibVatWoV+/fhBCYNWqVYiIiJCQlIhkYDFERFbl8uXL2LVrF2xtbQ2P/f333zh69Cg2b94MIQRGjRqFy5cvo0aNGhKTEpGpsJuMiCq8HTt2wMXFBY6OjqhZsybOnTuH999/3/D8l19+iS5duhjGDHXu3BlffvmlxMREZEoshoiowmvXrh1iY2Nx/PhxvP322wgPD8fbb78NAMjPz8fatWvRr18/w/b9+vXD2rVrkZ+fLysyEZkQiyEiqvCcnZ1Rq1YtNGzYEAsXLoRWq8XkyZMBALt370ZiYiJefvll2NjYwMbGBn369MH169exZ88eycmJyBQUIYSQHYKIqLwMGDAAd+/exdatWw2PHThwAF26dMHff/+Nt99+G3Z2dhg/fnyh182cORM5OTnYuHGjiRMTkalxADURWZ22bduiXr16mD59On788Uds374d9evXL7RNZGQkunbtiuTkZFSuXFlSUiIyBXaTEZFVGj16NJYvX468vDx06NDhvufbtWsHV1dXfP311xLSEZEpsZuMiIiIrBpbhoiIiMiqsRgiIiIiq8ZiiIiIiKwaiyEiIiKyaiyGiIiIyKqxGCIiIiKrxmKIiIiIrBqLISIiIrJqLIaIiIjIqrEYIiIiIqvGYoiIiIis2v8BzIbTsg8hO7wAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "matching_regions = []\n", + "id_to_region = df.set_index(\"data_id\")[\"region\"].to_dict()\n", + "\n", + "for set_name in ra_dec_search_results:\n", + " matching_regions.append(id_to_region[overlapping_sets[set_name][0]])\n", + "\n", + "all_corners = [getRegionCorners(region) for region in matching_regions]\n", + "print(all_corners)\n", + "\n", + "for i, quad in enumerate(all_corners):\n", + " ra_bounds, dec_bounds = getMinMaxRaDec(quad)\n", + " #\n", + " coords = []\n", + " coords.append((ra_bounds[0], dec_bounds[0]))\n", + " coords.append((ra_bounds[0], dec_bounds[1]))\n", + " coords.append((ra_bounds[1], dec_bounds[1]))\n", + " coords.append((ra_bounds[1], dec_bounds[0]))\n", + " coords.append((ra_bounds[0], dec_bounds[0])) # close the \"shape\"\n", + " #\n", + " plt.plot([x[0] for x in coords], [x[1] for x in coords], label=ra_dec_search_results[i])\n", + "\n", + "plt.scatter(\n", + " searching_ra_dec[0],\n", + " searching_ra_dec[1],\n", + " s=25,\n", + " marker=\"+\",\n", + " alpha=0.75,\n", + " label=f\"search center\",\n", + " color=\"red\",\n", + ")\n", + "circle = plt.Circle(\n", + " (searching_ra_dec[0], searching_ra_dec[1]),\n", + " search_radius.to(u.degree).value,\n", + " color=\"black\",\n", + " alpha=0.75,\n", + " fill=False,\n", + " label=\"search area\",\n", + " linestyle=\"--\",\n", + ")\n", + "plt.legend()\n", + "plt.xlabel(f\"RA\")\n", + "plt.ylabel(\"Dec\")\n", + "ax = plt.gca()\n", + "ax.add_patch(circle)\n", + "ax.set_aspect(\"equal\", adjustable=\"box\")" + ] + }, + { + "cell_type": "markdown", + "id": "18ccf409", + "metadata": {}, + "source": [ + "### (RA, Dec) searching of our DataFrame (more general case)\n", + "It is far faster to search overlapping_sets as there are few of these to inspect.\n", + "A more general case, however, would be to simply find all images within a radius of a sky coordinate." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "b636fef0", + "metadata": {}, + "outputs": [], + "source": [ + "def ra_dec_search_df(df, ra_dec, search_radius, verbose=False):\n", + " \"\"\"\n", + " 2/6/2024 COC\n", + " Implementing a basic (RA, Dec) query function for our derived Pandas dataframe.\n", + " \"\"\"\n", + "\n", + " ra_dec_coord = SkyCoord(ra=ra_dec[0] * u.degree, dec=ra_dec[1] * u.degree)\n", + "\n", + " all_centers = SkyCoord(\n", + " ra=[x[0] for x in df[\"center_coord\"].iloc()] * u.degree,\n", + " dec=[x[1] for x in df[\"center_coord\"].iloc()] * u.degree,\n", + " )\n", + "\n", + " distances = ra_dec_coord.separation(all_centers)\n", + " within_radius = (distances <= search_radius) & (\n", + " distances >= 0\n", + " ) # ≥ (not >) because we could supply the an exact match\n", + "\n", + " results = df[within_radius]\n", + "\n", + " if verbose:\n", + " print(f\"We found {len(results.index)} matches within {search_radius} of {ra_dec}.\")\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "90b6aa45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We found 95 matches within 3.0 arcsec of (351.0695696334572, -4.336293374423113).\n", + "CPU times: user 805 ms, sys: 21.7 ms, total: 827 ms\n", + "Wall time: 825 ms\n" + ] + }, + { + "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", + "
data_idregiondetectoruriutcenter_coordut_datetime
0(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847372525065534...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:20:22.932(351.0694028401149, -4.336598368890197)2019-09-27 00:20:22.932
1(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847381014554984...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:22:51.015(351.0695696334572, -4.336293374423113)2019-09-27 00:22:51.015
2(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847383417970056...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:25:19.136(351.0696571334576, -4.336293374415341)2019-09-27 00:25:19.136
3(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847382159041213...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:27:47.118(351.069611300124, -4.336293374419411)2019-09-27 00:27:47.118
4(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847381374341414...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:30:15.537(351.0695696451088, -4.336265319377865)2019-09-27 00:30:15.537
........................
90(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847391753851408...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:02:58.424(351.06998627728365, -4.3363483733857136)2019-09-27 04:02:58.424
91(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847400909178194...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:05:27.654(351.0703196106188, -4.336348373356122)2019-09-27 04:05:27.654
92(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847397935953284...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:07:56.159(351.07019878847524, -4.336321429412502)2019-09-27 04:07:56.159
93(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847392459182945...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:10:25.141(351.069986300126, -4.336293374386118)2019-09-27 04:10:25.141
94(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847397036888316...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:12:52.877(351.07015296679367, -4.336293374371324)2019-09-27 04:12:52.877
\n", + "

95 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " data_id \n", + "0 (instrument, detector, visit) \\\n", + "1 (instrument, detector, visit) \n", + "2 (instrument, detector, visit) \n", + "3 (instrument, detector, visit) \n", + "4 (instrument, detector, visit) \n", + ".. ... \n", + "90 (instrument, detector, visit) \n", + "91 (instrument, detector, visit) \n", + "92 (instrument, detector, visit) \n", + "93 (instrument, detector, visit) \n", + "94 (instrument, detector, visit) \n", + "\n", + " region detector \n", + "0 ConvexPolygon([UnitVector3d(0.9847372525065534... 1 \\\n", + "1 ConvexPolygon([UnitVector3d(0.9847381014554984... 1 \n", + "2 ConvexPolygon([UnitVector3d(0.9847383417970056... 1 \n", + "3 ConvexPolygon([UnitVector3d(0.9847382159041213... 1 \n", + "4 ConvexPolygon([UnitVector3d(0.9847381374341414... 1 \n", + ".. ... ... \n", + "90 ConvexPolygon([UnitVector3d(0.9847391753851408... 1 \n", + "91 ConvexPolygon([UnitVector3d(0.9847400909178194... 1 \n", + "92 ConvexPolygon([UnitVector3d(0.9847397935953284... 1 \n", + "93 ConvexPolygon([UnitVector3d(0.9847392459182945... 1 \n", + "94 ConvexPolygon([UnitVector3d(0.9847397036888316... 1 \n", + "\n", + " uri \n", + "0 file:///epyc/users/smotherh/DEEP/PointingGroup... \\\n", + "1 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "2 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "3 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "4 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + ".. ... \n", + "90 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "91 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "92 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "93 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "94 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "\n", + " ut center_coord \n", + "0 2019-09-27T00:20:22.932 (351.0694028401149, -4.336598368890197) \\\n", + "1 2019-09-27T00:22:51.015 (351.0695696334572, -4.336293374423113) \n", + "2 2019-09-27T00:25:19.136 (351.0696571334576, -4.336293374415341) \n", + "3 2019-09-27T00:27:47.118 (351.069611300124, -4.336293374419411) \n", + "4 2019-09-27T00:30:15.537 (351.0695696451088, -4.336265319377865) \n", + ".. ... ... \n", + "90 2019-09-27T04:02:58.424 (351.06998627728365, -4.3363483733857136) \n", + "91 2019-09-27T04:05:27.654 (351.0703196106188, -4.336348373356122) \n", + "92 2019-09-27T04:07:56.159 (351.07019878847524, -4.336321429412502) \n", + "93 2019-09-27T04:10:25.141 (351.069986300126, -4.336293374386118) \n", + "94 2019-09-27T04:12:52.877 (351.07015296679367, -4.336293374371324) \n", + "\n", + " ut_datetime \n", + "0 2019-09-27 00:20:22.932 \n", + "1 2019-09-27 00:22:51.015 \n", + "2 2019-09-27 00:25:19.136 \n", + "3 2019-09-27 00:27:47.118 \n", + "4 2019-09-27 00:30:15.537 \n", + ".. ... \n", + "90 2019-09-27 04:02:58.424 \n", + "91 2019-09-27 04:05:27.654 \n", + "92 2019-09-27 04:07:56.159 \n", + "93 2019-09-27 04:10:25.141 \n", + "94 2019-09-27 04:12:52.877 \n", + "\n", + "[95 rows x 7 columns]" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "ra_dec_search_radius = 3 * u.arcsec\n", + "ra_dec_search_results_df = ra_dec_search_df(\n", + " df=df, ra_dec=searching_ra_dec, search_radius=ra_dec_search_radius, verbose=True\n", + ")\n", + "ra_dec_search_results_df" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "1874ddaa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the centers\n", + "plt.scatter(\n", + " [x[0] for x in ra_dec_search_results_df[\"center_coord\"]],\n", + " [x[1] for x in ra_dec_search_results_df[\"center_coord\"]],\n", + " s=2,\n", + " alpha=0.5,\n", + " label=\"matches\",\n", + ")\n", + "plt.scatter(\n", + " searching_ra_dec[0], searching_ra_dec[1], color=\"red\", s=20, alpha=0.5, marker=\"+\", label=\"search center\"\n", + ")\n", + "circle = plt.Circle(\n", + " (searching_ra_dec[0], searching_ra_dec[1]),\n", + " ra_dec_search_radius.to(u.degree).value,\n", + " color=\"black\",\n", + " alpha=0.75,\n", + " fill=False,\n", + " label=\"search area\",\n", + " linestyle=\"--\",\n", + ")\n", + "plt.xlabel(f\"RA\")\n", + "plt.ylabel(\"Dec\")\n", + "ax = plt.gca()\n", + "ax.add_patch(circle)\n", + "plt.legend()\n", + "ax.set_aspect(\"equal\", adjustable=\"box\")" + ] + }, + { + "cell_type": "markdown", + "id": "805d6699", + "metadata": {}, + "source": [ + "These are the 95 matching center coordinates.\\\n", + "These may look far off, but this is just the scale.\\\n", + "We can plot the entire chip area on-sky, as we did earlier overlapping_sets." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "3db99133", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAE1CAYAAAAh2H5LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6tUlEQVR4nO3de1wVZcIH8N8B4XA/IchNroIKKkKKF+wtbyyXdHHtoiiStErrtuh6iyQ1oVDK0kxcX00xCN2kFenTukGQmpcQVJK0LDdKFAUFXQQUPNzm/cOXWY/cDgxyOPr7fj7zyZl5Zp5nHsf48cxNJgiCACIiIiLqMh1NN4CIiIhI2zFQEREREUnEQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCRRH0034HHR1NSEkpISmJqaQiaTabo5REREpAZBEFBdXQ07Ozvo6LQ9DsVA1UNKSkrg4OCg6WYQERFRFxQXF8Pe3r7N9QxUPcTU1BTAvb8QMzMzDbeGiIiI1FFVVQUHBwfx53hbGKh6SPNlPjMzMwYqIiIiLdPR7Tq8KZ2IiIhIIgYqIiIiIokYqIiIiIgkYqAiIiIikoiBioiIiEgiBioiIiIiiRioiIiIiCTie6i0nCAIOPDp5zj1fTb0hHpNN4eIiKjH6esbYcq0ORg2apTG2sBApcUEQYBv5Af4Y7UlrI1e0HRziIiINCZ3SwEQCY2FKl7y02K19Y34nfFvqDdq+9tCREREjwOloSuyDnyqsfo5QvUISRvyBiZfGYwm6Gu6KURERA9dUxNgIJPBpDpE001hoHqU1OjX4dUla2BuO0DTTSEiInrotqx/HXeKSjTdDAC85EdEREQkGQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkkdYFKqVSCW9vb8hkMhQUFLRZrr6+Hq+//jo8PT1hbGwMOzs7vPTSSygp+e9XqYuKiiCTyVqd/vGPf4jlnJ2dW6xfsWLFwzxMIiIi0iJaF6iioqJgZ2fXYbmamhp89913WL16Nb777jvs378f//73vxEcHCyWcXBwQGlpqcoUGxsLY2NjBAUFqezvrbfeUim3atWqbj82IiIi0k59NN2AzsjIyEBWVhbS0tKQkZHRblmFQoHs7GyVZQkJCRg9ejQuX74MR0dH6OrqwsbGRqVMeno6Zs6cCRMTE5XlpqamLcoSERERAVo0QnX9+nVEREQgJSUFRkZGXdpHZWUlZDIZnnjiiVbX5+fno6CgAPPmzWux7t1334WFhQW8vb2xdu1a1NXVtVuXUqlEVVWVykRERESPJq0YoRIEAeHh4ViwYAF8fHxQVFTU6X3cvXsXK1aswOzZs2FmZtZqmcTERHh4eGDcuHEqy//6179ixIgRMDc3x8mTJxEdHY2LFy9i586dbdYXHx+P2NjYTreTiIiItI9GR6hiYmLavCm8eTp9+jQSEhJQVVWF6OjoLtVTX1+PkJAQNDU1YevWra2Wqa2txd///vdWR6eWLFmC8ePHY/jw4Zg/fz62bduGxMRE3Lx5s806o6OjUVlZKU7FxcVdajsRERH1fhodoYqMjERISEi7ZZydnREXF4fc3FzI5XKVdT4+PggNDUVycnKb29fX12PGjBm4ePEiDh061Obo1L59+1BTU4OXXnqpw3aPHTsWAFBYWAgLC4tWy8jl8hbtJSIiokeTRgOVpaUlLC0tOyy3efNmxMXFifMlJSUICAhAamoqxowZ0+Z2zWHql19+weHDh9sMP8C9y33BwcHo169fh+05c+YMAMDW1rbDskRERPTo04p7qBwdHVXmm5/Ac3V1hb29vbjc3d0d8fHxmD59OhoaGvDCCy/gu+++w4EDB9DY2Ihr164BAPr27Qt9fX1xu8LCQhw9ehRffvlli7pPnDiB3NxcTJw4EQqFAqdOncKSJUsQHBzcol1ERET0eNKKQKWuCxcuoLKyEgBw5coVfPHFFwAAb29vlXKHDx/GhAkTxPldu3ahf//+8Pf3b7FPuVyO1NRUxMbGQqlUwsnJCREREYiKinpox0FERETaRSsDlbOzMwRBaLH8/mVtlWnNunXrsG7dulbXjRgxArm5uV1rKBERET0WtOY9VERERES9FQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkEQMVERERkURaF6iUSiW8vb0hk8lQUFDQbtmYmBi4u7vD2NgY5ubm8PPzQ15eXov9LVy4EJaWljA2NkZwcDCuXLmiUqaiogJhYWFQKBRQKBQICwvDrVu3uvnIiIiISFtpXaCKioqCnZ2dWmUHDRqELVu24Ny5czh+/DicnZ3h7++P8vJysczixYuRnp6OvXv34vjx47h9+zamTp2KxsZGsczs2bNRUFCAzMxMZGZmoqCgAGFhYd1+bERERKSd+mi6AZ2RkZGBrKwspKWlISMjo8Pys2fPVpnfuHEjEhMTcfbsWUyePBmVlZVITExESkoK/Pz8AAC7d++Gg4MDvv76awQEBOCnn35CZmYmcnNzMWbMGADAjh074OvriwsXLmDw4MHdf6BERESkVbRmhOr69euIiIhASkoKjIyMOr19XV0dPvroIygUCnh5eQEA8vPzUV9fD39/f7GcnZ0dhg0bhpycHADAiRMnoFAoxDAFAGPHjoVCoRDLtEapVKKqqkplIiIiokeTVgQqQRAQHh6OBQsWwMfHp1PbHjhwACYmJjAwMMAHH3yA7OxsWFpaAgCuXbsGfX19mJubq2xjbW2Na9euiWWsrKxa7NfKykos05r4+HjxniuFQgEHB4dOtZuIiIi0h0YDVUxMDGQyWbvT6dOnkZCQgKqqKkRHR3e6jokTJ6KgoAA5OTkIDAzEjBkzUFZW1u42giBAJpOJ8/f/ua0yD4qOjkZlZaU4FRcXd7rtREREpB00eg9VZGQkQkJC2i3j7OyMuLg45ObmQi6Xq6zz8fFBaGgokpOT29ze2NgYbm5ucHNzw9ixYzFw4EAkJiYiOjoaNjY2qKurQ0VFhcooVVlZGcaNGwcAsLGxwfXr11vst7y8HNbW1m3WK5fLW7SXiIiIHk0aDVSWlpbi5bf2bN68GXFxceJ8SUkJAgICkJqaqnJvkzoEQYBSqQQAjBw5Enp6esjOzsaMGTMAAKWlpfjhhx+wfv16AICvry8qKytx8uRJjB49GgCQl5eHyspKMXQRERHR400rnvJzdHRUmTcxMQEAuLq6wt7eXlzu7u6O+Ph4TJ8+HXfu3MHatWsRHBwMW1tb3Lx5E1u3bsWVK1fw4osvAgAUCgXmzZuHZcuWwcLCAn379sXy5cvh6ekpPvXn4eGBwMBAREREYPv27QCAV155BVOnTuUTfkRERARASwKVui5cuIDKykoAgK6uLn7++WckJyfjxo0bsLCwwKhRo3Ds2DEMHTpU3OaDDz5Anz59MGPGDNTW1mLy5MlISkqCrq6uWGbPnj1YtGiR+DRgcHAwtmzZ0rMHR0RERL2WVgYqZ2dnCILQYvn9ywwMDLB///4O92VgYICEhAQkJCS0WaZv377YvXt31xpLREREjzyteG0CERERUW/GQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEfTTdACLSHo2Njaivr9d0M0jL6OvrQ0eHv7/To42Biog6JAgCrl27hlu3bmm6KaSFdHR04OLiAn19fU03heihYaAiog41hykrKysYGRlBJpNpukmkJZqamlBSUoLS0lI4Ojry3KFHFgMVEbWrsbFRDFMWFhaabg5poX79+qGkpAQNDQ3Q09PTdHOIHgqtu6itVCrh7e0NmUyGgoKCdsvGxMTA3d0dxsbGMDc3h5+fH/Ly8sT1//nPf7Bw4UIMHjwYRkZGcHR0xKJFi1BZWamyH2dnZ8hkMpVpxYoVD+PwiHqd5numjIyMNNwS0lbNl/oaGxs13BKih0frRqiioqJgZ2eH77//vsOygwYNwpYtWzBgwADU1tbigw8+gL+/PwoLC8XfmEpKSvD+++9jyJAhuHTpEhYsWICSkhLs27dPZV9vvfUWIiIixHkTE5NuPzai3oyXaqireO7Q40CrAlVGRgaysrKQlpaGjIyMDsvPnj1bZX7jxo1ITEzE2bNnMXnyZAwbNgxpaWnieldXV6xduxZz5sxBQ0MD+vT5b/eYmprCxsZG7bYqlUoolUpxvqqqSu1tiYiISLtozSW/69evIyIiAikpKV269FBXV4ePPvoICoUCXl5ebZarrKyEmZmZSpgCgHfffRcWFhbw9vbG2rVrUVdX12598fHxUCgU4uTg4NDpNhMREZF20IpAJQgCwsPDsWDBAvj4+HRq2wMHDsDExAQGBgb44IMPkJ2dDUtL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AwMxY8YMlU88REREwM/PD8OGDUNISAj27duHr7/+WuVr6619YqP5PTttiY6ORmVlpTgVFxd3uu1EvUHzW71ramo03BLSVs1vXb//A9FEjxqNjlBFRka2eKLuQc7OzoiLi0Nubm6LF4r6+PggNDQUycnJbW5vbGwMNzc3uLm5YezYsRg4cCASExPbDGcjRoyAnp4efvnlF4wYMQI2Nja4fv16i3Ll5eXtfoZHLpe3+QJUIm2iq6uLJ554QvxFxMjIqNd/x496j6amJpSXl8PIyKjdL20QaTuNnt2WlpYql9/asnnzZsTFxYnzJSUlCAgIQGpqaovvcHVEEIR23+j+448/or6+Hra2tgAAX19fVFZW4uTJkxg9ejSAe29grqysxLhx4zpVN5G2an5oo6MP+BK1RkdHB46Ojgzi9EjTil8XHB0dVeZNTEwAAK6urrC3txeXu7u7Iz4+HtOnT8edO3ewdu1aBAcHw9bWFjdv3sTWrVtx5coVvPjiiwDufQtrz549ePbZZ2FpaYnz589j2bJlePLJJ/HUU08BADw8PBAYGIiIiAjxdQqvvPIKpk6dyif86LEhk8lga2sLKysr1NfXa7o5pGX09fV7/NuPRD1NKwKVui5cuIDKykoA9y5T/Pzzz0hOTsaNGzdgYWGBUaNG4dixYxg6dCiAe//IDx48iA8//BC3b9+Gg4MDpkyZgjVr1qhc69+zZw8WLVoEf39/AEBwcDC2bNnS8wdIpGG6urq8D4aIqBVaGaicnZ1bfWrk/mUGBgbYv39/u/txcHDAkSNHOqyvb9++2L17d+cbSkRERI8FjsESERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCQRAxURERGRRAxURERERBIxUBERERFJxEBFREREJBEDFREREZFEDFREREREEjFQEREREUnEQEVEREQkEQMVERERkUQMVEREREQSMVARERERScRARURERCSR1gUqpVIJb29vyGQyFBQUtFs2JiYG7u7uMDY2hrm5Ofz8/JCXlyeuLyoqgkwma3X6xz/+IZZzdnZusX7FihUP6xCJiIhIy2hdoIqKioKdnZ1aZQcNGoQtW7bg3LlzOH78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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the centers\n", + "# plt.scatter([x[0] for x in ra_dec_search_results_df[\"center_coord\"]], [x[1] for x in ra_dec_search_results_df[\"center_coord\"]], s=2, alpha=0.5, label=\"matches\")\n", + "plt.scatter(\n", + " searching_ra_dec[0], searching_ra_dec[1], color=\"red\", s=20, alpha=0.5, marker=\"+\", label=\"search center\"\n", + ")\n", + "for quad in [getRegionCorners(x) for x in ra_dec_search_results_df[\"region\"]]:\n", + " ra_bounds, dec_bounds = getMinMaxRaDec(quad)\n", + " #\n", + " coords = []\n", + " coords.append((ra_bounds[0], dec_bounds[0]))\n", + " coords.append((ra_bounds[0], dec_bounds[1]))\n", + " coords.append((ra_bounds[1], dec_bounds[1]))\n", + " coords.append((ra_bounds[1], dec_bounds[0]))\n", + " coords.append((ra_bounds[0], dec_bounds[0])) # close the \"shape\"\n", + " #\n", + " plt.plot([x[0] for x in coords], [x[1] for x in coords]), # label=ra_dec_search_results[i])\n", + "circle = plt.Circle(\n", + " (searching_ra_dec[0], searching_ra_dec[1]),\n", + " ra_dec_search_radius.to(u.degree).value,\n", + " color=\"black\",\n", + " alpha=0.75,\n", + " fill=False,\n", + " label=\"search area\",\n", + " linestyle=\"--\",\n", + " linewidth=0.1,\n", + ")\n", + "plt.xlabel(f\"RA\")\n", + "plt.ylabel(\"Dec\")\n", + "ax = plt.gca()\n", + "ax.add_patch(circle)\n", + "plt.legend()\n", + "ax.set_aspect(\"equal\", adjustable=\"box\")" ] }, { @@ -2834,7 +3407,7 @@ "id": "337ceedc", "metadata": {}, "source": [ - "# Recap and Master Function\n", + "# Recap and Master Functions\n", "Here is a master function that takes a repo_path and returns \\\n", "(1) a Pandas dataframe with needed info, and\\\n", "(2) a dictionary with the images in discrete piles (sets)." @@ -2842,7 +3415,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 82, "id": "fccdee6b", "metadata": {}, "outputs": [], @@ -2854,21 +3427,9 @@ " overwrite=False,\n", " overlap_uncertainty_radius_arcsec=30,\n", "):\n", - " \"\"\"2/6/2024 COC\"\"\"\n", - " import lsst\n", - " import lsst.daf.butler as dafButler\n", - " import os\n", - " import glob\n", - " import time\n", - " from matplotlib import pyplot as plt\n", - " import progressbar\n", - " from concurrent.futures import ProcessPoolExecutor, as_completed\n", - " from astropy.time import Time # for converting Butler visitInfo.date (TAI) to UTC strings\n", - " from astropy import units as u\n", - " import pandas as pd\n", - " import pickle\n", - " from dateutil import parser\n", - "\n", + " \"\"\"\n", + " 2/6/2024 COC\n", + " \"\"\"\n", " if basedir == \"default\":\n", " basedir = f'{os.environ[\"HOME\"]}/kbmod_tmp'\n", " print(f'Changing \"default\" basedir to {basedir} now.')\n", @@ -2886,6 +3447,7 @@ " butler=butler, desired_collections=desired_collections, desired_datasetTypes=desired_datasetTypes\n", " )\n", " desired_instruments = getInstruments(butler=butler, vdr_ids=df[\"data_id\"])\n", + " df[\"center_coord\"] = [getCenterRaDec(i) for i in df[\"region\"]]\n", " df[\"uri\"] = getURIs(\n", " butler=butler,\n", " dataIds=df[\"data_id\"],\n", @@ -2905,7 +3467,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 83, "id": "cf221f77", "metadata": {}, "outputs": [ @@ -2921,19 +3483,304 @@ "Overwrite is False, so we will read the timestamps from file now...\n", "Recycled 47383 from /astro/users/coc123/kbmod_tmp/vdr_timestamps.lst.\n", "Recycling /astro/users/coc123/kbmod_tmp/overlapping_sets.pickle as overwrite=False.\n", - "CPU times: user 4.44 s, sys: 465 ms, total: 4.91 s\n", - "Wall time: 6.28 s\n" + "CPU times: user 5.1 s, sys: 618 ms, total: 5.72 s\n", + "Wall time: 6.88 s\n" ] } ], "source": [ "%%time\n", + "\n", + "# Example\n", "# TIMING NOTE: this requires about 7 seconds to run ***with everything already cached***.\n", "df1, overlapping_sets1 = retrieve_image_sets(\n", " repo_path=f\"/epyc/users/smotherh/DEEP/PointingGroups/butler-repo\"\n", ")" ] }, + { + "cell_type": "markdown", + "id": "38d90f55", + "metadata": {}, + "source": [ + "The other high-level function is searching the overlapping sets for a specific (RA, Dec) coordinate." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "45f09318", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We found 4 sets that are within 15.0 arcmin of (351.0695696334572, -4.336293374423113).\n" + ] + }, + { + "data": { + "text/plain": [ + "['set_1', 'set_3', 'set_4', 'set_68']" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ra_dec_search_results1 = ra_dec_search_overlapping_sets(\n", + " df=df1,\n", + " overlapping_sets=overlapping_sets1,\n", + " ra_dec=(351.0695696334572, -4.336293374423113),\n", + " search_radius=15 * u.arcminute,\n", + " verbose=True,\n", + ")\n", + "ra_dec_search_results1" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "8a6c4def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We found 95 matches within 3.0 arcsec of (351.0695696334572, -4.336293374423113).\n" + ] + }, + { + "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", + "
data_idregiondetectoruriutcenter_coordut_datetime
0(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847372525065534...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:20:22.932(351.0694028401149, -4.336598368890197)2019-09-27 00:20:22.932
1(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847381014554984...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:22:51.015(351.0695696334572, -4.336293374423113)2019-09-27 00:22:51.015
2(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847383417970056...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:25:19.136(351.0696571334576, -4.336293374415341)2019-09-27 00:25:19.136
3(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847382159041213...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:27:47.118(351.069611300124, -4.336293374419411)2019-09-27 00:27:47.118
4(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847381374341414...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T00:30:15.537(351.0695696451088, -4.336265319377865)2019-09-27 00:30:15.537
........................
90(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847391753851408...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:02:58.424(351.06998627728365, -4.3363483733857136)2019-09-27 04:02:58.424
91(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847400909178194...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:05:27.654(351.0703196106188, -4.336348373356122)2019-09-27 04:05:27.654
92(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847397935953284...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:07:56.159(351.07019878847524, -4.336321429412502)2019-09-27 04:07:56.159
93(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847392459182945...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:10:25.141(351.069986300126, -4.336293374386118)2019-09-27 04:10:25.141
94(instrument, detector, visit)ConvexPolygon([UnitVector3d(0.9847397036888316...1file:///epyc/users/smotherh/DEEP/PointingGroup...2019-09-27T04:12:52.877(351.07015296679367, -4.336293374371324)2019-09-27 04:12:52.877
\n", + "

95 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " data_id \n", + "0 (instrument, detector, visit) \\\n", + "1 (instrument, detector, visit) \n", + "2 (instrument, detector, visit) \n", + "3 (instrument, detector, visit) \n", + "4 (instrument, detector, visit) \n", + ".. ... \n", + "90 (instrument, detector, visit) \n", + "91 (instrument, detector, visit) \n", + "92 (instrument, detector, visit) \n", + "93 (instrument, detector, visit) \n", + "94 (instrument, detector, visit) \n", + "\n", + " region detector \n", + "0 ConvexPolygon([UnitVector3d(0.9847372525065534... 1 \\\n", + "1 ConvexPolygon([UnitVector3d(0.9847381014554984... 1 \n", + "2 ConvexPolygon([UnitVector3d(0.9847383417970056... 1 \n", + "3 ConvexPolygon([UnitVector3d(0.9847382159041213... 1 \n", + "4 ConvexPolygon([UnitVector3d(0.9847381374341414... 1 \n", + ".. ... ... \n", + "90 ConvexPolygon([UnitVector3d(0.9847391753851408... 1 \n", + "91 ConvexPolygon([UnitVector3d(0.9847400909178194... 1 \n", + "92 ConvexPolygon([UnitVector3d(0.9847397935953284... 1 \n", + "93 ConvexPolygon([UnitVector3d(0.9847392459182945... 1 \n", + "94 ConvexPolygon([UnitVector3d(0.9847397036888316... 1 \n", + "\n", + " uri \n", + "0 file:///epyc/users/smotherh/DEEP/PointingGroup... \\\n", + "1 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "2 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "3 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "4 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + ".. ... \n", + "90 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "91 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "92 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "93 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "94 file:///epyc/users/smotherh/DEEP/PointingGroup... \n", + "\n", + " ut center_coord \n", + "0 2019-09-27T00:20:22.932 (351.0694028401149, -4.336598368890197) \\\n", + "1 2019-09-27T00:22:51.015 (351.0695696334572, -4.336293374423113) \n", + "2 2019-09-27T00:25:19.136 (351.0696571334576, -4.336293374415341) \n", + "3 2019-09-27T00:27:47.118 (351.069611300124, -4.336293374419411) \n", + "4 2019-09-27T00:30:15.537 (351.0695696451088, -4.336265319377865) \n", + ".. ... ... \n", + "90 2019-09-27T04:02:58.424 (351.06998627728365, -4.3363483733857136) \n", + "91 2019-09-27T04:05:27.654 (351.0703196106188, -4.336348373356122) \n", + "92 2019-09-27T04:07:56.159 (351.07019878847524, -4.336321429412502) \n", + "93 2019-09-27T04:10:25.141 (351.069986300126, -4.336293374386118) \n", + "94 2019-09-27T04:12:52.877 (351.07015296679367, -4.336293374371324) \n", + "\n", + " ut_datetime \n", + "0 2019-09-27 00:20:22.932 \n", + "1 2019-09-27 00:22:51.015 \n", + "2 2019-09-27 00:25:19.136 \n", + "3 2019-09-27 00:27:47.118 \n", + "4 2019-09-27 00:30:15.537 \n", + ".. ... \n", + "90 2019-09-27 04:02:58.424 \n", + "91 2019-09-27 04:05:27.654 \n", + "92 2019-09-27 04:07:56.159 \n", + "93 2019-09-27 04:10:25.141 \n", + "94 2019-09-27 04:12:52.877 \n", + "\n", + "[95 rows x 7 columns]" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ra_dec_search_results2 = ra_dec_search_df(\n", + " df=df, ra_dec=(351.0695696334572, -4.336293374423113), search_radius=3 * u.arcsec, verbose=True\n", + ")\n", + "ra_dec_search_results2" + ] + }, { "cell_type": "markdown", "id": "3df17bc4", @@ -2943,7 +3790,9 @@ "\n", "In no particular order:\n", "\n", - "1. User-specified (RA, Dec) pair.\n", + "1. User-specified (RA, Dec) pair:\n", + "- from overlapping_sets (DONE 2/7/2024 COC)\n", + "- from our extracted Butler data (DONE 2/7/2024 COC)\n", "2. Heat map / histogrammed results.\n", "3. Sky patches approach.\n", "4. Reflex correction."