def test_compare_to_autogalaxy__radius_at_200_equal_in_desired_units(self): cosmo = cosmology.Planck15 ag_nfw = ag.mp.SphericalNFWMCRLudlow(mass_at_200=2.5e14, redshift_object=0.5, redshift_source=1.0) l1d_nfw = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.5, redshift_source=1.0) scale_radius_kpc = ag_nfw.scale_radius / ag.util.cosmology.arcsec_per_kpc_from( redshift=0.5, cosmology=cosmo) radius_at_200 = ag_nfw.radius_at_200_for_units(redshift_object=0.5, redshift_source=1.0, unit_length="kpc") assert l1d_nfw.radius_at_200.value == pytest.approx( radius_at_200, 1e-3) assert l1d_nfw.scale_radius == pytest.approx(scale_radius_kpc, 1e-3) assert l1d_nfw.kappa_s == pytest.approx(ag_nfw.kappa_s, 1e-3)
def test__convergence_at_einstein_radius_less_than_one(self): nfw = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=0.8) radii = np.arange(0.2, 30, 0.002) kappa_ein = nfw.convergence_at_einstein_radius_from_radii(radii=radii) assert kappa_ein < 1
def test__surface_mass_density_values_correct(self): NFWHilbert = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_source=1.0, redshift_lens=0.5) sigma = NFWHilbert.surface_mass_density_from_radii( radii=np.array([132.3960792, 264.79215844891064, 397.1882377])) assert sigma == pytest.approx(np.array([470603968.6, 0, 134337210.4]), 1e-3)
def test__convergence_equal_to_surface_mass_density_divided_by_sigma_crit( self): NFW = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=0.8) radii = np.arange(0.2, 30, 0.002) rho = NFW.surface_mass_density_from_radii(radii=radii) kappa = NFW.convergence_from_radii(radii=radii) kappa_via_sigma = rho / NFW.critical_surface_density_of_lens assert kappa == pytest.approx(kappa_via_sigma, 1e-4)
def test__f_dm_equal_to_one_for_nfw_only_profile(self): dm = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=1.0) combined = l1d.CombinedProfile(profiles=[dm]) radii = np.arange(0.2, 8, 0.002) f_dm_ein = combined.dark_matter_mass_fraction_within_einstein_radius_from_radii( radii=radii) assert f_dm_ein == pytest.approx(1, 1e-4)
def test__density_values_correct(self): NFWHilbert = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_source=1.0, redshift_lens=0.5) rho_s = NFWHilbert.rho_s rho = NFWHilbert.density_from_radii( radii=np.array([132.3960792, 264.79215844891064, 397.1882377])) assert rho == pytest.approx( np.array([1137753.844, 319993.2686, 136530.4613]), 1e-3) assert rho_s == pytest.approx(1279973.074564, 1e-3)
def test__average_density_inside_einstein_radius_equal_to_sigma_crit(self): power_law = l1d.SphericalPowerLaw(einstein_radius=1.8, slope=1.7, redshift_source=0.8, redshift_lens=0.3) sigma_crit = power_law.critical_surface_density_of_lens integrand = (lambda r: 2 * np.pi * r * power_law. surface_mass_density_from_radii(radii=r)) av_density = integrate.quad(integrand, 0, power_law.einstein_radius)[0] / ( np.pi * power_law.einstein_radius**2) assert av_density == pytest.approx(sigma_crit, 1e-3) Hernquist = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) radii = np.arange(0.01, 10, 0.001) einstein_radius = Hernquist.einstein_radius_in_kpc_from_radii( radii=radii) sigma_crit = Hernquist.critical_surface_density_of_lens integrand = (lambda r: 2 * np.pi * r * Hernquist. surface_mass_density_from_radii(radii=r)) av_density = integrate.quad( integrand, 0, einstein_radius)[0] / (np.pi * einstein_radius**2) assert av_density == pytest.approx(sigma_crit, 1e-3) nfw = l1d.NFWHilbert(mass_at_200=2.5e13, redshift_lens=0.6, redshift_source=1.2) radii = np.arange(0.01, 3, 0.001) einstein_radius = nfw.einstein_radius_in_kpc_from_radii(radii=radii) sigma_crit = nfw.critical_surface_density_of_lens integrand = (lambda r: 2 * np.pi * r * nfw. surface_mass_density_from_radii(radii=r)) av_density = integrate.quad( integrand, 0, einstein_radius)[0] / (np.pi * einstein_radius**2) assert av_density == pytest.approx(sigma_crit, 1e-3)
def test__convergence_values_correct(self): NFWHilbert = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_source=1.0, redshift_lens=0.5) kappa = NFWHilbert.convergence_from_radii( radii=np.array([132.3960792, 264.79215844891064, 397.1882377])) kappa_s = NFWHilbert.kappa_s assert kappa == pytest.approx( np.array([0.1567668617, 0, 0.04475020184]), 1e-3) assert kappa_s == pytest.approx(0.1129027792225471, 1e-3)
def test__convergence_from_deflections_and_analytic(self): NFWHilbert = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_source=0.8, redshift_lens=0.3) radii = np.arange(1, 5, 0.00002) kappa_analytic = NFWHilbert.convergence_from_radii(radii=radii) kappa_from_deflections = convergence_via_deflections_from_profile_and_radii( profile=NFWHilbert, radii=radii) mean_error = np.average(kappa_analytic - kappa_from_deflections) assert mean_error < 1e-3
def test__tangential_eigenvalue_equal_to_from_alpha(self): radii = np.arange(0.2, 3, 0.001) power_law = l1d.SphericalPowerLaw(einstein_radius=1.8, slope=1.8, redshift_source=0.8, redshift_lens=0.3) eigenvalue = power_law.tangential_eigenvalue_from_radii(radii=radii) alpha = power_law.deflections_from_radii(radii=radii) eigenvalue_alpha = 1 - alpha / radii mean_error = np.mean(eigenvalue_alpha - eigenvalue) assert mean_error < 1e-4 nfw = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=0.8) radii = np.arange(0.2, 3, 0.002) eigenvalue = nfw.tangential_eigenvalue_from_radii(radii=radii) alpha = nfw.deflections_from_radii(radii=radii) eigenvalue_alpha = 1 - alpha / radii mean_error = np.mean(eigenvalue_alpha - eigenvalue) assert mean_error < 1e-4 Hernquist = l1d.Hernquist(mass=3.4e10, effective_radius=1.8153, redshift_lens=0.3, redshift_source=0.8) radii = np.arange(0.2, 3, 0.002) eigenvalue = Hernquist.tangential_eigenvalue_from_radii(radii=radii) alpha = Hernquist.deflections_from_radii(radii=radii) eigenvalue_alpha = 1 - alpha / radii mean_error = np.mean(eigenvalue_alpha - eigenvalue) assert mean_error < 1e-4
def test__mean_NFW_convergence_within_einstein_radius_equal_to_one(self): nfw = l1d.NFWHilbert(mass_at_200=2.5e13, redshift_lens=0.6, redshift_source=1.2) radii = np.arange(0.01, 3, 0.001) einstein_radius = nfw.einstein_radius_in_kpc_from_radii(radii=radii) integrand = lambda r: 2 * np.pi * r * nfw.convergence_from_radii(radii= r) av_kappa = integrate.quad( integrand, 0, einstein_radius)[0] / (np.pi * einstein_radius**2) assert av_kappa == pytest.approx(1, 1e-3)
def test__convergence_at_einstein_radius_less_than_one(self): dm = l1d.NFWHilbert(mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=1.0) baryons = l1d.Hernquist(mass=3.4e11, effective_radius=3.2, redshift_lens=0.3, redshift_source=1.0) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 8, 0.002) kappa_ein = combined.convergence_at_einstein_radius_from_radii( radii=radii) assert kappa_ein < 1
def test__mass_inside_einstein_radius_equal_to_einstein_mass(self): power_law = l1d.SphericalPowerLaw(einstein_radius=1.8, slope=1.7, redshift_source=0.8, redshift_lens=0.3) radii = np.arange(0.2, 3, 0.002) einstein_mass = power_law.einstein_mass_in_solar_masses_from_radii( radii=radii) mass_within_r_ein = power_law.two_dimensional_mass_enclosed_within_radii( power_law.einstein_radius) assert einstein_mass == pytest.approx(mass_within_r_ein, 1e-4) Hernquist = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) radii = np.arange(0.2, 100, 0.001) einstein_radius = Hernquist.einstein_radius_in_kpc_from_radii( radii=radii) einstein_mass = Hernquist.einstein_mass_in_solar_masses_from_radii( radii=radii) mass_within_r_ein = Hernquist.two_dimensional_mass_enclosed_within_radii( einstein_radius) assert einstein_mass == pytest.approx(mass_within_r_ein, 1e-3) nfw = l1d.NFWHilbert(mass_at_200=2.5e13, redshift_lens=0.6, redshift_source=1.2) radii = np.arange(0.01, 3, 0.001) einstein_radius = nfw.einstein_radius_in_kpc_from_radii(radii=radii) einstein_mass = nfw.einstein_mass_in_solar_masses_from_radii( radii=radii) mass_within_r_ein = nfw.two_dimensional_mass_enclosed_within_radii( einstein_radius) assert einstein_mass == pytest.approx(mass_within_r_ein, 1e-3)
def test__compare_to_autogalaxy__sigma_crit_equal_in_desired_units(self): cosmo = cosmology.Planck15 nfw = l1d.NFWHilbert(mass_at_200=2.5e10, redshift_lens=0.3, redshift_source=0.8) sigma_crit = nfw.critical_surface_density_of_lens autolens_sigma_crit = ag.util.cosmology.critical_surface_density_between_redshifts_from( redshift_1=0.8, redshift_0=0.3, unit_length="kpc", unit_mass="solMass", cosmology=cosmo, ) assert sigma_crit == pytest.approx(autolens_sigma_crit, 1e-4)
def test__deflections_equals_sum_of_individual_profile_deflections(self): dm = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.3, redshift_source=1.0) baryons = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 3, 0.002) alpha_combined = combined.deflections_from_radii(radii=radii) alpha_NFW = dm.deflections_from_radii(radii=radii) alpha_pl = baryons.deflections_from_radii(radii=radii) assert alpha_combined == pytest.approx(alpha_NFW + alpha_pl, 1e-4)
def test__convergence_equals_sum_of_individual_profile_convergence(self): dm = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.3, redshift_source=1.0) baryons = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 3, 0.002) kappa_combined = combined.convergence_from_radii(radii=radii) kappa_NFW = dm.convergence_from_radii(radii=radii) kappa_pl = baryons.convergence_from_radii(radii=radii) kappa_sum = kappa_NFW + kappa_pl assert kappa_combined == pytest.approx(kappa_sum, 1e-4)
def test__surface_mass_density_equals_sum_of_individual_profiles(self): dm = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.3, redshift_source=1.0) baryons = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 3, 0.002) sigma_combined = combined.surface_mass_density_from_radii(radii=radii) sigma_NFW = dm.surface_mass_density_from_radii(radii=radii) sigma_pl = baryons.surface_mass_density_from_radii(radii=radii) sigma_sum = sigma_NFW + sigma_pl assert sigma_combined == pytest.approx(sigma_sum, 1e-4)
def test__convergence_from_deflections_and_analytic(self): dm = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.3, redshift_source=1.0) baryons = l1d.Hernquist(mass=3.4e11, effective_radius=8.4, redshift_lens=0.6, redshift_source=1.2) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 8, 0.002) kappa_analytic = combined.convergence_from_radii(radii=radii) kappa_from_deflections = convergence_via_deflections_from_profile_and_radii( profile=combined, radii=radii) mean_error = np.average(kappa_analytic - kappa_from_deflections) assert mean_error < 1e-4
def test__three_d_mass_from_dynamics_slope_and_normalization_equals_analytic(self): dm = l1d.NFWHilbert( mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=1.0 ) baryons = l1d.Hernquist( mass=3.4e11, effective_radius=3.2, redshift_lens=0.3, redshift_source=1.0 ) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 8, 0.002) fit = l1d.PowerLawFit(profile=combined, mask=None, radii=radii) rho_0, slope = fit.slope_and_normalisation_via_dynamics() reff = combined.effective_radius mdyn = combined.three_dimensional_mass_enclosed_within_effective_radius mdyn_from_dyn = mass_dynamical(rho0=rho_0, g=slope, Reff=reff * u.kpc) assert mdyn == pytest.approx(mdyn_from_dyn, 1e-3)
def test__einstein_mass_from_dynamics_slope_and_normalization_equals_analytic(self): dm = l1d.NFWHilbert( mass_at_200=2.5e12, redshift_lens=0.3, redshift_source=1.0 ) baryons = l1d.Hernquist( mass=3.4e11, effective_radius=3.2, redshift_lens=0.3, redshift_source=1.0 ) combined = l1d.CombinedProfile(profiles=[dm, baryons]) radii = np.arange(0.2, 8, 0.002) fit = l1d.PowerLawFit(profile=combined, mask=None, radii=radii) rho_0, slope = fit.slope_and_normalisation_via_dynamics() rein = combined.einstein_radius_in_kpc_from_radii(radii=radii) mein = combined.einstein_mass_in_solar_masses_from_radii(radii=radii) mein_from_dyn = mass_einstein(rho0=rho_0, g=slope, Rein=rein * u.kpc) assert mein == pytest.approx(mein_from_dyn, 1e-3)
def test__compare_to_autogalaxy__nfw_einstein_radius_equal_in_desired_units( self): cosmo = cosmology.Planck15 ## ONLY PASSSES FOR HIGH RESOLUTION AUTOLENS GRID ag_nfw = ag.mp.SphericalNFWMCRLudlow(mass_at_200=2.5e14, redshift_object=0.3, redshift_source=1.0) l1d_nfw = l1d.NFWHilbert(mass_at_200=2.5e14, redshift_lens=0.3, redshift_source=1.0) radii = np.arange(0.01, 5, 0.001) einstein_radius = l1d_nfw.einstein_radius_in_kpc_from_radii( radii=radii) ag_einstein_radius = ag_nfw.einstein_radius_in_units( unit_length="kpc", redshift_object=0.3, cosmology=cosmo) assert einstein_radius == pytest.approx(ag_einstein_radius, 1e-2)
def test__mean_combined_convergence_within_einstein_radius_equal_to_one( self): nfw = l1d.NFWHilbert(mass_at_200=2.5e13, redshift_lens=0.5, redshift_source=1.0) Hernquist = l1d.Hernquist(mass=2e11, effective_radius=5, redshift_lens=0.5, redshift_source=1.0) combined = l1d.CombinedProfile([nfw, Hernquist]) radii = np.arange(0.1, 8, 0.001) einstein_radius = combined.einstein_radius_in_kpc_from_radii( radii=radii) integrand = lambda r: 2 * np.pi * r * combined.convergence_from_radii( radii=r) av_kappa = integrate.quad( integrand, 0, einstein_radius)[0] / (np.pi * einstein_radius**2) assert av_kappa == pytest.approx(1, 1e-3)
import matplotlib.pyplot as plt import numpy as np import lens1d as l1d from astropy import cosmology cosmo = cosmology.Planck15 fig_path = "/Users/dgmt59/Documents/Plots/1D/" radii = np.arange(0.01, 1000, 0.001) DM_Hilb = l1d.NFWHilbert( mass_at_200=1.27e13, redshift_lens=0.351, redshift_source=1.071 ) Hernquist = l1d.Hernquist( mass=10 ** 11.21, effective_radius=5.68, redshift_lens=0.351, redshift_source=1.071 ) Hernquist_2 = l1d.CombinedProfile(profiles=[Hernquist]) total = l1d.CombinedProfile(profiles=[Hernquist, DM_Hilb]) kappa_total = total.convergence_from_radii(radii=radii) alpha = Hernquist.deflections_from_radii(radii=radii) d_alpha = np.gradient(alpha, radii[:]) dd_alpha = np.gradient(d_alpha, radii[:]) mask_einstein_radius = total.mask_radial_range_from_radii( lower_bound=0.9, upper_bound=1.0, radii=radii ) fit = l1d.PowerLawFit(profile=total, mask=None, radii=radii)
import lens1d as l1d fig_path = "/Users/dgmt59/Documents/Plots/one_d_slacs/" baryons = l1d.Hernquist(mass=10**11.4, effective_radius=5.4, redshift_lens=0.232, redshift_source=1.3) baryons_mass = l1d.Hernquist(mass=10**12.9, effective_radius=1.1, redshift_lens=0.3, redshift_source=0.8) DM = l1d.NFWHilbert(mass_at_200=2.31e13, redshift_lens=0.3, redshift_source=0.8) isothermal = l1d.SphericalPowerLaw(einstein_radius=1.4, slope=2.0, redshift_lens=0.3, redshift_source=0.8) no_bh = l1d.SphericalPowerLaw(einstein_radius=1.4, slope=3.0, redshift_lens=0.3, redshift_source=0.8) DM_cored = l1d.generalisedNFW(mass_at_200=1.21e13, beta=1.9, redshift_lens=0.3, redshift_source=0.8)
import lens1d as l1d fig_path = "/Users/dgmt59/Documents/Plots/one_d_slacs/" baryons = l1d.Hernquist(mass=10**11.53, effective_radius=8.4, redshift_lens=0.232, redshift_source=1.3) baryons_mass = l1d.Hernquist(mass=10**11.53, effective_radius=8.4, redshift_lens=0.232, redshift_source=1.3) DM = l1d.NFWHilbert(mass_at_200=1.5e12, redshift_lens=0.232, redshift_source=1.3) isothermal = l1d.SphericalPowerLaw(einstein_radius=1.5, slope=2.0, redshift_lens=0.132, redshift_source=1.3) DM_cored = l1d.generalisedNFW(mass_at_200=1.5e12, beta=1.6, redshift_lens=0.232, redshift_source=1.3) print(DM.scale_radius) radii = np.arange(0.2, 200, 0.001)
lens_name_check = np.array(["slacs0912+0029"]) for lens in lens_name: f = open(f"{lens}_mass_test_1d", "w") for mass in masses: baryons = l1d.Hernquist( mass=10**mass, effective_radius=slacs["R_eff"][lens], redshift_lens=slacs["z_lens"][lens], redshift_source=slacs["z_source"][lens], ) DM = l1d.NFWHilbert( mass_at_200=slacs["M200"][lens], redshift_lens=slacs["z_lens"][lens], redshift_source=slacs["z_source"][lens], ) true_profile = l1d.CombinedProfile(profiles=[baryons, DM]) mask_einstein_radius = true_profile.mask_einstein_radius_from_radii( width=5, radii=radii) fit_mask = l1d.PowerLawFit(profile=true_profile, radii=radii, mask=mask_einstein_radius) fit_no_mask = l1d.PowerLawFit(profile=true_profile, radii=radii, mask=None)