diff --git a/bilby/gw/detector/interferometer.py b/bilby/gw/detector/interferometer.py index 82c6f1c4a38abcbd6a03cc8d3205b88c09c575da..4f54b71579eefe878cb6039a5c543e515a7f315f 100644 --- a/bilby/gw/detector/interferometer.py +++ b/bilby/gw/detector/interferometer.py @@ -597,6 +597,26 @@ class Interferometer(object): power_spectral_density=self.power_spectral_density_array[self.strain_data.frequency_mask], duration=self.strain_data.duration) + def template_template_inner_product(self, signal_1, signal_2): + """A noise weighted inner product between two templates, using this ifo's PSD. + + Parameters + ========== + signal_1 : array_like + An array containing the first signal + signal_2 : array_like + an array containing the second signal + + Returns + ======= + float: The noise weighted inner product of the two templates + """ + return gwutils.noise_weighted_inner_product( + aa=signal_1[self.strain_data.frequency_mask], + bb=signal_2[self.strain_data.frequency_mask], + power_spectral_density=self.power_spectral_density_array[self.strain_data.frequency_mask], + duration=self.strain_data.duration) + def matched_filter_snr(self, signal): """ diff --git a/test/gw/detector/interferometer_test.py b/test/gw/detector/interferometer_test.py index 66e8476035d52d41b4791a1a2126f3927fadd605..08a8f6a872f8e6fa3fbddef3b554ff07776b340b 100644 --- a/test/gw/detector/interferometer_test.py +++ b/test/gw/detector/interferometer_test.py @@ -321,6 +321,18 @@ class TestInterferometer(unittest.TestCase): self.assertTrue(np.array_equal(expected[2], actual[2])) self.assertEqual(expected[3], actual[3]) + def test_template_template_inner_product(self): + signal_1 = np.ones_like(self.ifo.power_spectral_density_array) + signal_2 = np.ones_like(self.ifo.power_spectral_density_array) * 2 + signal_1_optimal = self.ifo.optimal_snr_squared(signal=signal_1) + signal_1_optimal_by_template_template = self.ifo.template_template_inner_product( + signal_1=signal_1, + signal_2=signal_1 + ) + self.assertTrue(np.array_equal(signal_1_optimal, signal_1_optimal_by_template_template)) + signal_1_signal_2_inner_product = self.ifo.template_template_inner_product(signal_1=signal_1, signal_2=signal_2) + self.assertTrue(np.array_equal(signal_1_optimal * 2, signal_1_signal_2_inner_product)) + def test_repr(self): expected = ( "Interferometer(name='{}', power_spectral_density={}, minimum_frequency={}, "