def get_injections(self, instruments, FAR=float("inf")): injfnames = self.inj_fnames zero_lag_segments = self.zero_lag_segments[instruments] verbose = self.opts.verbose found = [] missed = [] print("", file=sys.stderr) for cnt, f in enumerate(injfnames): print("getting injections below FAR: " + str(FAR) + ":\t%.1f%%\r" % (100.0 * cnt / len(injfnames), ), end=' ', file=sys.stderr) working_filename = dbtables.get_connection_filename( f, tmp_path=opts.tmp_space, verbose=verbose) connection = sqlite3.connect(working_filename) dbtables.DBTable_set_connection(connection) xmldoc = dbtables.get_xml(connection) # DON'T BOTHER CONTINUING IF THE INSTRUMENTS OF INTEREST ARE NOT HERE instruments_in_this_file = [] for i in connection.cursor().execute( 'SELECT DISTINCT(instruments) FROM coinc_event'): if i[0]: instruments_in_this_file.append( frozenset(lsctables.instrument_set_from_ifos(i[0]))) if instruments not in instruments_in_this_file: connection.close() dbtables.discard_connection_filename(f, working_filename, verbose=verbose) dbtables.DBTable_set_connection(None) continue # WORK OUT CORRECT SEGMENTS FOR THIS FILE WHERE WE SHOULD SEE INJECTIONS segments = self.get_segments(connection, xmldoc) segments -= self.veto_segments #print thincasegments zero_lag_segments = segments.intersection( instruments) - segments.union( set(segments.keys()) - instruments) ############### # DEFINE THE INJECTION WAS MADE FUNCTION def injection_was_made(geocent_end_time, geocent_end_time_ns, zero_lag_segments=zero_lag_segments): """ return True if injection was made in the given segmentlist """ return lsctables.LIGOTimeGPS( geocent_end_time, geocent_end_time_ns) in zero_lag_segments connection.create_function("injection_was_made", 2, injection_was_made) make_sim_inspiral = lsctables.SimInspiralTable.get_table( dbtables.get_xml(connection)).row_from_cols # INSPIRAL if self.coinc_inspiral_table: for values in connection.cursor().execute( """ SELECT sim_inspiral.*, -- true if injection matched a coinc below the false alarm rate threshold EXISTS ( SELECT * FROM coinc_event_map AS mapa JOIN coinc_event_map AS mapb ON ( mapa.coinc_event_id == mapb.coinc_event_id ) JOIN coinc_inspiral ON ( mapb.table_name == "coinc_event" AND mapb.event_id == coinc_inspiral.coinc_event_id ) WHERE mapa.table_name == "sim_inspiral" AND mapa.event_id == sim_inspiral.simulation_id AND coinc_inspiral.combined_far < ? ) FROM sim_inspiral WHERE -- only interested in injections that were injected injection_was_made(sim_inspiral.geocent_end_time, sim_inspiral.geocent_end_time_ns) """, (FAR, )): sim = make_sim_inspiral(values) if values[-1]: found.append(sim) else: missed.append(sim) # BURSTS if self.multi_burst_table: for values in connection.cursor().execute( """ SELECT sim_inspiral.*, -- true if injection matched a coinc below the false alarm rate threshold EXISTS ( SELECT * FROM coinc_event_map AS mapa JOIN coinc_event_map AS mapb ON ( mapa.coinc_event_id == mapb.coinc_event_id ) JOIN multi_burst ON ( mapb.table_name == "coinc_event" AND mapb.event_id == multi_burst.coinc_event_id ) WHERE mapa.table_name == "sim_inspiral" AND mapa.event_id == sim_inspiral.simulation_id AND multi_burst.false_alarm_rate < ? ) FROM sim_inspiral WHERE -- only interested in injections that were injected injection_was_made(sim_inspiral.geocent_end_time, sim_inspiral.geocent_end_time_ns) """, (FAR, )): sim = make_sim_inspiral(values) if values[-1]: found.append(sim) else: missed.append(sim) # done dbtables.discard_connection_filename(f, working_filename, verbose=verbose) dbtables.DBTable_set_connection(None) print("\nFound = %d Missed = %d" % (len(found), len(missed)), file=sys.stderr) return found, missed
def get_injections(self, instruments, FAR=float("inf")): injfnames = self.inj_fnames zero_lag_segments = self.zero_lag_segments[instruments] verbose = self.opts.verbose found = [] missed = [] print >>sys.stderr, "" for cnt, f in enumerate(injfnames): print >>sys.stderr, "getting injections below FAR: " + str(FAR) + ":\t%.1f%%\r" % (100.0 * cnt / len(injfnames),), working_filename = dbtables.get_connection_filename(f, tmp_path = opts.tmp_space, verbose = verbose) connection = sqlite3.connect(working_filename) dbtables.DBTable_set_connection(connection) xmldoc = dbtables.get_xml(connection) # DON'T BOTHER CONTINUING IF THE INSTRUMENTS OF INTEREST ARE NOT HERE instruments_in_this_file = [] for i in connection.cursor().execute('SELECT DISTINCT(instruments) FROM coinc_event'): if i[0]: instruments_in_this_file.append(frozenset(lsctables.instrument_set_from_ifos(i[0]))) if instruments not in instruments_in_this_file: connection.close() dbtables.discard_connection_filename(f, working_filename, verbose = verbose) dbtables.DBTable_set_connection(None) continue # WORK OUT CORRECT SEGMENTS FOR THIS FILE WHERE WE SHOULD SEE INJECTIONS segments = self.get_segments(connection, xmldoc) segments -= self.veto_segments #print thincasegments zero_lag_segments = segments.intersection(instruments) - segments.union(set(segments.keys()) - instruments) ############### # DEFINE THE INJECTION WAS MADE FUNCTION def injection_was_made(geocent_end_time, geocent_end_time_ns, zero_lag_segments = zero_lag_segments): """ return True if injection was made in the given segmentlist """ return lsctables.LIGOTimeGPS(geocent_end_time, geocent_end_time_ns) in zero_lag_segments connection.create_function("injection_was_made", 2, injection_was_made) make_sim_inspiral = lsctables.SimInspiralTable.get_table(dbtables.get_xml(connection)).row_from_cols # INSPIRAL if self.coinc_inspiral_table: for values in connection.cursor().execute(""" SELECT sim_inspiral.*, -- true if injection matched a coinc below the false alarm rate threshold EXISTS ( SELECT * FROM coinc_event_map AS mapa JOIN coinc_event_map AS mapb ON ( mapa.coinc_event_id == mapb.coinc_event_id ) JOIN coinc_inspiral ON ( mapb.table_name == "coinc_event" AND mapb.event_id == coinc_inspiral.coinc_event_id ) WHERE mapa.table_name == "sim_inspiral" AND mapa.event_id == sim_inspiral.simulation_id AND coinc_inspiral.combined_far < ? ) FROM sim_inspiral WHERE -- only interested in injections that were injected injection_was_made(sim_inspiral.geocent_end_time, sim_inspiral.geocent_end_time_ns) """, (FAR,)): sim = make_sim_inspiral(values) if values[-1]: found.append(sim) else: missed.append(sim) # BURSTS if self.multi_burst_table: for values in connection.cursor().execute(""" SELECT sim_inspiral.*, -- true if injection matched a coinc below the false alarm rate threshold EXISTS ( SELECT * FROM coinc_event_map AS mapa JOIN coinc_event_map AS mapb ON ( mapa.coinc_event_id == mapb.coinc_event_id ) JOIN multi_burst ON ( mapb.table_name == "coinc_event" AND mapb.event_id == multi_burst.coinc_event_id ) WHERE mapa.table_name == "sim_inspiral" AND mapa.event_id == sim_inspiral.simulation_id AND multi_burst.false_alarm_rate < ? ) FROM sim_inspiral WHERE -- only interested in injections that were injected injection_was_made(sim_inspiral.geocent_end_time, sim_inspiral.geocent_end_time_ns) """, (FAR,)): sim = make_sim_inspiral(values) if values[-1]: found.append(sim) else: missed.append(sim) # done dbtables.discard_connection_filename(f, working_filename, verbose = verbose) dbtables.DBTable_set_connection(None) print >>sys.stderr, "\nFound = %d Missed = %d" % (len(found), len(missed)) return found, missed