Loading [MathJax]/extensions/TeX/AMSsymbols.js
LALInspiral 5.0.3.1-b246709
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
thinca_compare_coinc_lists.py
Go to the documentation of this file.
1##python
2import itertools
3from optparse import OptionParser
4import sys
5
6
7from lalinspiral.thinca import InspiralCoincDef
8
9
10from igwn_ligolw import lsctables
11from igwn_ligolw import utils as ligolw_utils
12
13
15 parser = OptionParser(
16 )
17 parser.add_option("-v", "--verbose", action = "store_true", help = "Be verbose.")
18
19 options, filenames = parser.parse_args()
20
21 if len(filenames) != 2:
22 raise ValueError("exactly two filenames are required")
23
24 return options, filenames
25
26
27options, filenames = parse_command_line()
28
29
30class index(object):
31 def __init__(self, xmldoc):
32 coinc_def_id = lsctables.CoincDefTable.get_table(xmldoc).get_coinc_def_id(search = InspiralCoincDef.search, search_coinc_type = InspiralCoincDef.search_coinc_type, create_new = False)
33
34 self.sngls = dict((row.event_id, row) for row in lsctables.SnglInspiralTable.get_table(xmldoc))
35 print("document contains %d duplicate sngl_inspiral rows" % (len(lsctables.SnglInspiralTable.get_table(xmldoc)) - len(self.sngls)))
36 self.coincs = dict((row.coinc_event_id, row) for row in lsctables.CoincTable.get_table(xmldoc) if row.coinc_def_id == coinc_def_id)
37 self.offsetvectors = lsctables.TimeSlideTable.get_table(xmldoc).as_dict()
38
39 coinc_event_ids = frozenset(self.coincs)
40 coinc_map = [row for row in lsctables.CoincMapTable.get_table(xmldoc) if row.table_name == "sngl_inspiral" and row.coinc_event_id in coinc_event_ids]
41 coinc_map.sort(key = lambda row: row.coinc_event_id)
42 print("document is missing %d sngl_inspiral rows that appear in coincs" % (len(set(row.event_id for row in coinc_map) - set(self.sngls))))
43 print("document has %d sngl_inspiral rows that do not appear in coincs" % (len(set(self.sngls) - set(row.event_id for row in coinc_map))))
44 self.coinc_map = {}
45 for time_slide_id in self.offsetvectors:
46 self.coinc_map[time_slide_id] = dict((frozenset(row.event_id for row in rows), coinc_event_id) for coinc_event_id, rows in itertools.groupby(coinc_map, key = lambda row: row.coinc_event_id) if self.coincs[coinc_event_id].time_slide_id == time_slide_id)
47
48 def get_sngls(self, event_ids):
49 return tuple(self.sngls[event_id] for event_id in event_ids)
50
51 def min_time(self, time_slide_id, event_ids):
52 offsetvector = self.offsetvectors[time_slide_id]
53 return min(sngl.end + offsetvector[sngl.ifo] for sngl in self.get_sngls(event_ids))
54
55 def print_summary(self, time_slide_id, event_ids):
56 offsetvector = self.offsetvectors[time_slide_id]
57 sngls = self.get_sngls(event_ids)
58 end_times = []
59 for sngl in sorted(sngls, key = lambda row: row.ifo):
60 end_times.append(sngl.end + offsetvector[sngl.ifo])
61 print("\tevent ID %d: %s: %s + %g s = %s" % (sngl.event_id, sngl.ifo, sngl.end, offsetvector[sngl.ifo], sngl.end + offsetvector[sngl.ifo]))
62 print("\tmax Delta t = %g s" % float(max(end_times) - min(end_times)))
63
64
65indexes = [index(ligolw_utils.load_filename(filename, verbose = options.verbose)) for filename in filenames]
66
67if indexes[0].offsetvectors != indexes[1].offsetvectors:
68 raise ValueError("documents do not contain identical offset vectors, or their IDs are not equivalent")
69
70
71print("\ncoincs in document 1 that are not in document 2:")
72n = 0
73for time_slide_id in indexes[0].offsetvectors:
74 for n, event_ids in enumerate(sorted(set(indexes[0].coinc_map[time_slide_id]) - set(indexes[1].coinc_map[time_slide_id]), key = lambda event_ids: indexes[0].min_time(time_slide_id, event_ids)), start = n):
75 print("%d:" % n)
76 indexes[0].print_summary(time_slide_id, event_ids)
77
78print("\ncoincs in document 2 that are not in document 1:")
79n = 0
80for time_slide_id in indexes[0].offsetvectors:
81 for n, event_ids in enumerate(sorted(set(indexes[1].coinc_map[time_slide_id]) - set(indexes[0].coinc_map[time_slide_id]), key = lambda event_ids: indexes[1].min_time(time_slide_id, event_ids)), start = n):
82 print("%d:" % n)
83 indexes[1].print_summary(time_slide_id, event_ids)
def print_summary(self, time_slide_id, event_ids)
def min_time(self, time_slide_id, event_ids)