Source code for halomod.wdm

"""Contains WDM versions of all models and frameworks."""

import sys

import numpy as np
from hmf import cached_quantity, parameter
from hmf._internals._framework import get_mdl
from hmf.alternatives.wdm import MassFunctionWDM
from scipy import integrate as intg

from .halo_model import DMHaloModel, TracerHaloModel
from .integrate_corr import ProjectedCF


# ===============================================================================
# C-M relations
# ===============================================================================
[docs] def CMRelationWDMRescaled(name): """Class factory for Rescaled CM relations.""" if name.endswith("WDM"): name = name[:-3] x = getattr(sys.modules["halomod.concentration"], name) def __init__(self, m_hm=1000, **kwargs): super(self.__class__, self).__init__(**kwargs) self.m_hm = m_hm def cm(self, m, z=0): """Rescaled Concentration-Mass relation for WDM.""" cm = super(self.__class__, self).cm(m, z) g1 = self.params["g1"] g2 = self.params["g2"] b0 = self.params["beta0"] b1 = self.params["beta1"] return cm * (1 + g1 * self.m_hm / m) ** (-g2) * (1 + z) ** (b0 * z - b1) K = type(name + "WDM", (x,), {}) K._defaults.update({"g1": 60, "g2": 0.17, "beta0": 0.026, "beta1": 0.04}) K.__init__ = __init__ K.cm = cm return K
# =============================================================================== # Framework # ===============================================================================
[docs] class HaloModelWDM(DMHaloModel, MassFunctionWDM): """ This class is a derivative of HaloModel which sets a few defaults that make more sense for a WDM model, and also implements the framework to include a smooth component. See Schneider et al. 2012 for details on the smooth component. """ def __init__(self, **kw): kw.setdefault("halo_concentration_model", "Ludlow2016") super().__init__(**kw) @cached_quantity def f_halos(self): """The total fraction of mass bound up in halos.""" return self.rho_gtm[0] / self.mean_density @cached_quantity def power_auto_matter(self): """Auto power spectrum of dark matter.""" return ( (1 - self.f_halos) ** 2 * self.power_auto_matter_ss + 2 * (1 - self.f_halos) * self.f_halos * self.power_auto_matter_sh + self.f_halos**2 * self.power_auto_matter_hh ) @cached_quantity def power_auto_matter_hh(self) -> np.ndarray: """The halo-halo matter power spectrum (includes both 1-halo and 2-halo terms).""" return ( (self.power_1h_auto_matter + self.power_2h_auto_matter) * self.mean_density**2 / self.rho_gtm[0] ** 2 ) @cached_quantity def power_auto_matter_sh(self) -> np.ndarray: """The smooth-halo cross power spectrum.""" integrand = ( self.m * self.dndm * self.halo_bias * self.halo_profile.u(self.k_hm, self.m, norm="m") ) pch = intg.simpson(integrand, x=self.m) return self.bias_smooth * self._power_halo_centres_fnc(self.k_hm) * pch / self.rho_gtm[0] @cached_quantity def power_auto_matter_ss(self) -> np.ndarray: """The smooth-smooth matter power spectrum.""" return self.bias_smooth**2 * self._power_halo_centres_fnc(self.k_hm) @cached_quantity def bias_smooth(self): """Bias of smooth component of the field. Eq. 35 from Smith and Markovic 2011. """ return (1 - self.f_halos * self.bias_effective_matter) / (1 - self.f_halos) @cached_quantity def mean_density_halos(self): """Mean density of matter in halos.""" return self.rho_gtm[0] @cached_quantity def mean_density_smooth(self): """Mean density of matter outside halos.""" return (1 - self.f_halos) * self.mean_density @parameter("model") def halo_concentration_model(self, val): """A halo_concentration-mass relation.""" if isinstance(val, str) and val.endswith("WDM"): return CMRelationWDMRescaled(val) return get_mdl(val, "CMRelation") @cached_quantity def halo_concentration(self): """Halo Concentration.""" cm = super().halo_concentration if hasattr(cm, "m_hm"): cm.m_hm = self.wdm.m_hm return cm
[docs] class TracerHaloModelWDM(TracerHaloModel, HaloModelWDM): def __init__(self, **kw): kw.setdefault("halo_concentration_model", "Ludlow2016") super().__init__(**kw)
[docs] class ProjectedCFWDM(ProjectedCF, HaloModelWDM): """Projected Correlation Function for WDM halos."""