Source code for hierarc.LensPosterior.kin_scaling_config
import numpy as np
from hierarc.Likelihood.kin_scaling import KinScalingParamManager
[docs]
class KinScalingConfig(KinScalingParamManager):
"""Class to manage the anisotropy model and parameters for the Posterior
processing."""
def __init__(
self,
anisotropy_model,
r_eff,
gamma_in_scaling=None,
log_m2l_scaling=None,
gamma_pl_scaling=None,
gamma_pl_mean=None,
):
"""
:param anisotropy_model: type of stellar anisotropy model. Supported are 'OM' and 'GOM' or 'const',
see details in lenstronomy.Galkin module
:param r_eff: half-light radius of the deflector galaxy
:param gamma_in_scaling: array of gamma_in parameter to be interpolated (optional, otherwise None)
:param log_m2l_scaling: array of log_m2l parameter to be interpolated (optional, otherwise None)
:param gamma_pl_scaling: array of power-law density profile slopes to be interpolated (optional, otherwise None)
:param gamma_pl_mean: mean gamma_pl upon which the covariances are calculated
"""
self._r_eff = r_eff
self._anisotropy_model = anisotropy_model
self._param_name_list = []
if self._anisotropy_model == "OM":
self._ani_param_array = [np.array([0.1, 0.2, 0.5, 1, 2, 5])]
# used for r_ani OsipkovMerritt anisotropy description
self._param_name_list = ["a_ani"]
elif self._anisotropy_model == "GOM":
self._ani_param_array = [
np.array([0.1, 0.2, 0.5, 1, 2, 5]),
np.array([0, 0.5, 0.8, 1]),
]
self._param_name_list = ["a_ani", "beta_inf"]
elif self._anisotropy_model == "const":
self._ani_param_array = [
np.linspace(-0.49, 1, 7)
] # used for constant anisotropy description
self._param_name_list = ["a_ani"]
elif self._anisotropy_model == "NONE":
self._param_name_list = []
else:
raise ValueError(
"anisotropy model %s not supported." % self._anisotropy_model
)
self._gamma_in_scaling = gamma_in_scaling
self._log_m2l_scaling = log_m2l_scaling
self._gamma_pl_scaling = gamma_pl_scaling
self._gamma_pl_mean = gamma_pl_mean
if gamma_in_scaling is not None:
self._param_name_list.append("gamma_in")
self._ani_param_array.append(np.array(gamma_in_scaling))
if log_m2l_scaling is not None:
self._param_name_list.append("log_m2l")
self._ani_param_array.append(np.array(log_m2l_scaling))
if gamma_pl_scaling is not None:
self._param_name_list.append("gamma_pl")
self._ani_param_array.append(np.array(gamma_pl_scaling))
KinScalingParamManager.__init__(
self, j_kin_scaling_param_name_list=self._param_name_list
)
@property
def kwargs_anisotropy_base(self):
"""
:return: keyword arguments of base anisotropy model configuration
"""
if self._anisotropy_model == "OM":
a_ani_0 = 1
r_ani = a_ani_0 * self._r_eff
kwargs_anisotropy_0 = {"r_ani": r_ani}
elif self._anisotropy_model == "GOM":
a_ani_0 = 1
r_ani = a_ani_0 * self._r_eff
beta_inf_0 = 1
kwargs_anisotropy_0 = {"r_ani": r_ani, "beta_inf": beta_inf_0}
elif self._anisotropy_model == "const":
a_ani_0 = 0.1
kwargs_anisotropy_0 = {"beta": a_ani_0}
else:
raise ValueError(
"anisotropy model %s not supported." % self._anisotropy_model
)
return kwargs_anisotropy_0
@property
def kwargs_lens_base(self):
"""
:return: keyword arguments of lens model parameters that are getting interpolated
"""
kwargs_base = {}
if "gamma_in" in self._param_name_list:
kwargs_base["gamma_in"] = np.mean(self._gamma_in_scaling)
if "log_m2l" in self._param_name_list:
kwargs_base["log_m2l"] = np.mean(self._log_m2l_scaling)
if "gamma_pl" in self._param_name_list:
kwargs_base["gamma_pl"] = self._gamma_pl_mean
return kwargs_base
@property
def kin_scaling_param_array(self):
"""
:return: numpy array of kinematic scaling parameter values to be explored, list of 1D arrays
"""
return self._ani_param_array
@property
def param_name_list(self):
"""List of parameters in same order as interpolated.
:return:
"""
return self._param_name_list
[docs]
def anisotropy_kwargs(self, a_ani=None, beta_inf=None):
"""
:param a_ani: anisotropy parameter
:param beta_inf: anisotropy at infinity (only used for 'GOM' model)
:return: list of anisotropy keyword arguments for GalKin module
"""
if self._anisotropy_model == "OM":
r_ani = a_ani * self._r_eff
kwargs_anisotropy = {"r_ani": r_ani}
elif self._anisotropy_model == "GOM":
r_ani = a_ani * self._r_eff
kwargs_anisotropy = {"r_ani": r_ani, "beta_inf": beta_inf}
elif self._anisotropy_model == "const":
kwargs_anisotropy = {"beta": a_ani}
else:
raise ValueError(
"anisotropy model %s not supported." % self._anisotropy_model
)
return kwargs_anisotropy