From a5f9f2d569e3463ff049109cc183a047ec69c490 Mon Sep 17 00:00:00 2001
From: Chad Hanna <chad.hanna@comp-hd-002.gwave.ics.psu.edu>
Date: Wed, 29 May 2019 19:59:25 -0400
Subject: [PATCH] add metric overlap code

---
 gstlal-ugly/bin/Makefile.am                   |  3 ++
 .../bin/gstlal_inspiral_add_metric_overlaps   | 21 ++++++++
 .../bin/gstlal_inspiral_metric_overlap        | 52 +++++++++++++++++++
 .../bin/gstlal_inspiral_metric_overlap_dag    | 44 ++++++++++++++++
 4 files changed, 120 insertions(+)
 create mode 100755 gstlal-ugly/bin/gstlal_inspiral_add_metric_overlaps
 create mode 100755 gstlal-ugly/bin/gstlal_inspiral_metric_overlap
 create mode 100755 gstlal-ugly/bin/gstlal_inspiral_metric_overlap_dag

diff --git a/gstlal-ugly/bin/Makefile.am b/gstlal-ugly/bin/Makefile.am
index 27d32d0889..eeea5cffeb 100644
--- a/gstlal-ugly/bin/Makefile.am
+++ b/gstlal-ugly/bin/Makefile.am
@@ -11,8 +11,11 @@ dist_bin_SCRIPTS = \
 	gstlal_harmonic_mean_psd \
 	gstlal_mock_data_server \
 	gstlal_ilwdify \
+	gstlal_inspiral_add_metric_overlaps \
 	gstlal_inspiral_best_coinc_file \
 	gstlal_inspiral_check_livetimes \
+	gstlal_inspiral_metric_overlap \
+	gstlal_inspiral_metric_overlap_dag \
 	gstlal_inspiral_treebank \
 	gstlal_inspiral_treebank_dag \
 	gstlal_inspiral_bankviz \
