示例#1
0
    def test_rescale_norm(self):

        kwargs_halo = {'c_scatter': True}
        realization = SingleHalo(10**9,
                                 0.,
                                 0.,
                                 'TNFW',
                                 0.6,
                                 0.5,
                                 1.5,
                                 subhalo_flag=False,
                                 kwargs_halo=kwargs_halo)

        lens_model_list, zlist, kwargs_init, _ = realization.lensing_quantities(
            False)
        realization_copy = deepcopy(realization)
        lens_model_list, zlist, kwargs_copy, _ = realization_copy.lensing_quantities(
            False)
        npt.assert_equal(kwargs_init[0]['alpha_Rs'],
                         kwargs_copy[0]['alpha_Rs'])

        rescale = 0.7
        realization.halos[0].rescale_normalization(rescale)
        realization_copy.halos[0].rescale_normalization(rescale)
        lens_model_list, zlist, kwargs, _ = realization.lensing_quantities(
            False)
        lens_model_list, zlist, kwargs_copy, _ = realization.lensing_quantities(
            False)
        npt.assert_equal(kwargs_init[0]['alpha_Rs'] * rescale,
                         kwargs[0]['alpha_Rs'])
        npt.assert_equal(kwargs_init[0]['alpha_Rs'] * rescale,
                         kwargs_copy[0]['alpha_Rs'])
示例#2
0
    def test_profile_normalization(self):
        """
        Test that the mass enclosed within r200 of the composite profile is correct
        and check that the ULDM core density is correct.
        """
        profile_args = {'log10_m_uldm': -21, 'uldm_plaw': 1/3, 'scale_nfw':True}
        mass = 1e10
        zl = 0.5
        zs = 1.5
        single_halo = SingleHalo(mass, 0.5, 0.5, 'ULDM', zl, zl, zs, None, True, profile_args, None)
        _, _, kwargs_lens, _ = single_halo.lensing_quantities(add_mass_sheet_correction=False)
        Rs_angle, _ = single_halo.halos[0].lens_cosmo.nfw_physical2angle(mass, single_halo.halos[0].c, zl)
        sigma_crit = single_halo.halos[0].lens_cosmo.sigmacrit
        r200 = single_halo.halos[0].c * Rs_angle
        cnfw_kwargs, uldm_kwargs = kwargs_lens

        M_nfw = CNFW().mass_3d_lens(r200, cnfw_kwargs['Rs'], cnfw_kwargs['alpha_Rs']*sigma_crit, cnfw_kwargs['r_core'])
        M_uldm = Uldm().mass_3d_lens(r200, uldm_kwargs['kappa_0']*sigma_crit, uldm_kwargs['theta_c'])

        npt.assert_almost_equal((M_uldm+M_nfw)/mass,1,decimal=2) # less than 1% error
        _,theta_c,kappa_0 = single_halo.halos[0].profile_args
        rho0 = Uldm().density_lens(0,uldm_kwargs['kappa_0'],
                                    uldm_kwargs['theta_c'])
        rhos = CNFW().density_lens(0,cnfw_kwargs['Rs'],
                                 cnfw_kwargs['alpha_Rs'],
                                 cnfw_kwargs['r_core'])
        rho_goal = Uldm().density_lens(0,kappa_0,theta_c)
        npt.assert_array_less(np.array([1-(rho0+rhos)/rho_goal]),np.array([0.03])) # less than 3% error
示例#3
0
    def test_single_halo(self):

        single_halo = SingleHalo(10**8, 0.5, -0.1, 'TNFW', 0.5, 0.5, 1.5)
        lens_model_list, redshift_array, kwargs_lens, kwargs_lensmodel = single_halo.lensing_quantities(
        )
        npt.assert_equal(len(lens_model_list), 1)
        npt.assert_string_equal(lens_model_list[0], 'TNFW')
