diff --git a/gstlal-inspiral/bin/gstlal_inspiral b/gstlal-inspiral/bin/gstlal_inspiral
index e3925b141ff0e71526695c2f4fb37548d2dce56c..39892b89c74e6378ae1c701fee182eb4b65df9d9 100755
--- a/gstlal-inspiral/bin/gstlal_inspiral
+++ b/gstlal-inspiral/bin/gstlal_inspiral
@@ -728,6 +728,8 @@ for output_file_number, (svd_bank_url_dict, output_url, ranking_stat_output_url,
 	horizon_factors = {}
 	for bank in list(banks.values())[0]:
 		use_time_reverse |= bank.bank_type == "noise_model"
+		if bank.bank_type == "noise_model":
+			continue
 		sngl_inspiral_table.extend(bank.sngl_inspiral_table)
 		horizon_factors.update(bank.horizon_factors)
 	@bottle.route("/template_bank.xml.gz")
diff --git a/gstlal-inspiral/python/svd_bank.py b/gstlal-inspiral/python/svd_bank.py
index 15f2d73517dbe1f9939c0d6fc49ed37000acb8eb..7c9a1ec3e7500761555803293147d97bbca418f9 100644
--- a/gstlal-inspiral/python/svd_bank.py
+++ b/gstlal-inspiral/python/svd_bank.py
@@ -360,6 +360,10 @@ def write_bank(filename, banks, psd_input, verbose = False):
 		# 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:
+				row.template_id = -row.template_id
 		# put the possibly clipped table into the file
 		root.appendChild(bank.sngl_inspiral_table)
 
@@ -507,7 +511,7 @@ def read_banks(filename, contenthandler, verbose = False):
 	template_id, func = horizon_distance_func(banks)
 	horizon_norm = None
 	for bank in banks:
-		if template_id in bank.horizon_factors:
+		if template_id in bank.horizon_factors and bank.bank_type == "signal_model":
 			assert horizon_norm is None
 			horizon_norm = bank.horizon_factors[template_id]
 	for bank in banks: