From 727a03f4ef02d5ff7c9d912df717f2bc28dc7469 Mon Sep 17 00:00:00 2001
From: Wanting Niu <wanting.niu@ligo.org>
Date: Thu, 8 Dec 2022 05:42:47 +0000
Subject: [PATCH 1/5] svd_bank.py: document the template_duration in svd_bank
 to match the actual time of waveform and fix the calculation of spin1 & spin2

---
 gstlal-inspiral/python/svd_bank.py | 22 +++++++---------------
 1 file changed, 7 insertions(+), 15 deletions(-)

diff --git a/gstlal-inspiral/python/svd_bank.py b/gstlal-inspiral/python/svd_bank.py
index d968def644..08a9857f48 100644
--- a/gstlal-inspiral/python/svd_bank.py
+++ b/gstlal-inspiral/python/svd_bank.py
@@ -292,24 +292,15 @@ def cal_higher_f_low(template_bank_url, bank_xmldoc, flow, max_duration):
 	for row in bank_sngl_table:
 		m1_SI = lal.MSUN_SI * row.mass1
 		m2_SI = lal.MSUN_SI * row.mass2
-		spin1 = (row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5
-		spin2 = (row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5
-		f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max((row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, (row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')) 
+		spin1 = numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5
+		spin2 = numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5
+		f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max(spin1, spin2))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')) 
 
 		time_constrained_f_low.append(scipy.optimize.fsolve(time_freq_bound, x0 = flow, args = (max_duration, m1_SI, m2_SI, spin1, spin2, f_max)))
 	f_low = float(max(flow, max(time_constrained_f_low)))
 	if f_high is not None and f_high < f_low:
 		raise ValueError("Lower frequency must be lower than higher frequency cut off! Input max_duration is too short.")
 
-	for row in bank_sngl_table:
-		row.template_duration = chirptime.imr_time(f_low, 
-				lal.MSUN_SI * row.mass1, 
-				lal.MSUN_SI * row.mass2,
-				(row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, 
-				(row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5,
-				f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max((row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, (row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')))
-	# save the overwrite
-	ligolw_utils.write_filename(bank_xmldoc, template_bank_url)
 	return f_low
 
 def build_bank(template_bank_url, psd, flow, max_duration, ortho_gate_fap, snr_threshold, svd_tolerance, clipleft = None, clipright = None, padding = 1.5, identity_transform = False, bank_type = "signal_model",  verbose = False, autocorrelation_length = 201, samples_min = 1024, samples_max_256 = 1024, samples_max_64 = 2048, samples_max = 4096, bank_id = None, contenthandler = None, sample_rate = None, instrument_override = None):
@@ -413,9 +404,10 @@ def write_bank(filename, banks, psd_input, process_param_dict = None, verbose =
 		# set up root for this sub bank
 		root = lw.appendChild(ligolw.LIGO_LW(Attributes({u"Name": u"gstlal_svd_bank_Bank"})))
 
-		# make non-signal model templates have an invalid template id
-		if bank.bank_type != "signal_model":
-			for row in bank.sngl_inspiral_table:
+		for row in bank.sngl_inspiral_table:
+			row.template_duration = [frag.end for frag in bank.bank_fragments][-1]
+			# make non-signal model templates have an invalid template id
+			if bank.bank_type != "signal_model":
 				row.template_id = -row.template_id
 		if verbose:
 			print("computing lambda/eta parameters for templates...")
-- 
GitLab


From c29102cd34ee28090040c1ba41d836aff33e58b1 Mon Sep 17 00:00:00 2001
From: Wanting Niu <wanting.niu@ligo.org>
Date: Thu, 8 Dec 2022 05:44:36 +0000
Subject: [PATCH 2/5] gstlal_inspiral_bank_splitter: fix the calculation of
 spin1 and spin2 using numpy.dot

---
 gstlal-inspiral/bin/gstlal_inspiral_bank_splitter | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter b/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
index 58c11fbbc8..7c9bdad854 100755
--- a/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
+++ b/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
@@ -276,9 +276,9 @@ for outputrows in banks_subbins:
 			row.template_duration = chirptime.imr_time(options.f_low,
 				lal.MSUN_SI * row.mass1,
 				lal.MSUN_SI * row.mass2,
-				(row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5,
-				(row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5,
-				f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max((row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, (row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')))
+				numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5,
+				numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5,
+				f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max(numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')))
 			# template_duration may be overwritten by svd_bank if the flow is increased in order to satisfy the target maximum duration
 		outputrows[ind] = (approximant, rows)
 	num_banks += len(outputrows)
-- 
GitLab


From d9bced776c8e0a209af9a6a25eedf6aeef4594a7 Mon Sep 17 00:00:00 2001
From: Wanting Niu <wanting.niu@ligo.org>
Date: Fri, 9 Dec 2022 04:16:27 +0000
Subject: [PATCH 3/5] better coding

---
 gstlal-inspiral/python/svd_bank.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gstlal-inspiral/python/svd_bank.py b/gstlal-inspiral/python/svd_bank.py
index 08a9857f48..cbb34fb109 100644
--- a/gstlal-inspiral/python/svd_bank.py
+++ b/gstlal-inspiral/python/svd_bank.py
@@ -405,7 +405,7 @@ def write_bank(filename, banks, psd_input, process_param_dict = None, verbose =
 		root = lw.appendChild(ligolw.LIGO_LW(Attributes({u"Name": u"gstlal_svd_bank_Bank"})))
 
 		for row in bank.sngl_inspiral_table:
-			row.template_duration = [frag.end for frag in bank.bank_fragments][-1]
+			row.template_duration = bank.bank_fragments[-1].end
 			# make non-signal model templates have an invalid template id
 			if bank.bank_type != "signal_model":
 				row.template_id = -row.template_id
-- 
GitLab


From 966ad8ca3199346620800bc74334853e54eadfa4 Mon Sep 17 00:00:00 2001
From: Wanting Niu <wanting.niu@ligo.org>
Date: Fri, 9 Dec 2022 04:17:46 +0000
Subject: [PATCH 4/5] directly read spin1 and spin2 from sngl_inspiral_table

---
 gstlal-inspiral/python/svd_bank.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gstlal-inspiral/python/svd_bank.py b/gstlal-inspiral/python/svd_bank.py
index cbb34fb109..2e970d362b 100644
--- a/gstlal-inspiral/python/svd_bank.py
+++ b/gstlal-inspiral/python/svd_bank.py
@@ -292,8 +292,8 @@ def cal_higher_f_low(template_bank_url, bank_xmldoc, flow, max_duration):
 	for row in bank_sngl_table:
 		m1_SI = lal.MSUN_SI * row.mass1
 		m2_SI = lal.MSUN_SI * row.mass2
-		spin1 = numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5
-		spin2 = numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5
+		spin1 = numpy.dot(row.spin1, row.spin1)**.5
+		spin2 = numpy.dot(row.spin2, row.spin2)**.5
 		f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max(spin1, spin2))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')) 
 
 		time_constrained_f_low.append(scipy.optimize.fsolve(time_freq_bound, x0 = flow, args = (max_duration, m1_SI, m2_SI, spin1, spin2, f_max)))
-- 
GitLab


From 58ff77ffe545e8fd23b51b42af5d67d16093a9f8 Mon Sep 17 00:00:00 2001
From: Wanting Niu <wanting.niu@ligo.org>
Date: Fri, 9 Dec 2022 04:20:26 +0000
Subject: [PATCH 5/5] directly read spin1 and spin2 from sgnl_inspiral_table

---
 gstlal-inspiral/bin/gstlal_inspiral_bank_splitter | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter b/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
index 7c9bdad854..21da1df794 100755
--- a/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
+++ b/gstlal-inspiral/bin/gstlal_inspiral_bank_splitter
@@ -276,9 +276,9 @@ for outputrows in banks_subbins:
 			row.template_duration = chirptime.imr_time(options.f_low,
 				lal.MSUN_SI * row.mass1,
 				lal.MSUN_SI * row.mass2,
-				numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5,
-				numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5,
-				f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max(numpy.dot(row.spin1x**2 + row.spin1y**2 + row.spin1z**2, row.spin1x**2 + row.spin1y**2 + row.spin1z**2)**.5, numpy.dot(row.spin2x**2 + row.spin2y**2 + row.spin2z**2, row.spin2x**2 + row.spin2y**2 + row.spin2z**2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')))
+				numpy.dot(row.spin1, row.spin1)**.5,
+				numpy.dot(row.spin2, row.spin2)**.5,
+				f_max = min(row.f_final, 2 * chirptime.ringf(lal.MSUN_SI * row.mass1 + lal.MSUN_SI * row.mass2, chirptime.overestimate_j_from_chi(max(numpy.dot(row.spin1, row.spin1)**.5, numpy.dot(row.spin2, row.spin2)**.5))) if approximant in templates.gstlal_IMR_approximants else spawaveform.ffinal(row.mass1, row.mass2, 'bkl_isco')))
 			# template_duration may be overwritten by svd_bank if the flow is increased in order to satisfy the target maximum duration
 		outputrows[ind] = (approximant, rows)
 	num_banks += len(outputrows)
-- 
GitLab