Coverage for pesummary/cli/summarytgr.py: 76.0%

104 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-05-02 08:42 +0000

1#! /usr/bin/env python 

2 

3# Licensed under an MIT style license -- see LICENSE.md 

4 

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 

15 

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""" 

22 

23 

24def generate_pe_pages(webdir, result_files, labels, additional_options=""): 

25 """Launch a subprocess to generate PE pages using `summarypages` 

26 

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 

39 

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 

50 

51 

52def imrct(opts): 

53 """Postprocess the IMR consistency test results 

54 

55 Parameters 

56 ---------- 

57 opts: argparse.Namespace 

58 Namespace object containing the command line options 

59 

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 

72 

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] 

144 

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 ] 

159 

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 

201 

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] 

208 

209 

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) 

261 

262 

263if __name__ == "__main__": 

264 main()