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

1import numpy as np 

2 

3from ...core.likelihood import Likelihood 

4 

5 

6class BasicGravitationalWaveTransient(Likelihood): 

7 

8 def __init__(self, interferometers, waveform_generator): 

9 """ 

10 

11 A likelihood object, able to compute the likelihood of the data given 

12 some model parameters 

13 

14 The simplest frequency-domain gravitational wave transient likelihood. Does 

15 not include distance/phase marginalization. 

16 

17 

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 

26 

27 """ 

28 super(BasicGravitationalWaveTransient, self).__init__(dict()) 

29 self.interferometers = interferometers 

30 self.waveform_generator = waveform_generator 

31 

32 def __repr__(self): 

33 return self.__class__.__name__ + '(interferometers={},\n\twaveform_generator={})' \ 

34 .format(self.interferometers, self.waveform_generator) 

35 

36 def noise_log_likelihood(self): 

37 """ Calculates the real part of noise log-likelihood 

38 

39 Returns 

40 ======= 

41 float: The real part of the noise log likelihood 

42 

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 

50 

51 def log_likelihood(self): 

52 """ Calculates the real part of log-likelihood value 

53 

54 Returns 

55 ======= 

56 float: The real part of the log likelihood 

57 

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 

69 

70 def log_likelihood_interferometer(self, waveform_polarizations, 

71 interferometer): 

72 """ 

73 

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 

80 

81 Returns 

82 ======= 

83 float: The real part of the log-likelihood for this interferometer 

84 

85 """ 

86 signal_ifo = interferometer.get_detector_response( 

87 waveform_polarizations, self.parameters) 

88 

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