From 6faed1e16c3932e2c284333988faceabb962c298 Mon Sep 17 00:00:00 2001
From: Moritz Huebner <email@moritz-huebner.de>
Date: Mon, 4 Jun 2018 19:11:37 +1000
Subject: [PATCH] Removed some code redundancy for the time marginalisation

---
 tupak/likelihood.py | 99 +++++++++++++++++++++------------------------
 1 file changed, 46 insertions(+), 53 deletions(-)

diff --git a/tupak/likelihood.py b/tupak/likelihood.py
index 1e7922305..479c77471 100644
--- a/tupak/likelihood.py
+++ b/tupak/likelihood.py
@@ -1,4 +1,5 @@
 from __future__ import division, print_function
+
 import numpy as np
 
 try:
@@ -7,7 +8,6 @@ except ImportError:
     from scipy.misc import logsumexp
 from scipy.special import i0e
 from scipy.interpolate import interp1d
-from scipy.integrate import quad as gaussian_quadrature
 from scipy.interpolate import interp2d
 import tupak
 import logging
@@ -60,6 +60,7 @@ class GravitationalWaveTransient(Likelihood):
         some model parameters
 
     """
+
     def __init__(self, interferometers, waveform_generator, time_marginalization=False, distance_marginalization=False,
                  phase_marginalization=False, prior=None):
 
@@ -77,7 +78,7 @@ class GravitationalWaveTransient(Likelihood):
             self.delta_distance = 0
             self.distance_prior_array = np.array([])
             self.setup_distance_marginalization()
-            prior['luminosity_distance'] = 1 # this means the prior is a delta function fixed at the RHS value
+            prior['luminosity_distance'] = 1  # this means the prior is a delta function fixed at the RHS value
 
         if self.phase_marginalization:
             self.bessel_function_interped = None
@@ -111,9 +112,10 @@ class GravitationalWaveTransient(Likelihood):
 
         matched_filter_snr_squared = 0
         optimal_snr_squared = 0
-        matched_filter_snr_squared_tc_array = None
-
+        matched_filter_snr_squared_tc_array = np.zeros(self.interferometers[0].data.shape)
+        duration = 0
         for interferometer in self.interferometers:
+            duration = interferometer.duration
             signal_ifo = interferometer.get_detector_response(waveform_polarizations,
                                                               self.waveform_generator.parameters)
             matched_filter_snr_squared += tupak.utils.matched_filter_snr_squared(
@@ -121,69 +123,61 @@ class GravitationalWaveTransient(Likelihood):
 
             optimal_snr_squared += tupak.utils.optimal_snr_squared(
                 signal_ifo, interferometer, self.waveform_generator.time_duration)
-
             if self.time_marginalization:
-
                 interferometer.time_marginalization = self.time_marginalization
-
-                if matched_filter_snr_squared_tc_array is None:
-
-                    matched_filter_snr_squared_tc_array = 4. * (1./interferometer.duration) \
-                                                            * np.fft.ifft( signal_ifo.conjugate()[0:-1] * interferometer.data[0:-1] \
-                                                            / interferometer.power_spectral_density_array[0:-1]) * len(interferometer.data[0:-1])
-                else:
-
-                    matched_filter_snr_squared_tc_array += 4. * (1./interferometer.duration) \
-                                                        * np.fft.ifft( signal_ifo.conjugate()[0:-1] * interferometer.data[0:-1] \
-                                                        / interferometer.power_spectral_density_array[0:-1] ) * len(interferometer.data[0:-1])
+                matched_filter_snr_squared_tc_array += 4. * (1. / interferometer.duration) * np.fft.ifft(
+                    signal_ifo.conjugate()[0:-1] * interferometer.data[0:-1]
+                    / interferometer.power_spectral_density_array[0:-1]) * len(interferometer.data[0:-1])
 
         if self.time_marginalization:
 
-            delta_tc = 1./self.waveform_generator.sampling_frequency
-            tc_log_norm = np.log(interferometer.duration*delta_tc)
+            delta_tc = 1. / self.waveform_generator.sampling_frequency
+            tc_log_norm = np.log(duration * delta_tc)
 
             if self.distance_marginalization:
 
                 rho_opt_ref = optimal_snr_squared.real * \
-                             self.waveform_generator.parameters['luminosity_distance'] ** 2 \
-                            / self.ref_dist**2.
+                              self.waveform_generator.parameters['luminosity_distance'] ** 2 \
+                              / self.ref_dist ** 2.
                 rho_mf_ref_tc_array = matched_filter_snr_squared_tc_array * \
-                            self.waveform_generator.parameters['luminosity_distance'] \
-                            / self.ref_dist
-
+                                      self.waveform_generator.parameters['luminosity_distance'] \
+                                      / self.ref_dist
 
                 if self.phase_marginalization:
 
                     phase_margd_rho_mf_tc_array = self.bessel_function_interped(abs(rho_mf_ref_tc_array))
 
-                    dist_marged_log_l_tc_array = self.interp_dist_margd_loglikelihood(phase_margd_rho_mf_tc_array, rho_opt_ref)
+                    dist_marged_log_l_tc_array = self.interp_dist_margd_loglikelihood(phase_margd_rho_mf_tc_array,
+                                                                                      rho_opt_ref)
                     log_l = logsumexp(dist_marged_log_l_tc_array, axis=0, b=delta_tc) - tc_log_norm
 
                 else:
 
-                    dist_marged_log_l_tc_array = self.interp_dist_margd_loglikelihood(rho_mf_ref_tc_array.real, rho_opt_ref)
+                    dist_marged_log_l_tc_array = self.interp_dist_margd_loglikelihood(rho_mf_ref_tc_array.real,
+                                                                                      rho_opt_ref)
 
-                    log_l = logsumexp(dist_marged_log_l_tc_array, axis=0, b=delta_tc) 
+                    log_l = logsumexp(dist_marged_log_l_tc_array, axis=0, b=delta_tc)
 
             elif self.phase_marginalization:
 
-                log_l = logsumexp( self.bessel_function_interped(abs(matched_filter_snr_squared_tc_array)), b=delta_tc)\
-                                                    - optimal_snr_squared/2. - tc_log_norm
+                log_l = logsumexp(self.bessel_function_interped(abs(matched_filter_snr_squared_tc_array)), b=delta_tc) \
+                        - optimal_snr_squared / 2. - tc_log_norm
 
             else:
 
-                log_l = logsumexp(matched_filter_snr_squared_tc_array.real, axis=0, b=delta_tc) - optimal_snr_squared / 2. - tc_log_norm
+                log_l = logsumexp(matched_filter_snr_squared_tc_array.real, axis=0,
+                                  b=delta_tc) - optimal_snr_squared / 2. - tc_log_norm
 
         elif self.distance_marginalization:
 
             rho_opt_ref = optimal_snr_squared.real * \
-                         self.waveform_generator.parameters['luminosity_distance'] ** 2 \
-                        / self.ref_dist**2.
+                          self.waveform_generator.parameters['luminosity_distance'] ** 2 \
+                          / self.ref_dist ** 2.
             rho_mf_ref = matched_filter_snr_squared.real * \
-                        self.waveform_generator.parameters['luminosity_distance'] \
-                        / self.ref_dist
+                         self.waveform_generator.parameters['luminosity_distance'] \
+                         / self.ref_dist
 
-            log_l=self.interp_dist_margd_loglikelihood(rho_mf_ref, rho_opt_ref)[0]
+            log_l = self.interp_dist_margd_loglikelihood(rho_mf_ref, rho_opt_ref)[0]
 
         elif self.phase_marginalization:
             matched_filter_snr_squared = self.bessel_function_interped(abs(matched_filter_snr_squared))
@@ -208,36 +202,35 @@ class GravitationalWaveTransient(Likelihood):
                                               for distance in self.distance_array])
 
         ### Make the lookup table ###
-        self.ref_dist = 1000 # 1000 Mpc
-        self.dist_margd_loglikelihood_array = np.zeros((400,800))
-
-        self.rho_opt_ref_array = np.logspace(-3,4,self.dist_margd_loglikelihood_array.shape[0]) # optimal filter snr at fiducial distance of ref_dist Mpc
-        self.rho_mf_ref_array = np.hstack( (-np.logspace(2,-3,self.dist_margd_loglikelihood_array.shape[1]/2), \
-                                np.logspace(-3,4,self.dist_margd_loglikelihood_array.shape[1]/2)) ) # matched filter snr at fiducial distance of ref_dist Mpc
+        self.ref_dist = 1000  # 1000 Mpc
+        self.dist_margd_loglikelihood_array = np.zeros((400, 800))
 
+        self.rho_opt_ref_array = np.logspace(-3, 4, self.dist_margd_loglikelihood_array.shape[
+            0])  # optimal filter snr at fiducial distance of ref_dist Mpc
+        self.rho_mf_ref_array = np.hstack((-np.logspace(2, -3, self.dist_margd_loglikelihood_array.shape[1] / 2), \
+                                           np.logspace(-3, 4, self.dist_margd_loglikelihood_array.shape[
+                                               1] / 2)))  # matched filter snr at fiducial distance of ref_dist Mpc
 
         for ii, rho_opt_ref in enumerate(self.rho_opt_ref_array):
 
             for jj, rho_mf_ref in enumerate(self.rho_mf_ref_array):
-
-                optimal_snr_squared_array = rho_opt_ref * self.ref_dist**2. \
+                optimal_snr_squared_array = rho_opt_ref * self.ref_dist ** 2. \
                                             / self.distance_array ** 2
 
                 matched_filter_snr_squared_array = rho_mf_ref * self.ref_dist \
-                                                / self.distance_array
+                                                   / self.distance_array
 
                 self.dist_margd_loglikelihood_array[ii][jj] = \
-                                                    logsumexp(matched_filter_snr_squared_array - \
-                                                     optimal_snr_squared_array / 2, \
-                                                     b= self.distance_prior_array * self.delta_distance)
+                    logsumexp(matched_filter_snr_squared_array - \
+                              optimal_snr_squared_array / 2, \
+                              b=self.distance_prior_array * self.delta_distance)
 
-        log_norm = logsumexp(0. / self.distance_array  - 0./self.distance_array**2.,\
-                            b=self.distance_prior_array* self.delta_distance)
+        log_norm = logsumexp(0. / self.distance_array - 0. / self.distance_array ** 2., \
+                             b=self.distance_prior_array * self.delta_distance)
         self.dist_margd_loglikelihood_array -= log_norm
 
-
-        self.interp_dist_margd_loglikelihood = interp2d(self.rho_mf_ref_array, self.rho_opt_ref_array, self.dist_margd_loglikelihood_array)
-
+        self.interp_dist_margd_loglikelihood = interp2d(self.rho_mf_ref_array, self.rho_opt_ref_array,
+                                                        self.dist_margd_loglikelihood_array)
 
     def setup_phase_marginalization(self):
         if 'phase' not in self.prior.keys() or not isinstance(self.prior['phase'], tupak.prior.Prior):
@@ -249,7 +242,6 @@ class GravitationalWaveTransient(Likelihood):
                                                  bounds_error=False, fill_value=-np.inf)
 
 
-
 class BasicGravitationalWaveTransient(Likelihood):
     """ A basic gravitational wave transient likelihood
 
@@ -272,6 +264,7 @@ class BasicGravitationalWaveTransient(Likelihood):
         some model parameters
 
     """
+
     def __init__(self, interferometers, waveform_generator):
         Likelihood.__init__(self, waveform_generator.parameters)
         self.interferometers = interferometers
-- 
GitLab