Generalized gaussian spatial model

This is a spatial model parametrising a generalized Gaussian function.

By default, the Generalized Gaussian is defined as :

\[\phi(\text{lon}, \text{lat}) = \phi(\text{r}) = N \times \exp \left[ - \left( \frac{r}{r_{\rm eff}} \right)^ \left( 1/\eta \right) \right] \,,\]

the normalization is expressed as:

\[N = \frac{1}{ 2 \pi \sqrt(1-e^2) r_{\rm eff}^2 \eta \Gamma(2\eta)}\,\]

where \(\Gamma\) is the gamma function. This analytical norm is approximated so it may not integrate to unity in extremal cases if ellipticity tend to one and radius is large or \(\eta\) much larger than one (outside the default range).

Example plot

Here is an example plot of the model for different shape parameter:

from astropy import units as u
import matplotlib.pyplot as plt
from gammapy.maps import Map, WcsGeom
from gammapy.modeling.models import (
    GeneralizedGaussianSpatialModel,
    Models,
    PowerLawSpectralModel,
    SkyModel,
)

lon_0 = 20
lat_0 = 0
reval = 3
dr = 0.02
geom = WcsGeom.create(
    skydir=(lon_0, lat_0), binsz=dr, width=(2 * reval, 2 * reval), frame="galactic",
)

tags = [r"Disk, $\eta=0.01$", r"Gaussian, $\eta=0.5$", r"Laplace, $\eta=1$"]
eta_range = [0.01, 0.5, 1]
r_0 = 1
e = 0.5
phi = 45 * u.deg
fig, axes = plt.subplots(1, 3, figsize=(9, 6))
for ax, eta, tag in zip(axes, eta_range, tags):
    model = GeneralizedGaussianSpatialModel(
        lon_0=lon_0 * u.deg,
        lat_0=lat_0 * u.deg,
        eta=eta,
        r_0=r_0 * u.deg,
        e=e,
        phi=phi,
        frame="galactic",
    )
    meval = model.evaluate_geom(geom)
    Map.from_geom(geom=geom, data=meval.value, unit=meval.unit).plot(ax=ax)
    pixreg = model.to_region().to_pixel(geom.wcs)
    pixreg.plot(ax=ax, edgecolor="g", facecolor="none", lw=2)
    ax.set_title(tag)
    ax.set_xticks([])
    ax.set_yticks([])
plt.tight_layout()
Disk, $\eta=0.01$, Gaussian, $\eta=0.5$, Laplace, $\eta=1$

YAML representation

Here is an example YAML file using the model:

pwl = PowerLawSpectralModel()
gengauss = GeneralizedGaussianSpatialModel()

model = SkyModel(spectral_model=pwl, spatial_model=gengauss, name="pwl-gengauss-model")
models = Models([model])

print(models.to_yaml())

Out:

components:
-   name: pwl-gengauss-model
    type: SkyModel
    spectral:
        type: PowerLawSpectralModel
        parameters:
        -   name: index
            value: 2.0
            interp: lin
        -   name: amplitude
            value: 1.0e-12
            unit: cm-2 s-1 TeV-1
            interp: log
            scale_method: scale10
        -   name: reference
            value: 1.0
            unit: TeV
            frozen: true
            interp: lin
    spatial:
        type: GeneralizedGaussianSpatialModel
        frame: icrs
        parameters:
        -   name: lon_0
            value: 0.0
            unit: deg
            interp: lin
        -   name: lat_0
            value: 0.0
            unit: deg
            interp: lin
        -   name: r_0
            value: 1.0
            unit: deg
            interp: lin
        -   name: eta
            value: 0.5
            interp: lin
        -   name: e
            value: 0.0
            frozen: true
            interp: lin
        -   name: phi
            value: 0.0
            unit: deg
            frozen: true
            interp: lin

Gallery generated by Sphinx-Gallery