From be5806f5ad708437ba3d159d88bef809d8ebb8d2 Mon Sep 17 00:00:00 2001
From: Sudarshan Ghonge <sudarshan.ghonge@ligo.org>
Date: Tue, 10 Nov 2020 22:01:47 -0800
Subject: [PATCH] Add glitch cleaning functionality for multiple detectors

---
 .../bayeswave_pipe/bayeswave_pipe_utils.py    | 25 ++++----
 BayesWaveUtils/scripts/bayeswave_pipe         | 57 +++++++++++--------
 2 files changed, 44 insertions(+), 38 deletions(-)

diff --git a/BayesWaveUtils/bayeswave_pipe/bayeswave_pipe_utils.py b/BayesWaveUtils/bayeswave_pipe/bayeswave_pipe_utils.py
index 61059345..1f8ffffe 100644
--- a/BayesWaveUtils/bayeswave_pipe/bayeswave_pipe_utils.py
+++ b/BayesWaveUtils/bayeswave_pipe/bayeswave_pipe_utils.py
@@ -1641,20 +1641,8 @@ class bayeswave_clean_frameJob(pipeline.CondorDAGJob, pipeline.AnalysisJob):
             self.add_condor_cmd('transfer_input_files', transferstring)
             self.add_condor_cmd('transfer_output_files', '$(macrooutputDir)')
 
-
-        ifo_clean = ast.literal_eval(cp.get('bayeswave_clean_frame_options', 'ifo'))
-        self.add_opt('ifo', ifo_clean)
-   
-        channel_list = ast.literal_eval(cp.get('datafind', 'channel-list'))
-        frame_list = ast.literal_eval(cp.get('datafind', 'frtype-list'))
-
-        self.add_opt('channel', channel_list[ifo_clean])
-        self.add_opt('frame-type', frame_list[ifo_clean])
-         
-        
-        for item in cp.items('bayeswave_clean_frame_options'):
-            # Add any option and value which exists
-            self.add_opt(item[0], item[1])
+        clean_suffix = cp.get('bayeswave_clean_frame_options', 'clean-suffix')
+        self.add_opt('clean-suffix', clean_suffix)
 
 class bayeswave_clean_frameNode(pipeline.CondorDAGNode, pipeline.AnalysisNode):
 
@@ -1691,6 +1679,15 @@ class bayeswave_clean_frameNode(pipeline.CondorDAGNode, pipeline.AnalysisNode):
     
     def set_outdir(self, outdir):
         self.add_var_opt('outdir', outdir)
+    
+    def set_ifo(self, ifo):
+        self.add_var_opt('ifo', ifo)
+   
+    def set_channel_name(self, channel):
+        self.add_var_opt('channel', channel)
+
+    def set_frame_type(self, frame_type):
+        self.add_var_opt('frame-type', frame_type)
   
 
 
diff --git a/BayesWaveUtils/scripts/bayeswave_pipe b/BayesWaveUtils/scripts/bayeswave_pipe
index c44f1a43..aa6407a2 100755
--- a/BayesWaveUtils/scripts/bayeswave_pipe
+++ b/BayesWaveUtils/scripts/bayeswave_pipe
@@ -41,6 +41,7 @@ from glue import pipeline
 
 from lalapps import inspiralutils
 from ligo import segments
+import lalframe.frread as fr
 
 from bayeswave_pipe import bayeswave_pipe_utils as pipe_utils
 
@@ -271,10 +272,12 @@ if cp.has_option('bayeswave_fpeak_options', 'fpeak-analysis'):
     if cp.has_option('bayeswave_fpeak_options','fpeak-flow'):
         fpeak_flow=cp.getfloat('bayeswave_fpeak_options','fpeak-flow')
 
-if cp.has_option('bayeswave_clean_frame_options', 'ifo'):
+if cp.has_option('bayeswave_clean_frame_options', 'ifos'):
     opts.bayeswave_clean_frame=True
 
-    clean_frame_ifo=cp.get('bayeswave_clean_frame_options', 'ifo')
+    clean_frame_ifos=ast.literal_eval(cp.get('bayeswave_clean_frame_options', 'ifos'))
+    clean_frame_srates = {}
+    channel_names = ast.literal_eval(cp.get('datafind','channel-list')) 
    
 
 if opts.bayeswave_clean_frame:
@@ -715,18 +718,14 @@ for ifo in ifo_list:
             os.chdir(curdiir)
         
         # Get the sampling rate of the frame
-        if opts.bayeswave_clean_frame:
+        if opts.bayeswave_clean_frame and ifo in clean_frame_ifos:
             try:
-                import lalframe.frread as fr
-                clean_ifo = ast.literal_eval(cp.get('bayeswave_clean_frame_options', 'ifo'))
                 trigtime = int(trigger_list.triggers[0].trigger_time)
