def test__effective_radius_from_combined_profile(self): hernquist = l1d.Hernquist(effective_radius=1.0, mass=100.0, redshift_source=0.5, redshift_lens=1.0) combined = l1d.CombinedProfile(profiles=[hernquist]) assert combined.effective_radius == 1.0
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__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__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__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_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__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__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)
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) print(DM.scale_radius) radii = np.arange(0.4, 100, 0.001) true_profile = l1d.CombinedProfile(profiles=[baryons, DM]) true_profile_cored = l1d.CombinedProfile(profiles=[baryons_mass, DM_cored]) einstein_radius = true_profile.einstein_radius_in_kpc_from_radii(radii=radii) rho_isothermal = isothermal.density_from_radii(radii=radii) rho_no_bh = no_bh.density_from_radii(radii=radii) * 2 rho_baryons = baryons.density_from_radii(radii=radii) rho_baryons_2 = baryons_mass.density_from_radii(radii=radii) * 0.05 rho_DM = DM.density_from_radii(radii=radii) rho_total = true_profile.density_from_radii(radii=radii) rho_DM_cored = DM_cored.density_from_radii(radii=radii) * 0.05 total_DM_cored = true_profile_cored.density_from_radii(radii=radii) * 0.05 fig6 = plt.figure(6) plt.loglog(radii, rho_baryons, "--", label="baryons", color="lightcoral")
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) einstein_radius = true_profile.einstein_radius_in_kpc_from_radii( radii=radii)
radii = np.arange(0.01, 50, 0.001) DM_Hilb = l1d.NFWHilbert( mass_at_200=slacs["M200"][lens_name], redshift_lens=slacs["z_lens"][lens_name], redshift_source=slacs["z_source"][lens_name], ) Hernquist = l1d.Hernquist( mass=10**slacs["log[M*/M]_chab"][lens_name], effective_radius=slacs["R_eff"][lens_name], redshift_lens=slacs["z_lens"][lens_name], redshift_source=slacs["z_source"][lens_name], ) true_profile = l1d.CombinedProfile(profiles=[Hernquist, DM_Hilb]) kappa_baryons = Hernquist.convergence_from_radii(radii=radii) kappa_DM = DM_Hilb.convergence_from_radii(radii=radii) einstein_radius = true_profile.einstein_radius_in_kpc_from_radii(radii=radii) effective_radius = true_profile.effective_radius kappa_total = true_profile.convergence_from_radii(radii=radii) fit = l1d.PowerLawFit(profile=true_profile, mask=None, radii=radii) lens_slope = fit.slope_via_lensing() dyn_slope = fit.slope_and_normalisation_via_dynamics()[1] kappa_lensing = fit.convergence_via_lensing() kappa_dynamics = fit.convergence_via_dynamics() kappa_best_fit = fit.convergence()
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) fit_ein = l1d.PowerLawFit(profile=total, mask=mask_einstein_radius, radii=radii) print("concentration:", DM_Hilb.concentration) print(