diff --git a/gstlal-ugly/bin/gstlal_inspiral_add_metric_overlaps b/gstlal-ugly/bin/gstlal_inspiral_add_metric_overlaps
new file mode 100755
index 0000000000..bfb88fe396
--- /dev/null
+++ b/gstlal-ugly/bin/gstlal_inspiral_add_metric_overlaps
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+import sys
+import numpy
+import argparse
+import h5py
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--out-h5-file", required = True, help = "provide the output hdf5 file name")
+parser.add_argument("infile", nargs="+", help = "provide the output hdf5 file name")
+
+args = parser.parse_args()
+
+output = []
+for f in args.infile:
+	h5f = h5py.File(f, 'r')
+	output += list(numpy.array(h5f["overlaps"])) 
+output = numpy.array(output)
+h5f = h5py.File(args.out_h5_file, 'w')
+h5f.create_dataset('overlaps', data = output)
+h5f.close()
diff --git a/gstlal-ugly/bin/gstlal_inspiral_metric_overlap b/gstlal-ugly/bin/gstlal_inspiral_metric_overlap
new file mode 100755
index 0000000000..14a590ca8a
--- /dev/null
+++ b/gstlal-ugly/bin/gstlal_inspiral_metric_overlap
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+import sys
+from gstlal import metric as metric_module
+from ligo.lw import ligolw
+from ligo.lw import utils as ligolw_utils
+from ligo.lw import lsctables
+import numpy
+import argparse
+import h5py
+
+class LIGOLWContentHandler(ligolw.LIGOLWContentHandler):
+	pass
+lsctables.use_in(LIGOLWContentHandler)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--psd-xml-file", help = "provide a psd xml file")
+parser.add_argument("--bank-file", help = "provide the bank file for which overlaps will be calculated")
+parser.add_argument("--out-h5-file", required = True, help = "provide the output hdf5 file name")
+parser.add_argument("--start-row", type=int, help = "The starting row to calculate overlaps")
+parser.add_argument("--num-rows", type=int, help = "The number of rows to calculate overlaps")
+
+args = parser.parse_args()
+
+g_ij = metric_module.Metric(
+        args.psd_xml_file,
+        coord_func = metric_module.m1_m2_s1z_s2z_func,
+        duration = 1.0, # FIXME!!!!!
+        flow = 10,
+        fhigh = 1024,
+        approximant = "IMRPhenomD"
+)
+
+xmldoc = ligolw_utils.load_filename(args.bank_file, verbose = True, contenthandler = LIGOLWContentHandler)
+sngl_inspiral_table = lsctables.SnglInspiralTable.get_table(xmldoc)
+
+vec1s = numpy.array([[row.template_id, row.mass1, row.mass2, row.spin1z, row.spin2z] for row in sngl_inspiral_table[args.start_row:args.start_row+args.num_rows]])
+vec2s = numpy.array([[row.template_id, row.mass1, row.mass2, row.spin1z, row.spin2z] for row in sngl_inspiral_table])
+
+output = []
+
+for n, vec1 in enumerate(vec1s):
+	g, det = g_ij(vec1[1:])
+	def match(vec2, vec1 = vec1, g = g):
+		return (vec1[0], vec2[0], g_ij.metric_match(g, vec1[1:], vec2[1:]))
+	thisoutput = [row for row in map(match, vec2s)	if row[2] > 0.9]
+	print n, len(thisoutput)
+	output += thisoutput
+
+output = numpy.array(output)
+h5f = h5py.File(args.out_h5_file, 'w')
+h5f.create_dataset('overlaps', data = output)
+h5f.close()
diff --git a/gstlal-ugly/bin/gstlal_inspiral_metric_overlap_dag b/gstlal-ugly/bin/gstlal_inspiral_metric_overlap_dag
new file mode 100755
index 0000000000..71c5252115
--- /dev/null
+++ b/gstlal-ugly/bin/gstlal_inspiral_metric_overlap_dag
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+import sys
+from ligo.lw import ligolw
+from ligo.lw import utils as ligolw_utils
+from ligo.lw import lsctables
+import numpy
+import argparse
+import h5py
+from gstlal import pipeline
+from gstlal import dagparts
+
+class LIGOLWContentHandler(ligolw.LIGOLWContentHandler):
+	pass
+lsctables.use_in(LIGOLWContentHandler)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--psd-xml-file", help = "provide a psd xml file")
+parser.add_argument("--bank-file", help = "provide the bank file for which overlaps will be calculated")
+args = parser.parse_args()
+
+xmldoc = ligolw_utils.load_filename(args.bank_file, verbose = True, contenthandler = LIGOLWContentHandler)
+sngl_inspiral_table = lsctables.SnglInspiralTable.get_table(xmldoc)
+
+try:
+	os.mkdir("logs")
+except:
+	pass
+dag = dagparts.DAG("metric_overlap")
+
+overlapJob = dagparts.DAGJob("gstlal_inspiral_metric_overlap", condor_commands = {"want_graceful_removal":"True", "kill_sig":"15", "accounting_group":"ligo.prod.o3.cbc.uber.gstlaloffline"})
+addJob = dagparts.DAGJob("gstlal_inspiral_add_metric_overlaps", condor_commands = {"want_graceful_removal":"True", "kill_sig":"15", "accounting_group":"ligo.prod.o3.cbc.uber.gstlaloffline"})
+
+num = 1000
+overlapnodes = []
+# FIXME dont hardcode 3345408, it comes from number of tiles in TimePhaseSNR
+for start in range(0, len(sngl_inspiral_table), num):
+        stop = start + num
+        overlapnodes.append(dagparts.DAGNode(overlapJob, dag, parent_nodes = [], opts = {"start-row":str(start), "num-rows":str(num)}, output_files = {"out-h5-file":"%s/metric_overlaps_%d_%d.h5" % (overlapJob.output_path, start, num)}, input_files = {"psd-xml-file": args.psd_xml_file, "bank-file": args.bank_file}))
+
+addnode = dagparts.DAGNode(addJob, dag, parent_nodes = overlapnodes, input_files = {"": [n.output_files["out-h5-file"] for n in overlapnodes]})
+
+dag.write_sub_files()
+dag.write_dag()
+dag.write_script()
-- 
GitLab