Source code for desilike.theories.lya.power_template

import numpy as np

from desilike.base import BaseCalculator
from desilike.cosmo import is_external_cosmo
from desilike.theories.primordial_cosmology import Cosmoprimo


[docs] class P1DPowerSpectrumExtractor(BaseCalculator): r""" Extract P1D shape parameters :math:`\Delta_{\star}^{2}` and :math:`n_{\star}` from the linear power spectrum (in velocity units). Parameters ---------- z : float, default=3. Pivot redshift :math:`z_{\star}`. qstar : float, default=0.009 Pivot wavenumber :math:`q_{\star}` in velocity units (km/s). cosmo : BasePrimordialCosmology, default=None Cosmology calculator. Defaults to ``Cosmoprimo()``. Reference --------- https://arxiv.org/pdf/2209.09895.pdf """ config_fn = 'power_template.yaml' def initialize(self, z=3., qstar=0.009, cosmo=None): self.z = float(z) self.qstar = float(qstar) self.cosmo_requires = {} self.cosmo = cosmo if is_external_cosmo(self.cosmo): self.cosmo_requires = {'fourier': {'pk_interpolator': {'z': self.z, 'of': [('delta_cb', 'delta_cb')]}}, 'background': {'efunc': {'z': self.z}}} elif cosmo is None: self.cosmo = Cosmoprimo() self.cosmo.params = self.params.copy() self.params.clear() def calculate(self): fo = self.cosmo.get_fourier() self.pk_dd_interpolator = fo.pk_interpolator(of='delta_cb').to_1d(z=self.z) q = np.geomspace(0.5 * self.qstar, 2. * self.qstar, 100) m = 100 * self.cosmo.efunc(self.z) / (1. + self.z) pq = m**3 * self.pk_dd_interpolator(q * m) # Eq. C7 of https://arxiv.org/pdf/2209.09895.pdf # lowest power first coeffs = np.polynomial.polynomial.Polynomial.fit(np.log(q / self.qstar), np.log(pq), deg=2, full=False).convert().coef self.delta2star = np.exp(coeffs[0]) * self.qstar**3 / (2. * np.pi**2) self.nstar = coeffs[1] self.alphastar = 2. * coeffs[2]