Dealing with Cosmological Models¶
hmf
uses the robust astropy
cosmology framework to deal with
cosmological models. This provides a range of cosmographic functionality
for free.
Cosmological models are the most basic Framework
within hmf
.
Every other Framework
depends on it. So knowing how to specify the
models is important (but very simple!).
from hmf import cosmo
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
Default Settings¶
Like everything in hmf
, the Cosmology
framework has all
parameters specified with defaults. In this case, there are only two
parameters – a base cosmological model, and a dictionary of
cosmological parameters with which to alter it. By default, the
cosmological model is a Flat LambdaCDM model infused with the Planck15
parameters. The dictionary is empty, so we don’t modify anything:
my_cosmo = cosmo.Cosmology()
The intrinsic astropy
object is found as the cosmo
attribute of
the class we just created. Beware, there is also a cosmo_model
attribute, which should only be treated as a parameter, never used in
calculations. It has not been supplemented with any custom parameters.
We can check out the parameters defined within the model:
print "Matter density: ", my_cosmo.cosmo.Om0
print "Hubble constant: ", my_cosmo.cosmo.H0
print "Dark Energy density: ", my_cosmo.cosmo.Ode0
print "Baryon density: ", my_cosmo.cosmo.Ob0
print "Curvature density: ", my_cosmo.cosmo.Ok0
Matter density: 0.3075
Hubble constant: 67.74 km / (Mpc s)
Dark Energy density: 0.691009934459
Baryon density: 0.0486
Curvature density: 0.0
Or we can check out some cosmographic quantities, like the comoving distance as a function of redshift:
z = np.linspace(0,8,100)
plt.plot(z,my_cosmo.cosmo.comoving_distance(z))
plt.ylabel("Comoving Distance, [Mpc]")
plt.xlabel("Redshift")
<matplotlib.text.Text at 0x7fa3b8b94a10>
Passing a cosmological model¶
The cosmo
module contains several pre-made instances of cosmologies
which might be useful, which we can input as our default model:
my_cosmo = cosmo.Cosmology(cosmo_model=cosmo.WMAP5)
print "WMAP5 baryon density: ", my_cosmo.cosmo.Ob0
WMAP5 baryon density: 0.0459
Alternatively, we can create our own. The astropy
package contains
the basic tools to do this. To create a standard Flat LambdaCDM
cosmology:
from astropy.cosmology import FlatLambdaCDM
new_model = FlatLambdaCDM(H0 = 75.0, Om0=0.4, Tcmb0 = 5.0, Ob0 = 0.3)
This new model can be used as input to the Cosmology
class:
my_cosmo = cosmo.Cosmology(cosmo_model = new_model)
print "Crazy cosmology baryon density: ", my_cosmo.cosmo.Ob0
Crazy cosmology baryon density: 0.3
The cosmo_model
needn’t be a Flat LambdaCDM. It can be any subclass
of FLRW. Thus we could use a non-flat model:
from astropy.cosmology import LambdaCDM
new_model = LambdaCDM(H0 = 75.0, Om0=0.4, Tcmb0 = 0.0, Ob0 = 0.3, Ode0=0.4)
my_cosmo = cosmo.Cosmology(cosmo_model = new_model)
print "Crazy cosmology curvature density: ", my_cosmo.cosmo.Ok0
Crazy cosmology curvature density: 0.2
Passing custom parameters¶
Instead of passing a pre-made cosmological model, you can pass custom
parameters for the default model. This is passed as a dictionary, in
which each entry is a valid parameter for the model that has been passed
(i.e., if the model is a FlatLambdaCDM, you can’t pass Ode0
!). This
means you can specify the cosmology you want typically in one line,
rather than a few. It also means that parameters can be updated in a
standard way, so that iterating over parameters, in applications such as
fitting models, becomes simple.
When passing the dictionary of parameters, you don’t need to specify them all, just whichever ones you want to modify:
my_cosmo = cosmo.Cosmology(cosmo_params={"Om0":0.2})
print "Custom cosmology matter density: ", my_cosmo.cosmo.Om0
Custom cosmology matter density: 0.2
New parameters are available for extended cosmological models:
my_cosmo = cosmo.Cosmology(new_model,{"Om0":0.2,"Ode0":0.0,"Ob0":0.2})
print "Custom cosmology curvature density: ", my_cosmo.cosmo.Ok0
Custom cosmology curvature density: 0.8
Updating parameters¶
One of the great things about hmf
Frameworks is that any parameter
can be updated without re-creating the entire object. This is also true
of the Cosmology
class.
Any parameter passed to the constructor may also be updated:
my_cosmo = cosmo.Cosmology(new_model)
my_cosmo.update(cosmo_params={"Om0":0.2,"Ode0":0.0,"Ob0":0.2})
print "Custom cosmology curvature density: ", my_cosmo.cosmo.Ok0
Custom cosmology curvature density: 0.8
The parameter dictionary is persistent, so that updating a different parameter doesn’t affect the others:
my_cosmo.update(cosmo_params={"H0":10.0})
print "Custom cosmology curvature density: ", my_cosmo.cosmo.Ok0
print "Custom parameters: ", my_cosmo.cosmo_params
Custom cosmology curvature density: 0.8
Custom parameters: {'H0': 10.0, 'Om0': 0.2, 'Ode0': 0.0, 'Ob0': 0.2}
Of course, if we were to update the model to a Flat Lambda CDM model,
then the Ode0
keyword would give an error. To facilitate this,
passing an empty dictionary clears all custom values:
my_cosmo.update(cosmo_model=cosmo.Planck13,cosmo_params={})
print "Flat cosmology curvature density: ", my_cosmo.cosmo.Ok0
Flat cosmology curvature density: 0.0
In effect, this gives us an easy way to track changes induced by a cosmological variable:
for Om0 in np.linspace(0.2,0.4,7):
my_cosmo.update(cosmo_params={"Om0":Om0})
plt.plot(z,my_cosmo.cosmo.comoving_distance(z),label="%s"%Om0)
_ = plt.legend(loc=0)