Example #1
0
    def __init__(
        self,
        dc=1.686e0,
        h0=0.702e0,
        om=0.274e0,
        ode=0.725e0,
        w0=-1.0e0,
        ob=0.0458,
        o_r=8.6e-5,
        o_k=0.0e0,
        f_nl=0.0e0,
        tau_r=0.087,
        z_r=10.4,
        ns=0.96,
        hmf_type="tinker",
    ):
        """
    Constructor.
    Default initialisation with WMAP7+BAO+H0 parameters,
    Tinker mass function and fitted P(k).
    """

        print "Cosmology"

        self.delta_c = dc
        self.h_0 = h0
        self.O_m0 = om
        self.O_de0 = ode
        self.w_0 = w0
        self.O_b0 = ob
        self.O_r0 = o_r
        self.O_k0 = o_k
        self.fnl = f_nl
        self.tau_rec = tau_r
        self.z_rec = z_r
        self.eta_r = self.eta(self.z_rec)
        self.H_0 = h0 * 100.0e0
        self.n_s = ns

        self.mf = hmf.Hmf(mf_type=hmf_type)

        import inspect

        print inspect.getframeinfo(inspect.currentframe().f_back)[3]
        # print inspect.stack()

        self.pk = PowSpec(self)
Example #2
0
class Cosmology:
    def __init__(
        self,
        dc=1.686e0,
        h0=0.702e0,
        om=0.274e0,
        ode=0.725e0,
        w0=-1.0e0,
        ob=0.0458,
        o_r=8.6e-5,
        o_k=0.0e0,
        f_nl=0.0e0,
        tau_r=0.087,
        z_r=10.4,
        ns=0.96,
        hmf_type="tinker",
    ):
        """
    Constructor.
    Default initialisation with WMAP7+BAO+H0 parameters,
    Tinker mass function and fitted P(k).
    """

        print "Cosmology"

        self.delta_c = dc
        self.h_0 = h0
        self.O_m0 = om
        self.O_de0 = ode
        self.w_0 = w0
        self.O_b0 = ob
        self.O_r0 = o_r
        self.O_k0 = o_k
        self.fnl = f_nl
        self.tau_rec = tau_r
        self.z_rec = z_r
        self.eta_r = self.eta(self.z_rec)
        self.H_0 = h0 * 100.0e0
        self.n_s = ns

        self.mf = hmf.Hmf(mf_type=hmf_type)

        import inspect

        print inspect.getframeinfo(inspect.currentframe().f_back)[3]
        # print inspect.stack()

        self.pk = PowSpec(self)

    def display(self):
        """
    Displays what you're working with.
    """
        print ("YOU ARE USING THE FOLLOWING COSMOLOGY:")
        print ("{h_0, O_m, O_de, w_0, O_b, O_r, O_k} = ")
        print (
            "{{{}, {}, {}, {}, {}, {}, {}}}".format(
                self.h_0, self.O_m0, self.O_de0, self.w_0, self.O_b0, self.O_r0, self.O_k0
            )
        )
        print ("WITH MASS FUNCTION:")
        self.mf.display()
        print ("WITH POWER SPECTRUM:")
        self.pk.display()

    def set_hmf(self, set_mf):
        """
    Set method for the HMF within the Cosmology
    """
        self.mf = set_mf

    def set_powspec(self, set_pk):
        """
    Set method for power spectrum within the Cosmology
    """
        self.pk = set_pk

    def rho_c(self):
        """
    Critical density
    """
        return rhofactor * ((3.0e0 * 100.0e0 * 100.0e0) / (8.0e0 * pi * G * Hfactor * Hfactor))

    def rho_m(self, z):
        """
    Average density of Universe at redshift z
    """
        return rhofactor * self.O_m(z) * ((3.0e0 * 100.0e0 * 100.0e0) / (8.0e0 * pi * G * Hfactor * Hfactor))

    def O_m(self, z):
        """
    Omega matter.
    """
        return self.O_m0 * pow(1.0e0 + z, 3.0e0) / (self.O_m0 * pow(1.0e0 + z, 3.0e0) + 1.0e0 - self.O_m0)

    def h(self, z):
        """
    Hubble function ***little*** h(z).
    """
        a = 1.0e0 / (1.0e0 + z)
        h_square = (
            self.O_r0 / pow(a, 4.0e0)
            + self.O_m0 / pow(a, 3.0e0)
            + self.O_k0 / pow(a, 2.0e0)
            + self.O_de0 / pow(a, 3.0e0 * (1.0e0 + self.w_0))
        )

        return sqrt(h_square)

    def _integ_one_on_h_scalar(self, z_min, z_max):
        """Scalar calculation of 1/h between z_min and z_max
    """
        integfunc = lambda x: 1.0e0 / self.h(x)
        return integrate.quad(integfunc, z_min, z_max)[0]

    _integ_one_on_h_vector = np.vectorize(_integ_one_on_h_scalar)

    def H(self, z):
        """
    Hubble function ***upper*** H(z).
    """
        return self.H_0 * self.h(z)

    def dvdz(self, z):
        """
    Comoving volume element at redshift z.
    """
        return 4.0e0 * 2998e0 * (1 + z) * (1 + z) * pi * pow(self.D_a(z), 2.0e0) / self.h(z)

    def V_between(self, z_min, z_max):
        """
    Volume between two redshifts.
    """
        points = 200
        int_arr = np.zeros(points)
        z_arr = np.linspace(z_min, z_max, points)
        for i in np.arange(points):
            int_arr[i] = self.dvdz(z_arr[i])

        return integrate.trapz(int_arr, z_arr)

    def D_a(self, z):
        """
    Angular diameter distance to redshift z.
    """
        if np.isscalar(z):
            integ = self._integ_one_on_h_scalar(0.0e0, z)
        else:
            integ = self._integ_one_on_h_vector(self, 0.0e0, z)

        return 2998.0e0 * integ / (1.0e0 + z)

    def D_l(self, z):
        """
    Luminosity distance to redshift z.
    """
        return D_a(z) * (1.0e0 + z) ** 2.0e0

    def D_c(self, z):
        """
    Comoving radial distance to redshift z.
    """
        return D_a(z) * (1.0e0 + z) / (100.0e0 * self.h0)

    def dist_mod(self, z):
        """
    Distance modulus.
    5 * log(D_l(z)) + 25
    """
        return 5.0e0 * np.log10(self.D_l(z)) + 25.0e0

    def eta(self, z):
        """
    Size of particle horizon at redshift z
    """
        if z == np.inf:
            retVar = 0.0e0
        else:
            if np.isscalar(z):
                retVar = self._integ_one_on_h_scalar(z, np.inf) / (100.0e0 * self.h_0)
            else:
                retVar = self._integ_one_on_h_vector(self, z, np.inf) / (100.0e0 * self.h_0)
        return retVar

    def _integ_lookback_scalar(self, z):
        """Scalar calculation of lookback time to redshift z
    """
        integfunc = lambda x: 1.0e0 / (self.h(x) * (1.0e0 + x))
        return integrate.quad(integfunc, 0.0e0, z)[0] / (100.0e0 * self.h_0)

    _integ_lookback_vector = np.vectorize(_integ_lookback_scalar)

    def t_lookback(self, z):
        """Lookback time to redshift z
    """
        if np.isscalar(z):
            t_lb = self._integ_lookback_scalar(z)
        else:
            t_lb = self._integ_lookback_vector(self, z)
        return t_lb

    def _integ_growth_scalar(self, z):
        """Scalar calculation of linear growth function
    """
        integfunc = lambda x: 1.0e0 / pow(self.h((1.0e0 / x) - 1.0e0) * x, 3.0e0)

        return (5.0e0 / 2.0e0) * self.O_m0 * self.h(z) * integrate.quad(integfunc, 0.0e0, 1.0e0 / (1.0e0 + z))[0]

    _integ_growth_vector = np.vectorize(_integ_growth_scalar)

    def growth(self, z):
        """Linear growth function.
    """
        if np.isscalar(z):
            Dplus = self._integ_growth_scalar(z)
        else:
            Dplus = self._integ_growth_vector(self, z)
        return Dplus

    def dndlnm(self, lnm, z):
        """
    Comoving number density of dark matter haloes in logarithmic m.
    """
        s = self.pk.sigma(lnm)
        dlnsdlnm = self.pk.dlnsigmadlnm(lnm)
        D_z = self.growth(z)
        D_0 = self.growth(0.0e0)

        return (
            self.mf.f_sigma(s * D_z / D_0, z)
            * fabs(log(D_z / D_0) + dlnsdlnm)
            * self.rho_m(z)
            / (exp(lnm))
            * self.mf.r_ng(s * D_z / D_0, self.delta_c, self.fnl)
        )

    def computeNinBin(self, z_min, z_max, lnm_min, lnm_max):
        """
    Total number of dark matter haloes expected within a given mass,
    redshift bin.
    """
        return integrate.dblquad(self.dNdlnmdz, z_min, z_max, lambda lnm: lnm_min, lambda lnm: lnm_max)[0]

    def computeLittleNinZBin(self, lnm_min, lnm_max, z):
        """
    Total number of haloes within a given mass bin at fixed redshift.
    """
        return integrate.quad(self.dndlnm, lnm_min, lnm_max, args=(z))[0]

    def dNdlnmdz(self, lnm, z):
        """
    Total number of dark matter haloes at a given redshift.
    Product of dndlnm * dVdz
    """
        return self.dndlnm(lnm, z) * self.dvdz(z)

    def dNdlnm0dz(self, lnm, z):
        """
    Total number of dark matter haloes,
    of equivalent mass at redshift zero, at a given redshift.
    Product of dndlnm * dVdz
    """
        return self.dndlnm(lnm, 0.0e0) * self.dvdz(z)