示例#4
0
    def test_profile_load(self):

        profile_args = {'amp': 1, 'sigma': 1, 'center_x': 0, 'center_y': 0}

        single_halo = SingleHalo(1e8, 0.5, 0.5, 'GAUSSIAN_KAPPA', 0.5, 0.5,
                                 1.5, None, True, profile_args, None)
        lens_model_list, redshift_array, kwargs_lens, numerical_interp = single_halo.\
            lensing_quantities(add_mass_sheet_correction=False)
        npt.assert_string_equal(lens_model_list[0], 'GAUSSIAN_KAPPA')
    def test_add_ULDM_fluctuations(self):

        single_halo = SingleHalo(10**8,
                                 0.5,
                                 -0.1,
                                 'TNFW',
                                 0.5,
                                 0.5,
                                 1.5,
                                 subhalo_flag=True)
        ext = RealizationExtensions(single_halo)
        wavelength = 0.6  #kpc, correpsonds to m=10^-22 eV for ULDM
        amp_var = 0.04  #in convergence units
        fluc_var = wavelength
        n_cut = 1e4

        # apeture
        x_images = np.array([-0.347, -0.734, -1.096, 0.207])
        y_images = np.array([0.964, 0.649, -0.079, -0.148])
        args_aperture = {
            'x_images': x_images,
            'y_images': y_images,
            'aperture': 0.25
        }

        ext.add_ULDM_fluctuations(wavelength,
                                  amp_var,
                                  fluc_var,
                                  shape='aperture',
                                  args=args_aperture,
                                  n_cut=n_cut)

        #ring
        args_ring = {'rmin': 0.95, 'rmax': 1.05}
        ext.add_ULDM_fluctuations(wavelength,
                                  amp_var,
                                  fluc_var,
                                  shape='ring',
                                  args=args_ring,
                                  n_cut=n_cut)

        #ellipse
        args_ellipse = {
            'amin': 0.8,
            'amax': 1.7,
            'bmin': 0.4,
            'bmax': 1.2,
            'angle': np.pi / 4
        }
        ext.add_ULDM_fluctuations(wavelength,
                                  amp_var,
                                  fluc_var,
                                  shape='ellipse',
                                  args=args_ellipse,
                                  n_cut=n_cut)
