\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.19?urlpath=lab/tree/tutorials/api/makers.ipynb)\n",
"- You may download all the notebooks in the documentation as a\n",
"[tar file](../../_downloads/notebooks-0.19.tar).\n",
"- **Source files:**\n",
"[makers.ipynb](../../_static/notebooks/makers.ipynb) |\n",
"[makers.py](../../_static/notebooks/makers.py)\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Makers - Data reduction\n",
"\n",
"## Introduction\n",
"\n",
"\n",
"The `gammapy.makers` sub-package contains classes to perform data reduction tasks\n",
"from DL3 data to binned datasets.\n",
"In the data reduction step the DL3 data is prepared for modeling and fitting,\n",
"by binning events into a counts map and interpolating the exposure, background,\n",
"psf and energy dispersion on the chosen analysis geometry.\n",
"\n",
"## Setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2021-11-22T21:08:39.163121Z",
"iopub.status.busy": "2021-11-22T21:08:39.162295Z",
"iopub.status.idle": "2021-11-22T21:08:39.838951Z",
"shell.execute_reply": "2021-11-22T21:08:39.839143Z"
}
},
"outputs": [],
"source": [
"from gammapy.makers import (\n",
" MapDatasetMaker,\n",
" FoVBackgroundMaker,\n",
" SafeMaskMaker,\n",
" SpectrumDatasetMaker,\n",
" ReflectedRegionsBackgroundMaker,\n",
")\n",
"from gammapy.datasets import MapDataset, SpectrumDataset, Datasets\n",
"from gammapy.data import DataStore\n",
"from gammapy.maps import MapAxis, WcsGeom, RegionGeom\n",
"from regions import CircleSkyRegion\n",
"from astropy import units as u\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset\n",
"\n",
"The counts, exposure,\n",
"background and IRF maps are bundled together in a data structure named `MapDataset`.\n",
"To handle on-off observations Gammapy also features a `MapDatasetOnOff` class, which\n",
"stores in addition the `counts_off`, `acceptance` and `acceptance_off` data.\n",
"\n",
"The first step of the data reduction is to create an empty dataset. A `MapDataset` can be created from any `WcsGeom` object. This is illustrated in the following example:\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2021-11-22T21:08:39.843891Z",
"iopub.status.busy": "2021-11-22T21:08:39.843598Z",
"iopub.status.idle": "2021-11-22T21:08:39.853068Z",
"shell.execute_reply": "2021-11-22T21:08:39.853251Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MapDataset\n",
"----------\n",
"\n",
" Name : FrY21vkA \n",
"\n",
" Total counts : 0 \n",
" Total background counts : 0.00\n",
" Total excess counts : 0.00\n",
"\n",
" Predicted counts : 0.00\n",
" Predicted background counts : 0.00\n",
" Predicted excess counts : nan\n",
"\n",
" Exposure min : 0.00e+00 m2 s\n",
" Exposure max : 0.00e+00 m2 s\n",
"\n",
" Number of total bins : 110000 \n",
" Number of fit bins : 0 \n",
"\n",
" Fit statistic type : cash\n",
" Fit statistic value (-2 log(L)) : nan\n",
"\n",
" Number of models : 0 \n",
" Number of parameters : 0\n",
" Number of free parameters : 0\n",
"\n",
"\n"
]
}
],
"source": [
"energy_axis = MapAxis.from_bounds(\n",
" 1, 10, nbin=11, name=\"energy\", unit=\"TeV\", interp=\"log\"\n",
")\n",
"geom = WcsGeom.create(\n",
" skydir=(83.63, 22.01),\n",
" axes=[energy_axis],\n",
" width=5 * u.deg,\n",
" binsz=0.05 * u.deg,\n",
" frame=\"icrs\",\n",
")\n",
"dataset_empty = MapDataset.create(geom=geom)\n",
"print(dataset_empty)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is possible to compute the instrument response functions with different spatial and energy binnings as compared to the counts and background maps. For example, one can specify a true energy axis which defines the energy binning of the IRFs:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2021-11-22T21:08:39.856696Z",
"iopub.status.busy": "2021-11-22T21:08:39.856405Z",
"iopub.status.idle": "2021-11-22T21:08:39.860349Z",
"shell.execute_reply": "2021-11-22T21:08:39.860503Z"
}
},
"outputs": [],
"source": [
"energy_axis_true = MapAxis.from_bounds(\n",
" 0.3, 10, nbin=31, name=\"energy_true\", unit=\"TeV\", interp=\"log\"\n",
")\n",
"dataset_empty = MapDataset.create(geom=geom, energy_axis_true=energy_axis_true)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the detail of the other options availables, you can always call the help:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2021-11-22T21:08:39.862550Z",
"iopub.status.busy": "2021-11-22T21:08:39.862247Z",
"iopub.status.idle": "2021-11-22T21:08:39.863600Z",
"shell.execute_reply": "2021-11-22T21:08:39.863751Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on method create in module gammapy.datasets.map:\n",
"\n",
"create(geom, energy_axis_true=None, migra_axis=None, rad_axis=None, binsz_irf=None, reference_time='2000-01-01', name=None, meta_table=None, **kwargs) method of abc.ABCMeta instance\n",
" Create a MapDataset object with zero filled maps.\n",
" \n",
" Parameters\n",
" ----------\n",
" geom : `~gammapy.maps.WcsGeom`\n",
" Reference target geometry in reco energy, used for counts and background maps\n",
" energy_axis_true : `~gammapy.maps.MapAxis`\n",
" True energy axis used for IRF maps\n",
" migra_axis : `~gammapy.maps.MapAxis`\n",
" If set, this provides the migration axis for the energy dispersion map.\n",
" If not set, an EDispKernelMap is produced instead. Default is None\n",
" rad_axis : `~gammapy.maps.MapAxis`\n",
" Rad axis for the psf map\n",
" binsz_irf : float\n",
" IRF Map pixel size in degrees.\n",
" reference_time : `~astropy.time.Time`\n",
" the reference time to use in GTI definition\n",
" name : str\n",
" Name of the returned dataset.\n",
" meta_table : `~astropy.table.Table`\n",
" Table listing information on observations used to create the dataset.\n",
" One line per observation for stacked datasets.\n",
" \n",
" Returns\n",
" -------\n",
" empty_maps : `MapDataset`\n",
" A MapDataset containing zero filled maps\n",
"\n"
]
}
],
"source": [
"help(MapDataset.create)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once this empty \"reference\" dataset is defined, it can be filled with observational\n",
"data using the `MapDatasetMaker`:\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2021-11-22T21:08:39.865923Z",
"iopub.status.busy": "2021-11-22T21:08:39.865621Z",
"iopub.status.idle": "2021-11-22T21:08:41.858173Z",
"shell.execute_reply": "2021-11-22T21:08:41.858380Z"
},
"nbsphinx-thumbnail": {
"tooltip": "Data reduction : from observations to binned datasets"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No HDU found matching: OBS_ID = 23592, HDU_TYPE = rad_max, HDU_CLASS = None\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"MapDataset\n",
"----------\n",
"\n",
" Name : YQkm5bSN \n",
"\n",
" Total counts : 2016 \n",
" Total background counts : 1866.72\n",
" Total excess counts : 149.28\n",
"\n",
" Predicted counts : 1866.72\n",
" Predicted background counts : 1866.72\n",
" Predicted excess counts : nan\n",
"\n",
" Exposure min : 1.19e+02 m2 s\n",
" Exposure max : 1.09e+09 m2 s\n",
"\n",
" Number of total bins : 110000 \n",
" Number of fit bins : 110000 \n",
"\n",
" Fit statistic type : cash\n",
" Fit statistic value (-2 log(L)) : nan\n",
"\n",
" Number of models : 0 \n",
" Number of parameters : 0\n",
" Number of free parameters : 0\n",
"\n",
"\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"