示例#1
0
    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
示例#2
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)
示例#3
0
    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
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#10
0
    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)
示例#11
0
                                   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")
示例#12
0
    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)
示例#13
0
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(