Coverage for pesummary/cli/summarytgr.py: 76.0%
104 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-12-09 22:34 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-12-09 22:34 +0000
1#! /usr/bin/env python
3# Licensed under an MIT style license -- see LICENSE.md
5import os
6import numpy as np
7from itertools import cycle
8from pesummary import conf
9from pesummary.gw.cli.parser import TGRArgumentParser
10from pesummary.gw.webpage.tgr import TGRWebpageGeneration
11from pesummary.gw.file.meta_file import TGRMetaFile
12from pesummary.gw.plots.tgr import make_and_save_imrct_plots
13from pesummary.gw.conversions.tgr import generate_imrct_deviation_parameters
14from pesummary.utils.utils import logger
16__author__ = [
17 "Charlie Hoy <charlie.hoy@ligo.org>",
18 "Aditya Vijaykumar <aditya.vijaykumar@ligo.org>",
19]
20__doc__ = """This executable is used to post-process and generate webpages to
21display results from analyses which test the General Theory of Relativity"""
24def generate_pe_pages(webdir, result_files, labels, additional_options=""):
25 """Launch a subprocess to generate PE pages using `summarypages`
27 Parameters
28 ----------
29 webdir: str
30 directory to store the output pages
31 result_files: list
32 list of paths to result files
33 labels: list
34 list of labels to use for each result file
35 additional_options: str, optional
36 additional options to add to the summarypages executable
37 """
38 from .summarytest import launch
40 logger.info("Creating PE summarypages")
41 base_command_line = (
42 "summarypages --webdir {} --samples {} --labels {} --gw ".format(
43 webdir, " ".join(result_files), " ".join(labels)
44 )
45 )
46 base_command_line += additional_options
47 launch(base_command_line, check_call=True)
48 logger.info("PE summarypages created")
49 return
52def imrct(opts):
53 """Postprocess the IMR consistency test results
55 Parameters
56 ----------
57 opts: argparse.Namespace
58 Namespace object containing the command line options
60 Returns
61 -------
62 args: pesummary.gw.cli.inputs.IMRCTInput
63 IMRCTInput object containing the command line arguments
64 data: list
65 a list of length 3 containing a dictionary of key data associated with
66 the IMR consistency test results, a list containing links to PE pages
67 displaying the posterior samples for the inspiral and postinspiral
68 analyses and a list containing the IMRCT deviation PDFs for each
69 analysis
70 """
71 from pesummary.gw.cli.inputs import IMRCTInput
73 args = IMRCTInput(opts)
74 test_key_data = {}
75 fits_data = {}
76 _imrct_deviations = []
77 cmap_cycle = cycle(conf.cmapcycle)
78 evolved = np.ones_like(args.inspiral_keys, dtype=bool)
79 for num, _inspiral in enumerate(args.inspiral_keys):
80 _postinspiral = args.postinspiral_keys[num]
81 _samples = args.samples[[_inspiral, _postinspiral]]
82 args.imrct_kwargs.update({
83 prop: {
84 _key: (
85 getattr(args, prop)[args.labels.index(_key)] if
86 getattr(args, prop) is not None else None
87 ) for _key in [_inspiral, _postinspiral]
88 } for prop in ["approximant", "f_low"]
89 })
90 imrct_deviations, data, _evolved, samples = generate_imrct_deviation_parameters(
91 _samples,
92 evolve_spins_forward=opts.evolve_spins_forwards,
93 inspiral_string=_inspiral,
94 postinspiral_string=_postinspiral,
95 return_samples_used=True,
96 **args.imrct_kwargs,
97 )
98 for key, value in samples.items():
99 args.samples[key] = value
100 evolved[num] = _evolved
101 data.update(fits_data)
102 _imrct_deviations.append(imrct_deviations)
103 _legend_kwargs = {}
104 if len(args.analysis_label) > 1:
105 _legend_kwargs = {
106 "legend": True,
107 "label": args.analysis_label[num],
108 "legend_kwargs": {"frameon": True},
109 }
110 logger.info("Starting to generate plots")
111 make_and_save_imrct_plots(
112 imrct_deviations,
113 samples=_samples,
114 plot_label=args.analysis_label[num],
115 webdir=args.webdir,
116 cmap=next(cmap_cycle),
117 evolve_spins=evolved[num],
118 make_diagnostic_plots=opts.make_diagnostic_plots,
119 inspiral_string=_inspiral,
120 postinspiral_string=_postinspiral,
121 **_legend_kwargs,
122 )
123 logger.info("Finished generating plots")
124 _keys = [
125 "inspiral maximum frequency (Hz)",
126 "postinspiral minimum frequency (Hz)",
127 "inspiral approximant",
128 "postinspiral approximant",
129 "inspiral remnant fits",
130 "postinspiral remnant fits"
131 ]
132 for key in _keys:
133 if "remnant" not in key:
134 data[key] = args.meta_data[args.analysis_label[num]][key]
135 else:
136 _meta_data = args.meta_data[args.analysis_label[num]][key]
137 _fits = [
138 "final_mass_NR_fits", "final_spin_NR_fits"
139 ]
140 prefix = key.split(" remnant fits")[0]
141 for _fit in _fits:
142 if _meta_data is not None and _fit in _meta_data.keys():
143 data["{} {}".format(prefix, _fit)] = _meta_data[_fit]
145 desired_metadata_order = [
146 "GR Quantile (%)",
147 "inspiral maximum frequency (Hz)",
148 "postinspiral minimum frequency (Hz)",
149 "inspiral final_mass_NR_fits",
150 "postinspiral final_mass_NR_fits",
151 "inspiral final_spin_NR_fits",
152 "postinspiral final_spin_NR_fits",
153 "inspiral approximant",
154 "postinspiral approximant",
155 "evolve_spins",
156 "N_bins",
157 "Time (seconds)",
158 ]
160 desired_metadata = {}
161 for key in desired_metadata_order:
162 try:
163 desired_metadata[key] = data[key]
164 except KeyError:
165 continue
166 test_key_data[args.analysis_label[num]] = desired_metadata
167 if len(args.inspiral_keys) > 1:
168 fig = None
169 colors = cycle(conf.colorcycle)
170 for num, _samples in enumerate(_imrct_deviations):
171 save = False
172 if num == len(_imrct_deviations) - 1:
173 save = True
174 fig = make_and_save_imrct_plots(
175 _samples,
176 samples={},
177 webdir=args.webdir,
178 evolve_spins=evolved[num],
179 make_diagnostic_plots=False,
180 plot_label="combined",
181 cmap="off",
182 levels=[0.95],
183 level_kwargs={"colors": [next(colors)]},
184 existing_figure=fig,
185 save=save,
186 return_fig=True,
187 legend=True,
188 label=args.analysis_label[num],
189 legend_kwargs={"frameon": True},
190 )
191 if not len(args.links_to_pe_pages):
192 try:
193 links_to_pe_pages = [
194 args.samples_paths[_label].history["webpage_url"]
195 for _label in args.labels
196 ]
197 except (AttributeError, KeyError, TypeError):
198 links_to_pe_pages = []
199 else:
200 links_to_pe_pages = args.links_to_pe_pages
202 if not len(links_to_pe_pages) and not opts.disable_pe_page_generation:
203 links_to_pe_pages = [
204 "../pe_pages/html/{0}_{0}.html".format(label) for label in
205 args.labels
206 ]
207 return args, [test_key_data, links_to_pe_pages, _imrct_deviations]
210def main(args=None):
211 """Top level interface for `summarytgr`"""
212 parser = TGRArgumentParser(description=__doc__)
213 parser.add_all_known_options_to_parser()
214 opts, unknown = parser.parse_known_args(args=args)
215 test_key_data = {}
216 if opts.test == "imrct":
217 args, _data = imrct(opts)
218 test_key_data["imrct"], links_to_pe_pages, _imrct_deviations = _data
219 samplesdir = os.path.join(args.webdir, "samples")
220 TGRMetaFile(
221 args.samples,
222 args.analysis_label,
223 webdir=opts.webdir,
224 imrct_data={
225 label: _imrct_deviations[num] for num, label in enumerate(
226 args.analysis_label
227 )
228 },
229 file_kwargs=test_key_data,
230 )
231 test_key_data_for_webpage = test_key_data
232 for key in test_key_data_for_webpage["imrct"].keys():
233 test_key_data_for_webpage["imrct"][key]["GR Quantile (%)"] = round(
234 test_key_data_for_webpage["imrct"][key]["GR Quantile (%)"], 2
235 )
236 logger.info("Creating webpages for IMRCT")
237 webpage = TGRWebpageGeneration(
238 args.webdir,
239 args.result_files,
240 test=opts.test,
241 open_files=args.samples,
242 links_to_pe_pages=links_to_pe_pages,
243 test_key_data=test_key_data_for_webpage,
244 )
245 webpage.generate_webpages(make_diagnostic_plots=opts.make_diagnostic_plots)
246 msg = "Complete. Webpages can be viewed at the following url {}.".format(
247 args.baseurl + "/home.html"
248 )
249 if not opts.disable_pe_page_generation:
250 msg += (
251 " The PE webpages are about to be generated. These links will not "
252 "work currently"
253 )
254 logger.info(msg)
255 _webdir = os.path.join(args.webdir, "pe_pages")
256 _ = generate_pe_pages(
257 _webdir, args.result_files, args.labels, opts.pe_page_options
258 )
259 else:
260 logger.info(msg)
263if __name__ == "__main__":
264 main()