diff --git a/gstlal-inspiral/bin/gstlal_inspiral_calc_snr b/gstlal-inspiral/bin/gstlal_inspiral_calc_snr index 532388248bde239644647b393b62c499186bbeae..485b773171521c00722572159af52d82db75cc25 100755 --- a/gstlal-inspiral/bin/gstlal_inspiral_calc_snr +++ b/gstlal-inspiral/bin/gstlal_inspiral_calc_snr @@ -119,7 +119,6 @@ def parse_command_line(): 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 for each instrument only.") group.add_option("--approximant", metavar = "name", type = "str", help = "Name of the Waveform model (require).") - group.add_option("--template-duration", metavar = "seconds", type = "float", help = "Duration of the template") group.add_option("--sample-rate", metavar = "Hz", default = 2048, type = "int", help = "Sampling rate of the template and SNR for mode 1") group.add_option("--f-low", metavar = "Hz", default = 10, type = "float", help = "The minimum frequency of GW signal") group.add_option("--f-high", metavar = "Hz", type = "float", help = "The maximum frequency of GW signal") @@ -147,18 +146,22 @@ def parse_command_line(): options, args = parser.parse_args() - # Check SNR series output - if options.start is None or options.end is None: - raise ValueError("Must have --start and --end.") - else: - if options.start >= options.end: - raise ValueError("--start must less than --end.") # Setting up GW data gw_data_source_info = datasource.GWDataSourceInfo(options) if options.instrument not in gw_data_source_info.channel_dict.keys(): raise ValueError("No such instrument: %s in GWDataSourceInfo: (%s)"% (options.instrument, ", ".join(gw_data_source_info.channel_dict.keys()))) + # Check SNRs series output + if options.start is None or options.end is None: + raise ValueError("Must have --start and --end.") + elif options.start >= options.end: + raise ValueError("--start must less than --end.") + # Extra handle for SNRs output because SNRs are not stable initially and have padding at the end + # FIXME: the 650s is hardcoded (~BNS waveforms duration) and only used as a lower bound to avoid having a frame file that is too short + if options.start - gw_data_source_info.seg[0] <= 650 or gw_data_source_info.seg[1] - options.end <= 650: + raise ValueError("Check your inputted --start / --end or your frame file. You should have a long enough data such that, the --start/--end is larger/less than the start/end of your data at least 650s. ") + # Setting up PSD if options.reference_psd: psd = lal.series.read_psd_xmldoc(ligolw_utils.load_url(options.reference_psd, contenthandler = lal.series.PSDContentHandler)) diff --git a/gstlal-inspiral/python/svd_bank_snr.py b/gstlal-inspiral/python/svd_bank_snr.py index a506139db212bd0c20d523daf1f8fa31a3e5815a..abeeb9d4f6f83783b63c28a721f042a415407591 100644 --- a/gstlal-inspiral/python/svd_bank_snr.py +++ b/gstlal-inspiral/python/svd_bank_snr.py @@ -55,6 +55,8 @@ class SNR_Pipeline(object): "deltaT": None, "data": [], } + if self.start >= self.end: + raise ValueError("Start time must be less than end time.") def run(self, segments): if self.verbose: @@ -101,27 +103,18 @@ class SNR_Pipeline(object): return tseries def get_snr_series(self, COMPLEX = False): + assert snr_info["epoch"] is not None, "No SNRs are obtained, check your start time." gps_start = self.snr_info["epoch"].gpsSeconds + self.snr_info["epoch"].gpsNanoSeconds * 10.**-9 gps = gps_start + numpy.arange(len(self.snr_info["data"])) * self.snr_info["deltaT"] - if self.start and self.end: - if self.start >= self.end: - raise ValueError("Start time must be less than end time.") - if self.start - gps[0] >= 0 and self.start - gps[-1] <= 0: - s = abs(gps - self.start).argmin() - else: - raise ValueError("Invalid choice of start time %f." % self.start) - - if self.end - gps[0] >= 0 and self.end - gps[-1] <= 0: - e = abs(gps - self.end).argmin() - else: - raise ValueError("Invalid choice of end time %f." % self.end) + if self.start - gps[0] < 0 or self.end - gps[-1] > 0: + raise ValueError("Invalid choice of start time or end time. The data spans from %f to %f." % (gps[0], gps[-1])) + else: + s = abs(gps - self.start).argmin() + e = abs(gps - self.end).argmin() - self.snr_info["epoch"] = gps[s] - self.snr_info["data"] = self.snr_info["data"][s:e].T - else: - self.snr_info["epoch"] = gps[0] - self.snr_info["data"] = self.snr_info["data"].T + self.snr_info["epoch"] = gps[s] + self.snr_info["data"] = self.snr_info["data"][s:e].T if self.row_number is None: temp = [] @@ -185,11 +178,6 @@ class LLOID_SNR(SNR_Pipeline): SNR_Pipeline.__init__(self, row_number, start, end, name = "gstlal_inspiral_lloid_snr", verbose = verbose) self.snr_info["instrument"] = instrument - # sanity check - if psd is not None: - if not (instrument in set(psd)): - raise ValueError("No psd for instrument %s." % instrument) - if self.verbose: sys.stderr.write("Building pipeline to calculate SNR...\n") @@ -241,11 +229,6 @@ class FIR_SNR(SNR_Pipeline): SNR_Pipeline.__init__(self, 0, start, end, name = "gstlal_inspiral_fir_snr", verbose = verbose) self.snr_info["instrument"] = instrument - # sanity check - if psd is not None: - if not (instrument in set(psd)): - raise ValueError("No psd for instrument %s." % instrument) - if self.verbose: sys.stderr.write("Building pipeline to calculate SNR\n")