#!/usr/bin/env python""" Tool to analyse a set of runs for parameter-parameter plots """importargparseimportglobimportjsonimportosfromdatetimeimporttimedeltaimportcornerimportnumpyasnpimporttqdmfrombilby.core.resultimportResultList,ResultListError,make_pp_plot,read_in_resultfrom.utilsimportlogger# fmt: offimportmatplotlibasmpl# isort:skipmpl.use("agg")# fmt: onmpl.rcParams.update(mpl.rcParamsDefault)
[docs]defcreate_parser():parser=argparse.ArgumentParser(prog="bilby_pipe PP test",usage="Generates a pp plot from a directory containing a set of results",)parser.add_argument("directory",help="Path to the result files")parser.add_argument("--outdir",help="Path to output directory, defaults to input directory ")parser.add_argument("--label",help="Additional label to use for output")parser.add_argument("--print",action="store_true",help="Print the list of filenames used")parser.add_argument("-n",type=int,help="Number of samples to truncate to",default=None)parser.add_argument("--filter",type=str,help="A string to match and filtering results",default=None,)returnparser
[docs]defget_results_filenames(args):results_files=[]forextensionin["json","h5","hdf5","pkl"]:glob_string=os.path.join(args.directory,"*result*"+extension)results_files+=glob.glob(glob_string)results_files=[rfforrfinresults_filesifos.path.isfile(rf)]iflen(results_files)==0:raiseFileNotFoundError(f"No results found in path {args.directory}")ifargs.filterisnotNone:logger.info(f"Filtering results to only '{args.filter}' results")results_files=[rfforrfinresults_filesifargs.filterinrf]ifany("merge"initemforiteminresults_files):logger.info("Filtering results to only 'merge' results")results_files=[rfforrfinresults_filesif"merge"inrf]ifargs.nisnotNone:logger.info(f"Truncating to first {args.n} results")results_files=results_files[:args.n]returnresults_files
[docs]defcheck_consistency(results):forcheckin["sampler","parameters","priors"]:try:getattr(results,f"check_consistent_{check}")()exceptResultListErrorasemsg:logger.warning(f"Results have inconsistent {check}: {emsg}")
[docs]defread_in_result_list(args,results_filenames):print("Reading in results ...")results=[]forfintqdm.tqdm(results_filenames):try:results.append(read_in_result(f))exceptjson.decoder.JSONDecodeError:passprint(f"Read in {len(results)} results from directory {args.directory}")print("Checking if results are complete")results_u=[]forrinresults:ifr._posteriorisnotNone:results_u.append(r)iflen(results_u)<len(results):print(f"Results incomplete, truncating to {len(results_u)}")results=results_uelse:print("Results complete")ifargs.print:print(f"List of result-labels: {sorted([res.labelforresinresults])}")returnResultList(results)
[docs]defmake_meta_data_plot(results,basename):logger.info("Create meta data plot")TIME_SCALE=3600stimes=[]nsamples=[]forresultinresults:ifisinstance(result.sampling_time,timedelta):stimes.append(result.sampling_time.total_seconds()/TIME_SCALE)else:stimes.append(result.sampling_time/TIME_SCALE)nsamples.append(len(result.posterior)/1000)snrs=[]detectors=list(results[0].meta_data["likelihood"]["interferometers"].keys())fordetindetectors:snrs.append([r.meta_data["likelihood"]["interferometers"][det]["optimal_SNR"]forrinresults])network_snr=np.sqrt(np.sum(np.array(snrs)**2,axis=0))fig=corner.corner(np.array([network_snr,stimes,nsamples]).T,bins=20,labels=["optimal SNR","wall time [hr]","nsamples [e3]"],plot_density=False,plot_contours=False,data_kwargs=dict(alpha=1),show_titles=True,range=[1,1,1],)fig.savefig(f"{basename}meta.png")