TableModel

class gammapy.spectrum.models.TableModel(energy, values, norm=1, values_scale='log', interp_kwargs=None, meta=None)[source]

Bases: gammapy.spectrum.models.SpectralModel

A model generated from a table of energy and value arrays.

the units returned will be the units of the values array provided at initialization. The model will return values interpolated in log-space, returning 0 for energies outside of the limits of the provided energy array.

Class implementation follows closely what has been done in naima.models.TableModel

Parameters:
energy : Quantity array

Array of energies at which the model values are given

values : array

Array with the values of the model at energies energy.

norm : float

Model scale that is multiplied to the supplied arrays. Defaults to 1.

values_scale : {‘log’, ‘lin’, ‘sqrt’}

Interpolation scaling applied to values. If the values vary over many magnitudes a ‘log’ scaling is recommended.

interp_kwargs : dict

Interpolation keyword arguments pass to scipy.interpolate.interp1d. By default all values outside the interpolation range are set to zero. If you want to apply linear extrapolation you can pass interp_kwargs={'fill_value': 'extrapolate', 'kind': 'linear'}

meta : dict, optional

Meta information, meta[‘filename’] will be used for serialization

Attributes Summary

energy
meta
norm
parameters Parameters (Parameters)
values

Methods Summary

__call__(self, energy) Call self as a function.
copy(self) A deep copy.
energy_flux(self, emin, emax, \*\*kwargs) Compute energy flux in given energy range.
energy_flux_error(self, emin, emax, \*\*kwargs) Compute energy flux in given energy range with error propagation.
evaluate(self, energy, norm) Evaluate the model (static function).
evaluate_error(self, energy) Evaluate spectral model with error propagation.
from_dict(data) Create from dict.
integral(self, emin, emax, \*\*kwargs) Integrate spectral model numerically.
integral_error(self, emin, emax, \*\*kwargs) Integrate spectral model numerically with error propagation.
inverse(self, value[, emin, emax]) Return energy for a given function value of the spectral model.
plot(self, energy_range[, ax, energy_unit, …]) Plot spectral model curve.
plot_error(self, energy_range[, ax, …]) Plot spectral model error band.
read_fermi_isotropic_model(filename, \*\*kwargs) Read Fermi isotropic diffuse model.
read_xspec_model(filename, param, \*\*kwargs) Read XSPEC table model.
spectral_index(self, energy[, epsilon]) Compute spectral index at given energy.
to_dict(self[, selection])

Attributes Documentation

energy
meta
norm
parameters

Parameters (Parameters)

values

Methods Documentation

__call__(self, energy)

Call self as a function.

copy(self)

A deep copy.

energy_flux(self, emin, emax, **kwargs)

Compute energy flux in given energy range.

\[G(E_{min}, E_{max}) = \int_{E_{min}}^{E_{max}} E \phi(E) dE\]
Parameters:
emin, emax : Quantity

Lower and upper bound of integration range.

**kwargs : dict

Keyword arguments passed to func:integrate_spectrum

energy_flux_error(self, emin, emax, **kwargs)

Compute energy flux in given energy range with error propagation.

\[G(E_{min}, E_{max}) = \int_{E_{min}}^{E_{max}} E \phi(E) dE\]
Parameters:
emin, emax : Quantity

Lower bound of integration range.

**kwargs : dict

Keyword arguments passed to integrate_spectrum()

Returns:
energy_flux, energy_flux_error : tuple of Quantity

Tuple of energy flux and energy flux error.

evaluate(self, energy, norm)[source]

Evaluate the model (static function).

evaluate_error(self, energy)

Evaluate spectral model with error propagation.

Parameters:
energy : Quantity

Energy at which to evaluate

Returns:
flux, flux_error : tuple of Quantity

Tuple of flux and flux error.

classmethod from_dict(data)

Create from dict.

integral(self, emin, emax, **kwargs)

Integrate spectral model numerically.

\[F(E_{min}, E_{max}) = \int_{E_{min}}^{E_{max}} \phi(E) dE\]

If array input for emin and emax is given you have to set intervals=True if you want the integral in each energy bin.

Parameters:
emin, emax : Quantity

Lower and upper bound of integration range.

**kwargs : dict

