From aecc99a2957cbfed4300b8045d4d5102011b0527 Mon Sep 17 00:00:00 2001
From: ChiWai Chan <chiwai.chan@ligo.org>
Date: Thu, 5 Sep 2019 00:38:39 -0700
Subject: [PATCH] gstlal_inspirla_calc_snr: add --coinc option which is used to
 find --sub-bank-id and --row-number svd_bank_snr.py: split up the function
 svd_banks_from_event

---
 gstlal-inspiral/bin/gstlal_inspiral_calc_snr | 26 +++++++++-------
 gstlal-inspiral/python/svd_bank_snr.py       | 31 ++++++++++++--------
 2 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/gstlal-inspiral/bin/gstlal_inspiral_calc_snr b/gstlal-inspiral/bin/gstlal_inspiral_calc_snr
index 56b10bc64c..d32c78ba55 100755
--- a/gstlal-inspiral/bin/gstlal_inspiral_calc_snr
+++ b/gstlal-inspiral/bin/gstlal_inspiral_calc_snr
@@ -174,6 +174,7 @@ def parse_command_line():
 
 	group = OptionGroup(parser, "Template Options", "Choose a template from a SVD bank file / a single SnglInspiral Table")
 	group.add_option("--svd-bank", metavar = "filename", help = "A LIGO light-weight xml / xml.gz file containing svd bank information. These can be given as a comma separated list such as H1:file1,H2:file2,L1:file3 to analyze multiple instruments (require)." )
+	group.add_option("--coinc", metavar = "filename", help = "The coinc.xml file associated with --svd-bank. This is used to find the --sub-bank-id and --row-number for a particular event. If given, the --sub-bank-id and --row-number will be overwritten. (optional)")
 	group.add_option("--sub-bank-id", type = "int", help = "Bank id is of the form <int>ID_<int>N where N is the sub bank id. (require).")
 	group.add_option("--row-number", type = "int", help = "The row number of the template (optional). All the SNRs will be outputed if it is not given.")
 	group.add_option("--table", metavar = "filename", help = "A LIGO light-weight xml.gz file containing SnglInspiral Table. Expecting one template only.")
@@ -288,28 +289,33 @@ def parse_command_line():
 		# Checking required options
 		if options.svd_bank is None:
 			missing_required_options.append("--svd-bank")
-		if options.sub_bank_id is None:
+		if options.sub_bank_id is None and options.coinc is None:
 			missing_required_options.append("--sub-bank-id")
 		# Raise VauleError is required option(s) is/are missing
 		if missing_required_options:
 			raise ValueError("Missing required option(s) %s" % ", ".join(sorted(missing_required_options)))
 
 		# Setting up SVD bank
-		svdbanks_dict = inspiral.parse_svdbank_string(options.svd_bank)
+		bank_urls = inspiral.parse_svdbank_string(options.svd_bank)
 		# Check if --svd-bank contains svd banks from --instrument
                 for instrument in options.instrument:
-                        if instrument not in set(svdbanks_dict):
+                        if instrument not in set(bank_urls):
                                 raise ValueError("No SVD Banks for --instrument=%s." % instrument)
 
-		banks = dict([(ifo, svd_bank.read_banks(svdbanks, svd_bank.DefaultContentHandler)) for ifo, svdbanks in svdbanks_dict.items()])
+		banks_dict = dict([(ifo, svd_bank.read_banks(svdbanks, svd_bank.DefaultContentHandler)) for ifo, svdbanks in bank_urls.items()])
+
+		# Scan for the --sub-bank-id and --row-number if --coinc is given
+		if options.coinc is not None:
+			coinc_xmldoc = ligolw_utils.load_url(options.coinc, verbose = options.verbose, contenthandler = ContentHandler)
+			options.sub_bank_id, options.row_number = svd_bank_snr.scan_svd_banks_for_row(coinc_xmldoc, banks_dict)
 		# Check if --sub-bank-id and --row-number is valid
