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