diff --git a/batch3/outputs/fsig8-z.py b/batch3/outputs/fsig8-z.py index 06bd39f9c..1ef700b50 100644 --- a/batch3/outputs/fsig8-z.py +++ b/batch3/outputs/fsig8-z.py @@ -7,7 +7,7 @@ import tempfile import pickle -sys.path.insert(0, 'C:\Work\Dist\git\camb\pycamb') +sys.path.insert(0, 'C:\Work\Dist\git\camb') from cosmomc_to_camb import get_camb_params import camb @@ -43,7 +43,7 @@ raise Exception('error') datapoints[i] *= rescale dataerrs[i] *= rescale - print dataredshifts[i], datapoints[i], dataerrs[i] + print(dataredshifts[i], datapoints[i], dataerrs[i]) DR12 = np.loadtxt(batchjob.getCodeRootPath() + 'data/DR12/final_consensus_results_dM_Hz_fsig.dat', usecols=[0, 1]) diff --git a/camb b/camb index 65b3f21da..f692a5909 160000 --- a/camb +++ b/camb @@ -1 +1 @@ -Subproject commit 65b3f21dad9579266552f5568beb5ce6590502ac +Subproject commit f692a5909f6f3aeb4602d73a99324ed5f6b29008 diff --git a/docs/readme.html b/docs/readme.html index 5f42f5b88..9e34c96b9 100644 --- a/docs/readme.html +++ b/docs/readme.html @@ -8,7 +8,7 @@

CosmoMC Readme

-
July 2018. Check the web +
July 2019. Check the web page for the latest version.

