"""
.. module:: initialise
:synopsis: intialisation
.. moduleauthor:: Benjamin Audren <benjamin.audren@epfl.ch>
"""
import io_mp
import parser_mp # parsing the input command line
from data import Data
import sys
import os
[docs]def initialise(custom_command=''):
"""
Initialisation routine
This function recovers the input from the command line arguments, from
:mod:`parser_mp`, the parameter files.
It then extracts the path of the used Monte Python code, and proceeds to
initialise a :class:`data` instance, a cosmological code instance.
Parameters
----------
custom_command: str
allows for testing the code
"""
# Parsing line argument
command_line = parser_mp.parse(custom_command)
# Recovering the local configuration
path = recover_local_path(command_line)
# Recover Monte Python's version number
version_path = os.path.join(
path['root'], 'VERSION')
with open(version_path, 'r') as version_file:
version = version_file.readline()
if not command_line.silent:
print('Running Monte Python v%s' % version)
# If the info flag was used, read a potential chain (or set of chains) to
# be analysed with default procedure. If the argument is a .info file, then
# it will extract information from it (plots to compute, chains to analyse,
# etc...)
if command_line.subparser_name == "info":
from analyze import analyze # only invoked when analyzing
analyze(command_line)
return None, None, command_line, False
# Fill in data, starting from parameter file. If output folder already
# exists, the input parameter file was automatically replaced by the
# existing log.param. This prevents you to run different things in a same
# folder.
else:
data = Data(command_line, path)
# Overwrite arguments from parameter file with the command line
if command_line.N is None:
try:
command_line.N = data.N
except AttributeError:
raise io_mp.ConfigurationError(
"You did not provide a number of steps, neither via " +
"command line, nor in %s" % command_line.param)
# Loading up the cosmological backbone. For the moment, only CLASS has been
# wrapped.
cosmo = recover_cosmological_module(data)
# Initialising the sampler
# MH: Creating the file that will contain the chain
if command_line.method == 'MH':
io_mp.create_output_files(command_line, data)
# NS: Creating the NS subfolder and the MultiNest arguments
elif command_line.method == 'NS':
from nested_sampling import initialise as initialise_ns
initialise_ns(cosmo, data, command_line)
return cosmo, data, command_line, True
[docs]def recover_local_path(command_line):
"""
Read the configuration file, filling a dictionary
Returns
-------
path : dict
contains the absolute path to the location of the code, the data, the
cosmological code, and potential likelihood codes (clik for Planck,
etc)
"""
# Define the dictionnary that will hold the local configuration
path = {}
# The path is recovered by taking the path to this file (MontePython.py).
# By default, then, the data folder is located in the same root directory.
# Any setting in the configuration file will overwrite this one.
path['root'] = os.path.sep.join(
os.path.abspath(__file__).split(os.path.sep)[:-2])
path['MontePython'] = os.path.join(path['root'], 'montepython')
path['data'] = os.path.join(path['root'], 'data')
# the rest is important only when running the MCMC chains
if command_line.subparser_name == 'run':
# Configuration file, defaulting to default.conf in your root
# directory. This can be changed with the command line option --conf.
# All changes will be stored into the log.param of your folder, and
# hence will be reused for an ulterior run in the same directory
conf_file = os.path.abspath(command_line.config_file)
if os.path.isfile(conf_file):
for line in open(conf_file):
exec(line)
for key, value in path.iteritems():
path[key] = os.path.normpath(os.path.expanduser(value))
else:
# The error is ignored if reading from a log.param, because it is
# stored
if command_line.param.find('log.param') == -1:
raise io_mp.ConfigurationError(
"You must provide a valid .conf file (I tried to read"
"%s) " % os.path.abspath(command_line.config_file) +
" that specifies the correct locations for your data "
"folder, Class, (Clik), etc...")
return path
[docs]def recover_cosmological_module(data):
"""
From the cosmological module name, initialise the proper Boltzmann code
.. note::
Only CLASS is currently wrapped, but a python wrapper of CosmoMC should
enter here.
"""
# Importing the python-wrapped CLASS from the correct folder, defined in
# the .conf file, or overwritten at this point by the log.param.
# If the cosmological code is CLASS, do the following to import all
# relevant quantities
if data.cosmological_module_name == 'CLASS':
try:
classy_path = ''
for elem in os.listdir(os.path.join(
data.path['cosmo'], "python", "build")):
if elem.find("lib.") != -1:
classy_path = os.path.join(
data.path['cosmo'], "python", "build", elem)
break
except OSError:
raise io_mp.ConfigurationError(
"You probably did not compile the python wrapper of CLASS. " +
"Please go to /path/to/class/python/ and do\n" +
"..]$ python setup.py build")
# Inserting the previously found path into the list of folders to
# search for python modules.
sys.path.insert(1, classy_path)
try:
from classy import Class
except ImportError:
raise io_mp.MissingLibraryError(
"You must have compiled the classy.pyx file. Please go to " +
"/path/to/class/python and run the command\n " +
"python setup.py build")
cosmo = Class()
else:
raise io_mp.ConfigurationError(
"Unrecognised cosmological module. " +
"Be sure to define the correct behaviour in MontePython.py " +
"and data.py, to support a new one.")
return cosmo