{ "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/analysis_mwl.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", "[analysis_mwl.ipynb](../_static/notebooks/analysis_mwl.ipynb) |\n", "[analysis_mwl.py](../_static/notebooks/analysis_mwl.py)\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Joint modeling, fitting, and serialization\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prerequisites\n", "\n", "- Handling of Fermi-LAT data with gammapy [see the corresponding tutorial](fermi_lat.ipynb)\n", "- Knowledge of spectral analysis to produce 1D On-Off datasets, [see the following tutorial](spectrum_analysis.ipynb)\n", "- Using flux points to directly fit a model (without forward-folding) [see the SED fitting tutorial](sed_fitting.ipynb)\n", "\n", "## Context\n", "\n", "Some science studies require to combine heterogeneous data from various instruments to extract physical informations. In particular, it is often useful to add flux measurements of a source at different energies to an analysis to better constrain the wide-band spectral parameters. This can be done using a joint fit of heterogeneous datasets.\n", " \n", "**Objectives: Constrain the spectral parameters of the gamma-ray emission from the Crab nebula between 10 GeV and 100 TeV, using a 3D Fermi dataset, a H.E.S.S. reduced spectrum and HAWC flux points.**\n", "\n", "## Proposed approach\n", "\n", "This tutorial illustrates how to perfom a joint modeling and fitting of the Crab Nebula spectrum using different datasets.\n", "The spectral parameters are optimized by combining a 3D analysis of Fermi-LAT data, a ON/OFF spectral analysis of HESS data, and flux points from HAWC.\n", "\n", "In this tutorial we are going to use pre-made datasets. We prepared maps of the Crab region as seen by Fermi-LAT using the same event selection than the [3FHL catalog](https://arxiv.org/abs/1702.00664) (7 years of data with energy from 10 GeV to 2 TeV). For the HESS ON/OFF analysis we used two observations from the [first public data release](https://arxiv.org/abs/1810.04516) with a significant signal from energy of about 600 GeV to 10 TeV. These observations have an offset of 0.5° and a zenith angle of 45-48°. The HAWC flux points data are taken from a [recent analysis](https://arxiv.org/pdf/1905.12518.pdf) based on 2.5 years of data with energy between 300 Gev and 300 TeV. \n", "\n", "## The setup\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from astropy import units as u\n", "import matplotlib.pyplot as plt\n", "from gammapy.modeling import Fit\n", "from gammapy.modeling.models import Models\n", "from gammapy.datasets import Datasets, FluxPointsDataset, SpectrumDatasetOnOff\n", "from gammapy.estimators import FluxPoints, FluxPointsEstimator\n", "from gammapy.maps import MapAxis\n", "from pathlib import Path" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data and models files\n", "\n", "\n", "The datasets serialization produce YAML files listing the datasets and models. In the following cells we show an example containning only the Fermi-LAT dataset and the Crab model. \n", "\n", "Fermi-LAT-3FHL_datasets.yaml:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "datasets:\r\n", "- name: Fermi-LAT\r\n", " type: MapDataset\r\n", " filename: Fermi-LAT-3FHL_data_Fermi-LAT.fits\r\n" ] } ], "source": [ "!cat $GAMMAPY_DATA/fermi-3fhl-crab/Fermi-LAT-3FHL_datasets.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We used as model a point source with a log-parabola spectrum. The initial parameters were taken from the latest Fermi-LAT catalog [4FGL](https://arxiv.org/abs/1902.10045), then we have re-optimized the spectral parameters for our dataset in the 10 GeV - 2 TeV energy range (fixing the source position).\n", "\n", "Fermi-LAT-3FHL_models.yaml:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "components:\r\n", "- name: Crab Nebula\r\n", " type: SkyModel\r\n", " spectral:\r\n", " type: LogParabolaSpectralModel\r\n", " parameters:\r\n", " - name: amplitude\r\n", " value: 0.018182745349064267\r\n", " unit: cm-2 s-1 TeV-1\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: false\r\n", " error: 0.003026327991562108\r\n", " - name: reference\r\n", " value: 5.054833602905273e-05\r\n", " unit: TeV\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: true\r\n", " error: 0.0\r\n", " - name: alpha\r\n", " value: 1.652368617859867\r\n", " unit: ''\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: false\r\n", " error: 0.05762513693893088\r\n", " - name: beta\r\n", " value: 0.03921700077803329\r\n", " unit: ''\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: false\r\n", " error: 0.00521472221220211\r\n", " spatial:\r\n", " type: PointSpatialModel\r\n", " frame: icrs\r\n", " parameters:\r\n", " - name: lon_0\r\n", " value: 83.63310241699219\r\n", " unit: deg\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: true\r\n", " error: 0.0\r\n", " - name: lat_0\r\n", " value: 22.019899368286133\r\n", " unit: deg\r\n", " min: -90.0\r\n", " max: 90.0\r\n", " frozen: true\r\n", " error: 0.0\r\n", "- type: FoVBackgroundModel\r\n", " datasets_names:\r\n", " - Fermi-LAT\r\n", " spectral:\r\n", " type: PowerLawNormSpectralModel\r\n", " parameters:\r\n", " - name: norm\r\n", " value: 1.3004625872247901\r\n", " unit: ''\r\n", " min: 0.0\r\n", " max: .nan\r\n", " frozen: false\r\n", " error: 0.07512322002655547\r\n", " - name: tilt\r\n", " value: 0.0\r\n", " unit: ''\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: true\r\n", " error: 0.0\r\n", " - name: reference\r\n", " value: 1.0\r\n", " unit: TeV\r\n", " min: .nan\r\n", " max: .nan\r\n", " frozen: true\r\n", " error: 0.0\r\n" ] } ], "source": [ "!cat $GAMMAPY_DATA/fermi-3fhl-crab/Fermi-LAT-3FHL_models.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reading different datasets\n", "\n", "\n", "### Fermi-LAT 3FHL: map dataset for 3D analysis\n", "For now we let's use the datasets serialization only to read the 3D `MapDataset` associated to Fermi-LAT 3FHL data and models." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "path = Path(\"$GAMMAPY_DATA/fermi-3fhl-crab\")\n", "filename = path / \"Fermi-LAT-3FHL_datasets.yaml\"\n", "\n", "datasets = Datasets.read(filename=filename)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Models\n", "\n", "Component 0: SkyModel\n", "\n", " Name : Crab Nebula\n", " Datasets names : None\n", " Spectral model type : LogParabolaSpectralModel\n", " Spatial model type : PointSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " amplitude : 1.82e-02 1 / (cm2 s TeV)\n", " reference (frozen) : 0.000 TeV \n", " alpha : 1.652 \n", " beta : 0.039 \n", " lon_0 (frozen) : 83.633 deg \n", " lat_0 (frozen) : 22.020 deg \n", "\n", "Component 1: FoVBackgroundModel\n", "\n", " Name : Fermi-LAT-bkg\n", " Datasets names : ['Fermi-LAT']\n", " Spectral model type : PowerLawNormSpectralModel\n", " Parameters:\n", " norm : 1.300 \n", " tilt (frozen) : 0.000 \n", " reference (frozen) : 1.000 TeV \n", "\n", "\n" ] } ], "source": [ "models = Models.read(path / \"Fermi-LAT-3FHL_models.yaml\")\n", "print(models)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get the Crab model in order to share it with the other datasets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SkyModel\n", "\n", " Name : Crab Nebula\n", " Datasets names : None\n", " Spectral model type : LogParabolaSpectralModel\n", " Spatial model type : PointSpatialModel\n", " Temporal model type : \n", " Parameters:\n", " amplitude : 1.82e-02 1 / (cm2 s TeV)\n", " reference (frozen) : 0.000 TeV \n", " alpha : 1.652 \n", " beta : 0.039 \n", " lon_0 (frozen) : 83.633 deg \n", " lat_0 (frozen) : 22.020 deg \n", "\n", "\n" ] } ], "source": [ "print(models[\"Crab Nebula\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### HESS-DL3: 1D ON/OFF dataset for spectral fitting\n", "\n", "The ON/OFF datasets can be read from PHA files following the [OGIP standards](https://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/spectra/ogip_92_007/node5.html).\n", "We read the PHA files from each observation, and compute a stacked dataset for simplicity.\n", "Then the Crab spectral model previously defined is added to the dataset." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "datasets_hess = Datasets()\n", "\n", "for obs_id in [23523, 23526]:\n", " dataset = SpectrumDatasetOnOff.from_ogip_files(\n", " f\"$GAMMAPY_DATA/joint-crab/spectra/hess/pha_obs{obs_id}.fits\"\n", " )\n", " datasets_hess.append(dataset)\n", "\n", "dataset_hess = datasets_hess.stack_reduce(name=\"HESS\")\n", "\n", "datasets.append(dataset_hess)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Datasets\n", "--------\n", "\n", "Dataset 0: \n", "\n", " Type : MapDataset\n", " Name : Fermi-LAT\n", " Instrument : \n", " Models : \n", "\n", "Dataset 1: \n", "\n", " Type : SpectrumDatasetOnOff\n", " Name : HESS\n", " Instrument : \n", " Models : \n", "\n", "\n" ] } ], "source": [ "print(datasets)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### HAWC: 1D dataset for flux point fitting\n", "\n", "The HAWC flux point are taken from https://arxiv.org/pdf/1905.12518.pdf. Then these flux points are read from a pre-made FITS file and passed to a `FluxPointsDataset` together with the source spectral model.\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# read flux points from https://arxiv.org/pdf/1905.12518.pdf\n", "filename = \"$GAMMAPY_DATA/hawc_crab/HAWC19_flux_points.fits\"\n", "flux_points_hawc = FluxPoints.read(filename)\n", "dataset_hawc = FluxPointsDataset(data=flux_points_hawc, name=\"HAWC\")\n", "\n", "datasets.append(dataset_hawc)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Datasets\n", "--------\n", "\n", "Dataset 0: \n", "\n", " Type : MapDataset\n", " Name : Fermi-LAT\n", " Instrument : \n", " Models : \n", "\n", "Dataset 1: \n", "\n", " Type : SpectrumDatasetOnOff\n", " Name : HESS\n", " Instrument : \n", " Models : \n", "\n", "Dataset 2: \n", "\n", " Type : FluxPointsDataset\n", " Name : HAWC\n", " Instrument : \n", " Models : \n", "\n", "\n" ] } ], "source": [ "print(datasets)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Datasets serialization\n", "\n", "The `datasets` object contains each dataset previously defined. \n", "It can be saved on disk as datasets.yaml, models.yaml, and several data files specific to each dataset. Then the `datasets` can be rebuild later from these files." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "HDU 'MASK_FIT' not found\n" ] } ], "source": [ "path = Path(\"crab-3datasets\")\n", "path.mkdir(exist_ok=True)\n", "\n", "filename = path / \"crab_10GeV_100TeV_datasets.yaml\"\n", "\n", "datasets.write(filename, overwrite=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "datasets:\r\n", "- name: Fermi-LAT\r\n", " type: MapDataset\r\n", " filename: Fermi-LAT.fits\r\n", "- name: HESS\r\n", " type: SpectrumDatasetOnOff\r\n", " filename: pha_obsHESS.fits\r\n", "- name: HAWC\r\n", " type: FluxPointsDataset\r\n", " filename: HAWC.fits\r\n" ] } ], "source": [ "!cat crab-3datasets/crab_10GeV_100TeV_datasets.yaml" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "datasets = Datasets.read(filename)\n", "datasets.models = models" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Datasets\n", "--------\n", "\n", "Dataset 0: \n", "\n", " Type : MapDataset\n", " Name : Fermi-LAT\n", " Instrument : \n", " Models : ['Crab Nebula', 'Fermi-LAT-bkg']\n", "\n", "Dataset 1: \n", "\n", " Type : SpectrumDatasetOnOff\n", " Name : HESS\n", " Instrument : \n", " Models : ['Crab Nebula']\n", "\n", "Dataset 2: \n", "\n", " Type : FluxPointsDataset\n", " Name : HAWC\n", " Instrument : \n", " Models : ['Crab Nebula']\n", "\n", "\n" ] } ], "source": [ "print(datasets)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Joint analysis\n", "\n", "We run the fit on the `Datasets` object that include a dataset for each instrument\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "HDU 'MASK_FIT' not found\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "OptimizeResult\n", "\n", "\tbackend : minuit\n", "\tmethod : minuit\n", "\tsuccess : True\n", "\tmessage : Optimization terminated successfully.\n", "\tnfev : 299\n", "\ttotal stat : -12695.04\n", "\n", "CPU times: user 2.93 s, sys: 21.8 ms, total: 2.95 s\n", "Wall time: 2.96 s\n" ] } ], "source": [ "%%time\n", "fit_joint = Fit(datasets)\n", "results_joint = fit_joint.run()\n", "print(results_joint)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's display only the parameters of the Crab spectral model" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LogParabolaSpectralModel\n", "\n", " name value unit min max frozen error \n", "--------- ---------- -------------- --- --- ------ ---------\n", "amplitude 3.8982e-03 cm-2 s-1 TeV-1 nan nan False 3.119e-04\n", "reference 5.0548e-05 TeV nan nan True 0.000e+00\n", " alpha 1.2561e+00 nan nan False 1.746e-02\n", " beta 6.1981e-02 nan nan False 9.775e-04\n" ] } ], "source": [ "crab_spec = datasets[0].models[\"Crab Nebula\"].spectral_model\n", "print(crab_spec)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compute flux points for Fermi-LAT and HESS datasets in order plot them together with the HAWC flux point." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# compute Fermi-LAT and HESS flux points\n", "energy_edges = MapAxis.from_energy_bounds(\"10 GeV\", \"2 TeV\", nbin=5).edges\n", "\n", "flux_points_fermi = FluxPointsEstimator(\n", " energy_edges=energy_edges, source=\"Crab Nebula\"\n", ").run([datasets[\"Fermi-LAT\"]])\n", "\n", "\n", "energy_edges = MapAxis.from_bounds(\n", " 1, 15, nbin=6, interp=\"log\", unit=\"TeV\"\n", ").edges\n", "flux_points_hess = FluxPointsEstimator(\n", " energy_edges=energy_edges, source=\"Crab Nebula\"\n", ").run([datasets[\"HESS\"]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, Let's plot the Crab spectrum fitted and the flux points of each instrument.\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# display spectrum and flux points\n", "energy_range = [0.01, 120] * u.TeV\n", "plt.figure(figsize=(8, 6))\n", "ax = crab_spec.plot(energy_range=energy_range, energy_power=2, label=\"Model\")\n", "crab_spec.plot_error(ax=ax, energy_range=energy_range, energy_power=2)\n", "flux_points_fermi.plot(ax=ax, energy_power=2, label=\"Fermi-LAT\")\n", "flux_points_hess.plot(ax=ax, energy_power=2, label=\"HESS\")\n", "flux_points_hawc.plot(ax=ax, energy_power=2, label=\"HAWC\")\n", "plt.legend();" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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" }, "nbsphinx": { "orphan": true } }, "nbformat": 4, "nbformat_minor": 4 }