Source code for halox.bias

from __future__ import annotations

from jax import Array
from jax.typing import ArrayLike
import jax.numpy as jnp
import jax_cosmo as jc
from . import lss
from .emus import SigmaMEmulator


def _tinker10_parameters(
    z: ArrayLike,
    cosmo: jc.Cosmology,
    delta_c: float = 200.0,
) -> Array:
    """Get Tinker10 halo bias parameters for given overdensity.

    Parameters
    ----------
    z : Array
        Redshift
    cosmo : jc.Cosmology
        Underlying cosmology
    delta_c : float
        Overdensity threshold, default 200.0

    Returns
    -------
    Array
        Parameters [A, a, B, C] for Tinker10 bias function
    """
    z = jnp.asarray(z)

    # Convert critical to mean overdensity
    delta_m = lss.overdensity_c_to_m(delta_c, z, cosmo)

    # y parameter from log10(Delta_halo)
    y = jnp.log10(delta_m)

    # Parameter calculations following Tinker et al. 2010
    A = 1.0 + 0.24 * y * jnp.exp(-((4.0 / y) ** 4))
    a = 0.44 * y - 0.88
    B = 0.183
    C = 0.019 + 0.107 * y + 0.19 * jnp.exp(-((4.0 / y) ** 4))

    return jnp.array([A, a, B, C])


[docs] def tinker10_bias( M: ArrayLike, z: ArrayLike, cosmo: jc.Cosmology, delta_c: float = 200.0, delta_sc: float = 1.686, n_k_int: int = 5000, emu: SigmaMEmulator | None = None, ) -> Array: """Tinker10 halo bias function. Linear halo bias as calibrated by Tinker et al. 2010. Parameters ---------- M : Array Halo mass [h-1 Msun] z : Array Redshift cosmo : jc.Cosmology Underlying cosmology delta_c : float Overdensity threshold, default 200.0 delta_sc : float Spherical collapse threshold, default 1.686 n_k_int : int Number of k-space integration points for :math:`\\sigma(R,z)`, default 5000 emu : SigmaMEmulator, optional Trained emulator for :math:`\\sigma(M)`. Returns ------- Array Linear halo bias See Also -------- halox.emus.SigmaMEmulator Emulator for :math:`\\sigma(M,z)`. """ M = jnp.asarray(M) z = jnp.asarray(z) nu = lss.peak_height(M, z, cosmo, n_k_int=n_k_int, emu=emu) # Get parameters A, a, B, C = _tinker10_parameters(z, cosmo, delta_c) # Fixed parameters b = 1.5 c = 2.4 # Tinker10 bias formula bias = 1.0 - A * (nu**a) / (nu**a + delta_sc**a) + B * nu**b + C * nu**c return bias