Skip to content

Commit 60d933c

Browse files
ColmTalbotmj-will
andauthored
BUG: Fix matched filter SNR calculation in time domain injection (#957)
* TST: add test comparing time domain and frequency domain injections * BUG: fix calculation of SNR in time domain injection * FMT: flake fixes for injection test * BUG: make sure time domain injection metadata is correct * TST: loosen overlap test * TST: mark test as flaky Co-authored-by: Michael J. Williams <michaeljw1@googlemail.com> * BUG: add missing import --------- Co-authored-by: Michael J. Williams <michaeljw1@googlemail.com>
1 parent 2b5cfd3 commit 60d933c

2 files changed

Lines changed: 73 additions & 5 deletions

File tree

bilby/gw/detector/__init__.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,23 @@ def inject_signal_into_gwpy_timeseries(
106106
fig.savefig('{}/{}_{}_time_domain_injected_signal'.format(
107107
outdir, ifo.name, label))
108108

109-
meta_data = dict()
110-
frequency_domain_signal, _ = utils.nfft(signal, waveform_generator.sampling_frequency)
109+
meta_data = dict(name=det)
110+
frequency_domain_signal, _ = utils.nfft(
111+
signal_shifted.value, waveform_generator.sampling_frequency
112+
)
113+
frequency_domain_data, _ = utils.nfft(
114+
signal_and_data.value, waveform_generator.sampling_frequency
115+
)
111116
meta_data['optimal_SNR'] = (
112117
np.sqrt(ifo.optimal_snr_squared(signal=frequency_domain_signal)).real)
113-
meta_data['matched_filter_SNR'] = (
114-
ifo.matched_filter_snr(signal=frequency_domain_signal))
115-
meta_data['parameters'] = parameters
118+
from ..utils import matched_filter_snr
119+
meta_data['matched_filter_SNR'] = matched_filter_snr(
120+
frequency_domain_signal,
121+
frequency_domain_data,
122+
ifo.power_spectral_density_array,
123+
ifo.duration,
124+
)
125+
meta_data["parameters"] = parameters
116126

117127
logger.info("Injected signal in {}:".format(ifo.name))
118128
logger.info(" optimal SNR = {:.2f}".format(meta_data['optimal_SNR']))

test/gw/detector/injection_test.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import bilby
2+
import pytest
3+
from gwpy.frequencyseries import FrequencySeries
4+
5+
6+
@pytest.mark.flaky(reruns=3)
7+
def test_injection_into_timeseries_matches_ifo_injections():
8+
"""
9+
Test that injecting into a gwpy timeseries agree with the frequency-domain
10+
injection.
11+
12+
Caveats:
13+
- there is a discrete alignment of the maximum strain in the time domain
14+
injection that means the overlap and SNRs don't exactly match. This is
15+
especially pronounced when the sampling frequency is low.
16+
"""
17+
duration = 8
18+
sampling_frequency = 16384
19+
ifo = bilby.gw.detector.get_empty_interferometer("H1")
20+
ifo.set_strain_data_from_zero_noise(
21+
sampling_frequency=sampling_frequency, duration=duration
22+
)
23+
wfg = bilby.gw.waveform_generator.WaveformGenerator(
24+
frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole,
25+
duration=duration,
26+
sampling_frequency=sampling_frequency,
27+
)
28+
priors = bilby.gw.prior.BBHPriorDict()
29+
priors["geocent_time"] = 6.0
30+
tseries = ifo.strain_data.to_gwpy_timeseries()
31+
parameters = priors.sample()
32+
ifo.inject_signal(parameters, waveform_generator=wfg, raise_error=False)
33+
signal_and_data, meta_data = bilby.gw.detector.inject_signal_into_gwpy_timeseries(
34+
tseries,
35+
waveform_generator=wfg,
36+
parameters=parameters,
37+
det="H1",
38+
)
39+
40+
assert meta_data.keys() == ifo.meta_data.keys()
41+
assert meta_data["parameters"] == ifo.meta_data["parameters"]
42+
for key in ["optimal_SNR", "matched_filter_SNR"]:
43+
assert abs(meta_data[key] - ifo.meta_data[key]) < 1e-5
44+
45+
asd = FrequencySeries(
46+
ifo.amplitude_spectral_density_array,
47+
frequencies=ifo.frequency_array,
48+
unit="1/Hz",
49+
)
50+
whitened_data_1 = signal_and_data.whiten(asd=asd).value
51+
whitened_data_2 = ifo.whitened_time_domain_strain
52+
53+
mismatch = 1 - (
54+
sum(whitened_data_1 * whitened_data_2)
55+
/ sum(whitened_data_1**2)**0.5
56+
/ sum(whitened_data_2**2)**0.5
57+
)
58+
assert mismatch < 3e-3

0 commit comments

Comments
 (0)