diagonal_cosmo_bnn_prior.py
import numpy as np
from lenstronomy.Analysis.td_cosmography import TDCosmography
from .diagonal_bnn_prior import DiagonalBNNPrior
from .base_cosmo_bnn_prior import BaseCosmoBNNPrior
import baobab.sim_utils.kinematics_utils as kinematics_utils
class DiagonalCosmoBNNPrior(DiagonalBNNPrior, BaseCosmoBNNPrior):
"""BNN prior with independent parameters
Note
----
This BNNPrior is cosmology-aware. For a version that's not tailored to H0 inference, see `DiagonalBNNPrior`.
"""
def __init__(self, bnn_omega, components, kwargs_lens_eqn_solver={}):
"""
Note
----
The dictionary attributes are copies of the config corresponding to each component.
The number of attributes depends on the number of components.
Attributes
----------
bnn_omega : dict
copy of `cfg.bnn_omega`
components : list
list of components, e.g. `lens_mass`
"""
DiagonalBNNPrior.__init__(self, bnn_omega, components)
BaseCosmoBNNPrior.__init__(self, bnn_omega)
self.params_to_exclude = []
self.set_params_list(self.params_to_exclude)
self.set_comps_qphi_to_e1e2()
if self.kinematics.calculate_vel_disp or self.time_delays.calculate_time_delays:
self.get_cosmography_observables = True
else:
self.get_cosmography_observables = False
self.get_velocity_dispersion = getattr(kinematics_utils, 'velocity_dispersion_analytic') if self.kinematics.anisotropy_model == 'analytic' else getattr(kinematics_utils, 'velocity_dispersion_numerical')
self.kwargs_lens_eqn_solver = kwargs_lens_eqn_solver
def get_cosmo_observables(self, kwargs, z_lens, z_src, kappa_ext):
"""Calculate the central estimates of the observables for cosmography, i.e. the velocity dispersion and time delays, with and without noise realization
Parameters
----------
kwargs : dict
the realized kwargs
z_lens : float
z_src : float
kappa_ext : float
Returns
-------
dict
the computed central estimates of velocity dispersion and time delays with and without noise realization
"""
td_cosmo = TDCosmography(z_lens, z_src, self.kwargs_model, cosmo_fiducial=self.cosmo, kwargs_lens_eqn_solver=self.kwargs_lens_eqn_solver)
kwargs_lens_mass = dict(
theta_E=kwargs['lens_mass']['theta_E'],
gamma=kwargs['lens_mass']['gamma'],
center_x=kwargs['lens_mass']['center_x'],
center_y=kwargs['lens_mass']['center_y'],
e1=kwargs['lens_mass']['e1'],
e2=kwargs['lens_mass']['e2'],
)
kwargs_ext_shear = dict(
gamma_ext=kwargs['external_shear']['gamma_ext'],
psi_ext=kwargs['external_shear']['psi_ext'],
ra_0=kwargs['external_shear']['ra_0'],
dec_0=kwargs['external_shear']['dec_0'],
)
kwargs_lens = [kwargs_lens_mass, kwargs_ext_shear] # FIXME: hardcoded for SPEMD
kwargs_lens_light = [kwargs['lens_light']]
kwargs_ps = [dict(ra_source=kwargs['src_light']['center_x'],
dec_source=kwargs['src_light']['center_y'])]
# Time delays
if self.time_delays.calculate_time_delays:
true_td, x_image, y_image = td_cosmo.time_delays(kwargs_lens, kwargs_ps, kappa_ext=kappa_ext)
else:
true_td = -1
# Velocity dispersion
if self.kinematics.calculate_vel_disp:
true_vd = self.get_velocity_dispersion(
td_cosmo,
kwargs_lens,
kwargs_lens_light,
self.kinematics.kwargs_anisotropy,
self.kinematics.kwargs_aperture,
self.kinematics.kwargs_psf,
self.kinematics.anisotropy_model,
kwargs['lens_light']['R_sersic'],
self.kinematics.kwargs_numerics,
kappa_ext,
)
else:
true_vd = -1
obs = dict(true_td=true_td.tolist(),
true_vd=true_vd,
x_image=x_image,
y_image=y_image
)
return obs
def sample(self):
kwargs = DiagonalBNNPrior.sample(self)
H0 = self.cosmology.H0
z_lens, z_src = self.sample_redshifts(self.redshift.copy())
kappa_ext = self.sample_param(self.LOS.kappa_ext.copy())
kwargs['misc'] = dict(
z_lens=z_lens,
z_src=z_src,
kappa_ext=kappa_ext,
H0=H0,
)
if self.get_cosmography_observables:
cosmo_obs = self.get_cosmo_observables(kwargs, z_lens, z_src, kappa_ext)
kwargs['misc'].update(cosmo_obs)
return kwargs