diff --git a/src/bin/gstlal_inspiral b/src/bin/gstlal_inspiral index 5aa18a91fbf6ce056af789c99c08457fdf10c84d..1bec5defdbcb8617dee4d6e5c0708aa6087edcca 100755 --- a/src/bin/gstlal_inspiral +++ b/src/bin/gstlal_inspiral @@ -872,30 +872,61 @@ for n, filename in enumerate(options.template_bank): # by trigger generator element. banks[n].set_template_bank_filename(filename) - -# -# build output document -# - - -if options.injections is not None: - xmldoc = utils.load_filename(options.injections, gz = (options.injections or "stdin").endswith(".gz"), verbose = options.verbose) -else: - xmldoc = ligolw.Document() - xmldoc.appendChild(ligolw.LIGO_LW()) -process = ligolw_process.append_process(xmldoc, program = "gstlal_inspiral", comment = options.comment, ifos = set(detectors)) -ligolw_process.append_process_params(xmldoc, process, process_params) -search_summary = add_cbc_metadata(xmldoc, process, options.seg) -try: - sngl_inspiral_table = lsctables.table.get_table(xmldoc, lsctables.SnglInspiralTable.tableName) -except ValueError: - # FIXME: argh, ugly - sngl_inspiral_table = xmldoc.childNodes[-1].appendChild(lsctables.New(lsctables.SnglInspiralTable, columns = ("process_id", "ifo", "search", "channel", "end_time", "end_time_ns", "end_time_gmst", "impulse_time", "impulse_time_ns", "template_duration", "event_duration", "amplitude", "eff_distance", "coa_phase", "mass1", "mass2", "mchirp", "mtotal", "eta", "kappa", "chi", "tau0", "tau2", "tau3", "tau4", "tau5", "ttotal", "psi0", "psi3", "alpha", "alpha1", "alpha2", "alpha3", "alpha4", "alpha5", "alpha6", "beta", "f_final", "snr", "chisq", "chisq_dof", "bank_chisq", "bank_chisq_dof", "cont_chisq", "cont_chisq_dof", "sigmasq", "rsqveto_duration", "Gamma0", "Gamma1", "Gamma2", "Gamma3", "Gamma4", "Gamma5", "Gamma6", "Gamma7", "Gamma8", "Gamma9", "event_id"))) - - -sngl_inspiral_table.set_next_id(lsctables.SnglInspiralID(0)) # FIXME: remove when lsctables.py has an ID generator attached to sngl_inspiral table -sngl_inspiral_table.sync_next_id() - +class Data(object): + def __init__(self, options): + self.xmldoc = None + self.output = options.output + self.seg = options.seg + self.injections = options.injections + self.comment = options.comment + self.verbose = options.verbose + self.sngl_inspiral_table = None + self.seg = options.seg + self.injection_file = options.injections + self.output = options.output + self.connection = None + + def prepare_output_file(self): + xmldoc = ligolw.Document() + xmldoc.appendChild(ligolw.LIGO_LW()) + self.process = ligolw_process.append_process(xmldoc, program = "gstlal_inspiral", comment = self.comment, ifos = set(detectors)) + ligolw_process.append_process_params(xmldoc, self.process, process_params) + search_summary = add_cbc_metadata(xmldoc, self.process, self.seg) + # FIXME: argh, ugly + sngl_inspiral_table = xmldoc.childNodes[-1].appendChild(lsctables.New(lsctables.SnglInspiralTable, columns = ("process_id", "ifo", "search", "channel", "end_time", "end_time_ns", "end_time_gmst", "impulse_time", "impulse_time_ns", "template_duration", "event_duration", "amplitude", "eff_distance", "coa_phase", "mass1", "mass2", "mchirp", "mtotal", "eta", "kappa", "chi", "tau0", "tau2", "tau3", "tau4", "tau5", "ttotal", "psi0", "psi3", "alpha", "alpha1", "alpha2", "alpha3", "alpha4", "alpha5", "alpha6", "beta", "f_final", "snr", "chisq", "chisq_dof", "bank_chisq", "bank_chisq_dof", "cont_chisq", "cont_chisq_dof", "sigmasq", "rsqveto_duration", "Gamma0", "Gamma1", "Gamma2", "Gamma3", "Gamma4", "Gamma5", "Gamma6", "Gamma7", "Gamma8", "Gamma9", "event_id"))) + + sngl_inspiral_table.set_next_id(lsctables.SnglInspiralID(0)) # FIXME: remove when lsctables.py has an ID generator attached to sngl_inspiral table + + if self.output.endswith('.sqlite'): + from glue.ligolw.utils import ligolw_sqlite + self.connection = ligolw_sqlite.setup(self.output) + ligolw_sqlite.insert_from_xmldoc(self.connection, xmldoc, preserve_ids = False, verbose = self.verbose) + if self.injection_file is not None: + utils.load_filename(self.injection_file, gz = (injection_file or "stdin").endswith(".gz"), verbose = self.verbose) + from glue.ligolw import dbtables + self.xmldoc = dbtables.get_xml(self.connection) + self.sngl_inspiral_table = lsctables.table.get_table(self.xmldoc, lsctables.SnglInspiralTable.tableName) + else: + from glue.ligolw.utils import ligolw_add + self.xmldoc = xmldoc + self.sngl_inspiral_table = sngl_inspiral_table + if self.injection_file is not None: + ligolw_add.ligolw_add(self.xmldoc, [self.injection_file], verbose = self.verbose) + utils.load_filename(self.injection_file, gz = (injection_file or "stdin").endswith(".gz"), verbose = self.verbose) + + def write_output_file(self): + if self.connection: + from pylal.date import XLALUTCToGPS + import time + self.connection.cursor().execute('UPDATE search_summary SET nevents = (SELECT count(*) FROM sngl_inspiral)') + self.connection.cursor().execute('UPDATE process SET end_time = ?', (XLALUTCToGPS(time.gmtime()).seconds,)) + self.connection.commit() + else: + self.sngl_inspiral_table.sort(lambda a, b: cmp(a.end_time, b.end_time) or cmp(a.end_time_ns, b.end_time_ns) or cmp(a.ifo, b.ifo)) + search_summary = lsctables.table.get_table(self.xmldoc, lsctables.SearchSummaryTable.tableName) + search_summary.nevents = len(self.sngl_inspiral_table) + ligolw_process.set_process_end_time(self.process) + utils.write_filename(self.xmldoc, self.output, gz = (self.output or "stdout").endswith(".gz"), verbose = self.verbose) # # build pipeline @@ -917,11 +948,21 @@ src = mkLLOIDmulti( nxydump_segment = options.nxydump_segment ) -def appsink_new_buffer(elem, sngl_inspiral_table): +# +# build output document +# + +data = Data(options) +data.prepare_output_file() + +def appsink_new_buffer(elem, data): for row in sngl_inspirals_from_buffer(elem.get_property("last-buffer")): - sngl_inspiral_table.append(row) + row.process_id = data.process.process_id + row.event_id = data.sngl_inspiral_table.get_next_id() + data.sngl_inspiral_table.append(row) + if data.connection: data.connection.commit() -pipeparts.mkappsink(pipeline, src, caps = gst.Caps("application/x-lal-snglinspiral")).connect_after("new-buffer", appsink_new_buffer, sngl_inspiral_table) +pipeparts.mkappsink(pipeline, src, caps = gst.Caps("application/x-lal-snglinspiral")).connect_after("new-buffer", appsink_new_buffer, data) if options.write_pipeline is not None: gst.xml_write_file(pipeline, file(options.write_pipeline, "w")) @@ -945,15 +986,7 @@ mainloop.run() # -sngl_inspiral_table.sort(lambda a, b: cmp(a.end_time, b.end_time) or cmp(a.end_time_ns, b.end_time_ns) or cmp(a.ifo, b.ifo)) -for row in sngl_inspiral_table: - row.process_id = process.process_id - row.event_id = sngl_inspiral_table.get_next_id() -search_summary.nevents = len(sngl_inspiral_table) -ligolw_process.set_process_end_time(process) - -utils.write_filename(xmldoc, options.output, gz = (options.output or "stdout").endswith(".gz"), verbose = options.verbose) - +data.write_output_file() # # done