-                channel_names = ast.literal_eval(cp.get('datafind','channel-list'))
-                example_ts = fr.read_timeseries(cache_files[clean_ifo], channel_names[clean_ifo], trigtime-1,2.0 )
-                clean_frame_srate = 1./example_ts.deltaT
-                print("Getting sampling rate of cleaned frame from input frame: %.2f Hz"%(clean_frame_srate))
+                example_ts = fr.read_timeseries(cache_files[ifo], channel_names[ifo], trigtime-1,2.0 )
+                clean_frame_srates[ifo] = 1./example_ts.deltaT
             except Exception as e:
-                clean_frame_srate = 16384.0
-                print("Setting clean frame srate to default: %.2f"%(clean_frame_srate))
+                clean_frame_srates[ifo] = 16384.0
+                print("Setting %s clean frame srate to default: %.2f"%(ifo, 16384.0))
             
         
 
@@ -1190,21 +1189,29 @@ for t,trigger in enumerate(trigger_list.triggers):
             clean_frame_outdir = os.path.join(outputDir, 'clean_frame')
             if not os.path.exists(clean_frame_outdir): 
                 os.makedirs(clean_frame_outdir)
-            bayeswave_clean_frame_node =  pipe_utils.bayeswave_clean_frameNode(bayeswave_clean_frame_job)
-            bayeswave_clean_frame_node.set_trigtime(trigger.trigger_time)
-            clean_frame_duration = 4.0*trigger.seglen
-            bayeswave_clean_frame_node.set_frame_start(int(trigger.trigger_time - clean_frame_duration/2.0))
-            bayeswave_clean_frame_node.set_frame_srate(clean_frame_srate)
-            bayeswave_clean_frame_node.set_seglen(trigger.seglen)
-            
+            bayeswave_clean_frame_nodes = []
             if cp.has_option('bayeswave_options', 'fullOnly'):
                 model_type = 'full'
             else:
                 model_type = 'glitch'
-            clean_ifo = ast.literal_eval(cp.get('bayeswave_clean_frame_options', 'ifo'))
-            glitch_param_file = os.path.join(outputDir, 'chains', '%s_params_%s.dat'%(model_type, clean_ifo))
-            bayeswave_clean_frame_node.set_glitch_param_file(glitch_param_file)
-            bayeswave_clean_frame_node.set_outdir(clean_frame_outdir)
+            clean_frame_ifos = ast.literal_eval(cp.get('bayeswave_clean_frame_options', 'ifos'))
+            for  ifo in clean_frame_ifos:
+                clean_frame_node =  pipe_utils.bayeswave_clean_frameNode(bayeswave_clean_frame_job)
+                clean_frame_node.set_trigtime(trigger.trigger_time)
+                clean_frame_node.set_ifo(ifo)
+                clean_frame_duration = 4.0*trigger.seglen
+                clean_frame_node.set_frame_start(int(trigger.trigger_time - clean_frame_duration/2.0))
+                clean_frame_node.set_frame_srate(clean_frame_srates[ifo])
+                clean_frame_node.set_seglen(trigger.seglen)            
+            
+                glitch_param_file = os.path.join(outputDir, 'chains', '%s_params_%s.dat'%(model_type, ifo))
+                clean_frame_node.set_glitch_param_file(glitch_param_file)
+                clean_frame_node.set_outdir(clean_frame_outdir)
+
+                clean_frame_node.set_channel_name(channel_names[ifo])
+                clean_frame_node.set_frame_type(frtype_list[ifo])
+                
+                bayeswave_clean_frame_nodes.append(clean_frame_node)
             
         
 
@@ -1250,7 +1257,8 @@ for t,trigger in enumerate(trigger_list.triggers):
             if opts.fpeak_analysis:
                 bayeswave_fpeak_node.add_parent(bayeswave_node)
             if opts.bayeswave_clean_frame:
-                bayeswave_clean_frame_node.add_parent(bayeswave_node)
+                for clean_frame_node in bayeswave_clean_frame_nodes:
+                    clean_frame_node.add_parent(bayeswave_node)
         if not opts.skip_megapy:
             megasky_node.add_parent(bayeswave_node)
             megaplot_node.add_parent(bayeswave_post_node) 
@@ -1265,7 +1273,8 @@ for t,trigger in enumerate(trigger_list.triggers):
 
         dag.add_node(bayeswave_node)
         if opts.bayeswave_clean_frame:
-            dag.add_node(bayeswave_clean_frame_node)
+            for clean_frame_node in bayeswave_clean_frame_nodes:
+                dag.add_node(clean_frame_node)
 
         if not opts.skip_post and not opts.separate_post_dag:
             dag.add_node(bayeswave_post_node)
-- 
GitLab