diff --git a/python/calibration_parts.py b/python/calibration_parts.py
index c635c29d14de7e9149c90ce9ff18ed1ae34f58b8..a237d7f38cd8c2508a7dcd7aa7ed86489358d8ea 100644
--- a/python/calibration_parts.py
+++ b/python/calibration_parts.py
@@ -521,10 +521,11 @@ def remove_lines_with_witnesses(pipeline, signal, witnesses, freqs, freq_vars, f
 	signal = pipeparts.mktee(pipeline, signal)
 	function_inst_num = int(signal.name[3:])
 	# Check whether the signal exists, and use this to gate the TF
-	signal_exists = pipeparts.mkbitvectorgen(pipeline, signal, threshold = 1e-50, bit_vector = 1)
-	signal_exists = pipeparts.mkcapsfilter(pipeline, signal_exists, "audio/x-raw, format=U32LE, rate=%d, channel-mask=(bitmask)0x0" % rate_out)
-	signal_exists = pipeparts.mkgeneric(pipeline, signal_exists, "lal_logicalundersample", required_on = 1, status_out = 1)
-	signal_exists = pipeparts.mktee(pipeline, pipeparts.mkcapsfilter(pipeline, signal_exists, "audio/x-raw, format=U32LE, rate=%d, channel-mask=(bitmask)0x0" % compute_rate))
+	if filter_latency == 0:
+		signal_exists = pipeparts.mkbitvectorgen(pipeline, signal, threshold = 1e-50, bit_vector = 1)
+		signal_exists = pipeparts.mkcapsfilter(pipeline, signal_exists, "audio/x-raw, format=U32LE, rate=%d, channel-mask=(bitmask)0x0" % rate_out)
+		signal_exists = pipeparts.mkgeneric(pipeline, signal_exists, "lal_logicalundersample", required_on = 1, status_out = 1)
+		signal_exists = pipeparts.mktee(pipeline, pipeparts.mkcapsfilter(pipeline, signal_exists, "audio/x-raw, format=U32LE, rate=%d, channel-mask=(bitmask)0x0" % compute_rate))
 
 	signal_minus_lines = [signal]
 
@@ -620,7 +621,11 @@ def remove_lines_with_witnesses(pipeline, signal, witnesses, freqs, freq_vars, f
 				tf_at_f = mkinsertgap(pipeline, tf_at_f, replace_value = 0)
 				# Remove worthless data from computation of transfer function if we can
 				tf_at_f = mkgate(pipeline, tf_at_f, witness_downsampled[i], 1.0001 * witness_absent_value, attack_length = -((1.0 - filter_latency) * (filter_samples + resample_shift)), name = "linesub_witness_downsampled_gate_%d_%d_%d_%d" % (m, n, i, function_inst_num), queue_length = queue_length)
-				tf_at_f = mkgate(pipeline, tf_at_f, signal_exists, 1, attack_length = -((1.0 - filter_latency) * filter_samples), name = "linesub_signal_exists_gate_%d_%d_%d_%d" % (m, n, i, function_inst_num), queue_length = queue_length)
+				if filter_latency == 0:
+					# When filter_latency is 1, the queues before the gate below sometimes
+					# store data unnecessarily, refusing to release the data at EOS. This may
+					# be due to a race condition.
+					tf_at_f = mkgate(pipeline, tf_at_f, signal_exists, 1, attack_length = -((1.0 - filter_latency) * filter_samples), name = "linesub_signal_exists_gate_%d_%d_%d_%d" % (m, n, i, function_inst_num), queue_length = queue_length)
 				if noisesub_gate_bit is not None:
 					tf_at_f = mkgate(pipeline, tf_at_f, noisesub_gate_bit, 1, attack_length = -((1.0 - filter_latency) * filter_samples), name = "linesub_gate_%d_%d_%d_%d" % (m, n, i, function_inst_num), queue_length = queue_length)
 				if any(amp_channels):