Source code for lenstronomy.LightModel.Profiles.power_law
import lenstronomy.Util.param_util as param_util
from lenstronomy.LensModel.Profiles.spp import SPP
import numpy as np
import scipy.special as special
__all__ = ["PowerLaw"]
[docs]
class PowerLaw(object):
"""Class for power-law elliptical light distribution."""
param_names = ["amp", "gamma", "e1", "e2", "center_x", "center_y"]
lower_limit_default = {
"amp": 0,
"gamma": 1,
"e1": -0.5,
"e2": -0.5,
"center_x": -100,
"center_y": -100,
}
upper_limit_default = {
"amp": 100,
"gamma": 3,
"e1": 0.5,
"e2": 0.5,
"center_x": 100,
"center_y": 100,
}
[docs]
def __init__(self):
self.lens = SPP()
[docs]
def function(self, x, y, amp, gamma, e1, e2, center_x=0, center_y=0):
"""
:param x: ra-coordinate
:param y: dec-coordinate
:param amp: amplitude of flux
:param gamma: projected power-law slope
:param e1: ellipticity
:param e2: ellipticity
:param center_x: center
:param center_y: center
:return: projected flux
"""
x_, y_ = param_util.transform_e1e2_product_average(
x, y, e1, e2, center_x, center_y
)
_s = 0.0001
a = x_**2 + y_**2 + _s**2
sigma = amp * a ** ((1.0 - gamma) / 2.0)
return sigma
[docs]
def light_3d(self, r, amp, gamma, e1=0, e2=0):
"""
:param r:
:param amp:
:param gamma:
:param e1:
:param e2:
:return:
"""
rho0 = self._amp2rho(amp, gamma)
rho = rho0 / r**gamma
return rho
@staticmethod
def _amp2rho(amp, gamma):
"""
:param amp:
:param gamma:
:return:
"""
factor = (
np.sqrt(np.pi)
* special.gamma(1.0 / 2 * (-1 + gamma))
/ special.gamma(gamma / 2.0)
)
return amp / factor