# 0.18 (Nov 4th, 2020)#

## Summary#

Released November 4, 2020

15 contributors

160 pull requests (not all listed below)

## What’s new?#

Gammapy v0.18 comes with many new features, further unified API, bug fixes and improved performance.

For Gammapy v0.18 the handling of the instrumental background was refactored
by introducing a `FoVBackgroundModel`

which is specific to each `MapDataset`

.
Instead of relying on the previous `BackgroundModel`

, which coupled
the map template and spectral parameters, the information is now split such that
`MapDataset.background`

contains the map template and the `FoVBackgroundModel`

the corresponding parameters, respectively. The model corrected background can now be
accessed via `MapDataset.npred_background()`

. By default the un-corrected
background map is now added to the predicted counts. The consistent behaviour
has been implemented on the `MapDatasetOnOff`

.

The `FoVBackgroundModel`

has support for a `spectral_model`

argument, which
allows different background corrections using different “norm” spectral models
(see below).

The definition of the quantities defined on `MapDataset`

and `MapDatasetOnOff`

as well as the corresponding attributes on the `CountsStatistics`

has been
improved in the stats definition table Notations.

Many additional methods to modify the data have been added to the `MapDataset`

and `SpectrumDataset`

. This includes `.downsample()`

, `.pad()`

,
`.resample_energy_axis()`

, `.slice_by_energy()`

`.slice_by_idx()`

.
The models definition in the dataset is now reset consistently in all of the
listed methods. The information returned by `.info_dict()`

has been
unified. The information contained in `.meta_table`

is now handled correctly
during stacking of datasets.

Following the proposal in PIG 21 Gammapy v0.18 comes with many improvements
to the `gammapy.modeling.models`

sub-package. This includes the introduction
of “norm” spectral models, which are multiplicative models to used with spatial
and spectral template or parametric models. Among those are a
`PowerLawNormSpectralModel`

, `LogParabolaNormSpectralModel`

and
`PiecewiseNormSectralModel`

. The EBL absorption was refactored
accordingly to an `EBLAbsorptionNormSpectralModel`

. A new
`GeneralizedGaussianSpatialModel`

and `BrokenPowerlawSpectralModel`

have been introduced.

Gammapy v0.18 comes now with support for custom energy dependent spatial models.
An example for this can be found in the models tutorial.
The `SkyDiffuseCube`

has been removed, the same functionality can now be
achieved with the `TemplateSpatialModel`

. Following the proposal in
PIG 21, short YAML tags were introduced for all models. An overview of the
tags can be found in a table in the linked PIG document.

For Gammapy v0.18 the stacking behaviour of the `EDispKernelMap`

was fixed.
it now handles safe energy threshold for stacked analyses correctly.
The `MapDataset.edisp`

attribute has been changed to this class by default.
The `IRFStacker`

class has been removed.

