29from __future__
import print_function
34matplotlib.rcParams.update({
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,
44 "grid.linestyle":
"-",
45 "grid.linewidth": 0.25
47from matplotlib
import figure
48from matplotlib
import cm
49from matplotlib.backends.backend_agg
import FigureCanvasAgg
as FigureCanvas
51from optparse
import OptionParser
55from lalburst
import git_version
56from lalburst
import snglcoinc
57from lalburst
import stringutils
60__author__ =
"Kipp Cannon <kipp.cannon@ligo.org>"
61__version__ =
"git id %s" % git_version.id
62__date__ = git_version.date
65golden_ratio = (1 + math.sqrt(5)) / 2
78 parser = OptionParser(
79 version =
"Name: %%prog\n%s" % git_version.verbose_msg
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()
86 if not options.format:
87 options.format = [
"png"]
89 return options, (filenames
or [
None])
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]
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]
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))
118 axes = fig.add_axes((.15, .15, .95 - .15, .90 - .15))
121 denominator_data = numpy.nan_to_num(numpy.transpose(denominator_data))
122 numerator_data = numpy.nan_to_num(numpy.transpose(numerator_data))
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])])
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")
142def dA_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
143 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
145 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
147 denominator_data = numpy.nan_to_num(denominator_data)
148 numerator_data = numpy.nan_to_num(numerator_data)
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")
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")
166def df_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
167 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
169 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
171 denominator_data = numpy.nan_to_num(denominator_data)
172 numerator_data = numpy.nan_to_num(numerator_data)
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")
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")
191def dt_plot(key, denominator_coords, denominator_data, numerator_coords, numerator_data):
192 fig = figure.Figure(figsize=(4, 4 / golden_ratio))
194 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
196 denominator_data = numpy.nan_to_num(denominator_data)
197 numerator_data = numpy.nan_to_num(numerator_data)
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")
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")
217 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
219 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
221 denominator_data = numpy.nan_to_num(denominator_data)
222 numerator_data = numpy.nan_to_num(numerator_data)
224 axes.plot(xcoords, denominator_data,
"ko-", label =
"Background")
225 axes.plot(xcoords, numerator_data,
"ro-", label =
"Injections")
226 axes.legend(loc =
"lower left")
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")
237 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
239 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
241 denominator_data = numpy.nan_to_num(denominator_data)
242 numerator_data = numpy.nan_to_num(numerator_data)
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")
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")
258 fig = figure.Figure(figsize = (4, 4 / golden_ratio))
260 axes = fig.add_axes((.14, .15, .98 - .14, .90 - .15))
262 denominator_data = numpy.nan_to_num(denominator_data)
263 numerator_data = numpy.nan_to_num(numerator_data)
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()
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")
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")
296coincparamsdistributions, seglists = stringutils.load_likelihood_data(filenames, verbose = options.verbose)
299 print(
"computing event densities ...", file=sys.stderr)
300if not options.no_filter:
301 coincparamsdistributions.finish(verbose = options.verbose)
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"):
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)
316 print(
"\twriting %s ..." % outname, file=sys.stderr)
318 elif name.endswith(
"_dt"):
320 print(
"generating plots for %s ..." % name, file=sys.stderr)
321 dt = .010 + snglcoinc.light_travel_time(*instruments)
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)
328 print(
"\twriting %s ..." % outname, file=sys.stderr)
330 elif name.endswith(
"_dA"):
332 print(
"generating plots for %s ..." % name, file=sys.stderr)
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)
339 print(
"\twriting %s ..." % outname, file=sys.stderr)
341 elif name.endswith(
"_df"):
343 print(
"generating plots for %s ..." % name, file=sys.stderr)
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)
350 print(
"\twriting %s ..." % outname, file=sys.stderr)
352 elif name ==
"nevents":
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)
359 print(
"\twriting %s ..." % outname, file=sys.stderr)
361 elif name ==
"instrumentgroup":
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)
368 print(
"\twriting %s ..." % outname, file=sys.stderr)
370 elif name ==
"instrumentgroup,rss_timing_residual":
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)
379 print(
"\twriting %s ..." % outname, file=sys.stderr)
def instrumentgroup_timingresidual_plot(key, denominator_xcoords, denominator_ycoords, denominator_data, numerator_xcoords, numerator_ycoords, numerator_data)
def clip_binned_array_1d(binnedarray, xlim)
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)