From c22163ef08c222624746dcd800fdfd1c8d6d6360 Mon Sep 17 00:00:00 2001
From: Patrick Godwin <patrick.godwin@ligo.org>
Date: Tue, 20 Feb 2018 13:21:57 -0800
Subject: [PATCH] gstlal_etg: added filtering of trigger production to only
 include times within frame segments

---
 gstlal-ugly/bin/gstlal_etg | 62 +++++++++++++++++++++++---------------
 1 file changed, 37 insertions(+), 25 deletions(-)

diff --git a/gstlal-ugly/bin/gstlal_etg b/gstlal-ugly/bin/gstlal_etg
index de5de63f93..9bae09d117 100755
--- a/gstlal-ugly/bin/gstlal_etg
+++ b/gstlal-ugly/bin/gstlal_etg
@@ -37,14 +37,23 @@ import threading
 import shutil
 import traceback
 
+import numpy
+
 import gi
 gi.require_version('Gst', '1.0')
 from gi.repository import GObject, Gst
 GObject.threads_init()
 Gst.init(None)
+
 import lal
+from lal import LIGOTimeGPS
 
-import numpy
+from glue import iterutils
+from glue import segments
+from glue.ligolw import ligolw
+from glue.ligolw import utils as ligolw_utils
+from glue.ligolw.utils import process as ligolw_process
+from glue.ligolw.utils import segments as ligolw_segments
 
 from gstlal import pipeio
 from gstlal import datasource
@@ -57,10 +66,6 @@ from gstlal import aggregator
 from gstlal import idq_aggregator
 from gstlal import httpinterface
 from gstlal import bottle
-from glue import iterutils
-from glue.ligolw import ligolw
-from glue.ligolw import utils as ligolw_utils
-from glue.ligolw.utils import process as ligolw_process
 
 #
 # Make sure we have sufficient resources
@@ -183,6 +188,7 @@ class MultiChannelHandler(simplehandler.Handler):
 		self.out_path = kwargs.pop("out_path")
 		self.instrument = kwargs.pop("instrument")
 		self.keys = kwargs.pop("keys")
+		self.frame_segments = kwargs.pop("frame_segments")
 
 		# set initialization time
 		if options.data_source in ("framexmit", "lvshm"):
@@ -354,27 +360,33 @@ class MultiChannelHandler(simplehandler.Handler):
 		Given a channel, rate, and the current buffer
 		time, will process a row from a gstreamer buffer.
 		"""
-		trigger_time = row.end_time + row.end_time_ns * 1e-9
-		if options.latency:
-			latency = numpy.round(int(aggregator.now()) - buftime)
-		freq, q, duration = self.basis_params[(channel, rate)][row.channel_index]
-		start_time = trigger_time - duration
-		channel_tag = ('%s_%i_%i' %(channel, rate/4, rate/2)).replace(":","_",1)
-		# NOTE
-		# Setting stop time to trigger time for use with half sine gaussians
-		stop_time = trigger_time
-		# append row to feature vector for bottle requests
-		etg_row = {'timestamp': buftime, 'channel': channel, 'rate': rate, 'start_time': start_time, 'stop_time': stop_time, 'trigger_time': trigger_time,
-                           'frequency': freq, 'q': q, 'phase': row.phase, 'sigmasq': row.sigmasq, 'chisq': row.chisq, 'snr': row.snr}
-		self.etg_event.append(etg_row)
-		# save iDQ compatible data
-		if options.save_hdf:
-			self.fdata.append(etg_row, key = (channel, rate), buftime = buftime)
-		else:
+		# if segments provided, ensure that trigger falls within these segments
+		if self.frame_segments:
+			trigger_seg = segments.segment(LIGOTimeGPS(row.end_time, row.end_time_ns), LIGOTimeGPS(row.end_time, row.end_time_ns))
+
+		if not self.frame_segments or self.frame_segments.intersects_segment(trigger_seg):
+			trigger_time = row.end_time + row.end_time_ns * 1e-9
 			if options.latency:
-				self.fdata.append("%20.9f\t%20.9f\t%20.9f\t%10.3f\t%8.3f\t%8.3f\t%8.3f\t%10.3f\t%s\t%.2f\n" % (start_time, stop_time, trigger_time, freq, row.phase, q, row.chisq, row.snr, channel_tag, latency))
+				latency = numpy.round(int(aggregator.now()) - buftime)
+			freq, q, duration = self.basis_params[(channel, rate)][row.channel_index]
+			start_time = trigger_time - duration
+			channel_tag = ('%s_%i_%i' %(channel, rate/4, rate/2)).replace(":","_",1)
+			# NOTE
+			# Setting stop time to trigger time for use with half sine gaussians
+			stop_time = trigger_time
+			# append row to feature vector for bottle requests
+			etg_row = {'timestamp': buftime, 'channel': channel, 'rate': rate, 'start_time': start_time, 'stop_time': stop_time, 'trigger_time': trigger_time,
+        	                   'frequency': freq, 'q': q, 'phase': row.phase, 'sigmasq': row.sigmasq, 'chisq': row.chisq, 'snr': row.snr}
+			self.etg_event.append(etg_row)
+
+			# save iDQ compatible data
+			if options.save_hdf:
+				self.fdata.append(etg_row, key = (channel, rate), buftime = buftime)
 			else:
-				self.fdata.append("%20.9f\t%20.9f\t%20.9f\t%10.3f\t%8.3f\t%8.3f\t%8.3f\t%10.3f\t%s\n" % (start_time, stop_time, trigger_time, freq, row.phase, q, row.chisq, row.snr, channel_tag))
+				if options.latency:
+					self.fdata.append("%20.9f\t%20.9f\t%20.9f\t%10.3f\t%8.3f\t%8.3f\t%8.3f\t%10.3f\t%s\t%.2f\n" % (start_time, stop_time, trigger_time, freq, row.phase, q, row.chisq, row.snr, channel_tag, latency))
+				else:
+					self.fdata.append("%20.9f\t%20.9f\t%20.9f\t%10.3f\t%8.3f\t%8.3f\t%8.3f\t%10.3f\t%s\n" % (start_time, stop_time, trigger_time, freq, row.phase, q, row.chisq, row.snr, channel_tag))
 
 
 	def to_trigger_file(self, buftime = None):
@@ -721,7 +733,7 @@ for channel in channels:
 if options.verbose:
 	print >>sys.stderr, "attaching appsinks to pipeline..."
 
-handler = MultiChannelHandler(mainloop, pipeline, basis_params = basis_params, description = options.description, out_path = options.out_path, instrument = instrument, keys = src.keys())
+handler = MultiChannelHandler(mainloop, pipeline, basis_params = basis_params, description = options.description, out_path = options.out_path, instrument = instrument, keys = src.keys(), frame_segments = data_source_info.frame_segments)
 appsync = LinkedAppSync(appsink_new_buffer = handler.bufhandler)
 appsinks = set(appsync.add_sink(pipeline, src[(channel, rate)], name = "sink_%s_%s" % (rate, channel)) for (channel, rate) in src.keys()) 
   
-- 
GitLab