LALApps 10.1.0.1-eeff03c
lalapps_string_plot_likelihood.py
Go to the documentation of this file.
1##python
2#
3# Copyright (C) 2009 Kipp Cannon
4#
5# This program is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License as published by the
7# Free Software Foundation; either version 2 of the License, or (at your
8# option) any later version.
9#
10# This program is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13# Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along
16# with this program; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
19
20#
21# =============================================================================
22#
23# Preamble
24#
25# =============================================================================
26#
27
28
29from __future__ import print_function
30
31
32import math
33import matplotlib
34matplotlib.rcParams.update({
35 "font.size": 8.0,
36 "axes.titlesize": 10.0,
37 "axes.labelsize": 10.0,
38 "xtick.labelsize": 8.0,
39 "ytick.labelsize": 8.0,
40 "legend.fontsize": 8.0,
41 "figure.dpi": 300,
42 "savefig.dpi": 300,
43 "text.usetex": True,
44 "grid.linestyle": "-",
45 "grid.linewidth": 0.25
46})
47from matplotlib import figure
48from matplotlib import cm
49from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
50import numpy
51from optparse import OptionParser
52import sys
53
54
55from lalburst import git_version
56from lalburst import snglcoinc
57from lalburst import stringutils
58
59
60__author__ = "Kipp Cannon <kipp.cannon@ligo.org>"
61__version__ = "git id %s" % git_version.id
62__date__ = git_version.date
63
64
65golden_ratio = (1 + math.sqrt(5)) / 2
66
67
68#
69# =============================================================================
70#
71# Command Line
72#
73# =============================================================================
74#
75
76
78 parser = OptionParser(
79 version = "Name: %%prog\n%s" % git_version.verbose_msg
80 )
81 parser.add_option("-f", "--format", metavar = "extension", action = "append", default = [], help = "Set the image output format by setting the filename extension (default = \"png\"). Can be given multiple times to generate plots in multiple formats.")
82 parser.add_option("--no-filter", action = "store_true", help = "Do not apply smoothing/normalization filters to data, plot raw bin values.")
83 parser.add_option("-v", "--verbose", action = "store_true", help = "Be verbose.")
84 options, filenames = parser.parse_args()
85
86 if not options.format:
87 options.format = ["png"]
88
89 return options, (filenames or [None])
90
91
92#
93# =============================================================================
94#
95# Blah
96#
97# =============================================================================
98#
99
100
101def clip_binned_array_1d(binnedarray, xlim):
102 imin, = binnedarray.bins[xlim[0],]
103 imax, = binnedarray.bins[xlim[1],]
104 coords, = binnedarray.bins.centres()
105 return coords[imin:imax], binnedarray.at_centres()[imin:imax]
106
107
108def clip_binned_array_2d(binnedarray, xlim, ylim):
109 imin, jmin = binnedarray.bins[xlim[0], ylim[0]]
110 imax, jmax = binnedarray.bins[xlim[1], ylim[1]]
111 xcoords, ycoords = binnedarray.bins.centres()
112 return xcoords[imin:imax], ycoords[jmin:jmax], binnedarray.at_centres()[imin:imax,jmin:jmax]
113
114
115def snr2_chi2_plot(key, denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data, ncontours = 49):
116 fig = figure.Figure(figsize=(3, 3))
117 FigureCanvas(fig)
118 axes = fig.add_axes((.15, .15, .95 - .15, .90 - .15))
119 axes.loglog()
120
121 denominator_data = numpy.nan_to_num(numpy.transpose(denominator_data))
122 numerator_data = numpy.nan_to_num(numpy.transpose(numerator_data))
123
124 if numpy.any(denominator_data) or numpy.any(numerator_data):
125 hi = max(denominator_data.max(), numerator_data.max())
126 contours = numpy.arange(hi - 30, hi, 1., dtype = "double")
127 numerator_cset = axes.contour(numerator_xcoords, numerator_ycoords, numerator_data, contours, cmap = cm.Reds)
128 denominator_cset = axes.contour(denominator_xcoords, denominator_ycoords, denominator_data, contours, cmap = cm.Greys)
129 axes.set_xlim([min(denominator_xcoords[0], numerator_xcoords[0]), max(denominator_xcoords[-1], numerator_xcoords[-1])])
130 axes.set_ylim([min(denominator_ycoords[0], numerator_ycoords[0]), max(denominator_ycoords[-1], numerator_ycoords[-1])])
131 #cbar = fig.add_axes((.75,.15,.1,.75))
132 #colorbar.Colorbar(cbar, cset)
133 instrument = key.split("-")[0]
134 axes.set_title(r"%s Event Density $\ln P(\rho^{2}, \chi^{2})$" % instrument)
135 axes.set_ylabel(r"$\chi^{2} / \mathrm{DOF}$")
136 axes.set_xlabel(r"$\rho^{2}$")
137 axes.xaxis.grid(True, which = "major,minor")
138 axes.yaxis.grid(True, which = "major,minor")
139 return fig
140
141
142def dA_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
143 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
144 FigureCanvas(fig)
145 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
146
147 denominator_data = numpy.nan_to_num(denominator_data)
148 numerator_data = numpy.nan_to_num(numerator_data)
149
150 if numpy.any(denominator_data):
151 axes.plot(denominator_coords, denominator_data, "k-", label = "Background")
152 if numpy.any(numerator_data):
153 axes.plot(numerator_coords, numerator_data, "r-", label = "Injections")
154 ymin, ymax = axes.get_ylim()
155 axes.set_ylim((max(ymin, ymax - 14), ymax))
156 axes.legend(loc = "upper left")
157
158 instrument1, instrument2 = key.split("-")[:2]
159 axes.set_title(r"%s--%s Amplitude Ratio Distribution" % (instrument1, instrument2))
160 axes.set_ylabel(r"$\ln P$")
161 axes.set_xlabel(r"$\log_{10} \left|A_{\mathrm{%s}} / A_{\mathrm{%s}}\right|$" % (instrument1, instrument2))
162 axes.xaxis.grid(True, which = "major,minor")
163 axes.yaxis.grid(True, which = "major,minor")
164 return fig
165
166def df_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
167 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
168 FigureCanvas(fig)
169 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
170
171 denominator_data = numpy.nan_to_num(denominator_data)
172 numerator_data = numpy.nan_to_num(numerator_data)
173
174 if numpy.any(denominator_data):
175 axes.plot(denominator_coords, denominator_data, "k-", label = "Background")
176 if numpy.any(numerator_data):
177 axes.plot(numerator_coords, numerator_data, "r-", label = "Injections")
178 ymin, ymax = axes.get_ylim()
179 axes.set_ylim((max(ymin, ymax - 14), ymax))
180 axes.legend(loc = "upper left")
181
182 instrument1, instrument2 = key.split("-")[:2]
183 axes.set_title(r"%s--%s Frequency Cutoff Asymmetry Distribution" % (instrument1, instrument2))
184 axes.set_ylabel(r"$\ln P$")
185 axes.set_xlabel(r"$\left({f_{\mathrm{cut}}}_{\mathrm{%s}} - {f_{\mathrm{cut}}}_{\mathrm{%s}}\right) / \frac{1}{2} \left({f_{\mathrm{cut}}}_{\mathrm{%s}} + {f_{\mathrm{cut}}}_{\mathrm{%s}}\right)$" % (instrument1, instrument2,instrument1, instrument2))
186 axes.xaxis.grid(True, which = "major,minor")
187 axes.yaxis.grid(True, which = "major,minor")
188 return fig
189
190
191def dt_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
192 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
193 FigureCanvas(fig)
194 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
195
196 denominator_data = numpy.nan_to_num(denominator_data)
197 numerator_data = numpy.nan_to_num(numerator_data)
198
199 if numpy.any(denominator_data):
200 axes.plot(denominator_coords, denominator_data, "k-", label = "Background")
201 if numpy.any(numerator_data):
202 axes.plot(numerator_coords, numerator_data, "r-", label = "Injections")
203 ymin, ymax = axes.get_ylim()
204 axes.set_ylim((max(ymin, ymax - 14), ymax))
205 axes.legend(loc = "upper left")
206
207 instrument1, instrument2 = key.split("-")[:2]
208 axes.set_title(r"%s--%s Arrival Time Difference Distribution" % (instrument1, instrument2))
209 axes.set_ylabel(r"$\ln P$")
210 axes.set_xlabel(r"$t_{\mathrm{%s}} - t_{\mathrm{%s}}$ (s)" % (instrument1, instrument2))
211 axes.xaxis.grid(True, which = "major,minor")
212 axes.yaxis.grid(True, which = "major,minor")
213 return fig
214
215
216def nevents_plot(key, xcoords, denominator_data, numerator_data):
217 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
218 FigureCanvas(fig)
219 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
220
221 denominator_data = numpy.nan_to_num(denominator_data)
222 numerator_data = numpy.nan_to_num(numerator_data)
223
224 axes.plot(xcoords, denominator_data, "ko-", label = "Background")
225 axes.plot(xcoords, numerator_data, "ro-", label = "Injections")
226 axes.legend(loc = "lower left")
227
228 axes.set_title("Number of Events Found in Coincidence")
229 axes.set_xlabel("Number of Events $N$")
230 axes.set_ylabel(r"$\ln P(N)$")
231 axes.xaxis.grid(True, which = "major,minor")
232 axes.yaxis.grid(True, which = "major,minor")
233
234 return fig
235
236def instrumentgroup_plot(key, xcoords, denominator_data, numerator_data):
237 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
238 FigureCanvas(fig)
239 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
240
241 denominator_data = numpy.nan_to_num(denominator_data)
242 numerator_data = numpy.nan_to_num(numerator_data)
243
244 axes.plot(xcoords, denominator_data, "ko-", label = "Background")
245 axes.plot(xcoords, numerator_data, "ro-", label = "Injections")
246 axes.set_ticklabels([",".join(sorted(stringutils.category_to_instruments(i))) for i in xcoords])
247 axes.legend(loc = "upper right")
248
249 axes.set_title("Instrument Combinations")
250 axes.set_xlabel("Instrument Combination")
251 axes.set_ylabel(r"$\ln P(\mathrm{Instruments})$")
252 axes.xaxis.grid(True, which = "major,minor")
253 axes.yaxis.grid(True, which = "major,minor")
254
255 return fig
256
257def instrumentgroup_timingresidual_plot(key, denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data):
258 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
259 FigureCanvas(fig)
260 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
261
262 denominator_data = numpy.nan_to_num(denominator_data)
263 numerator_data = numpy.nan_to_num(numerator_data)
264
265 for i in range(len(denominator_xcoords)):
266 if numpy.any(denominator_data[i,:]) or numpy.any(numerator_data[i,:]):
267 axes.plot(denominator_ycoords, denominator_data[i,:], label = "Background (%s)" % ", ".join(sorted(stringutils.category_to_instruments(i + 1))))
268 axes.plot(numerator_ycoords, numerator_data[i,:], label = "Injections (%s)" % ", ".join(sorted(stringutils.category_to_instruments(i + 1))))
269 ymin, ymax = axes.get_ylim()
270 # find the smallest global maximum of all curves
271 ymin = min(max(denominator_data[i,:].max(), numerator_data[i,:].max()) for i in range(len(denominator_xcoords)))
272 axes.set_ylim((ymin - 14, ymax))
273 axes.legend(loc = "upper right")
274
275 axes.set_title("RSS Timing Residual")
276 axes.set_xlabel("RSS Timing Residual (s)")
277 axes.set_ylabel(r"$\ln P$")
278 axes.xaxis.grid(True, which = "major,minor")
279 axes.yaxis.grid(True, which = "major,minor")
280
281 return fig
282
283
284#
285# =============================================================================
286#
287# Main
288#
289# =============================================================================
290#
291
292
293options, filenames = parse_command_line()
294
295
296coincparamsdistributions, seglists = stringutils.load_likelihood_data(filenames, verbose = options.verbose)
297
298if options.verbose:
299 print("computing event densities ...", file=sys.stderr)
300if not options.no_filter:
301 coincparamsdistributions.finish(verbose = options.verbose)
302
303for (denominator_name, denominator_pdf), (numerator_name, numerator_pdf) in zip(sorted(coincparamsdistributions.denominator.densities.items()), sorted(coincparamsdistributions.numerator.densities.items())):
304 assert numerator_name == denominator_name
305 name = denominator_name
306 instruments = set(name.split("_")) & set(stringutils.StringCoincParamsDistributions.instrument_categories)
307 if name.endswith("_snr2_chi2"):
308 if options.verbose:
309 print("generating plots for %s ..." % name, file=sys.stderr)
310 denominator_xcoords, denominator_ycoords, denominator_data = clip_binned_array_2d(denominator_pdf, [10, 1e6], [.01, 1e4])
311 numerator_xcoords, numerator_ycoords, numerator_data = clip_binned_array_2d(numerator_pdf, [10, 1e6], [.01, 1e4])
312 fig = snr2_chi2_plot("%s" % name.replace("_", "-"), denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data)
313 for extension in options.format:
314 outname = "%s.%s" % (name, extension)
315 if options.verbose:
316 print("\twriting %s ..." % outname, file=sys.stderr)
317 fig.savefig(outname)
318 elif name.endswith("_dt"):
319 if options.verbose:
320 print("generating plots for %s ..." % name, file=sys.stderr)
321 dt = .010 + snglcoinc.light_travel_time(*instruments)
322 denominator_coords, denominator_data = clip_binned_array_1d(denominator_pdf, (-dt, +dt))
323 numerator_coords, numerator_data = clip_binned_array_1d(numerator_pdf, (-dt, +dt))
324 fig = dt_plot("%s" % name.replace("_", "-"), denominator_coords, denominator_data, numerator_coords, numerator_data)
325 for extension in options.format:
326 outname = "%s.%s" % (name, extension)
327 if options.verbose:
328 print("\twriting %s ..." % outname, file=sys.stderr)
329 fig.savefig(outname)
330 elif name.endswith("_dA"):
331 if options.verbose:
332 print("generating plots for %s ..." % name, file=sys.stderr)
333 denominator_coords, denominator_data = clip_binned_array_1d(denominator_pdf, (-2, +2))
334 numerator_coords, numerator_data = clip_binned_array_1d(numerator_pdf, (-2, +2))
335 fig = dA_plot("%s" % name.replace("_", "-"), denominator_coords, denominator_data, numerator_coords, numerator_data)
336 for extension in options.format:
337 outname = "%s.%s" % (name, extension)
338 if options.verbose:
339 print("\twriting %s ..." % outname, file=sys.stderr)
340 fig.savefig(outname)
341 elif name.endswith("_df"):
342 if options.verbose:
343 print("generating plots for %s ..." % name, file=sys.stderr)
344 denominator_coords, denominator_data = clip_binned_array_1d(denominator_pdf, (-0.6, +0.6))
345 numerator_coords, numerator_data = clip_binned_array_1d(numerator_pdf, (-0.6, +0.6))
346 fig = df_plot("%s" % name.replace("_", "-"), denominator_coords, denominator_data, numerator_coords, numerator_data)
347 for extension in options.format:
348 outname = "%s.%s" % (name, extension)
349 if options.verbose:
350 print("\twriting %s ..." % outname, file=sys.stderr)
351 fig.savefig(outname)
352 elif name == "nevents":
353 if options.verbose:
354 print("generating plots for %s ..." % name, file=sys.stderr)
355 fig = nevents_plot("%s" % name.replace("_", "-"), denominator_pdf.centres()[0], denominator_pdf.array, numerator_pdf.array)
356 for extension in options.format:
357 outname = "%s.%s" % (name, extension)
358 if options.verbose:
359 print("\twriting %s ..." % outname, file=sys.stderr)
360 fig.savefig(outname)
361 elif name == "instrumentgroup":
362 if options.verbose:
363 print("generating plots for %s ..." % name, file=sys.stderr)
364 fig = instrumentgroup_plot("%s" % name.replace("_", "-"), denominator_pdf.centres()[0], denominator_pdf.array, numerator_pdf.array)
365 for extension in options.format:
366 outname = "%s.%s" % (name, extension)
367 if options.verbose:
368 print("\twriting %s ..." % outname, file=sys.stderr)
369 fig.savefig(outname)
370 elif name == "instrumentgroup,rss_timing_residual":
371 if options.verbose:
372 print("generating plots for %s ..." % name, file=sys.stderr)
373 denominator_xcoords, denominator_ycoords, denominator_data = clip_binned_array_2d(denominator_pdf, [1, denominator_pdf.array.shape[0] + 0.5], [0, .02])
374 numerator_xcoords, numerator_ycoords, numerator_data = clip_binned_array_2d(numerator_pdf, [1, denominator_pdf.array.shape[0] + 0.5], [0, .02])
375 fig = instrumentgroup_timingresidual_plot("%s" % name.replace("_", "-").replace(",", "--"), denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data)
376 for extension in options.format:
377 outname = "%s.%s" % (name.replace(",", "_"), extension)
378 if options.verbose:
379 print("\twriting %s ..." % outname, file=sys.stderr)
380 fig.savefig(outname)
def instrumentgroup_timingresidual_plot(key, denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data)
def df_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data)
def dt_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data)
def dA_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data)
def nevents_plot(key, xcoords, denominator_data, numerator_data)
def snr2_chi2_plot(key, denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data, ncontours=49)
def clip_binned_array_2d(binnedarray, xlim, ylim)
def instrumentgroup_plot(key, xcoords, denominator_data, numerator_data)