cosmo_derived

This plugin calculates the following “derived” cosmological quantities: * \(H(z)\) * \(D_A(z)\) * \(r_s(z)\) * \(\theta_s(z)\) * \(z_{\rm drag}\) (Hu & Sugiyama fitting formula)

It can also be used as a \(\theta\) to \(H_0\) converter.

Credit: Lloyd Knox, code adapted by Marius Millea

In [1]:
from cosmoslik import *
In [2]:
cosmo_derived = get_plugin('models.cosmo_derived')()

To use cosmo_derived, first call the set_params function to set all the cosmological parameters, then call the other functions which will subsequently use those values. Here’s the signature for set_params:

In [3]:
help(cosmo_derived.set_params)
Help on built-in function set_params:

set_params(...) method of cosmoslik_plugins.models.cosmo_derived.cosmo_derived._cosmo_derived instance
    _cosmo_derived.set_params(self, H0=None, theta_mc=None, ombh2=None, omch2=None, omk=None, mnu=None, massive_neutrinos=None, massless_neutrinos=None, Tcmb=None, Yp=None, **kwargs)

    Args:
        H0 : hubble constant today in km/s/Mpc
        ombh2, omch2, omk : densities today
        mnu : neutrino mass sum in eV
        massive_neutrinos : number of massive species (mnu divided equally among them)
        massless_neutrinos : number of massless species
        Yp : helium mass fraction
        Tcmb : CMB temperature in Kelvin
        theta_mc : if given, will convert to H0 and set H0 to that

In [4]:
cosmo_derived.set_params(H0=67.04, ombh2=0.022032, omch2=0.12038, omk=0, mnu=0.06, massive_neutrinos=1, massless_neutrinos=2.046)

Plotting \(H(z)\),

In [8]:
z=logspace(-2,6)
loglog(z,list(map(cosmo_derived.Hubble,z)))
xlabel(r'$z$',size=16)
ylabel(r'$H(z) \, [\rm km/s/Mpc]$',size=16);
../../../_images/cosmoslik_plugins_models_cosmo_derived_cosmo_derived_8_0.png

Here’s the angular size of sound horizon at Planck’s best-fit \(z_*\) (Table 2, Planck XVI). The number for \(\theta_s\) in that same table is \(0.0104136\), or a difference of \(0.09 \sigma\). This is likely due to differences in numerical values for physical constants that were used, or numerical integration error.

In [9]:
z_star = 1090.48
cosmo_derived.theta_s(z_star)
Out[9]:
0.010414141562032136

We can also use this plugin to convert \(\theta\) to \(H_0\). Here \(\theta\) refers to \(\theta_{\rm MC}\) which uses the Hu & Sugiyama fitting formula for \(z_{\rm drag}\).

In [10]:
cosmo_derived.theta2hubble(0.0104)
Out[10]:
66.95260969910498

This plugin is written in Cython and is highly optimizied, so its pretty fast.

In [11]:
%%timeit
cosmo_derived.theta_s(z_star)
100 loops, best of 3: 9.16 ms per loop
In [12]:
%%timeit
cosmo_derived.theta2hubble(0.0104)
10 loops, best of 3: 56 ms per loop

The \(\theta_s\) calculation about 7 times slower than the equivalent Fortran code used in CosmoMC. The theta to hubble conversion is about 3 times faster than the CosmoMC version because the equation solver is more sophisticated and requires fewer \(\theta_s\) evaluations. Not bad for being very readable and modifiable Cython code instead. As an example, here’s what the code looks like:

def r_s(self, double z):
    """
    Returns : comoving sound horizon scale at redshift z in Mpc.
    """
    cdef double Rovera=3*self.ombh2*rhoxOverOmegaxh2/(4*self.rhogamma0)
    return quad(lambda double zp: 1/self.Hubble(zp) / sqrt(3*(1+Rovera/(1+zp))),z,inf,epsabs=0,epsrel=self.epsrel)[0] / KmPerSOverC