diff --git a/cli_bilby/bilby_result.py b/cli_bilby/bilby_result.py new file mode 100644 index 0000000000000000000000000000000000000000..aa0ea0f18835c51a782252807fafa16f50602498 --- /dev/null +++ b/cli_bilby/bilby_result.py @@ -0,0 +1,99 @@ +""" A command line interface to ease the process of batch jobs on result files + +Examples +-------- +To convert all the JSON result files in `outdir` to hdf5 format: + + $ bilby_result -r outdir/*json -c hdf5 + +Note, by default this will save the new files in the outdir defined within the +results files. To give a new location, use the `--outdir` argument. + +To print the version and `log_evidence` for all the result files in outdir: + + $ bilby_result -r outdir/*json --print version log_evidence + +To generate a corner plot for all the files in outdir + + $ bilby_result -r outdir/*json --call plot_corner + +This is effectively calling `plot_corner()` on each of the result files +individually. Note that passing extra commands in is not yet implemented. + +""" +import argparse +import pandas as pd + +import bilby + + +def setup_command_line_args(): + parser = argparse.ArgumentParser( + description="Helper tool for bilby result files", + epilog=print(__doc__)) + parser.add_argument("-r", "--results", nargs='+', required=True, + help="List of results files.") + parser.add_argument("-c", "--convert", type=str, choices=['json', 'hdf5'], + help="Convert all results.", default=False) + parser.add_argument("-o", "--outdir", type=str, default=None, + help="Output directory.") + parser.add_argument("-b", "--bayes", action='store_true', + help="Print all Bayes factors.") + parser.add_argument("-p", "--print", nargs='+', default=None, + help="Result dictionary keys to print.") + parser.add_argument("--call", nargs='+', default=None, + help="Result dictionary methods to call (no argument passing available).") + parser.add_argument("--ipython", action='store_true', + help=("For each result given, drops the user into an " + "IPython shell with the result loaded in")) + args, _ = parser.parse_known_args() + + return args + + +def read_in_results(filename_list): + results_list = [] + for filename in filename_list: + results_list.append(bilby.core.result.read_in_result(filename=filename)) + return results_list + + +def print_bayes_factors(results_list): + print("\nPrinting Bayes factors:") + N = len(results_list) + for i, res in enumerate(results_list): + print("For label={}".format(res.label)) + index = ['noise'] + [results_list[j].label for j in range(i + 1, N)] + data = [res.log_bayes_factor] + data += [res.log_evidence - results_list[j].log_evidence for j in range(i + 1, N)] + series = pd.Series(data=data, index=index, name=res.label) + print(series) + + +def drop_to_ipython(results_list): + for result in results_list: + message = "Opened IPython terminal for result {}".format(result.label) + message += "\nBilby result loaded as `result`" + import IPython + IPython.embed(header=message) + + +def main(): + args = setup_command_line_args() + results_list = read_in_results(args.results) + if args.convert: + for r in results_list: + r.save_to_file(extension=args.convert, outdir=args.outdir) + if args.print is not None: + for r in results_list: + print("\nResult file: {}/{}".format(r.outdir, r.label)) + for key in args.print: + print(" {}: {}".format(key, getattr(r, key, 'None'))) + if args.call is not None: + for r in results_list: + for call in args.call: + getattr(r, call)() + if args.bayes: + print_bayes_factors(results_list) + if args.ipython: + drop_to_ipython(results_list) diff --git a/setup.py b/setup.py index d63e99266200091599dd6fc25ee419d20cac3d92..c7a3f577f588989fe1e967b2cc06b659c7ffd87c 100644 --- a/setup.py +++ b/setup.py @@ -85,7 +85,8 @@ setup(name='bilby', 'pandas', 'scipy'], entry_points={'console_scripts': - ['bilby_plot=cli_bilby.plot_multiple_posteriors:main'] + ['bilby_plot=cli_bilby.plot_multiple_posteriors:main', + 'bilby_result=cli_bilby.bilby_result:main'] }, classifiers=[ "Programming Language :: Python :: 2.7",