示例#6
0
    def test_profile_load(self):

        # test cored composite profile

        profile_args = {'log10_m_uldm': -22, 'uldm_plaw': 1/3, 'scale_nfw':False}

        single_halo = SingleHalo(1e8, 0.5, 0.5, 'ULDM', 0.5, 0.5, 1.5, None, True, profile_args, None)
        lens_model_list, redshift_array, kwargs_lens, numerical_interp = single_halo.\
            lensing_quantities(add_mass_sheet_correction=False)
        npt.assert_string_equal(lens_model_list[1], 'ULDM')
        npt.assert_string_equal(lens_model_list[0], 'CNFW')
        npt.assert_equal(True, len(kwargs_lens)==2)
        npt.assert_equal(True, len(redshift_array)==2)
    def setup(self):

        realization = SingleHalo(10**8,
                                 0.,
                                 0.,
                                 'TNFW',
                                 0.1,
                                 0.5,
                                 1.2,
                                 subhalo_flag=False)
        zlist = np.arange(0.1, 1.2, 0.05)
        rmax = 0.3
        for i, zi in enumerate(zlist):

            xi, yi = 0., 0.
            mi = np.random.uniform(7, 8)
            single_halo = SingleHalo(10**mi,
                                     xi,
                                     yi,
                                     'TNFW',
                                     zi,
                                     0.5,
                                     1.2,
                                     subhalo_flag=False)
            realization = realization.join(single_halo)

        cosmo = Cosmology()
        self.realization = realization
        self.rmax = rmax

        zlist = np.arange(0.00, 1.2, 0.02)
        x_image = [0.] * len(zlist)
        y_image = [0.] * len(zlist)
        dlist = [cosmo.D_C_transverse(zi) for zi in zlist]

        self.x_image_interp_list = [interp1d(dlist, x_image)]
        self.y_image_interp_list = [interp1d(dlist, y_image)]
    def test_core_collapsed_halo(self):

        single_halo = SingleHalo(10**8,
                                 0.5,
                                 -0.1,
                                 'TNFW',
                                 0.5,
                                 0.5,
                                 1.5,
                                 subhalo_flag=True)
        ext = RealizationExtensions(single_halo)
        new = ext.add_core_collapsed_halos([0],
                                           log_slope_halo=3.,
                                           x_core_halo=0.05)
        lens_model_list = new.lensing_quantities()[0]
        npt.assert_string_equal(lens_model_list[0], 'SPL_CORE')
    def core_collapsed_halos(self):
        def timescalefunction_short(rhos, rs, v):
            return 1e-9

        def timescalefunction_long(rhos, rs, v):
            return 1e9

        single_halo = SingleHalo(10**8,
                                 0.5,
                                 -0.1,
                                 'TNFW',
                                 0.5,
                                 0.5,
                                 1.5,
                                 subhalo_flag=True)
        ext = RealizationExtensions(single_halo)
        vfunc = lambda x: 4 / np.sqrt(3.1459)

        indexes = ext.find_core_collapsed_halos(timescalefunction_short, vfunc)
        npt.assert_equal(True, 0 in indexes)
        indexes = ext.find_core_collapsed_halos(timescalefunction_long, vfunc)
        npt.assert_equal(False, 0 in indexes)
    def test_collapse_by_mass(self):

        cosmo = Cosmology()
        m_list = 10**np.random.uniform(6, 10, 1000)
        realization = SingleHalo(m_list[0],
                                 0.5,
                                 -0.1,
                                 'TNFW',
                                 0.5,
                                 0.5,
                                 1.5,
                                 subhalo_flag=True,
                                 cosmo=cosmo)
        for mi in m_list[1:]:
            single_halo = SingleHalo(mi,
                                     0.5,
                                     -0.1,
                                     'TNFW',
                                     0.5,
                                     0.5,
                                     1.5,
                                     subhalo_flag=True,
                                     cosmo=cosmo)
            realization = realization.join(single_halo)
            single_halo = SingleHalo(mi,
                                     0.5,
                                     -0.1,
                                     'TNFW',
                                     0.5,
                                     0.5,
                                     1.5,
                                     subhalo_flag=False,
                                     cosmo=cosmo)
            realization = realization.join(single_halo)

        ext = RealizationExtensions(realization)

        mass_range_subs = [[6, 8], [8, 10]]
        mass_range_field = [[6, 8], [8, 10]]
        p_subs = [0.3, 0.9]
        p_field = [0.8, 0.25]
        kwargs_halo = {'log_slope_halo': -3, 'x_core_halo': 0.05}
        inds_collapsed = ext.core_collapse_by_mass(mass_range_subs,
                                                   mass_range_field, p_subs,
                                                   p_field)
        realization_collapsed = ext.add_core_collapsed_halos(
            inds_collapsed, **kwargs_halo)

        i_subs_collapsed_1 = 0
        i_subs_1 = 0
        i_field_collapsed_1 = 0
        i_field_1 = 0
        i_subs_collapsed_2 = 0
        i_subs_2 = 0
        i_field_collapsed_2 = 0
        i_field_2 = 0
        for halo in realization_collapsed.halos:
            print(halo.mdef)
            if halo.is_subhalo:
                if halo.mass < 10**8:
                    i_subs_1 += 1
                    if halo.mdef == 'SPL_CORE':
                        i_subs_collapsed_1 += 1
                else:
                    i_subs_2 += 1
                    if halo.mdef == 'SPL_CORE':
                        i_subs_collapsed_2 += 1
            else:
                if halo.mass < 10**8:
                    i_field_1 += 1
                    if halo.mdef == 'SPL_CORE':
                        i_field_collapsed_1 += 1
                else:
                    i_field_2 += 1
                    if halo.mdef == 'SPL_CORE':
                        i_field_collapsed_2 += 1

        npt.assert_almost_equal(abs(p_subs[0] - i_subs_collapsed_1 / i_subs_1),
                                0, 1)
        npt.assert_almost_equal(abs(p_subs[1] - i_subs_collapsed_2 / i_subs_2),
                                0, 1)
        npt.assert_almost_equal(
            abs(p_field[0] - i_field_collapsed_1 / i_field_1), 0, 1)
        npt.assert_almost_equal(
            abs(p_field[1] - i_field_collapsed_2 / i_field_2), 0, 1)
    def test_add_pbh(self):

        kwargs_halo = {'c_scatter': False}
        realization = SingleHalo(10**9,
                                 0.,
                                 0.,
                                 'TNFW',
                                 0.1,
                                 0.5,
                                 1.5,
                                 subhalo_flag=False,
                                 kwargs_halo=kwargs_halo)
        zlist = [0.2, 0.4, 0.6]
        rmax = 0.3
        for i, zi in enumerate(zlist):
            theta = np.random.uniform(0., 2 * np.pi)
            r = np.random.uniform(0, rmax**2)**0.5
            xi, yi = np.cos(theta) * r, np.sin(theta) * r
            mi = np.random.uniform(8, 9)
            single_halo = SingleHalo(10**mi,
                                     xi,
                                     yi,
                                     'TNFW',
                                     zi,
                                     0.5,
                                     1.5,
                                     subhalo_flag=False,
                                     kwargs_halo=kwargs_halo)
            realization = realization.join(single_halo)

        lens_model_list_init, _, kwargs_init, _ = realization.lensing_quantities(
        )
        ext = RealizationExtensions(realization)
        mass_fraction = 0.1
        kwargs_mass_function = {
            'mass_function_type': 'DELTA',
            'logM': 5.,
            'mass_fraction': 0.5
        }
        fraction_in_halos = 0.5

        zlist = np.arange(0.00, 1.02, 0.02)
        x_image = [0.] * len(zlist)
        y_image = [0.] * len(zlist)
        cosmo = Cosmology()
        dlist = [cosmo.D_C_transverse(zi) for zi in zlist]
        x_image_interp_list = [interp1d(dlist, x_image)]
        y_image_interp_list = [interp1d(dlist, y_image)]

        pbh_realization = ext.add_primordial_black_holes(
            mass_fraction, kwargs_mass_function, fraction_in_halos,
            x_image_interp_list, y_image_interp_list, rmax)

        lens_model_list, _, kwargs, _ = pbh_realization.lensing_quantities()

        for i, halo in enumerate(pbh_realization.halos):
            r2d = np.hypot(halo.x, halo.y)
            npt.assert_equal(r2d <= np.sqrt(2) * rmax, True)
            condition1 = 'PT_MASS' == halo.mdef
            condition2 = 'TNFW' == halo.mdef
            npt.assert_equal(np.logical_or(condition1, condition2), True)