Source code for gammapy.cube.exposure
# Licensed under a 3-clause BSD style license - see LICENSE.rst
from __future__ import absolute_import, division, print_function, unicode_literals
from .core import SkyCube
__all__ = [
'make_exposure_cube',
'make_background_cube',
]
[docs]def make_exposure_cube(pointing,
livetime,
aeff,
ref_cube,
offset_max,
):
"""Calculate exposure cube.
Parameters
----------
pointing : `~astropy.coordinates.SkyCoord`
Pointing direction
livetime : `~astropy.units.Quantity`
Livetime
aeff : `~gammapy.irf.EffectiveAreaTable2D`
Effective area table
ref_cube : `~gammapy.cube.SkyCube`
Reference cube used to define geometry
offset_max : `~astropy.coordinates.Angle`
Maximum field of view offset.
Returns
-------
expcube : `~gammapy.cube.SkyCube`
Exposure cube (3D)
"""
coordinates = ref_cube.sky_image_ref.coordinates()
offset = coordinates.separation(pointing)
energy = ref_cube.energies()
exposure = aeff.data.evaluate(offset=offset, energy=energy)
exposure *= livetime
exposure[:, offset >= offset_max] = 0
return SkyCube(
data=exposure,
wcs=ref_cube.wcs,
energy_axis=ref_cube.energy_axis,
)
[docs]def make_background_cube(pointing,
obstime,
bkg,
ref_cube,
offset_max,
):
"""Calculate background predicted counts cube.
This function evaluates the background rate model on
a sky cube, and then multiplies with the cube bin size,
computed via `gammapy.cube.SkyCube.bin_size`, resulting
in a cube with values that contain predicted background
counts per bin.
Note that this method isn't very precise if the energy
bins are large. In that case you might consider implementing
a more precise method that integrates over energy (e.g. by
choosing a finer energy binning here and then to group
energy bins).
Parameters
----------
pointing : `~astropy.coordinates.SkyCoord`
Pointing direction
obstime : `~astropy.units.Quantity`
Observation time
bkg : `~gammapy.irf.Background3D`
Background rate model
ref_cube : `~gammapy.cube.SkyCube`
Reference cube used to define geometry
offset_max : `~astropy.coordinates.Angle`
Maximum field of view offset.
Returns
-------
background : `~gammapy.cube.SkyCube`
Background predicted counts sky cube
"""
coordinates = ref_cube.sky_image_ref.coordinates()
offset = coordinates.separation(pointing)
energy = ref_cube.energies()
# TODO: properly transform FOV to sky coordinates
# For now we assume the background is radially symmetric
data = bkg.data.evaluate(detx=offset, dety='0 deg', energy=energy)
data *= obstime * ref_cube.bin_size
data[:, offset >= offset_max] = 0
data = data.to('')
return SkyCube(
name='bkg',
data=data,
wcs=ref_cube.wcs,
energy_axis=ref_cube.energy_axis,
)
def make_exposure_cube_obs(obs, ref_cube=None):
"""Make exposure cube for a given observation.
Parameters
----------
obs : `gammapy.data.Observation`
Observation
ref_cube : `~gammapy.data.SkyCube`
Reference cube used to define geometry
Returns
-------
expcube : `~gammapy.data.SkyCube`
3D exposure
"""
# TODO: the observation class still needs to be implemented first!
raise NotImplemented
if not ref_cube:
ref_cube = obs.ref_cube
return make_exposure_cube(obs.pointing, obs.livetime, obs.irfs.aeff2d, ref_cube)