Source code for hierarc.Likelihood.transformed_cosmography

__author__ = "sibirrer"
import numpy as np


[docs] class TransformedCosmography(object): """Class to manage hierarchical hyper-parameter that impact the cosmographic posterior interpretation of individual lenses.""" def __init__(self, z_lens, z_source): """ :param z_lens: lens redshift :param z_source: source redshift """ self._z_lens = z_lens self._z_source = z_source
[docs] def displace_prediction( self, ddt, dd, gamma_ppn=1, lambda_mst=1, kappa_ext=0, mag_source=0 ): """Here we effectively change the posteriors of the lens, but rather than changing the instance of the KDE we displace the predicted angular diameter distances in the opposite direction The displacements form different effects are multiplicative and thus invariant under the order those displacements are applied. :param ddt: time-delay distance :param dd: angular diameter distance to the deflector :param lambda_mst: overall global mass-sheet transform applied on the sample, lambda_mst=1 corresponds to the input model :param gamma_ppn: post-newtonian gravity parameter (=1 is GR) :param kappa_ext: external convergence to be added on top of the D_dt posterior :param mag_source: source magnitude (attention, log scale, thus transform needs to be changed!) :returns: ddt, dd, mag_source """ ddt_, dd_ = self._displace_ppn(ddt, dd, gamma_ppn=gamma_ppn) # TODO scale source with ds, make sure definition is either linear or magnitudes (log) consistently ddt_, dd_, mag_source_ = self._displace_lambda_mst( ddt_, dd_, lambda_mst=lambda_mst, kappa_ext=kappa_ext, mag_source=mag_source ) return ddt_, dd_, mag_source_
@staticmethod def _displace_ppn(ddt, dd, gamma_ppn=1): """Post-Newtonian parameter sampling. The deflection terms remain the same as those are measured by lensing. The dynamical term changes and affects the kinematic prediction and thus dd. :param ddt: time-delay distance :param dd: angular diameter distance to the deflector :param gamma_ppn: post-newtonian gravity parameter (=1 is GR) :return: ddt_, dd_ """ dd_ = dd * (1 + gamma_ppn) / 2.0 return ddt, dd_ @staticmethod def _displace_kappa_ext(ddt, dd, kappa_ext=0): """Assumes an additional mass-sheet of kappa_ext is present at the lens LOS (effectively mimicing an overall selection bias in the lenses that is not visible in the individual LOS analyses of the lenses. This is speculative and should only be considered if there are specific reasons why the current LOS analysis is insufficient. :param ddt: time-delay distance :param dd: angular diameter distance to the deflector :param kappa_ext: external convergence to be added on top of the D_dt posterior :return: ddt_, dd_ """ ddt_ = ddt * (1.0 - kappa_ext) return ddt_, dd @staticmethod def _displace_lambda_mst(ddt, dd, lambda_mst=1, kappa_ext=0, mag_source=0): """Approximate internal mass-sheet transform on top of the assumed profiles inferred in the analysis of the individual lenses. The effect is to first order the same as for a pure mass sheet as a kappa_ext term. However the change here affects the 3-dimensional mass profile and thus the kinematics predictions is affected. We showed that for a set of profiles, the kinematics of a 3-d approximate mass sheet can still be very well approximated as d sigma_v_lambda**2 /d lambda = lambda * sigma_v0 :param ddt: time-delay distance :param dd: angular diameter distance to the deflector :param lambda_mst: overall global mass-sheet transform applied on the sample, lambda_mst = 1 corresponds to the input model, 0.9 corresponds to a positive mass sheet of 0.1 :param kappa_ext: external convergence to be added on top of the D_dt posterior kappa_ext = 1 - lambda_mst :param mag_source: source magnitude (-2.5 log10 base) :return: ddt_, dd_, mag_source """ lambda_tot = lambda_mst * (1 - kappa_ext) # combine internal and external MST lambda_tot = np.maximum( lambda_tot, 0.0001 ) # lambda can not get negative and zero is leading to infinite magnitudes ddt_ = ( ddt * lambda_tot ) # the actual posteriors needed to be corrected by Ddt_true = Ddt_mst / (1-kappa_ext) # this line can be changed in case the physical 3-d approximation of the chosen profile does scale differently with the kinematics sigma_v2_scaling = lambda_mst dd_ = ( dd * sigma_v2_scaling / lambda_mst ) # the kinematics constrain Dd/Dds and thus the constraints on Dd is not affected by lambda # amp_source_ = amp_source / lambda_tot ** 2 # inverse MST transform of magnification mag_source_ = mag_source + 5 * np.log10( lambda_tot ) # inverse MST transform of magnification in magnitude return ddt_, dd_, mag_source_