Coverage for bilby/gw/likelihood/basic.py: 100%
26 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-06 04:57 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-06 04:57 +0000
1import numpy as np
3from ...core.likelihood import Likelihood
6class BasicGravitationalWaveTransient(Likelihood):
8 def __init__(self, interferometers, waveform_generator):
9 """
11 A likelihood object, able to compute the likelihood of the data given
12 some model parameters
14 The simplest frequency-domain gravitational wave transient likelihood. Does
15 not include distance/phase marginalization.
18 Parameters
19 ==========
20 interferometers: list
21 A list of `bilby.gw.detector.Interferometer` instances - contains the
22 detector data and power spectral densities
23 waveform_generator: bilby.gw.waveform_generator.WaveformGenerator
24 An object which computes the frequency-domain strain of the signal,
25 given some set of parameters
27 """
28 super(BasicGravitationalWaveTransient, self).__init__(dict())
29 self.interferometers = interferometers
30 self.waveform_generator = waveform_generator
32 def __repr__(self):
33 return self.__class__.__name__ + '(interferometers={},\n\twaveform_generator={})' \
34 .format(self.interferometers, self.waveform_generator)
36 def noise_log_likelihood(self):
37 """ Calculates the real part of noise log-likelihood
39 Returns
40 =======
41 float: The real part of the noise log likelihood
43 """
44 log_l = 0
45 for interferometer in self.interferometers:
46 log_l -= 2. / self.waveform_generator.duration * np.sum(
47 abs(interferometer.frequency_domain_strain) ** 2 /
48 interferometer.power_spectral_density_array)
49 return log_l.real
51 def log_likelihood(self):
52 """ Calculates the real part of log-likelihood value
54 Returns
55 =======
56 float: The real part of the log likelihood
58 """
59 log_l = 0
60 waveform_polarizations = \
61 self.waveform_generator.frequency_domain_strain(
62 self.parameters.copy())
63 if waveform_polarizations is None:
64 return np.nan_to_num(-np.inf)
65 for interferometer in self.interferometers:
66 log_l += self.log_likelihood_interferometer(
67 waveform_polarizations, interferometer)
68 return log_l.real
70 def log_likelihood_interferometer(self, waveform_polarizations,
71 interferometer):
72 """
74 Parameters
75 ==========
76 waveform_polarizations: dict
77 Dictionary containing the desired waveform polarization modes and the related strain
78 interferometer: bilby.gw.detector.Interferometer
79 The Interferometer object we want to have the log-likelihood for
81 Returns
82 =======
83 float: The real part of the log-likelihood for this interferometer
85 """
86 signal_ifo = interferometer.get_detector_response(
87 waveform_polarizations, self.parameters)
89 log_l = - 2. / self.waveform_generator.duration * np.vdot(
90 interferometer.frequency_domain_strain - signal_ifo,
91 (interferometer.frequency_domain_strain - signal_ifo) /
92 interferometer.power_spectral_density_array)
93 return log_l.real