Source code for harmonia.cosmology.scale_dependence

r"""
Scale dependence (:mod:`~harmonia.cosmology.scale_dependence`)
===========================================================================

Compute scale-dependence modifications to galaxy clustering from local
primordial non-Gausianity :math:`f_\textrm{NL}`.

The scale-independent linear bias is modified as

    .. math::

        b_1(z) \mapsto b_1(z) + f_\textrm{NL} [b_1(z) - p] A(k,z) \,,

where :math:`p` is a tracer-dependent parameter and the scale-dependence
modification kernel

    .. math::

        A(k,z) = 1.3 \left( \frac{H_0}{c} \right)^2 \frac{
            3\varOmega_\textrm{m,0} \delta_\textrm{c}
        }{k^2 D(z) T(k)}

relates to the cosmological model and its growth factor :math:`D(z)`
(normalised to unity at the current epoch; hence the numerical factor
1.3) and transfer function :math:`T(k)` (normalised to unity as
:math:`k \to 0`).  Here :math:`H_0` is the Hubble parameter :math:`H(z)`
(in km s\ :sup:`-1` Mpc\ :sup:`-1`) at the current epoch :math:`z = 0`,
:math:`c` the speed of light, :math:`\varOmega_\mathrm{m,0}` the matter
density parameter at the current epoch, and :math:`\delta_\mathrm{c}` the
critical over-density in spherical gravitational collapse.

.. autosummary::

    scale_dependence_modification
    scale_dependent_bias
    modified_power_spectrum

|

"""
# pylint: disable=no-name-in-module
from astropy.constants import c
from nbodykit import cosmology


[docs]def scale_dependence_modification(cosmo, redshift): r"""Return the scale-dependence modification kernel :math:`A(k,z)` for a given cosmological model. Parameters ---------- cosmo : :class:`nbodykit.cosmology.cosmology.Cosmology` Cosmological model. redshift : float Redshift at which quantities are evaluated. Returns ------- callable Scale-dependence modification kernel as a function of wavenumber (in :math:`h`/Mpc). """ SPHERICAL_COLLAPSE_CRITICAL_OVERDENSITY = 1.686 SPEED_OF_LIGHT_IN_KM_PER_S = c.to('km/s').value GROWTH_FACTOR_NORMALISATION = 1.3 num_factors = GROWTH_FACTOR_NORMALISATION \ * 3 * cosmo.Omega0_m * SPHERICAL_COLLAPSE_CRITICAL_OVERDENSITY \ * (cosmo.H0 / SPEED_OF_LIGHT_IN_KM_PER_S) ** 2 transfer_func = cosmology.power.transfers.CLASS(cosmo, redshift=redshift) return lambda k: num_factors / (k**2 * transfer_func(k))
[docs]def scale_dependent_bias(b_1, f_nl, cosmo, redshift=0., tracer_p=1.): r"""Return the scale-dependent bias modulated by local primordial non-Gaussianity. Parameters ---------- b_1 : float Scale-independent linear bias at input redshift. f_nl : float Local primordial on-Gaussianity. cosmo : :class:`nbodykit.cosmology.cosmology.Cosmology` Cosmological model. redshift : float, optional Redshift at which quantities are evaluated (default is 0.). tracer_p : float, optional Tracer-dependent parameter :math:`p` (default is 1.). Returns ------- callable Scale-dependent bias as a function of wavenumber (in :math:`h`/Mpc). """ scale_dependence = scale_dependence_modification(cosmo, redshift) def b_k(k): return b_1 + f_nl * (b_1 - tracer_p) * scale_dependence(k) return b_k
[docs]def modified_power_spectrum(b_1, f_nl, cosmo, redshift=0., tracer_p=1., nbar=None, contrast=None): r"""Return the tracer power spectrum modified by primordial non-Gaussianity. Parameters ---------- b_1 : float Scale-independent linear bias at input redshift. f_nl : float Local primordial non-Gaussianity. cosmo : :class:`nbodykit.cosmology.cosmology.Cosmology` Cosmological model. redshift : float, optional Redshift at which quantities are evaluated (default is 0.). tracer_p : float, optional Tracer-dependent parameter :math:`p` (default is 1.). nbar : float or None, optional If not `None` (default), add ``1/nbar`` as shot noise to the resulting power spectrum. contrast : float or None, optional If not `None` (default), add additional ``1/(contrast*nbar)`` as shot noise to the resulting power spectrum. Returns ------- callable Tracer power spectrum modified by primordial non-Gaussianity as a function of wavenumber (in :math:`h`/Mpc). """ bias = scale_dependent_bias( b_1, f_nl, cosmo, redshift=redshift, tracer_p=tracer_p ) power_spectrum = cosmology.LinearPower(cosmo, redshift=redshift) alpha = 0. if contrast is None else 1 / contrast shot_noise = 0. if nbar is None else (1 + alpha) / nbar return lambda k: bias(k) ** 2 * power_spectrum(k) + shot_noise