{ "cells": [ { "cell_type": "markdown", "id": "1eff7d0d", "metadata": { "tags": [] }, "source": [ "# Spectral fitting example (Crab)" ] }, { "cell_type": "markdown", "id": "f1b5e8e3", "metadata": {}, "source": [ "This notebook fits the spectrum of a Crab simulated using MEGAlib and combined with background.\n", "\n", "[3ML](https://threeml.readthedocs.io/) is a high-level interface that allows multiple datasets from different instruments to be used coherently to fit the parameters of source model. A source model typically consists of a list of sources with parametrized spectral shapes, sky locations and, for extended sources, shape. Polarization is also possible. A \"coherent\" analysis, in this context, means that the source model parameters are fitted using all available datasets simultanously, rather than performing individual fits and finding a well-suited common model a posteriori. \n", "\n", "In order for a dataset to be included in 3ML, each instrument needs to provide a \"plugin\". Each plugin is responsible for reading the data, convolving the source model (provided by 3ML) with the instrument response, and returning a likelihood. In our case, we'll compute a binned Poisson likelihood:\n", "\n", "$$\n", "\\log \\mathcal{L}(\\mathbf{x}) = \\sum_i \\log \\frac{\\lambda_i(\\mathbf{x})^{d_i} \\exp (-\\lambda_i)}{d_i!}\n", "$$\n", "\n", "where $d_i$ are the counts on each bin and $\\lambda_i$ are the expected counts given a source model with parameters $\\mathbf{x}$. \n", "\n", "In this example, we will fit a single point source with a known location. We'll assume the background is known and fixed up to a scaling factor. Finally, we will fit a Band function:\n", "\n", "$$\n", "f(x) = K \\begin{cases} \\left(\\frac{x}{E_{piv}}\\right)^{\\alpha} \\exp \\left(-\\frac{(2+\\alpha)\n", " * x}{x_{p}}\\right) & x \\leq (\\alpha-\\beta) \\frac{x_{p}}{(\\alpha+2)} \\\\ \\left(\\frac{x}{E_{piv}}\\right)^{\\beta}\n", " * \\exp (\\beta-\\alpha)\\left[\\frac{(\\alpha-\\beta) x_{p}}{E_{piv}(2+\\alpha)}\\right]^{\\alpha-\\beta}\n", " * &x>(\\alpha-\\beta) \\frac{x_{p}}{(\\alpha+2)} \\end{cases}\n", "$$\n", "\n", "where $K$ (normalization), $\\alpha$ & $\\beta$ (spectral indeces), and $x_p$ (peak energy) are the free parameters, while $E_{piv}$ is the pivot energy which is fixed (and arbitrary).\n", "\n", "Considering these assumptions:\n", "\n", "$$\n", "\\lambda_i(\\mathbf{x}) = B*b_i + s_i(\\mathbf{x})\n", "$$\n", "\n", "where $B*b_i$ are the estimated counts due to background in each bin with $B$ the amplitude and $b_i$ the shape of the background, and $s_i$ are the corresponding expected counts from the source, the goal is then to find the values of $\\mathbf{x} = [K, \\alpha, \\beta, x_p]$ and $B$ that maximize $\\mathcal{L}$. These are the best estimations of the parameters.\n", "\n", "The final module needs to also fit the time-dependent background, handle multiple point-like and extended sources, as well as all the spectral models supported by 3ML. Eventually, it will also fit the polarization angle. However, this simple example already contains all the necessary pieces to do a fit." ] }, { "cell_type": "code", "execution_count": 1, "id": "53bc23a7", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:27:54.468732Z", "iopub.status.busy": "2026-02-19T20:27:54.468141Z", "iopub.status.idle": "2026-02-19T20:27:56.456943Z", "shell.execute_reply": "2026-02-19T20:27:56.456826Z" } }, "outputs": [ { "data": { "text/html": [ "
15:27:55 WARNING   The naima package is not available. Models that depend on it will not be         functions.py:43\n",
       "                  available                                                                                        \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m15:27:55\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The naima package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=376294;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=664334;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/functions.py#43\u001b\\\u001b[2m43\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it  functions.py:65\n",
       "                  will not be available.                                                                           \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The GSL library or the pygsl wrapper cannot be loaded. Models that depend on it \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=597324;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/functions.py\u001b\\\u001b[2mfunctions.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=365168;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/functions.py#65\u001b\\\u001b[2m65\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mwill not be available. \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   The ebltable package is not available. Models that depend on it will not be     absorption.py:33\n",
       "                  available                                                                                        \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The ebltable package is not available. Models that depend on it will not be \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=978470;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/absorption.py\u001b\\\u001b[2mabsorption.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=474433;file:///Users/imartin5/software/astromodels/astromodels/functions/functions_1D/absorption.py#33\u001b\\\u001b[2m33\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mavailable \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
15:27:56 INFO      Starting 3ML!                                                                     __init__.py:44\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m15:27:56\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m Starting 3ML! \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=598727;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=693021;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#44\u001b\\\u001b[2m44\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   WARNINGs here are NOT errors                                                      __init__.py:45\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m WARNINGs here are \u001b[0m\u001b[1;31mNOT\u001b[0m\u001b[1;38;5;251m errors \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=868112;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=788577;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#45\u001b\\\u001b[2m45\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   but are inform you about optional packages that can be installed                  __init__.py:46\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m but are inform you about optional packages that can be installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=883962;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=117650;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#46\u001b\\\u001b[2m46\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING    to disable these messages, turn off start_warning in your config file            __init__.py:47\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m \u001b[0m\u001b[1;31m to disable these messages, turn off start_warning in your config file\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=352873;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=611440;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#47\u001b\\\u001b[2m47\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   ROOT minimizer not available                                                minimization.py:1208\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m ROOT minimizer not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=123546;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=975431;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py#1208\u001b\\\u001b[2m1208\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Multinest minimizer not available                                           minimization.py:1218\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Multinest minimizer not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=116567;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=226842;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py#1218\u001b\\\u001b[2m1218\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   PyGMO is not available                                                      minimization.py:1228\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m PyGMO is not available \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=456212;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py\u001b\\\u001b[2mminimization.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=801809;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/minimizer/minimization.py#1228\u001b\\\u001b[2m1228\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   The cthreeML package is not installed. You will not be able to use plugins which  __init__.py:95\n",
       "                  require the C/C++ interface (currently HAWC)                                                     \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The cthreeML package is not installed. You will not be able to use plugins which \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=285205;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=149356;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#95\u001b\\\u001b[2m95\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mrequire the C/C++ interface \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;38;5;251mcurrently HAWC\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Could not import plugin HAWCLike.py. Do you have the relative instrument         __init__.py:136\n",
       "                  software installed and configured?                                                               \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin HAWCLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=297868;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=174224;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#136\u001b\\\u001b[2m136\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Could not import plugin FermiLATLike.py. Do you have the relative instrument     __init__.py:136\n",
       "                  software installed and configured?                                                               \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Could not import plugin FermiLATLike.py. Do you have the relative instrument \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=689257;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=335756;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#136\u001b\\\u001b[2m136\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251msoftware installed and configured? \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   No fermitools installed                                              lat_transient_builder.py:44\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m No fermitools installed \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=527419;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py\u001b\\\u001b[2mlat_transient_builder.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=462093;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/utils/data_builders/fermi/lat_transient_builder.py#44\u001b\\\u001b[2m44\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Env. variable OMP_NUM_THREADS is not set. Please set it to 1 for optimal         __init__.py:345\n",
       "                  performances in 3ML                                                                              \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable OMP_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=62838;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=851712;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#345\u001b\\\u001b[2m345\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Env. variable MKL_NUM_THREADS is not set. Please set it to 1 for optimal         __init__.py:345\n",
       "                  performances in 3ML                                                                              \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable MKL_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=673516;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=880001;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#345\u001b\\\u001b[2m345\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to 1 for optimal     __init__.py:345\n",
       "                  performances in 3ML                                                                              \n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m Env. variable NUMEXPR_NUM_THREADS is not set. Please set it to \u001b[0m\u001b[1;37m1\u001b[0m\u001b[1;38;5;251m for optimal \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=275156;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=257989;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/__init__.py#345\u001b\\\u001b[2m345\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[38;5;46m \u001b[0m \u001b[1;38;5;251mperformances in 3ML \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from cosipy import BinnedData\n", "from cosipy.spacecraftfile import SpacecraftHistory\n", "from cosipy.response.FullDetectorResponse import FullDetectorResponse\n", "from cosipy.util import fetch_wasabi_file\n", "\n", "from cosipy.statistics import PoissonLikelihood\n", "from cosipy.background_estimation import FreeNormBinnedBackground\n", "from cosipy.interfaces import ThreeMLPluginInterface\n", "from cosipy.response import BinnedThreeMLModelFolding, BinnedInstrumentResponse, BinnedThreeMLPointSourceResponse\n", "from cosipy.data_io import EmCDSBinnedData\n", "\n", "import sys\n", "\n", "import astropy.units as u\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from threeML import Band, PointSource, Model, JointLikelihood, DataList\n", "from astromodels import Parameter, Powerlaw\n", "\n", "from pathlib import Path\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "id": "727dc86f", "metadata": {}, "source": [ "## Download and read in binned data" ] }, { "cell_type": "markdown", "id": "a35274fd", "metadata": {}, "source": [ "Define the path to the directory containing the data, detector response, orientation file, and yaml files if they have already been downloaded, or the directory to download the files into" ] }, { "cell_type": "code", "execution_count": 2, "id": "724affc6", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:27:56.458505Z", "iopub.status.busy": "2026-02-19T20:27:56.458271Z", "iopub.status.idle": "2026-02-19T20:27:56.459915Z", "shell.execute_reply": "2026-02-19T20:27:56.459681Z" } }, "outputs": [], "source": [ "data_path = Path(\"\") # /path/to/files. Current dir by default" ] }, { "cell_type": "markdown", "id": "0c2df2f1", "metadata": {}, "source": [ "Download the orientation file (684.38 MB)" ] }, { "cell_type": "code", "execution_count": 3, "id": "67f61e08", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:27:56.463574Z", "iopub.status.busy": "2026-02-19T20:27:56.463433Z", "iopub.status.idle": "2026-02-19T20:27:57.665961Z", "shell.execute_reply": "2026-02-19T20:27:57.665827Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "A file named 20280301_3_month_with_orbital_info.ori already exists with the specified checksum (416fcc296fc37a056a069378a2d30cb2). Skipping.\n" ] } ], "source": [ "fetch_wasabi_file('COSI-SMEX/DC2/Data/Orientation/20280301_3_month_with_orbital_info.ori', output=str(data_path / '20280301_3_month_with_orbital_info.ori'), checksum = '416fcc296fc37a056a069378a2d30cb2')" ] }, { "cell_type": "markdown", "id": "02c44617", "metadata": {}, "source": [ "Read in the spacecraft orientation file" ] }, { "cell_type": "code", "execution_count": 4, "id": "4944ec3a", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:27:57.667620Z", "iopub.status.busy": "2026-02-19T20:27:57.667453Z", "iopub.status.idle": "2026-02-19T20:28:35.601952Z", "shell.execute_reply": "2026-02-19T20:28:35.601801Z" } }, "outputs": [], "source": [ "sc_orientation = SpacecraftHistory.open(data_path / \"20280301_3_month_with_orbital_info.ori\")" ] }, { "cell_type": "markdown", "id": "f4d7f359-e934-4063-8670-ebe00f471131", "metadata": {}, "source": [ "Download signal and background data. FreeNormBinnedBackground supports multiple components, the normalization of all of them would be fitted simultanously. To make this example run fast, the default is to combined all of them into a single background model." ] }, { "cell_type": "code", "execution_count": 5, "id": "901211ca", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:35.605238Z", "iopub.status.busy": "2026-02-19T20:28:35.605040Z", "iopub.status.idle": "2026-02-19T20:28:35.627959Z", "shell.execute_reply": "2026-02-19T20:28:35.627755Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "A file named crab_standard_3months_binned_data_filtered_with_SAAcut.fits.gz.hdf5 already exists with the specified checksum (405862396dea2be79d7892d6d5bb50d8). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named PrimaryProtons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (7597f04210e59340a0888c66fc5cbc63). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named PrimaryAlphas_WithDetCstbinned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (76a68da730622851b8e1c749248c3b40). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named AlbedoPhotons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (76c58361d2c9b43b66ef2e41c18939c4). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named AlbedoNeutrons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (8f3cb418c637b839665a4fcbd000d2eb). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named CosmicPhotons_3months_binned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (93c4619b383572d318328e6380e35a70). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named GalTotal_SA100_F98_3months_binned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (d0415d4d04b040af47f23f5d08cb7d64). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named SecondaryPositrons_3months_binned_data_filtered_with_SAAcut.hdf5 already exists with the specified checksum (5fec2212dcdbb4c43c3ac02f02524f68). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named SecondaryProtons_WithDetCstbinned_data_filtered_with_SAAcut.fits.gz.hdf5 already exists with the specified checksum (78aefa46707c98563294a898a62845c1). Skipping.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "A file named SAA_3months_unbinned_data_filtered_with_SAAcut_statreduced_akaHEPD01result.hdf5 already exists with the specified checksum (fc69fbbfd94cd595f57a8b11fc721169). Skipping.\n" ] } ], "source": [ "single_bkg_fit = True\n", "\n", "crab_data_path = data_path / \"crab_standard_3months_binned_data_filtered_with_SAAcut.fits.gz.hdf5\"\n", "fetch_wasabi_file('COSI-SMEX/cosipy_tutorials/crab_spectral_fit_galactic_frame/crab_standard_3months_binned_data_filtered_with_SAAcut.fits.gz.hdf5',\n", " output=crab_data_path, checksum = '405862396dea2be79d7892d6d5bb50d8')\n", "\n", "bkg_components = {\"PrimaryProtons\":{'filename':'PrimaryProtons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5', 'checksum':'7597f04210e59340a0888c66fc5cbc63'},\n", " \"PrimaryAlphas\": {'filename': 'PrimaryAlphas_WithDetCstbinned_data_filtered_with_SAAcut.hdf5', 'checksum': '76a68da730622851b8e1c749248c3b40'},\n", " \"AlbedoPhotons\": {'filename': 'AlbedoPhotons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5', 'checksum': '76c58361d2c9b43b66ef2e41c18939c4'},\n", " \"AlbedoNeutrons\": {'filename': 'AlbedoNeutrons_WithDetCstbinned_data_filtered_with_SAAcut.hdf5', 'checksum': '8f3cb418c637b839665a4fcbd000d2eb'},\n", " \"CosmicPhotons\": {'filename': 'CosmicPhotons_3months_binned_data_filtered_with_SAAcut.hdf5', 'checksum': '93c4619b383572d318328e6380e35a70'},\n", " \"CosmicDiffuse\": {'filename': 'GalTotal_SA100_F98_3months_binned_data_filtered_with_SAAcut.hdf5', 'checksum': 'd0415d4d04b040af47f23f5d08cb7d64'},\n", " \"SecondaryPositrons\": {'filename': 'SecondaryPositrons_3months_binned_data_filtered_with_SAAcut.hdf5', 'checksum': '5fec2212dcdbb4c43c3ac02f02524f68'},\n", " \"SecondaryProtons\": {'filename': 'SecondaryProtons_WithDetCstbinned_data_filtered_with_SAAcut.fits.gz.hdf5', 'checksum': '78aefa46707c98563294a898a62845c1'},\n", " \"SAAprotons\": {'filename': 'SAA_3months_unbinned_data_filtered_with_SAAcut_statreduced_akaHEPD01result.hdf5', 'checksum': 'fc69fbbfd94cd595f57a8b11fc721169'},\n", " }\n", "\n", "# Download the binned background data \n", "for bkg in bkg_components.values():\n", " wasabi_path = 'COSI-SMEX/cosipy_tutorials/crab_spectral_fit_galactic_frame/'+bkg['filename']\n", " fetch_wasabi_file(wasabi_path, output=data_path/bkg['filename'], checksum = bkg['checksum'])" ] }, { "cell_type": "markdown", "id": "675ab82f", "metadata": {}, "source": [ "Load binned .hdf5 files. Create BinnedData objects for the Crab only, Crab+background, and background only. The Crab only simulation is not used for the spectral fit, but can be used to compare the fitted spectrum to the source simulation" ] }, { "cell_type": "code", "execution_count": 6, "id": "ac0604e5", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:35.631240Z", "iopub.status.busy": "2026-02-19T20:28:35.630824Z", "iopub.status.idle": "2026-02-19T20:28:36.983485Z", "shell.execute_reply": "2026-02-19T20:28:36.983373Z" } }, "outputs": [], "source": [ "crab = BinnedData(data_path / \"crab.yaml\")\n", "crab.load_binned_data_from_hdf5(binned_data=crab_data_path)\n", "\n", "for bkg in bkg_components.values():\n", " binned_data = BinnedData(data_path / \"background.yaml\")\n", " binned_data.load_binned_data_from_hdf5(binned_data=data_path/bkg['filename'])\n", " bkg['dist'] = binned_data.binned_data.project('Em', 'Phi', 'PsiChi')\n", "\n", "total_bkg = None\n", "for bkg in bkg_components.values():\n", " if total_bkg is None:\n", " total_bkg = bkg['dist']\n", " else:\n", " total_bkg = total_bkg + bkg['dist'] # Issues with in-place operations for sparse contents\n", "\n", "if single_bkg_fit:\n", " bkg_dist = {\"total_bkg\":total_bkg}\n", "else:\n", " bkg_dist = {l: b['dist'] for l, b in bkg_components.items()}\n", "\n", "# Workaround to avoid inf values. Out bkg should be smooth, but currently it's not.\n", "# Reproduces results before refactoring. It's not _exactly_ the same, since this fudge value was 1e-12, and\n", "# it was added to the expectation, not the normalized bkg\n", "for bckfile in bkg_dist.keys() :\n", " bkg_dist[bckfile] += sys.float_info.min" ] }, { "cell_type": "markdown", "id": "67b1f2a3", "metadata": {}, "source": [ "Fetch and open the response" ] }, { "cell_type": "code", "execution_count": 7, "id": "e9062c51", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:36.987179Z", "iopub.status.busy": "2026-02-19T20:28:36.986989Z", "iopub.status.idle": "2026-02-19T20:28:37.456019Z", "shell.execute_reply": "2026-02-19T20:28:37.455806Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "A file named ResponseContinuum.o3.e100_10000.b10log.s10396905069491.m2284.filtered.nonsparse.binnedimaging.imagingresponse.h5 already exists with the specified checksum (7121f094be50e7bfe9b31e53015b0e85). Skipping.\n" ] } ], "source": [ "dr_path = str(data_path / \"ResponseContinuum.o3.e100_10000.b10log.s10396905069491.m2284.filtered.nonsparse.binnedimaging.imagingresponse.h5\") # path to detector response\n", "fetch_wasabi_file('COSI-SMEX/develop/Data/Responses/ResponseContinuum.o3.e100_10000.b10log.s10396905069491.m2284.filtered.nonsparse.binnedimaging.imagingresponse.h5',\n", " output=str(dr_path), checksum = '7121f094be50e7bfe9b31e53015b0e85')\n", "\n", "dr = FullDetectorResponse.open(dr_path)" ] }, { "cell_type": "markdown", "id": "87bfd95d", "metadata": { "tags": [] }, "source": [ "## Perform spectral fit" ] }, { "cell_type": "markdown", "id": "7928684b", "metadata": {}, "source": [ "Set background parameter, which is used to fit the amplitude of the background, and instantiate the COSI 3ML plugin" ] }, { "cell_type": "code", "execution_count": 8, "id": "ca15cdc1-71a3-43bd-a9c6-5f05e67676ab", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:37.458869Z", "iopub.status.busy": "2026-02-19T20:28:37.458645Z", "iopub.status.idle": "2026-02-19T20:28:37.505817Z", "shell.execute_reply": "2026-02-19T20:28:37.505671Z" } }, "outputs": [], "source": [ "# Wrap the raw BinnedData objects into the appropiate data interface.\n", "data = EmCDSBinnedData(crab.binned_data.project('Em', 'Phi', 'PsiChi') + total_bkg)\n", "\n", "# Use the background model to initialize a background expectation interface.\n", "# For this particular background interface implementation, only the normalization values are free.\n", "bkg = FreeNormBinnedBackground(bkg_dist,\n", " sc_history=sc_orientation,\n", " copy = False)\n", "\n", "# Wrape the raw response with BinnedInstrumentResponseInterface implementation\n", "instrument_response = BinnedInstrumentResponse(dr, data)\n", "\n", "# Initialize the 3ML Point Source response\n", "\n", "# Note: Currently we're using the same NuLambda, Ei and Pol axes as the underlying FullDetectorResponse,\n", "# matching the behavior of v0.3. This is all the current BinnedInstrumentResponse can do.\n", "# In principle, this can be decoupled, and a BinnedInstrumentResponseInterface implementation\n", "# can provide the response for an arbitrary directions, Ei and Pol values.\n", "psr = BinnedThreeMLPointSourceResponse(data = data,\n", " instrument_response = instrument_response,\n", " sc_history=sc_orientation,\n", " energy_axis = dr.axes['Ei'],\n", " polarization_axis = dr.axes['Pol'] if 'Pol' in dr.axes.labels else None,\n", " nside = 2*data.axes['PsiChi'].nside)\n", "\n", "# Pass the 3ML Point Source response to interface implementation that will peform the \n", "# folding with the spectrum\n", "response = BinnedThreeMLModelFolding(data = data, point_source_response = psr)\n", "\n", "# Likelihood to use\n", "like_fun = PoissonLikelihood(data, response, bkg)\n", "\n", "# Init 3ML plugin\n", "cosi = ThreeMLPluginInterface('cosi',\n", " like_fun,\n", " response,\n", " bkg)\n", "\n", "# Init background parameters, consider as \"nuisance parameters\"\n", "for bkg_label in bkg_dist.keys():\n", " cosi.bkg_parameter[bkg_label] = Parameter(bkg_label, # background parameter\n", " 1, # initial value of parameter\n", " min_value=0, # minimum value of parameter\n", " max_value= 100 if single_bkg_fit else 20, # maximum value of parameter\n", " delta=0.05, # initial step used by fitting engine\n", " unit = u.Hz\n", " )" ] }, { "cell_type": "markdown", "id": "cf105ddd", "metadata": {}, "source": [ "Define a point source at the known location with a Band function spectrum and add it to the model. The initial values of the Band function parameters are set to the true values used to simulate the source" ] }, { "cell_type": "code", "execution_count": 9, "id": "1b02ed80", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:37.509465Z", "iopub.status.busy": "2026-02-19T20:28:37.509235Z", "iopub.status.idle": "2026-02-19T20:28:37.512208Z", "shell.execute_reply": "2026-02-19T20:28:37.512008Z" } }, "outputs": [ { "data": { "text/html": [ "
15:28:37 WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m15:28:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=33936;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=621398;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "l = 184.56\n", "b = -5.78\n", "\n", "alpha = -1.99\n", "beta = -2.32\n", "E0 = 531. * (alpha - beta) * u.keV\n", "xp = E0 * (alpha + 2) / (alpha - beta)\n", "piv = 500. * u.keV\n", "K = 3.07e-5 / u.cm / u.cm / u.s / u.keV\n", "\n", "spectrum = Band()\n", "\n", "spectrum.alpha.min_value = -2.14\n", "spectrum.alpha.max_value = 3.0\n", "spectrum.beta.min_value = -5.0\n", "spectrum.beta.max_value = -2.15\n", "spectrum.xp.min_value = 1.0\n", "spectrum.alpha.delta = 0.01\n", "spectrum.beta.delta = 0.01\n", "\n", "spectrum.alpha.value = alpha\n", "spectrum.beta.value = beta\n", "spectrum.xp.value = xp.value\n", "spectrum.K.value = K.value\n", "spectrum.piv.value = piv.value\n", "\n", "spectrum.xp.unit = xp.unit\n", "spectrum.K.unit = K.unit\n", "spectrum.piv.unit = piv.unit\n", "\n", "source = PointSource(\"source\", # Name of source (arbitrary, but needs to be unique)\n", " l = l, # Longitude (deg)\n", " b = b, # Latitude (deg)\n", " spectral_shape = spectrum) # Spectral model\n", "\n", "# Optional: free the position parameters\n", "#source.position.l.free = True\n", "#source.position.b.free = True\n", "\n", "model = Model(source) # Model with single source. If we had multiple sources, we would do Model(source1, source2, ...)" ] }, { "cell_type": "markdown", "id": "8d193c42", "metadata": {}, "source": [ "Gather all plugins and combine with the model in a JointLikelihood object, then perform maximum likelihood fit" ] }, { "cell_type": "code", "execution_count": 10, "id": "e0056610", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:37.514201Z", "iopub.status.busy": "2026-02-19T20:28:37.514018Z", "iopub.status.idle": "2026-02-19T20:28:46.679583Z", "shell.execute_reply": "2026-02-19T20:28:46.679270Z" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
15:28:37 INFO      set the minimizer to minuit                                              joint_likelihood.py:994\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m15:28:37\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;49mINFO \u001b[0m \u001b[1;38;5;251m set the minimizer to minuit \u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=633226;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/classicMLE/joint_likelihood.py\u001b\\\u001b[2mjoint_likelihood.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=68611;file:///Users/imartin5/software/miniforge3/envs/cosipy2/lib/python3.11/site-packages/threeML/classicMLE/joint_likelihood.py#994\u001b\\\u001b[2m994\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "WARNING IntegrationWarning: The occurrence of roundoff error is detected, which prevents \n", " the requested tolerance from being achieved. The error may be \n", " underestimated.\n", "\n" ] }, { "data": { "text/html": [ "
15:28:46 WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m15:28:46\u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=328496;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=536016;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Best fit values:\n",
       "\n",
       "
\n" ], "text/plain": [ "\u001b[1;4;38;5;49mBest fit values:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
resultunit
parameter
source.spectrum.main.Band.K(5.41 +/- 0.11) x 10^-51 / (keV s cm2)
source.spectrum.main.Band.alpha-1.838 +/- 0.005
source.spectrum.main.Band.xp(1.78 +/- 0.09) x 10keV
source.spectrum.main.Band.beta-2.2211 +/- 0.0034
total_bkg(2.22876 +/- 0.00024) x 10Hz
\n", "
" ], "text/plain": [ " result unit\n", "parameter \n", "source.spectrum.main.Band.K (5.41 +/- 0.11) x 10^-5 1 / (keV s cm2)\n", "source.spectrum.main.Band.alpha -1.838 +/- 0.005 \n", "source.spectrum.main.Band.xp (1.78 +/- 0.09) x 10 keV\n", "source.spectrum.main.Band.beta -2.2211 +/- 0.0034 \n", "total_bkg (2.22876 +/- 0.00024) x 10 Hz" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Correlation matrix:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mCorrelation matrix:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "
1.000.60-0.23-0.06-0.03
0.601.000.590.16-0.01
-0.230.591.00-0.06-0.02
-0.060.16-0.061.00-0.19
-0.03-0.01-0.02-0.191.00
" ], "text/plain": [ " 1.00 0.60 -0.23 -0.06 -0.03\n", " 0.60 1.00 0.59 0.16 -0.01\n", "-0.23 0.59 1.00 -0.06 -0.02\n", "-0.06 0.16 -0.06 1.00 -0.19\n", "-0.03 -0.01 -0.02 -0.19 1.00" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Values of -log(likelihood) at the minimum:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mValues of -\u001b[0m\u001b[1;4;38;5;49mlog\u001b[0m\u001b[1;4;38;5;49m(\u001b[0m\u001b[1;4;38;5;49mlikelihood\u001b[0m\u001b[1;4;38;5;49m)\u001b[0m\u001b[1;4;38;5;49m at the minimum:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
-log(likelihood)
cosi-1169452582.9882479
total-1169452582.9882479
\n", "
" ], "text/plain": [ " -log(likelihood)\n", "cosi -1169452582.9882479\n", "total -1169452582.9882479" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Values of statistical measures:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mValues of statistical measures:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statistical measures
AIC-2338905155.9762354
BIC-2338905104.2386346
\n", "
" ], "text/plain": [ " statistical measures\n", "AIC -2338905155.9762354\n", "BIC -2338905104.2386346" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#[magic commented out by run_tutorials.py]%%time\n", "\n", "plugins = DataList(cosi) # If we had multiple instruments, we would do e.g. DataList(cosi, lat, hawc, ...)\n", "\n", "like = JointLikelihood(model, plugins, verbose = False)\n", "\n", "_ = like.fit()" ] }, { "cell_type": "markdown", "id": "1e888a53", "metadata": {}, "source": [ "## Error propagation and plotting" ] }, { "cell_type": "markdown", "id": "5622b48e", "metadata": {}, "source": [ "Define Band function spectrum injected into MEGAlib" ] }, { "cell_type": "code", "execution_count": 11, "id": "3d2c61a3", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:46.687799Z", "iopub.status.busy": "2026-02-19T20:28:46.686968Z", "iopub.status.idle": "2026-02-19T20:28:46.690649Z", "shell.execute_reply": "2026-02-19T20:28:46.690163Z" } }, "outputs": [ { "data": { "text/html": [ "
         WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=426840;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=393535;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "alpha_inj = -1.99\n", "beta_inj = -2.32\n", "E0_inj = 531. * (alpha_inj - beta_inj) * u.keV\n", "xp_inj = E0_inj * (alpha_inj + 2) / (alpha_inj - beta_inj)\n", "piv_inj = 100. * u.keV\n", "K_inj = 7.56e-4 / u.cm / u.cm / u.s / u.keV\n", "\n", "spectrum_inj = Band()\n", "\n", "spectrum_inj.alpha.min_value = -2.14\n", "spectrum_inj.alpha.max_value = 3.0\n", "spectrum_inj.beta.min_value = -5.0\n", "spectrum_inj.beta.max_value = -2.15\n", "spectrum_inj.xp.min_value = 1.0\n", "\n", "spectrum_inj.alpha.value = alpha_inj\n", "spectrum_inj.beta.value = beta_inj\n", "spectrum_inj.xp.value = xp_inj.value\n", "spectrum_inj.K.value = K_inj.value\n", "spectrum_inj.piv.value = piv_inj.value\n", "\n", "spectrum_inj.xp.unit = xp_inj.unit\n", "spectrum_inj.K.unit = K_inj.unit\n", "spectrum_inj.piv.unit = piv_inj.unit" ] }, { "cell_type": "markdown", "id": "7b61657c", "metadata": {}, "source": [ "The summary of the results above tell you the optimal values of the parameters, as well as the errors. Propogate the errors to the \"evaluate_at\" method of the spectrum" ] }, { "cell_type": "code", "execution_count": 12, "id": "753ae553", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:46.703222Z", "iopub.status.busy": "2026-02-19T20:28:46.702732Z", "iopub.status.idle": "2026-02-19T20:28:46.734558Z", "shell.execute_reply": "2026-02-19T20:28:46.734186Z" }, "scrolled": true, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
Best fit values:\n",
       "\n",
       "
\n" ], "text/plain": [ "\u001b[1;4;38;5;49mBest fit values:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
resultunit
parameter
source.spectrum.main.Band.K(5.41 +/- 0.11) x 10^-51 / (keV s cm2)
source.spectrum.main.Band.alpha-1.838 +/- 0.005
source.spectrum.main.Band.xp(1.78 +/- 0.09) x 10keV
source.spectrum.main.Band.beta-2.2211 +/- 0.0034
total_bkg(2.22876 +/- 0.00024) x 10Hz
\n", "
" ], "text/plain": [ " result unit\n", "parameter \n", "source.spectrum.main.Band.K (5.41 +/- 0.11) x 10^-5 1 / (keV s cm2)\n", "source.spectrum.main.Band.alpha -1.838 +/- 0.005 \n", "source.spectrum.main.Band.xp (1.78 +/- 0.09) x 10 keV\n", "source.spectrum.main.Band.beta -2.2211 +/- 0.0034 \n", "total_bkg (2.22876 +/- 0.00024) x 10 Hz" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Correlation matrix:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mCorrelation matrix:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "
1.000.60-0.23-0.06-0.03
0.601.000.590.16-0.01
-0.230.591.00-0.06-0.02
-0.060.16-0.061.00-0.19
-0.03-0.01-0.02-0.191.00
" ], "text/plain": [ " 1.00 0.60 -0.23 -0.06 -0.03\n", " 0.60 1.00 0.59 0.16 -0.01\n", "-0.23 0.59 1.00 -0.06 -0.02\n", "-0.06 0.16 -0.06 1.00 -0.19\n", "-0.03 -0.01 -0.02 -0.19 1.00" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Values of -log(likelihood) at the minimum:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mValues of -\u001b[0m\u001b[1;4;38;5;49mlog\u001b[0m\u001b[1;4;38;5;49m(\u001b[0m\u001b[1;4;38;5;49mlikelihood\u001b[0m\u001b[1;4;38;5;49m)\u001b[0m\u001b[1;4;38;5;49m at the minimum:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
-log(likelihood)
cosi-1169452582.9882479
total-1169452582.9882479
\n", "
" ], "text/plain": [ " -log(likelihood)\n", "cosi -1169452582.9882479\n", "total -1169452582.9882479" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
       "Values of statistical measures:\n",
       "\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[1;4;38;5;49mValues of statistical measures:\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statistical measures
AIC-2338905155.9762354
BIC-2338905104.2386346
\n", "
" ], "text/plain": [ " statistical measures\n", "AIC -2338905155.9762354\n", "BIC -2338905104.2386346" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] }, { "data": { "text/html": [ "
         WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=256432;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=240062;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=112351;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=728951;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
         WARNING   The current value of the parameter beta (-2.0) was above the new maximum -2.15. parameter.py:810\n",
       "
\n" ], "text/plain": [ "\u001b[38;5;46m \u001b[0m\u001b[38;5;46m \u001b[0m\u001b[38;5;134mWARNING \u001b[0m \u001b[1;38;5;251m The current value of the parameter beta \u001b[0m\u001b[1;38;5;251m(\u001b[0m\u001b[1;37m-2.0\u001b[0m\u001b[1;38;5;251m)\u001b[0m\u001b[1;38;5;251m was above the new maximum \u001b[0m\u001b[1;37m-2.15\u001b[0m\u001b[1;38;5;251m.\u001b[0m\u001b[1;38;5;251m \u001b[0m\u001b]8;id=429958;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py\u001b\\\u001b[2mparameter.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=140519;file:///Users/imartin5/software/astromodels/astromodels/core/parameter.py#810\u001b\\\u001b[2m810\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " * source (point source):\n", " * position:\n", " * l:\n", " * value: 184.56\n", " * desc: Galactic longitude\n", " * min_value: 0.0\n", " * max_value: 360.0\n", " * unit: deg\n", " * is_normalization: false\n", " * b:\n", " * value: -5.78\n", " * desc: Galactic latitude\n", " * min_value: -90.0\n", " * max_value: 90.0\n", " * unit: deg\n", " * is_normalization: false\n", " * equinox: J2000\n", " * spectrum:\n", " * main:\n", " * Band:\n", " * K:\n", " * value: 5.4051037971774306e-05\n", " * desc: Differential flux at the pivot energy\n", " * min_value: 1.0e-50\n", " * max_value: null\n", " * unit: keV-1 s-1 cm-2\n", " * is_normalization: true\n", " * alpha:\n", " * value: -1.8382906397995242\n", " * desc: low-energy photon index\n", " * min_value: -2.14\n", " * max_value: 3.0\n", " * unit: ''\n", " * is_normalization: false\n", " * xp:\n", " * value: 17.80704053659518\n", " * desc: peak in the x * x * N (nuFnu if x is a energy)\n", " * min_value: 1.0\n", " * max_value: null\n", " * unit: keV\n", " * is_normalization: false\n", " * beta:\n", " * value: -2.221118197373546\n", " * desc: high-energy photon index\n", " * min_value: -5.0\n", " * max_value: -2.15\n", " * unit: ''\n", " * is_normalization: false\n", " * piv:\n", " * value: 500.0\n", " * desc: pivot energy\n", " * min_value: null\n", " * max_value: null\n", " * unit: keV\n", " * is_normalization: false\n", " * polarization: {}\n", "\n" ] } ], "source": [ "results = like.results\n", "\n", "print(results.display())\n", "\n", "parameters = {par.name:results.get_variates(par.path)\n", " for par in results.optimized_model[\"source\"].parameters.values()\n", " if par.free}\n", "\n", "results_err = results.propagate(results.optimized_model[\"source\"].spectrum.main.shape.evaluate_at, **parameters)\n", "\n", "print(results.optimized_model[\"source\"])" ] }, { "cell_type": "markdown", "id": "d127d06a", "metadata": {}, "source": [ "Evaluate the flux and errors at a range of energies for the fitted and injected spectra, and the simulated source flux" ] }, { "cell_type": "code", "execution_count": 13, "id": "26b1ba71", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:46.763658Z", "iopub.status.busy": "2026-02-19T20:28:46.763304Z", "iopub.status.idle": "2026-02-19T20:28:50.191985Z", "shell.execute_reply": "2026-02-19T20:28:50.191884Z" } }, "outputs": [], "source": [ "energy = np.geomspace(100*u.keV,10*u.MeV).to_value(u.keV)\n", "\n", "flux_lo = np.zeros_like(energy)\n", "flux_median = np.zeros_like(energy)\n", "flux_hi = np.zeros_like(energy)\n", "flux_inj = np.zeros_like(energy)\n", "\n", "for i, e in enumerate(energy):\n", " flux = results_err(e)\n", " flux_median[i] = flux.median\n", " flux_lo[i], flux_hi[i] = flux.equal_tail_interval(cl=0.68)\n", " flux_inj[i] = spectrum_inj.evaluate_at(e)\n", " \n", "binned_energy_edges = crab.binned_data.axes['Em'].edges.value\n", "binned_energy = np.array([])\n", "bin_sizes = np.array([])\n", "\n", "for i in range(len(binned_energy_edges)-1):\n", " binned_energy = np.append(binned_energy, (binned_energy_edges[i+1] + binned_energy_edges[i]) / 2)\n", " bin_sizes = np.append(bin_sizes, binned_energy_edges[i+1] - binned_energy_edges[i])\n", "\n", "expectation = response.expectation()" ] }, { "cell_type": "markdown", "id": "7993edb6", "metadata": {}, "source": [ "Plot the fitted and injected spectra" ] }, { "cell_type": "code", "execution_count": 14, "id": "57db086e", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:50.196015Z", "iopub.status.busy": "2026-02-19T20:28:50.195830Z", "iopub.status.idle": "2026-02-19T20:28:50.360763Z", "shell.execute_reply": "2026-02-19T20:28:50.360669Z" }, "tags": [] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAloAAAHECAYAAADh34REAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUVklEQVR4nO3dCZyNdfvH8Wv2zYxliJB9iYoiIiUeW+iRSlrU02YplaQeytO+/FOptCoSUT0oWSoRQiFPC1LITij7NmP25f+6ftzHOWfOmfXczsw5n/frdTfnnPss9zljmu/8ftd9/UJyc3NzBQAAAD4X6vunBAAAAEELAADARoxoAQAA2ISgBQAAYBOCFgAAgE0IWgAAADYhaAEAANiEoAUAAGCTcLueOFhkZGTIq6++Kj///LMkJydLnTp15L777pPzzz/f34cGAAD8jBGtEsrOzpZq1arJ22+/LXPnzpXrr79eHn30UUlJSfHNdwgAAJRZBK0SiomJkdtvv12qVq0qoaGh0qlTJwkPD5ddu3b55jsEAADKrKCbOtSRpqlTp8r69etlw4YNkpSUZEagunfv7nFacMKECfLNN9+Y+9WvX1/69+8vrVq18vr8GrD0vjVq1LD5nQAAgNIu6Ea0jh07JpMmTZKdO3dKgwYN8r3vCy+8INOnT5cuXbrIkCFDzIjV8OHDZe3atR7vn56eLs8995z069dPypUrZ9M7AAAAZUXQBa3ExESZOXOmfPrpp3LPPfd4vZ+OeC1atEgGDhwogwcPll69esmYMWNMPdbYsWPz3D8rK0ueeOIJM5KlU4kAAABBF7QiIyNN2CrI0qVLJSwszAQsS1RUlPTs2VPWrVsn+/btc9yek5NjRrJCQkJk5MiR5isAAEDQBa3C2rx5s9SsWVPi4uJcbm/SpIn5umXLFsdto0ePlkOHDsnTTz9tCuEBAAAUqcALDU6eRr6s2w4ePGi+7t27V7788kszUuY8+vXSSy9J8+bN8zxeH6fP7VzXlZqaau4bHR3Nv0oAAAIIQcsLDUARERF5btdAZe1XWrP13XffFfoDnzNnjinGdzd+/Hhp3LhxoZ8HAACUfgQtL7QeKzMz02PLB2t/ceioV7t27RzX9exHre8CAACBh6DlhU4RHjhwIM/t1rRf5cqVi/WB6+OK+1gAAFC2UAzvhfbY2r17t5w4cSJP2wdrPwAAQH4IWl506NDBrGOoNVXO04a6nmHTpk3NkjsAAAD5CcqpwxkzZkhycrJjGnD58uWyf/9+c/m6664zXd01THXs2FHGjRsnR48eNY1I582bZ84yHDFihJ/fAQDA3/SPcU+1vAgsERERpq9mcQVl0Jo2bZoJTBY9a9A6c7Br166O5XO0+aiOXM2fP98Es3r16smLL74oF154YYmPYeHChWbT5wUAlC36/24tL8nNzfX3ocBm2oRc+2oWd2m9kFz+lfjVxo0bZcCAAbR3AIAyNJKlTa1jY2OlSpUqrAYSwHJzc82JcSkpKdKwYcNijWwF5YgWAADFpdOF+gtYQ1ZMTAwfZICrUqWK7Nixw3zfixO0KIYHAKAYWNc2OISUcP1ighYAAGVcnTp1zOoiWkOsa/LefPPNedoTFYWuYPLHH3943b9y5Uq54IIL5KKLLjJ1zD169DClMIV5bLAhaAEAECAneq1Zs0bWrVsnx44d87jcW2EVFJY+/PBDE+ZWr14t3bp1M62PrGXkCFquCFp+omccPvLII/Lmm2/66xAAAAFIez5q8XbFihUdt40ePVpat24tLVq0kCuvvNIs/6a++OILadasmRkJO//882X27Nny/vvvy88//ywPPviguV1DlLNRo0aZUPfWW2+Z/doCSUfUNOQV9NhgRDG8n3Tu3Nls1lmHAICyadZ/lkvKsXTbnj+2fJT0fv70Grne3HDDDaY4Xwu3W7ZsKX379jW3f/LJJ+Z3zQ8//GCKuadMmSKDBw+Wr776Sh577DF57733pG3btpKTkyPHjx+XChUqyEcffSRDhw6V3r1753kdHSTQ0S4NUnofZ/3798/3scGIoAUAQAloyEo5bF/QKiwdZdLwk5WVJYMGDTLNtV955RWZNWuW/PTTTyZ8We0pLJ06dZIHHnhA+vTpY/pI+qJPJFwRtAAAKOGIU2l6/vDwcLPKyb///W8TtLQVxaOPPioDBw7Mc99XX33V1HQtXrxYbrvtNunXr58MHz7ch0cPghYAACVQmGm9M+3bb791FKfrFJ4GLh21qlSpkukH9fvvv5szBnUK8LzzzjObBrRvvvnGPCYhIcEU1BdHSR4biCiGBwAgAGiNllXUvmHDBnn99dfN7TpKdfvtt5v1e5s3b27uo0HMWmpOQ5aGLq3deuqpp8ztOvr1f//3f8UqaC/JYwMRS/D4GUvwAEDZkpaWJtu3b5e6detKdHS0vw8Hpfz7zdShn7CoNAAAgY+g5Se0dwAAIPBRowUAAGATghYAAIBNCFoAAAA2IWgBAADYhKAFAABgE846BACghH75bLMtn2HLPg0Ldb86depIVFSUWVQ6PT3dNCAdP368xMXFFet1J02aJG3atJFzzz3X4/6VK1fKgAEDTDf5UaNGmeaor732mulGX9Bj1cMPPywXX3yx3HjjjVIa6PG0aNFCbr75Zp8/NyNafuyjpSugv/nmm/46BABAANFFpdesWWPWLtQlcDTwFJc+Vpfn8ebDDz80oWT16tXSrVs30wHeWvKnoMfu2bPH3F872ReFLpZdmNuK8niLru+oXfGdF9z2FYKWH/to6V8B999/v78OAQAQgDIyMiQlJUUqVqzouG306NHSunVrM2pz5ZVXys6dO83tX3zxhTRr1syxdM/s2bPl/fffl59//lkefPBBj8vo6O8uDXVvvfWW2X/06FEzoqYhr6DHqg8++MAseh0SEmKu69qLOvCgx6eP6du3rxw5csTs06WD7rzzTmnfvr05viVLlpglg+666y5z35kzZ5rXu/TSS8370OdYvny5eeyOHTukQoUKMmLECPO+9Xg9vV911llnSf369R1rPfoSU4cAAAQAHSHSqUMNGC1btjSBRX3yySdmubcffvhBwsLCzJqGgwcPlq+++koee+wxee+996Rt27aSk5Mjx48fN+Hko48+kqFDh5oFqd1pKNIRKw0reh9n/fv3z/exSsOSBjHLyy+/bKY4f/zxR3P92WefNcf19ttvm+u//PKLLFu2TOLj481jdR3Hd955RyZMmGBCZYMGDcw0qY6s6f00xG3ZssU8Vkf2NJi9+OKL5rqu9ej+fi1626JFi6R79+7iSwQtAAACgI4yafjRKbJBgwaZkZxXXnlFZs2aJT/99JMJX8p5eqxTp07ywAMPSJ8+faRr167m8XbbvXu3VK1a1XFdj08D0YwZM8x1DU86Qma5/vrrTciy1KtXT6644gpzWQNkaGioCVnqsssuM8+to2s1a9aUiIgIueWWWwr1fqtVqybr16/3+ftl6hAAgACiBeo6qjNv3jxzPTc3Vx599FETPnT77bffzKZeffVVmThxosTGxsptt90mL730ku3HFxsbaxZqtujxab2ydXwadpynHMuVK+fyePfr7qwpSeu1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pjZMpx1HjBhhFvg+00K0jUVCpNkq1yugjYXbqJhOTeqWeizdFOd7kpV2uo2FP+u9fB60CqJ1WmFhZWNeFQCA0qpp06Zm80RnlK666ioTwjydJam1X3qm44IFC0zLCvepzDlz5pgQdtlll/nkLEi72lhkaxsLq07skNuI2P6TdWLarkJru8p80NKCvGuvvbbAkPX000/LM88846uXBQAAbmrVqmXWF1bagNXd3r17HYX67l3sFy1a5Pg9rSu83HrrrS5rGut+DWHaPd/fNVBh4aGSUDXWbJ6YNhY66uXH4/TZWJoWwWtC9ka/0RqyvvvuO1+9JAAAKICejOZu06ZNprel1lS7c679cm++qo/Tk9xq1Kghd955Z57H6pmQpUmItrGoGG2WFSrzI1r6zXjuueckISFBWrRo4TFkLV26tMBRLwAAYC8didIRKd3cPfvss+YENg1cejKbtxDmqXhfpzJ11Ktt27YydepUm46+bPHZiNaoUaPknHPOMXO9zusZasjSb5qOdulZiRTKAwBQeulJbToo8uSTT5pu+M50Me2HHnpIunbtapYTcqZF99u2bZM///xTduzYked5X3rpJdNzUwv4Pa0lGah8FrS0jcPo0aOlXLly8u9//9sMSeqpmzrPq4t0Xn311aaZKQAAKJt0xkp/18+fP1+6dOnisk/D06WXXmqarnpa73HevHkybdo0MyDjXjemjc21BGnx4sUFLudX1oT7+jTUV155Re69916TeDX56nShnvmgzUoBAEDgjoQtX77cDLJoA1Z3mzZtMl+rVq2aZ9FuDW6aG9QHH3wgd9xxh8uJdKtWrTJL/Wm/sbLG540ldPpQhwePHDliCt81ZOkIFwAACI76L53lcrd9+3az6LYuJVSUAvytW7dK69atzYyZDuS402AXkCNa+a3bpLSAbsuWLWaUy/m++g3QxTUBAEDwiIiIMKNSurnTWS+ddtTA5d4bTMOZFajcR8KUrkijZ1Zqzdi7774rARO0Jk6cWKj7ffjhhy7XCVoAAMCZjmJ5qutS1atXN1OJGrjcuxqkpqaa27Xmy1Mz9LFjx5opze7du0uZC1qvv/66b48EAADATZs2bczmiTZe1Xpw7Xbgab3HmTNnyuDBg8Wfih20dKgOAADAX+rWrSt//PGHpKWlSXJycp79OtrlKYAF9FqHAAAAvhQdHW02d9o2onx5zwtWl/qzDh9++GHZsGFDsR6rc6offfSRWR8RAADADrqOo6cliMrEiJY2FLvnnnukefPm0q1bN2nfvr059TI/miy/+eYb08BU10MaOXJkcV8eAACg1AvJLUEDiq+//tq0btBiNE2M2kOrcePGJkFq6MrIyJDjx4/Lrl27ZOPGjaaBmd6vU6dO0r9/f9O0LNjp5zJgwAAZP368+ewAAEDgKFGNlp4uqat4r1y5UubOnStr1qwxI1buNFzVq1fPjHr17NlTKleuXJKXBQAAKBNKXAyvfbF0lW7dlC4keeDAATOSFRkZKRUqVDBnBRQ0rQgAABBofH7WoTYG0w0AACDY+bcUHwAAIIARtAAAAGxC0AIAALAJQQsAAMAmBK0S0satw4cPl65du0q/fv3kl19+8c13BgAAlHkErRJ67bXXpFKlSjJnzhzTKf/JJ580rS0AAAAIWiWgne6///57ufPOO81ilpdddplpzLps2TL+ZQEAAN/30XLXoUMHWbJkSakJRlOnTpX169ebBbGTkpLk0UcfNR3u3enyQRMmTDCd7vV+9evXN8sGtWrVynGf3bt3S0xMjJx11lmO2zRobd++/Yy9JwAAEMQjWiVYStHnjh07ZtZm3LlzpzRo0CDf+77wwgsyffp06dKliwwZMsQsI6S1WGvXrnXcJzU1VeLi4lwep9f1dgAAgCIFrYceekjee+89Wbx4sRnNKewSPZaPPvpIMjMz/fapJyYmysyZM+XTTz819VTe6IjXokWLZODAgTJ48GDp1auXjBkzRqpVqyZjx4513E9Hs06cOOHyWL2utwMAABRp6rBGjRry66+/yueffy7p6ekSGxtrptQaNWpktoYNG5rld3T0x9OI1vvvv28Wla5YsaK5/vHHH8u11157xoKJrr2oYasgS5culbCwMBOwLFFRUebYx40bJ/v27ZOqVatKzZo1zeiVru1YpUoVcz+dNuzWrZut7wMAAARg0Bo2bJgjPP3555+yceNG2bJli2zevFnmz58vycnJJsxoXVNhphGnTJkiHTt2dAStI0eOyKBBg8yUnT/p+9EQ5T4t2KRJE/NV37MGLQ2aWgD/wQcfyNChQ01rh61bt5rbAAAAilUMr9OBtWvXNpv2j9Jg8t1335kWB0VpbeAevPT6/v37/f5dOXTokMeRL+u2gwcPuoTP559/Xq666ioz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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots()\n", "\n", "ax.plot(energy, energy*energy*flux_median, label = \"Best fit\")\n", "ax.fill_between(energy, energy*energy*flux_lo, energy*energy*flux_hi, alpha = .5, label = \"Best fit (errors)\")\n", "ax.plot(energy, energy*energy*flux_inj, color = 'black', ls = \":\", label = \"Injected\")\n", "\n", "ax.set_xscale(\"log\")\n", "ax.set_yscale(\"log\")\n", "\n", "ax.set_xlabel(\"Energy (keV)\")\n", "ax.set_ylabel(r\"$E^2 \\frac{dN}{dE}$ (keV cm$^{-2}$ s$^{-1}$)\")\n", "\n", "ax.set_ylim(.1,100)\n", "\n", "_ = ax.legend()" ] }, { "cell_type": "markdown", "id": "ce164e0b", "metadata": {}, "source": [ "Plot the fitted spectrum convolved with the response, as well as the simulated source counts" ] }, { "cell_type": "code", "execution_count": 15, "id": "19c43f92", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:50.366985Z", "iopub.status.busy": "2026-02-19T20:28:50.366796Z", "iopub.status.idle": "2026-02-19T20:28:50.494399Z", "shell.execute_reply": "2026-02-19T20:28:50.494269Z" } }, "outputs": [ { "data": { "image/png": "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brjdmNor94tq1aph27ZtRX5+RO7O1veg/OW6YMGCIj8/Ik+QY+P78HpSPlLYWENkEsluZS2T/KYfGvcTEd+DRO6stBN9FjIhMol0B0pX4fWM2/z9/U04KyLPwfcgkfn8nOizkAmRSWRdhoSEBGRmZua5XRaxMu4nIr4HidxZiBN9FjIhMkmnTp106u6XX36Zp4tQVsJt2LChdYYZEfE9SOSuOjnRZyGLqh1gzZo1OlXX6PKTnbFPnTql12UNBVllWn7QnTt3xuLFi5Genq4zVzZs2KCzyqZOneqI0yLyGHwPEplvjYt9FnK3ewcYPHiw/jDzI7vUy9oJRvW8sX+L/NLI3kiyf0vr1q0dcVpEHoPvQSLzDXaxz0ImREREROTxWENEREREHo8JEREREXk8JkRERETk8ZgQERERkcdjQkREREQejwkREREReTwmREREROTxmBARERGRx2NCRERERB6PCRERERF5PCZERER2WrVqFe6//34kJiZab/vmm29w3333aXQGX331le4sHhMTY/apEDklJkRElId8qMsH+a0usmkjXZORkYHly5ejd+/e1s0qHWXHjh36+j/zzDO3bfvPf/5T23777bd63LNnTwQEBGDRokX80RHlo2R+NxIR1ahRA926dcv3hShXrhxfoFy9Q+fOncMjjzzi8Nfk7rvv1qRm586dSE5O1uv5kR3Df/zxR/05SVIkSpYsqYnsggULsG/fPjRp0oQ/Q6JcmBAR0U0ToieeeIKvzi1cvnxZh6IkuZDXy9GKFy+OXr164f3338eGDRswfPjwfNt99913yMnJ0V6r0qVLW2/v0qUL3nzzTXzxxRdMiIiuwyEzIrKb9EI89dRTOH36NF555RU8+OCD6Nq1K8aMGYPdu3fn+5isrCz85z//wV//+ldtKx/eMhS0d+/eG9rKc8vXkA/5JUuWYMiQIejcubM+3vDDDz9g9OjR+lz9+vXD7NmzdThLekVyD/G9/PLL+lwHDx7M97yWLl2q90tSYcsQVlpamtbm2OrUqVOayMh5bt261Xr7mTNnsHDhQu1pksRFXsMXXngBR48ezfN4eZ2KFSumtUkWiyXfr7F+/XqNffr0yXN7xYoVcdddd+nXldefiP6HCRERFQoZphk3bhyOHTuG7t27a1IRFRWFyZMn3/ChLkNMTz75pPZ0lC9fXhMYaX/48GFM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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots()\n", "\n", "ax.stairs(expectation.project('Em').todense().contents, binned_energy_edges, color='purple', label = \"Best fit convolved with response\")\n", "ax.errorbar(binned_energy, expectation.project('Em').todense().contents, yerr=np.sqrt(expectation.project('Em').todense().contents), color='purple', linewidth=0, elinewidth=1)\n", "ax.stairs(crab.binned_data.project('Em').todense().contents, binned_energy_edges, color = 'black', ls = \":\", label = \"Source counts\")\n", "ax.errorbar(binned_energy, crab.binned_data.project('Em').todense().contents, yerr=np.sqrt(crab.binned_data.project('Em').todense().contents), color='black', linewidth=0, elinewidth=1)\n", "\n", "ax.set_xscale(\"log\")\n", "ax.set_yscale(\"log\")\n", "\n", "ax.set_xlabel(\"Energy (keV)\")\n", "ax.set_ylabel(\"Counts\")\n", "\n", "_ = ax.legend()" ] }, { "cell_type": "markdown", "id": "f237166b", "metadata": {}, "source": [ "Plot the fitted spectrum convolved with the response plus the fitted background, as well as the simulated source+background counts" ] }, { "cell_type": "code", "execution_count": 16, "id": "0ed27ca4", "metadata": { "execution": { "iopub.execute_input": "2026-02-19T20:28:50.497114Z", "iopub.status.busy": "2026-02-19T20:28:50.496932Z", "iopub.status.idle": "2026-02-19T20:28:50.600714Z", "shell.execute_reply": "2026-02-19T20:28:50.600518Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAG7CAYAAAAizIoLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdoUlEQVR4nO3dC1iUdfYH8K+CoiCiche8AiJe07K8puY1zcxM17LWyjTTzK3MWrPtXmYXK8v6a1ZmmVmuW26mZZm5ZmVmoYDcROQuoqCAIOL8n3PaYRkFHBjwHWa+n+eZ5wwz78y8884Mc+b8bg1MJpMJRERERE6sodE7QERERGQ0JkRERETk9JgQERERkdNjQkREREROjwkREREROT0mREREROT0mBARERGR02NCZIWioiLExsZqJCIiIsfDhMgKycnJmDFjhkYiIiJyPEyIiIiIyOkxISIiIiKnx4SIiIiInB4TIiIiInJ6rk5/BKqwbds2PeXn5/MwUb1UWlqKkpISo3eDiKhOubi4wNXVFQ0aNKjxfTAhqsLw4cP1JEPuZZQZUX0iiXxqaipMJpPRu0JEVOfc3d0RGBiIxo0b1+j2TIiIHLQyJMmQ/IPw9fW16VcTEZE9kx99Z86cQXZ2NpKSkhAWFoaGDavfI4gJEZEDkmYy+SchyVDTpk2N3h0iojol/+caNWqk8wVKctSkSZNq3wc7VRM5MFaGiMhZNKxBVcji9rW2J0RERET1FBMiIrpk2rdvj/DwcFx22WWIiIjALbfcgoKCghrf3/vvv4+DBw9Wev1PP/2E7t27o1evXti6dSvGjBmjgySsua09eOKJJ/C3v/2tVu/ziiuuwPfff1+j26anp2PQoEEW+1d+jcfbb78dr776aq3sp6NWbHNzc+3yvfFEHbzX6sobb7yh77XaxoSIiC6pTz75BL///juioqKQl5eniUlNXSypWb16tSZd+/btw6hRo7B582ZNyKy5LV2odevW2LlzZ9nfTz75ZK0sen327Fkebgdwtp6/jkyIiJxASWEJMn7LqNOTPEZ1SMfHwsJCtGzZsuyyl156CVdeeSV69+6N0aNHly2ovGnTJvTo0UMrS926dcPnn3+Od955B7/++ivuv/9+vVySnfIWL16syZf8mpTr5Ze5VKgkGbvYbUVMTIwmUfK4cnr77bf18oSEBJ2Ow7w///rXvywqAM8995w+hw4dOuC9997Tyz/66CNcd911ZdtJh/eOHTvijz/+0L9ffPFFdO3aVatZU6dO1UTxfJ06ddJ9NpOEbsKECXo+MzMTkydP1seV+1i0aFHZdj/++GPZcbvjjjsq/dKSxHHt2rV6fvny5Tp02Vy9u+aaa/DDDz/g8OHDaNGihV42a9YsjVIxkvs/evRo2XEbNmyY7u+NN96or3NF5Fg9/vjj6NOnD/7+97/j1KlTOr2JPAc5tjNnziy77TPPPKMVRXkcOZnfF3If8lylAiiPJ8fZTCqC8j6S+xo8eDCio6P1cqmOybGYPXs2evbsqcfdfFxllNLIkSP1GMrt5Hhd7L1Z0fOqbJ/KM78XK6rcVfZ8z5eSkqKvTefOnTFu3Djk5OTo5d9++y369eun+yDPb9WqVWW3kffWXXfdpcdAnv+dd955wf1GR0fr9V999ZX+LZ832R/Z/uGHH4aPj4++F8zPQy6TYzNt2jSd7kPuU24vJ0mazYYMGWLxebnpppvKfhBJxefuu++u8L0j742//OUv+mNm4MCB2L9/P+qEiS7q4MGDpkGDBmkkqg9Onz5tio6O1ijS96abnsATdXqSx7iYdu3amTp16mTq2bOnycvLy3TNNdeYSkpK9LqPPvrIdNddd5nOnj2rf3/wwQemMWPG6PkePXqYfvzxRz1fWlpqOnHihJ4fPHiwaePGjZU+3rRp00xLly61ePx9+/Zd9LayT2FhYaa1a9eWXZadna3xyiuvNL399tt6Pi4uztSqVSvT4cOH9W/5l/rSSy/p+ZiYGFOzZs30vgoLC03e3t6mjIwMve67774z9e7dW89v3rzZ1Llz57LnNGPGDNOsWbP0/OOPP26aN2+enn/22WdNc+bMKdufq6++2vTFF1/o+ZEjR5q+//77sn0fNWqUaf369abi4mJTcHCw6ZtvvtHrtm7dqvu4ffv2C57zqlWrTHfccYeev+GGG0z9+vUzffnll6aCggJ9jmfOnDElJSXp62Ym92Xeb/PxluMjt5HXsX///hbHsDy57ZNPPln2tzzv1atX6/lz586Zpk+fblqyZInp+PHj+phyDIXct/l9LfexaNEiPZ+YmGhq2bKl7mNWVpbuc2RkpF734YcfmiIiIvR+5bm7uLiYfvrpJ73urbfe0uMnXnnlFdPMmTPL9iknJ+ei782KnldF+3T+8Sr/XhSXX3657ltVz7c8eW/4+vqWvafuuecePYZC7sO8r/Ic2rZta0pJSdG/b7/9dt1WPkfi6NGjFu+17du367Hau3evXm4+lvJ+Fu+++64+D/Nzkuchr5UcW7FgwQLTLbfcovefn59vuuyyy0zr1q2r8DM3ceJE03vvvXfR9878+fNNt912mz5Gbm6ufl5k+4v936suDruvAmeqJkfh09kHM/fOrPPHsIZUbeRXr1Qq5Beh/Lp8+eWX9Zfjnj17cPnll5fNpWQmvxrnzZunvyjlF7zcvi5JPyNpCrr55pvLLpNfxfJL9bfffsOuXbv0MpnvRH6xSjNSu3bt9DKp8Aj51S4z50r1Jjg4GBMnTsSaNWvw0EMP6a9ic/VB/s/Ir19z5eWee+7BpEmTLtinv/71r/qLX45VWloa4uLicO2112oVRyoCWVlZZdvKr3R5DtIkKPsgFS0hx04qUxWRbeTXvBx3qRA8++yzum8yA7D8+pchzdaQqpXMfyXkdomJiZVuW746Ia//7t278corr+jfp0+f1sdu3ry5Hudbb71V93/s2LF6PM2k2iHkeV199dVayZKqo1R55GR+TebMmaPHTYSGhuKqq67S81JJkeqP6Nu3L5YuXYoHH3xQ70sqQeZ9q+y9WZGK9kkqKda42PMtT64LCAjQ81JRk6qKkErR9OnT9T0ir7/8feDAAb2ff//73/j555/LRmTJ1Bxm3333HbZs2YKvv/4abdu2LeuHJ9UyeT8LqQKZq4NmUt0xj2iV94y8R+X+PTw89H37zTff6Hu8pu8deX/L6yKP4eXlpdXMqt5XNcWEqAqcqbpyeUfysH/vfjRybYS2QW31yy06PlrPt2jeAjkncpCWmYYeET10+6SUJDRs0BDtgtvh3LlzOBB7AG1at0FLr5Y4kXcCKekp6Nqpq/4DTE5NRum5UnRs++c/7siYSAQFBMG7pTfyTuXp9RGhEfoPWm5XfKYYoe1DdVu5X38ff/h6++JU/il93PCQcLg1dkODZg0Q0OnPfx7OppF7IwT2DoQ9kX/UkiRIgiD/QOUHtDSdyD/288mXpPQ52r59u/5Dli+4BQsWwB6nNig//4m8n81NVPLlL0mQJDzypST/4K25PzP5MpNmFWm+kGMhX5hyDM19eOSL6/y5VyIjI62+f/kCdHNz0yYe+eKXJFSSInkOct5alT3/ijRr1qzsvLz+GzZs0OaS88lzk6Y/aVKSpOXjjz+26NxtzfOzZh8lOZJmLPlS/+c//4nHHntM+59V9d60RkX7JK9d+cTK/DrK/lTn+Vb0OJKwyAACOZ5ymTTzWdPXKzQ0VJNoeXxzQmSN8q9jZftU1XOu7nunrqYTYUJENUqG3ox4EysKV6A5mmMiJqIQhViCJZiMyeiCLtiLvdiETXgCT+htPsJHcIELpmAKzuIsnsEzmIAJ6Ime2I/92IANWIiFaIzGWI/1KEYxbsNtetsn8STGYiyuwBU4iINYh3V4CA/BAx7YiI04juOYjum67XN4DkMwBP3RH4lIxBqswTzM0/v9wfUHvPPDO+jWrxtfdTshv0jNnZxvuOEGTYykCtSqVSudXFJ+1UpVRP5JS18IOck/VfkFa/41XVF/G2tUdVvZJ/mlKl9E5irRsWPHtEokXy7SN0j6u0h/ov/85z94/fXXL/p45orE/Pnz9ceWPEch56Ui8cADD+g+/d///Z9WBioiCdW7776r1R9zvyf5Mho6dKj2mZKRQubRYPLDQ37Vy5eKJJKyjXzRV/XLWvblH//4h56kyiI/Oj799FOLfh/leXp66jE0V7dsIa//Cy+8oM9fXuMTJ05oZcPf318rc5IQyEmSQUlSzAmCvBbyvKVPi1TqZJSbVCakn4m8f6Qfy7p16xAUFKQnec0qI7McyzbSH0uqQ35+flptq+q9WZGK9qmi5EMqNZJ8/vLLL2WjH+W5VvV8y5P3gFQG5RhJvzhzJVCOnVQsJXGQ6pS5r5q4/vrrtSImfeukiiP9psxVorZt2+LNN9/UvnNSeZT3myRkkljL/snn4sMPP6y0X5iQfZA+S9JvS/oISlVUqsDln7P8EJJjLZ8dOaYXI/cpx1SqbXJs5HMpfc9qGxMiqrbCY4Xagfb1F1+Hf7h/WYXomvhrLCpEczLnlFWIRqSMsKgQDYwdaFEhmpE+o6xCNCp1lEWFqG9MX4sK0e2pt5dViK5Nv9aiQtQ/tr9FhWhqylStEP3+w+9Y8/AaHE8/zlfcYFI6l1ll5T0j/7TNnZWl6iNfgPLFLeR6qarIl87ChQv1H7J09JVE5a233tJt5Be7JBNSbZHOzPKr2FpV3Va+kKUSM3fuXL1OvjikE6408UkFRX6ByxeKfOHIF5G1v6blC0YqW+bOqkKaveTLVaoT8jjSPCGdmisyfvx4rTBJk4p0cjWTfZKESr78ZZ8kIZDEQqpK0kQp+y6/zOVLRDrGVvXFI8fW/MUqceXKlZXeRo7fiBEj9DUxJ6k1Ja/DI488os2hchzkNViyZIlWDeRLU76g5bnJc5cqoZk8L3mPyPWSmJqbpuSYSHONvI8kuZPE7mKVBanISDXSXJ2Qzu7SRFPVe7Mile1TedJxWp6HvE7y2kuyLyTBrOr5lidJkjQfSVOgbGfuoCzJsbzmTz/9tB5PczJuPs4ymECaE+V/qLwn5DU2k7XA5IeKJISSfNx33336HpekUCqI8npLEl5ZEixVNbmNublSmn8lwRTy3pfPv1wnz7f8flVF7lOaISXBl+RNmqmLi4tR2xr8t6MXVcG8uKu8acy/Zp3ZNx9/g7G3jMWXa7/EiJtHoD6QUVArLl+h/WjsremoLkgpWn6ByUinmkxhT1QfSMIg1ZDaqFA58j7Z6tSpU1oNFFItlOZDGU3oaP/3WCGiagvwDcAwDNNIRESObdmyZVpplMqXNOtWNpVAfceEiKrNp5UP+qKvxvpCOny/hJcwMH6gU1SIiJyBPTZw2OM+2WrhwoV6cnScmJGqTfrmJCBBY33h3cIbfdBHIxER0fmYEFG1yVD2D/GhxvrC39cfgzFYIxER0fmYEFG1dQ7tjPtxv8b6oqCwAClI0UhERHQ+JkRUbY0bNYYXvDTWF4nJiViFVRqJiIjOx4SIqi01I1UnXZRYX4R1CMNszNZIRER0Po4yqwLXMqvY6aLTyECGxvqiaZOm8IOfRjKGef0xmeVW5vYyT9wmc3vJkN7zyRIKMkP1lClTLnrfMiOweUV7I1Vnn4nIvjAhqgLXMquYVFlmYma9qrakZ6Xja3yN67KuQyA47N6oZKF88mL+u6rtZRK4+pRc1Md9JqI/MSEipyBTBMQiFsmRyXq+uWdzBPoFapUrPilel/5wb+qOrOwsHM89joiwP5dFiDsUBw93D106pKi4SP+WJUWaeTRDdk42juYc1SVHRMLhBDRxa4LgwGBd6ygmIQbtg9vrY8lSJpKUde/8Z1Xk0JFDcHVx1aVOZLKzqLiosmVP5PGlOVK29fD1gFdbr1o5BhkZGboel7kyIyuay+yzbdq00Rle5W+Z/l8uk/WRZJV285INUtGRmV9lqQ15brJOVEhIiC5rIGshyVIGMuV/TchaR7JEgpB9WbFihS4pIOtpyTIGkjzJekqyxIcsoSD7IlUm2VbWTDKv9l0Z2fbRRx/V5TJkSQbZT1nRW467LBVhXkZDlmWQ9apkeRBZvVse929/+1vZ+mOyXIGsTyUnmaVX1mmSdcHk8T/77DM9BufvsyyTIPclx0uek6w5ZesSF0RUN5gQUY0mOZSFXOvTJIe9ruqFB9wfwP5H9uM1vIau6IrhGI5MZOJtvI0ZmIEgBGE7tuM3/IYH8aDebjmWoz3aYwzGIAc5WIZlmIZp6IAO2IVd2ImdeASP6Lbv4B34whfjMR6ncAov42XcglvQCZ3wC37BVmzFY3hMt12N1bo47U24CUUowmIsxiRM0v3ah334HJ/rtk3cm2BOzJxaSYpkzSRZkyg19c++X1LFGDJkiK61JJfJIpOyCKhc9sEHH+D555/H8eN/rv0mX+qy9pDcXpIq2VZWbB87dizWr1+vSZF5YdHqkDW8ZLX7vXv36qKasrq6rFkkScpTTz2l1ZbyC4vKIpnmhSjNi5ma10KrjDyPuLg4fQxZi0n2VUjitWfPHr1cEiVZ9FISGPNClFWRBSrldt7e3noc5djKcgbn7/PGjRu1GU+STWE+nkRkf5gQUbX5tPRBP/TTWF9IQiGJhSxMOzhxsEWF6IakG8oqROOzx1tUiIYcGmJRIRp7aGxZhWhCzgSLCtE1h6+xqBCNSBhRViGaeGIi5mXNK6sQDT8y3KJCNCRuiEWF6J6Me1CSWYIH5z+IofuGol/bfjYfA1mYVFaZNpMVwM3rE8kioPIFLxUiIYtill9xXRaNNK8NJCu+y7ZSIRKycKNUR2pCEjBZRFKSISELUkpSIcekImvXrtWKklS05CT7cjGSuMkq6pIMCXNCJX0EJdEzXy7rFcpK39YkRLLPkgwJWZhTKkAVkQqbVJPkecnq39VZfJaILi0mRFRtfj5+GIRBGusTSYrkdH5Vq2P/jmXnz+9fdP62Hfp1sHrbtle1tdi2G7pVum1wn2CLbaVStPvz3ahN0lRUvlmrS5cuZecl2endu3fZ39K0Iyez8osaS9NP+W3NCUZtqGo18v/85z9azdq9ezf8/PzwxRdfaBNVXTy2rLRePimT5EuazMzKLxxpXhm9Ih07dtTqkKweLgmYrPYt/Yxk9XUisi8cdk/VJpMbJiOZkxzWsfZt2muTm0RHJf12pD9Penq6/i3NX8OGDdMkQxaRlP44ZrKCuFS0pDIj/YKkmcoa0hT22muvobi4WP82N5nJoAlpGpT7koRGmgPNVbHQ0FD88ssvej4nJwebN2+26rHO32dpipRES/bhpZde0nWuUlJSrD4+RHTpMCGiapPJDd/De5zksI7Jl2cpSh1ysUizbt26aYdqaYLq0aMHdu7ciZUrV+p1khhJEiOXz5o1S7eRSpWcBg0aVDaM/2KkCaxTp05a1ZLbTJs2TS+fOXOmXma+vH379mWdqOU6SZwiIiK0+VA6SFvj/H2WprQBAwZo01mvXr1w22236XVEZH8amBz5v20tkVEt0r9A/lGXbzpwVkm7k/BK/1fwwI8PWDQhUe3a+tFWjL51NLZ8uAWjpo6q1m2liScpKQkdOnSwaN4hInJURTb+32OFiKpNOg77wEcj1R3pnC0j1iQSEVHdYkJE1Sbz6WzBFo1Ud1q1aIVe6KWRiIjqFhMiqrb8gnwkIlEj1Z3ck7mIQpTGmmKLOBE5i3Pnztl0ew67p2rr1LET5mCORqo7R9KO4FN8iulp0xGBP+dFspYMjZfRTdIxWIbFVzWcnYioPpMffjJaVP7fNWzYUGebrwkmRER2SiZ8lFmwzRM/VocMW5fJFmXYt6wdRkTk6Nzd3dG2bVtNimqCCRFV28GEg1iKpbg64ep6s3RHfSRJTRM00VgTMpGgzDwts2YTETkyFxcXnVDVlmo4E6IqyMyycsrPZ1+Z8lp4tUAP9NBIddtk9hk+w+i00TVOPOWfRE0TKiIiZ8KEqAoyk62czPMQ0Z8CfAMwDMM0Ut05W3oWBSjQSEREdYujzKjaCk8XIh3pGqnuyCKy0zBNIxER1S0mRFRtCYcTsAIrNBIRETkCJkRUbaHtQzETMzVS3dl/cD+extMaiYiobjEhompzb+qO1mitkepOa//WGIVRGomIqG4xIaJqy8zOxLf4ViPVHe+W3rgSV2okIqK6xVFmVG25ebmIRKRGqjsnT53EPuxD3C9x+ndqRiqKiovKmiqj4qLg5+0HX29fXUbl0JFDOnu4LLqblpmGgsKCstnEY+JjdE00f19/7Qwv/b/COoShaZOmyDiaoY8VHhKu28YmxsKzmadWpk4XnUZ8UjxC2oXAw90DWdlZyMnNQZewLrqtXCf3IQvQFp8p1tt2uawL2nRtw7cGEdUrTIio2jqHdsb9uF8j1Z2SxiX4HJ8j8J5ABCBAz2cjG3fhLr1+MRZjEAZhAAYgCUlYjdWYi7nwhjc2YzMO4zBmY7Zu+zJeRm/0xlAMRRrSsBIrMQuz9H63YZuumTYP83TbZViGcIRjJEbiKI5iOZZjOqajDdpgB3ZgD/ZgPubrtm/jbb18LMbiBE7gNbyGO9zuwNK4pfBq68W3BxHVG0yIiOxUt37dsP/H/WjesLmuTTYmY4xFhWhA3ACLCtHNR24uqxCNzRxrUSEaFD/IokI08fDEsgrRuKPjLCpEgxMHW1SIrk+6vqxCND57vEWFaGjSUIsKUb9t/fD7Y7+j8FghEyIiqleYEFG1xR2Kw5t4E0MODeHSHZcgKTILhOVs1efPXh2GMKu3DRkQYvW2Hft3tHpbSazexbvIzsm+YFsiInvGhMgO5B3J01/U0gfEpaEL2gW3Q2lpqfYRadO6DVp6tcSJvBNISU9Bt/BuunBdcmoyzpnOoUObDnofkTGRCAoI0g64uSdzddkH+RUva7vI+ZKzJforXxyIPaCzTPu08sGp/FNISknS5q/GjRprPxWpCkj1QETHR8OnpQ/8fPy04pCYnIiSzBKEIATNPJoZetzI/mQdy8L3+F4jEVF9woTIDpKhNyPeRElhCdZgDdzghsmYjDM4g+fwHCZiIrqjO/7AH9iIjViERXCFK9ZhHUpRiqmYqvfzBJ7AOIzD5bgc0YjGeqzHAiyAO9yxARtwEidxB+7QbZ/Fs7r0Rl/0RQIS8CE+1D5BXvDCJmxCBjJ0niGxBEvQD/20r0oykvEe3sO9uBfj3MchtCvnISJLkrAvxEKNRET1CRMig/208ycsKlyEj5/+GKu7rbaoEF0dd7VFheju9LvLKkSjUkdZVIj6xvS1qBDdmXZnWYVIFgctXyHqH9vfokJ0a8qtZRUi6adSvkI0MH6gRYXoL8l/0X4prYJasY8IERE5DCZEBpMkRkbodO3XFd2GWf6qDu4TXHZe+mN0QZdK+26U/1u2jUCE1dt2QieLvyvbVoQOZFWIKifD+VdhFa45fA37lxFRvcKJGQ0mFZ0rcAUn3yOH4NbYDa3QSiMRUX3ChMhgeafycBAHNRLVd9LEOwETNBIR1SdMiAwmo8Wkg7REovqupKQEBSjQSERUnzAhMlhEaAQewkMaieq7mIQYvIgXNRIR1SdMiAwmMxB7wEMjUX0nIySnYIpGIqL6hAmRwWSyRZlfSCJRfefl6YXO6KyRiKg+4bD7Kmzbtk1P+fn5dfYCyPpPx3FcI1F9l3MiB7/iV0w8MZFLdxBRvcIKURWGDx+OxYsXY+7cuXX2AshCnbKSuHnBTqL6LC0zDV/iS41ERPUJEyIiqjU9InrgcTyukYioPmFCZDBZaFXWLJNIRERExmBCZDB/H38MwRCNRPXdoSOHdJFiiURE9QkTIoP5evuiP/prJKrvZHFiN7hpJCKqTzjKzGCy2nwiEjWev7AqUX0j8w/dhJuQHJmM5p7N0dKrJU7kndBpJbqFd0PDhg11VvZzpnPo0KaD3iYyJlIXOZZ1/XJP5uJI2hF0CesCV1dXPV9ytgQh7UJ0W2la9mrohazvstB2dFtkFmaic2hnNG7UGKkZqThddBphHcJ02+j4aPi09IGfjx8KCguQmJyITh07oYlbE6RnpSO/IF//FqfOnUKnK/63yDEROR8mRAZLSknSJoapKVMtVp0nqo/cfdzRoGkDTHlsCiZiIrqjO/7AHzrX1iIsgitcdamaUpRiKqbqbZ7AExiHcbgclyMa0ViP9ViABXCHOzZgA07iJO7AHbrts3gWozFat92wYgNWYzXux/3wghc2YRMykIGZmKnbLsES9EM/DMIgJCMZ7+E93It74QMfbMEW/SEyB3N0qZGVDVZi566d6Navm6HHj4iMw4TIYOEh4ZiHeRqJ6juvtl64L+o+9Puxny7waq4Q3Z1+d1mFaFTqKIsKUd+YvhYVojvT7iyrEI1OG21RIeof2x8BvgHwaeWjVdWbU24uqxCNyRhjUSEaGD/QokL0l+S/lFWIrsu6rqxCFPVjFHbM3YGSk1x/jciZMSEymFtjN7RES41EjqBVh1YY1WFU2d/SFNwFXf73d2/LpuHyf8u2EYiwetvyVdXzm5zPv23owNBKtx2DMZpoEZHzYqdqg0m/B5nITiIRXXqFpwuRjnSNROS8mBAZTEr8KUjRSESXXsLhBKzACo1E5LyYEBlM+jvMwqyyfg9EdGnJsjnSEZvL5xA5NyZEROTU3Ju6ozVaayQi58WEyGAyV8pLeEkjEV16mdmZ+BbfaiQi58WEyGDeLbzRB300EtGll5uXi0hEaiQi58Vh9wbz9/XHYAzWSESXnsxjJJM75h7Oxd6v9qK1f2sUFRch7lCczn/k4e6Bo8eO4tiJYzo/kohPikfTJk0RHBiMMyVncDDhoM6r5NnME8eOH9Nqk8y7JGSG7EaujdA2qC3Onj2r1WA536J5C+ScyEFaZhp6RPQom6i1YYOGOuP3uXPndGbu8vM5yYzfXTt1hYuLC866nUWbrm34liGqJUyIDCYTxskoM4lEZMzs2o3cG+Huh+9GCEJ0JuxjOIY38IbOkN0O7bATO7Ebu3UGbSGj0mQuI5lhOw95WIqluBW3IhSh+Ak/aRPco3hUt5UZspujuc7cXYhCnUF7Mibr3Ex7sVdn2JbZusVH+AgucMEUTMFZnMUzeAYTMAE90RP7sV9n7l6IhShBCb5y+Qof7/yYs2sT1RImRAaTX4+rsAqTkidZTBxHRJdudu05MXMw4JcBaObRrKxCdN2h68oqRDccu8GiQjQ0aahFhWhUwqiyCtGNx2+0qBANSx5mUSG6Jv4aiwrRnMw5ZRWiESkjLCpEA2MHWlSIZqTP0ArRvh/24bP5nyEvK49vE6JawoTIYDLcfjZmc9g9kcFJ0eC2gy0u69Dvz6VFrJkFu91V7Sy2lTXcKtu2zZVtLLbthm6Vbht0RVCFM35Lk9k0TEPHth2r8SyJqCrsVG0w+ZXpBz+NREREZAwmRAZLz0rH1/haIxGRNSJjIvEkntRIRLWDCZHBZMXuWMRqJCKyRlBAEMZirEYiqh1MiAwWHhKOuZirkYjIGt4tvXEFrtBIRLWDCRERUT2TdyoPB3FQIxHVDiZEBotNjMVreE0jEZE1klOTsQ7rNBJR7WBCZLDmns3RFV01EhFZIyI0Ag/hIY1EVDuYEBks0C8QwzFcIxGRNRo1agQPeGgkotrBhMhgp4tOIxOZGomIrCFrmm3ERo1EVDucZqbqUaNGWfxdVFSEe+65B1OmTIGRZJHIt/E2bki6AR37c9ZZIrq44jPFOI7jGomodjhNQrR169ay88eOHcOkSZNw9dVXw2ih7UMxAzM0EhFZ+39jOqbz/wZRLXLKJrNvvvkGXbt2RevWrY3eFbg3dUcQgjQSERGRMewyISosLMS7776L+fPnY+zYsVrJ+eqrryrc9syZM3jrrbcwYcIEDB8+HHfffTf27NlT5f1//fXXFzShGSUrOwvbsV0jEZE1DsQewHN4TiMROXBClJeXh/fffx/JyckIDa26Ken555/H+vXrMWLECNx3331o2LAhFixYgMjIitf4SUxMREpKCoYMGQJ7cDz3OH7DbxqJiKzh7+OPIRiikYgcOCHy9vbGxo0b8emnn2rH58pER0fj22+/xcyZMzF79mxcf/31ePXVVxEQEKBVo8r6Eg0YMACenp6wBxFhEXgQD2okIrKGr7cv+qO/RiJy4ISocePGmhRdzI4dO+Di4qKJkJmbm5s2s0VFRSEry7IZ6ty5c9i2bRtGjhxZJ/tNRHQpyGLQiUjkotBEjp4QWSs+Ph7BwcHw8PCwuDwi4s9qS0JCgsXle/fuxdmzZ3HVVVdVeb8yCi02NrbsJE13dSXuUByWY7lGIiJrJKUkYQ3WaCSi2lGvh93n5ORUWEkyXyaJzfmdqYcNGwZX16qf9hdffKF9mC4FD3cPtEd7jURE1ggPCcc8zENJZgl+2PADwjqE6eXR8dHwbuENf19/FBQWIDE5Ua9r2qQp0rPStaIktxWyfqIsGSSz5MvEsDInmgznlxGvMshD+jWam/LlB5v8jwoKCEJRcZH+3bFtRzTzaIbsnGwczTmKrp266rYJhxPQxK0JggODUVJSgpiEGLQPbq+P5e7jDq+2XnyRyS7V64SouLi4wqnrpcnNfH15jz76qFX3K01w0s/ITCpEzzzzDOqC/IMZgzEaiYis0bJ1S/i5++Gp+U8hBSmYhVl6+Ut4CX3QB4MxWC9fhVWYjdnwgx++xteIRSzmYq5uK4tKyzqKsnSQzJYvE8TKnGgyDYiMfJXBHtK/UUgVW364yf+qHORgGZZhGqahAzpgF3ZhJ3biETyi276Dd+ALX4zHeJzCKbyMl3ELbtH7PdjoIJb+vBQhvUL4QpPdqdcJkfQXkl8gFQ3FN19fEz4+Pnq6FOTXlvyDkUhEZA2pssyJmYMR+0dodcdcIRoYP9CiQjQpeVJZhei6rOssKkSDEwdbVIhktnxzhWh89niLCtGQQ0MsKkRjD40tqxBNyJlgUSG65vA1FhWiEQkjtEL0+39+xyuLXsG9MfcyISK7VK8TImkay87OrrApTVyqpMYWUnqWX1vyD6ZDvw5G7w4R1aOkqE/bPhaXBfa2XCQ6dOD/pi0JRGCV25ZfOuhi25b/X3Wxbdte1VajJF+PLXoM3Tt3v8gzIzJGve5ULXMUpaamoqCg4ILh+Obr7Z38ypLSs0QiIiIyRr1OiGRyxdLSUu0EXb65bPPmzejSpQv8/e1/0jIpOUs7vEQiIkd16MghrMZqjUT2yG6bzDZs2ID8/Pyy5q9du3bh6NGjen7ixIlo1qyZJj1Dhw7FihUrkJubi6CgIGzZsgWZmZl4+OGHbd4HmbNITrIfdUVGaEinRGmHP7/0TETkKFxdXOEBD41E9shu35mffPKJJjZmP/zwg56ETKwoCZFYuHChVoJkBmpJXDp27IgXXngBl112mc37IGujyUnmIpoxYwbqgnRGlBEaEomIHFXboLa4CTdpJLJHdpsQyfpk1pCRZLJsh5zqIxmZIcNVzSM0iIgckXRvKEKRRiJ7VK/7EBERUf0QFReFxViskcgeMSEymMzqKhOZSSQiclTSVDYJk9hkRnaLCZHBZAIzmdVVIhGRo2rRvIXOjC2RyB7ZbR8ie3ApRpnJbK4yxb1EIiJHJTNf78M+jRxRS/aIFaIqyAizxYsXY+7cP9f+qQsytb2s91PREiRERI4iNSMVn+NzjUT2iAmRwWQlaFn8UCIRkaOSJTseA5fuIPvFhMhgsuihrAQtkYjIUTVo0AAucNFIZI+YEBlMFjzshE4aiYgc1eGUw1iLtRqJ7BETIoPlnMjBL/hFIxERERmDCZHB0rPSsRVbNRIROar2bf7bPaANuweQfeKwe4OH3bOjIRE5A5PJhFKUaiSyR6wQGTzsnojIGew/uB9P42mNRPaICZHBDh05hNVYrZGIyFFxElqyd0yIDObq4goPeGgkInJUrVq0Qi/00khkj5gQ2cGChzfhJi54SEQOLfdkLqIQpZHIHjEhMlhpaSmKUKSRiMhRHUk7gk/xqUYie8SEyGBRcVFYjMUaiYgcVddOXfEIHtFIZI+YENlBk9kkTGKTGRE5NBcXFzRBE41E9og9eQ2eh6hF8xboiq4aiYgclTSVfYbPMDptNAJ7Bxq9O0QXYEJ0kXmI5BQbG4sZM2agLhzPPY592KcxEPwnQUSO6WzpWRSgQCORPWKTmcFSM1LxOT7XSETkqDq27YhpmKaRyB4xITIYl+4gIiIyHhMigzVo0AAucNFIROSouHQH2TsmRAY7nHIYa7FWIxGRo2rt3xqjMEojkT1iQkRERHXOu6U3rsSVGonsERMig7Vv0x634BaNRESO6uSpk4hDnEYie8SEyGAmkwmlKNVIROSoDqf+t3tAKrsHkH1iQmQwdjQkImcQERqBB/GgRiJ7xIkZDZ6pOjgwGOMxXiMRkaNq1KgRPOGpkcgesUJUBZmlevHixZg7d26dvQCtWrRCL/TSSETkqDgJLdk7JkQGyz2ZiyhEaSQiclRFxUXIRrZGInvEhMgOFjz8FJ9qJCJyVKHtQ3EX7tJIZI+YEBmsa6eueASPaCQiIiJjMCEymIuLC5qgiUYiIkcVFReFxViskcgeMSEymDSVfYbP2GRGRA7Nz9sPgzBII5E9YkJksLOlZ1GAAo1ERI7K19sXAzBAI5E9YkJksI5tO2IapmkkInJU+QX5SEKSRiJ7xISIiIjq3KEjh7AaqzUS2SPOVG0nS3f0O9gPgb0Djd4dIqI60aljJ8zFXJRklmDHZzv0bxETH6MT0/r7+qPwdCESDicgrEMYmjZpioyjGboYbHhIuG4bmxgLz2aeaO3fGqeLTiM+KR4h7ULg4e6BrOws5OTmoEtYF91WrpP7kFUAis8U6207tOmgt8/OyUbWsSx0C++m28pjujV2Q5vWbVBSUoKYhBi0C24HL08vuPu4w6utF98VToAJkcHkgz0KozQSETmqVkGtEOAegKfnP43DOIzZmK2Xv4yX0Ru9MRRDkYY0rMRKzMIsBCAA27BNJ66dh3m67TIsQzjCMRIjcRRHsRzLMR3T0QZtsAM7sAd7MB/zddu38bZePhZjcQIn8Bpew224DSEIwY/4Ed/jeyzEQt12FVahFVphAiZon84X8SKmYIrePq5RHF7++WWE9Aox8OjRpdDAxGXWrVrLLDIyEitXrkR4+J+/VGpLxm8ZWHH5CszcO5MVIiJyaHlH8hB/IB4FhQX1okL0x84/cPNjN+OrD7/CqKmjDDxydCkwIbJCbGwsZsyYUScJUeyOWDw15Cn84/t/IHxw7d43ERHVHH+wOhd2qjbY4dTDWIu1GomIiMgYTIgMFhEagQfxoEYiIrIfMiJuDdZwZJyTYEJksEaNGsETnhqJiMh+uDR0gRvcNJLjY0JksNSMVHyOzzUSEZH9kI7VkzFZIzk+JkQGKyouQjayNRIRkf0oLS3FGZzRSI6vxglRYmIivvzySxQUFJRdVlxcjJdffhk33ngjbr75Znz++ee1tZ8OK7R9KO7CXRqJiMh+RMVF4Tk8p5EcX40Tog8++ACrVq2Cu7t72WUrVqzAF198gcLCQhw9ehRLly7Fnj17amtfiYiILhmZl2giJmokx1fjhCgmJga9evVCgwYN9O+zZ8/iq6++QkREhFaGPvnkE7Ro0QKfffZZbe6vw5FfHouxmL9AiIjsTEuvluiO7hrJ8dU4IcrLy4Ofn1/Z3wcPHtTms/Hjx8PNzQ0+Pj4YMGAAEhISamtfHZKftx8GYZBGIiKyHyfyTuAP/KGRHF+NEyIXFxed4tzs999/12qRVI3MvLy8NHGiyvl6+2IABmgkIiL7kZKego3YqJEcX40TooCAAOzbt6/s7+3btyMwMFAvN8vOztakiCqXX5CPJCRpJCIi+yFrnS3CorI1z8ix1TghGjlypDaH3X333bj33nt11Nnw4cMttjl06BCCg4NrYz8deibU1VjNmVCJiOxMw4YN4QpXjeT4avwqy9D6IUOG6MKn+/fvx1VXXYVbb7217PqkpCRNmHr37l1b++qQZMXnuZhbtvIzERHZh+TUZKzDOo3k+FxresPGjRvjySef1I7U0neo/PB70bJlSx2WX74Jrb7Ztm2bnvLz6645q4lbE3jDWyMREdmPc6ZzKEWpRnJ8Na4QSSfqrKwseHh4XJAMCRly7+npWa9HmUkT4OLFizF37tw6e4y0zDRsxmaNRERkPzq06YCpmKqRHF+NE6K//e1vOu9QVbZu3arbUeUKCgtwGIc1EhERUT1LiEwmk1XbmCdupIpJ36HZmM0+REREdiYyJhJP4AmN5PjqtOt8amqqNqkRERHVN0EBQRiHcRrJ8VWrU7X0pylv586dyMzMvGA7WRlY1jKLjIzU0WdUuZj4GLyMlzEofhACewfyUBER2Qnvlt64HJdrJMdXrYSofJ8haQqTDtOVdZqW6zt37qxzFFHlWrVohd7orZGIiOxH7slcRCNaYyD4g9XRVSshkgVbzX2DpkyZgkmTJuGmm266YDuZxEpGmDVt2rT29tRB+fv6YyiGaiQiIvtxJO0I1mM97ky7ExGIMHp3yJ4SovJzCj3yyCPo1KlTvZ5nyB4Uni5EGtI0EhGR/egS1gULsEAjOb4ad6q+9tprERISUrt744QSDidgJVZqJCIi++Hq6gp3uGskx2fzqxwdHY2DBw/qbM7nzp2rsC/RtGnTbH0YhxXWIQyzMEsjERHZV5PZBmzA6LTRHPTiBGqcEJ08eRILFy7EgQMHqpyTiAlR1Zo2aYoABGgkIiL7UXK2BCdxUiM5vhonRG+88YYu6nrZZZdh9OjR8PPzg4uLS+3unRPIOJqBbdiGcUfHcRQDEZEdCWkXgjtwh0ZyfDVOiHbv3o2IiAi8+uqrnI3aBidPnUQUojQSERFRPetUXVxcjJ49ezIZslF4SDjmYZ5GIiKyHwdiD+BZPKuRHF+NE6LQ0NAKZ6kmIiJyBAG+ARiGYRrJ8dU4Ibr99tuxa9cuREVF1e4eOZnYxFgswzKNRERkP3xa+aAv+mokx1fjPkTHjx9H3759cd9992HEiBEICwurdCFX6XRNFfNs5olwhGskIiL7cSr/FBKQoJFLdzi+GidEzz//vPYfkiH3ssaZnOTv8uQ6uYwJUeVa+7fGSIzUSERE9iMpJQkf4kPcmnIrOqGT0btD9poQydIdZLvTRadxFEc1EhGR/egc2hn3436N5PhcbVm6g2wXnxSP5ViO65OuR8f+HXlIiYjsRONGjeEFL43k+LhASxW2bdumJ1mWpK7IhF/TMZ0TfxER2ZnUjFRswiaMyRjDPkROoMYJUVZWltXb+vv7oz4aPny4nmJjYzFjxow6eQwPdw+0QRuNRERkP6QrQwYy2KXBSdQ4IZo8ebJVkzLKNtu3b6/pwzi8rOws7MAOjM8ez18gRER2RBbdnomZXHzbSdQ4IRo1alSFCZE0LyUmJiIjI0PXOQsI4IRWVcnJzcEe7NFIRERE9SwhkpXuKyPD7detW4ePP/4YDz/8cE0fwil0CeuC+ZivkYiI7Ed0fDSWYAkGxg9EYO9Ao3eH7HWm6qpI5ejmm29Ghw4dsHz58rp4CCIiojrl09IH/dBPIzm+OkmIzMLDw/Hbb7/V5UM4xLD7t/G2RiIish9+Pn4YhEEayfHVaUKUlpaG0tLSunyIeq9pk6Y6ykwiERHZj4LCAiQjWSM5vlpPiM6dO6dD8levXq2Lv3bt2rW2H8KhBAcGYyzGaiQiIvuRmJyI9/CeRnJ8Ne5UPXjw4CqH3UvHak9PT8yZM6emD+EUis8U4wROaCQiIvvRqWMn3It7NZLjq3FC1LNnzwoTIrlMEqHOnTtjzJgxaNmypa376NBiE2PxGl7DtYnXon3f9kbvDhER/VcTtybwgY9Gcnw1Tohef/312t0TJ9WhTQfchts0EhGR/UjPSscWbMF1Wddx4lwnUKedquniPJt5IgQhGomIyH7kF+QjEYkayfHVyuKu+/fvR3x8PAoLC+Hu7o6wsDB07969Nu7a4WXnZONH/IgJORP4C4SIyI5I36E5mMM+RE7C1dZEaPHixTq83tyR2tyvKDg4GI888gi6detWO3vqoLKOZeF7fK+RiIiI6llClJSUhPnz56OoqAhXXHEFevXqBW9vbxw/fhz79u3Dnj179Pq3334b7duzs3BluoV3w0Is1EhERPbjYMJBLMVSXJ1wNZfucAI1Tojef/99lJSUYMmSJbjqqqssrps6dSp+/vln/P3vf9ftnnjiidrYVyIiokumhVcL9EAPjeT4atyp+vfff8eQIUMuSIbM5HK5XqpFVLmEwwlYhVUaiYjIfgT4BmAYhmkkx1fjhKigoACBgVWv/ivXy3ZUObfGbmiFVhqJiMh+FJ4uRDrSNZLjq3FCJP2FoqKiqtwmOjpat6PKtWndBhMwQSMREdkPqdyvwApW8J1EjROiAQMGaLPZO++8g+Jiy2Un5O93331Xm8sGDhxYG/vpsKQfVgEKNBIRkf0IbR+KmZipkRxfjTtVT5s2Dbt378aHH36IL774AhEREbpMx4kTJ3Dw4EHk5uaidevWuh1VLiYhBi/iRQxLGIa2V7XloSIishPuTd3RGq01kuOrcYXIy8sLb731FkaPHo3Tp0/jp59+wldffaVRJmi89tpr9frmzZvX7h47mHbB7TAFUzQSEZH9yMzOxLf4ViM5PpsmZmzRooVOvijzDSUnJ5fNVN2uXTu4utbKJNgOz8vTC53RWSMREdmP3LxcRCJSIzm+amctH3zwgU7GeOedd5YlPRJDQkLKtpH+MCtXrkTTpk1x66231u4eO5icEzn4Fb9i4omJXLqDiMiOdA7tjPtxv0ZyfNVqMvv111+1s7Q0g1VVAWrUqJFuIx2uf/vtt9rYT4eVlpmGL/GlRiIiIqoHCdHWrVvh6emJG2+88aLbTpgwQbeVfkVUuR4RPfA4HtdIRET2I+5QHN7EmxrJ8VUrITpw4AAuv/xyNG7c+KLbyjayxpksAEtERFTfNPNohhCEaCTHV62E6NixYzqU3loyU3VOTk5N9stpHDpyCGuwRiMREdmP1v6tMRqjNZLjq1an6oYNG+Ls2bNWby/bym3sxdq1a7Fhwwbk5+cjODgYy5Yt01FxRnJp6AI3uGkkIiL7UVRchGM4ppEcX7USIlmGIykpyertZVsfHx/Yg3/+85/4+eefsXz5cvj5+eHQoUN2MTWAzD80GZM5DxERkZ2RvkNv4A1cd+g6dOjXwejdoTpWrfJNjx49dNRYRkbGRbeVbWTbnj17wmilpaVYs2YNFixYAH9/fzRo0ECnCbCmL9Sl2LczOKORiIjsR0i7ENyBOzSS46tWQiQjx6QZ7B//+IcuzVGZvLw8PP744/olP378+GrvlEzwKMP7ZcLHsWPH4uqrr650tNqZM2d0RmzZt+HDh+Puu+/Gnj17LLbJzs7W9dW+//573Z+pU6di06ZNsAdRcVF4Ds9pJCIi++Hh7oF2aKeRHF+1EqLw8HBMmjQJcXFx+Otf/4pVq1ZpFSglJUVPspirzD0k18XGxuq2cpvqkoTq/fff19mvQ0OrXlTv+eefx/r16zFixAjcd9992mdJKkGRkZEWCZH0G5J9lG2feuoprFixAn/88QeMJqvcT8RErnZPRGRnjh47ip3YqZEcX7U70cyZM0ebmj7++GNthpJTeSaTSZMSmaH6rrvuqtFOSV+ljRs3apSFYmfOnFnhdtHR0fj2229xzz334Oabb9bLRo0ahdtvv12rRnISbm5uGuVyOS/NZcOGDdN114xu0mvp1RLd0V0jERHZj2MnjmE3dmskx1fthEj630iCIk1Zmzdv1rmJjh8/rte1atUK3bt314Vdg4KCarxTknBJMnQxO3bsgIuLC66//vqyyyThkX2TClBWVpb2GWrTpo3Oni37Xv552IMTeSfwB/7QGIhAo3eHiIj+q0tYFyzAAo3k+Go8zEoSnhkzZsBI8fHxOnzew8OyfTciIkJjQkKCJkSyptrgwYN1HbZ58+YhPT0d3333nTadVTbfUvn5k6Tprq6kpKdgIzbi7vS70QX80BERERnB+HHnNpCkpaJKkvkySWzM7r//frzwwgsYN24cvLy8MH369Eqby7744gvtw3QpdAvvhkVYpJGIiOxHfFI8VmAFhiYNRWBvVvAdXb1OiGTkmDSFnc88nF6uN5N11Z555hmr7lea4AYMGGBRIbL2ttUl/a1c4WpXE1gSERHQtElT7cogkRxfvU6IpL9QSUlJhUPxzdfXhEwmeakmlExOTcY6rMOo1FH8BUJEZEeCA4MxDuM0kuOr12UJaRqraK0082X2Mkt2Vc6ZzqEUpRqJiMh+nCk5gzzkaSTHV68TIpmjKDU1FQUFBRcMxzdfb+86tOmAqZiqkYiI7MfBhINYiqUayfHV64RoyJAhOhu2dIIu31wm0wF06dJFR5gRERHVhPxQvRW38gerk7DbPkTmVenNzV+7du3C0aN/zhY6ceJENGvWTJOeoUOH6pxDspSITAWwZcsWZGZm4uGHH7Z5H7Zt26Yn2Y+6EhkTiSfwBPrG9GUfIiIiO+LZzBMBCMDv//ldz4vE5EQ0cm2EtkFtdSmr6PhoPd+ieQvknMhBWmYaekT00G2TUpLQsEFDXbz73LlzOBB7QFclkIl4Ze45mXala6euOp+e9CctPVeKjm07ln03BAUEwbulN/JO5en1EaEROpBIbld8phih7f9sBZH79ffxh6+3L07ln9LH7XVlL/iF+Rl49Oofu02IPvnkE01szH744Qc9iZEjR2pCJBYuXKiVoK1bt2ri0rFjRx1ef9lll9m8D7I2mpxkGZK6mnNJ3vDSaU8iERHZD3cfd8Q0isFrj76GRx99VC97D++hOZrrkkuFKMQSLMFkTNZ55PZiLzZhk/7IFR/hI7jABVMwBWdxFs/gGUzABPRET+zHfmzABizEQjRGY6zHehSjGLfhNr3tk3gSYzEWV+AKHMRBHXzzEB6CBzx07rrjOI7pmK7bynqYQzAE/dEfiUjEGqzB/CbzsSh2Ebzaehl4BOuXBiZZa4OqZE6IVq5cWaO12aqS8VsGVly+AjP3zmSFiIjIziT8loCk2KSyueLqQ4Vo3w/7cOCxA5i9dza/VxyhQuQsck/mIhrRGrl0BxGRfQntHaons/MnaGxzZZv/XYdAdEO3SrcNuiLIYtvyqxOcv235v2Xbzuhs9baSQL2Ml3F9xvX8XnGWTtWO4EjaES2VSiQiIrLV6aLTSEGKRrIeEyKDcfFAIiKqTWEdwjALszSS9dhkZvAoM1dXV7jDXSMREREZgxWiKsgIs8WLF2Pu3Ll19gJIU5mMNGCTGRER1Qbp6P0SXtJI1mNCZLCSsyU4iZMaiYiIbOXdwht90EcjWY8JkcFC2oXgDtyhkYiIyFb+vv4YjMEayXpMiIiIiBxIQWGBjjKTSNZjQmQwmVDrWTyrkYiIyFYyeeQqrNJI1mNCZLAA3wAMwzCNREREtpLh9rMxm8Puq4ljvQ0edu/Tygd90VcjERGRrZo2aQo/+Gkk67FCZPCwe1l3JgEJGomIiGyVnpWOr/G1RrIeEyKDyeJ/H+JDjURERLaSH9ixiOUP7WpiQmSwzqGdcT/u10hERGSr8JBwzMVcjWQ9JkQGa9yoMbzgpZGIiIiMwYTIYKkZqdiETRqJiIhsFZsYi9fwmkayHhMig50uOo0MZGgkIiKyVXPP5uiKrhrJekyI7GC+iJmYyfkiiIioVgT6BWI4hmsk63EeIoPnISIiIqpN0uKQiUy2PFQTK0QGz0MUHR+NJViikYiIyFbxSfF4G29rJOsxITKYT0sf9EM/jURERLYKbR+KGZihkazHhMhgfj5+GIRBGomIiGzl3tQdQQjSSNZjQmSwgsICJCNZIxERka2ysrOwHds1kvWYEBksMTkR7+E9jURERLY6nnscv+E3jWQ9JkQG69SxE+7FvRqJiIhsFREWgQfxoEayHhMigzVxawIf+GgkIiIiYzAhMlh6Vjq2YItGIiIiW8UdisNyLNdI1mNCZLD8gnwkIlEjERGRrTzcPdAe7TWS9ThTtcEzVUvfoTmYwz5ERERUK4ICgjAGYzSS9ZgQXWSmajnFxsZixowZ1TisRERExigqLkIOcjSS9dhkZrCDCQexFEs1EhER2Ur6Di3DMvYhqiYmRAZr4dUCPdBDIxERka06tu2IaZimkazHhMhgAb4BGIZhGomIiGzVzKMZOqCDRrIeEyKDFZ4uRDrSNRIREdkqOycbu7BLI1mPCZHBEg4nYAVWaCQiIrLV0Zyj2ImdGsl6TIgMFto+FDMxUyMREZGtunbqikfwiEayHhMig7k3dUdrtNZIRERExmBCZLDM7Ex8i281EhER2Uq6YLyDd9gVo5qYEBksNy8XkYjUSEREZCtZLNwXvlw0vJqYEBmsc2hn3I/7NRIREdkqODAY4zFeI1mPS3cYvJYZERFRbSopKcEpnNJI1mOFqAqyjtnixYsxd+5c1OUU62/iTU6xTkREtSImIQYv42WNZD0mRAaTmURDEMIZRYmIqFa0D26PW3CLRrIeEyKDtfZvjdEYrZGIiMhWzT2boxM6aSTrMSEyWFFxEY7hmEYiIiJb5ZzIwS/4RSNZjwmRwaQP0Rt4g32IiIioVqRnpWMrtmok6zEhMlhIuxDcgTs0EhER2ap75+54DI9pJOsxITKYh7sH2qGdRiIiIjIGEyKDHT3231WJj3FVYiIist2hI4ewGqs1kvWYEBns2Ilj2I3dGomIiGzl6uIKD3hoJOsxITJYl7AuWIAFGomIiGzVNqgtbsJNGsl6TIiIiIgcSGlpKYpQpJGsx4TIYPFJ8ViBFRqJiIhsFRUXhcVYrJGsx4TIYE2bNEUgAjUSERHZSprKJmESm8yqiQmRwYIDgzEO4zQSERHZqkXzFuiKrhrJeuyCXoVt27bpKT8/H3XlTMkZ5CFPIxERka2O5x7HPuzTKC0QZB1WiKowfPhwLF68GHPnzkVdOZhwEEuxVCMREZGtUjNS8Tk+10jWY0JksA5tOuBW3KqRiIjIVly6o2aYEBnMs5knQhGqkYiIyFYNGjSAC1w0kvWYEBns2PFj+Ak/aSQiIrLV4ZTDWIu1Gsl6TIgMlpmdiW/xrUYiIiIyBhMig3UL74ZH8ahGIiIiW7Vv0x634BaNZD0mRERERA7EZDKhFKUayXpMiAyWmJyI9/CeRiIiIlvtP7gfT+NpjWQ9JkQGa+TaCM3RXCMREZGtZOWD8RjPFRCqiQmRHaw5MxETueYMERHVilYtWqEXemkk6zEhMtjZs2dRiEKNREREtso9mYsoRGkk6zEhMlh0fDSWYIlGIiIiWx1JO4JP8alGsh4TIjtoMpuMyWwyIyKiWtG1U1c8gkc0kvWYEBmsRfMW6IIuGomIiGzl4uKCJmiikazHhMhgOSdysBd7NRIREdlKmso+w2dsMqsmJkQGS8tMwyZs0khERGSrs6VnUYACjWQ9JkQG6xHRA0/gCY1ERES26ti2I6ZhmkayHhMiIiIicnpMiAyWlJKEj/CRRiIiIltx6Y6aYUJksIYNGsIFLhqJiIhs1dq/NUZhlEaynms1tnU627Zt01N+fn6dPUa74HaYgikaiYiIbOXd0htX4kqNZD0mRFUYPny4nmJjYzFjxgzUhXPnzuEszmokIiKy1clTJxGHOI2BCOQBtRLbaQx2IPYAnsEzGomIiGx1OPUw1mKtRrIeEyKDtWndBhMwQSMREZGtIkIj8CAe1EjWY0JksJZeLdETPTUSERHZqlGjRvCEp0ayHhMig53IO4H92K+RiIjIVqkZqfgcn2sk6zEhMlhKego2YINGIiIiWxUVFyEb2RrJekyIDNa1U1csxEKNREREtgptH4q7cJdGsh4TIoO5uLigMRprJCIiImMwITJYcmoy1mO9RiIiIltFxUVhMRZrJOsxITJY6blSFKNYIxERka38vP0wCIM0kvWYEBmsY9uOuA23aSQiIrKVr7cvBmCARrIeEyIiIiIHkl+QjyQkaSTrMSEyWGRMJJ7EkxqJiIhsdejIIazGao1kPSZEBgsKCMJYjNVIRERkq04dO2Eu5mok6zEhMph3S29cgSs0EhER2aqJWxN4w1sjWY8JkcHyTuXhIA5qJCIislVaZho2Y7NGsh4TIoPJ/EPrsI7zEBERUa0oKCzAYRzWSNZjQmSwiNAIPISHNBIREdlK+g7Nxmz2IaomJkQGa9SoETzgoZGIiIiMwYTIYLLK/UZs5Gr3RERUK2LiY/AyXtZI1mNCZLDiM8U4juMaiYiIbNWqRSv0Rm+NZD0mRAYLbR+K6ZiukYiIyFb+vv4YiqEayXpMiIiIiBxI4elCpCFNI1mPCZHBDsQewHN4TiMREZGtEg4nYCVWaiTrMSEymL+PP4ZgiEYiIiJbhXUIwyzM0kjWY0JkMF9vX/RHf41ERES2atqkKQIQoJGsx4TIYKfyTyERiRqJiIhslXE0A9uwTSNZjwmRwZJSkrAGazQSERHZ6uSpk4hClEayniucxH333Yfo6Gi4uLjo3z169MCLL75o9G4hPCQc8zBPIxEREb9XjOE0CZFYsGABRo4cCXvi1tgNLdFSIxERERmDTWYGS81IxZf4UiMREZGtYhNjsQzLNFI9rxAVFhZi3bp12sQVExODU6dO4e9//zuuvfbaC7Y9c+YMVq1aha+//lq3CwkJwV133YU+ffpcsO2yZcv0FBYWhjlz5ui2RjtddBopSNFIRERkK89mnghHuEaq5xWivLw8vP/++0hOTkZoaNVLWjz//PNYv349RowYof2EGjZsqE1jkZGRFtvNmjULn3zyCT777DNcccUVeOihhzTxMhrniyAiotrU2r81RmKkRqrnCZG3tzc2btyITz/9FPfcc0+l20kF6dtvv8XMmTMxe/ZsXH/99Xj11VcREBCAt956y2LbLl26wN3dHW5ubrjlllv0fFRU1CV4NkRERJeOtDgcxVG2PDhCQtS4cWNNii5mx44dOmpMEiEzSXjGjh2ryU5WVlalt23QoAFMJhOMFh0fjZfwkkYiIiJbxSfFYzmWa6R63ofIWvHx8QgODoaHh4fF5RERERoTEhLg7++vfYsOHjyInj17aiIk1Se5TKpGFTl27BhycnLK/pamu7ri3cIbfdBHIxERka1C2oVgOqZrJCdJiCRpqaiSZL5MEhtRWlqKFStW4MiRI3B1ddV+SS+88AKaNWtW4f1+8cUX2ofpUvD39cdgDNZIRERkKw93D7RBG43kJAlRcXExGjVqVGGTm/l60aJFC6xcudLq+5UmuAEDBlhUiJ555hnUhYLCAh1lJpGIiMhWWdlZ2IEdGJ89HoEI5AF1hoRI+guVlJRUOBTffH1N+Pj46OlSSExOxCqswqTkSQgdWPWIOiIioovJyc3BHuzRSPW8U7W1pGmsfF8fM/NllyqpsXXY/WzM1khERGSrLmFdMB/zNZKTJETSFyg1NRUFBQUXDMc3X2/vmjZpCj/4aSQiIiJj1OuEaMiQIdphWjpBl28u27x5s44gkxFm9i49Kx1f42uNREREtpLh9m/jbQ67d5Q+RBs2bEB+fn5Z89euXbtw9OhRPT9x4kQdISZJz9ChQ3UEWW5uLoKCgrBlyxZkZmbi4Ycftnkftm3bpifZj7pyKv8UYhGrkYiIyFbS4iCjzNjy4CAJkSyzIYmN2Q8//KAnISvWm4fML1y4UCtBW7du1cSlY8eOOqT+sssus3kfhg8frqfY2FjMmDEDdSE8JBxzMVcjERGRrYIDgzEWYzWSAyREsj6ZNWQkmSzbISciIiJnV3ymGGlIQ9wvcfp3dk42so5loVt4N/074XAC3Bq7oU3rNjpSOyYhBu2C28HL0ws5J3KQlpmGHhE9dNtDRw7BpaGLXi9dVKLiovR2eRl5eOWFV3Dd5OswfNRwXUc0OTUZ50zn0KFNB71tZEwkggKC4N3SG7knc3Ek7Yh29Jb5AOV8ydmSsskjD8QeQIfwDgjtbVzfX7tNiJxFbGIsXsNrGJw4GIG9OV8EERHZJt+Uj5VYieP3HEd3dMeP+BHf43ssxEK9XqZ6aYVWmIAJKEABXsSLmIIp6IzO+BW/4kt8icfxuG67BmvgBjdMxmScwRk8h+cwERPRHu2RhCTMjpyNBxY9AFe4Yh3WoRSlmIqpetsn8ATGYRwux+WIRjTWYz0WYAHc4Y4N2ICTOIk7cIdu+yyexchGI/FRwkfwautlyFuACZHBmns2R1d01UhERGSrbv26Yf+P+9G4pDE8m3liQs4EiwrRNYevsagQDUsYVlYhmnhiIu7NvLesQjT8yHCLCtHVcVfr7Vp6tcSdeXciJT1F71cqRKNSR1lUiPrG9LWoEN2ZdmdZhWh02miLClHElgjseXQPCo8VMiFyVoF+gRiO4RqJiIhqKykq+545b7bq81sj2l7V1mLbbuhW6bbBfYIttu2CLpVuW/5v2TYCEZVue1n+ZdiETTrAyKjZtVkhMniU2emi08hEpkYiIiJnlJSShA/xIW5NuRWd0MmQfajX8xDVNRlhtnjxYsydO7fOHoPzRRARkbPrHNoZ9+N+jUZhQmSw0PahmIEZGomIiJxR40aN4QUvjUZhQmQw96buCEKQRiIiImeUmpGqfYgkGoUJkcGysrOwHds1EhEROaPTRaeRgQxD+9MyITLY8dzj+A2/aSQiInJGYR3CMBMzNRqFCZHBIsIi8CAe1EhERETG4LB7g4fdExERObvo+GgswRIMjB9o2KoNrBAZPOw+7lAclmO5RiIiImfk09IH/dBPo1GYEBnMw91D14SRSERE5Iz8fPwwCIM0GoUJkcFknZcxGKORiIjIGRUUFiAZyRqNwoTIYEXFRchBjkYiIiJnlJiciPfwnkajMCEymPQdWoZl7ENEREROq1PHTrgX92o0CkeZWaG4uFhjcnJyrb8ALi4umOIxRWNsbGyt3z8REZG9O3b0GBp7NEb60XSciT1T6/ffrl07NGnSpMptGphMJlOtP7KD+frrr/HMM88YvRtERERUAytXrkR4eHiV2zAhskJubi5++eUX/Otf/8K8efOsOvjLli2zari+VJ0k2Vq0aJFmsGT9sXOGfaurx6ut+7Xlfmpy2+rexprt+RmsndfmUuLnsP58DpfZyXehNRUiNplZoUWLFhg5ciS+++67i2aYZs2aNbN6W/OLVZ3tHVl1j50j71tdPV5t3a8t91OT21b3NtXZnp9B216bS4mfw/rzOWxWj74L2am6mhM11sW2VH+O3aXet7p6vNq6X1vupya3re5t7Pm9ZM/s/bjxc1h/PofD7fy9VB6bzAwmHalnzJhhVfsmEfEzSOSIYu3gu5AVIoN5e3vj9ttv10hE/AwSOSNvO/guZIWIiIiInB4rREREROT0mBARERGR02NCZOfOnDmDxYsX46abbsLo0aMxa9YsHDhwwOjdInIqL774Im644Qb9DE6bNg27du0yepeInNaBAwcwePBgrF69ulbvl32I7Nzp06fxySef4Nprr4Wvry+2b9+OV199VS9zd3c3eveInIJMGhcYGIjGjRsjJiYGDzzwANatWwcvLy+jd43IqZw7dw6zZ8+GLLLRv39//YFSW1ghsnNNmzbVnvf+/v5o2LAhhg0bBldXV6SkpBi9a0ROQyaLk2RINGjQACUlJTh27JjRu0XkdDZt2oSIiIg6mc2aM1XXssLCQv3lGB0drb8kT506hb///e9a4amoOWzVqlW6VppsFxISgrvuugt9+vSp9P4lEZJtg4KCanvXiRxCXX0GX3nlFWzevFlv07dvX3Ts2PESPSOi+qewDj6HeXl5+PTTT/HWW2/pkiC1jRWiWiYv2Pvvv68l9tDQ0Cq3ff7557F+/XqMGDEC9913n1aAFixYgMjIyAq3Ly4u1rVepk6dqtOhE9Gl+wxKM9nWrVuxdOlS/UctlSIiunSfQ5m0cdKkSfD09ESdkNXuqfYUFxebjh07pudjYmJMgwYNMm3evPmC7aKiovS6tWvXll1WVFRkmjJlimnWrFkXbF9SUmJasGCB6cknnzSdO3eOLxnRJf4Mlvfwww+bfvzxR74GRJfocxgbG2uaPn266ezZs/r3s88+a3r//fdNtYkVolom/QysmWlzx44dcHFxwfXXX192mZubG8aOHYuoqChkZWVZdCKTypD8Il24cCF/mRJd4s/g+UpLS5GWlsbXgegSfQ5///137TIyceJEHfEpi62vXbtWq0u1hX2IDBIfH4/g4GB4eHhYXC6dxURCQoJ2pBYvvfQScnJyNEqHaiK6dJ/B/Px87N69GwMGDNB/8jt37sS+ffswc+ZMvgxEl+hzKAmTDCoye/3113Xkp3QhqS38djWIJDgVZc/my8wjWDIzM/Hvf/9b/xGXz6CXLFmCnj17XsI9JnLOz6BUZuUzKH2HZKivDGh47LHHEBYWdsn3mchZP4dNmjTRU/kqkozCrs3+REyIDCIdpBs1anTB5eahvXK9CAgIwA8//HDJ94/I0Vn7GZRfrq+99tol3z8iZ1Bs5efwfNJ9pLaxD5FBJLuVuUwqGn5ovp6I+BkkcmRudvRdyITIIFIOlFLh+cyX+fj4GLBXRM6Dn0Ei43nb0XchEyKDyLwMqampKCgosLhcJrEyX09E/AwSObJQO/ouZEJkkCFDhujQ3S+++MKiRCgz4Xbp0qVshBkR8TNI5KiG2NF3ITtV14ENGzboUF1zyU9Wxj569KielzkUZJZpeaGHDh2KFStWIDc3V0eubNmyRUeVPfzww3WxW0ROg59BIuNtqGffhVztvg5MnjxZX8yKyCr1MneCufe8ef0WedPI2kiyfsuVV15ZF7tF5DT4GSQy3uR69l3IhIiIiIicHvsQERERkdNjQkREREROjwkREREROT0mREREROT0mBARERGR02NCRERERE6PCRERERE5PSZERERE5PSYEBEREZHTY0JERERETo8JERGRjdavX49rrrkGGRkZZZd99dVXuPrqqzXag3//+9+6snhiYqLRu0Jkl5gQEZEF+VKXL/KqTrJoI/3p1KlT+OCDDzBmzJiyxSrryi+//KLH/8EHH7zotk899ZRu+8033+jfo0ePhr+/P9566y2+dEQVcK3oQiKioKAgjBgxosID0axZMx6gctWhkydP4uabb67zY3LFFVdoUrN3715kZWXp+YrIiuE7d+7U10mSIuHq6qqJ7GuvvYb9+/eje/fufA2JymFCRESVJkR33nknj04Vzp49q01RklzI8aprDRs2xLXXXov3338fW7ZswbRp0yrcbtu2bSguLtaqlZubW9nlw4YNwxtvvIHPP/+cCRHRedhkRkQ2kyrEfffdh+PHj+PZZ5/FuHHjMHz4cMyaNQv79u2r8DaFhYV499138de//lW3lS9vaQqKjIy8YFu5b3kM+ZJfuXIlpkyZgqFDh+rtzXbs2IEZM2bofY0fPx5LlizR5iypipRv4nv66af1vqKjoyvcr1WrVun1klRY04SVk5OjfXOsdfToUU1kZD+///77sstPnDiBZcuWaaVJEhc5hosWLcKhQ4csbi/HqUGDBto3yWQyVfgYmzdv1jh27FiLy1u0aIFevXrp48rxJ6L/YUJERLVCmmnmzJmDw4cPY+TIkZpUxMbGYv78+Rd8qUsT0z333KOVDk9PT01gZPu4uDjMmzdPm3sq8thjj2llRL7Ub7rpprI+O19++aVel5qailGjRml/maioKDzwwANaxSnv+uuvL7vN+UpLSzWZ8PLyKmtqqoo0XYmuXbtadYzk2MyePVuTohdffLEskUpLS8Ndd92FTz/9FK1bt8aNN96Ivn37asIlx6l88hYQEIDLL78c6enpFSabcqwPHjyIsLAwdOrU6YLrZV/PnDmDAwcOWLXPRM6CTWZEVCH5ki5fgTn/S/Wqq66yuCwhIQE33HAD/va3v2nTjujdu7dWav75z39qYmT26quvIikpCQsWLMB1111nUSWRKo8kC1deeaVF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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "expectation_bkg = bkg.expectation(copy = True)\n", "\n", "fig,ax = plt.subplots()\n", "\n", "ax.stairs(expectation.project('Em').todense().contents + expectation_bkg.project('Em').todense().contents, binned_energy_edges, color='purple', label = \"Best fit convolved with response plus background\")\n", "ax.errorbar(binned_energy, expectation.project('Em').todense().contents+expectation_bkg.project('Em').todense().contents, yerr=np.sqrt(expectation.project('Em').todense().contents+expectation_bkg.project('Em').todense().contents), color='purple', linewidth=0, elinewidth=1)\n", "ax.stairs(data.data.project('Em').todense().contents, binned_energy_edges, color = 'black', ls = \":\", label = \"Total counts\")\n", "ax.errorbar(binned_energy, data.data.project('Em').todense().contents, yerr=np.sqrt(data.data.project('Em').todense().contents), color='black', linewidth=0, elinewidth=1)\n", "\n", "ax.set_xscale(\"log\")\n", "ax.set_yscale(\"log\")\n", "\n", "ax.set_xlabel(\"Energy (keV)\")\n", "ax.set_ylabel(\"Counts\")\n", "\n", "ax.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "8314a112-89fe-4c06-9284-b36fcc072c90", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:cosipy2]", "language": "python", "name": "conda-env-cosipy2-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 5 }