{ "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://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/gammapy/gammapy-webpage/v0.9?urlpath=lab/tree/image_fitting_with_sherpa.ipynb)\n", "- You can contribute with your own notebooks in this\n", "[GitHub repository](https://github.com/gammapy/gammapy/tree/master/tutorials).\n", "- **Source files:**\n", "[image_fitting_with_sherpa.ipynb](../_static/notebooks/image_fitting_with_sherpa.ipynb) |\n", "[image_fitting_with_sherpa.py](../_static/notebooks/image_fitting_with_sherpa.py)\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fitting 2D images with Sherpa\n", "\n", "### Introduction\n", "\n", "Sherpa is the X-ray satellite Chandra modeling and fitting application. It enables the user to construct complex models from simple definitions and fit those models to data, using a variety of statistics and optimization methods. \n", "The issues of constraining the source position and morphology are common in X- and Gamma-ray astronomy. \n", "This notebook will show you how to apply Sherpa to CTA data.\n", "\n", "Here we will set up Sherpa to fit the counts map and loading the ancillary images for subsequent use. A relevant test statistic for data with Poisson fluctuations is the one proposed by Cash (1979). The simplex (or Nelder-Mead) fitting algorithm is a good compromise between efficiency and robustness. The source fit is best performed in pixel coordinates.\n", "\n", "This tutorial has 2 important parts\n", "1. Generating the Maps\n", "2. The actual fitting with sherpa.\n", "\n", "Since sherpa deals only with 2-dim images, the first part of this tutorial shows how to prepare gammapy maps to make classical images." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Necessary imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from astropy.io import fits\n", "import astropy.units as u\n", "from astropy.wcs import WCS\n", "from astropy.coordinates import SkyCoord\n", "from gammapy.extern.pathlib import Path\n", "from gammapy.data import DataStore\n", "from gammapy.irf import EnergyDispersion, make_mean_psf\n", "from gammapy.maps import WcsGeom, MapAxis, Map\n", "from gammapy.cube import MapMaker, PSFKernel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate the required Maps\n", "\n", "We first generate the required maps using 3 simulated runs on the Galactic center, exactly as in the [analysis_3d](analysis_3d.ipynb) tutorial.\n", "\n", "It is always advisable to make the maps on fine energy bins, and then sum them over to get an image." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Define which data to use\n", "data_store = DataStore.from_dir(\"$GAMMAPY_DATA/cta-1dc/index/gps/\")\n", "obs_ids = [110380, 111140, 111159]\n", "observations = data_store.get_observations(obs_ids)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "energy_axis = MapAxis.from_edges(\n", " np.logspace(-1, 1.0, 10), unit=\"TeV\", name=\"energy\", interp=\"log\"\n", ")\n", "geom = WcsGeom.create(\n", " skydir=(0, 0),\n", " binsz=0.02,\n", " width=(10, 8),\n", " coordsys=\"GAL\",\n", " proj=\"CAR\",\n", " axes=[energy_axis],\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 38.7 s, sys: 2.27 s, total: 41 s\n", "Wall time: 10.3 s\n" ] } ], "source": [ "%%time\n", "maker = MapMaker(geom, offset_max=4.0 * u.deg)\n", "maps = maker.run(observations)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Making a PSF Map\n", "\n", "Make a PSF map and weigh it with the exposure at the source position to get a 2D PSF " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# mean PSF\n", "src_pos = SkyCoord(0, 0, unit=\"deg\", frame=\"galactic\")\n", "table_psf = make_mean_psf(observations, src_pos)\n", "\n", "# PSF kernel used for the model convolution\n", "psf_kernel = PSFKernel.from_table_psf(table_psf, geom, max_radius=\"0.3 deg\")\n", "\n", "# get the exposure at the source position\n", "exposure_at_pos = maps[\"exposure\"].get_by_coord(\n", " {\n", " \"lon\": src_pos.l.value,\n", " \"lat\": src_pos.b.value,\n", " \"energy\": energy_axis.center,\n", " }\n", ")\n", "\n", "# now compute the 2D PSF\n", "psf2D = psf_kernel.make_image(exposures=exposure_at_pos)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Make 2D images from 3D ones\n", "\n", "Since sherpa image fitting works only with 2-dim images,\n", "we convert the generated maps to 2D images using `make_images()` and save them as fits files. The exposure is weighed with the spectrum before averaging (assumed to be a power law by default).\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "maps = maker.make_images()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "Path(\"analysis_3d\").mkdir(exist_ok=True)\n", "\n", "maps[\"counts\"].write(\"analysis_3d/counts_2D.fits\", overwrite=True)\n", "maps[\"background\"].write(\"analysis_3d/background_2D.fits\", overwrite=True)\n", "maps[\"exposure\"].write(\"analysis_3d/exposure_2D.fits\", overwrite=True)\n", "fits.writeto(\"analysis_3d/psf_2D.fits\", psf2D.data, overwrite=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the maps and store them in a sherpa model\n", "\n", "We now have the prepared files which sherpa can read. \n", "This part of the notebook shows how to do image analysis using sherpa" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING: imaging routines will not be available, \n", "failed to import sherpa.image.ds9_backend due to \n", "'RuntimeErr: DS9Win unusable: Could not find ds9 on your PATH'\n", "WARNING: failed to import sherpa.astro.xspec; XSPEC models will not be available\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/deil/software/anaconda3/envs/gammapy-dev/lib/python3.7/importlib/_bootstrap.py:219: RuntimeWarning: Unable to load the ciao_version module to determine version number- defaulting 'group' version to 0.0.0\n", " return f(*args, **kwds)\n" ] } ], "source": [ "import sherpa.astro.ui as sh\n", "\n", "sh.set_stat(\"cash\")\n", "sh.set_method(\"simplex\")\n", "\n", "sh.load_image(\"analysis_3d/counts_2D.fits\")\n", "sh.set_coord(\"logical\")\n", "\n", "sh.load_table_model(\"expo\", \"analysis_3d/exposure_2D.fits\")\n", "sh.load_table_model(\"bkg\", \"analysis_3d/background_2D.fits\")\n", "sh.load_psf(\"psf\", \"analysis_3d/psf_2D.fits\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In principle one might first want to fit the background amplitude. However the background estimation method already yields the correct normalization, so we freeze the background amplitude to unity instead of adjusting it. The (smoothed) residuals from this background model are then computed and shown." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "sh.set_full_model(bkg)\n", "bkg.ampl = 1\n", "sh.freeze(bkg)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "resid = Map.read(\"analysis_3d/counts_2D.fits\")\n", "resid.data = sh.get_data_image().y - sh.get_model_image().y\n", "resid_smooth = resid.smooth(width=4)\n", "resid_smooth.plot(add_cbar=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find and fit the brightest source\n", "We then find the position of the maximum in the (smoothed) residuals map, and fit a (symmetrical) Gaussian source with that initial position:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "yp, xp = np.unravel_index(\n", " np.nanargmax(resid_smooth.data), resid_smooth.data.shape\n", ")\n", "ampl = resid_smooth.get_by_pix((xp, yp))[0]\n", "\n", "# creates g0 as a gauss2d instance\n", "sh.set_full_model(bkg + psf(sh.gauss2d.g0) * expo)\n", "g0.xpos, g0.ypos = xp, yp\n", "sh.freeze(g0.xpos, g0.ypos) # fix the position in the initial fitting step\n", "\n", "# fix exposure amplitude so that typical exposure is of order unity\n", "expo.ampl = 1e-9\n", "sh.freeze(expo)\n", "sh.thaw(g0.fwhm, g0.ampl) # in case frozen in a previous iteration\n", "\n", "g0.fwhm = 10 # give some reasonable initial values\n", "g0.ampl = ampl" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'cdelt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mfit\u001b[0;34m(id, *otherids, **kwargs)\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9449\u001b[0m \"\"\"\n\u001b[1;32m 9450\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'bkg_only'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9451\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9452\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9453\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfit_bkg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9546\u001b[0m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_bkg_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9547\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9548\u001b[0;31m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9549\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9550\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'filter_nan'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'filter_nan'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_fit\u001b[0;34m(self, id, otherids, estmethod)\u001b[0m\n\u001b[1;32m 7467\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mestmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7468\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7469\u001b[0;31m \u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7470\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7471\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_extra_data_and_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_prepare_fit\u001b[0;34m(self, id, otherids)\u001b[0m\n\u001b[1;32m 7442\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_models\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sources\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7444\u001b[0;31m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7446\u001b[0m \u001b[0;31m# The issue with putting a try/catch here is that if an exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5507\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5508\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5509\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_convolution_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5511\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 8394\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8395\u001b[0m sherpa.ui.utils.Session._add_convolution_models(self, id, data,\n\u001b[0;32m-> 8396\u001b[0;31m model, is_source)\n\u001b[0m\u001b[1;32m 8397\u001b[0m \u001b[0mid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fix_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8398\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msherpa\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastro\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataPHA\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1099\u001b[0;31m \u001b[0m_PSFModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1101\u001b[0m \u001b[0;31m# Set WCS coordinates of kernel data set to match source data set.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;31m# FIXME how will we know the native dimensionality of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;31m# raveled model without the values?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_pixel_size\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mkargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36m_check_pixel_size\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sky\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0;31m# This corresponds to the case when the kernel is actually a psf image, not just a model.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 720\u001b[0;31m \u001b[0mpsf_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 721\u001b[0m \u001b[0mdata_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'cdelt'" ] } ], "source": [ "%%time\n", "sh.fit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Fit all parameters of this Gaussian component, fix them and re-compute the residuals map." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'cdelt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mthaw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg0\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxpos\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg0\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mypos\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfreeze\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mfit\u001b[0;34m(id, *otherids, **kwargs)\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9449\u001b[0m \"\"\"\n\u001b[1;32m 9450\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'bkg_only'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9451\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9452\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9453\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfit_bkg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9546\u001b[0m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_bkg_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9547\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9548\u001b[0;31m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9549\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9550\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'filter_nan'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'filter_nan'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_fit\u001b[0;34m(self, id, otherids, estmethod)\u001b[0m\n\u001b[1;32m 7467\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mestmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7468\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7469\u001b[0;31m \u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7470\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7471\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_extra_data_and_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_prepare_fit\u001b[0;34m(self, id, otherids)\u001b[0m\n\u001b[1;32m 7442\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_models\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sources\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7444\u001b[0;31m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7446\u001b[0m \u001b[0;31m# The issue with putting a try/catch here is that if an exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5507\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5508\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5509\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_convolution_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5511\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 8394\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8395\u001b[0m sherpa.ui.utils.Session._add_convolution_models(self, id, data,\n\u001b[0;32m-> 8396\u001b[0;31m model, is_source)\n\u001b[0m\u001b[1;32m 8397\u001b[0m \u001b[0mid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fix_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8398\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msherpa\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastro\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataPHA\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1099\u001b[0;31m \u001b[0m_PSFModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1101\u001b[0m \u001b[0;31m# Set WCS coordinates of kernel data set to match source data set.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;31m# FIXME how will we know the native dimensionality of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;31m# raveled model without the values?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_pixel_size\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mkargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36m_check_pixel_size\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sky\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0;31m# This corresponds to the case when the kernel is actually a psf image, not just a model.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 720\u001b[0;31m \u001b[0mpsf_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 721\u001b[0m \u001b[0mdata_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'cdelt'" ] } ], "source": [ "sh.thaw(g0.xpos, g0.ypos)\n", "sh.fit()\n", "sh.freeze(g0)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'cdelt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mresid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data_image\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_model_image\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mresid_smooth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msmooth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mresid_smooth\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mget_model_image\u001b[0;34m(id)\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36mget_model_image\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 14355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14356\u001b[0m \"\"\"\n\u001b[0;32m> 14357\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_imageobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_modelimage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14358\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_modelimage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14359\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_prepare_imageobj\u001b[0;34m(self, id, imageobj, model)\u001b[0m\n\u001b[1;32m 14264\u001b[0m \u001b[0mimageobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprepare_image\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14265\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m> 14266\u001b[0;31m \u001b[0mimageobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprepare_image\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14267\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mimageobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14268\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36mget_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5611\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5612\u001b[0m \"\"\"\n\u001b[0;32m-> 5613\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5614\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5615\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_runparamprompt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpars\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5507\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5508\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5509\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_convolution_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5511\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 8394\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8395\u001b[0m sherpa.ui.utils.Session._add_convolution_models(self, id, data,\n\u001b[0;32m-> 8396\u001b[0;31m model, is_source)\n\u001b[0m\u001b[1;32m 8397\u001b[0m \u001b[0mid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fix_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8398\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msherpa\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastro\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataPHA\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1099\u001b[0;31m \u001b[0m_PSFModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1101\u001b[0m \u001b[0;31m# Set WCS coordinates of kernel data set to match source data set.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;31m# FIXME how will we know the native dimensionality of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;31m# raveled model without the values?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_pixel_size\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mkargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36m_check_pixel_size\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sky\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0;31m# This corresponds to the case when the kernel is actually a psf image, not just a model.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 720\u001b[0;31m \u001b[0mpsf_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 721\u001b[0m \u001b[0mdata_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'cdelt'" ] } ], "source": [ "resid.data = sh.get_data_image().y - sh.get_model_image().y\n", "resid_smooth = resid.smooth(width=3)\n", "resid_smooth.plot();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Iteratively find and fit additional sources\n", "Instantiate additional Gaussian components, and use them to iteratively fit sources, repeating the steps performed above for component g0. (The residuals map is shown after each additional source included in the model.) This takes some time..." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# initialize components with fixed, zero amplitude\n", "for i in range(1, 10):\n", " model = sh.create_model_component(\"gauss2d\", \"g\" + str(i))\n", " model.ampl = 0\n", " sh.freeze(model)\n", "\n", "gs = [g0, g1, g2]\n", "sh.set_full_model(bkg + psf(g0 + g1 + g2) * expo)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'cdelt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mfit\u001b[0;34m(id, *otherids, **kwargs)\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9449\u001b[0m \"\"\"\n\u001b[1;32m 9450\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'bkg_only'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9451\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9452\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9453\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfit_bkg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0motherids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, id, *otherids, **kwargs)\u001b[0m\n\u001b[1;32m 9546\u001b[0m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_bkg_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9547\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9548\u001b[0;31m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9549\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9550\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'filter_nan'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'filter_nan'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_fit\u001b[0;34m(self, id, otherids, estmethod)\u001b[0m\n\u001b[1;32m 7467\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mestmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7468\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7469\u001b[0;31m \u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0motherids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7470\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7471\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_extra_data_and_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfit_to_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_prepare_fit\u001b[0;34m(self, id, otherids)\u001b[0m\n\u001b[1;32m 7442\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_models\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sources\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7444\u001b[0;31m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7446\u001b[0m \u001b[0;31m# The issue with putting a try/catch here is that if an exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5507\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5508\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5509\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_convolution_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5511\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 8394\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8395\u001b[0m sherpa.ui.utils.Session._add_convolution_models(self, id, data,\n\u001b[0;32m-> 8396\u001b[0;31m model, is_source)\n\u001b[0m\u001b[1;32m 8397\u001b[0m \u001b[0mid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fix_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8398\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msherpa\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastro\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataPHA\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1099\u001b[0;31m \u001b[0m_PSFModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1101\u001b[0m \u001b[0;31m# Set WCS coordinates of kernel data set to match source data set.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;31m# FIXME how will we know the native dimensionality of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;31m# raveled model without the values?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_pixel_size\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mkargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36m_check_pixel_size\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sky\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0;31m# This corresponds to the case when the kernel is actually a psf image, not just a model.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 720\u001b[0;31m \u001b[0mpsf_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 721\u001b[0m \u001b[0mdata_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'cdelt'" ] } ], "source": [ "%%time\n", "for i in range(1, len(gs)):\n", " yp, xp = np.unravel_index(\n", " np.nanargmax(resid_smooth.data), resid_smooth.data.shape\n", " )\n", " ampl = resid_smooth.get_by_pix((xp, yp))[0]\n", " gs[i].xpos, gs[i].ypos = xp, yp\n", " gs[i].fwhm = 10\n", " gs[i].ampl = ampl\n", "\n", " sh.thaw(gs[i].fwhm)\n", " sh.thaw(gs[i].ampl)\n", " sh.fit()\n", "\n", " sh.thaw(gs[i].xpos)\n", " sh.thaw(gs[i].ypos)\n", " sh.fit()\n", " sh.freeze(gs[i])\n", "\n", " resid.data = sh.get_data_image().y - sh.get_model_image().y\n", " resid_smooth = resid.smooth(width=6)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "resid_smooth.plot(add_cbar=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generating output table and Test Statistics estimation\n", "When adding a new source, one needs to check the significance of this new source. A frequently used method is the Test Statistics (TS). This is done by comparing the change of statistics when the source is included compared to the null hypothesis (no source ; in practice here we fix the amplitude to zero).\n", "\n", "$TS = Cstat(source) - Cstat(no source)$\n", "\n", "The criterion for a significant source detection is typically that it should improve the test statistic by at least 25 or 30. We have added only 3 sources to save time, but you should keep doing this till del(stat) is less than the required number." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'cdelt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mampl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mampl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mampl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mstati\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_stat_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mampl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mampl\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mstatf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_stat_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatval\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mget_stat_info\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36mget_stat_info\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 7614\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7615\u001b[0m \"\"\"\n\u001b[0;32m-> 7616\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_stat_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7617\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7618\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_fit_results\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_get_stat_info\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 9560\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_stat_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9561\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9562\u001b[0;31m \u001b[0mids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatasets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prepare_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9563\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9564\u001b[0m \u001b[0mextra_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_prepare_fit\u001b[0;34m(self, id, otherids)\u001b[0m\n\u001b[1;32m 7442\u001b[0m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_models\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sources\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7444\u001b[0;31m \u001b[0mmod\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7446\u001b[0m \u001b[0;31m# The issue with putting a try/catch here is that if an exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_get_model\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 5507\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5508\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_model_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5509\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_convolution_models\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5511\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 8394\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8395\u001b[0m sherpa.ui.utils.Session._add_convolution_models(self, id, data,\n\u001b[0;32m-> 8396\u001b[0;31m model, is_source)\n\u001b[0m\u001b[1;32m 8397\u001b[0m \u001b[0mid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fix_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8398\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msherpa\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastro\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataPHA\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_source\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m_add_convolution_models\u001b[0;34m(self, id, data, model, is_source)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/ui/utils.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5500\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_psf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5501\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5502\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mpsf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_psf_models\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpsf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5503\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5504\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/astro/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1099\u001b[0;31m \u001b[0m_PSFModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1101\u001b[0m \u001b[0;31m# Set WCS coordinates of kernel data set to match source data set.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36mfold\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;31m# FIXME how will we know the native dimensionality of the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;31m# raveled model without the values?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_pixel_size\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mkargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/software/anaconda3/envs/gammapy-dev/lib/python3.7/site-packages/sherpa/instrument.py\u001b[0m in \u001b[0;36m_check_pixel_size\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"sky\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 719\u001b[0m \u001b[0;31m# This corresponds to the case when the kernel is actually a psf image, not just a model.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 720\u001b[0;31m \u001b[0mpsf_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkernel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 721\u001b[0m \u001b[0mdata_pixel_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msky\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcdelt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'cdelt'" ] } ], "source": [ "from astropy.stats import gaussian_fwhm_to_sigma\n", "from astropy.table import Table\n", "\n", "rows = []\n", "for g in gs:\n", " ampl = g.ampl.val\n", " g.ampl = 0\n", " stati = sh.get_stat_info()[0].statval\n", " g.ampl = ampl\n", " statf = sh.get_stat_info()[0].statval\n", " delstat = stati - statf\n", "\n", " geom = resid.geom\n", " coord = geom.pix_to_coord((g.xpos.val, g.ypos.val))\n", " pix_scale = geom.pixel_scales.mean().deg\n", " sigma = g.fwhm.val * pix_scale * gaussian_fwhm_to_sigma\n", " rows.append(\n", " dict(delstat=delstat, glon=coord[0], glat=coord[1], sigma=sigma)\n", " )\n", "\n", "table = Table(rows=rows, names=rows[0])\n", "for name in table.colnames:\n", " table[name].format = \".5g\"\n", "table" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercises\n", "\n", "1. Keep adding sources till there are no more significat ones in the field. How many Gaussians do you need?\n", "2. Use other morphologies for the sources (eg: disk, shell) rather than only Gaussian.\n", "3. Compare the TS between different models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### More about sherpa\n", "\n", "These are good resources to learn more about Sherpa:\n", "\n", "* https://python4astronomers.github.io/fitting/fitting.html\n", "* https://github.com/DougBurke/sherpa-standalone-notebooks\n", "\n", "You could read over the examples there, and try to apply a similar analysis to this dataset here to practice.\n", "\n", "If you want a deeper understanding of how Sherpa works, then these proceedings are good introductions:\n", "\n", "* http://conference.scipy.org/proceedings/scipy2009/paper_8/full_text.pdf\n", "* http://conference.scipy.org/proceedings/scipy2011/pdfs/brefsdal.pdf" ] } ], "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.6.6" }, "nbsphinx": { "orphan": true } }, "nbformat": 4, "nbformat_minor": 2 }