-		for bank in banks.values():
-			if not (0 <= options.sub_bank_id < len(bank)) :
-				raise ValueError("Invaild --sub-bank-id %d. Possible id [0-%d)\n" % (options.sub_bank_id, len(bank)))
-			if options.row_number is not None and not (0 <= options.row_number < len(bank[options.sub_bank_id].sngl_inspiral_table)):
-				raise ValueError("No such template: Invaild --row-number %d. Possible range [0-%d)\n" % (options.row_number, len(bank[options.sub_bank_id].sngl_inspiral_table)))
+		for banks in banks_dict.values():
+			if not (0 <= options.sub_bank_id < len(banks)) :
+				raise ValueError("Invaild --sub-bank-id %d. Possible id [0-%d)\n" % (options.sub_bank_id, len(banks)))
+			if options.row_number is not None and not (0 <= options.row_number < len(banks[options.sub_bank_id].sngl_inspiral_table)):
+				raise ValueError("No such template: Invaild --row-number %d. Possible range [0-%d)\n" % (options.row_number, len(banks[options.sub_bank_id].sngl_inspiral_table)))
 
-		return options, gw_data_source_info, banks, psd
+		return options, gw_data_source_info, banks_dict, psd
 
 	# Use Finite Impulse Response
 	elif options.mode == 1:
diff --git a/gstlal-inspiral/python/svd_bank_snr.py b/gstlal-inspiral/python/svd_bank_snr.py
index 40792bea46..cd66b79d58 100644
--- a/gstlal-inspiral/python/svd_bank_snr.py
+++ b/gstlal-inspiral/python/svd_bank_snr.py
@@ -389,13 +389,28 @@ def read_url(filename, contenthandler = SNRContentHandler, verbose = False):
 #
 #=============================================================================================
 
-def svd_banks_from_event(gid, outdir = ".", save = True, verbose = False):
-	gracedb_client = gracedb.GraceDb()
-	coinc_xmldoc = lvalert_helper.get_coinc_xmldoc(gracedb_client, gid)
+def scan_svd_banks_for_row(coinc_xmldoc, banks_dict):
 	eventid_trigger_dict = dict((row.event_id, row) for row in lsctables.SnglInspiralTable.get_table(coinc_xmldoc))
 
 	assert len(set([row.template_id for row in eventid_trigger_dict.values()])) == 1, "Templates should have the same template_id."
 
+	sub_bank_id = None
+	row_number = None
+        for i, bank in enumerate(banks_dict.values()[0]):
+                for j, row in enumerate(bank.sngl_inspiral_table):
+                        if row.template_id == eventid_trigger_dict.values()[0].template_id:
+                                sub_bank_id = i
+                                row_number = j
+                                break
+                if sub_bank_id is not None:
+                        break
+	assert sub_bank_id is not None, "Cannot find the template listed in the coinc.xml."
+	return sub_bank_id, row_number
+
+def svd_banks_from_event(gid, outdir = ".", save = True, verbose = False):
+	gracedb_client = gracedb.GraceDb()
+	coinc_xmldoc = lvalert_helper.get_coinc_xmldoc(gracedb_client, gid)
+
 	try:
 		path = [row.value for row in lsctables.ProcessParamsTable.get_table(coinc_xmldoc) if row.param == "--gracedb-service-url"]
 		bank_urls = inspiral.parse_svdbank_string([row.value for row in lsctables.ProcessParamsTable.get_table(coinc_xmldoc) if row.param == "--svd-bank"].pop())
@@ -421,15 +436,7 @@ def svd_banks_from_event(gid, outdir = ".", save = True, verbose = False):
 
 	# Just get one of the template bank from any instrument,
 	# the templates should all have the same template_id because they are exact-matched.
-	sub_bank_id = None
-        for i, bank in enumerate(banks_dict.values()[0]):
-                for j, row in enumerate(bank.sngl_inspiral_table):
-                        if row.template_id == eventid_trigger_dict.values()[0].template_id:
-                                sub_bank_id = i
-                                row_number = j
-                                break
-                if sub_bank_id is not None:
-                        break
+	sub_bank_id, row_number = scan_svd_banks_for_row(coinc_xmldoc, banks_dict)
 
 	return banks_dict, sub_bank_id, row_number
 
-- 
GitLab