{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "**This is a fixed-text formatted version of a Jupyter notebook**\n", "\n", "- Try online [![Binder](https://static.mybinder.org/badge.svg)](https://mybinder.org/v2/gh/gammapy/gammapy-webpage/v0.18.2?urlpath=lab/tree/models.ipynb)\n", "- You can contribute with your own notebooks in this\n", "[GitHub repository](https://github.com/gammapy/gammapy/tree/master/docs/tutorials).\n", "- **Source files:**\n", "[models.ipynb](../_static/notebooks/models.ipynb) |\n", "[models.py](../_static/notebooks/models.py)\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gammapy Models\n", "\n", "\n", "This is an introduction and overview on how to work with models in Gammapy. \n", "\n", "The sub-package `~gammapy.modeling` contains all the functionality related to modeling and fitting\n", "data. This includes spectral, spatial and temporal model classes, as well as the fit\n", "and parameter API. We will cover the follwing topics in order:\n", "\n", "1. [Spectral Models](#Spectral-Models)\n", "1. [Spatial Models](#Spatial-Models)\n", "1. [SkyModel](#SkyModel)\n", "1. [Model Lists and Serialisation](#Model-Lists-and-Serialisation)\n", "1. [Implementing as Custom Model](#Implementing-a-Custom-Model)\n", "\n", "The models follow a naming scheme which contains the category as a suffix to the class name. An overview of all the available models can be found in the [model gallery](https://docs.gammapy.org/dev/modeling/gallery/index.html#spectral-models).\n", "\n", "Note that there is a separate tutorial [modeling](modeling.ipynb) that explains about `~gammapy.modeling`,\n", "the Gammapy modeling and fitting framework. You have to read that to learn how to work with models in order to analyse data.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setup" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from astropy import units as u\n", "from gammapy.maps import Map, WcsGeom, MapAxis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Spectral Models\n", "\n", "All models are imported from the `~gammapy.modeling.models` namespace. Let's start with a `PowerLawSpectralModel`:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import PowerLawSpectralModel" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PowerLawSpectralModel\n", "\n", " name value unit min max frozen error \n", "--------- ---------- -------------- --- --- ------ ---------\n", " index 2.0000e+00 nan nan False 0.000e+00\n", "amplitude 1.0000e-12 cm-2 s-1 TeV-1 nan nan False 0.000e+00\n", "reference 1.0000e+00 TeV nan nan True 0.000e+00\n" ] } ], "source": [ "pwl = PowerLawSpectralModel()\n", "print(pwl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get a list of all available spectral models you can import and print the spectral model registry or take a look at the [model gallery](https://docs.gammapy.org/dev/modeling/gallery/index.html#spectral-models):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Registry\n", "--------\n", "\n", "ConstantSpectralModel : ['ConstantSpectralModel', 'const'] \n", "CompoundSpectralModel : ['CompoundSpectralModel', 'compound'] \n", "PowerLawSpectralModel : ['PowerLawSpectralModel', 'pl'] \n", "PowerLaw2SpectralModel : ['PowerLaw2SpectralModel', 'pl-2'] \n", "BrokenPowerLawSpectralModel : ['BrokenPowerLawSpectralModel', 'bpl'] \n", "SmoothBrokenPowerLawSpectralModel : ['SmoothBrokenPowerLawSpectralModel', 'sbpl'] \n", "PiecewiseNormSpectralModel : ['PiecewiseNormSpectralModel', 'piecewise-norm'] \n", "ExpCutoffPowerLawSpectralModel : ['ExpCutoffPowerLawSpectralModel', 'ecpl'] \n", "ExpCutoffPowerLaw3FGLSpectralModel : ['ExpCutoffPowerLaw3FGLSpectralModel', 'ecpl-3fgl'] \n", "SuperExpCutoffPowerLaw3FGLSpectralModel: ['SuperExpCutoffPowerLaw3FGLSpectralModel', 'secpl-3fgl'] \n", "SuperExpCutoffPowerLaw4FGLSpectralModel: ['SuperExpCutoffPowerLaw4FGLSpectralModel', 'secpl-4fgl'] \n", "LogParabolaSpectralModel : ['LogParabolaSpectralModel', 'lp'] \n", "TemplateSpectralModel : ['TemplateSpectralModel', 'template'] \n", "GaussianSpectralModel : ['GaussianSpectralModel', 'gauss'] \n", "EBLAbsorptionNormSpectralModel : ['EBLAbsorptionNormSpectralModel', 'ebl-norm'] \n", "NaimaSpectralModel : ['NaimaSpectralModel', 'naima'] \n", "ScaleSpectralModel : ['ScaleSpectralModel', 'scale'] \n", "PowerLawNormSpectralModel : ['PowerLawNormSpectralModel', 'pl-norm'] \n", "LogParabolaNormSpectralModel : ['LogParabolaNormSpectralModel', 'lp-norm'] \n", "ExpCutoffPowerLawNormSpectralModel : ['ExpCutoffPowerLawNormSpectralModel', 'ecpl-norm'] \n", "\n" ] } ], "source": [ "from gammapy.modeling.models import SPECTRAL_MODEL_REGISTRY\n", "\n", "print(SPECTRAL_MODEL_REGISTRY)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spectral models all come with default parameters. Different parameter\n", "values can be passed on creation of the model, either as a string defining\n", "the value and unit or as an `astropy.units.Quantity` object directly:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "amplitude = 1e-12 * u.Unit(\"TeV-1 cm-2 s-1\")\n", "pwl = PowerLawSpectralModel(amplitude=amplitude, index=2.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For convenience a `str` specifying the value and unit can be passed as well:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PowerLawSpectralModel\n", "\n", " name value unit min max frozen error \n", "--------- ---------- -------------- --- --- ------ ---------\n", " index 2.2000e+00 nan nan False 0.000e+00\n", "amplitude 2.7000e-12 cm-2 s-1 TeV-1 nan nan False 0.000e+00\n", "reference 1.0000e+00 TeV nan nan True 0.000e+00\n" ] } ], "source": [ "pwl = PowerLawSpectralModel(amplitude=\"2.7e-12 TeV-1 cm-2 s-1\", index=2.2)\n", "print(pwl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model can be evaluated at given energies by calling the model instance:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2.70000000e-12 2.40822469e-13 1.70358483e-14 1.51948705e-15] 1 / (cm2 s TeV)\n" ] } ], "source": [ "energy = [1, 3, 10, 30] * u.TeV\n", "dnde = pwl(energy)\n", "print(dnde)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The returned quantity is a differential photon flux. \n", "\n", "For spectral models you can computed in addition the integrated and energy flux\n", "in a given energy range:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.108034597491956e-12 1 / (cm2 s)\n", "4.982075849517389e-12 TeV / (cm2 s)\n" ] } ], "source": [ "flux = pwl.integral(energy_min=1 * u.TeV, energy_max=10 * u.TeV)\n", "print(flux)\n", "\n", "eflux = pwl.energy_flux(energy_min=1 * u.TeV, energy_max=10 * u.TeV)\n", "print(eflux)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This also works for a list or an array of integration boundaries:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.64794383e-12 4.60090769e-13 1.03978226e-13] 1 / (cm2 s)\n" ] } ], "source": [ "energy = [1, 3, 10, 30] * u.TeV\n", "flux = pwl.integral(energy_min=energy[:-1], energy_max=energy[1:])\n", "print(flux)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In some cases it can be useful to find use the inverse of a spectral model, to find the energy at which a given flux is reached:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0 TeV\n" ] } ], "source": [ "dnde = 2.7e-12 * u.Unit(\"TeV-1 cm-2 s-1\")\n", "energy = pwl.inverse(dnde)\n", "print(energy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a convenience you can also plot any spectral model in a given energy range:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pwl.plot(energy_range=[1, 100] * u.TeV)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Spatial Models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spatial models are imported from the same `~gammapy.modeling.models` namespace, let's start with a `GaussianSpatialModel`:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import GaussianSpatialModel" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GaussianSpatialModel\n", "\n", " name value unit min max frozen error \n", "----- ---------- ---- ---------- --------- ------ ---------\n", "lon_0 0.0000e+00 deg nan nan False 0.000e+00\n", "lat_0 0.0000e+00 deg -9.000e+01 9.000e+01 False 0.000e+00\n", "sigma 2.0000e-01 deg 0.000e+00 nan False 0.000e+00\n", " e 0.0000e+00 0.000e+00 1.000e+00 True 0.000e+00\n", " phi 0.0000e+00 deg nan nan True 0.000e+00\n" ] } ], "source": [ "gauss = GaussianSpatialModel(lon_0=\"0 deg\", lat_0=\"0 deg\", sigma=\"0.2 deg\")\n", "print(gauss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again you can check the `SPATIAL_MODELS` registry to see which models are available or take a look at the [model gallery](https://docs.gammapy.org/dev/modeling/gallery/index.html#spatial-models)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Registry\n", "--------\n", "\n", "ConstantSpatialModel : ['ConstantSpatialModel', 'const'] \n", "TemplateSpatialModel : ['TemplateSpatialModel', 'template'] \n", "DiskSpatialModel : ['DiskSpatialModel', 'disk'] \n", "GaussianSpatialModel : ['GaussianSpatialModel', 'gauss'] \n", "GeneralizedGaussianSpatialModel: ['GeneralizedGaussianSpatialModel', 'gauss-general'] \n", "PointSpatialModel : ['PointSpatialModel', 'point'] \n", "ShellSpatialModel : ['ShellSpatialModel', 'shell'] \n", "\n" ] } ], "source": [ "from gammapy.modeling.models import SPATIAL_MODEL_REGISTRY\n", "\n", "print(SPATIAL_MODEL_REGISTRY)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default coordinate frame for all spatial models is ``\"icrs\"``, but the frame can be modified using the\n", "``frame`` argument:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "gauss = GaussianSpatialModel(\n", " lon_0=\"0 deg\", lat_0=\"0 deg\", sigma=\"0.2 deg\", frame=\"galactic\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can specify any valid `astropy.coordinates` frame. The center position of the model can be retrieved as a `astropy.coordinates.SkyCoord` object using `SpatialModel.position`: " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(gauss.position)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spatial models can be evaluated again by calling the instance:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[13061.88470839 10172.60603928] 1 / sr\n" ] } ], "source": [ "lon = [0, 0.1] * u.deg\n", "lat = [0, 0.1] * u.deg\n", "\n", "flux_per_omega = gauss(lon, lat)\n", "print(flux_per_omega)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The returned quantity corresponds to a surface brightness. Spatial model\n", "can be also evaluated using `~gammapy.maps.Map` and `~gammapy.maps.Geom` objects:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "m = Map.create(skydir=(0, 0), width=(1, 1), binsz=0.02, frame=\"galactic\")\n", "m.quantity = gauss.evaluate_geom(m.geom)\n", "m.plot(add_cbar=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again for convenience the model can be plotted directly:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "gauss.plot(add_cbar=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All spatial models have an associated sky region to it e.g. to illustrate the extend of the model on a sky image. The returned object is an `regions.SkyRegion` object:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Region: EllipseSkyRegion\n", "center: \n", "width: 0.4 deg\n", "height: 0.4 deg\n", "angle: 0.0 deg\n" ] } ], "source": [ "print(gauss.to_region())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can plot the region on an sky image:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# create and plot the model\n", "gauss_elongated = GaussianSpatialModel(\n", " lon_0=\"0 deg\", lat_0=\"0 deg\", sigma=\"0.2 deg\", e=0.7, phi=\"45 deg\"\n", ")\n", "ax = gauss_elongated.plot(add_cbar=True)\n", "\n", "# add region illustration\n", "region = gauss_elongated.to_region()\n", "region_pix = region.to_pixel(ax.wcs)\n", "ax.add_artist(region_pix.as_artist());" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `.to_region()` method can also be useful to write e.g. ds9 region files using `write_ds9` from the `regions` package:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "from regions import write_ds9\n", "\n", "regions = [gauss.to_region(), gauss_elongated.to_region()]\n", "\n", "filename = \"regions.reg\"\n", "write_ds9(regions, filename, coordsys=\"galactic\", fmt=\".4f\", radunit=\"deg\")" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Region file format: DS9 astropy/regions\r\n", "galactic\r\n", "ellipse(0.0000,0.0000,0.2000,0.2000,0.0000)\r\n", "ellipse(96.3373,-60.1886,0.1428,0.2000,45.0000)\r\n" ] } ], "source": [ "!cat regions.reg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# SkyModel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `~gammapy.modeling.models.SkyModel` class combines a spectral and a spatial model. It can be created\n", "from existing spatial and spectral model components:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SkyModel\n", "\n", " Name : my-source\n", " Datasets names : None\n", " Spectral model type : PowerLawSpectralModel\n", " Spatial model type : GaussianSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " index : 2.200 \n", " amplitude : 2.70e-12 1 / (cm2 s TeV)\n", " reference (frozen) : 1.000 TeV \n", " lon_0 : 0.000 deg \n", " lat_0 : 0.000 deg \n", " sigma : 0.200 deg \n", " e (frozen) : 0.000 \n", " phi (frozen) : 0.000 deg \n", "\n", "\n" ] } ], "source": [ "from gammapy.modeling.models import SkyModel\n", "\n", "model = SkyModel(spectral_model=pwl, spatial_model=gauss, name=\"my-source\")\n", "print(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is good practice to specify a name for your sky model, so that you can access it later by name and have meaningful identifier you serilisation. If you don't define a name, a unique random name is generated:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "aNvy4ztk\n" ] } ], "source": [ "model_without_name = SkyModel(spectral_model=pwl, spatial_model=gauss)\n", "print(model_without_name.name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The spectral and spatial component of the source model can be accessed using `.spectral_model` and `.spatial_model`:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.spectral_model" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.spatial_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And can be used as you have seen already seen above:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEKCAYAAADq59mMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3hUdfr+8feTSg+9g1TpoQWRFtSlC6hgQ9eKoqwowu5a11127boLIosFVOyNIoKCFF0TuhQl9N577z2f3x8J+8uXDakzOTOT+3VdXGTOzJzckd25c9pzzDmHiIhIdoR5HUBERIKPykNERLJN5SEiItmm8hARkWxTeYiISLapPEREJNsivA6QF0qXLu2qVavmdQwRkaCyePHi/c65Muk9ly/Ko1q1aixatMjrGCIiQcXMtlzuOe22EhGRbFN5iIhItqk8REQk20K6PMysh5mNOnLkiNdRRERCSkiXh3NusnOuX0xMjNdRRERCSkiXh4iI+IfKIwMXkh3jF2/nQrLG1ouIpKXyyMD0Fbv549il9Hp7Lmt2H/M6johIwFB5ZKBLw/K82acp2w6epPuIWbwxcy1nzyd7HUtExHMqjwyYGT0bV2Tm4PZc36gCb8xcR48Rs1m67bDX0UREPKXyyIKShaN44/amvH9PHEdOneOmt+bw4vcrOXX2gtfRREQ8ofLIht/VK8f0wfH0uaoqo2dtosvwROZu2O91LBGRPKfyyKZiBSJ58aZGfPHg1Rhwx+gFPD0hiaOnz3kdTUQkz6g8cqhVzVJMHRjPQ/E1+GrhNjoOTWDmyj1exxIRyRMqj1woGBXO093qMfGRNpQoFMUDHy/i0S9+5cDxM15HExHxK5WHD8RWLs6kAW0Z3PFKfli+iw5DE/j2tx04p4sLRSQ0qTx8JCoijMd+V5vvH2vHFaUKM/DL3+j70SJ2Hj7ldTQREZ9TefjYleWKMr5/a57rXp95Gw7QaVginy3YQrJGnIhICFF5+EF4mNG3bXWmPR5P4yoxPPvNcvqMns+m/Se8jiYi4hMhXR5e38+jaqlCfNq3Ja/2bsTKXUfp8kYi7yZs4PwFjTgRkeBm+eGgblxcnFu0aJGnGfYcPc1fJi5nxso9xFaO4dXesdSrUMzTTCIiGTGzxc65uPSeC+ktj0BSrlgBRt3VnJF3NGPn4VP0GDGbodPXcOa8RpyISPBReeQhM+P62ArMGNSeno0r8uZP67n+zdks2XrI62giItmi8vBAicJRDL2tCWPua8HJM+fp/fZc/jF5JSfPnvc6mohIlqg8PHRtnbJMGxTP71tewQdzNtH5jUTmrNegRREJfCoPjxUtEMnzNzbkq35XExkWxp3vLeDJcUkcOaVBiyISuFQeAaJljVJMGdiO/tfUZNyS7XQcmsC0Fbu9jiUiki6VRwApEBnOk13qMvEPbShVJJqHPlnMI58tYd8xDVoUkcCi8ghAjSrHMGlAG/7cuQ4zVu6h47AEJizZrkGLIhIwVB4BKjI8jEeurcWUgW2pUbowg79eyn0fLmSHBi2KSABQeQS4WmWLMvbh1gzpUZ9fNh2k09AEPpm3WYMWRcRTKo8gEB5m3NsmZdBisytK8Ny3K7h91Hw27jvudTQRyadUHkGkSslCfHz/Vbx+cyyrdx+ly/BZvP2zBi2KSN5TeQQZM+OWuCrMHNyea+uU4dUfVnPjW3NYsdObycEikj+pPIJU2WIFePeuON6+sxm7j5yh57/n8Pq01Zw+p0GLIuJ/Ko8g17VRBWYOjufGJpUY+Z8NXP/mLBZvOeh1LBEJcSqPEFC8UBT/urUxH99/FafPJXPzO/MYMmkFJ85o0KKI+IfKI4TEX1mG6YPiuadVNT6at5lOwxJJXLvP61giEoJUHiGmcHQEQ3o2YOxDrYiODOPuD37hT2OXcvjkWa+jiUgIUXmEqLhqJZnyWDseubYm3/y6gw5DE5m6bJfXsUQkRKg8QliByHD+3Lkukwa0oVyxaPp/toSHP1nM3qOnvY4mIkFO5ZEPNKgYw7ePtOGJLnX4ac1eOgxNYOyibRq0KCI5pvLIJyLCw/jDNbWYOrAddcoX5c/jkrj7g1/YdvCk19FEJAgFfHmYWQ0ze9/MxqVZdqOZjTazb82sk5f5gk3NMkX4ql8r/nFDA5ZsOUTnNxL5cM4mDVoUkWzxa3mY2QdmttfMll+yvIuZrTGz9Wb2VEbrcM5tdM71vWTZROfcg8C9wG0+Dx7iwsKMu1tVY9qgeFpUK8mQySu55d15rN97zOtoIhIk/L3l8SHQJe0CMwsHRgJdgfpAHzOrb2aNzOy7S/6UzWT9f0ldl+RA5RKF+PC+FvzrlsZs2HecbsNnM/I/6zmnQYsikokIf67cOZdoZtUuWXwVsN45txHAzL4EbnDOvQx0z8p6zcyAV4Cpzrkll3lNP6AfQNWqVXOUPz8wM3o3r0z8lWUYMnkFr09bw3dJu3j95lgaVorxOp6IBCgvjnlUAralebw9dVm6zKyUmb0DNDWzp1MXPwp0AG42s4fTe59zbpRzLs45F1emTBkfRQ9dZYpGM/KOZrx7V3MOHD/DDSPn8MpUDVoUkfT5dcvjMiydZZc9WuucOwA8fMmyN4E3fZxLgM4NynN19VK8NGUV7yRsYPqK3bzSO5arqpf0OpqIBBAvtjy2A1XSPK4M7PQgh1xGTKFIXr05lk/7tuRccjK3vjuP5yYu57gGLYpIKi/KYyFQ28yqm1kUcDswyR/fyMx6mNmoI0d0o6ScaFu7NNMej+e+NtX4dMEWOg1N4D9r9nodS0QCgL9P1f0CmAfUMbPtZtbXOXceGABMA1YBXzvnVvjj+zvnJjvn+sXE6MBvThWKiuBvPRow7uHWFIqO4L4xCxn81W8cOqFBiyL5meWHERVxcXFu0aJFXscIemfOX2DkT+t56+cNFC8Uyd97NqRbo/KknPwmIqHGzBY75+LSey7grzCXwBEdEc7gTnWY/GhbKsQU5JHPl/Dwpxq0KJIfqTwk2+pVKMY3f2jN013r8vOafXQYmsDXCzVoUSQ/yXC3lZll5fzMZOfcYd9F8h0z6wH0qFWr1oPr1q3zOk5I2rT/BE+OT+KXTQdpW6s0L93UiKqlCnkdS0R8IKPdVpmVx2lSTqPNaKd2uHMuoC/h1jEP/0pOdnz+y1ZembqaC8mOP3Wuw72tqxEepmMhIsEso/LI7CLBVc65ppms/NccJ5OQEBZm/P7qK7iublme/WYZz3+3ku+TdvJq71hqlyvqdTwR8YPMjnm0ysI6svIayQcqFi/IB/e24I3bmrBp/wmuf3M2I35cp0GLIiEow/Jwzv33NBozK2FmDVLvrxGW3mtEzIwbm1ZixuD2dGpQjn/NWEuPEbNJ2h6Qh8VEJIcyLA8zizGzZ8xsGTAfeBf4GthiZmPN7Nq8CJlTusLcO6WLRPPvO5ox+u44Dp08y40j5/DylFUatCgSIjI7YD4D+BiYfOkZVWbWHLgLWOace9+vKXNJB8y9deTUOV6esoovF26jWqlCvNI7lqtrlPI6lohkIsdnW4UKlUdgmLt+P09NWMbWgye5s2VVnupal6IFIr2OJSKXkeMrzM1spZk9a2Y1/RNN8pPWtVIGLT7Qtjpf/LKVTsMS+Wn1Hq9jiUgOZHa2VR+gCDDdzBaY2eNmVjEPckmIKhgVzl+612d8/9YULRDB/R8uYuCXv3JQgxZFgkpmZ1stdc497ZyrCQwErgDmm9lPZvZgniSUkNS0agm+e7QdA39XmynLdtFhaAKTlu7UiBORIJHtYx5mdg0wDKjvnIv2Ryhf0XiS4LB691GeHJfE0u1H6FCvHC/c2JDyMQW8jiWS7+X6gLmZtSBlF1ZvYDPwJTDWObffhzn9RgfMA9+FZMcHszfxrxlriAwL45nr63F7iyoa9y7iodwcMH/JzDYAb5My46qNc669c+7tYCkOCQ7hYcaD8TX4YWA8DSoV4+kJy7hj9AK2HDjhdTQRSUdmB8zPAF2dc3HOuX8657bnRSjJv6qVLswXD17NSzc1YvmOI3R+I5H3Zm3kQrKOhYgEkswOmP/dObfWzAqZ2XNmNhrAzGqbWfe8iSj5jZlxR8uqzBjcnra1SvPC96vo9fZc1uw+5nU0EUmV1ZtBjSFlK+TiEMTtwAt+SSSSqnxMAUbfHcebfZqy/eBJuo+YxRsz13L2vAYtingtq+VR0zn3GnAOwDl3iozv8SHiE2ZGz8YVmTG4Pd0aVeCNmevoPmIWv23ToEURL2W1PM6aWUHAAaRecX7Gb6l8RIMRQ0fJwlEMv70pH9wbx7HT5+n11hxe/H4lp85q0KKIFzI722p66pdDgB+AKmb2GfAj8IR/o+Wec26yc65fTEyM11HER66rW47pg+Lpc1VVRs/aROc3Epm7QSf+ieS1zLY8ygA456YDvYB7gS+AOOfcz35NJnIZRQtE8uJNjfiy39WEGdwxegFPT0jiyKlzXkcTyTcyK48YM+tlZr2A9kA0EAXEpy4T8czVNUoxdWA8D8XX4KuF2+g0LIEZKzVoUSQvZHY/jwPAt6R/cNw55+73VzBf0hXmoW/ptsM8OT6J1buP0T22AkN6NqB0kYCeniMS8HI8nsTMljjnmvktWR5ReeQPZ88n807CBkb8tI4i0RH8rUcDbmhSUSNORHIox+NJ0Om4EkSiIsJ47He1+f6xdlQrXZjHv/qNvh8tYufhU15HEwk5mZXHXXmSQsSHrixXlHEPt+av3eszb8MBOg1L5NP5W0jWiBMRn8lsPMnyvAoi4kvhYcb9baszfVA8TaoU5y8Tl9Nn9Hw27degRRFfyOpFgkFJFwlKlZKF+KTvVbzWO5aVu47S5Y1E3k3YwPkLGnEikhs5uRlUCaCKcy7JP5F8TwfMBWDP0dM8N3E501fuoVGlGF67OZZ6FYp5HUskYOXmgPnFFfxsZsXMrCSwFBhjZkN9GVLE38oVK8C7dzVn5B3N2HXkFD1GzGbo9DWcOa8RJyLZldXdVjHOuaOkXGU+xjnXHOjgv1gi/mFmXB9bgRmD2tOzSUXe/Gk91785m8VbDnkdTSSoZLU8IsysAnAr8J0f84jkiRKFoxh6axPG3NeCk2fOc/M7c/nH5JWcPHve62giQSGr5fEPYBqw3jm30MxqAOv8F0skb1xbpyzTB7fnrquv4IM5m+g0LJHZ6zRoUSQz2T5gHox0wFyy4pdNB3lqfBIb95/g1rjKPNutPjGFIr2OJeKZXB8wF8kPrqpekikD29H/mpqMX7KDDsMS+GH5bq9jiQQklYdIGgUiw3myS12+faQNZYpE8/Cni3nksyXsOxbw9z4TyVMqD5F0NKwUw7cD2vDnznWYsXIPHYclMH7xdvLDbl6RrMi0PMysrpn9zsyKXLK8i/9iiXgvMjyMR66txZSB7ahZpgh/HLuUe8csZIcGLYpkehvax0i5n8ejwHIzuyHN0y/5M5gvaDyJ+EKtskX4+qFWDOlRn4WbD9JpaAIfz9usQYuSr2V2P49lQCvn3HEzqwaMAz5xzg03s1+dc03zJmbu6Gwr8ZVtB0/yzDfLmLVuPy2qleCV3rHULFMk8zeKBKHcnG0V7pw7DuCc2wxcA3RNHU2ie31IvlOlZCE+vv8qXr85ljW7j9F1+Cze+nk95zRoUfKZzMpjt5k1ufggtUi6A6WBRv4MJhKozIxb4qow84/tua5OWV77YQ03jpzD8h3aPSr5R2blcTfwf050d86dd87dDcT7LZVIEChbtADv3NWct+9sxp6jZ7hh5Bxe+2E1p89p0KKEvoiMnnTObb/49cVR7Gneo1NORICujSrQqmYpXvh+FW/9vIEfVuzmtd6xxFUr6XU0Eb/J0ngSM3seuBfYAFx8g3POXee/aL6jA+aSVxLW7uOZCcvYeeQU97Sqxp8716FwdIa/o4kErIwOmGe1PNYAjZxzZ30dLi+oPCQvnThzntenreGjeZupGFOQl3s1Iv7KMl7HEsk2X8y2Wg4U910kkdBVODqCIT0bMPahVkRHhnH3B7/wp7FLOXwyKH/3EklXVrc84ki5WHA58N8hP865nv6L5jva8hCvnD53gRE/reOdhI2UKBTF8zc0oGujCl7HEskSX+y2WgG8CywD/ntCu3MuwVch/UnlIV5bsfMIT45PYvmOo3RpUJ5/3NCAssUKeB1LJEO+KI8E51x7nyfLIyoPCQTnLyQzetYmhs1cS4GIMJ7rXp+bm1fGTNfbSmDyxTGPxWb2spm1MrNmF//4MKNIyIsID6P/NTWZOrAddcoX5c/jkrj7g1/YdvCk19FEsi2rWx7/SWexTtUVyaHkZMdnC7bwytTVOOCJznW4u1U1wsK0FSKBI9e7rYKdykMC1Y7Dp3hmwjIS1u6j+RUleLV3I2qVLep1LBHAB7utzOwlMyue5nEJM3vBVwFF8qtKxQvy4X0tGHprYzbsO0634bMZ+R8NWpTAl9VjHl2dc4cvPnDOHQK6+SeS7+h+HhIMzIxezSozY1B7OjYox+vT1tDz3xq0KIEtq+URbmbRFx+YWUEgOoPXBwTn3GTnXL+YmBivo4hkqkzRaEbe0Yx372rO/uMpgxZfmapBixKYsloenwI/mllfM7sfmAF85L9YIvlX5wblmTmoPTc3q8w7CRvoNnwWv2w66HUskf8jywfMU+9Z3oGUm0BNd85N82cwX9IBcwlWc9bv56kJSWw7eIq7rr6CJ7vWpYgGLUoeyfHZVmZmLpN2ycprvKbykGB28ux5/jltLWPmbqJCsQK82KsR19Yp63UsyQdyc7bVf8zsUTOreskKo8zsOjP7CLjHV0FF5H8Viorgrz3qM75/awpFR3DfmIUM+uo3Dp7QoEXxTmbl0QW4AHxhZjvNbKWZbQLWAX2AYc65D/2cUUSAZlVL8P1jbXnsulpMXrqTjkMT+C5pJwG+4S8hKjvHPCJJuXf5qbSn7QYD7baSULNq11GeHJ9E0vYjdKpfjudvbEg5DVoUH/PFbCucc+ecc7uCrThEQlG9CsWY0L81z3SrS8LafXQYmsBXC7dqK0TyTJbLQ0QCS0R4GP3iazLt8XjqVyjGk+OX8fv3F7D1gAYtiv+pPESCXLXShfniwat58aaGLN12hM5vJPL+7E1cSNZWiPhPhuVhZtPMbJCZ1c2rQCKSfWFhxp0tr2DG4Hha1SzF89+t5OZ35rJuzzGvo0mIymzL4x7gEDDEzJaY2dtmdoOZFcmDbCKSTRViCvL+PXEMv70Jm/efoNubsxg+cx1nz2vQovhWds62CgNaAl2B3wGnSLnS/DX/xfMNnW0l+dGB42cYMnklk5fupG75orzaO5bGVYpn/kaRVL462yrZOTfPOfdX51wb4HZgh69CiohvlSoSzYg+TRl9dxyHTp7lprfm8PKUVZw6q0GLkns5PmDunNvvnPvMl2FExPc61i/HjMHtua1FFd5N3EjX4YnM33jA61gS5HS2lUg+UKxAJC/3iuXzB1qS7OD2UfN55ptlHD19zutoEqRUHiL5SOtapZn2eDwPtqvOl79spdPQRH5avcfrWBKEclweZnafL4OISN4oGBXOs9fXZ8If2hBTMJL7P1zEwC9/5cDxM15HkyCSmy2Pv/sshYjkuSZVijP50bY83qE2U5btouOwRCYt1aBFyZrM7ueRdLmngCudcwF/K1rQqboimVmz+xhPjE9i6bbDdKhXludvbEiFmIJexxKP5eZmUHuAzqRcKPh/ngLmOucq+iylH6k8RDJ3IdkxZs4m/jl9DZFhYTzdrR63t6hCWJh5HU08kpvrPL4DijjntlzyZzPws49zioiHwsOMB9rVYNrj8TSsFMMz3yzjjvfms3n/Ca+jSQDK8hXmwUxbHiLZ45zjy4XbeOn7VZxLTuaPHetwX5tqRITrBM38xCdXmHvFzGqY2ftmNi7Nsnpm9o6ZjTOz/l7mEwlFZkafq6oyY3B72tYqzYtTVtH77bms3n3U62gSIDKbqrsksxVk9Boz+8DM9prZ8kuWdzGzNWa23syeymj9zrmNzrm+lyxb5Zx7GLgVSLcVRST3yscUYPTdcbzZpynbD52ix4jZDJuxVoMWhYhMnq+XwRlXkHLgPCaD5z8E/g18/N83mIUDI4GOwHZgoZlNAsKBly95//3Oub3pfmOznsBTqesXET8xM3o2rkjbWqX5x+QVDP9xHVOX7+K1mxvTRIMW863Mzra6IgvruOCc257BOqoB3znnGqY+bgUMcc51Tn38NIBz7tLiuHQ945xzN6ez/Hvn3PXpLO8H9AOoWrVq8y1btmThRxGRzPy0eg/PfrOcPUdPc3+b6gzudCWFojL7PVSCUUbHPDL8F3fO+eMTtxKwLc3j7aSMek+XmZUCXgSamtnTzrmXzewaoBcQDUxJ733OuVHAKEg5YO6b6CJyXd1yTB9Uklemrua92ZuYvnIPr/RqROtapb2OJnnIi18X0jtp/LIf7s65A8DDlyz7GZ0qLOKZogUiefGmRvRoXJGnxidxx3sLuL1FFZ7uVo+YgpFex5M84MXZVtuBKmkeVwZ2epBDRHLp6hql+OHxeB5qX4OvF22j07AEpq/Y7XUsyQNZKg8zq5/Osmty+D0XArXNrLqZRZFyU6lJOVxXhsysh5mNOnLkiD9WLyJAgchwnu5aj4mPtKFEoSj6fbKYAZ8vYb8GLYa0rG55fG1mT1qKgmY2gv89M+p/mNkXwDygjpltN7O+zrnzwABgGrAK+No5tyKnP0BGnHOTnXP9YmIyOiFMRHwhtnJxJg1oyx87Xsn0FXvoODSBib/u0KDFEJWlK8zNrDDwKtAcKAp8BrzqnAuKk711hblI3lq3J2XQ4q9bD3Nd3bK8cGNDKhbXoMVg44srzM8Bp4CCQAFgU7AUh4jkvdrlijLu4db8tXt95m04QKdhiXw6fwvJydoKCRVZLY+FpJRHC6At0CftuBARkUuFhxn3t63O9EHxNKlSnL9MXM7to+ezSYMWQ0JWd1vFOecWXbLsLufcJ35L5gNm1gPoUatWrQfXrVvndRyRfMs5x9jF23nhu5WcOZ/MoI5X8kDb6hq0GOByfD+PNCuomt5y59zWXGbLEzrmIRIY9h49zXPfLmfaij00qhTDq71jqV+xmNex5DJ8UR7LSLmQz0g55lEdWOOca+DLoP6i8hAJHM45pizbzd8mLefwyXP0v6YmA66rRXREuNfR5BK5PmDunGvknItN/bs2cBUw25chRSR/MDOuj63AjEHt6dm4IiN+Ws/1b85m8ZZLb1gqgSxHOxydc0tIOXguIpIjJQpHMfS2Joy5rwUnz5zn5nfm8vfJKzh59rzX0SQLsrrbanCah2FAM6DUxcm4gUoHzEWCw/Ez53l16mo+mb+FyiUK8kqvWNrW1qBFr/niOo+iaf5EA98DN/gmnv/oCnOR4FAkOoLnb2zI1w+1Iio8jN+/v4Anxi3lyKlzXkeTy9A9zEUkoJw+d4HhP65jVOJGShWO4vkbG9K5QXmvY+VLOT7byswmk/G49J65j+d/Kg+R4LN8xxGeGJfEyl1Hub5RBYb0bECZotFex8pXcnwzKOCffsgjIpKphpVi+HZAG0YlbmT4zHXMXr+f57rXp3ezSpild1sgyUuZbXlUDZYLATOiLQ+R4LZ+73GeHJ/E4i2HiL+yDC/d1JDKJQp5HSvk5eaA+cQ0Kxnv01R5QPfzEAkNtcoWYexDrRjSoz6LNh+k07BEPpq7WYMWPZRZeaTdNqzhzyD+oLOtREJHWJhxb5vqTHs8nuZXlOBvk1Zw67vz2LDvuNfR8qXMysNd5msREU9UKVmIj++/itdvjmXd3uN0HT6Lt35ez7kLuktEXsqsPBqb2VEzOwbEpn591MyOmdnRvAgoInIpM+OWuCrMGBxPh3plee2HNdw4cg7Ld2gXdV7JsDycc+HOuWLOuaLOuYjUry8+1ihMEfFU2aIFeOvO5rzz+2bsPXaGG0bO4bUfVnP63AWvo4U8DdMXkaDXpWEFZg5qT6+mlXjr5w10e3MWizYf9DpWSFN5iEhIiCkUyeu3NOaTvldx5lwyt7w7j799u5zjZzRo0R9Cujx0qq5I/tOudhmmD4rnnlbV+Hj+FjoPSyRh7T6vY4UczbYSkZC1eMtBnhiXxIZ9J+jdrDLPda9H8UJRXscKGr6YqisiEnSaX1GS7x9rx4BrazHxtx10GJrI1GW7vI4VElQeIhLSCkSG86fOdZg0oA3lY6Lp/9kSHv5kMXuPnvY6WlBTeYhIvtCgYgwT/9CGJ7vU5ac1e+kwNIGvF20jP+y69weVh4jkGxHhYfS/piY/DGxH3fLFeGJcEnd/8AvbDp70OlrQUXmISL5To0wRvux3Nc/f0IAlWw7RaVgiY+Zs4oIGLWaZykNE8qWwMOOuVtWYPrg9LWuU5O+TV3LLO3NZv/eY19GCgspDRPK1SsULMubeFgy7rTEb95+g2/DZ/PundRq0mImQLg9dJCgiWWFm3NS0MjMHt6djg3L8c/paeoyYzbLt+uy4HF0kKCJyiWkrdvPcxOUcOHGWB9vV4PEOtSkQGe51rDyniwRFRLKhc4PyzBjcnluaV+adhA10HT6LBRsPeB0roKg8RETSEVMwkld6x/LZAy05n5zMbaPm89zE5Rw7fc7raAFB5SEikoE2tUoz7fF4+ratzqcLUgYt/mfNXq9jeU7lISKSiUJRETzXvT7j+7emcHQE941ZyOCvfuPQibNeR/OMykNEJIuaVS3Bd4+15bHrajFp6U46DE3gu6Sd+XLEicpDRCQboiPCGdypDpMfbUulEgUZ8Pmv9PtkMXvy2aBFlYeISA7Uq1CMCf1b82y3eiSu3UeHoQl8+cvWfLMVovIQEcmhiPAwHoyvwbTH42lQsRhPTVjGne8tYOuB0B+0qPIQEcmlaqUL8/kDV/PSTY1I2n6ETm8k8N6sjSE9aDGky0PjSUQkr4SFGXe0rMqMwfG0rlmaF75fRe+357J2T2gOWtR4EhERH3POMWnpTv4+eSXHTp9jwLW16X9NTaIiguv3dY0nERHJQ2bGDU0qMWNQPF0aVmDYzLX0/Pdslm477HU0n1F5iIj4Saki0Yzo05T37o7j8Mlz3PTWHDYQiKkAAAe2SURBVF6asopTZy94HS3XVB4iIn7WoX45pg+O57YWVRiVuJEuwxOZtyG4By2qPERE8kCxApG83CuWzx9sCUCf0fN5esIyjgbpoEWVh4hIHmpdszQ/DIynX3wNvlq4lU5DE/lx1R6vY2WbykNEJI8VjArnmW71mPCHNsQUjKTvR4t47ItfOXD8jNfRskzlISLikSZVijP50bYM6nAlU5fvouOwRL79bUdQjDhReYiIeCgqIoyBHWrz3aPtqFKyEAO//I0HPlrEriOnvI6WIZWHiEgAqFO+KBP6t+Yv19djzob9dBqayOcLtpIcoCNOVB4iIgEiPMx4oF3KoMWGlWJ45ptl3PHefDbvP+F1tP+h8hARCTBXlCrM5w+25JVejVix4yhdhicyOjGwBi2qPEREApCZcftVVZkxuD1ta5XhxSmr6PXWHFbvPup1NEDlISIS0MrHFGD03c0Z0acp2w+doseI2QybsZYz570dcaLyEBEJcGZGj8YVmTG4Pd1jKzL8x3X0GDGbX7ce8ixTSJeH7uchIqGkZOEoht3WhDH3tuDY6fP0ensuz3+3kpNnz+d5Ft3PQ0QkCB07fY5Xf1jNp/O3UrVkIV7p1YjWtUr79Hvofh4iIiGmaIFIXrixEV/1u5rwMOOO9xbw1PgkjpzKm0GLKg8RkSDWskYppg5sx0Pta/D1om10HJrA9BW7/f59VR4iIkGuQGQ4T3etx8RH2lCycBT9PlnMgM+XsN+PgxZVHiIiISK2csqgxT92vJLpK/bQYWgC3/62wy/fS+UhIhJCIsPDePR3tfn+sbbUKF2YTX4abRLhl7WKiIinapcrytiHW5PspzNqVR4iIiEqPMwIx/yybu22EhGRbFN5iIhItqk8REQk21QeIiKSbSoPERHJNpWHiIhkm8pDRESyLV+MZDezfcAWIAbI7s09SgP7fR5KLicn/0bBIFB/Li9y+ft7+mP9vlhnbteR0/fn5jPsCudcmfSeyBflcZGZjXLO9cvmexZdbp69+F5O/o2CQaD+XF7k8vf39Mf6fbHO3K4jp+/312dYftttNdnrAJKpUP03CtSfy4tc/v6e/li/L9aZ23UE1P+G8tWWR05oy0NEgpm2PLwzyusAIiK54JfPMG15iIhItmnLQ0REsk3lISIi2abyEBGRbFN5ZJOZFTazj8xstJnd6XUeEZHsMLMaZva+mY3LzXpUHoCZfWBme81s+SXLu5jZGjNbb2ZPpS7uBYxzzj0I9MzzsCIil8jOZ5hzbqNzrm9uv6fKI8WHQJe0C8wsHBgJdAXqA33MrD5QGdiW+rILeZhRRORyPiTrn2E+ofIAnHOJwMFLFl8FrE9t6bPAl8ANwHZSCgT0309EAkA2P8N8Qh9+l1eJ/7+FASmlUQmYAPQ2s7cJsHEBIiJppPsZZmalzOwdoKmZPZ3TlUfkNl0Is3SWOefcCeC+vA4jIpJNl/sMOwA8nNuVa8vj8rYDVdI8rgzs9CiLiEh2+fUzTOVxeQuB2mZW3cyigNuBSR5nEhHJKr9+hqk8ADP7ApgH1DGz7WbW1zl3HhgATANWAV8751Z4mVNEJD1efIZpMKKIiGSbtjxERCTbVB4iIpJtKg8REck2lYeIiGSbykNERLJN5SEiItmm8hABzOyCmf2W5s9Tmb/L/9LkqmhmC1K/3mpm+9JkrXbJe64xs3mXLIswsz1mVsHMXjez3Wb2p7z8WSS0aLaVSIpTzrkmvlyhmUWkXqiVG2lztUxd771AnHNuwGXekwhUNrNqzrnNqcs6AMudc7uAP5vZiVzmknxOWx4iGTCzzWb2dzNbYmbLzKxu6vLCqTfgWWhmv5rZDanL7zWzsWY2GZhuZoXM7GszSzKzr1K3HuLMrK+ZDUvzfR40s6E5yFfTzH4ws8VmNsvM6jrnkoGxwG1pXno78EWu/mOIpKHyEElR8JLdVmk/ePc755oBbwMXd/U8C/zknGsBXAu8bmaFU59rBdzjnLsO+ANwyDkXCzwPNE99zZdATzOLTH18HzAmB7lHAY8655qnZnsrdfkXpBQGZhYNdAPG52D9IunSbiuRFBnttpqQ+vdiUm5DDNCJlA//i2VSAKia+vUM59zFG/O0BYYDOOeWm1lS6tcnzOwnoLuZrQIinXPLshPYzIoArYGxZv+dvh2duv6FZlbEzOoA9YD5zrlD2Vm/SEZUHiKZO5P69wX+//9nDOjtnFuT9oVm1hJIezwhvXsqXPQe8AywmpxtdYQBhzMovS9J2fqoh3ZZiY9pt5VIzkwDHrXUX/nNrOllXjcbuDX1NfWBRhefcM4tIOV+C3eQgw9359xRYJOZ3ZK6fjOzxmle8gXwe+A6dDsB8TGVh0iKS495vJLJ658HIoEkM1ue+jg9bwFlUndXPQkkAUfSPP81MCcXu5TuBPqa2VJgBWnuUe2cWwmcJOXYjM6uEp/SSHYRPzKzcFKOZ5w2s5rAj8CVzrmzqc9/Bwxzzv14mfcfd84V8UOuIcBx59w/fb1uyR+05SHiX4WA2albBt8A/Z1zZ82suJmtJeVAfbrFkeroxYsEfRXIzF4nZXeWtkYkx7TlISIi2aYtDxERyTaVh4iIZJvKQ0REsk3lISIi2abyEBGRbFN5iIhItv0/e81f5pWqWEwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.spectral_model.plot(energy_range=[1, 10] * u.TeV);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In some cases (e.g. when doing a spectral analysis) there is only a spectral model associated with the source. So the spatial model is optional:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SkyModel\n", "\n", " Name : source-spectrum\n", " Datasets names : None\n", " Spectral model type : PowerLawSpectralModel\n", " Spatial model type : \n", " Temporal model type : \n", " Parameters:\n", " index : 2.200 \n", " amplitude : 2.70e-12 1 / (cm2 s TeV)\n", " reference (frozen) : 1.000 TeV \n", "\n", "\n" ] } ], "source": [ "model_spectrum = SkyModel(spectral_model=pwl, name=\"source-spectrum\")\n", "print(model_spectrum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additionally the spatial model of `~gammapy.modeling.models.SkyModel` can be used to represent source models based on templates, where the spatial and energy axes are correlated. It can be created e.g. from an existing FITS file:\n", "\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import TemplateSpatialModel\n", "from gammapy.modeling.models import PowerLawNormSpectralModel" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SkyModel\n", "\n", " Name : etme4kaE\n", " Datasets names : None\n", " Spectral model type : PowerLawNormSpectralModel\n", " Spatial model type : TemplateSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " norm : 1.000 \n", " tilt (frozen) : 0.000 \n", " reference (frozen) : 1.000 TeV \n", "\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: FITSFixedWarning: 'datfix' made the change 'Set DATE-REF to '1858-11-17' from MJD-REF'. [astropy.wcs.wcs]\n" ] } ], "source": [ "diffuse_cube = TemplateSpatialModel.read(\n", " \"$GAMMAPY_DATA/fermi-3fhl-gc/gll_iem_v06_gc.fits.gz\", normalize=False\n", ")\n", "diffuse = SkyModel(PowerLawNormSpectralModel(), diffuse_cube)\n", "print(diffuse)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that if the spatial model is not normalized over the sky it has to be combined with a normalized spectral model, for example `~gammapy.modeling.models.PowerLawNormSpectralModel`. This is the only case in `gammapy.models.SkyModel` where the unit is fully attached to the spatial model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model Lists and Serialisation\n", "\n", "In a typical analysis scenario a model consists of mutiple model components, or a \"catalog\" or \"source library\". To handle this list of multiple model components, Gammapy has a `Models` class:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import Models" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Models\n", "\n", "Component 0: SkyModel\n", "\n", " Name : my-source\n", " Datasets names : None\n", " Spectral model type : PowerLawSpectralModel\n", " Spatial model type : GaussianSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " index : 2.200 \n", " amplitude : 2.70e-12 1 / (cm2 s TeV)\n", " reference (frozen) : 1.000 TeV \n", " lon_0 : 0.000 deg \n", " lat_0 : 0.000 deg \n", " sigma : 0.200 deg \n", " e (frozen) : 0.000 \n", " phi (frozen) : 0.000 deg \n", "\n", "Component 1: SkyModel\n", "\n", " Name : etme4kaE\n", " Datasets names : None\n", " Spectral model type : PowerLawNormSpectralModel\n", " Spatial model type : TemplateSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " norm : 1.000 \n", " tilt (frozen) : 0.000 \n", " reference (frozen) : 1.000 TeV \n", "\n", "\n" ] } ], "source": [ "models = Models([model, diffuse])\n", "print(models)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Individual model components in the list can be accessed by their name:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SkyModel\n", "\n", " Name : my-source\n", " Datasets names : None\n", " Spectral model type : PowerLawSpectralModel\n", " Spatial model type : GaussianSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " index : 2.200 \n", " amplitude : 2.70e-12 1 / (cm2 s TeV)\n", " reference (frozen) : 1.000 TeV \n", " lon_0 : 0.000 deg \n", " lat_0 : 0.000 deg \n", " sigma : 0.200 deg \n", " e (frozen) : 0.000 \n", " phi (frozen) : 0.000 deg \n", "\n", "\n" ] } ], "source": [ "print(models[\"my-source\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note:**To make the access by name unambiguous, models are required to have a unique name, otherwise an error will be thrown.\n", "\n", "To see which models are available you can use the `.names` attribute:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['my-source', 'etme4kaE']\n" ] } ], "source": [ "print(models.names)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that a `SkyModel` object can be evaluated for a given longitude, latitude, and energy, but the `Models` object cannot. This `Models` container object will be assigned to `Dataset` or `Datasets` together with the data to be fitted as explained in other analysis tutorials (see for example the [modeling](modeling.ipynb) notebook).\n", "\n", "The `Models` class also has in place `.append()` and `.extend()` methods:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "model_copy = model.copy(name=\"my-source-copy\")\n", "models.append(model_copy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This list of models can be also serialised to a custom YAML based format: " ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "components:\n", "- name: my-source\n", " type: SkyModel\n", " spectral:\n", " type: PowerLawSpectralModel\n", " parameters:\n", " - name: index\n", " value: 2.2\n", " - name: amplitude\n", " value: 2.7e-12\n", " unit: cm-2 s-1 TeV-1\n", " - name: reference\n", " value: 1.0\n", " unit: TeV\n", " frozen: true\n", " spatial:\n", " type: GaussianSpatialModel\n", " frame: galactic\n", " parameters:\n", " - name: lon_0\n", " value: 0.0\n", " unit: deg\n", " - name: lat_0\n", " value: 0.0\n", " unit: deg\n", " - name: sigma\n", " value: 0.2\n", " unit: deg\n", " - name: e\n", " value: 0.0\n", " frozen: true\n", " - name: phi\n", " value: 0.0\n", " unit: deg\n", " frozen: true\n", "- name: etme4kaE\n", " type: SkyModel\n", " spectral:\n", " type: PowerLawNormSpectralModel\n", " parameters:\n", " - name: norm\n", " value: 1.0\n", " - name: tilt\n", " value: 0.0\n", " frozen: true\n", " - name: reference\n", " value: 1.0\n", " unit: TeV\n", " frozen: true\n", " spatial:\n", " type: TemplateSpatialModel\n", " frame: galactic\n", " parameters: []\n", " filename: /Users/adonath/Desktop/gammapy-tutorials/datasets/fermi-3fhl-gc/gll_iem_v06_gc.fits.gz\n", " normalize: false\n", " unit: 1 / (cm2 MeV s sr)\n", "- name: my-source-copy\n", " type: SkyModel\n", " spectral:\n", " type: PowerLawSpectralModel\n", " parameters:\n", " - name: index\n", " value: 2.2\n", " - name: amplitude\n", " value: 2.7e-12\n", " unit: cm-2 s-1 TeV-1\n", " - name: reference\n", " value: 1.0\n", " unit: TeV\n", " frozen: true\n", " spatial:\n", " type: GaussianSpatialModel\n", " frame: galactic\n", " parameters:\n", " - name: lon_0\n", " value: 0.0\n", " unit: deg\n", " - name: lat_0\n", " value: 0.0\n", " unit: deg\n", " - name: sigma\n", " value: 0.2\n", " unit: deg\n", " - name: e\n", " value: 0.0\n", " frozen: true\n", " - name: phi\n", " value: 0.0\n", " unit: deg\n", " frozen: true\n", "\n" ] } ], "source": [ "models_yaml = models.to_yaml()\n", "print(models_yaml)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The structure of the yaml files follows the structure of the python objects.\n", "The `components` listed correspond to the `SkyModel` and `SkyDiffuseCube` components of the `Models`. \n", "For each `SkyModel` we have informations about its `name`, `type` (corresponding to the tag attribute) and sub-mobels (i.e `spectral` model and eventually `spatial` model). Then the spatial and spectral models are defiend by their type and parameters. The `parameters` keys name/value/unit are mandatory, while the keys min/max/frozen are optionnals (so you can prepare shorter files).\n", "\n", "If you want to write this list of models to disk and read it back later you can use:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "models.write(\"models.yaml\", overwrite=True)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: FITSFixedWarning: 'datfix' made the change 'Set DATE-REF to '1858-11-17' from MJD-REF'. [astropy.wcs.wcs]\n" ] } ], "source": [ "models_read = Models.read(\"models.yaml\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additionally the models can exported and imported togeter with the data using the `Datasets.read()` and `Datasets.write()` methods as shown in the [analysis_mwl](analysis_mwl.ipynb) notebook." ] }, { "cell_type": "markdown", "metadata": { "jupyter": { "outputs_hidden": false } }, "source": [ "# Implementing a Custom Model\n", "\n", "In order to add a user defined spectral model you have to create a SpectralModel subclass.\n", "This new model class should include:\n", "\n", "- a tag used for serialization (it can be the same as the class name)\n", "- an instantiation of each Parameter with their unit, default values and frozen status\n", "- the evaluate function where the mathematical expression for the model is defined.\n", "\n", "As an example we will use a PowerLawSpectralModel plus a Gaussian (with fixed width).\n", "First we define the new custom model class that we name `MyCustomSpectralModel`:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import SpectralModel, Parameter\n", "\n", "\n", "class MyCustomSpectralModel(SpectralModel):\n", " \"\"\"My custom spectral model, parametrising a power law plus a Gaussian spectral line.\n", " \n", " Parameters\n", " ----------\n", " amplitude : `astropy.units.Quantity`\n", " Amplitude of the spectra model.\n", " index : `astropy.units.Quantity`\n", " Spectral index of the model.\n", " reference : `astropy.units.Quantity`\n", " Reference energy of the power law.\n", " mean : `astropy.units.Quantity`\n", " Mean value of the Gaussian.\n", " width : `astropy.units.Quantity`\n", " Sigma width of the Gaussian line.\n", " \n", " \"\"\"\n", "\n", " tag = \"MyCustomSpectralModel\"\n", " amplitude = Parameter(\"amplitude\", \"1e-12 cm-2 s-1 TeV-1\", min=0)\n", " index = Parameter(\"index\", 2, min=0)\n", " reference = Parameter(\"reference\", \"1 TeV\", frozen=True)\n", " mean = Parameter(\"mean\", \"1 TeV\", min=0)\n", " width = Parameter(\"width\", \"0.1 TeV\", min=0, frozen=True)\n", "\n", " @staticmethod\n", " def evaluate(energy, index, amplitude, reference, mean, width):\n", " pwl = PowerLawSpectralModel.evaluate(\n", " energy=energy,\n", " index=index,\n", " amplitude=amplitude,\n", " reference=reference,\n", " )\n", " gauss = amplitude * np.exp(-((energy - mean) ** 2) / (2 * width ** 2))\n", " return pwl + gauss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is good practice to also implement a docstring for the model, defining the parameters and also definig a `tag`, which specifies the name of the model for serialisation. Also note that gammapy assumes that all SpectralModel evaluate functions return a flux in unit of `\"cm-2 s-1 TeV-1\"` (or equivalent dimensions).\n", "\n", "\n", "\n", "This model can now be used as any other spectral model in Gammapy:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MyCustomSpectralModel\n", "\n", " name value unit min max frozen error \n", "--------- ---------- -------------- --------- --- ------ ---------\n", "amplitude 1.0000e-12 cm-2 s-1 TeV-1 0.000e+00 nan False 0.000e+00\n", " index 2.0000e+00 0.000e+00 nan False 0.000e+00\n", "reference 1.0000e+00 TeV nan nan True 0.000e+00\n", " mean 3.0000e+00 TeV 0.000e+00 nan False 0.000e+00\n", " width 1.0000e-01 TeV 0.000e+00 nan True 0.000e+00\n" ] } ], "source": [ "my_custom_model = MyCustomSpectralModel(mean=\"3 TeV\")\n", "print(my_custom_model)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$1.1442739 \\times 10^{-12} \\; \\mathrm{\\frac{1}{s\\,cm^{2}}}$$" ], "text/plain": [ "" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_custom_model.integral(1 * u.TeV, 10 * u.TeV)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEKCAYAAADq59mMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3zV1f3H8dfnZgKBsMLeYU+FKKJAtDKVoWidxcUPpU7EDrW11tFaa4uiIoriqnWCCxerEjYCypS9IytADJuE5Pz+SGIjTci6Nzffm/fz8cjD3O+993w/kXA/nHM+5xxzziEiIlIcvmAHICIi3qPkISIixabkISIixabkISIixabkISIixabkISIixRYe7ADKQu3atV2zZs2CHYaIiKcsW7Zsv3MuLr/nKkTyaNasGUuXLg12GCIinmJm2wt6TsNWIiJSbEoeIiJSbEoeIiJSbEoeIiJSbEoeIiJSbEoeIiJSbEoeImVgza40TmRkBjsMEb9R8hAJsMnLkrn02Xm8vXhHsEMR8RtPJA8za2Fmk8xscp5rl5nZy2b2iZn1C2Z8IgVZsGk/909ZCcCyHalBjkbEfwKePMzsVTPbZ2arT7s+wMzWm9kmM7v/TG0457Y450acdu1j59xI4Cbgar8HLlJKG/ce5ra3ltEirgq9WtVmZfKPwQ5JxG/KoufxOjAg7wUzCwPGAwOB9sC1ZtbezDqZ2WenfdUppP0/5rTld4dOZHDdy4tYvOVAIJqXEHYiI5ObX19CdEQYr950Dj1b1mbnweMcPJoe7NBE/CLgycM5Nwc4eNrlc4FNOT2KdOBdYKhzbpVzbtBpX/vya9eyPQl86Zz7Np/nbzWzpWa2NCUlpUSx7/rxODsOHuPqiYt44MNVpB3PKFE7UvGs3X2I5NTj/GlQexrVqEznRtUBWKHeh4SIYM15NAR25nmcnHMtX2ZWy8xeBM42swdyLt8F9AGuNLNRp7/HOTfROZfgnEuIi8t3U8hCta1Xjen39mZkr+a8t2QHfccm8dXq3SVqSyqWLSlHAejQoBoAnRrFYgYrd6YFMywRvwnWrrqWzzVX0IudcweAUaddexZ41s9x/Y/KkeH84dL2DO7SgPunrGLUW9/Sr31dHh3akXqx0YG+vXjU5pQjhPuMxjUrAxATFU58XIzmPSRkBKvnkQw0zvO4EbArSLEUSedG1fnkzgu4f2Bbkjak0HdsEv9atJ2srAJznlRgm1OO0LRWZSLC/vtXrHOjWFYkp+GcfmfE+4KVPJYArcysuZlFAtcAnwYpliKLCPMxKjGe6ff2pnPjWB76eDVXvbSQjXsPBzs0KWc2pxwlPi7mZ9fOalyd/UdOsjvtRJCiEvGfsijVfQdYCLQxs2QzG+GcOwXcCUwD1gLvO+fWBODeg81sYlqaf8eZm9aqwlsjuvPUlZ3ZuO8Ilzw7l2dmbuDkKa0gFsjIzGL7gaPE1/l58vhp0nynhq7E+8qi2upa51x951yEc66Rc25SzvUvnHOtnXPxzrm/BOjeU51zt8bGxvq9bTPjlwmNmXVfIgM71ueZmRu59Nl5LN12emGZVDQ7Dx4jI9P9T8+jXf2qRIQZK5I1aS7e54kV5uVZ7Zgonr32bF676RyOp2dy5YsL+ePHqzh8QmW9FdXmnEqr+LgqP7seFR5G23rVNGkuIUHJw08ualuH6ff25uYLmvHvxTvoO3YO09fsCXZYEgSbU44A0OK0ngdkT5qvSk5ToYV4Xkgnj0DNeRSkSlQ4Dw/uwEe3X0D1yhHc+q9l/PqtZew7pAnSimTzviPEVY0itlLE/zzXpVF1Dp88xdYDR4MQmYj/hHTyCOScx5mc1bg6U+/qyW/7t2HWun1cPDaJtxfv0L82K4jNKUf+Z8gqV5fGmjSX0BDSySOYIsJ83HFRS6aN7k2HBtV48KNVXPPyop+GNCQ0OefyLdPNFR9XBZ/9dwW6iFcpeQRY89pVeGfkeTx5RSfW7T7EwHFzef4/G0k/lRXs0CQADh5NJ+14Rr7zHQDhYT5qx0Sx77CGMsXblDzKgJlx9TlNmHlfIn3b1+Uf0zcw+Ll5fKvzHUJOQZVWedWpFsW+wyfLKiSRgFDyKEN1qkYz/rquvHJDAodOZHDFhAX8+dM1HDl5KtihiZ/kDksWNGwF2b8H+w4peYi3hXTyKOtqq6Lq074u0+/tzQ3nNeWNhdvoNzaJWWv3Bjss8YPN+44QFe6jYfVKBb6mTlX1PMT7Qjp5BKvaqiiqRkfwyNCOTB51PjHR4Yx4Yyl3vv0tKfpQ8bTNKUdoEReDz5ffxtHZ6lSN4sDRk5zK1LyXeFdIJw8v6Na0Bp/d1YsxfVszfc1e+oxN4v0lO7XzqkdlV1oVPN8BEFctGufggE4VFA9T8igHIsN93H1xK764pxdt6lbld1NWct3Li9m6X+WcXnIiI5OdqcfOON8B2T0PQPMe4mlKHuVIyzoxvHvrefzl8o6s/iGNAc/MYfzXm8jQ8IYn7Dh4DOegRSE9j5+Sh8p1xcOUPMoZn8+4vntTZt6XyEVt6vDUtPUMfm6eViR7QO45HfVjC54sB6hTLfsESk2ai5cpeZRTdatF8+Lwbrw0vBupx9K5/IX5PDr1e46qrLfc2vtT8jjz8cRxMdk9j73a80w8LKSTR3kt1S2O/h3qMWNMItd1b8Kr87fS7+k5fL1+X7DDknzsyUkGdapFnfF1keE+alSOUM9DPC2kk0d5LtUtjmrRETx+WScmj+pBpcgwbn5tCfe8+x37j+jDpzzZc+gENatEEhUeVuhrtVBQvC6kk0eoSWhWk8/v7snoPq34YtVu+oxNYvKyZJX1lhN7005Qt9qZh6xy1akWRYomzMXDlDw8Jio8jNF9WvPF3b1oGRfDbz5YwfBJ37Bd50ME3Z5DJ6hXyJBVrjitMhePU/LwqFZ1q/L+bT147LKOLN/5I/2fmcNLSZu1ajmI9h46Qb1CJstz1akaTcrhkzrjRTxLycPDfD5j+HlNmTGmN71axfHEl+sYOn4+q3/wboGAV6WfymL/kfSiD1tVjeJUliP1mFaZizcpeYSA+rGVmDi8GxOu78q+wycZOn4+f/1iLcfTM4MdWoWRu+CvXjHmPLLfp6Er8aaQTh6hUKpbVGbGwE71mXlvIlclNGLinC30eyaJuRtTgh1ahZC7ZqNuMYatQMlDvCukk0eolOoWR2zlCJ4Y1pl3bz2PCJ+P4ZO+Ycx7yzmoTfgCak9adhIocs/jp/2tVHEl3hTSyaMiO69FLb64pxd3XtSST1fsos/YJD7+7geV9QZI7gJBDVtJRaHkEcKiI8L4Tf82fHZ3T5rUrMzo95Zz42tL2HnwWLBDCzl7D50gMtxH9coRRXp95chwYqLCdX6LeJaSRwXQtl41pvz6fP48uD3Lth2k39NzeGXuFpX1+tGetBPUqxaNWcGHQJ0u+yxzDVuJNyl5VBBhPuOmC5ozfUwiPeJr8fjnaxk2YQFrdoV+MUFZyF4gWLQhq1x1qkZpixLxLCWPCqZh9UpMujGB5649m10/HmfI8/N54kuV9ZbW3kMnilxplatO1WjNeYhnKXlUQGbG4C4NmDkmkSu6NuSlpC0MGDeH+Zv2Bzs0T3LO5QxbFW1rklx1qmYPW6mIQbxIyaMCq145kr9f2YW3R3bHgOtfWcxvPlhBqsp6iyXteAYnT2UVeXV5rjrVojiRkcVhndEiHqTkIZwfX5uvRvfm1xfG89F3P9BnbBKfLFdZb1H9VKZbgmEr0Fnm4k0hnTwq0grz0oqOCOP3A9oy9c6eNKxRiXveXc4try/hhx+PBzu0cm9PWvHWeOTSWebiZSGdPCriCvPSat+gGh/dfgEPDWrPoi0H6Ts2iVfnbSVTu78W6KetSUowbAVorYd4UkgnDymZMJ8xomdzpt/bm3Oa1eTRz75n2IQFrNtzKNihlUu5W5MUN3nEadhKPEzJQwrUuGZlXr/5HMZdcxbJB48x6Nl5PDVtHScyVNab155DJ6hVJZLI8OL9daoWHU5UuE/DVuJJSh5yRmbG0LMaMnNMIkPPasj4rzczcNxcFm05EOzQyo29h4p+/GxeZkatKpEcUHWbeNAZk4eZ1SzCV/WyClaCp0aVSP55VRf+NeJcMrMc10xcxP1TVpJ2LCPYoQXdnrSinyB4uloxUdrxWDwpvJDnd+V8nWnDnjCgid8iknKtV6s4po3uzTMzN/DKvK3MWrePR4Z0YGDHesXa1ymU7D10gi6NS/ZvqFoxkRw4ouQh3lPYsNVa51wL51zzgr4AjV9UMJUiw3jgknZ8cscF1Kkaxe3//paRby5jd1rFK+s9eSqTA0fTi12mm6tWlSgOHNGEuXhPYcmjRxHaKMprJAR1bBjLJ3dcwIOXtGXephT6jp3Dmwu3Vaiy3txKqXqxxduaJFetmEj2H03XgkzxnDMmD+fcT2UgZlbDzDqYWQsz8+X3Gql4wsN83No7numjEzm7SXX+9MkafvniAjbsPRzs0MrEf1eXVyrR+2tViST9VBZHtTGleExhE+axZvagma0CFgEvAe8D283sAzO7qCyClPKvSa3KvHnLuYy9qgtb9x/l0mfnMnb6ek6eCu0PxdyDtRrVKGHyiMnusWjoSrymsGGrycBOoJdzro1zrqdzLsE51xj4GzDUzEYEPErxBDNjWNdGzByTyKDODXj2P5sYOG4u32w9GOzQAiY5NXuep2H1kiaPSAD2a9JcPKawYau+zrl/Oed+zOe5Zc650c65SYELr3S0t1Vw1IqJ4umrz+KNW87lZEYWV720kAc/WsWhE6FX1rvz4DHqVosiOiKsRO+vXUU9D/GmwoatvjezP5hZfFkF5E/a2yq4ElvHMf3e3ozo2Zx3v9lBn38m8dXqPcEOy692ph6jUY3KJX5/zZyeh9Z6iNcUNmx1LRADTDezxWY22swalEFcEiKqRIXz0KD2fHzHBdSKiWLUW8u47V9Lf9pM0OuSU4/TuITzHZA9YQ5olbl4TmHDViuccw845+KBe4CmwCIz+4+ZjSyTCCUkdG5UnU/vvID7B7Zl9voU+vwzibcWbSfLw2W9pzKz2J12gsY1S97ziI4IIyYqnP0athKPKfLeVs65Rc65e4EbgBrA8wGLSkJSRJiPUYnxTBvdm06NYvnjx6u5euJCNu3zZlnv7rQTZGa5Elda5dIqc/GiIiUPMzvHzMaa2XbgEWAi0DCgkUnIala7Cv/+v+48dWVnNuw9wiXj5jFu5kbST2UFO7Ri2ZmaXabbuBRzHgA1q0Ry4Kh6HuIthU2Y/9XMNgMTyN7j6gLnXKJzboJzbn+ZRCghycz4ZUJjZo5JpH/Hejw9cwOXPjuXZdu9U9abfDC7TLc0w1aQu0WJeh7iLYX1PE4CA3PWdvzDOZdcFkFJxRFXNYrnrj2b1246h2PpmVz54kIe+ng1hz1Q1rsz9Rg+K/7Z5aerHaNt2cV7Cpswf8Q5t8HMKpvZQ2b2MoCZtTKzQWUTolQEF7Wtw7R7e3Njj2a8tXg7fcfOYcb3e4Md1hklpx6nfmwlIsJKdyxOrZhIDh5N93TxgFQ8Rf2tf43sXkjuJojJwOMBiUgqrJiocP48pAMf/vp8qleOYOSbS7n938vYV07LencePEbjmqWbLAeoWSWKzCxH2vHy39sSyVXU5BHvnPs7kAHgnDvOmc/4ECmxs5vUYOpdPflt/zbMXLuPi8cm8c43O8rdv8xLu0AwV+0YrfUQ7ylq8kg3s0qAA8hZca7yEAmYiDAfd1zUkq/u6UX7+tV44MNVXPPyIjanHAl2aED2OR57D50sdaUVZE+Yg7YoEW8prNpqes63fwa+Ahqb2b+BWcDvAhuaCLSIi+Gdkefxt2GdWLv7EAPHzeX5/wS/rPeH1NxKq9IPW9VSz0M8qLCeRxyAc246MAy4CXgHSHDOzQ5oZCI5fD7jmnObMGtMIn3a1eEf0zcw+Ll5fLcjNWgx7cxJHv4YtvopeajnIR5SWPKINbNhZjYMSASigEigd841kTJTp1o0L1zfjZdvSCDteAbDJizgz5+u4cjJU2UeS3LuAkE/9DxqVFbPQ7wnvJDnY4FB5D857oAP/R6RSCH6tq/LeS1q8tS09byxcBvT1+zh8cs78ou2dcsshp0HjxMRZtStWro1HpA9v1O9coQWCoqnFJY8tjvnbimTSESKoWp0BI8O7cjQsxpy/5SV3PL6UgZ1rs/DgzsQV7Vk54kXR3LqMRpWr4TP55+iw1raokQ8prBhK0+X4+owqNDXrWkNPr+7F2P6tmb6mr30GZvE+0t34lxgy3p3ph4v9bYkedWKidJpguIphSWP4WUSRYDoMKiKITLcx90Xt+KLe3rRum4Mv5u8kutfWcy2/UcDds/kg8dKvZtuXrWqRGrCXDylsO1JVpdVICKl1bJODO/d2oO/XN6RVclp9H9mDhNmbyYj079lvcfST3HgaLpfKq1y5W5RIuIVpduUR6Sc8fmM67s3ZcaYRC5sE8eTX61jyPPzWZn8o9/ukZzqn91086pVJYrUYxmc8nOiEwmUYicPM6thZp0DEYyIv9SLjeal4Qm8+KtuHDx6ksvGz+exz77nqB/Kepdsy942vk3dqqVuK1fuFiUHj6n3Id5Q1MOgZptZNTOrCawAXjOzsYENTaT0BnSsx4wxiVx7bhMmzdtKv6fnMHv9vlK1+enyXcTHVaF13Rg/RZm9OSKgcl3xjKL2PGKdc4fIXmX+mnOuG9AncGGJ+E+16Aj+cnknPhjVg+gIHze9toTR735XognqPWkn+GbbQYZ0aYiZ/4oRc1eZa95DvKKoySPczOoDVwGfBTAekYA5p1lNvrinF3df3IrPV+2mz9gkpixLLlZZ72crd+EcDO5S36+x5Q5b7VfFlXhEUZPHo8A0YJNzbomZtQA2Bi4skcCICg9jTN/WfH53L1rExXDfByu44dVv2HHgWJHeP3XFLjo2rEaLOP8NWUHenXXV8xBvKFLycM594Jzr7Jy7PefxFufcFYENTSRwWtetyge39eCxoR34bseP9HsmqdCy3m37j7IiOY0hXRr4PZ7YShGE+Uw9D/EMlepKheXzGcN7NGPGmN4kts4u6z3Tbr1TV+wC4NLO/k8ePp9Rr1o0P/x43O9tiwSCkodUePVjK/HS8AReGt6NH49lcPkLC7j3veU/7ZwL4Jzj0xW7OKdZDRpW99/K8rzi68SUm8OuRApT2MaIIhVG/w71OD++Fi/M3syr87by+crdXH52Q3w+Y0/acTbuO8JjQzsE7P7xcVVYsvUgWVnObxsuigRKoT0PM2trZhebWcxp1wcELiyR4KgaHcHvB7Rl9m8vZOhZDfho+Q/M+H4vew6dpF/7ugzp0jBg946Pi+F4RiZ7Dp0I2D1E/OWMPQ8zuxu4A1gLTDKze5xzn+Q8/Veyj6YVCTn1Yyvx1C+78PcrO/t1PceZxOdUcG1OOUKDAA2NifhLYT2PkUA359xlwIXAQ2Z2T85z6ldLyCurxAEQX6cKAJv3ad5Dyr/C5jzCnHNHAJxz28zsQmCymTVFyUPEr+JioqgaHc7mlMBtJS/iL4X1PPaY2Vm5D3ISySCgNtApkIGJVDRmRnycKq7EGwpLHjcAe/JecM6dcs7dAPQOWFQiFZSSh3jFGYetnHPJud+bWQ2gcZ73aDWTiJ/F16nClG+TOXwig6rREcEOR6RARVrnYWaPATcBm4HcXeQc8IvAhCVSMeVWXG1JOUqXxtWDHI1IwYq6SPAqIN45p13bRAIob7mukoeUZ0XdnmQ1oN9kkQBrUrMyYT5jiyqupJwras/jCeA7M1sN/LTtp3NuSECiEqmgIsN9NK1ZWZPmUu4VNXm8ATwJrAIK3rNaREqthSquxAOKmjz2O+eeDWgkIgJkV1zN2ZDCqcwswsO08bWUT0X9zVxmZk+YWQ8z65r7FdDIcphZCzObZGaT81xrZ2YvmtlkM/t1WcQhUlbi42JIz8wiOVXV8FJ+FbXncXbOf8/Lc63QUl0ze5XsFen7nHMd81wfAIwDwoBXnHN/K6gN59wWYETe5OGcWwuMMjMf8HIRfwYRT8hbcdWsdpUgRyOSvyIlD+fcRSVs/3XgeeDN3AtmFgaMB/oCycASM/uU7ETyxGnvv8U5ty+/hs1sCHB/TvsiISM+LmeDxJQjXNyubpCjEclfkYatzOyvZlY9z+MaZvZ4Ye9zzs0BDp52+VxgU8456OnAu8BQ59wq59yg077yTRw5bX/qnDsfuL6AmG81s6VmtjQlJaUoP6ZIuVC9ciR1q0Uxe30KzrnC3yASBEWd8xjonPsx94FzLhW4pIT3bAjszPM4Oedavsyslpm9CJxtZg/kXLvQzJ41s5eAL/J7n3NuonMuwTmXEBcXV8JQRYJjVGI8CzYfYNqavcEORSRfRZ3zCDOzKOfcSQAzqwRElfCe+W3lXuA/r5xzB4BRp12bDcwu4f1Fyr3h5zXl3W928vjn33NhmziiI8KCHZLIzxS15/EWMMvMRpjZLcAMstd+lEQy2Rss5moE7CphWyIhKTzMx8ND2pOcepyXkrYEOxyR/1Gk5OGc+zvwONAO6AA8lnOtJJYArcysuZlFAtcAn5awLZGQdX58bS7tVJ8XZm8iOfVYsMMR+ZkzJg/Lcwanc+4r59xvnHP3Oeem5feafN7/DrAQaGNmyWY2wjl3CrgTmEb22ejvO+fWlPYHKeD+g81sYlpaWiCaFwm4By9thxmMfHOZVp1LuWJnquYws9nAFOAT59yOPNcjgZ7AjcDXzrnXAxtm6SQkJLilS5cGOwyREvl6/T7GvLecExlZPDy4PVef07hMz1aXisvMljnnEvJ7rrBhqwFAJvCOme0ys+/NbCuwEbgWeLq8Jw4Rr7uoTR2+Gt2brk2rc/+Hqxj55jL2pJ0IdlhSwZ2x5/GzF5pFkH12+fG8ZbteoJ6HhIKsLMekeVv5x/T1RIb5+P3Atlx3bhN8PvVCJDBK0/P4iXMuwzm320uJQ3MeEkp8PmNk7xZMG92bTo1i+ePHq7l64kI27dNciJS9Ivc8vEw9Dwk1zjk+WJrMX75Yy/H0TO78RUtGJcYTGa5deMV//NLzEJHyw8y46pzGzByTSL8OdRk7YwODnpvLsu2pwQ5NKojCSnWnmdm9Zta2rAISkaKLqxrF89d1ZdKNCRw5cYorX1zAw5+s5sjJU8EOTUJcYT2PG4FU4M9m9q2ZTTCzoWYWUwaxiUgRXdyuLtPHJHJjj2a8uWg7fccmMfN77YslgVOcaisf0B0YCFwMHAeml2KleZnRnIdUJN/tSOWBD1exbs9hLu1Un4eHtKdO1ehghyUedKY5jxJPmJtZbaC/c+7fpQkukMxsMDC4ZcuWIzdu3BjscETKTEZmFhPnbGHcrI1Eh/t48JJ2WlwoxRaQ5OEl6nlIRbUl5QgPfLiKxVsP0r15TZ4Y1okWcRp1lqJRtZVIBdUiLoZ3Rp7HE8M68f3uQwwYN5fxX28iIzMr2KGJxyl5iIQ4n8+49twmzBqTSJ92dXhq2noGPzeP73aorFdKrsTJw8xu9mcgIhJYdapF88L13Zg4vBs/Hstg2IQFPDJ1DUdV1islUJqexyN+i0JEyky/DvWYMaY3w89ryusLttHv6Tl8vW5fsMMSjylsS/aVBT0FtHbOlfQo2jKlCXOR/C3bfpD7p6xi474jDO7SgIcHt6d2jCf+WksZKHG1lZntBfqTvVDwZ08BC5xzDfwWZQCoVFekcOmnspgwezPjv95Epcgw/nBpO37ZrZHKeqVU1VafATHOue2nfW0DZvs5Tr9zzk11zt0aGxsb7FBEyq3IcB/39GnFF/f0pHXdGH43eSXXv7KYbfuPBjs0Kce0zkNEfpKV5XhnyQ7+9sU60jOzGN2nNf/XqzkRYSrMrIi0zkNEisTnM67v3pQZYxK5sE0cT361jiHPz2dlsmeO8ZEyUtiuut8W1kBRXiMi3lIvNpqXhifw4q+6ceDISS4bP5/HPvueY+kq65Vs4YU83+4MFVeQPXGuCQWREDWgYz16xNfiya/WMWneVr5avYe/DutEYuu4YIcmQVZYtVXTIrSR6ZxL9l9I/qc5D5HS+2brQR74cCWbU45y2VkNeGhQe2qprDekVdiNEVWqK+JfJ09lMv7rzUyYvYmYqHAeGtSey89uqLLeEFVhk0cu9TxE/GvD3sPcP2Ul3+74kV6tavPXyzvRuGblYIclfqZqKxHxq9Z1qzJ51Pk8OrQD325Ppe/TSUycs5lT2q23wihS8jCz9vlcu9Dv0YiIZ/h8xg09mjFjTCI9W9bmr1+s47IX5rP6h7RghyZloKg9j/fN7PeWrZKZPQc8EcjARMQbGlSvxMs3JDD+uq7sSTvJ0PHzeeLLtRxPzwx2aBJARU0e3YHGwAJgCbALuCBQQYmIt5gZl3auz6wxiVzZtREvJW2h/zNzmLdxf7BDkwApavLIAI4DlYBoYKtzToObIvIzsZUjePLKzrwz8jzCfMavJi3mvvdXkHo0PdihiZ8VNXksITt5nAP0BK41s8kBi0pEPK1HfC2+vKcXd1wUzyfLf6DP2CQ+Wf4DFaG6s6IoavIY4Zz7k3Muwzm3xzk3FPgkkIGJiLdFR4Tx2/5tmXpXTxrVrMw97y7npteWkJx6LNihiR8UaZ2HmTXJ77pzboffIwoArfMQCa7MLMcbC7bxj+nrAbivXxtuOr8ZYT4tLizPSr1I0MxWAY7svayigebAeudcB38G6m9aYS5SviSnHuOPH69m9voUujSK5YlhnWnfoFqww5IC+H2FuZl1BW5zzt1W2uDKgnoeIuWHc45PV+zi0anfk3Y8g5G9W3DPxa2IjggLdmhyGr+vMHfOfUv25LmISLGYGUPPasis+xK57OyGTJi9mQHPzGHBJpX1eklRh63G5HnoA7oCtZxz/QMVmD+p5yFSfs3ftJ8HP1rF9gPHuCqhEQ9e0o7qlSODHZbgn55H1TxfUcDnwFD/hCciFdkFLWszbXRvRiXGM+Xb7LLez1buUllvOadddUWk3FizK437p6xi1Q9pXNy2Do9e1pGG1SsFO6wKq8QT5mY2lewqq3w554aUPrzAU/IQ8Y5TmVm8vmAb/4xkc5gAAA2PSURBVJy+AZ/Bb/u3YXgPlfUGQ2mSR+KZGnbOJZUytjKh5CHiPTsPHuMPH69mzoYUzmpcnSev6EybelWDHVaFUprk0cQrCwHPRMlDxJucc3y8/Ace+2wth45nMCoxnjt/0VJlvWWkNBPmH+dpZIpfoxIRKYSZcfnZjZg5JpEhXRrw/NebuOTZuSzeciDYoVV4hSWPvIOMLQIZiIhIQWpWiWTs1Wfx5i3nkpGZxdUTF/HAh6tIO54R7NAqrMKShyvgexGRMte7dRzTRvfm1t4teG/JDvqOTeKr1buDHVaFVNicRyZwlOweSCUgdztMA5xzrlxvSqO9rURC16rkNO7/cCVrdh2iX/u6PDq0I/Vio4MdVkjx+95WXqMJc5HQdCozi0nztvL0zA1E+Hz8bmBbrj+3CT6V9fqF3/e2EhEpD8LDfNyWGM/00Yl0aVydhz5ezVUvLWTj3sPBDi3kKXmIiOc1qVWZf404l3/+sgubUo5wybNzeXrGBk6eygx2aCFLyUNEQoKZcUW37LLeSzrVZ9ysjVz67DyWbjsY7NBCkpKHiISU2jFRjLvmbF67+RyOp2dy5YsL+ePHqzh0QmW9/qTkISIh6aI2dZh+b29uuaA5by/OLuudvmZPsMMKGUoeIhKyqkSF86fB7fno9guoUTmSW/+1jF+/tYy9h04EOzTPU/IQkZDXpXF1pt7Vk98NaMN/1u2jz9gk3l68g6ys0F+qEChKHiJSIUSE+bj9wpZ8Nbo3HRvE8uBHq7hm4iI27TsS7NA8SclDRCqU5rWr8PbI7vz9is6s33uYS8bN5dlZG0k/lRXs0DxFyUNEKhwz46pzGjNzTCL9OtRl7IwNDHpuLsu2pwY7NM9Q8hCRCiuuahTPX9eVSTcmcPjEKa58cQEPf7KaIydPBTu0ck/JQ0QqvIvb1WXGmERu7NGMNxdtp+/YJGat3RvssMo1JQ8RESAmKpw/D+nAlF+fT9XocEa8sZQ73v6WlMMngx1auaTkISKSR9cmNfjsrl7c17c1M9bspc/YJN5fspOKsAN5cSh5iIicJjLcx10Xt+LL0b1oU68qv5uykmtfXsTW/UeDHVq5EdLJw8wGm9nEtLS0YIciIh4UHxfDuyPP46+Xd2LNrkP0f2YO47/eREamynp1GJSISBHsO3SChz9dw5er99C2XlX+dkVnzmpcPdhhBZQOgxIRKaU61aKZ8KtuvDS8G6nH0hn2wnwembqGoxW0rFfJQ0SkGPp3qMeMMYlc170Jr83fRr+n5/D1+n3BDqvMKXmIiBRTtegIHr+sE5NH9aBSZBg3v7aEu9/5jv1HKk5Zr5KHiEgJJTSryed392R0n1Z8uXo3fcYmMXlZcoUo61XyEBEphajwMEb3ac2X9/SiZVwMv/lgBcMnfcP2A6Fd1qvkISLiBy3rVOX923rw+GUdWbHzR/o/M4cXkzZzKkTLepU8RET8xOczfnVeU2aMSaR3qzj+9uU6ho6fz+ofQm+tmZKHiIif1YuNZuINCUy4viv7Dp9kyPPz+Mvn33MsPXTKepU8REQCZGCn+swck8jV5zTh5blb6ff0HOZsSAl2WH6h5CEiEkCxlSJ4Ylgn3rv1PCLDfdzw6jfc+95yDh5ND3ZopaLkISJSBrq3qMUXd/firl+0ZOqKXVz8z9l89J13y3qVPEREykh0RBj39WvD53f3olntKtz73gpufG0JOw8eC3ZoxabkISJSxtrUq8rkUefzyJAOLNt2kH5Pz+GVuVs8Vdar5CEiEgRhPuPG85sxY0wiF7SsxeOfr+XyFxawZpc3ynqVPEREgqhB9Uq8fEMC46/ryu60Ewx5fj5PfLmW4+mZwQ7tjJQ8RESCzMy4tHN9Zo1J5MqujXgpaQsDxs1h/qb9wQ6tQEoeIiLlRGzlCJ68sjNvj+yOAde/spj73l9Bajks61XyEBEpZ86Pr81Xo3tz+4XxfLL8B/qMTeKT5T+Uq7JeJQ8RkXIoOiKM3w1oy9S7etKoRiXueXc5N7++hOTU8lHWq+QhIlKOtatfjQ9vv4CHBrXnm63ZZb2vzttKZlZweyFKHiIi5VyYzxjRsznT7+3Nuc1r8uhn3zNswgLW7j4UtJiUPEREPKJRjcq8dtM5jLvmLJIPHmPwc/N4ato6TmSUfVmvkoeIiIeYGUPPasjMMYlcdnZDxn+9mYHj5rJw84EyjUPJQ0TEg2pUieQfv+zCWyO6k5nluPblRfx+8krSjmWUyf3LffIwsxZmNsnMJp92vYqZLTOzQcGKTUQk2Hq2qs200b25rXcLJn+bzMVjk/hs5a6Al/UGNHmY2atmts/MVp92fYCZrTezTWZ2/5nacM5tcc6NyOep3wPv+zNeEREvqhQZxgOXtOOTOy6gfmw0d779Hf/3xlJ2/Xg8YPcMdM/jdWBA3gtmFgaMBwYC7YFrzay9mXUys89O+6qTX6Nm1gf4Htgb2PBFRLyjY8NYPrr9fP5wSTsWbD5A37FJvLlwW0DuFR6QVnM45+aYWbPTLp8LbHLObQEws3eBoc65J4CiDkFdBFQhO/kcN7MvnHM/28vYzG4FbgVo0qRJiX8GEREvCQ/zMbJ3CwZ0rMeDH61i/Z7DgblPQFo9s4bAzjyPk4HuBb3YzGoBfwHONrMHnHNPOOf+kPPcTcD+0xMHgHNuIjARICEhofys6RcRKQONa1bmzVvOJT1AZ4QEI3lYPtcK/HB3zh0ARhXw3Ot+iklEJOSYGVHhYQFpOxjVVslA4zyPGwG7ghCHiIiUUDCSxxKglZk1N7NI4Brg0yDEISIiJRToUt13gIVAGzNLNrMRzrlTwJ3ANGAt8L5zbk2A7j/YzCampXnjWEcREa+w8rQ/fKAkJCS4pUuXBjsMERFPMbNlzrmE/J4r9yvMRUSk/FHyEBGRYlPyEBGRYgvGOo8yY2aDgcHAITPbCMQCJZk9rw3s92dsUqCS/hmVd+X15wpGXIG+ZyDa90ebpW0jGJ9fTQt6okJMmOcys4nOuVtL8L6lBU0aiX+V9M+ovCuvP1cw4gr0PQPRvj/aLG0b5e3zq6INW00NdgBSqFD9MyqvP1cw4gr0PQPRvj/aLG0b5ep3qEL1PEpKPQ8R8Sr1PIJrYrADEBEpoYB8fqnnISIixaaeh4iIFJuSh4iIFJuSh4iIFJuSRzGZWRUze8PMXjaz64Mdj4hIcZhZCzObZGaTS9OOkgdgZq+a2T4zW33a9QFmtt7MNpnZ/TmXhwGTnXMjgSFlHqyIyGmK8xnmnNvinBtR2nsqeWR7HRiQ94KZhQHjgYFAe+BaM2tP9smHuWewZ5ZhjCIiBXmdon+G+YWSB+CcmwMcPO3yucCmnCydDrwLDCX7GN1GOa/R/z8RCbpifob5hT78CtaQ//YwIDtpNAQ+BK4wswmUs+0CRETyyPczzMxqmdmLwNlm9kBJGw/pXXVLyfK55pxzR4GbyzoYEZFiKugz7AAwqrSNq+dRsGSgcZ7HjYBdQYpFRKS4AvoZpuRRsCVAKzNrbmaRwDXAp0GOSUSkqAL6GabkAZjZO8BCoI2ZJZvZCOfcKeBOYBqwFnjfObcmmHGKiOQnGJ9h2hhRRESKTT0PEREpNiUPEREpNiUPEREpNiUPEREpNiUPEREpNiUPEREpNiUPEcDMMs1seZ6v+wt/V+DliauBmS3O+X6HmaXkibXZae+50MwWnnYt3Mz2mll9M3vKzPaY2W/K8meR0KK9rUSyHXfOneXPBs0sPGehVmnkjat7Trs3AQnOuTsLeM8coJGZNXPObcu51gdY7ZzbDfzWzI6WMi6p4NTzEDkDM9tmZo+Y2bdmtsrM2uZcr5JzAM8SM/vOzIbmXL/JzD4ws6nAdDOrbGbvm9lKM3svp/eQYGYjzOzpPPcZaWZjSxBfvJl9ZWbLzGyumbV1zmUBHwBX53npNcA7pfqfIZKHkodItkqnDVvl/eDd75zrCkwAcod6/gD8xzl3DnAR8JSZVcl5rgdwo3PuF8DtQKpzrjPwGNAt5zXvAkPMLCLn8c3AayWIeyJwl3OuW05sL+Rcf4fshIGZRQGXAFNK0L5IvjRsJZLtTMNWH+b8dxnZxxAD9CP7wz83mUQDTXK+n+Gcyz2YpycwDsA5t9rMVuZ8f9TM/gMMMrO1QIRzblVxAjazGOB84AOzn3bfjsppf4mZxZhZG6AdsMg5l1qc9kXORMlDpHAnc/6byX//zhhwhXNufd4Xmll3IO98Qn5nKuR6BXgQWEfJeh0+4MczJL13ye59tENDVuJnGrYSKZlpwF2W809+Mzu7gNfNA67KeU17oFPuE865xWSft3AdJfhwd84dAraa2S9z2jcz65LnJe8AvwJ+gY4TED9T8hDJdvqcx98Kef1jQASw0sxW5zzOzwtAXM5w1e+BlUBanuffB+aXYkjpemCEma0A1pDnjGrn3PfAMbLnZlRdJX6lLdlFAsjMwsiezzhhZvHALKC1cy495/nPgKedc7MKeP8R51xMAOL6M3DEOfcPf7ctFYN6HiKBVRmYl9Mz+Aj4tXMu3cyqm9kGsifq800cOQ7lLhL0V0Bm9hTZw1nqjUiJqechIiLFpp6HiIgUm5KHiIgUm5KHiIgUm5KHiIgUm5KHiIgUm5KHiIgU2/8Ds8Zos+Xn7ocAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "my_custom_model.plot(energy_range=[1, 10] * u.TeV)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a next step we can also register the custom model in the `SPECTRAL_MODELS` registry, so that it becomes available for serilisation:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "SPECTRAL_MODEL_REGISTRY.append(MyCustomSpectralModel)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "model = SkyModel(spectral_model=my_custom_model, name=\"my-source\")\n", "models = Models([model])\n", "models.write(\"my-custom-models.yaml\", overwrite=True)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "components:\r\n", "- name: my-source\r\n", " type: SkyModel\r\n", " spectral:\r\n", " type: MyCustomSpectralModel\r\n", " parameters:\r\n", " - name: amplitude\r\n", " value: 1.0e-12\r\n", " unit: cm-2 s-1 TeV-1\r\n", " - name: index\r\n", " value: 2.0\r\n", " - name: reference\r\n", " value: 1.0\r\n", " unit: TeV\r\n", " frozen: true\r\n", " - name: mean\r\n", " value: 3.0\r\n", " unit: TeV\r\n", " - name: width\r\n", " value: 0.1\r\n", " unit: TeV\r\n", " frozen: true\r\n", "covariance: my-custom-models_covariance.dat\r\n" ] } ], "source": [ "!cat my-custom-models.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly you can also create custom spatial models and add them to the `SPATIAL_MODELS` registry. In that case gammapy assumes that the evaluate function return a normalized quantity in \"sr-1\" such as the model integral over the whole sky is one." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Models with Energy dependent morphology\n", "\n", "A common science case in the study of extended sources is to probe for energy dependent morphology, in Supernova Remnants or Pulsar Wind Nebulae. Traditionally, this has been done by splitting the data into energy bands and doing individual fits of the morphology in these energy bands.\n", "\n", "`SkyModel` offers a natural framework to simultaneously model the energy and morphology, e.g. spatial extent described by a parametric model expression with energy dependent parameters.\n", "\n", "The models shipped within gammapy use a “factorised” representation of the source model, where the spatial ($l,b$), energy ($E$) and time ($t$) dependence are independent model components and not correlated:\n", "\n", " $$f(l, b, E, t) = F(l, b) \\cdot G(E) \\cdot H(t) $$\n", " \n", "To use full 3D models, ie $f(l, b, E) = F(l, b, E) \\cdot G(E) $, you have to implement your own custom `SpatialModel`. Note that it is still necessary to multiply by a `SpectralModel`, $G(E)$ to be dimensionally consistent.\n", "\n", "In this example, we create Gaussian Spatial Model with the extension varying with energy. For simplicity, we assume a linear dependence on energy and parameterize this by specifing the extension at 2 energies. You can add more complex dependences, probably motivated by physical models." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "from gammapy.modeling.models import SpatialModel\n", "from astropy.coordinates.angle_utilities import angular_separation\n", "\n", "\n", "class MyCustomGaussianModel(SpatialModel):\n", " \"\"\"My custom Energy Dependent Gaussian model.\n", "\n", " Parameters\n", " ----------\n", " lon_0, lat_0 : `~astropy.coordinates.Angle`\n", " Center position\n", " sigma_1TeV : `~astropy.coordinates.Angle`\n", " Width of the Gaussian at 1 TeV\n", " sigma_10TeV : `~astropy.coordinates.Angle`\n", " Width of the Gaussian at 10 TeV\n", "\n", " \"\"\"\n", "\n", " tag = \"MyCustomGaussianModel\"\n", " lon_0 = Parameter(\"lon_0\", \"0 deg\")\n", " lat_0 = Parameter(\"lat_0\", \"0 deg\", min=-90, max=90)\n", "\n", " sigma_1TeV = Parameter(\"sigma_1TeV\", \"2.0 deg\", min=0)\n", " sigma_10TeV = Parameter(\"sigma_10TeV\", \"0.2 deg\", min=0)\n", "\n", " @staticmethod\n", " def get_sigma(energy, sigma_1TeV, sigma_10TeV):\n", " \"\"\"Get the sigma for a particular energy\"\"\"\n", " sigmas = u.Quantity([sigma_1TeV, sigma_10TeV])\n", " energy_nodes = [1, 10] * u.TeV\n", "\n", " log_s = np.log(sigmas.to(\"deg\").value)\n", " log_en = np.log(energy_nodes.to(\"TeV\").value)\n", " log_e = np.log(energy.to(\"TeV\").value)\n", " return np.exp(np.interp(log_e, log_en, log_s)) * u.deg\n", "\n", " def evaluate(\n", " self, lon, lat, energy, lon_0, lat_0, sigma_1TeV, sigma_10TeV\n", " ):\n", " \"\"\"Evaluate custom Gaussian model\"\"\"\n", "\n", " sigma = self.get_sigma(energy, sigma_1TeV, sigma_10TeV)\n", " sep = angular_separation(lon, lat, lon_0, lat_0)\n", "\n", " exponent = -0.5 * (sep / sigma) ** 2\n", " norm = 1 / (2 * np.pi * sigma ** 2)\n", " return norm * np.exp(exponent)\n", "\n", " @property\n", " def evaluation_radius(self):\n", " \"\"\"Evaluation radius (`~astropy.coordinates.Angle`).\"\"\"\n", " return (\n", " 5 * np.max([self.sigma_1TeV.value, self.sigma_10TeV.value]) * u.deg\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Serialisation of this model can be achieved as explained in the previous section.\n", "You can now use it as stadard `SpatialModel` in your analysis. Note that this is still a `SpatialModel`, and not a `SkyModel`, so it needs to be multiplied by a `SpectralModel` as before. " ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "spatial_model = MyCustomGaussianModel()\n", "spectral_model = PowerLawSpectralModel()\n", "sky_model = SkyModel(\n", " spatial_model=spatial_model, spectral_model=spectral_model\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To visualise it, we evaluate it on a 3D geom. " ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "energy_axis = MapAxis.from_energy_bounds(\n", " energy_min=0.1 * u.TeV, energy_max=10.0 * u.TeV, nbin=3, name=\"energy_true\"\n", ")\n", "geom = WcsGeom.create(\n", " skydir=(0, 0), width=5.0 * u.deg, binsz=0.1, axes=[energy_axis]\n", ")\n", "spatial_model.plot_grid(geom=geom, add_cbar=True);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "nbsphinx": { "orphan": true } }, "nbformat": 4, "nbformat_minor": 4 }