def test_PJaffa_density_deflection(self): """ tests whether the unit conversion between the lensing parameter 'sigma0' and the units in the density profile are ok :return: """ from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe as Model lensModel = Model() sigma0 = 1. Ra = 0.2 Rs = 2. rho0 = lensModel.sigma2rho(sigma0, Ra, Rs) kwargs_lens = { 'sigma0': sigma0, 'Ra': Ra, 'Rs': Rs, 'center_x': 0, 'center_y': 0 } kwargs_density = {'rho0': rho0, 'Ra': Ra, 'Rs': Rs} r = 1. mass_2d = lensModel.mass_2d(r, **kwargs_density) alpha_mass = mass_2d / r alpha_r, _ = lensModel.derivatives(r, 0, **kwargs_lens) npt.assert_almost_equal(alpha_mass / np.pi, alpha_r, decimal=5)
def __init__(self, mass, x, y, r3d, mdef, z, sub_flag, lens_cosmo_instance, args, unique_tag): """ See documentation in base class (Halos/halo_base.py) """ self._lens_cosmo = lens_cosmo_instance self._prof = PJaffe() super(PJaffeSubhalo, self).__init__(mass, x, y, r3d, mdef, z, sub_flag, lens_cosmo_instance, args, unique_tag)
class PJaffe(object): """ class for pseudo Jaffe lens light (2d projected light/mass distribution) """ param_names = ['amp', 'Ra', 'Rs', 'center_x', 'center_y'] lower_limit_default = { 'amp': 0, 'Ra': 0, 'Rs': 0, 'center_x': -100, 'center_y': -100 } upper_limit_default = { 'amp': 100, 'Ra': 100, 'Rs': 100, 'center_x': 100, 'center_y': 100 } def __init__(self): from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe as PJaffe_lens self.lens = PJaffe_lens() def function(self, x, y, amp, Ra, Rs, center_x=0, center_y=0): """ :param x: :param y: :param amp: :param a: :param s: :param center_x: :param center_y: :return: """ rho0 = self.lens.sigma2rho(amp, Ra, Rs) return self.lens.density_2d(x, y, rho0, Ra, Rs, center_x, center_y) def light_3d(self, r, amp, Ra, Rs): """ :param y: :param amp: :param Rs: :param center_x: :param center_y: :return: """ rho0 = self.lens.sigma2rho(amp, Ra, Rs) return self.lens.density(r, rho0, Ra, Rs)
def assert_lens_integrals(self, Model, kwargs): """ checks whether the integral in projection of the density_lens() function is the convergence :param Model: lens model instance :param kwargs: keyword arguments of lens model :return: """ lensModel = Model() int_profile = ProfileIntegrals(lensModel) r = 2. kappa_num = int_profile.density_2d(r, kwargs, lens_param=True) f_xx, f_yy, f_xy = lensModel.hessian(r, 0, **kwargs) kappa = 1./2 * (f_xx + f_yy) npt.assert_almost_equal(kappa_num, kappa, decimal=2)
def assert_integrals(self, Model, kwargs): lensModel = Model() int_profile = ProfileIntegrals(lensModel) r = 2. density2d_num = int_profile.density_2d(r, kwargs) density2d = lensModel.density_2d(r, 0, **kwargs) npt.assert_almost_equal(density2d / density2d_num, 1., decimal=1) mass_2d_num = int_profile.mass_enclosed_2d(r, kwargs) mass_2d = lensModel.mass_2d(r, **kwargs) npt.assert_almost_equal(mass_2d / mass_2d_num, 1, decimal=1) mass_3d_num = int_profile.mass_enclosed_3d(r, kwargs) mass_3d = lensModel.mass_3d(r, **kwargs) npt.assert_almost_equal(mass_3d / mass_3d_num, 1, decimal=2)
def setup(self): mass = 10**7. x = 0.5 y = 1. r3d = np.sqrt(1 + 0.5 ** 2 + 70**2) self.r3d = r3d mdef = 'PJAFFE' self.z = 0.25 sub_flag = True self.H0 = 70 self.omega_baryon = 0.03 self.omega_DM = 0.25 self.sigma8 = 0.82 curvature = 'flat' self.ns = 0.9608 cosmo_params = {'H0': self.H0, 'Om0': self.omega_baryon + self.omega_DM, 'Ob0': self.omega_baryon, 'sigma8': self.sigma8, 'ns': self.ns, 'curvature': curvature} self._dm, self._bar = self.omega_DM, self.omega_baryon cosmo = Cosmology(cosmo_kwargs=cosmo_params) self.lens_cosmo = LensCosmo(self.z, 2., cosmo) kwargs_suppression = {'c_scale': 10.5, 'c_power': -0.2} suppression_model = 'polynomial' profile_args = {'RocheNorm': 1.2, 'RocheNu': 2/3, 'evaluate_mc_at_zlens': True, 'log_mc': 0., 'kwargs_suppression': kwargs_suppression, 'suppression_model': suppression_model, 'c_scatter': False, 'mc_model': 'diemer19', 'LOS_truncation_factor': 40, 'mc_mdef': '200c', 'c_scatter_dex': 0.1} self.profile_args = profile_args self.mass_subhalo = mass self.subhalo = PJaffeSubhalo(mass, x, y, r3d, mdef, self.z, sub_flag, self.lens_cosmo, profile_args, unique_tag=np.random.rand()) mass_field_halo = 10 ** 7. sub_flag = False self.mass_field_halo = mass_field_halo self.field_halo = PJaffeSubhalo(self.mass_field_halo, x, y, r3d, mdef, self.z, sub_flag, self.lens_cosmo, profile_args, unique_tag=np.random.rand()) self._model_lenstronomy = PJaffe()
def test_sie_density_deflection(self): """ tests whether the unit conversion between the lensing parameter 'sigma0' and the units in the density profile are ok :return: """ from lenstronomy.LensModel.Profiles.sie import SIE as Model lensModel = Model() theta_E = 1. rho0 = lensModel.theta2rho(theta_E) kwargs_lens = {'theta_E': theta_E, 'e1': 0, 'e2': 0} kwargs_density = {'rho0': rho0, 'e1': 0, 'e2': 0} r = .5 mass_2d = lensModel.mass_2d(r, **kwargs_density) alpha_mass = mass_2d / r alpha_r, _ = lensModel.derivatives(r, 0, **kwargs_lens) npt.assert_almost_equal(alpha_mass / np.pi, alpha_r, decimal=5)
def test_nfw_density_deflection(self): """ tests whether the unit conversion between the lensing parameter 'sigma0' and the units in the density profile are ok :return: """ from lenstronomy.LensModel.Profiles.nfw import NFW as Model lensModel = Model() alpha_Rs = 1. Rs = 2. rho0 = lensModel.alpha2rho0(alpha_Rs, Rs) kwargs_lens = {'alpha_Rs': alpha_Rs, 'Rs': Rs} kwargs_density = {'rho0': rho0, 'Rs': Rs} r = 2. mass_2d = lensModel.mass_2d(r, **kwargs_density) alpha_mass = mass_2d / r alpha_r, _ = lensModel.derivatives(r, 0, **kwargs_lens) npt.assert_almost_equal(alpha_mass / np.pi, alpha_r, decimal=5)
def test_gaussian_density_deflection(self): """ tests whether the unit conversion between the lensing parameter 'sigma0' and the units in the density profile are ok :return: """ from lenstronomy.LensModel.Profiles.gaussian_kappa import GaussianKappa as Model lensModel = Model() amp = 1. / 4. sigma = 2. amp_lens = lensModel._amp3d_to_2d(amp, sigma, sigma) kwargs_lens = {'amp': amp_lens, 'sigma': sigma} kwargs_density = {'amp': amp, 'sigma': sigma} r = .5 mass_2d = lensModel.mass_2d(r, **kwargs_density) alpha_mass = mass_2d / r alpha_r, _ = lensModel.derivatives(r, 0, **kwargs_lens) npt.assert_almost_equal(alpha_mass / np.pi, alpha_r, decimal=5)
def assert_lens_integrals(self, Model, kwargs, pi_convention=True): """ checks whether the integral in projection of the density_lens() function is the convergence :param Model: lens model instance :param kwargs: keyword arguments of lens model :return: """ lensModel = Model() int_profile = ProfileIntegrals(lensModel) r = 2. kappa_num = int_profile.density_2d(r, kwargs, lens_param=True) f_xx, f_xy, f_yx, f_yy = lensModel.hessian(r, 0, **kwargs) kappa = 1. / 2 * (f_xx + f_yy) npt.assert_almost_equal(kappa_num, kappa, decimal=2) try: del kwargs['center_x'] del kwargs['center_y'] except: pass bool_mass_2d_lens = False try: mass_2d = lensModel.mass_2d_lens(r, **kwargs) bool_mass_2d_lens = True except: pass if bool_mass_2d_lens: alpha_x, alpha_y = lensModel.derivatives(r, 0, **kwargs) alpha = np.sqrt(alpha_x**2 + alpha_y**2) if pi_convention: npt.assert_almost_equal(alpha, mass_2d / r / np.pi, decimal=5) else: npt.assert_almost_equal(alpha, mass_2d / r, decimal=5) try: mass_3d = lensModel.mass_3d_lens(r, **kwargs) bool_mass_3d_lens = True except: bool_mass_3d_lens = False if bool_mass_3d_lens: mass_3d_num = int_profile.mass_enclosed_3d(r, kwargs_profile=kwargs, lens_param=True) print(mass_3d, mass_3d_num, 'test num') npt.assert_almost_equal(mass_3d / mass_3d_num, 1, decimal=2)
def assert_lens_integrals(self, Model, kwargs): """ checks whether the integral in projection of the density_lens() function is the convergence :param Model: lens model instance :param kwargs: keyword arguments of lens model :return: """ lensModel = Model() int_profile = ProfileIntegrals(lensModel) r = 2. kappa_num = int_profile.density_2d(r, kwargs, lens_param=True) f_xx, f_yy, f_xy = lensModel.hessian(r, 0, **kwargs) kappa = 1. / 2 * (f_xx + f_yy) npt.assert_almost_equal(kappa_num, kappa, decimal=2) if hasattr(lensModel, 'mass_2d_lens'): mass_2d = lensModel.mass_2d_lens(r, **kwargs) alpha_x, alpha_y = lensModel.derivatives(r, 0, **kwargs) alpha = np.sqrt(alpha_x**2 + alpha_y**2) npt.assert_almost_equal(alpha, mass_2d / r / np.pi, decimal=5)
def __init__(self): self.spherical = PJaffe() self._diff = 0.000001
class TestPjaffeHalo(object): def setup(self): mass = 10**7. x = 0.5 y = 1. r3d = np.sqrt(1 + 0.5 ** 2 + 70**2) self.r3d = r3d mdef = 'PJAFFE' self.z = 0.25 sub_flag = True self.H0 = 70 self.omega_baryon = 0.03 self.omega_DM = 0.25 self.sigma8 = 0.82 curvature = 'flat' self.ns = 0.9608 cosmo_params = {'H0': self.H0, 'Om0': self.omega_baryon + self.omega_DM, 'Ob0': self.omega_baryon, 'sigma8': self.sigma8, 'ns': self.ns, 'curvature': curvature} self._dm, self._bar = self.omega_DM, self.omega_baryon cosmo = Cosmology(cosmo_kwargs=cosmo_params) self.lens_cosmo = LensCosmo(self.z, 2., cosmo) kwargs_suppression = {'c_scale': 10.5, 'c_power': -0.2} suppression_model = 'polynomial' profile_args = {'RocheNorm': 1.2, 'RocheNu': 2/3, 'evaluate_mc_at_zlens': True, 'log_mc': 0., 'kwargs_suppression': kwargs_suppression, 'suppression_model': suppression_model, 'c_scatter': False, 'mc_model': 'diemer19', 'LOS_truncation_factor': 40, 'mc_mdef': '200c', 'c_scatter_dex': 0.1} self.profile_args = profile_args self.mass_subhalo = mass self.subhalo = PJaffeSubhalo(mass, x, y, r3d, mdef, self.z, sub_flag, self.lens_cosmo, profile_args, unique_tag=np.random.rand()) mass_field_halo = 10 ** 7. sub_flag = False self.mass_field_halo = mass_field_halo self.field_halo = PJaffeSubhalo(self.mass_field_halo, x, y, r3d, mdef, self.z, sub_flag, self.lens_cosmo, profile_args, unique_tag=np.random.rand()) self._model_lenstronomy = PJaffe() def test_lenstronomy_ID(self): id = self.subhalo.lenstronomy_ID npt.assert_string_equal(id[0], 'PJAFFE') id = self.field_halo.lenstronomy_ID npt.assert_string_equal(id[0], 'PJAFFE') def test_z_infall(self): z_infall = self.subhalo.z_infall npt.assert_equal(True, self.z <= z_infall) def test_total_mass(self): c = float(self.subhalo.profile_args) rhos, rs, r200 = self.lens_cosmo.NFW_params_physical(self.subhalo.mass, c, self.z) fc = np.log(1 + c) - c / (1 + c) m_nfw = 4 * np.pi * rs ** 3 * rhos * fc lenstronomy_kwargs, _ = self.subhalo.lenstronomy_params sigma0, ra, rs = lenstronomy_kwargs[0]['sigma0'], lenstronomy_kwargs[0]['Ra'], lenstronomy_kwargs[0]['Rs'] arcsec_to_kpc = self.lens_cosmo.cosmo.kpc_proper_per_asec(self.z) ra *= arcsec_to_kpc ** -1 rs *= arcsec_to_kpc ** -1 rho = self.subhalo._rho(m_nfw, rs, ra, c*rs) m3d = self._model_lenstronomy.mass_3d(c*rs, rho, ra, rs) npt.assert_almost_equal(np.log10(m3d), np.log10(m_nfw)) def test_profile_args(self): profile_args = self.subhalo.profile_args (c) = profile_args con = concentration(self.lens_cosmo.cosmo.h * self.mass_subhalo, '200c', self.z, model='diemer19') npt.assert_almost_equal(c/con, 1, 2) profile_args = self.field_halo.profile_args (c) = profile_args con = concentration(self.lens_cosmo.cosmo.h * self.mass_field_halo, '200c', self.z, model='diemer19') npt.assert_almost_equal(c / con, 1, 2) profile_args = self.field_halo.profile_args (c) = profile_args con = concentration(self.lens_cosmo.cosmo.h * self.mass_subhalo, '200c', self.z, model='diemer19') npt.assert_almost_equal(c / con, 1, 2) profile_args = self.field_halo.profile_args (c) = profile_args con = concentration(self.lens_cosmo.cosmo.h * self.mass_field_halo, '200c', self.z, model='diemer19') npt.assert_almost_equal(c / con, 1, 2) def test_params_physical(self): params_physical = self.subhalo.params_physical npt.assert_equal(len(params_physical), 4)
class PJaffe_Ellipse(LensProfileBase): """ class to compute the DUAL PSEUDO ISOTHERMAL ELLIPTICAL MASS DISTRIBUTION based on Eliasdottir (2007) https://arxiv.org/pdf/0710.5636.pdf Appendix A with the ellipticity implemented in the potential Module name: 'PJAFFE_ELLIPSE'; An alternative name is dPIED. The 3D density distribution is .. math:: \\rho(r) = \\frac{\\rho_0}{(1+r^2/Ra^2)(1+r^2/Rs^2)} with :math:`Rs > Ra`. The projected density is .. math:: \\Sigma(R) = \\Sigma_0 \\frac{Ra Rs}{Rs-Ra}\\left(\\frac{1}{\\sqrt{Ra^2+R^2}} - \\frac{1}{\\sqrt{Rs^2+R^2}} \\right) with .. math:: \\Sigma_0 = \\pi \\rho_0 \\frac{Ra Rs}{Rs + Ra} In the lensing parameterization, .. math:: \\sigma_0 = \\frac{\\Sigma_0}{\\Sigma_{\\rm crit}} """ param_names = ['sigma0', 'Ra', 'Rs', 'e1', 'e2', 'center_x', 'center_y'] lower_limit_default = { 'sigma0': 0, 'Ra': 0, 'Rs': 0, 'e1': -0.5, 'e2': -0.5, 'center_x': -100, 'center_y': -100 } upper_limit_default = { 'sigma0': 10, 'Ra': 100, 'Rs': 100, 'e1': 0.5, 'e2': 0.5, 'center_x': 100, 'center_y': 100 } def __init__(self): self.spherical = PJaffe() self._diff = 0.000001 super(PJaffe_Ellipse, self).__init__() def function(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns double integral of NFW profile """ x_, y_ = param_util.transform_e1e2_square_average( x, y, e1, e2, center_x, center_y) f_ = self.spherical.function(x_, y_, sigma0, Ra, Rs) return f_ def derivatives(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns df/dx and df/dy of the function (integral of NFW) """ phi_G, q = param_util.ellipticity2phi_q(e1, e2) x_, y_ = param_util.transform_e1e2_square_average( x, y, e1, e2, center_x, center_y) e = param_util.q2e(q) cos_phi = np.cos(phi_G) sin_phi = np.sin(phi_G) f_x_prim, f_y_prim = self.spherical.derivatives(x_, y_, sigma0, Ra, Rs, center_x=0, center_y=0) f_x_prim *= np.sqrt(1 - e) f_y_prim *= np.sqrt(1 + e) f_x = cos_phi * f_x_prim - sin_phi * f_y_prim f_y = sin_phi * f_x_prim + cos_phi * f_y_prim return f_x, f_y def hessian(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns Hessian matrix of function d^2f/dx^2, d^2/dxdy, d^2/dydx, d^f/dy^2 """ alpha_ra, alpha_dec = self.derivatives(x, y, sigma0, Ra, Rs, e1, e2, center_x, center_y) diff = self._diff alpha_ra_dx, alpha_dec_dx = self.derivatives(x + diff, y, sigma0, Ra, Rs, e1, e2, center_x, center_y) alpha_ra_dy, alpha_dec_dy = self.derivatives(x, y + diff, sigma0, Ra, Rs, e1, e2, center_x, center_y) f_xx = (alpha_ra_dx - alpha_ra) / diff f_xy = (alpha_ra_dy - alpha_ra) / diff f_yx = (alpha_dec_dx - alpha_dec) / diff f_yy = (alpha_dec_dy - alpha_dec) / diff return f_xx, f_xy, f_yx, f_yy def mass_3d_lens(self, r, sigma0, Ra, Rs, e1=0, e2=0): """ :param r: :param sigma0: :param Ra: :param Rs: :param e1: :param e2: :return: """ return self.spherical.mass_3d_lens(r, sigma0, Ra, Rs)
class TestP_JAFFW(object): """ tests the Gaussian methods """ def setup(self): self.profile = PJaffe() def test_function(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.function(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(values[0], 0.87301557036070054, decimal=8) x = np.array([0]) y = np.array([0]) sigma0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.function(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(values[0], 0.20267440905756931, decimal=8) x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) values = self.profile.function(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(values[0], 0.87301557036070054, decimal=8) npt.assert_almost_equal(values[1], 1.0842781309377669, decimal=8) npt.assert_almost_equal(values[2], 1.2588604178849985, decimal=8) def test_derivatives(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 f_x, f_y = self.profile.derivatives(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(f_x[0], 0.11542369603751264, decimal=8) npt.assert_almost_equal(f_y[0], 0.23084739207502528, decimal=8) x = np.array([0]) y = np.array([0]) f_x, f_y = self.profile.derivatives(x, y, sigma0, Ra, Rs) assert f_x[0] == 0 assert f_y[0] == 0 x = np.array([1, 3, 4]) y = np.array([2, 1, 1]) values = self.profile.derivatives(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(values[0][0], 0.11542369603751264, decimal=8) npt.assert_almost_equal(values[1][0], 0.23084739207502528, decimal=8) npt.assert_almost_equal(values[0][1], 0.19172866612512479, decimal=8) npt.assert_almost_equal(values[1][1], 0.063909555375041588, decimal=8) def test_hessian(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 f_xx, f_xy, f_yx, f_yy = self.profile.hessian(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(f_xx[0], 0.077446121589827679, decimal=8) npt.assert_almost_equal(f_yy[0], -0.036486601753227141, decimal=8) npt.assert_almost_equal(f_xy[0], -0.075955148895369876, decimal=8) x = np.array([1, 3, 4]) y = np.array([2, 1, 1]) values = self.profile.hessian(x, y, sigma0, Ra, Rs) npt.assert_almost_equal(values[0][0], 0.077446121589827679, decimal=8) npt.assert_almost_equal(values[3][0], -0.036486601753227141, decimal=8) npt.assert_almost_equal(values[1][0], values[2][0], decimal=8) def test_mass_tot(self): rho0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.mass_tot(rho0, Ra, Rs) npt.assert_almost_equal(values, 2.429441083345073, decimal=10) def test_mass_3d_lens(self): mass = self.profile.mass_3d_lens(r=1, sigma0=1, Ra=0.5, Rs=0.8) npt.assert_almost_equal(mass, 0.87077306005349242, decimal=8) def test_grav_pot(self): x = 1 y = 2 rho0 = 1. r = np.sqrt(x**2 + y**2) Ra, Rs = 0.5, 0.8 grav_pot = self.profile.grav_pot(r, rho0, Ra, Rs) npt.assert_almost_equal(grav_pot, 0.89106542283974155, decimal=10)
def __init__(self): from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe as PJaffe_lens self.lens = PJaffe_lens()
class PJaffeSubhalo(Halo): """ Class that defines a halo modeled as a Psuedo-Jaffe profile. The profile is normalized such that the Psuedo-Jaffe profile has the same mass within r200 as an NFW profile with mass M200. The scale radius of the Psuedo-Jafee profile is the same as the NFW profile """ def __init__(self, mass, x, y, r3d, mdef, z, sub_flag, lens_cosmo_instance, args, unique_tag): """ See documentation in base class (Halos/halo_base.py) """ self._lens_cosmo = lens_cosmo_instance self._prof = PJaffe() super(PJaffeSubhalo, self).__init__(mass, x, y, r3d, mdef, z, sub_flag, lens_cosmo_instance, args, unique_tag) @property def params_physical(self): """ See documentation in base class (Halos/halo_base.py) """ if not hasattr(self, '_params_physical'): concentration = self.profile_args rhos, rs, r200 = self._lens_cosmo.NFW_params_physical( self.mass, concentration, self.z) _, rs_kpc, r200_kpc = self._lens_cosmo.NFW_params_physical( self.mass, concentration, self.z) ra_kpc = 0.01 * rs_kpc rho = self._rho(self.mass, rs_kpc, ra_kpc, r200) self._params_physical = { 'rhos': rhos, 'rs': rs, 'r200': r200, 'rho': rho } return self._params_physical @property def lenstronomy_params(self): """ See documentation in base class (Halos/halo_base.py) """ if not hasattr(self, '_lenstronomy_args'): kpc_to_arcsec = 1 / self._lens_cosmo.cosmo.kpc_proper_per_asec( self.z) (concentration) = self.profile_args rhos_kpc, rs_kpc, r200_kpc = self._lens_cosmo.NFW_params_physical( self.mass, concentration, self.z) ra_kpc = 0.01 * rs_kpc ra_arcsec = ra_kpc * kpc_to_arcsec rs_arcsec = rs_kpc * kpc_to_arcsec rmatch = r200_kpc rmatch_arcsec = rmatch * kpc_to_arcsec xmatch = rmatch / rs_kpc fx = np.log(1 + xmatch) - xmatch / (1 + xmatch) m_nfw = 4 * np.pi * rs_kpc**3 * rhos_kpc * fx rho = self._rho(m_nfw, rs_arcsec, ra_arcsec, rmatch_arcsec) sigma0 = self._prof.rho2sigma(rho, ra_arcsec, rs_arcsec) sigma_crit_kpc = self._lens_cosmo.get_sigma_crit_lensing( self.z, self._lens_cosmo.z_source) * 0.001**2 sigma0 *= (sigma_crit_kpc / kpc_to_arcsec**2)**-1 self._lenstronomy_args = [{ 'center_x': self.x, 'center_y': self.y, 'Ra': ra_arcsec, 'Rs': rs_arcsec, 'sigma0': sigma0 }] return self._lenstronomy_args, None def _rho(self, m, rs, ra, r_match): """ returns the central density of a PJaffe halo such that the resulting halo has the mass m within r_match :param m: :param ra: :param r_match: :return: """ f = (ra * np.arctan(r_match / ra) - rs * np.arctan(r_match / rs)) / (ra**2 - rs**2) rho = m / (4 * np.pi * ra**2 * rs**2 * f) return rho @property def lenstronomy_ID(self): """ See documentation in base class (Halos/halo_base.py) """ return ['PJAFFE'] @property def profile_args(self): """ See documentation in base class (Halos/halo_base.py) """ if not hasattr(self, '_profile_args'): if self._args['evaluate_mc_at_zlens']: z_eval = self.z else: z_eval = self.z_infall concentration = self._lens_cosmo.NFW_concentration( self.mass, z_eval, self._args['mc_model'], self._args['mc_mdef'], self._args['log_mc'], self._args['c_scatter'], self._args['c_scatter_dex'], self._args['kwargs_suppression'], self._args['suppression_model']) self._profile_args = (concentration) return self._profile_args
class TestP_JAFFW(object): """ tests the Gaussian methods """ def setup(self): self.profile = PJaffe() def test_function(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.function(x, y, sigma0, Ra, Rs) assert values[0] == 0.87301557036070054 x = np.array([0]) y = np.array([0]) sigma0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.function(x, y, sigma0, Ra, Rs) assert values[0] == 0.20267440905756931 x = np.array([2, 3, 4]) y = np.array([1, 1, 1]) values = self.profile.function(x, y, sigma0, Ra, Rs) assert values[0] == 0.87301557036070054 assert values[1] == 1.0842781309377669 assert values[2] == 1.2588604178849985 def test_derivatives(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 f_x, f_y = self.profile.derivatives(x, y, sigma0, Ra, Rs) assert f_x[0] == 0.11542369603751264 assert f_y[0] == 0.23084739207502528 x = np.array([0]) y = np.array([0]) f_x, f_y = self.profile.derivatives(x, y, sigma0, Ra, Rs) assert f_x[0] == 0 assert f_y[0] == 0 x = np.array([1, 3, 4]) y = np.array([2, 1, 1]) values = self.profile.derivatives(x, y, sigma0, Ra, Rs) assert values[0][0] == 0.11542369603751264 assert values[1][0] == 0.23084739207502528 assert values[0][1] == 0.19172866612512479 assert values[1][1] == 0.063909555375041588 def test_hessian(self): x = np.array([1]) y = np.array([2]) sigma0 = 1. Ra, Rs = 0.5, 0.8 f_xx, f_yy, f_xy = self.profile.hessian(x, y, sigma0, Ra, Rs) assert f_xx[0] == 0.077446121589827679 assert f_yy[0] == -0.036486601753227141 assert f_xy[0] == -0.075955148895369876 x = np.array([1, 3, 4]) y = np.array([2, 1, 1]) values = self.profile.hessian(x, y, sigma0, Ra, Rs) assert values[0][0] == 0.077446121589827679 assert values[1][0] == -0.036486601753227141 assert values[2][0] == -0.075955148895369876 assert values[0][1] == -0.037260794616683197 assert values[1][1] == 0.052668405375961035 assert values[2][1] == -0.033723449997241584 def test_mass_tot(self): rho0 = 1. Ra, Rs = 0.5, 0.8 values = self.profile.mass_tot(rho0, Ra, Rs) npt.assert_almost_equal(values, 2.429441083345073, decimal=10) def test_mass_3d_lens(self): mass = self.profile.mass_3d_lens(r=1, sigma0=1, Ra=0.5, Rs=0.8) npt.assert_almost_equal(mass, 0.87077306005349242, decimal=8) def test_grav_pot(self): x = 1 y = 2 rho0 = 1. Ra, Rs = 0.5, 0.8 grav_pot = self.profile.grav_pot(x, y, rho0, Ra, Rs, center_x=0, center_y=0) npt.assert_almost_equal(grav_pot, 0.89106542283974155, decimal=10)
def _import_class(lens_type, custom_class, kwargs_interp, z_lens=None, z_source=None): """ :param lens_type: string, lens model type :param custom_class: custom class :param z_lens: lens redshift # currently only used in NFW_MC model as this is redshift dependent :param z_source: source redshift # currently only used in NFW_MC model as this is redshift dependent :param kwargs_interp: interpolation keyword arguments specifying the numerics. See description in the Interpolate() class. Only applicable for 'INTERPOL' and 'INTERPOL_SCALED' models. :return: class instance of the lens model type """ if lens_type == 'SHIFT': from lenstronomy.LensModel.Profiles.constant_shift import Shift return Shift() elif lens_type == 'NIE_POTENTIAL': from lenstronomy.LensModel.Profiles.nie_potential import NIE_POTENTIAL return NIE_POTENTIAL() elif lens_type == 'CONST_MAG': from lenstronomy.LensModel.Profiles.const_mag import ConstMag return ConstMag() elif lens_type == 'SHEAR': from lenstronomy.LensModel.Profiles.shear import Shear return Shear() elif lens_type == 'SHEAR_GAMMA_PSI': from lenstronomy.LensModel.Profiles.shear import ShearGammaPsi return ShearGammaPsi() elif lens_type == 'SHEAR_REDUCED': from lenstronomy.LensModel.Profiles.shear import ShearReduced return ShearReduced() elif lens_type == 'CONVERGENCE': from lenstronomy.LensModel.Profiles.convergence import Convergence return Convergence() elif lens_type == 'HESSIAN': from lenstronomy.LensModel.Profiles.hessian import Hessian return Hessian() elif lens_type == 'FLEXION': from lenstronomy.LensModel.Profiles.flexion import Flexion return Flexion() elif lens_type == 'FLEXIONFG': from lenstronomy.LensModel.Profiles.flexionfg import Flexionfg return Flexionfg() elif lens_type == 'POINT_MASS': from lenstronomy.LensModel.Profiles.point_mass import PointMass return PointMass() elif lens_type == 'SIS': from lenstronomy.LensModel.Profiles.sis import SIS return SIS() elif lens_type == 'SIS_TRUNCATED': from lenstronomy.LensModel.Profiles.sis_truncate import SIS_truncate return SIS_truncate() elif lens_type == 'SIE': from lenstronomy.LensModel.Profiles.sie import SIE return SIE() elif lens_type == 'SPP': from lenstronomy.LensModel.Profiles.spp import SPP return SPP() elif lens_type == 'NIE': from lenstronomy.LensModel.Profiles.nie import NIE return NIE() elif lens_type == 'NIE_SIMPLE': from lenstronomy.LensModel.Profiles.nie import NIEMajorAxis return NIEMajorAxis() elif lens_type == 'CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import Chameleon return Chameleon() elif lens_type == 'DOUBLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import DoubleChameleon return DoubleChameleon() elif lens_type == 'TRIPLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import TripleChameleon return TripleChameleon() elif lens_type == 'SPEP': from lenstronomy.LensModel.Profiles.spep import SPEP return SPEP() elif lens_type == 'PEMD': from lenstronomy.LensModel.Profiles.pemd import PEMD return PEMD() elif lens_type == 'SPEMD': from lenstronomy.LensModel.Profiles.spemd import SPEMD return SPEMD() elif lens_type == 'EPL': from lenstronomy.LensModel.Profiles.epl import EPL return EPL() elif lens_type == 'EPL_NUMBA': from lenstronomy.LensModel.Profiles.epl_numba import EPL_numba return EPL_numba() elif lens_type == 'SPL_CORE': from lenstronomy.LensModel.Profiles.splcore import SPLCORE return SPLCORE() elif lens_type == 'NFW': from lenstronomy.LensModel.Profiles.nfw import NFW return NFW() elif lens_type == 'NFW_ELLIPSE': from lenstronomy.LensModel.Profiles.nfw_ellipse import NFW_ELLIPSE return NFW_ELLIPSE() elif lens_type == 'NFW_ELLIPSE_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition import NFWEllipseGaussDec return NFWEllipseGaussDec() elif lens_type == 'NFW_ELLIPSE_CSE': from lenstronomy.LensModel.Profiles.nfw_ellipse_cse import NFW_ELLIPSE_CSE return NFW_ELLIPSE_CSE() elif lens_type == 'TNFW': from lenstronomy.LensModel.Profiles.tnfw import TNFW return TNFW() elif lens_type == 'TNFW_ELLIPSE': from lenstronomy.LensModel.Profiles.tnfw_ellipse import TNFW_ELLIPSE return TNFW_ELLIPSE() elif lens_type == 'CNFW': from lenstronomy.LensModel.Profiles.cnfw import CNFW return CNFW() elif lens_type == 'CNFW_ELLIPSE': from lenstronomy.LensModel.Profiles.cnfw_ellipse import CNFW_ELLIPSE return CNFW_ELLIPSE() elif lens_type == 'CTNFW_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition import CTNFWGaussDec return CTNFWGaussDec() elif lens_type == 'NFW_MC': from lenstronomy.LensModel.Profiles.nfw_mass_concentration import NFWMC return NFWMC(z_lens=z_lens, z_source=z_source) elif lens_type == 'SERSIC': from lenstronomy.LensModel.Profiles.sersic import Sersic return Sersic() elif lens_type == 'SERSIC_ELLIPSE_POTENTIAL': from lenstronomy.LensModel.Profiles.sersic_ellipse_potential import SersicEllipse return SersicEllipse() elif lens_type == 'SERSIC_ELLIPSE_KAPPA': from lenstronomy.LensModel.Profiles.sersic_ellipse_kappa import SersicEllipseKappa return SersicEllipseKappa() elif lens_type == 'SERSIC_ELLIPSE_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition import SersicEllipseGaussDec return SersicEllipseGaussDec() elif lens_type == 'PJAFFE': from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe return PJaffe() elif lens_type == 'PJAFFE_ELLIPSE': from lenstronomy.LensModel.Profiles.p_jaffe_ellipse import PJaffe_Ellipse return PJaffe_Ellipse() elif lens_type == 'HERNQUIST': from lenstronomy.LensModel.Profiles.hernquist import Hernquist return Hernquist() elif lens_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LensModel.Profiles.hernquist_ellipse import Hernquist_Ellipse return Hernquist_Ellipse() elif lens_type == 'HERNQUIST_ELLIPSE_CSE': from lenstronomy.LensModel.Profiles.hernquist_ellipse_cse import HernquistEllipseCSE return HernquistEllipseCSE() elif lens_type == 'GAUSSIAN': from lenstronomy.LensModel.Profiles.gaussian_potential import Gaussian return Gaussian() elif lens_type == 'GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_kappa import GaussianKappa return GaussianKappa() elif lens_type == 'GAUSSIAN_ELLIPSE_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_ellipse_kappa import GaussianEllipseKappa return GaussianEllipseKappa() elif lens_type == 'GAUSSIAN_ELLIPSE_POTENTIAL': from lenstronomy.LensModel.Profiles.gaussian_ellipse_potential import GaussianEllipsePotential return GaussianEllipsePotential() elif lens_type == 'MULTI_GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappa return MultiGaussianKappa() elif lens_type == 'MULTI_GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappaEllipse return MultiGaussianKappaEllipse() elif lens_type == 'INTERPOL': from lenstronomy.LensModel.Profiles.interpol import Interpol return Interpol(**kwargs_interp) elif lens_type == 'INTERPOL_SCALED': from lenstronomy.LensModel.Profiles.interpol import InterpolScaled return InterpolScaled(**kwargs_interp) elif lens_type == 'SHAPELETS_POLAR': from lenstronomy.LensModel.Profiles.shapelet_pot_polar import PolarShapelets return PolarShapelets() elif lens_type == 'SHAPELETS_CART': from lenstronomy.LensModel.Profiles.shapelet_pot_cartesian import CartShapelets return CartShapelets() elif lens_type == 'DIPOLE': from lenstronomy.LensModel.Profiles.dipole import Dipole return Dipole() elif lens_type == 'CURVED_ARC_CONST': from lenstronomy.LensModel.Profiles.curved_arc_const import CurvedArcConst return CurvedArcConst() elif lens_type == 'CURVED_ARC_CONST_MST': from lenstronomy.LensModel.Profiles.curved_arc_const import CurvedArcConstMST return CurvedArcConstMST() elif lens_type == 'CURVED_ARC_SPP': from lenstronomy.LensModel.Profiles.curved_arc_spp import CurvedArcSPP return CurvedArcSPP() elif lens_type == 'CURVED_ARC_SIS_MST': from lenstronomy.LensModel.Profiles.curved_arc_sis_mst import CurvedArcSISMST return CurvedArcSISMST() elif lens_type == 'CURVED_ARC_SPT': from lenstronomy.LensModel.Profiles.curved_arc_spt import CurvedArcSPT return CurvedArcSPT() elif lens_type == 'CURVED_ARC_TAN_DIFF': from lenstronomy.LensModel.Profiles.curved_arc_tan_diff import CurvedArcTanDiff return CurvedArcTanDiff() elif lens_type == 'ARC_PERT': from lenstronomy.LensModel.Profiles.arc_perturbations import ArcPerturbations return ArcPerturbations() elif lens_type == 'coreBURKERT': from lenstronomy.LensModel.Profiles.coreBurkert import CoreBurkert return CoreBurkert() elif lens_type == 'CORED_DENSITY': from lenstronomy.LensModel.Profiles.cored_density import CoredDensity return CoredDensity() elif lens_type == 'CORED_DENSITY_2': from lenstronomy.LensModel.Profiles.cored_density_2 import CoredDensity2 return CoredDensity2() elif lens_type == 'CORED_DENSITY_EXP': from lenstronomy.LensModel.Profiles.cored_density_exp import CoredDensityExp return CoredDensityExp() elif lens_type == 'CORED_DENSITY_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY') elif lens_type == 'CORED_DENSITY_2_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY_2') elif lens_type == 'CORED_DENSITY_EXP_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY_EXP') elif lens_type == 'NumericalAlpha': from lenstronomy.LensModel.Profiles.numerical_deflections import NumericalAlpha return NumericalAlpha(custom_class) elif lens_type == 'MULTIPOLE': from lenstronomy.LensModel.Profiles.multipole import Multipole return Multipole() elif lens_type == 'CSE': from lenstronomy.LensModel.Profiles.cored_steep_ellipsoid import CSE return CSE() elif lens_type == 'ElliSLICE': from lenstronomy.LensModel.Profiles.elliptical_density_slice import ElliSLICE return ElliSLICE() elif lens_type == 'ULDM': from lenstronomy.LensModel.Profiles.uldm import Uldm return Uldm() elif lens_type == 'CORED_DENSITY_ULDM_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY_ULDM') else: raise ValueError( '%s is not a valid lens model. Supported are: %s.' % (lens_type, _SUPPORTED_MODELS))
def __init__(self): self.spherical = PJaffe() self._diff = 0.000001 super(PJaffe_Ellipse, self).__init__()
def __init__(self, lens_model_list, **kwargs): """ :param lens_model_list: list of strings with lens model names :param foreground_shear: bool, when True, models a foreground non-linear shear distortion """ self.func_list = [] self._foreground_shear = False for i, lens_type in enumerate(lens_model_list): if lens_type == 'SHEAR': from lenstronomy.LensModel.Profiles.external_shear import ExternalShear self.func_list.append(ExternalShear()) elif lens_type == 'CONVERGENCE': from lenstronomy.LensModel.Profiles.mass_sheet import MassSheet self.func_list.append(MassSheet()) elif lens_type == 'FLEXION': from lenstronomy.LensModel.Profiles.flexion import Flexion self.func_list.append(Flexion()) elif lens_type == 'POINT_MASS': from lenstronomy.LensModel.Profiles.point_mass import PointMass self.func_list.append(PointMass()) elif lens_type == 'SIS': from lenstronomy.LensModel.Profiles.sis import SIS self.func_list.append(SIS()) elif lens_type == 'SIS_TRUNCATED': from lenstronomy.LensModel.Profiles.sis_truncate import SIS_truncate self.func_list.append(SIS_truncate()) elif lens_type == 'SIE': from lenstronomy.LensModel.Profiles.sie import SIE self.func_list.append(SIE()) elif lens_type == 'SPP': from lenstronomy.LensModel.Profiles.spp import SPP self.func_list.append(SPP()) elif lens_type == 'NIE': from lenstronomy.LensModel.Profiles.nie import NIE self.func_list.append(NIE()) elif lens_type == 'NIE_SIMPLE': from lenstronomy.LensModel.Profiles.nie import NIE_simple self.func_list.append(NIE_simple()) elif lens_type == 'CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import Chameleon self.func_list.append(Chameleon()) elif lens_type == 'DOUBLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import DoubleChameleon self.func_list.append(DoubleChameleon()) elif lens_type == 'SPEP': from lenstronomy.LensModel.Profiles.spep import SPEP self.func_list.append(SPEP()) elif lens_type == 'SPEMD': from lenstronomy.LensModel.Profiles.spemd import SPEMD self.func_list.append(SPEMD()) elif lens_type == 'SPEMD_SMOOTH': from lenstronomy.LensModel.Profiles.spemd_smooth import SPEMD_SMOOTH self.func_list.append(SPEMD_SMOOTH()) elif lens_type == 'NFW': from lenstronomy.LensModel.Profiles.nfw import NFW self.func_list.append(NFW(**kwargs)) elif lens_type == 'NFW_ELLIPSE': from lenstronomy.LensModel.Profiles.nfw_ellipse import NFW_ELLIPSE self.func_list.append( NFW_ELLIPSE(interpol=False, num_interp_X=1000, max_interp_X=100)) elif lens_type == 'TNFW': from lenstronomy.LensModel.Profiles.tnfw import TNFW self.func_list.append(TNFW()) elif lens_type == 'SERSIC': from lenstronomy.LensModel.Profiles.sersic import Sersic self.func_list.append(Sersic()) elif lens_type == 'SERSIC_ELLIPSE': from lenstronomy.LensModel.Profiles.sersic_ellipse import SersicEllipse self.func_list.append(SersicEllipse()) elif lens_type == 'PJAFFE': from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe self.func_list.append(PJaffe()) elif lens_type == 'PJAFFE_ELLIPSE': from lenstronomy.LensModel.Profiles.p_jaffe_ellipse import PJaffe_Ellipse self.func_list.append(PJaffe_Ellipse()) elif lens_type == 'HERNQUIST': from lenstronomy.LensModel.Profiles.hernquist import Hernquist self.func_list.append(Hernquist()) elif lens_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LensModel.Profiles.hernquist_ellipse import Hernquist_Ellipse self.func_list.append(Hernquist_Ellipse()) elif lens_type == 'GAUSSIAN': from lenstronomy.LensModel.Profiles.gaussian_potential import Gaussian self.func_list.append(Gaussian()) elif lens_type == 'GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_kappa import GaussianKappa self.func_list.append(GaussianKappa()) elif lens_type == 'GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.gaussian_kappa_ellipse import GaussianKappaEllipse self.func_list.append(GaussianKappaEllipse()) elif lens_type == 'MULTI_GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappa self.func_list.append(MultiGaussianKappa()) elif lens_type == 'MULTI_GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappaEllipse self.func_list.append(MultiGaussianKappaEllipse()) elif lens_type == 'INTERPOL': from lenstronomy.LensModel.Profiles.interpol import Interpol_func self.func_list.append( Interpol_func(grid=False, min_grid_number=100)) elif lens_type == 'INTERPOL_SCALED': from lenstronomy.LensModel.Profiles.interpol import Interpol_func_scaled self.func_list.append( Interpol_func_scaled(grid=False, min_grid_number=100)) elif lens_type == 'SHAPELETS_POLAR': from lenstronomy.LensModel.Profiles.shapelet_pot_polar import PolarShapelets self.func_list.append(PolarShapelets()) elif lens_type == 'SHAPELETS_CART': from lenstronomy.LensModel.Profiles.shapelet_pot_cartesian import CartShapelets self.func_list.append(CartShapelets()) elif lens_type == 'DIPOLE': from lenstronomy.LensModel.Profiles.dipole import Dipole self.func_list.append(Dipole()) elif lens_type == 'FOREGROUND_SHEAR': from lenstronomy.LensModel.Profiles.external_shear import ExternalShear self.func_list.append(ExternalShear()) self._foreground_shear = True self._foreground_shear_idex = i else: raise ValueError('%s is not a valid lens model' % lens_type) self._model_list = lens_model_list
def _import_class(self, lens_type, i, custom_class): if lens_type == 'SHIFT': from lenstronomy.LensModel.Profiles.alpha_shift import Shift return Shift() elif lens_type == 'SHEAR': from lenstronomy.LensModel.Profiles.shear import Shear return Shear() elif lens_type == 'CONVERGENCE': from lenstronomy.LensModel.Profiles.convergence import Convergence return Convergence() elif lens_type == 'FLEXION': from lenstronomy.LensModel.Profiles.flexion import Flexion return Flexion() elif lens_type == 'POINT_MASS': from lenstronomy.LensModel.Profiles.point_mass import PointMass return PointMass() elif lens_type == 'SIS': from lenstronomy.LensModel.Profiles.sis import SIS return SIS() elif lens_type == 'SIS_TRUNCATED': from lenstronomy.LensModel.Profiles.sis_truncate import SIS_truncate return SIS_truncate() elif lens_type == 'SIE': from lenstronomy.LensModel.Profiles.sie import SIE return SIE() elif lens_type == 'SPP': from lenstronomy.LensModel.Profiles.spp import SPP return SPP() elif lens_type == 'NIE': from lenstronomy.LensModel.Profiles.nie import NIE return NIE() elif lens_type == 'NIE_SIMPLE': from lenstronomy.LensModel.Profiles.nie import NIE_simple return NIE_simple() elif lens_type == 'CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import Chameleon return Chameleon() elif lens_type == 'DOUBLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import DoubleChameleon return DoubleChameleon() elif lens_type == 'SPEP': from lenstronomy.LensModel.Profiles.spep import SPEP return SPEP() elif lens_type == 'SPEMD': from lenstronomy.LensModel.Profiles.spemd import SPEMD return SPEMD() elif lens_type == 'SPEMD_SMOOTH': from lenstronomy.LensModel.Profiles.spemd_smooth import SPEMD_SMOOTH return SPEMD_SMOOTH() elif lens_type == 'NFW': from lenstronomy.LensModel.Profiles.nfw import NFW return NFW() elif lens_type == 'NFW_ELLIPSE': from lenstronomy.LensModel.Profiles.nfw_ellipse import NFW_ELLIPSE return NFW_ELLIPSE() elif lens_type == 'TNFW': from lenstronomy.LensModel.Profiles.tnfw import TNFW return TNFW() elif lens_type == 'CNFW': from lenstronomy.LensModel.Profiles.cnfw import CNFW return CNFW() elif lens_type == 'SERSIC': from lenstronomy.LensModel.Profiles.sersic import Sersic return Sersic() elif lens_type == 'SERSIC_ELLIPSE': from lenstronomy.LensModel.Profiles.sersic_ellipse import SersicEllipse return SersicEllipse() elif lens_type == 'PJAFFE': from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe return PJaffe() elif lens_type == 'PJAFFE_ELLIPSE': from lenstronomy.LensModel.Profiles.p_jaffe_ellipse import PJaffe_Ellipse return PJaffe_Ellipse() elif lens_type == 'HERNQUIST': from lenstronomy.LensModel.Profiles.hernquist import Hernquist return Hernquist() elif lens_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LensModel.Profiles.hernquist_ellipse import Hernquist_Ellipse return Hernquist_Ellipse() elif lens_type == 'GAUSSIAN': from lenstronomy.LensModel.Profiles.gaussian_potential import Gaussian return Gaussian() elif lens_type == 'GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_kappa import GaussianKappa return GaussianKappa() elif lens_type == 'GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.gaussian_kappa_ellipse import GaussianKappaEllipse return GaussianKappaEllipse() elif lens_type == 'MULTI_GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappa return MultiGaussianKappa() elif lens_type == 'MULTI_GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappaEllipse return MultiGaussianKappaEllipse() elif lens_type == 'INTERPOL': from lenstronomy.LensModel.Profiles.interpol import Interpol return Interpol(grid=False, min_grid_number=100) elif lens_type == 'INTERPOL_SCALED': from lenstronomy.LensModel.Profiles.interpol import InterpolScaled return InterpolScaled() elif lens_type == 'SHAPELETS_POLAR': from lenstronomy.LensModel.Profiles.shapelet_pot_polar import PolarShapelets return PolarShapelets() elif lens_type == 'SHAPELETS_CART': from lenstronomy.LensModel.Profiles.shapelet_pot_cartesian import CartShapelets return CartShapelets() elif lens_type == 'DIPOLE': from lenstronomy.LensModel.Profiles.dipole import Dipole return Dipole() elif lens_type == 'FOREGROUND_SHEAR': from lenstronomy.LensModel.Profiles.shear import Shear self._foreground_shear = True self._foreground_shear_idex = i return Shear() elif lens_type == 'coreBURKERT': from lenstronomy.LensModel.Profiles.coreBurkert import coreBurkert return coreBurkert() elif lens_type == 'NumericalAlpha': from lenstronomy.LensModel.Profiles.numerical_deflections import NumericalAlpha return NumericalAlpha(custom_class[i]) else: raise ValueError('%s is not a valid lens model' % lens_type)
def _import_class(lens_type, custom_class, z_lens=None, z_source=None): """ :param lens_type: string, lens model type :param custom_class: custom class :param z_lens: lens redshift # currently only used in NFW_MC model as this is redshift dependent :param z_source: source redshift # currently only used in NFW_MC model as this is redshift dependent :return: class instance of the lens model type """ if lens_type == 'SHIFT': from lenstronomy.LensModel.Profiles.alpha_shift import Shift return Shift() elif lens_type == 'SHEAR': from lenstronomy.LensModel.Profiles.shear import Shear return Shear() elif lens_type == 'SHEAR_GAMMA_PSI': from lenstronomy.LensModel.Profiles.shear import ShearGammaPsi return ShearGammaPsi() elif lens_type == 'CONVERGENCE': from lenstronomy.LensModel.Profiles.convergence import Convergence return Convergence() elif lens_type == 'FLEXION': from lenstronomy.LensModel.Profiles.flexion import Flexion return Flexion() elif lens_type == 'FLEXIONFG': from lenstronomy.LensModel.Profiles.flexionfg import Flexionfg return Flexionfg() elif lens_type == 'POINT_MASS': from lenstronomy.LensModel.Profiles.point_mass import PointMass return PointMass() elif lens_type == 'SIS': from lenstronomy.LensModel.Profiles.sis import SIS return SIS() elif lens_type == 'SIS_TRUNCATED': from lenstronomy.LensModel.Profiles.sis_truncate import SIS_truncate return SIS_truncate() elif lens_type == 'SIE': from lenstronomy.LensModel.Profiles.sie import SIE return SIE() elif lens_type == 'SPP': from lenstronomy.LensModel.Profiles.spp import SPP return SPP() elif lens_type == 'NIE': from lenstronomy.LensModel.Profiles.nie import NIE return NIE() elif lens_type == 'NIE_SIMPLE': from lenstronomy.LensModel.Profiles.nie import NIEMajorAxis return NIEMajorAxis() elif lens_type == 'CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import Chameleon return Chameleon() elif lens_type == 'DOUBLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import DoubleChameleon return DoubleChameleon() elif lens_type == 'TRIPLE_CHAMELEON': from lenstronomy.LensModel.Profiles.chameleon import TripleChameleon return TripleChameleon() elif lens_type == 'SPEP': from lenstronomy.LensModel.Profiles.spep import SPEP return SPEP() elif lens_type == 'SPEMD': from lenstronomy.LensModel.Profiles.spemd import SPEMD return SPEMD() elif lens_type == 'SPEMD_SMOOTH': from lenstronomy.LensModel.Profiles.spemd_smooth import SPEMD_SMOOTH return SPEMD_SMOOTH() elif lens_type == 'NFW': from lenstronomy.LensModel.Profiles.nfw import NFW return NFW() elif lens_type == 'NFW_ELLIPSE': from lenstronomy.LensModel.Profiles.nfw_ellipse import NFW_ELLIPSE return NFW_ELLIPSE() elif lens_type == 'NFW_ELLIPSE_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition import NFWEllipseGaussDec return NFWEllipseGaussDec() elif lens_type == 'TNFW': from lenstronomy.LensModel.Profiles.tnfw import TNFW return TNFW() elif lens_type == 'CNFW': from lenstronomy.LensModel.Profiles.cnfw import CNFW return CNFW() elif lens_type == 'CNFW_ELLIPSE': from lenstronomy.LensModel.Profiles.cnfw_ellipse import CNFW_ELLIPSE return CNFW_ELLIPSE() elif lens_type == 'CTNFW_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition import CTNFWGaussDec return CTNFWGaussDec() elif lens_type == 'NFW_MC': from lenstronomy.LensModel.Profiles.nfw_mass_concentration import NFWMC return NFWMC(z_lens=z_lens, z_source=z_source) elif lens_type == 'SERSIC': from lenstronomy.LensModel.Profiles.sersic import Sersic return Sersic() elif lens_type == 'SERSIC_ELLIPSE_POTENTIAL': from lenstronomy.LensModel.Profiles.sersic_ellipse_potential import SersicEllipse return SersicEllipse() elif lens_type == 'SERSIC_ELLIPSE_KAPPA': from lenstronomy.LensModel.Profiles.sersic_ellipse_kappa import SersicEllipseKappa return SersicEllipseKappa() elif lens_type == 'SERSIC_ELLIPSE_GAUSS_DEC': from lenstronomy.LensModel.Profiles.gauss_decomposition \ import SersicEllipseGaussDec return SersicEllipseGaussDec() elif lens_type == 'PJAFFE': from lenstronomy.LensModel.Profiles.p_jaffe import PJaffe return PJaffe() elif lens_type == 'PJAFFE_ELLIPSE': from lenstronomy.LensModel.Profiles.p_jaffe_ellipse import PJaffe_Ellipse return PJaffe_Ellipse() elif lens_type == 'HERNQUIST': from lenstronomy.LensModel.Profiles.hernquist import Hernquist return Hernquist() elif lens_type == 'HERNQUIST_ELLIPSE': from lenstronomy.LensModel.Profiles.hernquist_ellipse import Hernquist_Ellipse return Hernquist_Ellipse() elif lens_type == 'GAUSSIAN': from lenstronomy.LensModel.Profiles.gaussian_potential import Gaussian return Gaussian() elif lens_type == 'GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_kappa import GaussianKappa return GaussianKappa() elif lens_type == 'GAUSSIAN_ELLIPSE_KAPPA': from lenstronomy.LensModel.Profiles.gaussian_ellipse_kappa import GaussianEllipseKappa return GaussianEllipseKappa() elif lens_type == 'GAUSSIAN_ELLIPSE_POTENTIAL': from lenstronomy.LensModel.Profiles.gaussian_ellipse_potential import GaussianEllipsePotential return GaussianEllipsePotential() elif lens_type == 'MULTI_GAUSSIAN_KAPPA': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappa return MultiGaussianKappa() elif lens_type == 'MULTI_GAUSSIAN_KAPPA_ELLIPSE': from lenstronomy.LensModel.Profiles.multi_gaussian_kappa import MultiGaussianKappaEllipse return MultiGaussianKappaEllipse() elif lens_type == 'INTERPOL': from lenstronomy.LensModel.Profiles.interpol import Interpol return Interpol() elif lens_type == 'INTERPOL_SCALED': from lenstronomy.LensModel.Profiles.interpol import InterpolScaled return InterpolScaled() elif lens_type == 'SHAPELETS_POLAR': from lenstronomy.LensModel.Profiles.shapelet_pot_polar import PolarShapelets return PolarShapelets() elif lens_type == 'SHAPELETS_CART': from lenstronomy.LensModel.Profiles.shapelet_pot_cartesian import CartShapelets return CartShapelets() elif lens_type == 'DIPOLE': from lenstronomy.LensModel.Profiles.dipole import Dipole return Dipole() elif lens_type == 'CURVED_ARC': from lenstronomy.LensModel.Profiles.curved_arc import CurvedArc return CurvedArc() elif lens_type == 'ARC_PERT': from lenstronomy.LensModel.Profiles.arc_perturbations import ArcPerturbations return ArcPerturbations() elif lens_type == 'coreBURKERT': from lenstronomy.LensModel.Profiles.coreBurkert import CoreBurkert return CoreBurkert() elif lens_type == 'CORED_DENSITY': from lenstronomy.LensModel.Profiles.cored_density import CoredDensity return CoredDensity() elif lens_type == 'CORED_DENSITY_2': from lenstronomy.LensModel.Profiles.cored_density_2 import CoredDensity2 return CoredDensity2() elif lens_type == 'CORED_DENSITY_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY') elif lens_type == 'CORED_DENSITY_2_MST': from lenstronomy.LensModel.Profiles.cored_density_mst import CoredDensityMST return CoredDensityMST(profile_type='CORED_DENSITY_2') elif lens_type == 'NumericalAlpha': from lenstronomy.LensModel.Profiles.numerical_deflections import NumericalAlpha return NumericalAlpha(custom_class) else: raise ValueError('%s is not a valid lens model' % lens_type)
class PJaffe_Ellipse(object): """ this class contains functions concerning the NFW profile relation are: R_200 = c * Rs """ def __init__(self): self.spherical = PJaffe() self._diff = 0.000001 def function(self, x, y, sigma0, Ra, Rs, q, phi_G, center_x=0, center_y=0): """ returns double integral of NFW profile """ x_shift = x - center_x y_shift = y - center_y cos_phi = np.cos(phi_G) sin_phi = np.sin(phi_G) e = min(abs(1. - q), 0.99) x_ = (cos_phi * x_shift + sin_phi * y_shift) * np.sqrt(1 - e) y_ = (-sin_phi * x_shift + cos_phi * y_shift) * np.sqrt(1 + e) f_ = self.spherical.function(x_, y_, sigma0, Ra, Rs) return f_ def derivatives(self, x, y, sigma0, Ra, Rs, q, phi_G, center_x=0, center_y=0): """ returns df/dx and df/dy of the function (integral of NFW) """ x_shift = x - center_x y_shift = y - center_y cos_phi = np.cos(phi_G) sin_phi = np.sin(phi_G) e = min(abs(1. - q), 0.99) x_ = (cos_phi * x_shift + sin_phi * y_shift) * np.sqrt(1 - e) y_ = (-sin_phi * x_shift + cos_phi * y_shift) * np.sqrt(1 + e) f_x_prim, f_y_prim = self.spherical.derivatives(x_, y_, sigma0, Ra, Rs, center_x=0, center_y=0) f_x_prim *= np.sqrt(1 - e) f_y_prim *= np.sqrt(1 + e) f_x = cos_phi * f_x_prim - sin_phi * f_y_prim f_y = sin_phi * f_x_prim + cos_phi * f_y_prim return f_x, f_y def hessian(self, x, y, sigma0, Ra, Rs, q, phi_G, center_x=0, center_y=0): """ returns Hessian matrix of function d^2f/dx^2, d^f/dy^2, d^2/dxdy """ alpha_ra, alpha_dec = self.derivatives(x, y, sigma0, Ra, Rs, q, phi_G, center_x, center_y) diff = self._diff alpha_ra_dx, alpha_dec_dx = self.derivatives(x + diff, y, sigma0, Ra, Rs, q, phi_G, center_x, center_y) alpha_ra_dy, alpha_dec_dy = self.derivatives(x, y + diff, sigma0, Ra, Rs, q, phi_G, center_x, center_y) f_xx = (alpha_ra_dx - alpha_ra) / diff f_xy = (alpha_ra_dy - alpha_ra) / diff #f_yx = (alpha_dec_dx - alpha_dec)/diff f_yy = (alpha_dec_dy - alpha_dec) / diff return f_xx, f_yy, f_xy def mass_3d_lens(self, r, sigma0, Ra, Rs, q=1, phi_G=0): """ :param r: :param sigma0: :param Ra: :param Rs: :param q: :param phi_G: :return: """ return self.spherical.mass_3d_lens(r, sigma0, Ra, Rs)
class PJaffe_Ellipse(LensProfileBase): """ this class contains functions concerning the NFW profile relation are: R_200 = c * Rs """ param_names = ['sigma0', 'Ra', 'Rs', 'e1', 'e2', 'center_x', 'center_y'] lower_limit_default = { 'sigma0': 0, 'Ra': 0, 'Rs': 0, 'e1': -0.5, 'e2': -0.5, 'center_x': -100, 'center_y': -100 } upper_limit_default = { 'sigma0': 10, 'Ra': 100, 'Rs': 100, 'e1': 0.5, 'e2': 0.5, 'center_x': 100, 'center_y': 100 } def __init__(self): self.spherical = PJaffe() self._diff = 0.000001 super(PJaffe_Ellipse, self).__init__() def function(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns double integral of NFW profile """ phi_G, q = param_util.ellipticity2phi_q(e1, e2) x_shift = x - center_x y_shift = y - center_y cos_phi = np.cos(phi_G) sin_phi = np.sin(phi_G) e = min(abs(1. - q), 0.99) x_ = (cos_phi * x_shift + sin_phi * y_shift) * np.sqrt(1 - e) y_ = (-sin_phi * x_shift + cos_phi * y_shift) * np.sqrt(1 + e) f_ = self.spherical.function(x_, y_, sigma0, Ra, Rs) return f_ def derivatives(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns df/dx and df/dy of the function (integral of NFW) """ phi_G, q = param_util.ellipticity2phi_q(e1, e2) x_shift = x - center_x y_shift = y - center_y cos_phi = np.cos(phi_G) sin_phi = np.sin(phi_G) e = min(abs(1. - q), 0.99) x_ = (cos_phi * x_shift + sin_phi * y_shift) * np.sqrt(1 - e) y_ = (-sin_phi * x_shift + cos_phi * y_shift) * np.sqrt(1 + e) f_x_prim, f_y_prim = self.spherical.derivatives(x_, y_, sigma0, Ra, Rs, center_x=0, center_y=0) f_x_prim *= np.sqrt(1 - e) f_y_prim *= np.sqrt(1 + e) f_x = cos_phi * f_x_prim - sin_phi * f_y_prim f_y = sin_phi * f_x_prim + cos_phi * f_y_prim return f_x, f_y def hessian(self, x, y, sigma0, Ra, Rs, e1, e2, center_x=0, center_y=0): """ returns Hessian matrix of function d^2f/dx^2, d^f/dy^2, d^2/dxdy """ alpha_ra, alpha_dec = self.derivatives(x, y, sigma0, Ra, Rs, e1, e2, center_x, center_y) diff = self._diff alpha_ra_dx, alpha_dec_dx = self.derivatives(x + diff, y, sigma0, Ra, Rs, e1, e2, center_x, center_y) alpha_ra_dy, alpha_dec_dy = self.derivatives(x, y + diff, sigma0, Ra, Rs, e1, e2, center_x, center_y) f_xx = (alpha_ra_dx - alpha_ra) / diff f_xy = (alpha_ra_dy - alpha_ra) / diff #f_yx = (alpha_dec_dx - alpha_dec)/diff f_yy = (alpha_dec_dy - alpha_dec) / diff return f_xx, f_yy, f_xy def mass_3d_lens(self, r, sigma0, Ra, Rs, e1=0, e2=0): """ :param r: :param sigma0: :param Ra: :param Rs: :param q: :param phi_G: :return: """ return self.spherical.mass_3d_lens(r, sigma0, Ra, Rs)
def setup(self): self.profile = PJaffe()