Keyword arguments passed to integrate_spectrum()

integral_error(self, emin, emax, **kwargs)

Integrate spectral model numerically with error propagation.

Parameters:
emin, emax : Quantity

Lower adn upper bound of integration range.

**kwargs : dict

Keyword arguments passed to func:integrate_spectrum

Returns:
integral, integral_error : tuple of Quantity

Tuple of integral flux and integral flux error.

inverse(self, value, emin=<Quantity 0.1 TeV>, emax=<Quantity 100. TeV>)

Return energy for a given function value of the spectral model.

Calls the scipy.optimize.brentq numerical root finding method.

Parameters:
value : Quantity

Function value of the spectral model.

emin : Quantity

Lower bracket value in case solution is not unique.

emax : Quantity

Upper bracket value in case solution is not unique.

Returns:
energy : Quantity

Energies at which the model has the given value.

plot(self, energy_range, ax=None, energy_unit='TeV', flux_unit='cm-2 s-1 TeV-1', energy_power=0, n_points=100, **kwargs)

Plot spectral model curve.

kwargs are forwarded to matplotlib.pyplot.plot

By default a log-log scaling of the axes is used, if you want to change the y axis scaling to linear you can use:

from gammapy.spectrum.models import ExponentialCutoffPowerLaw
from astropy import units as u

pwl = ExponentialCutoffPowerLaw()
ax = pwl.plot(energy_range=(0.1, 100) * u.TeV)
ax.set_yscale('linear')
Parameters:
ax : Axes, optional

Axis

energy_range : Quantity

Plot range

energy_unit : str, Unit, optional

Unit of the energy axis

flux_unit : str, Unit, optional

Unit of the flux axis

energy_power : int, optional

Power of energy to multiply flux axis with

n_points : int, optional

Number of evaluation nodes

Returns:
ax : Axes, optional

Axis

plot_error(self, energy_range, ax=None, energy_unit='TeV', flux_unit='cm-2 s-1 TeV-1', energy_power=0, n_points=100, **kwargs)

Plot spectral model error band.

Note

This method calls ax.set_yscale("log", nonposy='clip') and ax.set_xscale("log", nonposx='clip') to create a log-log representation. The additional argument nonposx='clip' avoids artefacts in the plot, when the error band extends to negative values (see also https://github.com/matplotlib/matplotlib/issues/8623).

When you call plt.loglog() or plt.semilogy() explicitely in your plotting code and the error band extends to negative values, it is not shown correctly. To circumvent this issue also use plt.loglog(nonposx='clip', nonposy='clip') or plt.semilogy(nonposy='clip').

Parameters:
ax : Axes, optional

Axis

energy_range : Quantity

Plot range

energy_unit : str, Unit, optional

Unit of the energy axis

flux_unit : str, Unit, optional

Unit of the flux axis

energy_power : int, optional

Power of energy to multiply flux axis with

n_points : int, optional

Number of evaluation nodes

**kwargs : dict

Keyword arguments forwarded to matplotlib.pyplot.fill_between

Returns:
ax : Axes, optional

Axis

classmethod read_fermi_isotropic_model(filename, **kwargs)[source]

Read Fermi isotropic diffuse model.

See LAT Background models

Parameters:
filename : str

filename

classmethod read_xspec_model(filename, param, **kwargs)[source]

Read XSPEC table model.

The input is a table containing absorbed values from a XSPEC model as a function of energy.

TODO: Format of the file should be described and discussed in https://gamma-astro-data-formats.readthedocs.io/en/latest/index.html

Parameters:
filename : str

File containing the XSPEC model

param : float

Model parameter value

Examples

Fill table from an EBL model (Franceschini, 2008)

>>> from gammapy.spectrum.models import TableModel
>>> filename = '$GAMMAPY_DATA/ebl/ebl_franceschini.fits.gz'
>>> table_model = TableModel.read_xspec_model(filename=filename, param=0.3)
spectral_index(self, energy, epsilon=1e-05)

Compute spectral index at given energy.

Parameters:
energy : Quantity

Energy at which to estimate the index

epsilon : float

Fractional energy increment to use for determining the spectral index.

Returns:
index : float

Estimated spectral index.

to_dict(self, selection='all')[source]