The `Estimator``

API has been homogenized, in particular, they now support
the definition of energy edges on init. This means light-curves, excess maps,
excess profiles and ts maps can be computed in energy bins with the same API.
The `LightCurveEstimator`

was refactored to rely on the same algorithm
as the `FluxPointsEstimator`

. It now also fits the data in the provided
energy range.

The `Map`

class now supports boolean and comparator operations, such as
`>,<,&,|`

etc. . A convenience `Map.interp_to_geom()`

has been added.

A `Fit.stat_surface()`

method was introduced which allows to compute a
fit statistic surface. In addition an option to store the trace of the fit was
added. Both are demonstrated in dedicated sections in the
modeling and fitting tutorial.

Following the proposal in PIG 19, the `gammapy.time`

sub-package was removed.
All functionality related to light curves can be found in `gammapy.estimators`

.
The Feldman-Cousins method has been removed from the `gammapy.stats`

.

Gammapy v0.18 comes with an improved performance related to caching the computation of predicted counts and caching of psf convolution. In Gammapy v0.18 the support for Numpy<1.17 had been dropped.

## Contributors#

In alphabetical order by first name:

Alexis de Almeida Coutinho

Atreyee Sinha

Axel Donath

Bruno Khelifi

Cosimo Nigro

Fabio Acero

Fabio Pintore

Jalel Hajlaoui

José Enrique Ruiz

Laura Olivera Nieto

Lea Jouvin

Luca Giunti

Max Noethe

Quentin Remy

Régis Terrier

## Pull requests#

This list is incomplete. Small improvements and bug fixes are not listed here.

See the complete Gammapy v0.18 merged pull requests list on GitHub.

[#3106] Remove default FoVBackgroundModel (Axel Donath)

[#3100] Simplify EBL absorption spectral model (Quentin Remy)

[#3092] Update energy naming convention (Fabio Pintore)

[#3091] Implement Dataset.slice_by_energy (Axel Donath)

[#3089] Introduce DatasetModels class and global model (Axel Donath)

[#3088] Allowing Estimators norm parameter to be negative (Régis Terrier)

[#3086] Stats background convention (Axel Donath)

[#3085] Remove feldman cousins method (Axel Donath)

[#3083] Example of energy dependent spatial model (Atreyee Sinha)

[#3081] Unify axis ordering in gammapy.irf (Atreyee Sinha)

[#3080] Remove significance and replace with sqrt_ts (Régis Terrier)

[#3076] Introduce MapDataset.geoms property (Axel Donath)

[#3074] Implement option to store fit trace to Fit (Axel Donath)

[#3072] Allow to apply PSF in reconstructed energy (Axel Donath)

[#3070] Remove intervals option from integrate_spectrum() (Axel Donath)

[#3069] Remove pre-processing from Fermi tutorial (Axel Donath)

[#3063] Add PiecewiseNormSpectralModel (Quentin Remy)

[#3060] Remove code duplication between MapDataset and SpectrumDataset (Axel Donath)

[#3058] Clean up MapDataset mask handling (Axel Donath)

[#3054] Unify dataset info dicts (Axel Donath)

[#3053] Add bkg systematics condition for the sensitivity computation (Bruno Khelifi)

[#3052] Adapt LightCurveEstimator to take energy edges (Régis Terrier)

[#3051] Introduce dataset specific FoVBackgroundModel (Axel Donath)

[#3045] Add temporal models to model gallery (Jalel Hajlaoui)

[#3042] Refactor SpectrumDataset to use exposure (Axel Donath)

[#3041] Add SpectralModel.integral_error (Fabio Pintore)

[#3039] Use MapAxis in gammapy.irf consistently (Axel Donath)

[#3038] Implement Fit.stat_surface() method (Luca Giunti)

[#3037] Add generalized gaussian model (Quentin Remy)

[#3035] Update Numpy to 1.17 (Axel Donath)

[#3032] Introduce MapAxes object (Axel Donath)

[#3030] Fix inconsistency between EventList.stack() and GTI.stack() (Laura Olivera Nieto)

[#3012] Replace SkyDiffuseCube by TemplateSpatialModel (Quentin Remy)

[#3007] Support Map based IRFs in MapDatasetMaker (Laura Olivera Nieto)

[#3005] Allow custom spectral models corrections for BackgroundModel (Quentin Remy)

[#3002] Implement PSFMap.from_gaussian (Laura Olivera Nieto)

[#3001] Improve the datasets plot/peek interface (Alexis de Almeida Coutinho)

[#2999] Add e_edges to AsmoothMapEstimator (Axel Donath)

[#2998] Add e_edges to ExcessMapEstimator (Régis Terrier)

[#2993] Reuse FluxPointsEstimator in LightCurveEstimator (Axel Donath)

[#2992] Implement WcsNDMap.to_region_nd_map() (Axel Donath)

[#2991] Implement energy slicing for FluxPointsEstimator (Axel Donath)

[#2990] Optional exposure map for the EdispMap and PSF in the MapDataset (Laura Olivera Nieto)

[#2984] Change SpectrumDataset.aeff to RegionNDMap (Axel Donath)

[#2981] Add basic NormSpectralModels (Quentin Remy)

[#2976] Fix filename handling in read/write methods (Alexis de Almeida Coutinho)

[#2974] Implement meta table stacking (Axel Donath)

[#2967] Allow for varying energy range between datasets in FluxPointEstimator (Axel Donath)

[#2966] Implement MapDataset.slice_by_idx (Axel Donath)

[#2965] Add Map.to_cube() (Atreyee Sinha)

[#2956] Implement MapDataset.downsample() and MapDataset.pad() (Axel Donath)

[#2951] Implement Map.resample_axis() method (Axel Donath)

[#2950] Remove IRFStacker class (Axel Donath)

[#2948] Add ExcessProfileEstimator class (Bruno Khelifi)

[#2947] Improve spectral residuals plot (Luca Giunti)

[#2945] PSF-convolved spatial model caching in MapEvaluator (Quentin Remy)

[#2944] PIG 21 - Model framework improvements (Axel Donath)

[#2943] Add BrokenPowerLawSpectralModel (Quentin Remy)

[#2939] Add theta squared plot example (Léa Jouvin)

[#2938] Add shorter tags for models (Quentin Remy)

[#2932] Fix plot_spectrum_datasets_off_regions and add more options (Alexis de Almeida Coutinho)

[#2931] Remove gammapy.time sub-package (Axel Donath)

[#2929] Add meta_table to SpectrumDataset (Fabio Pintore)

[#2927] Introduce Maker and Estimator base classes and registries (Axel Donath)

[#2924] Add meta_table to MapDataset (Fabio Pintore)

[#2912] Cache npred in MapEvaluator (Quentin Remy)

[#2907] Add info_dict to MapDataset (Atreyee Sinha)

[#2903] Add multi-dimension support for RegionGeom (Régis Terrier)

[#2897] Change to EDispKernelMap in MapDataset (Régis Terrier)

[#2896] Add pyproject.toml (Max Noethe)

[#2891] Modify SpectrumDataset.create() to take MapAxis arguments (Régis Terrier)

[#2885] Add comparators on Map (Régis Terrier)

[#2874] Fix IRFMap stacking (Régis Terrier)

[#2872] Fix MCMC position spread (Fabio Acero)