diff --git a/python/GetDist.py b/python/GetDist.py index 6e7e4748f..0a7f60587 100644 --- a/python/GetDist.py +++ b/python/GetDist.py @@ -1,363 +1,12 @@ #!/usr/bin/env python -from __future__ import absolute_import -from __future__ import print_function -import os -import subprocess -import getdist -import io -from getdist import MCSamples, chains, IniFile - - -def runScript(fname): - subprocess.Popen(['python', fname]) - - -def doError(msg): - if __name__ == '__main__': - import sys - - print(msg) - sys.exit() - raise ValueError(msg) - - -def main(args): - no_plots = False - chain_root = args.chain_root - if args.ini_file is None and chain_root is None: - doError('Must give either a .ini file of parameters or a chain file root name. Run "GetDist.py -h" for help.') - if not '.ini' in args.ini_file and chain_root is None: - # use default settings acting on chain_root, no plots - chain_root = args.ini_file - args.ini_file = getdist.default_getdist_settings - no_plots = True - if not os.path.isfile(args.ini_file): - doError('Parameter file does not exist: ' + args.ini_file) - if chain_root and chain_root.endswith('.txt'): - chain_root = chain_root[:-4] - - if chain_root is not None and ('*' in chain_root or '?' in chain_root): - import glob, copy - for f in glob.glob(chain_root + '.paramnames'): - fileargs = copy.copy(args) - fileargs.chain_root = f.replace('.paramnames', '') - main(fileargs) - return - - # Input parameters - ini = IniFile(args.ini_file) - - # File root - if chain_root is not None: - in_root = chain_root - else: - in_root = ini.params['file_root'] - if not in_root: - doError('Chain Root file name not given ') - rootname = os.path.basename(in_root) - - if args.ignore_rows is not None: - ignorerows = args.ignore_rows - else: - ignorerows = ini.float('ignore_rows', 0.0) - - samples_are_chains = ini.bool('samples_are_chains', True) - - paramnames = ini.string('parameter_names', '') - - # Create instance of MCSamples - mc = MCSamples(in_root, ini=ini, files_are_chains=samples_are_chains, paramNamesFile=paramnames) - - if ini.bool('adjust_priors', False) or ini.bool('map_params', False): - doError( - 'To adjust priors or define new parameters, use a separate python script; see the python getdist docs for examples') - - plot_ext = ini.string('plot_ext', 'py') - finish_run_command = ini.string('finish_run_command', '') - - no_plots = ini.bool('no_plots', no_plots) - plots_only = ini.bool('plots_only', False) - no_tests = plots_only or ini.bool('no_tests', False) - - thin_factor = ini.int('thin_factor', 0) - thin_cool = ini.float('thin_cool', 1.0) - - make_single_samples = ini.bool('make_single_samples', False) - single_thin = ini.int('single_thin', 1) - cool = ini.float('cool', 1.0) - - chain_exclude = ini.int_list('exclude_chain') - - shade_meanlikes = ini.bool('shade_meanlikes', False) - plot_meanlikes = ini.bool('plot_meanlikes', False) - - dumpNDbins = ini.bool('dump_ND_bins', False) - - out_dir = ini.string('out_dir', './') - if out_dir: - if not os.path.isdir(out_dir): - os.mkdir(out_dir) - print('producing files in directory ', out_dir) - mc.out_dir = out_dir - - out_root = ini.string('out_root', '') - if out_root: - rootname = out_root - print('producing files with with root ', out_root) - mc.rootname = rootname - - rootdirname = os.path.join(out_dir, rootname) - mc.rootdirname = rootdirname - - if 'do_minimal_1d_intervals' in ini.params: - doError('do_minimal_1d_intervals no longer used; set credible_interval_threshold instead') - - line = ini.string('PCA_params', '') - if line.lower() == 'all': - PCA_params = mc.paramNames.list() - else: - PCA_params = line.split() - PCA_num = ini.int('PCA_num', len(PCA_params)) - if PCA_num != 0: - if PCA_num < 2: - doError('Can only do PCA for 2 or more parameters') - PCA_func = ini.string('PCA_func', '') - # Characters representing functional mapping - if PCA_func == '': - PCA_func = ['N'] * PCA_num # No mapping - PCA_NormParam = ini.string('PCA_normparam', '') or None - - make_scatter_samples = ini.bool('make_scatter_samples', False) - - # ============================================================================== - - first_chain = ini.int('first_chain', 0) - last_chain = ini.int('chain_num', -1) - # -1 means keep reading until one not found - - # Chain files - chain_files = chains.chainFiles(in_root, first_chain=first_chain, last_chain=last_chain, - chain_exclude=chain_exclude) - - mc.loadChains(in_root, chain_files) - - mc.removeBurnFraction(ignorerows) - if chains.print_load_details: - if ignorerows: - print('Removed %s as burn in' % ignorerows) - else: - print('Removed no burn in') +# Once installed this is not used, same as getdist script - mc.deleteFixedParams() - mc.makeSingle() - - def filterParList(namestring, num=None): - if not namestring.strip(): - pars = mc.paramNames.list() - else: - pars = [] - for name in namestring.split(): - if '?' in name or '*' in name: - pars += mc.paramNames.getMatches(name, strings=True) - elif mc.paramNames.parWithName(name): - pars.append(name) - if num is not None and len(pars) != num: - print('%iD plot has missing parameter or wrong number of parameters: %s' % (num, pars)) - pars = None - return pars - - if cool != 1: - print('Cooling chains by ', cool) - mc.cool(cool) - - mc.updateBaseStatistics() - - if not no_tests: - mc.getConvergeTests(mc.converge_test_limit, writeDataToFile=True, feedback=True) - - mc.writeCovMatrix() - mc.writeCorrelationMatrix() - - # Output thinned data if requested - # Must do this with unsorted output - if thin_factor > 1: - thin_ix = mc.thin_indices(thin_factor) - filename = rootdirname + '_thin.txt' - mc.writeThinData(filename, thin_ix, thin_cool) - - print(mc.getNumSampleSummaryText().strip()) - if mc.likeStats: print(mc.likeStats.likeSummary().strip()) - - if PCA_num > 0 and not plots_only: - mc.PCA(PCA_params, PCA_func, PCA_NormParam, writeDataToFile=True) - - if not no_plots or dumpNDbins: - # set plot_data_dir before we generate the 1D densities below - plot_data_dir = ini.string('plot_data_dir', default='', allowEmpty=True) - if plot_data_dir and not os.path.isdir(plot_data_dir): - os.mkdir(plot_data_dir) - else: - plot_data_dir = None - mc.plot_data_dir = plot_data_dir - - # Do 1D bins - mc._setDensitiesandMarge1D(writeDataToFile=not no_plots and plot_data_dir, meanlikes=plot_meanlikes) - - if not no_plots: - # Output files for 1D plots - if plot_data_dir: print('Calculating plot data...') - - plotparams = [] - line = ini.string('plot_params', '') - if line not in ['', '0']: - plotparams = filterParList(line) - - line = ini.string('plot_2D_param', '').strip() - plot_2D_param = None - if line and line != '0': - plot_2D_param = line - - cust2DPlots = [] - if not plot_2D_param: - # Use custom array of specific plots - num_cust2D_plots = ini.int('plot_2D_num', 0) - for i in range(1, num_cust2D_plots + 1): - line = ini.string('plot' + str(i)) - pars = filterParList(line, 2) - if pars is not None: - cust2DPlots.append(pars) - else: - num_cust2D_plots -= 1 - - triangle_params = [] - triangle_plot = ini.bool('triangle_plot', False) - if triangle_plot: - line = ini.string('triangle_params', '') - triangle_params = filterParList(line) - triangle_num = len(triangle_params) - triangle_plot = triangle_num > 1 - - num_3D_plots = ini.int('num_3D_plots', 0) - plot_3D = [] - for ix in range(1, num_3D_plots + 1): - line = ini.string('3D_plot' + str(ix)) - pars = filterParList(line, 3) - if pars is not None: - plot_3D.append(pars) - else: - num_3D_plots -= 1 - - # Produce file of weight-1 samples if requested - if (num_3D_plots and not make_single_samples or make_scatter_samples) and not no_plots: - make_single_samples = True - single_thin = max(1, int(round(mc.norm / mc.max_mult)) // mc.max_scatter_points) - - if plot_data_dir: - if make_single_samples: - filename = os.path.join(plot_data_dir, rootname.strip() + '_single.txt') - mc.makeSingleSamples(filename, single_thin) - - # Write paramNames file - mc.getParamNames().saveAsText(os.path.join(plot_data_dir, rootname + '.paramnames')) - mc.getBounds().saveToFile(os.path.join(plot_data_dir, rootname + '.bounds')) - - make_plots = ini.bool('make_plots', False) or args.make_plots - - done2D = {} - - filename = rootdirname + '.' + plot_ext - mc.writeScriptPlots1D(filename, plotparams) - if make_plots: runScript(filename) - - # Do 2D bins - if plot_2D_param == 'corr': - # In this case output the most correlated variable combinations - print('...doing 2D plots for most correlated variables') - cust2DPlots = mc.getCorrelatedVariable2DPlots() - plot_2D_param = None - elif plot_2D_param: - mc.paramNames.parWithName(plot_2D_param, error=True) # just check - - if cust2DPlots or plot_2D_param: - print('...producing 2D plots') - filename = rootdirname + '_2D.' + plot_ext - done2D = mc.writeScriptPlots2D(filename, plot_2D_param, cust2DPlots, - writeDataToFile=plot_data_dir, shade_meanlikes=shade_meanlikes) - if make_plots: runScript(filename) - - if triangle_plot: - # Add the off-diagonal 2D plots - print('...producing triangle plot') - filename = rootdirname + '_tri.' + plot_ext - mc.writeScriptPlotsTri(filename, triangle_params) - for i, p2 in enumerate(triangle_params): - for p1 in triangle_params[i + 1:]: - if not done2D.get((p1, p2)) and plot_data_dir: - mc.get2DDensityGridData(p1, p2, writeDataToFile=True, meanlikes=shade_meanlikes) - if make_plots: runScript(filename) - - # Do 3D plots (i.e. 2D scatter plots with coloured points) - if num_3D_plots: - print('...producing ', num_3D_plots, '2D colored scatter plots') - filename = rootdirname + '_3D.' + plot_ext - mc.writeScriptPlots3D(filename, plot_3D) - if make_plots: runScript(filename) - - if not plots_only: - # Write out stats marginalized - mc.getMargeStats().saveAsText(rootdirname + '.margestats') - - # Limits from global likelihood - if mc.loglikes is not None: mc.getLikeStats().saveAsText(rootdirname + '.likestats') - - if dumpNDbins: - mc.num_bins_ND = ini.int('num_bins_ND', 10) - line = ini.string('ND_params', '') - - if line not in ["", '0']: - ND_params = filterParList(line) - print(ND_params) - - ND_dim = len(ND_params) - print(ND_dim) - - mc.getRawNDDensityGridData(ND_params, writeDataToFile=True, - meanlikes=shade_meanlikes) - - # System command - if finish_run_command: - finish_run_command = finish_run_command.replace('%ROOTNAME%', rootname) - finish_run_command = finish_run_command.replace('%PLOTDIR%', plot_data_dir) - finish_run_command = finish_run_command.replace('%PLOTROOT%', os.path.join(plot_data_dir, rootname)) - os.system(finish_run_command) +import sys +import os +sys.path.append(os.path.realpath(os.path.dirname(__file__))) -if __name__ == '__main__': - try: - import argparse - except ImportError: - print('Make sure you are using python 2.7+') - raise +from getdist.command_line import getdist_command - parser = argparse.ArgumentParser(description='GetDist sample analyser') - parser.add_argument('ini_file', nargs='?', - help='.ini file with analysis settings (optional, if omitted uses defaults)') - parser.add_argument('chain_root', nargs='?', - help='Root name of chain to analyse (e.g. chains/test), required unless file_root specified in ini_file') - parser.add_argument('--ignore_rows', - help='set initial fraction of chains to cut as burn in (fraction of total rows, or >1 number of rows); overrides any value in ini_file if set') - parser.add_argument('--make_param_file', - help='Produce a sample distparams.ini file that you can edit and use when running GetDist') - parser.add_argument('--make_plots', action='store_true', help='Make PDFs from any requested plot script files') - parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + getdist.__version__) - args = parser.parse_args() - if args.make_param_file: - content = io.open(getdist.distparam_template).read() - analysis = io.open(getdist.default_getdist_settings).read() - content = content.replace('%%%ANALYSIS_DEFAULTS%%%', analysis) - with io.open(args.make_param_file, 'w') as f: - f.write(content) - print('Template .ini file written to ' + args.make_param_file) - else: - main(args) +getdist_command() diff --git a/python/GetDistGUI.py b/python/GetDistGUI.py index 2b586e4ef..ce1d5006e 100644 --- a/python/GetDistGUI.py +++ b/python/GetDistGUI.py @@ -1,39 +1,12 @@ #!/usr/bin/env python -from __future__ import absolute_import -from __future__ import print_function -import sys -import logging -import getdist - -try: - import argparse -except ImportError: - print('use "module load" to load python 2.7+ or 3.6+, or see docs/readme_python.html for how to install') - sys.exit() +# Once installed this is not used, same as getdist-gui script -try: - from getdist.gui.mainwindow import MainWindow, QApplication -except ImportError: - print("Could not find getdist.gui.mainwindow: configure your PYTHONPATH as described in the readme!") - raise +import sys +import os -parser = argparse.ArgumentParser(description='GetDist GUI') -parser.add_argument('-v', '--verbose', help='verbose', action="store_true") -parser.add_argument('--ini', help='Path to .ini file', default=None) -parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + getdist.__version__) -args = parser.parse_args() +sys.path.append(os.path.realpath(os.path.dirname(__file__))) -# Configure the logging -level = logging.INFO -if args.verbose: - level = logging.DEBUG -FORMAT = '%(asctime).19s [%(levelname)s]\t[%(filename)s:%(lineno)d]\t\t%(message)s' -logging.basicConfig(level=level, format=FORMAT) +from getdist.command_line import getdist_gui -# GUI application -app = QApplication(sys.argv) -mainWin = MainWindow(app, ini=args.ini) -mainWin.show() -mainWin.raise_() -sys.exit(app.exec_()) +getdist_gui() diff --git a/python/MANIFEST.in b/python/MANIFEST.in index 897253798..2b34bde1c 100644 --- a/python/MANIFEST.in +++ b/python/MANIFEST.in @@ -1,3 +1,7 @@ include README.rst include *.py include getdist/analysis_defaults.ini +recursive-include getdist/gui/mac_app * +include getdist/gui/images/*.png +include getdist/styles/*.sty +include getdist/styles/*.paramnames diff --git a/python/README.rst b/python/README.rst index 63f8698d2..f3e3103cb 100644 --- a/python/README.rst +++ b/python/README.rst @@ -37,42 +37,34 @@ Getting Started Install getdist using pip:: - $ sudo pip install getdist + $ pip install getdist or from source files using:: - $ sudo python setup.py install + $ python setup.py install You can test if things are working using the unit test by running:: $ python setup.py test Check the dependencies listed in the next section are installed. You can then use the getdist module from your scripts, or -use the GUI program GetDistGUI.py. +use the GetDist GUI (*getdist-gui* command). +Once installed, the best way to get up to speed is probably to read through +the `Plot Gallery and tutorial `_. Dependencies ============= -* Python 2.7+ or 3.4+ +* Python 2.7+ or 3.6+ * matplotlib * scipy -* PySide (optional, only needed for GUI) -* Working LaTeX installation (for some plotting/table functions) +* PySide (Python 2) or PySide2 (Python 3) - optional, only needed for GUI +* Working LaTeX installation (not essential, only for some plotting/table functions) -Python distributions like Anaconda have most of what you need (except for LaTeX). To install binary backages on Linux-like systems -install pacakages *py-matplotlib, py-scipy, py-pyside, texlive-latex-extra, texlive-fonts-recommended, dvipng*. -For example on a Mac using Python 2.7 from `MacPorts `_:: +Python distributions like Anaconda have most of what you need (except for LaTeX). - sudo port install python27 - sudo port select --set python python27 - sudo port install py-matplotlib - sudo port install py-scipy - sudo port install py-pyside - sudo port install texlive-latex-extra - sudo port install texlive-fonts-recommended - sudo port install dvipng - -If you don't want to install dependencies locally, you can also use a pre-configured `virtual environment `_. +To use the `GUI `_ you need PySide or PySide2. +See the `GUI docs `_ for suggestions on how to install. Algorithm details ================== @@ -114,7 +106,7 @@ The .ranges file gives hard bounds for the parameters, e.g.:: Note that not all parameters need to be specified, and "N" can be used to denote that a particular upper or lower limit is unbounded. The ranges are used to determine densities and plot bounds if there are samples near the boundary; if there are no samples anywhere near the boundary the ranges have no affect on plot bounds, which are chosen appropriately for the range of the samples. -There can also optionally be a .properties.ini file, which can specify *burn_removed=T* to ensure no burn in is removed, or *ignore_rows=x" to ignore the first +There can also optionally be a .properties.ini file, which can specify *burn_removed=T* to ensure no burn in is removed, or *ignore_rows=x* to ignore the first fraction *x* of the file rows (or if *x > 1*, the specified number of rows). Loading samples @@ -131,7 +123,7 @@ The MCSamples object can be passed to plot functions, or used to get many result for parameter names *x1* and *x2*:: from getdist import plots - g = plots.getSinglePlotter() + g = plots.get_single_plotter() g.plot_2d(samples, ['x1', 'x2']) When you have many different chain files in the same directory, @@ -139,18 +131,19 @@ plotting can work directly with the root file names. For example to compare *x* from two chains with root names *xxx* and *yyy*:: from getdist import plots - g = plots.getSinglePlotter(chain_dir='/path/to/', analysis_settings={'ignore_rows':0.3}) - g.plot_2d(['xxx','yyy], ['x', 'y']) + g = plots.get_single_plotter(chain_dir='/path/to/', analysis_settings={'ignore_rows':0.3}) + g.plot_2d(['xxx','yyy'], ['x', 'y']) -MCSamples objects can also be constructed directly from numpy arrays in memory, see the example in the `Plot Gallery `_. +MCSamples objects can also be constructed directly from numpy arrays in memory, see the example +in the `Plot Gallery `_. GetDist script =================== -If you have chain files on on disk, you can also quickly calculate convergence and marginalized statistics using the GetDist.py script: +If you have chain files on on disk, you can also quickly calculate convergence and marginalized statistics using the *getdist* script: - usage: GetDist.py [-h] [--ignore_rows IGNORE_ROWS] [-V] [ini_file] [chain_root] + usage: getdist [-h] [--ignore_rows IGNORE_ROWS] [-V] [ini_file] [chain_root] GetDist sample analyser @@ -173,7 +166,7 @@ If you have chain files on on disk, you can also quickly calculate convergence a where *ini_file* is optionally a .ini file listing *key=value* parameter option values, and chain_root is the root file name of the chains. For example:: - GetDist.py distparams.ini chains/test_chain + getdist distparams.ini chains/test_chain This produces a set of files containing parameter means and limits (.margestats), N-D likelihood contour boundaries and best-fit sample (.likestats), convergence diagnostics (.converge), parameter covariance and correlation (.covmat and .corr), and optionally various simple plotting scripts. @@ -181,14 +174,14 @@ If no *ini_file* is given, default settings are used. The *ignore_rows* option a To customize settings you can run:: - GetDist.py --make_param_file distparams.ini + getdist --make_param_file distparams.ini to produce the setting file distparams.ini, edit it, then run with your custom settings. GetDist GUI =================== -Run the GetDistGUI.py script to run the graphical user interface. This requires PySide, but will run on Windows, Linux and Mac. +Run *getdist-gui* to run the graphical user interface. This requires PySide, but will run on Windows, Linux and Mac. It allows you to open a folder of chain files, then easily select, open, plot and compare, as well as viewing standard GetDist outputs and tables. See the `GUI Readme `_. @@ -206,6 +199,6 @@ and using CosmoMC parameter grids in the `Readme - + + diff --git a/python/docs/plot_gallery.html b/python/docs/plot_gallery.html index 5216d3800..da769d69f 100644 --- a/python/docs/plot_gallery.html +++ b/python/docs/plot_gallery.html @@ -1,9 +1,14 @@ -plot_gallery + +plot_gallery + + + +