示例#1
0
    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)
示例#2
0
    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
示例#3
0
    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)
示例#4
0
    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)
示例#5
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)
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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
示例#10
0
    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
示例#11
0
    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)
示例#12
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
示例#13
0
    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)
示例#14
0
    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)
示例#15
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)
示例#16
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)
示例#17
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)
示例#18
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)
示例#21
0
    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)
示例#22
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)
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)
示例#24
0
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)
示例#26
0
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)