diff --git a/.github/workflows/muler-tests.yml b/.github/workflows/muler-tests.yml index 342802f..4a830a6 100644 --- a/.github/workflows/muler-tests.yml +++ b/.github/workflows/muler-tests.yml @@ -11,8 +11,8 @@ jobs: python-version: [3.9] specutils-version: [1.5, 1.9.1] astropy-version: [5.2] - numpy-version: [1.18, 1.24] - + #numpy-version: [1.18, 1.24] + steps: - uses: actions/checkout@v2 - uses: actions/checkout@v2 diff --git a/docs/requirements_actions.txt b/docs/requirements_actions.txt index b06dca0..88b748b 100644 --- a/docs/requirements_actions.txt +++ b/docs/requirements_actions.txt @@ -16,3 +16,4 @@ bokeh # needed for gollum to install on RTD gollum==0.2.1 numpydoc sphinx-gallery +tynt diff --git a/docs/tutorials/flux_calibration.ipynb b/docs/tutorials/flux_calibration.ipynb new file mode 100644 index 0000000..b91caab --- /dev/null +++ b/docs/tutorials/flux_calibration.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exploratory flux calibration" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from muler.hpf import HPFSpectrum, HPFSpectrumList\n", + "import numpy as np\n", + "import glob\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we have Goldilocks spectra:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "path = 'https://github.com/OttoStruve/muler_example_data/raw/main/HPF/01_A0V_standards/'\n", + "filename = 'Goldilocks_20210212T072837_v1.0_0037.spectra.fits'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can easily read in HPF data for a specific spectral order:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "original_spectrum = HPFSpectrum(file=path+filename, order=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "spectrum = original_spectrum.sky_subtract(method='vector').trim_edges().remove_nans().deblaze().normalize()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can normalize and overplot plot the observed spectrum, sky subtracted spectrum, and the sky emission itself:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABpwAAAMXCAYAAAAnkvaIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AADI0UlEQVR4nOzdd3RU1d7G8Wcmk957D6HX0BN6EwQpFmzYBXvvXruo1977q1e8oF4rioKigHQp0nsPEEhI773NzPsHOhATQpJJoXw/a7nunHP22XtPuEpmnrN/22C1Wq0CAAAAAAAAAAAAGsjY0hMAAAAAAAAAAADA6Y3ACQAAAAAAAAAAAHYhcAIAAAAAAAAAAIBdCJwAAAAAAAAAAABgFwInAAAAAAAAAAAA2IXACQAAAAAAAAAAAHYhcAIAAAAAAAAAAIBdCJwAAAAAAAAAAABgFwInAAAAAAAAAAAA2IXACQAAAAAAAAAAAHYhcAIAAAAAAAAAAIBdCJwAAAAAAAAAAABgFwInAAAAAAAAAAAA2IXACQAAAAAAAAAAAHYhcAIAAAAAAAAAAIBdCJwAAAAAAAAAAABgFwInAAAAAAAAAAAA2IXACQAAAAAAAAAAAHYhcAIAAAAAAAAAAIBdCJwAAAAAAAAAAABgFwInAAAAACc1fPhwGQwGGQwGPfPMM/W695lnnrHdO3z48DqNUdM/np6eio6O1oUXXqj33ntPeXl5tY47efLkWvs70T8//fRTvd7fiVgsFs2dO1c33nijunfvLn9/fzk6OsrNzU2hoaHq16+frrvuOr333nvaunVro4wJAAAAAC2FwAkAAADAaaGwsFCHDh3SnDlzdM899ygqKkqff/55S0+rRmvWrFFMTIwmTJig//73v9q2bZuys7NVWVmpkpISpaamau3atfriiy90zz33qEePHrWGcWeb48PCGTNmtPR0AAAAANSBqaUnAAAAAAD/FBsbq7i4ONux1WpVbm6u1q1bp3379kmS8vPzdf3116ukpES33nprrf116tRJI0eOrNPYbdq0afjEJS1cuFDnn3++SktLbeciIiLUu3dvBQUFyWq1KiMjQ9u2bdPBgwdtbXJzc+0aFwAAAABaEoETAAAAgFPOuHHjTli676efftKUKVNsAc29996r8ePHKyIi4oT99evXT++//34TzLSqnJwcXXXVVbawqX379vrwww81atSoGtsnJyfrp59+0owZM1ReXt7k8wMAAACApkJJPQAAAACnlYsuukj/+9//bMdlZWX68MMPW3BGx3z66afKyMiQJAUGBuqPP/44YdgkSWFhYbrjjju0du1a/fDDD801TQAAAABodAROAAAAAE4748ePV8+ePW3HCxcubLnJHGfBggW211OmTFFwcHCd723btm1TTAkAAAAAmgWBEwAAAIDT0oABA2yvDxw40IIzOSYpKcn2unXr1o3Wb3R0tAwGgwwGgxISEiRJe/bs0QMPPKCuXbvK29tbXl5eiomJ0eOPP67k5OR69W+1WvXjjz/q+uuvV4cOHeTt7S0XFxdFRkbqoosu0meffabKysp69ZmWlqZXX31V5557rqKiouTq6ipXV1dFRUVp7NixevXVV23v5Z/v87PPPrOdmzJliu29H//PP0suDh8+3HZt6dKlkqSUlBS9+OKLiouLU0hIiBwcHOTj42O7JyEhwXZPdHR0nd5XTX8WdWmzd+9e3X///erSpYs8PT3l7u6uvn376t1331VFRUW1PtauXatrr71WHTt2lJubmwICAjRmzBjNnj27TvMEAAAAmht7OAEAAAA4Lfn6+tpe5+fnt+BMjjEYDLbXBw8ebLJxpk2bprvuuktlZWVVzm/fvl3bt2/Xhx9+qGnTpunSSy89aV9bt27V9ddfr82bN1e7lpSUpKSkJM2ePVsvvfSSZs2apS5dutTan8Vi0fPPP69XXnlFxcXF1a4nJiYqMTFR8+bN02OPPaZt27adtM+GmD17tqZMmaKcnJxG77u+ZsyYodtvv922t9ffNmzYoA0bNujnn3/WL7/8ImdnZ5nNZt1+++365JNPqrQtKSnRggULtGDBAt1333166623mvMtAAAAACdF4AQAAADgtHR8kODt7d2CMzmmXbt22rlzpyTps88+04MPPqigoKBGHWPOnDm69957JUmhoaEaOnSoPDw8tG/fPq1cuVJms1l5eXm68sor5eTkpAsuuOCEfS1fvlznn3++LbAzmUzq27evOnbsKEdHRyUkJGjFihUqLS3Vnj17NHDgQK1evVqdO3eusT+z2azLLrtMP/74o+2ck5OTBgwYoOjoaJlMJqWmpmrjxo1KSUmRxWJReXm5re3111+vrKwsLVq0SLt375YkjRw5Up06dao2Vlxc3Anf16pVq/TMM8+ooqJC/v7+Gjp0qAICApSenq5NmzbV8tNtfL/++qvuuusuWa1Wde7cWX379pWjo6PWrVunbdu2STpaEvLuu+/Wf/7zH912222aNm2ajEaj+vfvr06dOqmsrExLliyxrVx7++231bdvX1199dXN+l4AAACA2hA4AQAAADgtrVy50va6McvX2WPixImaM2eOpKMl5fr376/HH39cF198sfz8/BpljIcfflhGo1GvvPKKHnjgARmNxyql79mzR5MmTdKWLVtUWVmpG2+8UTt37lRgYGC1flJTU3X55ZfbwqYrr7xSr732msLDw6u0S0tL0+23364ff/xReXl5mjRpkjZt2iQHB4dqfT7xxBNVwqa77rpLzz77bI3vfe3atfrggw/k6OhoO/fss89KkiZPnmwLnK655hpNnjy5Hj8haerUqTKbzfr3v/+tRx55pMoY/1wV1tTuv/9+eXp66osvvqgW/r377ru28HD69Onq2LGjpk2bppiYGH3zzTdVVn6VlZXphhtu0FdffSVJeuqpp3TVVVdVWVUHAAAAtCQCJwAAAAD18uuvvyozM7PO7deuXdvoc5g7d662bt1qOx45cmSt7desWaO77rrrpP3ecsst6t69e4Pndc011+iDDz7Q+vXrJR0tq3fzzTfrtttuU9euXRUXF6e+fftqwIABiomJaVBYUF5erpdfflkPPfRQtWsdO3bU77//rh49eiglJUWZmZl67bXX9Oqrr1Zr+8QTTygtLU2SdNNNN1Ur4fa34OBgzZw5U+eee66WLFmibdu26fvvv9ekSZOqtNu7d69ee+012/FLL72kRx999ITvIy4urtZVSvaorKzU888/ryeeeKLaNWdn5yYZ80QqKio0b948jRgxotq1e+65R7/++qvmz5+vyspKPfTQQwoJCdGiRYuqhYTOzs76+OOPNX/+fGVlZengwYNau3at+vXr11xvBQAAAKgVgRMAAACAelm3bp3WrVvXYuPPnj27yooXJycn3XHHHbXes3v3btuKmdqMGjXKrsDJZDJp7ty5mjRpkpYuXWo7bzabtXXrVm3dulXTpk2TJPn5+eniiy/WHXfcoV69etV5jDZt2ujBBx884fXAwEA999xzuvnmmyUdXTnz4osvymQ69vEvIyNDX375paSj5QhPth+Qg4ODXnzxRQ0YMECS9OWXX1YLnN566y1Z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wClJPv3pT+exxx7Lfvvtl6Io8qc//Sm77757fvWrX2XUqFE5/vjj88Ybb6Rjx4658MILM3Xq1AwYMGCTjWf27NkZM2ZMhgwZkqqqqmy11VYZNmxYrrjiiixbtqxF+nj22WfzhS98Ibvvvnt69uyZzp07Z+utt86IESPy7W9/O4sXL26RfgAAAAAAADa3iqIoitbqfM2aNfnGN76RSy+9NLW1tamoqEiSFEWRgQMH5he/+EWGDRu2SccwadKknHjiiVm0aFGd5wcPHpzbb7+9rMDryiuvzFe+8pXU1tbWW7Pddtvlt7/9bfbYY49m91OfuXPnprq6OkkyZ86c9O/fv8X7AAAAAAAA3hk2RW7QKnc4lTrv0CHnnXdejjvuuNJ7RVFkyy23zJ133rnJw6Ynnngixx9/fBYtWpTu3bvnkksuybRp03LXXXfl9NNPT5I8//zzGTlyZJYsWdKsPm688caMGTMmtbW16dy5c84+++xMmjQpDz74YP7v//4vBx10UJJk1qxZOfroo+sNvgAAAAAAANqqVg2cXnrppRx00EG56aabkqR0h9Nbb72VAw44IH/4wx82af9nnXVWli1blsrKytx5550ZO3Zshg8fnsMOOyzXXnttvvWtbyVJnnvuuVx11VXN6uPiiy8uHd9888256qqr8sEPfjDDhg3LCSeckClTpuTDH/5wkmTevHm57rrryv9gAAAAAAAAm1GrBU7jx4/PnnvumYceeihFUeToo4/Oyy+/nDFjxqSioiKvvPJKRo4cmS984QtZsWJFi/c/ffr03HvvvUnefqbU8OHDN6gZPXp0hgwZkiT5zne+k1WrVjWpj7feeitPP/10kmTvvffOyJEj66y74IILSsfTpk1rUh8AAAAAAACtbbMHTgsXLsxHP/rRnHbaaVmyZEm6dOmSq6++Orfffnuqq6vzrW99K5MnT051dXWKosgPf/jD7LPPPnn88cdbdBy33npr6XjUqFF11nTo0CEnn3xyadxrA6rGqqmpKR1v7BlQO+64Y+l45cqVTeoDAAAAAACgtW32wGm33XbLLbfckqIosscee+Thhx/OF77whfVqDj300Dz55JP5+Mc/nqIo8txzz2X//ffPuHHjWmwcU6ZMSZJUVVVln332qbfukEMOKR1PnTq1SX306dMnW221VZK3tw+sz4svvlg6HjRoUJP6AAAAAAAAaG2bPXCaN29ekuTss8/OQw89lF122aXOui233DK/+tWvcv3116dHjx6pqanJ2LFjW2wcM2bMSJIMHDgwlZWV9dbtvPPOG1zTFJ/5zGeSJI8++mjuuOOOOmvWPuepY8eOOe2005rcBwAAAAAAQGuqP2nZRPr165frr78+hx9+eKPqTzrppPzbv/1bTjrppPzlL39pkTGsWLEi8+fPT5L0799/o7W9e/dOVVVVli5dmjlz5jS5r6997Wt5+OGHM3ny5Bx33HH5/Oc/n8MPPzx9+vTJSy+9lGuuuSb33XdfOnbsmO9+97ulZ0Y1xdy5czd6fm3IBwAAAAAAsCls9sDpqaeeKm0z11jbbrtt7rvvvnzzm99skTEsXry4dNy9e/cG69cGTkuWLGlyX927d88dd9yRCRMm5Jvf/GauvPLKXHnllevVfPjDH865556b/fbbr8ntJ0l1dXWzrgMAAAAAAGgJmz1wamrYtFZFRUW++tWvtsgYVqxYUTru3Llzg/VdunRJkixfvrxZ/T388MP51a9+Ve9znCZPnpxtttkmQ4YMSc+ePZvVBwAAAAAAQGvZ7M9wagu6du1aOq6pqWmwfuXKlUmSbt26Nbmvm266KYceemjuvvvu7L777rnlllvyxhtvpKamJi+++GIuvfTSrFq1Ktdcc00OOOCAvPLKK03uY86cORt9PfTQQ01uEwAAAAAAoLE2+x1ObUGPHj1Kx43ZJm/p0qVJGrf93rpeffXVnHrqqVm5cmV23XXXTJs2LVVVVaXzAwYMyFe/+tUMGzYsRxxxRJ555pl84QtfyK9//esm9dPQc6gAAAAAAAA2pc0eOA0YMKDZ11ZUVOTFF18sewxdu3ZNnz59Mn/+/MydO3ejtQsXLiwFTk19VtLEiRNL144dO3a9sGldhx9+eA4//PBMnjw5N998cxYuXJjevXs3qS8AAAAAAIDWstkDp7/97W+Nrq2oqEhRFOv9d0sZMmRIpkyZkpkzZ6a2tjaVlXX/UTz33HPrXdMUM2bMKB3vvffeG63dZ599Mnny5KxZsyYvvPBC9ttvvyb1BQAAAAAA0Fo2e+B0yimnNFizdOnSPP/883nqqadSUVGRvfbaK7vvvnuLjuOggw7KlClTsnTp0jzyyCP1Bjz33Xdf6fjAAw9sUh/rhli1tbUbrV21alWd1wEAAAAAALR1mz3ZGD9+fKNrn3766fznf/5nnnnmmXz1q1/NRz7ykRYbx7HHHpvLLrusNKa6Aqc1a9bk+uuvT5L06tUrI0aMaFIfO+ywQ+l4ypQp2W233eqt/fOf/5zk7bu4tt9++yb1AwAAAAAA0Jo6tPYANma33XbL3XffnX79+uXkk09eb3u7cg0bNiwHH3xwkuS6667L/fffv0HNlVdeWdoW74tf/GI6deq03vkJEyakoqIiFRUVufDCCze4fuTIkaVtAC+55JL8/e9/r3Ms1157bR5++OEkyf7775/3vOc9zf5cAAAAAAAAm1ubDpySpHv37jnnnHOyfPnyXH755S3a9tVXX51u3bqltrY2Rx55ZC677LI88MADueeee3LGGWfk3HPPTZIMGjQoo0ePbnL7O++8c0aNGpUk+fvf/5699torl156aaZMmZLHH388v/vd73LiiSfmjDPOSJJ07Ngxl156act9QAAAAAAAgM3gHfGwoH333TdJctddd7Vou3vttVduuOGGnHTSSXnrrbcyduzYDWoGDRqUSZMmpUePHs3q44c//GGWLl2aG264Ia+//nq+9rWv1VlXVVWVa6+9Noceemiz+gEAAAAAAGgtbf4OpyQpiiJJ8uqrr7Z428ccc0yefPLJnH322Rk0aFC22GKL9OrVK0OHDs24cePy2GOPZeDAgc1uv0uXLpk4cWLuvvvunHzyyRk0aFCqqqpSWVmZrbbaKsOHD895552X5557Lp/85Cdb8JMBAAAAAABsHhXF2jSnDbv44otzwQUXpG/fvnnllVdaezjvOHPnzk11dXWSZM6cOenfv38rjwgAAAAAAGgtmyI3aPN3OE2cODGXXXZZKioqctBBB7X2cAAAAAAAAPgnm/0ZTv/5n//ZYM2aNWuycOHCPProo/nHP/6RoihSWVmZr3zlK5thhAAAAAAAADTFZg+cJkyYkIqKikbVrt3tr2fPnvnpT3+aoUOHbsqhAQAAAAAA0AybPXDadtttGwycOnTokB49emSHHXbIIYcckpNOOil9+vTZTCMEAAAAAACgKTZ74PS3v/1tc3cJAAAAAADAJtShtQcAAAAAAADAO5vACQAAAAAAgLIInAAAAAAAACjLJnuG0+zZszdJu9tuu+0maRcAAAAAAIDm2WSB0w477NDibVZUVKS2trbF2wUAAAAAAKD5NlngVBTFpmoaAAAA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WQROAAAAAAAAlEXgBAAAAAAAQFkETgAAAAAAAJRF4AQAAAAAAEBZBE4AAAAAAACUReAEAAAAAABAWQROAAAAAAAAlEXgBAAAAAAAQFkETgAAAAAAAJRF4AQAAAAAAEBZBE4AAAAAAACUReAEAAAAAABAWQROAAAAAAAAlEXgBAAAAAAAQFkETgAAAAAAAJRF4AQAAAAAAEBZBE4AAAAAAACUReAEAAAAAABAWQROAAAAAAAAlEXgBAAAAAAAQFkETgAAAAAAAJRF4AQAAAAAAEBZBE4AAAAAAACUReAEAAAAAABAWQROAAAAAAAAlEXgBAAAAAAAQFkETgAAAAAAAJRF4AQAAAAAAEBZBE4AAAAAAACUReAEAAAAAABAWQROSWbPnp0xY8ZkyJAhqaqqylZbbZVhw4bliiuuyLJly8pq+6233srEiRNz+umnZ++9906vXr3SuXPnbL311jn00ENzxRVX5M0332yZDwIAAAAAANAKKoqiKFp7EK1p0qRJOfHEE7No0aI6zw8ePDi33357BgwY0OS277jjjhx33HFZuXLlRuu22Wab/OpXv8qIESOa3EdjzJ07N9XV1UmSOXPmpH///pukHwAAAAAAoO3bFLlBu77D6Yknnsjxxx+fRYsWpXv37rnkkksybdq03HXXXTn99NOTJM8//3xGjhyZJUuWNLn9N954IytXrkyHDh1y1FFH5dvf/nbuvvvuPProo/ntb3+bj3/840mSV199NR/60Ify+OOPt+THAwAAAAAA2CwqW3sAremss87KsmXLUllZmTvvvDPDhw8vnTvssMOy00475dxzz81zzz2Xq666Kueff36T2u/UqVPOOOOMjB07Nttuu+165/baa68cc8wxOfDAA/Pf//3fWbZsWUaPHp277rqrRT4bAAAAAADA5tJut9SbPn16hg0bliQ544wz8qMf/WiDmjVr1mS33XbLjBkz0rt377z66qvp1KlTi49l3333zcMPP5wOHTrktddey3ve854Wbd+WegAAAAAAwFq21GtBt956a+l41KhRddZ06NAhJ598cpJk4cKFuffeezfJWA499NAkbwdcL7/88ibpAwAAAAAAYFNpt4HTlClTkiRVVVXZZ5996q075JBDSsdTp07dJGNZuXJl6bhDh3b7PwkAAAAAAPAO1W6f4TRjxowkycCBA1NZWf8fw84777zBNS3tvvvuS5JUVlZm4MCBTb5+7ty5Gz0/b968Zo0LAAAAAACgMdpl4LRixYrMnz8/SRrcl7B3796pqqrK0qVLM2fOnBYfy6RJk/Lkk08mSY466qj07NmzyW2s3WcRAAAAAACgNbTL/dsWL15cOu7evXuD9VVVVUmSJUuWtOg4FixYkM997nNJko4dO+biiy9u0fYBAAAAAAA2h3Z7h9NanTt3brC+S5cuSZLly5e32BhWr16dE088MbNmzUqSfP3rX89ee+3VrLYauvNq3rx5GTZsWLPaBgAAAAAAaEi7DJy6du1aOq6pqWmwfuXKlUmSbt26tdgYzjzzzPzhD39IkowcOTLnnXdes9tqaFtAAAAAAACATaldbqnXo0eP0nFjtslbunRpksZtv9cYX/3qV3PttdcmSQ466KD8+te/TseOHVukbQAAAAAAgM2tXQZOXbt2TZ8+fZIkc+fO3WjtwoULS4FTdXV12X2PGzcu3/zmN5Mke++9d37/+9+36J1TAAAAAAAAm1u7DJySZMiQIUmSmTNnpra2tt665557boNrmuuHP/xhvvKVr5Ta+uMf/5gtt9yyrDYBAAAAAABaW7sNnA466KAkb2+X98gjj9Rbd99995WODzzwwGb39/Of/zyf//znkyQDBgzI5MmTS3dZAQAAAAAAvJO128Dp2GOPLR2PHz++zpo1a9bk+uuvT5L06tUrI0aMaFZfN998c0aNGpWiKNK/f//cddddee9739ustgAAAAAAANqadhs4DRs2LAcffHCS5Lrrrsv999+/Qc2VV16ZGTNmJEm++MUvplOnTuudnzBhQioqKlJRUZELL7ywzn7uvPPOnHDCCVm9enX69u2byZMnZ/vtt2/RzwIAAAAAANCaKlt7AK3p6quvzoEHHpjly5fnyCOPzNixYzNixIgsX748EydOzLXXXpskGTRoUEaPHt3k9h944IEcd9xxqampSadOnfLtb387q1atytNPP13vNf3790+vXr2a+5EAAAAAAAA2u3YdOO2111654YYbctJJJ+Wtt97K2LFjN6gZNGhQJk2alB49ejS5/T/84Q9ZtmxZkmTVqlU58cQTG7xm/PjxOfXUU5vcFwAAAAAAQGtpt1vqrXXMMcfkySefzNlnn51BgwZliy22SK9evTJ06NCMGzcujz32WAYOHNjawwQAAAAAAGizKoqiKFp7EGxac+fOTXV1dZJkzpw56d+/fyuPCAAAAAAAaC2bIjdo93c4AQAAAAAAUB6BEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgVOS2bNnZ8yYMRkyZEiqqqqy1VZbZdiwYbniiiuybNmyFutn4sSJOeqoo9KvX7907do122+/fT71qU/lgQceaLE+AAAAAAAANreKoiiK1h5Ea5o0aVJOPPHELFq0qM7zgwcPzu23354BAwY0u48VK1bkYx/7WH7/+9/Xeb5Dhw658MILc9555zW7j42ZO3duqqurkyRz5sxJ//79N0k/AAAAAABA27cpcoN2fYfTE088keOPPz6LFi1K9+7dc8kll2TatGm56667cvrppydJnn/++YwcOTJLlixpdj+f/vSnS2HTiBEjcuutt+ahhx7Kddddlx133DFr1qzJ+eefn5/+9Kct8rkAAAAAAAA2p3Z9h9OIESNy7733prKyMn/+858zfPjw9c5ffvnlOffcc5MkF110Uc4///wm93Hffffl0EMPTZIcc8wxueWWW9KxY8fS+fnz52efffbJ7Nmz07t377z00kvp1atXsz9TXdzhBAAAAAAArOUOpxY0ffr03HvvvUnevgPpn8OmJBk9enSGDBmSJPnOd76TVatWNbmfb33rW0mSjh075oc//OF6YVOS9OnTJ+PGjUuSLFy4MNddd12T+wAAAAAAAGhN7TZwuvXWW0vHo0aNqrOmQ4cOOfnkk5O8HQatDagaa8mSJbnrrruSJEcccUS9CeGHP/zh9OzZM0ly8803N6kPAAAAAACA1tZuA6cpU6YkSaqqqrLPPvvUW3fIIYeUjqdOndqkPh566KGsXLlyg3b+WefOnbP//vuXrmnOnVQAAAAAAACtpbK1B9BaZsyYkSQZOHBgKivr/2PYeeedN7imqX38czv19XPnnXemtrY2f/3rX7PLLrs0up+5c+du9PycOXNKx/PmzWt0uwAAAAAAwLvPullBbW1ti7TZLgOnFStWZP78+UnS4IOwevfunaqqqixdunS94KYx1q1vqJ+1D+dae11TAqd1r23IsGHDGl0LAAAAAAC8u73++uvZfvvty26nXW6pt3jx4tJx9+7dG6yvqqpK8vYzmTZVP2v7aE4/AAAAAAAArand3uG0VufOnRus79KlS5Jk+fLlm6yftX00p5+G7rxasWJFnnvuuWyzzTbZeuutN7qFICRv30659m64hx56KP369WvlEQGbi/kP7Zs1ANov8x/aN2sAtF/mf/tVW1ub119/PUmy++67t0ib7TJ56Nq1a+m4pqamwfqVK1cmSbp167bJ+lnbR3P6aWi7vuTtZ1VBc/Tr169R/x8D3n3Mf2jfrAHQfpn/0L5ZA6D9Mv/bn5bYRm9d7XJLvR49epSOG7N93dKlS5M0bvu95vazto/m9AMAAAAAANCa2mXg1LVr1/Tp0ydJMnfu3I3WLly4sBQGVVdXN6mfddPghvpZd1u8pvYDAAAAAADQmtpl4JQkQ4YMSZLMnDkztbW19dY999xzG1zTWLvsskud7Wysn8rKStvfAQAAAAAA7yjtNnA66KCDkry9ld0jjzxSb919991XOj7wwAOb1Me+++6bzp07b9DOP6upqckDDzywwTUAAAAAAADvBO02cDr22GNLx+PHj6+zZs2aNbn++uuTJL169cqIESOa1EePHj1y+OGHJ0kmT55c77Z6N998c956660kyXHHHdekPgAAAAAAAFpbuw2chg0bloMPPjhJct111+X+++/foObKK6/MjBkzkiRf/OIX06lTp/XOT5gwIRUVFamoqMiFF15YZz9jxoxJktTW1uZzn/tcVq9evd75+fPn58tf/nKSt0Ot0047razPBQAAAAAAsLm128ApSa6++up069YttbW1OfLII3PZZZflgQceyD333JMzzjgj5557bpJk0KBBGT16dLP6OOyww/KJT3wiSfLb3/42RxxxRH7729/m4Ycfzvjx47P//vtn9uzZSZJvfvOb6d27d8t8OAAAAAAAgM2koiiKorUH0Zp+97vf5aSTTiptaffPBg0alEmTJmXgwIEbnJswYUJGjRqVJLngggvqvctp+fLl+ehHP5rbb7+9zvMdOnTIeeedV+/1AAAAAAAAbVm7vsMpSY455pg8+eSTOfvsszNo0KBsscUW6dWrV4YOHZpx48blscceqzNsaopu3bpl0qRJ+eUvf5kjjjgiffv2TefOnVNdXZ1PfvKTmTp1qrAJAAAAAAB4x2r3dzgBAAAAAABQnnZ/hxMAAAAAAADlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETtHE1NTW57rrrcvTRR6dfv37p0qVLunfvnsGDB+c///M/88ADD9R77YQJE1JRUdGo14QJE5o8tjvuuGO9Ni688MJGXffMM8/kv/7rvzJw4MB069YtW2+9df7t3/4tP/7xj1NbW9vkccC7WVtbA1atWpUJEyZk5MiR2XbbbdOlS5f06dMnu+++e0477bT8+te/brANawA0Tlua/3feeWdOOOGEDBgwIFtssUW6du2a6urqHHvssbnxxhtTFEWjPpP5D41Xzhrwzx566KGceeaZGTJkSHr27Jnu3btnxx13zMiRI3PVVVfl9ddf3+j1y5Yty+WXX55hw4Zlq622Svfu3TNkyJCMGTMms2fPbvQ4rAHQOG1h/s+ePTvXXHNNPv7xj2fw4MGpqqpK165d079///zHf/xHfvWrXzVp3pr/0HhtYQ2oj+8CaVABtFmzZ88udt999yLJRl9nn312sWbNmg2uHz9+fIPXrn2NHz++SWNbsmRJsd12263XxgUXXNDgdT/96U+LLl261DuO/fff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l+y77765/vrr88ADD2Ty5Mm56KKLcsghh6SmpiZ77rlnrrrqqo22d9999+W1117LqlWr8sYbb+TBBx/MJZdckoEDB+bHP/5xg+P5v//7v/zhD39Ir169cuWVVzbps8ydOzdFUSRJ+vfvv9Ha6urq0vGcOXOa1A+8m7SVNeDZZ58tHT/wwAM58MADc+edd653V9OCBQty3XXXZc8998yf//znDdqwBkDTtJX5nyT/+7//m+222y4LFizI3nvvnauuuir33ntvpk6dmh/96Ef513/917z88st5z3vek1/+8pcb/Maj+Q9NV+4asO7P7m7dumXvvffO1VdfnYULF5ber62tzZ///Od86EMfyjnnnFPnONbOw6qqqvTq1WujY147f19//fX1tvaxBkDTtJX53xiXX355amtrk6S0Hda6zH9oura2BvgukGZpzQdIAQ175plnik9/+tNFRUVF6UF7a1/bbLNNcdVVVxVLliyp89rx48cXAwYMKMaMGVP85je/KR566KHioYceKiZOnFh87GMfW6/NH//4x/WO4Y033ij69u1bJCmuueaa9c415kGBDz30UKnmy1/+8kY/77Jly0q1H/rQhzb+hwPtQGuvAf/+7/9equnSpUtRUVFRnHvuucWLL75YrFy5spg5c2YxZsyYUlvvec97irlz567XhjUAmqe15/9ar7/+enHRRRcV3bt332AcnTp1KkaPHl3MmjWrzmvNf2i+5q4BN99883o/u5MUBxxwQHHfffcVy5YtKxYsWFD88pe/LPr161eq++e/4xdFUeyyyy6lvhpy/PHHl9qaP39+6X1rADRPa8//hjzwwANFZWVlkaTo379/sXTp0g1qzH9ovrawBvgukOYSOEEbVlNTU3zta18rLfB1vfbdd9/i97//fZ3Xv/nmm8WaNWvqbf93v/td0alTpyJJscUWWxTz5s2rs27UqFFFkmK//fYrVq9evd65xvyQ+fOf/1yqOe+88zb6mVevXl2qPfzwwzdaC+92bWENOPzww9fr7/LLL6+zrUsvvbRU87nPfW69c9YAaLq2MP/X+tnPflb64rmu13bbbVdcccUVdfZn/kPzlLMG/PznP1+vbp999imWL1++Qd0LL7xQVFVVFUmKrbfeuli2bNl65wcMGFAkKaqrqxsc76c+9alSf3PmzCm9bw2ApmsL839jXnnllaJ///5FkqKioqK466676qwz/6F52soa4LtAmsuWetBGLV26NO9///tzySWX5I033si5556bGTNmZOXKlVm0aFHuvPPOHHTQQZk+fXqOOeaYXH311Ru0seWWW6aioqLePj70oQ+VHvy3bNmyXHfddRvU3HvvvRk/fnw6duyYH/3oR/U+DHRjunbtWjquqanZaO26W3B069atyX3Bu0VbWQPWnb/9+/fP2WefXWdbX/rSl9KvX78kycSJE0u3zv9zG9YAaFhbmf9JMmbMmJxyyil59tlnc+yxx+Yvf/lLlixZkuXLl+fRRx/NqFGjMmvWrIwZMyYf//jH19tuMzH/oTnKXQPWnXdJcskll2zwXpLstNNO+exnP5vk7a3wJk+eXGc7Dc3dpP75aw2Apmkr878+ixcvzsiRI0vPZbn00ktz2GGH1Vlr/kPTtZU1wHeBlEPgBG3UBRdcUHoWynXXXZdx48Zl5513TufOndOzZ88cccQRueeeezJixIgURZFzzjknTz75ZJP7Of3000tfSN13333rnVu5cmXOOOOMJMl///d/Z88992zWZ+nRo0fpeMmSJRutXbp0aem4e/fuzeoP3g3awhqQrD9/jzjiiHTs2LHOdiorK0v/2HzjjTfy8ssv19mGNQAa1lbm/+9///vSXu2nnnpqbrnllhxwwAGpqqpK165ds9dee+V///d/c9555yVJfv3rX+eaa65Zrw3zH5qu3DVg3XnXuXPnjBgxot6+jjrqqNLx9OnT1zu3tp2G5m5S//y1BkDTtJX5X5cVK1bkP/7jP/LII48kSc4555x85Stfqbfe/IemawtrgO8CKZfACdqgoigyfvz4JMmgQYNyyimn1FlXWVmZiy++OEmyZs2a0jVN0bdv3/Tp0ydJ8ve//329czfffHNeeOGFVFZWZpdddsnEiRM3eN19992l+qeffrr0/rpfNq/7cMC1vwlVn3UfDrjuQwOhPWkra0Cy/jxsyoM+X3vttTqvswbAxrWl+b/uXU//8z//U287Y8eOLf3D8Kc//el658x/aJqWWAPWnT/bbLNNOnfuXG9/9f3sTv7//F26dGnefPPNjY577fzdeuut06VLlw3aSKwB0JC2NP//WW1tbY4//vjcc889SZLTTjut9Esp9TH/oWnayhrgu0DKVdnaAwA29Oqrr2bBggVJkr322mujtfvss0/p+LnnnmtWf+tufbWutbe01tbW5vTTT2+wnd/85jf5zW9+kyQZP358dthhhyRv/3ZCdXV15syZ0+AY1z0/ZMiQRo0f3m3ayhqQJLvuumvpePXq1RttZ93zlZX//68Y1gBovLY0/2fMmJHk7X+svu9976u3rmvXrtl1113z4IMPbjAO8x+apiXWgJ122imdOnXKqlWrmv2zO0l22WWX0t/tn3vuuey///51tlFbW5sXX3wxyYZz1xoAjdeW5v+61qxZk0996lP53e9+lyT5+Mc/nh//+McbbTsx/6Gp2soa4LtAyuUOJ2iD1l3oa2trN1q7atWqOq9rrNdeey1vvPFGkuS9731vk69vrIMOOihJ8vzzz+eVV16pt27dLX0OPPDATTYeaMva0hrwb//2b6XjtV8m1Wfd8//85bQ1ABqnLc3/tW02NI51x1LXOMx/aLyWWAM6deqU4cOHJ3n7y6t1t6n5Z4352Z3Uve3mWg8//HCpj7rmrjUAGqctzf91nXHGGZk4cWKSt58B+fOf/7zRz3Mx/6Hx2uoaUA5rQPskcII2aKuttkrPnj2TJPfff/9Gf9Csuyiv/S2Cprj22mtLv918yCGHrHfu1FNPTVEUG32tvaU+eXuv2bXvn3rqqeu1deyxx5aOJ0yYUOdYli1blhtvvDHJ279ROWjQoCZ/Hng3aCtrwNo21/521R//+McsW7asznYWL16cP/3pT0mSHXfcMf369VvvvDUAGqetzf/k7eeyrb3bqS4LFizI008/Xe84zH9ovJZaAz7ykY8kefu3l2+77bZ627j55ptLxwcffPB65w499NBsueWWSZKf/exn9d4Rue68Pu644zY4bw2AxmlL83+tc845p7Rd7uGHH56bbropnTp1auCT/H/mPzReW1kDfBdI2QqgTTrhhBOKJEWS4sILL6yzZsGCBcUuu+xSqvvjH/9YOvfyyy8Xjz766Eb7+N3vfld07ty5SFJ07dq1mDt3bpPHec8995T6v+CCC+qtq6mpKXbcccciSdGzZ89i5syZG9SceeaZpbbGjx/f5LHAu0lbWgNuuOGGUh//9V//VWfNpz/96VLN5ZdfvsF5awA0XluZ/z/+8Y9L7R955JHFypUrN6hZvXp1cdJJJ5XqvvrVr25QY/5D05S7BhRFUSxevLjo27dvkaTYbrvtildeeWWDNu65556iY8eORZJit912K9asWbNBzXnnnVfq41vf+tYG56dNm1ZUVlYWSYpDDjmkzrFaA6Dx2tL8v+CCC0p9HHDAAcWSJUua/HnMf2iatrQGbIzvAtkYgRO0UTNmzCi22GKL0qJ7zDHHFDfddFPx6KOPFtOmTSuuuuqqYtttty2dP/zww9e7fu3iP3z48OLSSy8tbr/99uLhhx8upk+fXtxwww3Fxz72saKioqJ0/fe///1mjbOxP2SKoigmTZpUdOjQoUhSbLPNNsX3vve94sEHHyz+8Ic/FB/5yEdK7Rx00EFFbW1ts8YD7xZtbQ344Ac/WKodOXJkcdtttxWPPvpoceuttxZHH3106dxee+1VLF++vM42rAHQOG1l/q9cubLYeeedS3W77757ce211xYPPvhg8fDDDxfXX399MXz48NL5bbbZpnj99dfrbMv8h8Yrdw1Ya+LEiaW5Xl1dXfzgBz8opk+fXkyZMqUYO3Zs0a1btyJJUVlZWUydOrXONt56661i0KBBpb4+85nPFHfffXdx//33F5deemnRvXv3IknRrVu34rHHHqv3M1kDoHHayvz/7ne/W+rjfe97XzF16tTiqaee2uirpqamzrGY/9B4bWUNaIjvAtkYgRO0YX/605+KPn36lBbf+l6HHXZYsWDBgvWuXXfx39hriy22KH784x83e4xN+SFTFEVx7bXXln6juq7XsGHD6v2yCtqbtrQGLF68uDjyyCM32ta+++5bzJs3b6PtWAOgcdrK/P/b3/5W/Ou//muDbe2www4b/bK5KMx/aIpy1oB1ff/739/ovOvevXtx6623bnQsf/3rX4uddtqp3jZ69uxZ/O53v2vwM1kDoHHawvw/5JBDGvV3iXVfL7/8cr1jMf+h8drCGtAQ3wWyMRVFUc9GzECb8MYbb+S6667LHXfckWeeeSZvvvlmKisr8y//8i/Zd99988lPfjL//u//noqKivWuW7x4cX7729/m/vvvz8MPP5x58+Zl/vz5qa2tTe/evbPrrrvm8MMPz2mnnZa+ffs2e3z33ntvRowYkeTtfVsvvPDCBq95+umn893vfjd33XVX/vGPf6SqqipDhgzJiSeemNNOO61ZDz6Hd6u2tgZMnDgxP/vZz/L444/njTfeSK9evbLnnnvmhBNOyMknn5yOHTs22IY1ABqnrcz/VatWZeLEibnpppvy6KOP5vXXX09RFNlqq62yxx575Nhjj83JJ5+cqqqqBtsy/6HxmrsG/LNnnnkmP/jBD/KnP/0pf//739OxY8cMGDAgRx99dM4666wNnrtYl6VLl+YHP/hBfv3rX2fmzJmpqalJdXV1PvjBD+aLX/xitttuu0Z9JmsANE5rz/9DDz10vWfENMbLL7+c7bffvt7z5j80XmuvAQ3xXSAbI3ACAAAAAACgLB1aewAAAAAAAAC8swmcAAAAAAAAKIvACQAAAAAAgLIInAAAAAAAACiLwAkAAAAAAICyCJwAAAAAAAAoi8AJAAAAAACAsgicAAAAAAAAKIvACQAAAAAAgLIInAAAAAAAACiLwAkAAAAAAICyCJwAAAAAAAAoi8AJAAAAAACAsgicAAAAAAAAKIvACQAAAAAAgLIInAAAAAAAACiLwAkAAAAAAICyCJwAAAAAAAAoi8AJAACABj3++OM5/PDD061bt/Tr1y9f/vKXU1NT09rDAgAA2oiKoiiK1h4EAAAAbdezzz6b/fbbL0uWLFnv/eOOOy4333xzK40KAABoS9zhBAAAwEadf/75WbJkSU488cT85S9/ya9+9av069cvt9xyS6ZMmdLawwMAANqAytYeAAAAAG3btGnTMnDgwFx//fXp0KFDDjjggHTq1Ckf/ehHc//99+fggw9u7SECAACtzB1OAAAAbFTnzp3TvXv3dOjw//8J2atXryTJFlts0UqjAgAA2hKBEwAAQBtQFEV69uyZDh06ZJtttsnxxx+fWbNmtWgfq1atyuDBg1NRUZEbbrih0de9//3vz+OPP55x48Zl8eLFefbZZzNmzJh06NAhRx99dJ3XnHnmmamoqMgpp5zSUsMHAADasIqiKIrWHgQAAEB7N3PmzOy0007rvbfLLrvkmWeeabE+rrrqqowePTpDhgzJ008/vd4dSxvzyiuv5MADD8xLL71Ueq+ioiKXX355Ro8eXec1c+bMycCBA7Nq1ao8+OCD2XfffVvkMwAAAG2TO5wAAADagH79+uWpp57KH/7wh+ywww5JkmeffTaPPPJIi7S/ZMmSXHbZZUmS888/v9FhU5L8y7/8S4YMGbLeex/72MfqDZuSpLq6OqecckqKosjXv/715g0aAAB4xxA4AQAAtAFVVVXZbbfdctRRR+Xiiy8uvf/444+3SPvXXHNN5s+fn+rq6hx//PFNuvbuu+/OpEmTSuNMkr/+9a8NXrc2kLrzzjszffr0Jo4YAAB4JxE4AQAAtDEHHHBA6fjpp58uu73Vq1fn+9//fpLkhBNOaNLdTUVR5Etf+lKSZMSIETnuuOOSvH331erVqzd67eDBg7P33nsnSa6++urmDB0AAHiHEDgBAAC0Mdtvv3169OiRpGUCpz/96U+ZPXt2kuSkk05q0rW/+MUv8uijj5ae2bTrrrsmSVauXJkXXnihwetPPPHEJMlvfvObLFq0qIkjBwAA3ikETgAAAG1MRUVFdtpppyQtEzjdeOONSZKddtopu+++e6OvW7FiRen5SyeccEL22Wef7LbbbqXzTz75ZINtfOQjHym1ddtttzVl2AAAwDuIwAkAAKCNeeSRR0rPbnrllVfyxhtvlNXePffckyTZf//9m3Tdd77zncyePTtdunTJJZdckiSlO5yS5Kmnnmqwje222y79+vVLktx7771N6h8AAHjnEDgBAAC0IatXr85nPvOZrFmzpvTeM8880+z25s6dm7/97W9Jkn333bfR182fPz+XXXZZkuTzn/98tt9++yRvb/dXVVWVpHGB07r9TpkypdH9AwAA7ywCJwAAgDbke9/7Xh599NH13itnW71p06aVjvfaa69GX3fRRRflrbfeSu/evfO1r32t9H5FRUWGDBmSpHFb6iXJPvvskySZOXNmXnvttUaPAQAAeOcQOAEAALQRc+fOzXnnnZckOeCAA0rvlxM4zZ07t3Tct2/fRl3z17/+NT/+8Y+TJF/72tfSu3fv9c6vfY7TrFmzsnjx4gbbW7ffv//9740aAwAA8M4icAIAAGgjvvCFL2TJkiXp0aNHbrjhhvTq1StJeYHT66+/Xjr+5+CoPl/+8pezatWqbLfddvn85z+/wfm1z3EqiqJR2+pttdVWdY4HAAB49xA4AQAAtAG//e1vc+uttyZJLr300vTv3z+77757kvICpwULFpSOGxM4TZ06NbfccktpHF26dNmgZm3glDTuOU7r9vvGG280WA8AALzzCJwAAABa2dKlS/OFL3whSbLffvvlzDPPTJJS4LRw4cL84x//aFbbXbt2LR0vX768wfoxY8Ykefu5SyeccEKdNesGTo15jtO6/Xbr1q3BegAA4J1H4AQAANDKzj///MyePTudOnXKT37yk3To8PY/1dYGTknz73LaeuutS8fr3u1UlxtuuCEPPvhgkuSRRx5Jhw4dUlFRscFru+22K13TmDuc1u133fEAAADvHgInAACAVvTEE0/k6quvTvL23UXrhkx77LFH6bglAqeFCxfWW1dTU5OxY8c2uf3GBE7r9itwAgCAd6fK1h4AAABAe7VmzZp85jOfyerVq7PjjjvmvPPOW+/8brvtVjpubuC0boD1wgsvZM8996yz7vvf/35eeumlVFRU5Ac/+EGDz3u6/vrrc8cdd+TNN9/MnDlzUl1dXW/tCy+8kCSpqqrKgAEDmv4hAACANk/gBAAA0EquueaaPPTQQ0mSH/3oRxs836hnz57ZbrvtMmvWrGYHTkOHDk23bt2yfPnyTJ8+Pccff/wGNQsXLswll1ySJDn22GPz2c9+tsF2X3nlldxxxx1J3n6O08YCp+nTpydJ9t9//1RW+mcoAAC8G9lSDwAAoBXMmzcvX/va15IkJ598ct7//vfXWbf2DqVnn302RVE0uZ/OnTtn2LBhSVIKt/7Z//zP/2TBggWpqKjIhRde2Kh2Bw0aVDre2LZ6K1euzJNPPpkkOfjggxs5agAA4J1G4AQAANAKvvjFL2bRokXp06dPrrzyynrr1j7HaenSpXn55Zeb1dfIkSOTvB04LV68eL1zL7/8cr7//e8nST7ykY+s99yojVk3cFobKNXlz3/+c1atWrXeOAAAgHcfgRMAAMBmdscdd+TXv/51kuTKK69Mnz596q1d9xlMzd1W75Of/GQ6duyYFStW5JZbblnv3Fe/+tXU1NQ06e6mJNlhhx3SqVOnJBu/w+n//u//kiSDBw/O0KFDmz54AADgHUHgBAAAsBktX748n/vc55Ikhx9+eE4++eSN1rdE4PS+970v//Ef/5Ek+eUvf1l6/6GHHsqNN96YJDn++OOz6667NrrNjh07Zscdd0ySPP/886mpqdmgZt2A68wzz2zW2AEAgHeGiqI5m4ADAADwjvLAAw9k+PDh6dixY2bOnJntt99+k/f5i1/8Ip/61Key1VZb5W9/+1t69OixyfsEAABahzucAAAA2oH9998/H/jAB7J69epcdtllm7y/NWvW5NJLL02SjBkzRtgEAADvcu5wAgAAaCeeeuqp7LXXXunQoUNmzpyZbbfddpP1dcMNN+QTn/hEqqur8/zzz6dbt26brC8AAKD1Vbb2AAAAANg8dt9990yYMCEzZ87M7NmzN2ngtHr16lxwwQU57LDDhE0AANAOuMMJAAAAAACAsniGEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFAWgRMAAAAAAABlETgBAAAAAABQFoETAAAAAAAAZRE4AQAAAAAAUBaBEwAAAAAAAGUROAEAAAAAAFCW/wd6BGa8A1M4EQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 395, + "width": 846 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "spectrum.plot();" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from gollum.phoenix import PHOENIXGrid" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing Teff=10200K|log(g)=4.00|Z=+0.0: 100%|██| 2/2 [00:00<00:00, 28.38it/s]\n" + ] + } + ], + "source": [ + "grid = PHOENIXGrid(teff_range=(10_000, 10_200), logg_range=(4,4), Z_range=(0,0))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(grid)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "raw_model1, raw_model2 = grid[0], grid[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finding: we should allow the `grid` object to accept all of these arguments:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "#grid.rotationally_broaden(130.0)\n", + "#grid.instrumental_broaden(55_000)\n", + "#grid.resample(spectrum)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "model1 = raw_model1.rotationally_broaden(130.0).instrumental_broaden(55_000).resample(spectrum)\n", + "model2 = raw_model2.rotationally_broaden(130.0).instrumental_broaden(55_000).resample(spectrum)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "factor = 0.2" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "mixture_model = factor * model1 + (1-factor) * model2" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABpwAAAMXCAYAAAAnkvaIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AADejElEQVR4nOzdd3RU1d7G8Wcmk947gQRC770jIAiCCnYRsYHXrlixYgG9ir2XFxUv2HsXBQQUpUjvvQUSEkhCepv+/jEwEBNIJpMQkO9nLRYz5+yz956AODPP2b9tcDqdTgEAAAAAAAAAAAA1ZKzvCQAAAAAAAAAAAODURuAEAAAAAAAAAAAArxA4AQAAAAAAAAAAwCsETgAAAAAAAAAAAPAKgRMAAAAAAAAAAAC8QuAEAAAAAAAAAAAArxA4AQAAAAAAAAAAwCsETgAAAAAAAAAAAPAKgRMAAAAAAAAAAAC8QuAEAAAAAAAAAAAArxA4AQAAAAAAAAAAwCsETgAAAAAAAAAAAPAKgRMAAAAAAAAAAAC8QuAEAAAAAAAAAAAArxA4AQAAAAAAAAAAwCsETgAAAAAAAAAAAPAKgRMAAAAAAAAAAAC8QuAEAAAAAAAAAAAArxA4AQAAAAAAAAAAwCsETgAAAAAAAAAAAPAKgRMAAACAKg0aNEgGg0EGg0GTJ0/26NrJkye7rx00aFC1xqjsV2hoqJKTk3XhhRfqjTfeUH5+/nHHHTdu3HH7O9av77//3qPXdywOh0MzZ87U9ddfr06dOik6Olq+vr4KCgpSQkKCevfurWuvvVZvvPGG1q1bVytjAgAAAEB9IXACAAAAcEooKirSnj179OOPP+rOO+9U48aN9eGHH9b3tCq1dOlSdezYUSNHjtT//vc/rV+/Xjk5ObLZbCotLdX+/fu1bNkyffTRR7rzzjvVuXPn44Zxp5ujw8IZM2bU93QAAAAAVIOpvicAAAAAAP/Us2dP9erVy/3c6XQqLy9Py5cv1/bt2yVJBQUFGjt2rEpLS3XzzTcft782bdpoyJAh1Rq7WbNmNZ+4pLlz5+r8889XWVmZ+1hiYqK6deumuLg4OZ1OZWVlaf369dq9e7e7TV5enlfjAgAAAEB9InACAAAAcNI577zzjlm67/vvv9d1113nDmjuuusujRgxQomJicfsr3fv3nrzzTfrYKbl5ebm6sorr3SHTS1bttTbb7+toUOHVto+PT1d33//vWbMmCGLxVLn8wMAAACAukJJPQAAAACnlIsuukgff/yx+7nZbNbbb79djzM64v3331dWVpYkKTY2Vn/99dcxwyZJatiwoW677TYtW7ZM33zzzYmaJgAAAADUOgInAAAAAKecESNGqEuXLu7nc+fOrb/JHGXOnDnux9ddd53i4+OrfW3z5s3rYkoAAAAAcEIQOAEAAAA4JfXt29f9eNeuXfU4kyPS0tLcj5s2bVpr/SYnJ8tgMMhgMCglJUWStHXrVt17771q3769wsPDFRYWpo4dO2rixIlKT0/3qH+n06nvvvtOY8eOVatWrRQeHq6AgAAlJSXpoosu0gcffCCbzeZRnwcOHNDzzz+vs88+W40bN1ZgYKACAwPVuHFjnXvuuXr++efdr+Wfr/ODDz5wH7vuuuvcr/3oX/8suTho0CD3uT/++EOSlJGRoSlTpqhXr15q0KCBfHx8FBER4b4mJSXFfU1ycnK1XldlfxbVabNt2zbdc889ateunUJDQxUcHKwePXro9ddfl9VqrdDHsmXLdM0116h169YKCgpSTEyMhg8frh9++KFa8wQAAABONPZwAgAAAHBKioyMdD8uKCiox5kcYTAY3I93795dZ+NMmzZN48ePl9lsLnd8w4YN2rBhg95++21NmzZNl112WZV9rVu3TmPHjtWaNWsqnEtLS1NaWpp++OEHPfPMM/r222/Vrl274/bncDj01FNP6bnnnlNJSUmF86mpqUpNTdWsWbP08MMPa/369VX2WRM//PCDrrvuOuXm5tZ6356aMWOGbr31VvfeXoetXLlSK1eu1E8//aSff/5Z/v7+stvtuvXWW/Xee++Va1taWqo5c+Zozpw5uvvuu/XKK6+cyJcAAAAAVInACQAAAMAp6eggITw8vB5nckSLFi20adMmSdIHH3ygCRMmKC4urlbH+PHHH3XXXXdJkhISEjRw4ECFhIRo+/btWrRokex2u/Lz8zVmzBj5+fnpggsuOGZff/75p84//3x3YGcymdSjRw+1bt1avr6+SklJ0cKFC1VWVqatW7eqX79+WrJkidq2bVtpf3a7XaNGjdJ3333nPubn56e+ffsqOTlZJpNJ+/fv16pVq5SRkSGHwyGLxeJuO3bsWB08eFDz5s3Tli1bJElDhgxRmzZtKozVq1evY76uxYsXa/LkybJarYqOjtbAgQMVExOjzMxMrV69+jg/3dr3yy+/aPz48XI6nWrbtq169OghX19fLV++XOvXr5fkKgl5xx136N1339Utt9yiadOmyWg0qk+fPmrTpo3MZrN+//1398q1V199VT169NBVV111Ql8LAAAAcDwETgAAAABOSYsWLXI/rs3ydd64+OKL9eOPP0pylZTr06ePJk6cqEsuuURRUVG1Msb9998vo9Go5557Tvfee6+MxiOV0rdu3arRo0dr7dq1stlsuv7667Vp0ybFxsZW6Gf//v26/PLL3WHTmDFj9MILL6hRo0bl2h04cEC33nqrvvvuO+Xn52v06NFavXq1fHx8KvT5yCOPlAubxo8fryeeeKLS175s2TK99dZb8vX1dR974oknJEnjxo1zB05XX321xo0b58FPSJo0aZLsdrv++9//6sEHHyw3xj9XhdW1e+65R6Ghofroo48qhH+vv/66OzycPn26WrdurWnTpqljx476/PPPy638MpvN+s9//qNPP/1UkvTYY4/pyiuvLLeqDgAAAKhPBE4AAAAAPPLLL78oOzu72u2XLVtW63OYOXOm1q1b534+ZMiQ47ZfunSpxo8fX2W/N910kzp16lTjeV199dV66623tGLFCkmusno33nijbrnlFrVv3169evVSjx491LdvX3Xs2LFGYYHFYtGzzz6r++67r8K51q1b67ffflPnzp2VkZGh7OxsvfDCC3r++ecrtH3kkUd04MABSdINN9xQoYTbYfHx8frqq6909tln6/fff9f69ev19ddfa/To0eXabdu2TS+88IL7+TPPPKOHHnromK+jV69ex12l5A2bzaannnpKjzzySIVz/v7+dTLmsVitVs2aNUuDBw+ucO7OO+/UL7/8otmzZ8tms+m+++5TgwYNNG/evAohob+/v9555x3Nnj1bBw8e1O7du7Vs2TL17t37RL0UAAAA4LgInAAAAAB4ZPny5Vq+fHm9jf/DDz+UW/Hi5+en22677bjXbNmyxb1i5niGDh3qVeBkMpk0c+ZMjR49Wn/88Yf7uN1u17p167Ru3TpNmzZNkhQVFaVLLrlEt912m7p27VrtMZo1a6YJEyYc83xsbKyefPJJ3XjjjZJcK2emTJkik+nIx7+srCx98sknklzlCKvaD8jHx0dTpkxR3759JUmffPJJhcDp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m4zACQAAYLVUXZ2MPCl5cnjdrtv+28le/5e0qmiUYTWqQiF5/ubktmPrfu2pryUdezT8mAAAPoU+dYHTG2+8kUMPPTSPP/54CoVCysvLU11dnbKysqy99tr5/e9/n89//vON1v/QoUNz//33p6KiIg8++GCGDBmy1PmLL744p512WpLkvPPOy9lnn13nPrbYYou88MILSZK///3vGTZs2DI1+++/f2677bYki+6GOvnkOn57qwYCJwAAgNXc2L8nNx5a9+vWG5R87c9Jp7UbfkwNZf6sZOQpybN/qfu1G++dHPyXpLxVw48LAOBT7FMVOF133XU54YQTMmvWrBQKhXz+85/P1VdfnV/96le57LLLisHT8ccfn4svvjjt2rVr0P7HjBlT3K7vuOOOy29+85tlaqqrq7P55ptn7Nix6dq1a9577720bt261n18/PHHxbuVttlmmzz55JPLrXvuuefymc98Jsmi8OmWW26p69tZKYETAADAp8ScacmlmyRVc+t3/daHJ3v+OOnQrWHHVRfzZiYPXpz85xf1b+Pr9yTrb99gQwIAaGkaIzcoL7mFOpo2bVq++tWv5phjjsnMmTPTtm3bXH755bnrrrvSu3fv/OxnP8uoUaPSu3fvFAqFXHnlldl2223zzDPPNOg4br/99uLx0Ucfvdya8vLyHHHEEcVx33///XXqY/78+cXjlT0DaqONNioez5s3r059AAAA0IK075r86L3k3OnJV6+r+/VP35D8bMPk3DX++/PQZcn0txt+rIVCMuPd5InfJxf1+W9/F65Xv7Bp0DeSsz5c9N6FTQAAzc4q39B58803z7vvvptCoZAtt9wyf/7zn7PpppsuVbPbbrvlueeey7e+9a3ceOONefnll7PDDjvkvPPOyw9+8IMGGcdDDz2UJKmsrMy22267wrpdd921eDx69Ojsueeete6je/fu6datW6ZOnZo33nhjhXWvv/568bh///61bh8AAIAWbPOvLPqpXpj8+/+S0ZfVr517z1v0s6TO6y362WRYMmNysvZmSaF60U/1wkVhUqE6KSxc9N/3Xko+mpBMezP5uAHDq/WHJIfekrSt+zOVAQBYtVb5lnrl5eUpKyvLiSeemAsvvDBt2rRZaf0f//jHfPe7383HH3+csrKyLFy4sEHGsdZaa2XKlCn5zGc+s9K7p6ZNm5Zu3RZtNXDAAQfkpptuqlM/p59+en76058mSe6666584QtfWKbmgAMOyC233JJWrVrl+eefz8CBA+vUR01sqQcAANBCVFcnj12V/POMph5J/W11WPLFi5M2HZp6JAAAn1qNkRus8jucevbsmeuvvz677757reoPO+ywfPazn81hhx2W//znPw0yhrlz52bKlClJUuNvYteuXVNZWZlZs2Zl4sSJde7rzDPPzBNPPJFRo0Zlv/32y3e/+93svvvu6d69e954441cddVVeeCBB9KqVav88pe/rFfYNGnSpJWenzx5cp3bBAAAYDVUXp4M+c6inySZ8lpyy9HJu8837bhWpkP35KA/JhsMaeqRAABQglUeOD3//PPFO4Zqa/31188DDzxQvFOoVDNmzCged+xY8235iwOnmTNn1rmvjh075u67787w4cPz05/+NJdeemkuvfTSpWq+8pWv5LTTTsv229dvD+rFKSQAAAAspfvGybdG//fX0yclD1yUPHV9041p868mQ89I1tyo5loAAFYbqzxwqmvYtFhZWVlOP/30BhnD3Llzi8c1bemXJG3btk2SzJkzp179PfHEE/nLX/6ywuc4jRo1KmuvvXYGDhyYzp0716sPAAAAqNEavZL/+dWin8UWViXvvZBMfCyZ8OiiZzBVVyVvP5m065J02zApK0/KWv3//5Yn5a2SsrL//rqsVbJwfjLhkWSdLZJ1t1n03KeeWyY9Nktat2uytwwAwKqxygOn5qBdu//+RXf+/Pk11s+bNy9J0r59+zr3dcstt+Swww7LvHnzsuWWW+a8887LZz/72XTq1CkTJ07MjTfemJ/85Ce56qqr8uCDD2bUqFFZZ5116tRHTVv9TZ48OYMHD67z2AEAAGgBWlUk62616Gf745p6NAAArKZaZODUqVOn4nFttsmbNWtWktptv7ek9957L0cddVTmzZuXzTbbLA8//HAqKyuL5/v27ZvTTz89gwcPzp577pkXX3wx3/ve93LzzTfXqZ+GeJgXAAAAAABAfa3ywKlv3771vrasrCyvv/56yWNo165dunfvnilTpmTSpEkrrZ02bVoxcKrrs5JGjBhRvPaMM85YKmxa0u67757dd989o0aNym233ZZp06ala9eudeoLAAAAAACgqazywOmtt96qdW1ZWVkKhcJSv24oAwcOzEMPPZRx48alqqoqFRXL/614+eWXl7qmLsaOHVs83mabbVZau+2222bUqFGprq7Oq6++mu23375OfQEAAAAAADSVVR44HXnkkTXWzJo1K6+88kqef/75lJWVZeutt84WW2zRoOPYeeed89BDD2XWrFl58sknVxjwPPDAA8XjnXbaqU59LBliVVVVrbR2wYIFy70OAAAAAACguVvlycZ1111X69oXXnghX//61/Piiy/m9NNPz/77799g49h3331z4YUXFse0vMCpuro6119/fZKkS5cuGTp0aJ362HDDDYvHDz30UDbffPMV1j744INJFt3F1adPnzr1AwAAAAAA0JTKm3oAK7P55pvn3//+d3r27Jkjjjhiqe3tSjV48ODssssuSZJrr702jzzyyDI1l156aXFbvBNOOCGtW7de6vzw4cNTVlaWsrKynHvuuctcP2zYsOI2gOeff37efvvt5Y7lmmuuyRNPPJEk2WGHHbLmmmvW+30BAAAAAACsas06cEqSjh075uSTT86cOXNy8cUXN2jbl19+edq3b5+qqqrstddeufDCC/Poo4/mvvvuy3HHHZfTTjstSdK/f/+ccsopdW5/k002ydFHH50kefvtt7P11lvnggsuyEMPPZRnnnkmd955Zw499NAcd9xxSZJWrVrlggsuaLg3CAAAAAAAsAqsFg8L2m677ZIk9957b4O2u/XWW+fGG2/MYYcdlo8//jhnnHHGMjX9+/fPyJEj06lTp3r1ceWVV2bWrFm58cYb88EHH+TMM89cbl1lZWWuueaa7LbbbvXqBwAAAAAAoKk0+zuckqRQKCRJ3nvvvQZve5999slzzz2Xk046Kf3790+HDh3SpUuXDBo0KBdddFGefvrp9OvXr97tt23bNiNGjMi///3vHHHEEenfv38qKytTUVGRbt26ZciQITnrrLPy8ssv55BDDmnAdwYAAAAAALBqlBUWpznN2E9+8pOcc8456dGjR959992mHs5qZ9KkSendu3eSZOLEienVq1cTjwgAAAAAAGgqjZEbNPs7nEaMGJELL7wwZWVl2XnnnZt6OAAAAAAAAHzCKn+G09e//vUaa6qrqzNt2rQ89dRTeeedd1IoFFJRUZEf/vCHq2CEAAAAAAAA1MUqD5yGDx+esrKyWtUu3u2vc+fO+d3vfpdBgwY15tAAAAAAAACoh1UeOK2//vo1Bk7l5eXp1KlTNtxww+y666457LDD0r1791U0QgAAAAAAAOpilQdOb7311qruEgAAAAAAgEZU3tQDAAAAAAAAYPUmcAIAAAAAAKAkAicAAAAAAABK0mjPcJowYUKjtLv++us3SrsAAAAAAADUT6MFThtuuGGDt1lWVpaqqqoGbxcAAAAAAID6a7TAqVAoNFbTAAAAAAAANCONFjhdd911jdU0AAAAAAAAzUijBU5HHnlkYzUNAAAAAABAM1Le1AMAAAAAAABg9dZodzglyfXXX58k2XfffdO5c+fG7AoAAAAAAIAm0qiB01FHHZWysrIMGjQom2666TLnP/jgg1x11VVJkrPPPrsxhwIAAAAAAEAjadIt9d5///2ce+65Oe+885pyGAAAAAAAAJTAM5wAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSVKyKTq688sr06NFjmdfff//94vGPf/zjWrV19tlnN9i4AAAAAAAAKF1ZoVAoNFbj5eXlKSsra9A2Fy5c2KDttQSTJk1K7969kyQTJ05Mr169mnhEAAAAAABAU2mM3KDR73BqyDyrocMrAAAAAAAASteogdN9993XmM0DAAAAAADQDDRq4LTrrrs2ZvMAAAAAAAA0A+VNPQAAAAAAAABWbwInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAqckEyZMyKmnnpqBAwemsrIy3bp1y+DBg3PJJZdk9uzZDdrXqFGjctRRR6Vfv36prKzMGmuskf79++erX/1qrrrqqsycObNB+wMAAAAAAGhsZYVCodDUg2hKI0eOzKGHHprp06cv9/yAAQNy1113pW/fviX1M23atBx99NG54447Vlr39NNPZ6uttiqpr0+aNGlSevfunSSZOHFievXq1aDtAwAAAAAAq4/GyA0qSm5hNfbss8/mwAMPzOzZs9OxY8ecfvrpGTp0aObMmZMRI0bkt7/9bV555ZUMGzYsY8aMSceOHevVz/Tp07PnnnvmySefTJIMGzYsX/va19KvX78sXLgw48ePz5gxY3LLLbc05NsDAAAAAABYJVr0HU5Dhw7N/fffn4qKijz44IMZMmTIUucvvvjinHbaaUmS8847L2effXa9+jniiCNyww03pKKiIn/84x9z0EEHLbeuUChk4cKFqaho2BzQHU4AAAAAAMBijZEbtNhnOI0ZMyb3339/kuQb3/jGMmFTkpxyyikZOHBgkuQXv/hFFixYUOd+Ro8enRtuuCFJ8qMf/WiFYVOSlJWVNXjYBAAAAAAA0NhabOB0++23F4+PPvro5daUl5fniCOOSLLoGUyLA6q6uOKKK5IkHTt2zCmnnFLn6wEAAAAAAJq7Fhs4PfTQQ0mSysrKbLvttius23XXXYvHo0ePrlMf8+fPzx133JEk+cIXvlB8BlRVVVXGjx+fCRMmZP78+XUdOgAAAAAAQLPSYgOnsWPHJkn69eu30m3sNtlkk2Wuqa1nn302c+fOTZIMGTIk7777bo4++uh06dIlffr0yQYbbJA11lgjX/ziF/Pwww/X410AAAAAAAA0vRb5wKC5c+dmypQpSVLjg7C6du2aysrKzJo1KxMnTqxTPy+99NJSfW6xxRbFfpd8/e67784///nPXHrppTnxxBPr1Eey6OFeKzN58uQ6twkAAAAAAFBbLTJwmjFjRvF48TZ3K7M4cJo5c2ad+pk6dWrx+Lzzzsu8efPypS99Keeee24233zzTJ8+Pbfeemt++MMf5uOPP87JJ5+cAQMG5Atf+EKd+undu3ed6gEAAAAAABpSi9xSb/E2d0nSpk2bGuvbtm2bJJkzZ06d+pk1a1bxeN68edlnn31yxx13ZNttt03btm3To0ePfPvb387IkSNTXl6eQqGQ0047LYVCoU79AAAAAAAANKUWeYdTu3btisfz58+vsX7evHlJkvbt29e7nyS5+OKLU16+bMa388475ytf+UpuueWWvPDCC3nhhReyxRZb1Lqfmrb6mzx5cgYPHlzr9gAAAAAAAOqiRQZOnTp1Kh7XZpu8xXcq1Wb7vRX1s+GGG2bAgAErrN17771zyy23JEnGjBlTp8CppudQAQAAAAAANKYWuaVeu3bt0r179yTJpEmTVlo7bdq0YuBU12clLVlfUyi0ZO37779fp34AAAAAAACaUosMnJJk4MCBSZJx48alqqpqhXUvv/zyMtfU1mabbVY8Xrhw4UprlzxfUdEibzwDAAAAAABWUy02cNp5552TLNou78knn1xh3QMPPFA83mmnnerUxwYbbJD1118/SfL666+vtHbJ8+utt16d+gEAAAAAAGhKLTZw2nfffYvH11133XJrqqurc/311ydJunTpkqFDh9a5n/333z9J8t577+Xhhx9eYd1tt91WPN5ll13q3A8AAAAAAEBTabGB0+DBg4vBzrXXXptHHnlkmZpLL700Y8eOTZKccMIJad269VLnhw8fnrKyspSVleXcc89dbj8nnnhi2rVrlyT53//93+LzoJb0xz/+Mffff3+SZNiwYTU+7wkAAAAAAKA5abGBU5Jcfvnlad++faqqqrLXXnvlwgsvzKOPPpr77rsvxx13XE477bQkSf/+/XPKKafUq4/1118/P/7xj5MkTz75ZAYPHpw//OEPefLJJ/Pvf/873/3ud3PUUUclSTp37pyf//znDfLeAAAAAAAAVpWKph5AU9p6661z44035rDDDsvHH3+cM844Y5ma/v37Z+TIkenUqVO9+/n+97+fqVOn5qKLLspLL71UDJiW1KNHj9x+++3ZeOON690PAAAAAABAU2jRdzglyT777JPnnnsuJ510Uvr3758OHTqkS5cuGTRoUC666KI8/fTT6devX8n9XHjhhfnPf/6Tww8/PH369Enbtm2zxhprZLvttstPfvKTvPrqqxkyZEgDvCMAAAAAAIBVq6xQKBSaehA0rkmTJqV3795JkokTJ3pGFAAAAAAAtGCNkRu0+DucAAAAAAAAKI3ACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwCnJhAkTcuqpp2bgwIGprKxMt27dMnjw4FxyySWZPXt2o/Q5efLkdOnSJWVlZSkrK8tuu+3WKP0AAAAAAAA0toqmHkBTGzlyZA499NBMnz69+Nrs2bMzZsyYjBkzJr/73e9y1113pW/fvg3a7/e+972l+gQAAAAAAFhdteg7nJ599tkceOCBmT59ejp27Jjzzz8/Dz/8cO69994ce+yxSZJXXnklw4YNy8yZMxus3zvvvDO33nprevTo0WBtAgAAAAAANJUWHTideOKJmT17dioqKnLPPffkjDPOyJAhQ/K5z30u11xzTX72s58lSV5++eVcdtllDdLnzJkz853vfCdJcskllzRImwAAAAAAAE2pxQZOY8aMyf33358k+cY3vpEhQ4YsU3PKKadk4MCBSZJf/OIXWbBgQcn9nnHGGZk4cWKGDh2aww8/vOT2AAAAAAAAmlqLDZxuv/324vHRRx+93Jry8vIcccQRSZJp06YVA6r6evzxx/PrX/86bdq0yVVXXVVSWwAAAAAAAM1Fiw2cHnrooSRJZWVltt122xXW7brrrsXj0aNH17u/qqqqfPOb30x1dXV+8IMfZMCAAfVuCwAAAAAAoDlpsYHT2LFjkyT9+vVLRUXFCus22WSTZa6pj0suuSTPPvtsNtpoo5xxxhn1bgcAAAAAAKC5WXHS8ik2d+7cTJkyJUnSq1evldZ27do1lZWVmTVrViZOnFiv/t544438+Mc/TpJceeWVadeuXb3aWZFJkyat9PzkyZMbtD8AAAAAAIAltcjAacaMGcXjjh071li/OHCaOXNmvfo77rjjMmfOnBx00EHZa6+96tXGyvTu3bvB2wQAAAAAAKitFrml3ty5c4vHbdq0qbG+bdu2SZI5c+bUua/rr78+o0aNSufOnfPzn/+8ztcDAAAAAAA0dy3yDqclt7SbP39+jfXz5s1LkrRv375O/UyZMiWnnHJKkuT8889Pz54963R9bdW01d/kyZMzePDgRukbAAAAAACgRQZOnTp1Kh7XZpu8WbNmJand9ntLOvnkkzNlypQMGjQoxx9/fN0GWQc1PYcKAAAAAACgMbXIwKldu3bp3r17pkyZkkmTJq20dtq0acXAqS7PSnrnnXdyww03JEk+97nP5aabblpp/fvvv58RI0YkSTbccMNsv/32te4LAAAAAACgKbXIwClJBg4cmIceeijjxo1LVVVVKiqW/1vx8ssvL3VNbS25Vd/PfvazGuvHjh2bgw8+OEly5JFHCpwAAAAAAIDVRnlTD6Cp7LzzzkkWbZf35JNPrrDugQceKB7vtNNOjT4uAAAAAACA1U2LDZz23Xff4vF111233Jrq6upcf/31SZIuXbpk6NChtW6/T58+KRQKNf4stuuuuxZfGz58eL3eEwAAAAAAQFNosYHT4MGDs8suuyRJrr322jzyyCPL1Fx66aUZO3ZskuSEE05I69atlzo/fPjwlJWVpaysLOeee26jjxkAAAAAAKA5arHPcEqSyy+/PDvttFPmzJmTvfbaK2eccUaGDh2aOXPmZMSIEbnmmmuSJP37988pp5zSxKMFAAAAAABonlp04LT11lvnxhtvzGGHHZaPP/44Z5xxxjI1/fv3z8iRI9OpU6cmGCEAAAAAAEDz12K31Ftsn332yXPPPZeTTjop/fv3T4cOHdKlS5cMGjQoF110UZ5++un069evqYcJAAAAAADQbJUVCoVCUw+CxjVp0qT07t07STJx4sT06tWriUcEAAAAAAA0lcbIDVr8HU4AAAAAAACURuAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETgAAAAAAAJRE4AQAAAAAAEBJBE4AAAAAAACUROAEAAAAAABASQROAAAAAAAAlETgBAAAAAAAQEkETkkmTJiQU089NQMHDkxlZWW6deuWwYMH55JLLsns2bNLavvjjz/OiBEjcuyxx2abbbZJly5d0qZNm6y11lrZbbfdcskll+Sjjz5qmDcCAAAAAADQBMoKhUKhqQfRlEaOHJlDDz0006dPX+75AQMG5K677krfvn3r3Pbdd9+d/fbbL/PmzVtp3dprr52//OUvGTp0aJ37qI1Jkyald+/eSZKJEyemV69ejdIPAAAAAADQ/DVGbtCi73B69tlnc+CBB2b69Onp2LFjzj///Dz88MO59957c+yxxyZJXnnllQwbNiwzZ86sc/sffvhh5s2bl/Ly8uy99975+c9/nn//+9956qmn8re//S0HHXRQkuS9997Ll770pTzzzDMN+fYAAAAAAABWiYqmHkBTOvHEEzN79uxUVFTknnvuyZAhQ4rnPve5z2XjjTfOaaedlpdffjmXXXZZzj777Dq137p16xx33HE544wzsv766y91buutt84+++yTnXbaKf/7v/+b2bNn55RTTsm9997bIO8NAAAAAABgVWmxW+qNGTMmgwcPTpIcd9xx+c1vfrNMTXV1dTbffPOMHTs2Xbt2zXvvvZfWrVs3+Fi22267PPHEEykvL8/777+fNddcs0Hbt6UeAAAAAACwmC31GtDtt99ePD766KOXW1NeXp4jjjgiSTJt2rTcf//9jTKW3XbbLcmigOvNN99slD4AAAAAAAAaS4sNnB566KEkSWVlZbbddtsV1u26667F49GjRzfKWObNm1c8Li9vsf+TAAAAAAAAq6kW+wynsWPHJkn69euXiooV/zZssskmy1zT0B544IEkSUVFRfr161fn6ydNmrTS85MnT67XuAAAAAAAAGqjRQZOc+fOzZQpU5Kkxn0Ju3btmsrKysyaNSsTJ05s8LGMHDkyzz33XJJk7733TufOnevcxuJ9FgEAAAAAAJpCi9y/bcaMGcXjjh071lhfWVmZJJk5c2aDjmPq1Kn5zne+kyRp1apVfvKTnzRo+wAAAAAAAKtCi73DabE2bdrUWN+2bdskyZw5cxpsDAsXLsyhhx6a8ePHJ0l+9KMfZeutt65XWzXdeTV58uQMHjy4Xm0DAAAAAADUpEUGTu3atSsez58/v8b6efPmJUnat2/fYGM4/vjj849//CNJMmzYsJx11ln1bqumbQEBAAAAAAAaU4vcUq9Tp07F49pskzdr1qwktdt+rzZOP/30XHPNNUmSnXfeOTfffHNatWrVIG0DAAAAAACsai0ycGrXrl26d++eJJk0adJKa6dNm1YMnHr37l1y3xdddFF++tOfJkm22Wab/P3vf2/QO6cAAAAAAABWtRYZOCXJwIEDkyTjxo1LVVXVCutefvnlZa6pryuvvDI//OEPi23985//zBprrFFSmwAAAAAAAE2txQZOO++8c5JF2+U9+eSTK6x74IEHisc77bRTvfu74YYb8t3vfjdJ0rdv34waNap4lxUAAAAAAMDqrMUGTvvuu2/x+LrrrltuTXV1da6//vokSZcuXTJ06NB69XXbbbfl6KOPTqFQSK9evXLvvfdm3XXXrVdbAAAAAAAAzU2LDZwGDx6cXXbZJUly7bXX5pFHHlmm5tJLL83YsWOTJCeccEJat2691Pnhw4enrKwsZWVlOffcc5fbzz333JODDz44CxcuTI8ePTJq1Kj06dOnQd8LAAAAAABAU6po6gE0pcsvvzw77bRT5syZk7322itnnHFGhg4dmjlz5mTEiBG55pprkiT9+/fPKaecUuf2H3300ey3336ZP39+WrdunZ///OdZsGBBXnjhhRVe06tXr3Tp0qW+bwkAAAAAAGCVa9GB09Zbb50bb7wxhx12WD7++OOcccYZy9T0798/I0eOTKdOnerc/j/+8Y/Mnj07SbJgwYIceuihNV5z3XXX5aijjqpzXwAAAAAAAE2lxW6pt9g+++yT5557LieddFL69++fDh06pEuXLhk0aFAuuuiiPP300+nXr19TDxMAAAAAAKDZKisUCoWmHgSNa9KkSendu3eSZOLEienVq1cTjwgAAAAAAGgqjZEbtPg7nAAAAAAAACiNwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicApyYQJE3Lqqadm4MCBqaysTLdu3TJ48OBccsklmT17doP1M2LEiOy9997p2bNn2rVrlz59+uTwww/Po48+2mB9AAAAAAAArGplhUKh0NSDaEojR47MoYcemunTpy/3/IABA3LXXXelb9++9e5j7ty5OeCAA/L3v/99uefLy8tz7rnn5qyzzqp3HyszadKk9O7dO0kyceLE9OrVq1H6AQAAAAAAmr/GyA1a9B1Ozz77bA488MBMnz49HTt2zPnnn5+HH3449957b4499tgkySuvvJJhw4Zl5syZ9e7nG9/4RjFsGjp0aG6//fY8/vjjufbaa7PRRhuluro6Z599dn73u981yPsCAAAAAABYlVr0HU5Dhw7N/fffn4qKijz44IMZMmTIUucvvvjinHbaaUmS8847L2effXad+3jggQey2267JUn22Wef/PWvf02rVq2K56dMmZJtt902EyZMSNeuXfPGG2+kS5cu9X5Py+MOJwAAAAAAYDF3ODWgMWPG5P7770+y6A6kT4ZNSXLKKadk4MCBSZJf/OIXWbBgQZ37+dnPfpYkadWqVa688sqlwqYk6d69ey666KIkybRp03LttdfWuQ8AAAAAAICm1GIDp9tvv714fPTRRy+3pry8PEcccUSSRWHQ4oCqtmbOnJl77703SbLnnnuuMCH8yle+ks6dOydJbrvttjr1AQAAAAAA0NRabOD00EMPJUkqKyuz7bbbrrBu1113LR6PHj26Tn08/vjjmTdv3jLtfFKbNm2yww47FK+pz51UAAAAAAAATaWiqQfQVMaOHZsk6devXyoqVvzbsMkmmyxzTV37+GQ7K+rnnnvuSVVVVV577bVsuummte5n0qRJKz0/ceLE4vHkyZNr3S4AAAAAAPDps2RWUFVV1SBttsjAae7cuZkyZUqS1PggrK5du6aysjKzZs1aKripjSXra+pn8cO5Fl9Xl8BpyWtrMnjw4FrXAgAAAAAAn24ffPBB+vTpU3I7LXJLvRkzZhSPO3bsWGN9ZWVlkkXPZGqsfhb3UZ9+AAAAAAAAmlKLvcNpsTZt2tRY37Zt2yTJnDlzGq2fxX3Up5+a7ryaO3duXn755ay99tpZa621VrqFICSLbqdcfDfc448/np49ezbxiIBVxfyHls0aAC2X+Q8tmzUAWi7zv+WqqqrKBx98kCTZYostGqTNFpk8tGvXrng8f/78GuvnzZuXJGnfvn2j9bO4j/r0U9N2fcmiZ1VBffTs2bNW/x8DPn3Mf2jZrAHQcpn/0LJZA6DlMv9bnobYRm9JLXJLvU6dOhWPa7N93axZs5LUbvu9+vazuI/69AMAAAAAANCUWmTg1K5du3Tv3j1JMmnSpJXWTps2rRgG9e7du079LJkG19TPktvi1bUfAAAAAACAptQiA6ckGThwYJJk3LhxqaqqWmHdyy+/vMw1tbXpppsut52V9VNRUWH7OwAAAAAAYLXSYgOnnXfeOcmireyefPLJFdY98MADxeOddtqpTn1st912adOmzTLtfNL8+fPz6KOPLnMNAAAAAADA6qDFBk777rtv8fi6665bbk11dXWuv/76JEmXLl0ydOjQOvXRqVOn7L777kmSUaNGrXBbvdtuuy0ff/xxkmS//farUx8AAAAAAABNrcUGToMHD84uu+ySJLn22mvzyCOPLFNz6aWXZuzYsUmSE044Ia1bt17q/PDhw1NWVpaysrKce+65y+3n1FNPTZJUVVXlO9/5ThYuXLjU+SlTpuQHP/hBkkWh1jHHHFPS+wIAAAAAAFjVWmzglCSXX3552rdvn6qqquy111658MIL8+ijj+a+++7Lcccdl9NOOy1J0r9//5xyyin16uNzn/tcvva1ryVJ/va3v2XPPffM3/72tzzxxBO57rrrssMOO2TChAlJkp/+9Kfp2rVrw7w5AAAAAACAVaSsUCgUmnoQTenOO+/MYYcdVtzS7pP69++fkSNHpl+/fsucGz58eI4++ugkyTnnnLPCu5zmzJmTr371q7nrrruWe768vDxnnXXWCq8HAAAAAABozlr0HU5Jss8+++S5557LSSedlP79+6dDhw7p0qVLBg0alIsuuihPP/30csOmumjfvn1GjhyZP/3pT9lzzz3To0ePtGnTJr17984hhxyS0aNHC5sAAAAAAIDVVou/wwkAAAAAAIDStPg7nAAAAAAAACiNwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJygmZs/f36uvfbafP7zn0/Pnj3Ttm3bdOzYMQMGDMjXv/71PProoyu8dvjw4SkrK6vVz/Dhw+s8trvvvnupNs4999xaXffiiy/mW9/6Vvr165f27dtnrbXWymc/+9lcffXVqaqqqvM44NOsua0BCxYsyPDhwzNs2LCsv/76adu2bbp3754tttgixxxzTG6++eYa27AGQO00p/l/zz335OCDD07fvn3ToUOHtGvXLr17986+++6bm266KYVCoVbvyfyH2itlDfikxx9/PMcff3wGDhyYzp07p2PHjtloo40ybNiwXHbZZfnggw9Wev3s2bNz8cUXZ/DgwenWrVs6duyYgQMH5tRTT82ECRNqPQ5rANROc5j/EyZMyFVXXZWDDjooAwYMSGVlZdq1a5devXrly1/+cv7yl7/Uad6a/1B7zWENWBGfBVKjAtBsTZgwobDFFlsUkqz056STTipUV1cvc/11111X47WLf6677ro6jW3mzJmFDTbYYKk2zjnnnBqv+93vfldo27btCsexww47FKZMmVKnscCnVXNbA5599tnC5ptvvtJ21lhjjZW2YQ2A2mku83/evHmFAw88sMY2dtttt8JHH3200vdk/kPtlboGLDZ37tzCMcccUygrK1tpO3/9619X2Ma4ceMKAwYMWOmf/SNHjqzxPVkDoHaaw/w/66yzarwuSWHQoEGF8ePH1/iezH+oveawBqyIzwKpjYoAzVJVVVWGDRuW559/Pkmy5ZZb5uSTT86AAQMyY8aMjB49OpdeemlmzZqVn//85+nZs2e+//3vr7C9f/7zn1l33XVXeL5Xr151Gt9ZZ52V8ePHp0ePHnn//fdrdc0///nPfPOb30x1dXXWXnvtnHnmmdl+++0zderU/Pa3v81tt92WRx99NF/5yldy3333pbzcTZi0XM1tDXjuuecydOjQTJ06NW3atMnRRx+dL3zhC+nVq1c++uijjB8/Pvfee28eeuihlY7BGgA1a07z/8QTT8xNN92UJOnRo0dOO+20bLPNNmndunWef/75XHTRRRk/fnzuv//+HHLIIRk5cuQKx2D+Q+001Bowf/787Lfffrn77ruTJLvsskuOOOKIDBw4MBUVFRk/fnyeffbZld6dPHPmzHzpS1/KK6+8kiQ59thj87WvfS3t27fPfffdlwsvvDDTp0/PAQcckEceeSRbbrnlctuxBkDtNJf5/84776RQKKSysjL77bdfdt9992y88cZp165dxo4dm1/+8pcZM2ZMnnjiieyxxx556qmn0rFjx+W2Zf5D7TWXNWBFfBZIrTR14gUs3y233FJM+ocMGVKoqqpapuaJJ54otG7dupCk0LVr18KCBQuWOr/kt5vffPPNBhvbk08+WWjVqlWhbdu2hWuuuaZW32pYsGBBoV+/foUkhc6dOxfGjRu3TM3xxx9fbOsPf/hDg40XVkfNaQ2YM2dOoX///oUkhZ49exaef/75FdbOmzdvua9bA6D2msv8f++99wrl5eXFPiZOnLhMzfTp0wt9+vQp9vXkk08uU2P+Q900xBpQKCy6Q2FxO5dccslK+5w/f/5yXz/nnHOKbfzsZz9b5vzDDz9cqKioKCQpDB06dLltWAOg9prL/D/ttNMKF110UeHjjz9e7jVVVVVL3QH94x//eLl15j/UTXNZA5bHZ4HUlsAJmqmTTjqpuOD+7W9/W2HdfvvtV6z75IfAjRE4VVVVFbbZZptCksJ5551XuO+++2r1h8xNN91UrLvwwguXWzNr1qxC165dC0kKm2++eYOMF1ZXzWkN+MlPflJs57777qtXG9YAqL3mMv/vuOOOYhsnn3zyCusuv/zyYt2vfvWrZc6b/1A3DbEGvP7668UPo4466qh6jWP+/PmFLl26FJIUBg4cWFi4cOFy64477rjiOJ544ollzlsDoPaay/yvjSlTphTatGlTSFLYcsstl1tj/kPdNNc1wGeB1IV71KCZmj9/fvG4b9++K6zbaKONisfz5s1r1DElyc9//vM89dRT6d+/f37wgx/U+rrbb7+9eHzUUUctt6ZDhw458MADkyQvvPBCXnvttVKGCqu15rIGLFy4ML/5zW+SJLvttlt22223erVjDYDaay7zv6HGYf5D3TTE3LvmmmuyYMGClJWV5eyzz67XOO6///589NFHSZIjjzxyhVvcLDmvb7vttmXOWwOg9prL/K+NNddcs7iN5uuvv77cGvMf6qa5rgE+C6QuBE7QTPXv3794/MYbb6ywbvFf7MrKyrLxxhs36pjeeuutnHPOOUmSK6+8Mm3btq31tYuf6zJgwICss846K6zbddddi8ejR4+u50hh9ddc1oCHH344b7/9dpLkgAMOKL4+e/bsjBs3LpMnT051dXWN7VgDoPaay/yv6zg+ec1i5j/UTUOsAYufyTBo0KBsuOGGSZLq6upMmjQpb775ZubMmVPjOJZ8LuOS8/OTBg0alMrKyiTLn7vWAKi95jL/a2vxB90rCqTNf6ib5rgG+CyQuhI4QTN18MEHp3PnzkmSiy66KAsXLlym5umnny4+nPtrX/tasX55jjrqqKy99tpp06ZNunfvnh122CE/+tGPih8k18a3v/3tzJ49O4ceemh23333Wl83c+bMTJo0KUmyySabrLR2yfNjx46tdR/wadNc1oBHH320eDxkyJA8/vjj2XvvvdOpU6dsvPHGWXfddbPWWmvlmGOOyfjx45fbhjUA6qa5zP8tt9wyQ4YMSZIMHz4877zzzjI1M2bMyC9+8YskSZ8+fbLXXnstdd78h7ordQ344IMPih9SDRkyJB9//HFOPPHEdO/ePb17907fvn3TuXPn7LrrrsU2lmfJebiy+VtRUVH8pvUn5641AOqmucz/2nj//feLc3V589v8h7prjmuAzwKpK4ETNFNrrbVWhg8fnvbt2+c///lPtttuu1x//fV59NFHM2rUqJx33nnZddddM3/+/Gy11Va57LLLVtreAw88kPfffz8LFizIhx9+mMceeyznn39++vXrl6uvvrrG8fz5z3/OP/7xj3Tp0iWXXnppnd7LpEmTUigUkiS9evVaaW3v3r2LxxMnTqxTP/Bp0lzWgJdeeql4/Oijj2annXbKPffcs9RdTVOnTs21116brbbaKg8++OAybVgDoG6ay/xPkt///vfZYIMNMnXq1GyzzTa57LLLcv/992f06NH5zW9+k8985jN58803s+aaa+ZPf/rTMt94NP+h7kpdA5b8s7t9+/bZZpttcvnll2fatGnF16uqqvLggw/mS1/6Uk4++eTljmPxPKysrEyXLl1WOubF8/eDDz5YamsfawDUTXOZ/7Vx8cUXp6qqKkmK22EtyfyHumtua4DPAqmXpnyAFFCzF198sfCNb3yjUFZWVnzQ3uKftddeu3DZZZcVZs6cudxrr7vuukLfvn0Lp556auHWW28tPP7444XHH3+8MGLEiMIBBxywVJtXX331Csfw4YcfFnr06FFIUrjqqquWOlebBwU+/vjjxZof/OAHK32/s2fPLtZ+6UtfWvlvDrQATb0G/M///E+xpm3btoWysrLCaaedVnj99dcL8+bNK4wbN65w6qmnFttac801C5MmTVqqDWsA1E9Tz//FPvjgg8J5551X6Nix4zLjaN26deGUU04pjB8/frnXmv9Qf/VdA2677bal/uxOUthxxx0LDzzwQGH27NmFqVOnFv70pz8VevbsWaz75N/xC4VCYdNNNy32VZMDDzyw2NaUKVOKr1sDoH6aev7X5NFHHy1UVFQUkhR69epVmDVr1jI15j/UX3NYA3wWSH0JnKAZmz9/fuHMM88sLvDL+9luu+0Kf//735d7/UcffVSorq5eYft33nlnoXXr1oUkhQ4dOhQmT5683Lqjjz66kKSw/fbbFxYuXLjUudr8IfPggw8Wa84666yVvueFCxcWa3ffffeV1sKnXXNYA3bfffel+rv44ouX29YFF1xQrPnOd76z1DlrANRdc5j/i/3hD38ofvC8vJ8NNtigcMkllyy3P/Mf6qeUNeCGG25Yqm7bbbctzJkzZ5m6V199tVBZWVlIUlhrrbUKs2fPXup83759C0kKvXv3rnG8hx9+eLG/iRMnFl+3BkDdNYf5vzLvvvtuoVevXoUkhbKyssK999673DrzH+qnuawBPgukvmypB83UrFmzsscee+T888/Phx9+mNNOOy1jx47NvHnzMn369Nxzzz3ZeeedM2bMmOyzzz65/PLLl2ljjTXWSFlZ2Qr7+NKXvlR88N/s2bNz7bXXLlNz//3357rrrkurVq3ym9/8ZoUPA12Zdu3aFY/nz5+/0tolt+Bo3759nfuCT4vmsgYsOX979eqVk046abltff/730/Pnj2TJCNGjCjeOv/JNqwBULPmMv+T5NRTT82RRx6Zl156Kfvuu2/+85//ZObMmZkzZ06eeuqpHH300Rk/fnxOPfXUHHTQQUttt5mY/1Afpa4BS867JDn//POXeS1JNt5443z7299OsmgrvFGjRi23nZrmbrLi+WsNgLppLvN/RWbMmJFhw4YVn8tywQUX5HOf+9xya81/qLvmsgb4LJBSCJygmTrnnHOKz0K59tprc9FFF2WTTTZJmzZt0rlz5+y555657777MnTo0BQKhZx88sl57rnn6tzPscceW/xA6oEHHljq3Lx583LcccclSf73f/83W221Vb3eS6dOnYrHM2fOXGntrFmziscdO3asV3/wadAc1oBk6fm75557plWrVsttp6KioviPzQ8//DBvvvnmctuwBkDNmsv8//vf/17cq/2oo47KX//61+y4446prKxMu3btsvXWW+f3v/99zjrrrCTJzTffnKuuumqpNsx/qLtS14Al512bNm0ydOjQFfa19957F4/HjBmz1LnF7dQ0d5MVz19rANRNc5n/yzN37tx8+ctfzpNPPpkkOfnkk/PDH/5whfXmP9Rdc1gDfBZIqQRO0AwVCoVcd911SZL+/fvnyCOPXG5dRUVFfvKTnyRJqquri9fURY8ePdK9e/ckydtvv73Uudtuuy2vvvpqKioqsummm2bEiBHL/Pz73/8u1r/wwgvF15f8sHnJhwMu/ibUiiz5cMAlHxoILUlzWQOSpedhXR70+f777y/3OmsArFxzmv9L3vX0f//3fyts54wzzij+w/B3v/vdUufMf6ibhlgDlpw/a6+9dtq0abPC/lb0Z3fy3/k7a9asfPTRRysd9+L5u9Zaa6Vt27bLtJFYA6AmzWn+f1JVVVUOPPDA3HfffUmSY445pvillBUx/6Fumssa4LNASlXR1AMAlvXee+9l6tSpSZKtt956pbXbbrtt8fjll1+uV39Lbn21pMW3tFZVVeXYY4+tsZ1bb701t956a5Lkuuuuy4Ybbphk0bcTevfunYkTJ9Y4xiXPDxw4sFbjh0+b5rIGJMlmm21WPF64cOFK21nyfEXFf/+KYQ2A2mtO83/s2LFJFv1jdb311lthXbt27bLZZpvlscceW2Yc5j/UTUOsARtvvHFat26dBQsW1PvP7iTZdNNNi3+3f/nll7PDDjsst42qqqq8/vrrSZadu9YAqL3mNP+XVF1dncMPPzx33nlnkuSggw7K1VdfvdK2E/Mf6qq5rAE+C6RU7nCCZmjJhb6qqmqltQsWLFjudbX1/vvv58MPP0ySrLvuunW+vrZ23nnnJMkrr7ySd999d4V1S27ps9NOOzXaeKA5a05rwGc/+9ni8eIPk1ZkyfOf/HDaGgC105zm/+I2axrHkmNZ3jjMf6i9hlgDWrdunSFDhiRZ9OHVktvUfFJt/uxOlr/t5mJPPPFEsY/lzV1rANROc5r/SzruuOMyYsSIJIueAXnDDTfU+nku5j/UXnNdA0phDWiZBE7QDHXr1i2dO3dOkjzyyCMr/YNmyUV58bcI6uKaa64pfrt51113XercUUcdlUKhsNKfxbfUJ4v2ml38+lFHHbVUW/vuu2/xePjw4csdy+zZs3PTTTclWfSNyv79+9f5/cCnQXNZAxa3ufjbVf/85z8ze/bs5bYzY8aM/Otf/0qSbLTRRunZs+dS560BUDvNbf4ni57Ltvhup+WZOnVqXnjhhRWOw/yH2muoNWD//fdPsujby3fccccK27jtttuKx7vssstS53bbbbesscYaSZI//OEPK7wjcsl5vd9++y1z3hoAtdOc5v9iJ598cnG73N133z233HJLWrduXcM7+S/zH2qvuawBPgukZAWgWTr44IMLSQpJCueee+5ya6ZOnVrYdNNNi3X//Oc/i+fefPPNwlNPPbXSPu68885CmzZtCkkK7dq1K0yaNKnO47zvvvuK/Z9zzjkrrJs/f35ho402KiQpdO7cuTBu3Lhlao4//vhiW9ddd12dxwKfJs1pDbjxxhuLfXzrW99abs03vvGNYs3FF1+8zHlrANRec5n/V199dbH9vfbaqzBv3rxlahYuXFg47LDDinWnn376MjXmP9RNqWtAoVAozJgxo9CjR49CksIGG2xQePfdd5dp47777iu0atWqkKSw+eabF6qrq5epOeuss4p9/OxnP1vm/MMPP1yoqKgoJCnsuuuuyx2rNQBqrznN/3POOafYx4477liYOXNmnd+P+Q9105zWgJXxWSArI3CCZmrs2LGFDh06FBfdffbZp3DLLbcUnnrqqcLDDz9cuOyyywrrr79+8fzuu+++1PWLF/8hQ4YULrjggsJdd91VeOKJJwpjxowp3HjjjYUDDjigUFZWVrz+iiuuqNc4a/uHTKFQKIwcObJQXl5eSFJYe+21C7/61a8Kjz32WOEf//hHYf/99y+2s/POOxeqqqrqNR74tGhua8AXv/jFYu2wYcMKd9xxR+Gpp54q3H777YXPf/7zxXNbb711Yc6cOcttwxoAtdNc5v+8efMKm2yySbFuiy22KFxzzTWFxx57rPDEE08Urr/++sKQIUOK59dee+3CBx98sNy2zH+ovVLXgMVGjBhRnOu9e/cu/PrXvy6MGTOm8NBDDxXOOOOMQvv27QtJChUVFYXRo0cvt42PP/640L9//2Jf3/zmNwv//ve/C4888kjhggsuKHTs2LGQpNC+ffvC008/vcL3ZA2A2mku8/+Xv/xlsY/11luvMHr06MLzzz+/0p/58+cvdyzmP9Rec1kDauKzQFZG4ATN2L/+9a9C9+7di4vvin4+97nPFaZOnbrUtUsu/iv76dChQ+Hqq6+u9xjr8odMoVAoXHPNNcVvVC/vZ/DgwSv8sApamua0BsyYMaOw1157rbSt7bbbrjB58uSVtmMNgNppLvP/rbfeKnzmM5+psa0NN9xwpR82FwrmP9RFKWvAkq644oqVzruOHTsWbr/99pWO5bXXXitsvPHGK2yjc+fOhTvvvLPG92QNgNppDvN/1113rdXfJZb8efPNN1c4FvMfaq85rAE18VkgK1NWKKxgI2agWfjwww9z7bXX5u67786LL76Yjz76KBUVFVlnnXWy3Xbb5ZBDDsn//M//pKysbKnrZsyYkb/97W955JFH8sQTT2Ty5MmZMmVKqqqq0rVr12y22WbZfffdc8wxx6RHjx71Ht/999+foUOHJlm0b+u5555b4zUvvPBCfvnLX+bee+/NO++8k8rKygwcODCHHnpojjnmmHo9+Bw+rZrbGjBixIj84Q9/yDPPPJMPP/wwXbp0yVZbbZWDDz44RxxxRFq1alVjG9YAqJ3mMv8XLFiQESNG5JZbbslTTz2VDz74IIVCId26dcuWW26ZfffdN0cccUQqKytrbMv8h9qr7xrwSS+++GJ+/etf51//+lfefvvttGrVKn379s3nP//5nHjiics8d3F5Zs2alV//+te5+eabM27cuMyfPz+9e/fOF7/4xZxwwgnZYIMNavWerAFQO009/3fbbbelnhFTG2+++Wb69OmzwvPmP9ReU68BNfFZICsjcAIAAAAAAKAk5U09AAAAAAAAAFZvAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAAAAAKAkAicAAAAAAABKInACAAAAAACgJAInAAAAAAAASiJwAgAAAAAAoCQCJwAAAAAAAEoicAIAAKBGzzzzTHbfffe0b98+PXv2zA9+8IPMnz+/qYcFAAA0E2WFQqHQ1IMAAACg+XrppZey/fbbZ+bMmUu9vt9+++W2225rolEBAADNiTucAAAAWKmzzz47M2fOzKGHHpr//Oc/+ctf/pKePXvmr3/9ax566KGmHh4AANAMVDT1AAAAAGjeHn744fTr1y/XX399ysvLs+OOO6Z169b56le/mkceeSS77LJLUw8RAABoYu5wAgAAYKXatGmTjh07prz8v/+E7NKlS5KkQ4cOTTQqAACgORE4AQAANAOFQiGdO3dOeXl51l577Rx44IEZP358g/axYMGCDBgwIGVlZbnxxhtrfd0ee+yRZ555JhdddFFmzJiRl156KaeeemrKy8vz+c9/frnXHH/88SkrK8uRRx7ZUMMHAACasbJCoVBo6kEAAAC0dOPGjcvGG2+81GubbrppXnzxxQbr47LLLsspp5ySgQMH5oUXXljqjqWVeffdd7PTTjvljTfeKL5WVlaWiy++OKeccspyr5k4cWL69euXBQsW5LHHHst2223XIO8BAABontzhBAAA0Az07Nkzzz//fP7xj39kww03TJK89NJLefLJJxuk/ZkzZ+bCCy9Mkpx99tm1DpuSZJ111snAgQOXeu2AAw5YYdiUJL17986RRx6ZQqGQH/3oR/UbNAAAsNoQOAEAADQDlZWV2XzzzbP33nvnJz/5SfH1Z555pkHav+qqqzJlypT07t07Bx54YJ2u/fe//52RI0cWx5kkr732Wo3XLQ6k7rnnnowZM6aOIwYAAFYnAicAAIBmZscddywev/DCCyW3t3DhwlxxxRVJkoMPPrhOdzcVCoV8//vfT5IMHTo0++23X5JFd18tXLhwpdcOGDAg22yzTZLk8ssvr8/QAQCA1YTACQAAoJnp06dPOnXqlKRhAqd//etfmTBhQpLksMMOq9O1f/zjH/PUU08Vn9m02WabJUnmzZuXV199tcbrDz300CTJrbfemunTp9dx5AAAwOpC4AQAANDMlJWVZeONN07SMIHTTTfdlCTZeOONs8UWW9T6urlz5xafv3TwwQdn2223zeabb148/9xzz9XYxv77719s64477qjLsAEAgNWIwAkAAKCZefLJJ4vPbnr33Xfz4YcfltTefffdlyTZYYcd6nTdL37xi0yYMCFt27bN+eefnyTFO5yS5Pnnn6+xjQ022CA9e/ZMktx///116h8AAFh9CJwAAACakYULF+ab3/xmqquri6+9+OKL9W5v0qRJeeutt5Ik2223Xa2vmzJlSi688MIkyXe/+9306dMnyaLt/iorK5PULnBast+HHnqo1v0DAACrF4ETAABAM/KrX/0qTz311FKvlbKt3sMPP1w83nrrrWt93XnnnZePP/44Xbt2zZlnnll8vaysLAMHDkxSuy31kmTbbbdNkowbNy7vv/9+rccAAACsPgROAAAAzcSkSZNy1llnJUl23HHH4uulBE6TJk0qHvfo0aNW17z22mu5+uqrkyRnnnlmunbtutT5xc9xGj9+fGbMmFFje0v2+/bbb9dqDAAAwOpF4AQAANBMfO9738vMmTPTqVOn3HjjjenSpUuS0gKnDz74oHj8yeBoRX7wgx9kwYIF2WCDDfLd7353mfOLn+NUKBRqta1et27dljseAADg00PgBAAA0Az87W9/y+23354kueCCC9KrV69sscUWSUoLnKZOnVo8rk3gNHr06Pz1r38tjqNt27bL1CwOnJLaPcdpyX4//PDDGusBAIDVj8AJAACgic2aNSvf+973kiTbb799jj/++CQpBk7Tpk3LO++8U6+227VrVzyeM2dOjfWnnnpqkkXPXTr44IOXW7Nk4FSb5zgt2W/79u1rrAcAAFY/AicAAIAmdvbZZ2fChAlp3bp1fvvb36a8fNE/1RYHTkn973Jaa621isdL3u20PDfeeGMee+yxJMmTTz6Z8vLylJWVLfOzwQYbFK+pzR1OS/a75HgAAIBPD4ETAABAE3r22Wdz+eWXJ1l0d9GSIdOWW25ZPG6IwGnatGkrrJs/f37OOOOMOrdfm8BpyX4FTgAA8OlU0dQDAAAAaKmqq6vzzW9+MwsXLsxGG22Us846a6nzm2++efG4voHTkgHWq6++mq222mq5dVdccUXeeOONlJWV5de//nWNz3u6/vrrc/fdd+ejjz7KxIkT07t37xXWvvrqq0mSysrK9O3bt+5vAgAAaPYETgAAAE3kqquuyuOPP54k+c1vfrPM8406d+6cDTbYIOPHj6934DRo0KC0b98+c+bMyZgxY3LggQcuUzNt2rScf/75SZJ999033/72t2ts9913383dd9+dZNFznFYWOI0ZMyZJssMOO6Siwj9DAQDg08iWegAAAE1g8uTJOfPMM5MkRxxxRPbYY4/l1i2+Q+mll15KoVCocz9t2rTJ4MGDk6QYbn3S//3f/2Xq1KkpKyvLueeeW6t2+/fvXzxe2bZ68+bNy3PPPZck2WWXXWo5agAAYHUjcAIAAGgCJ5xwQqZPn57u3bvn0ksvXWHd4uc4zZo1K2+++Wa9+ho2bFiSRYHTjBkzljr35ptv5oorrkiS7L///ks9N2pllgycFgdKy/Pggw9mwYIFS40DAAD49BE4AQAArGJ33313br755iTJpZdemu7du6+wdslnMNV3W71DDjkkrVq1yty5c/PXv/51qXOnn3565s+fX6e7m5Jkww03TOvWrZOs/A6nP//5z0mSAQMGZNCgQXUfPAAAsFoQOAEAAKxCc+bMyXe+850kye67754jjjhipfUNETitt956+fKXv5wk+dOf/lR8/fHHH89NN92UJDnwwAOz2Wab1brNVq1aZaONNkqSvPLKK5k/f/4yNUsGXMcff3y9xg4AAKweygr12QQcAACA1cqjjz6aIUOGpFWrVhk3blz69OnT6H3+8Y9/zOGHH55u3brlrbfeSqdOnRq9TwAAoGm4wwkAAKAF2GGHHfKFL3whCxcuzIUXXtjo/VVXV+eCCy5Ikpx66qnCJgAA+JRzhxMAAEAL8fzzz2frrbdOeXl5xo0bl/XXX7/R+rrxxhvzta99Lb17984rr7yS9u3bN1pfAABA06to6gEAAACwamyxxRYZPnx4xo0blwkTJjRq4LRw4cKcc845+dznPidsAgCAFsAdTgAAAAAAAJTEM5wAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkgicAAAAAAAAKInACQAAAAAAgJIInAAAAAAAACiJwAkAAAAAAICSCJwAAAAAAAAoicAJAAAAAACAkvw/dDs1lfAjx/cAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 395, + "width": 846 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = spectrum.plot()\n", + "mixture_model.normalize().plot(ax=ax);" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.17" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/environment.yml b/environment.yml index ecfb4b4..15a34fc 100644 --- a/environment.yml +++ b/environment.yml @@ -30,8 +30,11 @@ dependencies: - coverage - coveralls - twine + - dust_extinction - pip - pip: - sphinx-material - celerite2 - specutils==1.9.1 + - tynt + diff --git a/environment_M1.yml b/environment_M1.yml index 36df598..d15c9ec 100644 --- a/environment_M1.yml +++ b/environment_M1.yml @@ -30,7 +30,9 @@ dependencies: - coverage - coveralls - twine + - dust_extinction - pip - pip: - sphinx-material - celerite2 + - tynt diff --git a/src/muler/echelle.py b/src/muler/echelle.py index 5a3a032..67f5f5a 100644 --- a/src/muler/echelle.py +++ b/src/muler/echelle.py @@ -26,8 +26,10 @@ from scipy.signal import savgol_filter from astropy.constants import R_jup, R_sun, G, M_jup, R_earth, c from astropy.modeling.physical_models import BlackBody +from scipy.ndimage import median_filter, gaussian_filter1d import specutils -from muler.utilities import apply_numpy_mask, is_list +from muler.utilities import apply_numpy_mask, is_list, resample_list + # from barycorrpy import get_BC_vel from astropy.coordinates import SkyCoord, EarthLocation @@ -39,6 +41,9 @@ import os import copy +from specutils.manipulation import LinearInterpolatedResampler + + from specutils.spectra.spectral_region import SpectralRegion from specutils.analysis import equivalent_width @@ -73,6 +78,7 @@ def __init__(self, *args, **kwargs): # self.ancillary_spectra = None super().__init__(*args, **kwargs) + @property def snr(self): """The Signal-to-Noise Ratio :math:`\frac{S}{N}`, the flux divided by the uncertainty @@ -699,6 +705,139 @@ def apply_boolean_mask(self, mask): ) return spec + + def get_slit_profile(self, lower=None, upper=None, slit_length=1.0): + """"For a 2D spectrum, returns the slit profile + + Parameters + ---------- + lower : AstroPy Quantity or float + The short wavelength limit at which to define the slit profile. + If the value is a float, it assume Angstrom units. + upper : AstroPy Quantity or float + The long wavelength limit at which to define the slit profiled. + If the value is a float, it assume Angstrom units. + + Returns + ------- + Array with the same height as the 2D spectrum of the median estimated slit profile + """ + #Get the upper and lower wavelength limits in the correct units + + assert len(np.shape(self.flux)) == 2, "Spectrum must be 2D to estimate slit profile." #Test to make sure this is a 2D spectrum + + if lower is None: + lower = self.wavelength.min().value + if upper is None: + upper = self.wavelength.max().value + + if type(lower) is not u.Quantity: + # Assume it's Angstroms + lower = lower * u.Angstrom + if type(upper) is not u.Quantity: + upper = upper * u.Angstrom + + mask = (self.wavelength >= lower) & (self.wavelength <= upper) + + flux = self.flux[:, mask].value + normalized_flux = flux / np.nansum(flux, axis=0) + median_slit_profile = np.nanmedian(normalized_flux, axis=1) + + return median_slit_profile + + + def resample(self, target_spectrum): + """Resample spectrum onto a new spectral_axis. + Copied from gollum. + + Parameters + ---------- + target_spectrum : Spectrum1D + Spectrum whose wavelength grid you seek to match + + Returns + ------- + resampled_spec : PrecomputedSpectrum + Resampled spectrum + """ + output = LinearInterpolatedResampler()(self, target_spectrum.wavelength) + + return self._copy( + spectral_axis=output.wavelength.value * output.wavelength.unit, + flux=output.flux, uncertainty=output.uncertainty, meta=self.meta, + wcs=None, + ) + + def instrumental_broaden(self, resolving_power=55000): + r"""Instrumentally broaden the spectrum for a given instrumental resolution + Copied verbatim from gollum. + + Known limitation: If the wavelength sampling changes with wavelength, + the convolution becomes inaccurate. It may be better to FFT, + following Starfish. + + Parameters + ---------- + resolving_power : int + Instrumental resolving power :math:`R = \frac{\lambda}{\delta \lambda}` + + Returns + ------- + broadened_spec : PrecomputedSpectrum + Instrumentally broadened spectrum + """ + # In detail the spectral resolution is wavelength dependent... + # For now we assume a constant resolving power + angstroms_per_pixel = np.median(np.diff(self.wavelength.angstrom)) + lam0 = np.median(self.wavelength.value) + delta_lam = lam0 / resolving_power + + scale_factor = 2.355 + sigma = delta_lam / scale_factor / angstroms_per_pixel + + convolved_flux = gaussian_filter1d(self.flux.value, sigma) * self.flux.unit + return self._copy(flux=convolved_flux) + def fill_nans(self, method=median_filter, **kwargs): + """Fill nans with the median of surrounding pixels using + scipy.ndimage.median_filter + + Parameters + ---------- + method: def + def to apply to smooth surrounding pixels (e.g. scipy.ndimage.median_filter) + **kwargs: + Gets passed to method (e.g. size for scipy.ndimage.median_filter) + """ + flux = self.flux + unc = self.uncertainty.array + filtered_flux = Quantity(method(flux.value, **kwargs), unit=self.flux.unit) + filtered_variance = method(unc**2, **kwargs) + filtered_unc = (filtered_variance**0.5) + found_nans = np.isnan(flux.value) + flux[found_nans] = filtered_flux[found_nans] + unc[found_nans] = filtered_unc[found_nans] + + return self.__class__( + spectral_axis=self.spectral_axis, flux=flux, uncertainty=StdDevUncertainty(unc), meta=self.meta, wcs=None) + def apply(self, method=np.nansum, **kwargs): + """ + Apply any method to the spectrum. This is very general and can be used for many + things. Uncertainity is propogated. + + Parameters + ---------- + method: def + def to apply to spectrum (e.g. np.nansum to collapse a multidimensional spectrum) + **kwargs: + Gets passed to method (e.g. axis for np.nansum) + """ + flux = self.flux + unc = self.uncertainty.array + flux = Quantity(method(self.flux.value, **kwargs), unit=self.flux.unit) + unc = method(self.uncertainty.array**2, **kwargs)**0.5 + return self.__class__( + spectral_axis=self.spectral_axis, flux=flux, uncertainty=StdDevUncertainty(unc), meta=self.meta, wcs=None) + def __pow__(self, power): """Take flux to a power while preserving the exiting flux units. Uuseful for airmass correction. Uncertainity is propogated by keeping the @@ -778,6 +917,34 @@ def trim_edges(self, limits=None): return spec_out + def trim_overlap(self, pivot=0.5): + """Trim all the edges that overlap with adjacent spectra (e.g. orders) + in the list. Useful for running before stitch().""" + spec_out = copy.deepcopy(self) + n = len(spec_out) + + for i in range(n): #Loop through each spectrum/order in list + #print('starting i ', i) + if i == 0: #Figure out where to trim the left side + left_limit = 0 + elif self[i].spectral_axis[0] > self[i-1].spectral_axis[-1]: + left_limit = 0 + else: + mid_wave = self[i].spectral_axis[0]*(1-pivot) + self[i-1].spectral_axis[-1]*(pivot) + left_limit = np.where(self[i].spectral_axis > mid_wave)[-1][0] + 1 + if i == n-1: #Figure out where to trim the right side + right_limit = len(self[i].spectral_axis) + elif self[i].spectral_axis[-1] < self[i+1].spectral_axis[0]: + right_limit = len(self[i].spectral_axis) + else: + mid_wave = self[i].spectral_axis[-1]*(pivot) + self[i+1].spectral_axis[0]*(1-pivot) + right_limit = np.where(self[i].spectral_axis > mid_wave)[0][0] - 1 + + if left_limit > 0 or right_limit < len(self[i].spectral_axis): + spec_out[i] = spec_out[i].trim_edges((left_limit, right_limit)) + + return spec_out + def deblaze(self, method="spline"): """Remove blaze function from all orders by interpolating a spline function @@ -986,3 +1153,40 @@ def flatten(self, **kwargs): if "x_values" not in spec_out[i].meta: spec_out[i].meta["x_values"] = self[i].meta["x_values"] return spec_out + + def fill_nans(self, method=median_filter, **kwargs): + """Fill nans with the median of surrounding pixels using + scipy.ndimage.median_filter + + Parameters + ---------- + method: def + def to apply to smooth surrounding pixels (e.g. scipy.ndimage.median_filter) + **kwargs: + Gets passed to method (e.g. size for scipy.ndimage.median_filter) + """ + spec_out = copy.deepcopy(self) + for i in range(len(self)): + spec_out[i] = self[i].fill_nans(method=method, **kwargs) + if "x_values" not in spec_out[i].meta: + spec_out[i].meta["x_values"] = self[i].meta["x_values"] + return spec_out + + def apply(self, method=np.nansum, **kwargs): + """ + Apply any method to the spectral list. This is very general and can be used for many + things. Uncertainity is propogated. + + Parameters + ---------- + method: def + def to apply to spectrum (e.g. np.nansum to collapse a multidimensional spectrum) + **kwargs: + Gets passed to method (e.g. axis for np.nansum) + """ + spec_out = copy.deepcopy(self) + for i in range(len(self)): + spec_out[i] = self[i].apply(method=method, **kwargs) + if "x_values" not in spec_out[i].meta: + spec_out[i].meta["x_values"] = self[i].meta["x_values"] + return spec_out \ No newline at end of file diff --git a/src/muler/hpf.py b/src/muler/hpf.py index fd4160b..05cb951 100644 --- a/src/muler/hpf.py +++ b/src/muler/hpf.py @@ -12,12 +12,14 @@ import warnings import logging from muler.echelle import EchelleSpectrum, EchelleSpectrumList +from muler.utilities import resample_list import numpy as np import astropy from astropy.io import fits from astropy import units as u from astropy.wcs import WCS, FITSFixedWarning from astropy.nddata import StdDevUncertainty +from scipy.ndimage import median_filter from scipy.interpolate import InterpolatedUnivariateSpline from astropy.constants import R_jup, R_sun, G, M_jup, R_earth, c from astropy.time import Time @@ -28,6 +30,7 @@ from . import templates import pandas as pd + log = logging.getLogger(__name__) for category in [ @@ -304,7 +307,21 @@ def deblaze(self, method="template"): log.error("This method is deprecated! Please use the new deblaze method") raise NotImplementedError - def sky_subtract(self, method="scalar"): + def sky_resample(self): + """ + Resample's sky spectrum from the sky fiber to match the spectrum from the science fiber + + Returns + ------- + Spectrum with sky fiber spectrum resampled to match the wavelength solution of the science fiber + + """ + spec = copy.deepcopy(self) + spec.meta["sky"] = spec.sky.resample(spec) + #spec.sky = spec.sky.resample(spec) + return spec + + def sky_subtract(self, method="scalar", scale=0.93): """Subtract sky spectrum from science spectrum, with refinements for sky throughput Note: This operation does not wavelength shift or scale the sky spectrum @@ -315,6 +332,9 @@ def sky_subtract(self, method="scalar"): The method for sky subtraction: "naive", "scalar", or "vector", as described in Gully-Santiago et al. in prep. Default is scalar. + scale : (float) + When using the "scalar" method, sets the scale. Default is 0.93. + Returns ------- sky_subtractedSpec : (HPFSpectrum) @@ -327,17 +347,20 @@ def sky_subtract(self, method="scalar"): ) beta = 1.0 * u.dimensionless_unscaled elif method == "scalar": - beta = 0.93 * u.dimensionless_unscaled + beta = scale * u.dimensionless_unscaled elif method == "vector": beta_native_spectrum = spec.get_static_sky_ratio_template() resampler = LinearInterpolatedResampler(extrapolation_treatment="zero_fill") beta = resampler(beta_native_spectrum, spec.spectral_axis) + # elif method == 'median': #Attempt to measure the scale of the sky lines between the fibers using a median of the pixels + # resampled_sky = spec.sky.resample(spec) + # good_sci_pixels = self.flux.value - else: log.error("Method must be one of 'naive', 'scalar' or 'vector'. ") raise NotImplementedError # These steps should propagate uncertainty? - sky_estimator = spec.sky.multiply(beta, handle_meta="first_found") + sky_estimator = spec.sky_resample().sky.multiply(beta, handle_meta="first_found") return spec.subtract(sky_estimator, handle_meta="first_found") def mask_tellurics(self, method="TelFit", threshold=0.999, dilation=5): @@ -434,14 +457,48 @@ def deblaze(self): return spec_out - def sky_subtract(self, method="vector"): + def sky_resample(self): + """ + Resample's sky spectrum from the sky fiber to match the spectrum from the science fiber + + Returns + ------- + Spectrum with sky fiber spectrum resampled to match the wavelength solution of the science fiber + + """ + spec_out = copy.copy(self) + for i in range(len(spec_out)): + spec_out[i] = spec_out[i].sky_resample() + + return spec_out + + + def sky_subtract(self, method="vector", scale=0.93): """Sky subtract the entire spectrum""" spec_out = copy.copy(self) for i in range(len(spec_out)): - spec_out[i] = spec_out[i].sky_subtract(method=method) + spec_out[i] = spec_out[i].sky_subtract(method=method, scale=scale) return spec_out + def test_print_sky_scale(self): + #reampled_sky = resample_list(self.sky, self) #Resample sky to match sci wavelengths + all_sky = np.zeros([2048, len(self)]) #Put all science and sky fiber flux into 2D arrays for easy manipulation + all_sci = np.zeros([2048, len(self)]) + for i in range(len(self)): + all_sky[:, i] = (self[i].sky).resample(self[i]).flux.value + all_sci[:, i] = self[i].flux.value + all_sky -= median_filter(all_sky, [25, 1]) #Subtract continuum/background using a running median filter + all_sci -= median_filter(all_sci, [25, 1]) + #all_sky[all_sky ] + max_sky_flux = np.nanmax(all_sky) + bad_pix = (all_sky < 0.1 * max_sky_flux) & (all_sci < 0.1 * max_sky_flux) + all_sky[bad_pix] = np.nan + all_sci[bad_pix] = np.nan + print(np.nanmedian(all_sci / all_sky)) + + + # def sky_subtract(self): # """Sky subtract all orders # """ diff --git a/src/muler/igrins.py b/src/muler/igrins.py index 5561f28..3bd741e 100644 --- a/src/muler/igrins.py +++ b/src/muler/igrins.py @@ -10,7 +10,9 @@ """ import logging import warnings +import json from muler.echelle import EchelleSpectrum, EchelleSpectrumList +from muler.utilities import Slit, concatenate_orders from astropy.time import Time import numpy as np import astropy @@ -18,6 +20,8 @@ from astropy import units as u from astropy.wcs import WCS, FITSFixedWarning from astropy.nddata import StdDevUncertainty +from specutils.manipulation import LinearInterpolatedResampler +LinInterpResampler = LinearInterpolatedResampler() import copy import os @@ -39,12 +43,58 @@ grating_order_offsets = {"H": 98, "K": 71} +def readPLP(plppath, date, frameno, waveframeno, dim='1D'): + """Convience function for easily reading in the full IGRINS Spectrum (both H and K bands) + from the IGRINS PLP output + + Parameters + ---------- + plppath: string + Path to the IGRINS PLP (e.g. "/Users/Username/Desktop/plp/") + date: int or string + Date for night of IGIRNS observation in format of YYYYMMDD (e.g. "201401023") + frameno: int or string + Number of frame denoting target as specified as the first frame in the + recipes file for the night (e.g. 54 or "0054") + waveframeno: int or string + Number of frame denoting target as specified as the first frame in the + recipes file for the wavelength solution (e.g. 54 or "0054") from a wvlsol_v1 file. + This is usually the first frame number for the sky. + dim: string + Set to "1D" to read in the 1D extracted spectrum from the .spec.fits files + or "2D" to read in the rectified 2D spectrum from the .spec2d.fits files + + Returns + ------- + IGRINSSpectrumList containing all the orders for the H and K bands for the specified target + """ + if type(date) is not str: #Converhet dates and frame numbers to the proper string format + date = '%.8d' % int(date) + if type(frameno) is not str: + frameno = '%.4d' % int(frameno) + if type(waveframeno) is not str: + waveframeno = '%.4d' % int(waveframeno) + if dim.upper() == '1D': #Use proper filename for 1D or 2D extractions + suffix = '.spec.fits' + elif dim.upper() == '2D': + suffix = '.spec2d.fits' + else: + raise Exception( + "Argument 'dim' must be '1D' for .spec.fits files or '2D' for .spec2d.fits files." + ) + spec_H = IGRINSSpectrumList.read(plppath+'outdata/'+date +'/'+'SDCH_'+date+'_'+frameno+suffix, #Read in H band + wavefile=plppath+'calib/primary/'+date +'/SKY_SDCH_'+date+'_'+waveframeno+'.wvlsol_v1.fits') + spec_K = IGRINSSpectrumList.read(plppath+'outdata/'+date +'/'+'SDCK_'+date+'_'+frameno+suffix, #Read in K band + wavefile=plppath+'calib/primary/'+date +'/SKY_SDCK_'+date+'_'+waveframeno+'.wvlsol_v1.fits') + spec_all = concatenate_orders(spec_H, spec_K) #Combine H and K bands + return spec_all + def getUncertainityFilepath(filepath): """Returns path for uncertainity file (.variance.fits or .sn.fits) Will first search for a .variance.fits file but if that does not exist - will serach for a .sn.fits file. + will search for a .sn.fits file. Parameters ---------- @@ -62,19 +112,142 @@ def getUncertainityFilepath(filepath): path_base = filepath[:-20] elif ".spec.fits" in filepath: path_base = filepath[:-10] - if os.path.exists(path_base + '.variance.fits'): #Prefer .variance.fits file - return path_base + '.variance.fits' - elif os.path.exists(path_base + '.sn.fits'): #If no .variance.fits file found, try using the .sn.fits file - return path_base + '.sn.fits' - elif path_base[0:4] == 'http': - # Try to read in the variance file... - return path_base + '.variance.fits' + elif ".spec2d.fits" in filepath: + path_base = filepath[:-12] + if ".spec2d.fits" in filepath: + if os.path.exists(path_base + '.var2d.fits'): + return path_base + '.var2d.fits' + else: + raise Exception( + "The file .var2d.fits does not exist in the same path as the spectrum file to get the uncertainity. Please provide one of these files in the same directory as your spectrum file." + ) + else: + if os.path.exists(path_base + '.variance.fits'): #Prefer .variance.fits file + return path_base + '.variance.fits' + elif os.path.exists(path_base + '.sn.fits'): #If no .variance.fits file found, try using the .sn.fits file + return path_base + '.sn.fits' + else: + raise Exception( + "Neither .variance.fits or .sn.fits exists in the same path as the spectrum file to get the uncertainity. Please provide one of these files in the same directory as your spectrum file." + ) + +def getSlitProfile(filepath, band, slit_length): + """Returns the path for the slit profile. Will first look for a 2D + spectrum .spec2d.fits file to calculate the profile from. If a spec2d.fits + file does not exist, will look for a .slit_profile.json. + + Parameters + ---------- + filepath: string + Filepath to fits file storing the data. Can be .spec.fits or .spec_a0v.fits. + band: string + 'H' or 'K' specifying which band + slit_length: float + Length of the slit on the sky in arcsec. + + Returns + ------- + x: float + Distance in arcsec along the slit + y: float + Flux of beam profile across the slit + """ + if ".spec_a0v.fits" in filepath: #Grab base file name for the uncertainity file + path_base = filepath[:-14] + elif ".spec_flattened.fits" in filepath: + path_base = filepath[:-20] + elif ".spec.fits" in filepath: + path_base = filepath[:-10] + elif ".spec2d.fits" in filepath: + path_base = filepath[:-12] + path_base = path_base.replace('SDCH', 'SDC'+band).replace('SDCK', 'SDC'+band) + spec2d_filepath = path_base + '.spec2d.fits' + json_filepath = path_base + '.slit_profile.json' + if os.path.exists(filepath): #First try to use the 2D spectrum in a .spec2d.fits file to estimate the slit proflie + spec2d = fits.getdata(spec2d_filepath) + long_spec2d = spec2d[2,:,1000:1300] #Chop off order edges at columns 800 and 1200 + for i in range(3, len(spec2d)-2): + long_spec2d = np.concatenate([long_spec2d, spec2d[i,:,1000:1300]], axis=1) + y = np.nanmedian(long_spec2d, axis=1) + x = np.arange(len(y)) * (slit_length / len(y)) + elif os.path.exists(json_filepath): #If no 2D spectrum exists, try using the PLP estimate in .slit_profile.json + json_file = open(filepath) + json_obj = json.load(json_file) + x = np.array(json_obj['profile_x']) * slit_length + y = np.array(json_obj['profile_y']) + json_file.close() else: - # No Uncertainty file available. That's OK. We will just have coarse uncertainty... - # TODO: support this scenario! - warnings.warn("Neither .variance.fits or .sn.fits exists locally in the same path as the spectrum file to get the uncertainity." - ) - raise Exception('Reading IGRINS without uncertainty files is unsupported at this time.') + raise Exception( + "Need either .spec2d.fits or .slit_profile.json file in the same directory as " + + filepath + + " in order to get an estimate of the slit profile. .spec2d.fits or .slit_profile.json are missing." + ) + return x, y + + + +def getIGRINSSlitThroughputABBACoefficients(file, slit_length=14.8, PA=90, guiding_error=1.5, print_info=True, plot=False): + """Estimate the wavelength dependent fractional slit throughput for a point source nodded ABBA on the IGRINS slit and return the + coefficients of a linear fit. + + Parameters + ---------- + file: + Path to fits file (e.g. spec.fits) from which the slit_profile.json file is also in the same directory. + These should all be in the same IGRINS PLP output directory. + slit_length: float + Length of the slit on the sky in arcsec. + PA: float + Position angle of the slit on the sky in degrees. Measured counterclockwise from North to East. + guilding_error: float + Estimate of the guiding error in arcsec. This smears out the PSF fits in the East-West direction. + This should be used carefully and only for telescopes on equitorial mounts. + print_info: bool + Print information about the fit. + plot: bool + Visualize slit throughput calculations. + + Returns + ------- + m, b: + Coefficients for a fit of a linear trend of m*(1/wavelength)+b to the fractional slit throughput with the + wavelength units in microns. + + """ + igrins_slit = Slit(length=slit_length, width=slit_length*(1/14.8), PA=PA, guiding_error=guiding_error) + #Get throughput for H band + x, y = getSlitProfile(file, band='H', slit_length=slit_length) #Get slit profile + igrins_slit.clear() + igrins_slit.ABBA(y, x=x, print_info=print_info, plot=plot) + if plot: + print('2D plot of H-band') + igrins_slit.plot2d() + #breakpoint() + f_through_slit_H = igrins_slit.estimate_slit_throughput() + #Get throughput for K band + x, y = getSlitProfile(file, band='K', slit_length=slit_length) #Get slit profile + igrins_slit.clear() + igrins_slit.ABBA(y, x=x, print_info=print_info, plot=plot) + if plot: + print('2D plot of K-band') + igrins_slit.plot2d() + breakpoint() + f_through_slit_K = igrins_slit.estimate_slit_throughput() + #Fit linear trend through slit throughput as function of wavelength and using fitting a line through two points + m = (f_through_slit_K - f_through_slit_H) / ((1/2.2) - (1/1.65)) + b = f_through_slit_H - m*(1/1.65) + if print_info: + # log.info('H-band slit throughput: ', f_through_slit_H) + # log.info('K-band slit throughput:', f_through_slit_K) + # log.info('m: ', m) + # log.info('b: ', b) + print('H-band slit throughput: ', f_through_slit_H) + print('K-band slit throughput:', f_through_slit_K) + print('m: ', m) + print('b: ', b) + return m, b + + class IGRINSSpectrum(EchelleSpectrum): r""" @@ -100,10 +273,13 @@ def __init__( # self.ancillary_spectra = None self.noisy_edges = (450, 1950) self.instrumental_resolution = 45_000.0 + self.file = file + #False if variance.fits file used for uncertainity, true if sn.fits file used for uncertainity if file is not None: - assert (".spec_a0v.fits" in file) or (".spec.fits" in file) or (".spec_flattened.fits") + + assert (".spec_a0v.fits" in file) or (".spec.fits" in file) or (".spec_flattened.fits" in file) or ('.spec2d.fits' in file) # Determine the band if "SDCH" in file: band = "H" @@ -150,9 +326,9 @@ def __init__( elif ".spec_a0v.fits" in file: lamb = hdus["WAVELENGTH"].data[order].astype(float) * u.micron flux = hdus["SPEC_DIVIDE_A0V"].data[order].astype(float) * u.ct - elif (("spec.fits" in file) or ("spec_flattened.fits" in file)) and (wavefile is not None): + elif (("spec.fits" in file) or ("spec_flattened.fits" in file) or ('.spec2d.fits' in file)) and (wavefile is not None): lamb = ( - wave_hdus[0].data[order].astype(float) * 1e-3 * u.micron + wave_hdus[0].data[order].astype(float) * u.micron ) # Note .wave.fits and .wavesol_v1.fts files store their wavelenghts in nm so they need to be converted to microns flux = hdus[0].data[order].astype(float) * u.ct elif (("spec.fits" in file) or ("spec_flattened.fits" in file)) and (wavefile is None): @@ -236,6 +412,39 @@ def astropy_time(self): mjd = self.meta["header"]["MJD-OBS"] return Time(mjd, format="mjd", scale="utc") + def getSlitThroughput(self, slit_length=14.8, PA=90, guiding_error=1.5, print_info=True, plot=False): + """Estimate the wavelength dependent fractional slit throughput for a point source nodded ABBA on the IGRINS slit. + + Parameters + ---------- + h_band_slitprofile_filepath: + Filepath to *.slit_profile.json file outputted by the IGRINS PLP storing the spatial + profile of the target along the slit for the H band. + k_band_slitprofile_filepath: + Filepath to *.slit_profile.json file outputted by the IGRINS PLP storing the spatial + profile of the target along the slit for the K band. + slit_length: float + Length of the slit on the sky in arcsec. + PA: float + Position angle of the slit on the sky in degrees. Measured counterclockwise from North to East. + guilding_error: float + Estimate of the guiding error in arcsec. This smears out the PSF fits in the East-West direction. + This should be used carefully and only for telescopes on equitorial mounts. + print_info: bool + Print information about the fit. + + Returns + ------- + Returns array of fractional slit throughput as a function of wavelength + """ + + m, b = getIGRINSSlitThroughputABBACoefficients(self.file, slit_length=slit_length, PA=PA, guiding_error=guiding_error, print_info=print_info, plot=plot) + return m*(1/self.wavelength.um) + b + + + + + class IGRINSSpectrumList(EchelleSpectrumList): r""" @@ -244,6 +453,7 @@ class IGRINSSpectrumList(EchelleSpectrumList): """ def __init__(self, *args, **kwargs): + self.file = None self.normalization_order_index = 14 super().__init__(*args, **kwargs) @@ -254,12 +464,16 @@ def read(file, precache_hdus=True, wavefile=None): Parameters ---------- file : (str) - A path to a reduced IGRINS spectrum from plp + A path to a reduced IGRINS spectrum from plp. wavefile : (str) + Path to a file storing a wavelength soultion for a night from the plp. + Wave files are found in the IGRINS PLP callib/primary/DATE/ directory with + the extension wvlsol_v1.fits. """ # still works - assert (".spec_a0v.fits" in file) or (".spec.fits" in file) or (".spec_flattened.fits" in file) + assert (".spec_a0v.fits" in file) or (".spec.fits" in file) or (".spec_flattened.fits" in file) or (".spec2d.fits" in file) + sn_used = False #Default hdus = fits.open(file, memmap=False) if "rtell" not in file: #Default, if no rtell file is used @@ -280,7 +494,14 @@ def read(file, precache_hdus=True, wavefile=None): wave_hdus = fits.open(full_path, memmap=False) cached_hdus.append(wave_hdus) - n_orders, n_pix = hdus[0].data.shape + if hdus[0].data is not None: + hdus0_shape = hdus[0].data.shape #Normally we read from the 0th extension + else: + hdus0_shape = hdus[1].data.shape #To insure compatibility with new version of the PLP for spec_a0v.fits files + if len(hdus0_shape) == 2: #1D spectrum + n_orders, n_pix = hdus0_shape + elif len(hdus0_shape) == 3: #2D spectrum + n_orders, n_height, n_pix = hdus0_shape list_out = [] for i in range(n_orders - 1, -1, -1): @@ -288,5 +509,37 @@ def read(file, precache_hdus=True, wavefile=None): file=file, wavefile=wavefile, order=i, sn_used=sn_used, cached_hdus=cached_hdus ) list_out.append(spec) - return IGRINSSpectrumList(list_out) + specList = IGRINSSpectrumList(list_out) + specList.file = file + return specList + def getSlitThroughput(self, slit_length=14.8, PA=90, guiding_error=1.5, print_info=True, plot=False): + """Estimate the wavelength dependent fractional slit throughput for a point source nodded ABBA on the IGRINS slit. + + Parameters + ---------- + h_band_slitprofile_filepath: + Filepath to *.slit_profile.json file outputted by the IGRINS PLP storing the spatial + profile of the target along the slit for the H band. + k_band_slitprofile_filepath: + Filepath to *.slit_profile.json file outputted by the IGRINS PLP storing the spatial + profile of the target along the slit for the K band. + slit_length: float + Length of the slit on the sky in arcsec. + PA: float + Position angle of the slit on the sky in degrees. Measured counterclockwise from North to East. + guilding_error: float + Estimate of the guiding error in arcsec. This smears out the PSF fits in the East-West direction. + This should be used carefully and only for telescopes on equitorial mounts. + print_info: bool + Print information about the fit. + + Returns + ------- + Returns list of arrays of fractional slit throughput as a function of wavelength + """ + m, b = getIGRINSSlitThroughputABBACoefficients(self.file, slit_length=slit_length, PA=PA, guiding_error=guiding_error, print_info=print_info, plot=plot) + f_throughput = [] + for i in range(len(self)): + f_throughput.append(m*(1/self[i].wavelength.um) + b) + return f_throughput diff --git a/src/muler/utilities.py b/src/muler/utilities.py index 9587082..c548038 100644 --- a/src/muler/utilities.py +++ b/src/muler/utilities.py @@ -1,8 +1,78 @@ +import logging + import numpy as np import copy from specutils.spectra import Spectrum1D from astropy.nddata.nduncertainty import StdDevUncertainty +from astropy.modeling import models, fitting #import the astropy model fitting package +from astropy import units as u from scipy.stats import binned_statistic +from scipy.interpolate import interp1d +from specutils.manipulation import LinearInterpolatedResampler +from matplotlib import pyplot as plt +LinInterpResampler = LinearInterpolatedResampler() +from tynt import FilterGenerator + +log = logging.getLogger(__name__) + + +def resample_combine_spectra(input_spec, spec_to_match, weights=1.0): + """Linearly resample input_spectra, which can be a list of spectra, to match specrum_to_match and return an EchelleSpectrum + or EchelleSpectrumList object with the same spectral axis and naned pixels as specrum_to_match. One main applications + for this is to match multiple synthetic spectra generated from stellar atmosphere models to a real spectrum. + + Parameters + ------- + input_spec : + A EchelleSpectrumm EchelleSpectrumList, or similar specutils object (or list of objects) to be resampled to match spec_to_match. + specrum_to_match : + A EchelleSpectrum or EchelleSpectrumLis spectrum which the input_spec will be resampled to match in both wavelength and naned pixels + weights : + A list or array giving the fraction of each spectrum in input_spec that makes up the final resampled spectrum. + Useful for grid interpolation for stellar atmosphere models or just stacking spectra from multiple objects + into one spectrum. + + Returns + ------- + An EchelleSpectrum or EchelleSpectrumList object with the same wavelength arrays and naned pixels as spec_to_match. + """ + + if is_list(input_spec): # + weights = np.array(weights) #Check that weights are a list and their sum equals 1 + sum_weights = np.sum(weights) + assert (len(weights)==1 and weights[0] == 1) or (len(weights) > 1), "If providing weights, You need to provide a weight for each input spectrum.." + assert sum_weights == 1, "Total weights in weights list is "+str(sum_weights)+" but total must equal to 1." + + if is_list(spec_to_match): + resampled_spec = resample_list(input_spec[0], spec_to_match)*(weights[0]) #Resample spectra + for i in range(1, len(input_spec)): + if len(weights)==1 and weights[0] == 1: + resampled_spec = resampled_spec + resample_list(input_spec[i], spec_to_match)*(weights[i]) + else: + resampled_spec = resampled_spec + resample_list(input_spec[i], spec_to_match) + else: + resampled_spec = LinInterpResampler(input_spec[0], spec_to_match.spectral_axis)*(weights[0]) #Resample spectra + for i in range(1, len(input_spec)): + if len(weights)==1 and weights[0] == 1: + resampled_spec = resampled_spec + LinInterpResampler(input_spec[i], spec_to_match.spectral_axis)*(weights[i]) + else: + resampled_spec = resampled_spec + LinInterpResampler(input_spec[i], spec_to_match.spectral_axis) + else: + if is_list(spec_to_match): + resampled_spec = resample_list(input_spec, spec_to_match) #Resample spectrum + else: + resampled_spec = LinInterpResampler(input_spec, spec_to_match.spectral_axis) + resampled_spec = spec_to_match.__class__( #Ensure resampled_spec is the same object as spec_to_match + spectral_axis=resampled_spec.spectral_axis, flux=resampled_spec.flux, meta=resampled_spec.meta, wcs=None) + + if is_list(spec_to_match): #Propogate nans from spec_to_match to avoid wierd errors + for i in range(len(spec_to_match)): + resampled_spec[i].flux[np.isnan(spec_to_match[i].flux.value)] = np.nan + else: + resampled_spec.flux[np.isnan(spec_to_match.flux.value)] = np.nan + + return resampled_spec + def combine_spectra(spec_list): @@ -150,16 +220,6 @@ def apply_numpy_mask(spec, mask): " The boolean mask should have the same shape as the spectrum." ) - if spec.uncertainty is not None: - masked_unc = spec.uncertainty[mask] - else: - masked_unc = None - - if spec.mask is not None: - mask_out = spec.mask[mask] - else: - mask_out = None - if spec.meta is not None: meta_out = copy.deepcopy(spec.meta) if "x_values" in spec.meta.keys(): @@ -167,14 +227,45 @@ def apply_numpy_mask(spec, mask): else: meta_out = None - return spec.__class__( - spectral_axis=spec.wavelength.value[mask] * spec.wavelength.unit, - flux=spec.flux[mask], - mask=mask_out, - uncertainty=masked_unc, - wcs=None, - meta=meta_out, - ) + ndim = spec.flux.ndim #Grab dimensionality of spec, can be 1D or 2D + if ndim == 1: #For 1D spectra + if spec.uncertainty is not None: + masked_unc = spec.uncertainty[mask] + else: + masked_unc = None + + if spec.mask is not None: + mask_out = spec.mask[mask] + else: + mask_out = None + + return spec.__class__( + spectral_axis=spec.wavelength.value[mask] * spec.wavelength.unit, + flux=spec.flux[mask], + mask=mask_out, + uncertainty=masked_unc, + wcs=None, + meta=meta_out, + ) + elif ndim == 2: #For 2D (e.g. slit) spectra + if spec.uncertainty is not None: + masked_unc = spec.uncertainty[:, mask] + else: + masked_unc = None + + if spec.mask is not None: + mask_out = spec.mask[:, mask] + else: + mask_out = None + + return spec.__class__( + spectral_axis=spec.wavelength.value[mask] * spec.wavelength.unit, + flux=spec.flux[:, mask], + mask=mask_out, + uncertainty=masked_unc, + wcs=None, + meta=meta_out, + ) def resample_list(spec_to_resample, specList, **kwargs): @@ -195,7 +286,14 @@ def resample_list(spec_to_resample, specList, **kwargs): """ spec_out = copy.deepcopy(specList) for i in range(len(specList)): - spec_out[i] = spec_to_resample.resample(specList[i], **kwargs) + meta_out = specList[i].meta + resampled_spec = spec_to_resample.resample(specList[i], **kwargs) + if hasattr(resampled_spec, "unc"): + spec_out[i] = specList[i].__class__( + spectral_axis=resampled_spec.spectral_axis, flux=resampled_spec.flux, uncertainty=resampled_spec.unc, meta=meta_out, wcs=None) + else: + spec_out[i] = specList[i].__class__( + spectral_axis=resampled_spec.spectral_axis, flux=resampled_spec.flux, meta=meta_out, wcs=None) return spec_out @@ -228,8 +326,239 @@ def is_list(check_this): True: Object has more than one element (e.g. is a list or array) False: Object has a single element (e.g. a single variable like 10.0) """ - if np.size(check_this) > 1: - return True - else: - return False - + return isinstance(check_this, list) + +class Slit: + def __init__(self, length=14.8, width=1.0, PA=90.0, guiding_error=1.5, n_axis=5000): + """ + A class to handle information about a spectrometer's slit, used for calculating things like slit losses + + Parameters + ---------- + length: float + Length of the slit on the sky in arcsec. + width: float + Width of the slit on the sky in arcsec. + PA: float + Position angle of the slit on the sky in degrees. Measured counterclockwise from North to East. + guilding_error: float + Estimate of the guiding error in arcsec. This smears out the PSF fits in the East-West direction. + This should be used carefully and only for telescopes on equitorial mounts. + n_axis: float + Size of axis for a 2D square array storing estimated profiles along the slit in 2D for later masking + + """ + self.length = length + self.width = width + self.PA = PA + self.guiding_error = guiding_error + + half_n_axis = n_axis / 2 + dx = 1.2 * (length / n_axis) + dy = 1.2 * (length / n_axis) + x2d, y2d = np.meshgrid(np.arange(n_axis), np.arange(n_axis)) + x2d = (x2d - half_n_axis) * dx + y2d = (y2d - half_n_axis) * dy + self.x2d = x2d #Store x coordinates of 2D grid + self.y2d = y2d #Store y coordinates on 2D grid + self.f2d = np.zeros(np.shape(y2d)) #Store 2D grid of estimated fluxes' + half_length = 0.5 * self.length + half_width = 0.5 * self.width + self.mask = (x2d <= -half_width) | (x2d >= half_width) | (y2d <= -half_length) | (y2d >= half_length) #Create mask where every pixel inside slit is True and outside is False + def ABBA(self, y, x=None, print_info=True, plot=False): + """ + Given a collapsed spatial profile long slit for a point (stellar) source nodded + ABBA along the slit, generate an estimate of A and B nods' 2D PSFs. + The A and B nods are fit with Moffat functions which are then projected from 1D to 2D and then + a mask is applied representing the slit and the the fraction of light in the PSFs inside the mask + are integrated to estimate the fraction of light that passes through the slit. + + Parameters + ---------- + y: numpy array of floats + Array representing the spatial profile of the source on the slit. It should be the PSF for + a point source nodded ABBA on the slit. + x: numpy array of floats (optional) + Array representing the spatial position along the slit in pixel space corrisponding to y. + print_info: bool + Print information about the fit. + plot: bool + Set to True to plot the 1D profile along the slit, Moffat fits, and residuals + """ + slit_width_to_length_ratio = self.width / self.length + if x is None: #Generate equally spaced x array if it is not provided + ny = len(y) + x = (np.arange(ny) / ny) * self.length + #Find maximum and minimum + i_max = np.where(y == np.nanmax(y))[0][0] + i_min = np.where(y == np.nanmin(y))[0][0] + if np.size(i_max) > 1: #Error catch for the rare event when two or more pixels match the max or min y values + i_max = i_max[0] + if np.size(i_min) > 1: + i_min = i_min[0] + #Fit 2 Moffat distributions to the psfs from A and B positions (see https://docs.astropy.org/en/stable/modeling/compound-models.html) + g1 = models.Moffat1D(amplitude=y[i_max], x_0=x[i_max], alpha=1.0, gamma=1.0) + g2 = models.Moffat1D(amplitude=y[i_min], x_0=x[i_min], alpha=1.0, gamma=1.0) + gg_init = g1 + g2 + fitter = fitting.TRFLSQFitter() + gg_fit = fitter(gg_init, x, y) + if plot: + plt.figure() + plt.plot(x, y, '.', label='Std Star Data') + plt.plot(x, gg_fit(x), label='Moffat Distribution Fit') + plt.plot(x, y-gg_fit(x), label='Residuals') + plt.xlabel('Distance along slit (arcsec)') + plt.ylabel('Flux') + plt.legend() + plt.show() + if print_info: + #log.info('FWHM A beam:', gg_fit[0].fwhm) + #log.info('FWHM B beam:', gg_fit[1].fwhm) + print('FWHM A beam:', gg_fit[0].fwhm) + print('FWHM B beam:', gg_fit[1].fwhm) + #Numerically estimate light through slit + g1_fit = models.Moffat2D(amplitude=np.abs(gg_fit[0].amplitude), x_0=gg_fit[0].x_0 - 0.5*self.length, alpha=gg_fit[0].alpha, gamma=gg_fit[0].gamma) + g2_fit = models.Moffat2D(amplitude=np.abs(gg_fit[1].amplitude), x_0=gg_fit[1].x_0 - 0.5*self.length, alpha=gg_fit[1].alpha, gamma=gg_fit[1].gamma) + #simulate guiding error by "smearing out" PSF + position_angle_in_radians = self.PA * (np.pi)/180.0 #PA in radians + fraction_guiding_error = np.cos(position_angle_in_radians)*self.guiding_error #arcsec, estimated by doubling average fwhm of moffet functions + diff_x0 = fraction_guiding_error * np.cos(position_angle_in_radians) + diff_y0 = fraction_guiding_error * np.sin(position_angle_in_radians) + g1_fit.x_0 += 0.5*diff_x0 + g2_fit.x_0 += 0.5*diff_x0 + g1_fit.y_0 += 0.5*diff_y0 + g2_fit.y_0 += 0.5*diff_y0 + n = 5 + for i in range(n): + self.f2d += (1/n)*(g1_fit(self.y2d, self.x2d) + g2_fit(self.y2d, self.x2d)) + g1_fit.x_0 -= (1/(n-1))*diff_x0 + g2_fit.x_0 -= (1/(n-1))*diff_x0 + g1_fit.y_0 -= (1/(n-1))*diff_y0 + g2_fit.y_0 -= (1/(n-1))*diff_y0 + def estimate_slit_throughput(self, normalize=True): + """ + a mask is applied representing the slit and the the fraction of light in the PSFs inside the mask + are integrated to estimate the fraction of light that passes through the slit. + """ + if normalize: #You almost always want to normalize + self.normalize() + fraction_through_slit = np.nansum(self.f2d[~self.mask]) #Get fraction of light inside the slit mask + return fraction_through_slit + def clear(self): + """ + Clear 2D flux array + """ + self.f2d[:] = 0.0 + def normalize(self): + """ + #Normalize each pixel by fraction of starlight + """ + self.f2d = self.f2d / np.nansum(self.f2d) + def plot2d(self, **kwarg): + """ + Visualize the 2D distribution with slit overplotted + """ + plt.figure() + plt.imshow(self.f2d, origin='lower', aspect='auto', **kwarg) + plt.colorbar() + half_width = 0.5*self.width #Pkit slit outline + half_length = 0.5*self.length + # slit_ouline_x = np.array([-half_width, half_width, half_width, -half_width, -half_width]) + # slit_ouline_y = np.array([-half_length, -half_length, half_length, half_length, -half_length]) + # plt.plot(slit_ouline_x, slit_ouline_y, color='White', linewidth=3.0) + numerical_mask = np.ones(np.shape(self.mask)) + plt.contour(self.mask, levels=[0.0,0.5, 1.0], colors='white', linewidths=2) + plt.show() + + +class absoluteFluxCalibration: + def __init__(self, std_spec, synth_spec): + """ + A class to handle absolute flux calibration using a standard star spectrum and synthetic spectrum of the + standard star. + + Parameters + ---------- + std_spec: EchelleSpectrum, EchelleSpectrumList, Spectrum1D, or SpectrumList like object + Actual spectrum of the standard star + synth_spec: Spectrum1D, or SpectrumList like object from gollum + Synethic spectrum of the standard star from a stellar atmosphere model read in with gollum, or something similar + """ + self.std_spec = std_spec + self.synth_spec = synth_spec + + +class photometry: + def __init__(self): + f = FilterGenerator() + johnson_bands = np.array(['U', 'B','V','R','I']) #2MASS + twoMass_bands = np.array(['J', 'H', 'Ks']) #Johnson filters + self.bands = np.concatenate((johnson_bands, twoMass_bands)) + self.f0_lambda = np.array([3.96526e-9*1e4, 6.13268e-9*1e4, 3.62708e-9*1e4, 2.17037e-9*1e4, 1.12588e-9*1e4, #Source: http://svo2.cab.inta-csic.es/theory/fps3/index.php?mode=browse&gname=Generic&gname2=Bessell&asttype=, with units converted from erg cm^-2 s^-1 ang^-1 to erg cm^-2 s^-1 um^-1 by multiplying by 1e-4 + 3.129e-13*1e7, 1.133e-13*1e7, 4.283e-14*1e7]) #2MASS: Convert units to from W cm^-2 um^-1 to erg s^-1 cm^-2 um^-1 + self.x = np.arange(0.0, 10.0, 1e-6) + self.delta_lambda = np.abs(self.x[1]-self.x[0]) + n = len(self.bands) + tcurve_interp = [] + tcurve_resampled = [] + for i in range(n): + if self.bands[i] in twoMass_bands: + filt = f.reconstruct('2MASS/2MASS.'+self.bands[i]) + elif self.bands[i] in johnson_bands: + filt = f.reconstruct('Generic/Johnson.'+self.bands[i]) + interp_obj = interp1d(filt.wavelength.to('um'), filt.transmittance, kind='cubic', fill_value=0.0, bounds_error=False) + tcurve_interp.append(interp_obj) + tcurve_resampled.append(interp_obj(self.x)) + self.tcurve_interp = tcurve_interp + self.tcurve_resampled = tcurve_resampled + + # if band == 'K': + # band = 'Ks' #Catch to set K band band name to 'Ks' + # twoMass_bands = np.array(['J', 'H', 'Ks']) + # johnson_bands = np.array(['U', 'B','V','R','I']) + # if band in twoMass_bands: #2MASS NIR filters + # f0_lambda = (np.array([3.129e-13, 1.133e-13, 4.283e-14]) * 1e7) [band == twoMass_bands][0] #Convert units to from W cm^-2 um^-1 to erg s^-1 cm^-2 um^-1 + # filt = f.reconstruct('2MASS/2MASS.'+band) + # elif band in johnson_bands: #Johnson filters + # f0_lambda = (np.array([417.5e-11, 632e-11, 363.1e-11, 217.7e-11, 112.6e-11]) * 1e4 )[band == johnson_bands][0] #Source: Table A2 from Bessel (1998), with units converted from erg cm^-2 s^-1 ang^-1 to erg cm^-2 s^-1 um^-1 by multiplying by 1e-4 + # filt = f.reconstruct('Generic/Johnson.'+band) + # else: + # raise Exception( + # "Band"+band+" not recognized. Must be U, B, V, R, I, J, H, or Ks." + # ) + #self.f0_lambda = f0_lambda + + # self.tcurve_interp = interp1d(filt.wavelength.to('um'), filt.transmittance, kind='cubic', fill_value=0.0, bounds_error=False) #Create interp obj for the transmission curve + # self.tcurve_resampled = self.tcurve_interp(self.x) + #self.vega_V_flambdla_zero_point = 363.1e-7 #Vega flux zero point for V band from Bessell et al. (1998) in erg cm^2 s^-1 um^-1 + def scale(self, synth_spec, band='V', mag=0.0): + i = self.grab_band_index(band) + resampled_synthetic_spectrum = LinInterpResampler(synth_spec , self.x*u.um).flux.value + f_lambda = np.nansum(resampled_synthetic_spectrum * self.tcurve_resampled[i] * self.x * self.delta_lambda) / np.nansum(self.tcurve_resampled[i] * self.x * self.delta_lambda) + magnitude_scale = 10**(0.4*(-mag)) + # print('self.f0_lambda', self.f0_lambda[i]) + # print('f_lambda', f_lambda) + # print('magnitude_scale', magnitude_scale) + return synth_spec * (self.f0_lambda[i] / f_lambda) * magnitude_scale + def get(self, synth_spec, band='V', resample=True): + i = self.grab_band_index(band) + if resample: + resampled_synthetic_spectrum = LinInterpResampler(synth_spec , self.x*u.um).flux.value + f_lambda = np.nansum(resampled_synthetic_spectrum * self.tcurve_resampled[i] * self.x * self.delta_lambda) / np.nansum(self.tcurve_resampled[i] * self.x * self.delta_lambda) + else: + x = synth_spec.wavelength.to('um').value + delta_lambda = np.concatenate([[x[1]-x[0]], x[1:] - x[:-1]]) + interp_obj = interp1d(self.x, self.tcurve_resampled[i], kind='linear', fill_value=0.0, bounds_error=False) + resampled_tcurve = interp_obj(x) + goodpix = (synth_spec.flux.value > 1e-20) & (synth_spec.flux.value < 1e10) + f_lambda = np.nansum(synth_spec.flux.value[goodpix] * resampled_tcurve[goodpix] * x[goodpix] * delta_lambda[goodpix]) / np.nansum(resampled_tcurve[goodpix] * x[goodpix] * delta_lambda[goodpix]) + print(np.sum(np.isfinite(synth_spec.flux.value))) + #print(np.nansum(synth_spec.flux.value * resampled_tcurve * x * delta_lambda)) + print(np.nansum(resampled_tcurve * x * delta_lambda)) + magnitude = -2.5 * np.log10(f_lambda / self.f0_lambda[i]) + return magnitude + def grab_band_index(self, band): + if band == 'K': + band = 'Ks' #Catch to set K band band name to 'Ks' + i = np.where(band == self.bands)[0][0] + return i