Source code for gammapy_plugin.utils.astromodels_functions
import logging
import astropy.units as u
import numpy as np
from astromodels.functions.function import Function1D, FunctionMeta
log = logging.getLogger(__name__)
[docs]
class Log_parabola_gammapy(Function1D, metaclass=FunctionMeta):
r"""
description :
A log-parabolic function, same parametrization as Gammapy
latex :
$K\left(\frac{x}{piv}\right)^{-\alpha-\beta\log{\left(\frac{x}{piv}\right)}}$
parameters :
K :
desc : Normalization
initial value : 1e-11
is_normalization : True
transformation : log10
min : 1e-30
max : 1e5
piv :
desc : Pivot (keep this fixed)
initial value : 1
fix : yes
alpha :
desc : index
initial value : 2.0
beta :
desc : curvature
initial value : 1.0
"""
def _set_units(self, x_unit, y_unit):
# K has units of y
self.K.unit = y_unit
# piv has the same dimension as x
self.piv.unit = x_unit
# alpha and beta are dimensionless
self.alpha.unit = u.dimensionless_unscaled
self.beta.unit = u.dimensionless_unscaled
[docs]
def evaluate(self, x, K, piv, alpha, beta):
# print("Receiving %s" % ([K, piv, alpha, beta]))
xx = np.divide(x, piv)
return K * np.power(xx, (-alpha - beta * np.log(xx)))
[docs]
class Exp_cutoff_powerlaw_gammapy(Function1D, metaclass=FunctionMeta):
r"""
description :
A exp cutoff function.
latex :
$K\left(\frac{x}{piv}\right)^{-index}\exp{-(\lambda x)^\alpha}$
parameters :
K :
desc : Normalization
initial value : 1e-11
is_normalization : True
transformation : log10
min : 1e-30
max : 1e5
piv :
desc : Pivot (keep this fixed)
initial value : 1
fix : yes
index :
desc : index
initial value : 2.0
lambda_ :
desc : curvature (= 1/xc)
initial value : 0.1
alpha :
desc : alpha
initial value : 1
fix : yes
"""
def _set_units(self, x_unit, y_unit):
# K has units of y
self.K.unit = y_unit
# piv has the same dimension as x
self.piv.unit = x_unit
# alpha and beta are dimensionless
self.alpha.unit = u.dimensionless_unscaled
self.lambda_.unit = 1 / x_unit
self.index.unit = u.dimensionless_unscaled
[docs]
def evaluate(self, x, K, piv, index, lambda_, alpha):
# print("Receiving %s" % ([K, piv, alpha, beta]))
xx = np.divide(x, piv)
xy = np.multiply(x, lambda_)
return K * np.power(xx, -index) * np.exp(-np.power(xy, alpha))