Skip to content
Snippets Groups Projects
Commit e2ab870a authored by RorySmith's avatar RorySmith
Browse files

stable version of dist marg, and time-and-phase marg. Need to fix dist

and time marg before moving onto dist and tiem nad phase marg
parent 754752b2
No related branches found
No related tags found
No related merge requests found
...@@ -19,13 +19,13 @@ label = 'basic_tutorial' ...@@ -19,13 +19,13 @@ label = 'basic_tutorial'
tupak.utils.setup_logger(outdir=outdir, label=label) tupak.utils.setup_logger(outdir=outdir, label=label)
# Set up a random seed for result reproducibility. This is optional! # Set up a random seed for result reproducibility. This is optional!
#np.random.seed(170) np.random.seed(2157034243)
# We are going to inject a binary black hole waveform. We first establish a dictionary of parameters that # We are going to inject a binary black hole waveform. We first establish a dictionary of parameters that
# includes all of the different waveform parameters, including masses of the two black holes (mass_1, mass_2), # includes all of the different waveform parameters, including masses of the two black holes (mass_1, mass_2),
# spins of both black holes (a, tilt, phi), etc. # spins of both black holes (a, tilt, phi), etc.
injection_parameters = dict(mass_1=36., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.5, tilt_2=1.0, phi_12=1.7, phi_jl=0.3, injection_parameters = dict(mass_1=36., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.5, tilt_2=1.0, phi_12=1.7, phi_jl=0.3,
luminosity_distance=4000., iota=0.4, psi=2.659, phase=1.3, geocent_time=1126259642.413, luminosity_distance=2000., iota=0.4, psi=2.659, phase=1.3, geocent_time=1126259642.413,
waveform_approximant='IMRPhenomPv2', reference_frequency=50., ra=1.375, dec=-1.2108) waveform_approximant='IMRPhenomPv2', reference_frequency=50., ra=1.375, dec=-1.2108)
# Create the waveform_generator using a LAL BinaryBlackHole source function # Create the waveform_generator using a LAL BinaryBlackHole source function
......
...@@ -85,7 +85,7 @@ class GravitationalWaveTransient(Likelihood): ...@@ -85,7 +85,7 @@ class GravitationalWaveTransient(Likelihood):
if self.phase_marginalization: if self.phase_marginalization:
self.bessel_function_interped = None self.bessel_function_interped = None
self.setup_phase_marginalization() self.setup_phase_marginalization()
prior['psi'] = 0 prior['phase'] = 0
@property @property
def prior(self): def prior(self):
...@@ -141,25 +141,24 @@ class GravitationalWaveTransient(Likelihood): ...@@ -141,25 +141,24 @@ class GravitationalWaveTransient(Likelihood):
if self.time_marginalization: if self.time_marginalization:
delta_tc = self.waveform_generator.sampling_frequency delta_tc = self.waveform_generator.sampling_frequency
#print (1./delta_tc, (interferometer.duration) )
if self.distance_marginalization:
rho_opt_1 = optimal_snr_squared.real * \ if self.distance_marginalization:
self.waveform_generator.parameters['luminosity_distance'] ** 2
rho_mf_1_tc_array = matched_filter_snr_squared_tc_array.real * \
self.waveform_generator.parameters['luminosity_distance']
## TRY time marg before dist marg: rho_opt_ref = optimal_snr_squared.real * \
#time_marged_log_l_dist_array = logsumexp(rho_mf_1_tc_array, b=delta_tc) self.waveform_generator.parameters['luminosity_distance'] ** 2 \
#log_l = self.interp_dist_margd_likelihood(rho_mf_1_tc_array, rho_opt_1)[0] / self.ref_dist**2.
rho_mf_ref_tc_array = matched_filter_snr_squared_tc_array.real * \
self.waveform_generator.parameters['luminosity_distance'] \
/ self.ref_dist
dist_marged_log_l_tc_array = self.interp_dist_margd_likelihood(rho_mf_1_tc_array, rho_opt_1)[0] dist_marged_log_l_tc_array = self.interp_dist_margd_loglikelihood(rho_mf_ref_tc_array, rho_opt_ref)[0]
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: elif self.phase_marginalization:
phase_marged_log_l_tc_array = self.bessel_function_interped(abs(matched_filter_snr_squared_tc_array)) log_l = logsumexp( self.bessel_function_interped(abs(matched_filter_snr_squared_tc_array)), b=delta_tc)\
log_l = logsumexp(phase_marged_log_l_tc_array, axis=0, b=delta_tc) - optimal_snr_squared/2.
else: else:
...@@ -168,12 +167,14 @@ class GravitationalWaveTransient(Likelihood): ...@@ -168,12 +167,14 @@ class GravitationalWaveTransient(Likelihood):
elif self.distance_marginalization: elif self.distance_marginalization:
#TODO: order should be: (phase-> dist-> tc) #TODO: order should be: (phase-> dist-> tc)
rho_opt_1 = optimal_snr_squared.real * \ rho_opt_ref = optimal_snr_squared.real * \
self.waveform_generator.parameters['luminosity_distance'] ** 2 self.waveform_generator.parameters['luminosity_distance'] ** 2 \
rho_mf_1 = matched_filter_snr_squared.real * \ / self.ref_dist**2.
self.waveform_generator.parameters['luminosity_distance'] rho_mf_ref = matched_filter_snr_squared.real * \
self.waveform_generator.parameters['luminosity_distance'] \
/ self.ref_dist
log_l=self.interp_dist_margd_likelihood(rho_mf_1, rho_opt_1)[0] log_l=self.interp_dist_margd_loglikelihood(rho_mf_ref, rho_opt_ref)[0]
elif self.phase_marginalization: elif self.phase_marginalization:
matched_filter_snr_squared = self.bessel_function_interped(abs(matched_filter_snr_squared)) matched_filter_snr_squared = self.bessel_function_interped(abs(matched_filter_snr_squared))
...@@ -198,48 +199,53 @@ class GravitationalWaveTransient(Likelihood): ...@@ -198,48 +199,53 @@ class GravitationalWaveTransient(Likelihood):
for distance in self.distance_array]) for distance in self.distance_array])
### Make the lookup table ### ### Make the lookup table ###
self.ref_dist = 1000 # 1000 Mpc
self.dist_margd_loglikelihood_array = np.zeros((400,800))
self.dist_margd_likelihood_array = np.zeros((1000,1000)) self.rho_opt_ref_array = np.logspace(-3,4,self.dist_margd_loglikelihood_array.shape[0]) # optimal filter snr at fiducial distance of 1 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 1 Mpc
self.rho_opt_1_array = np.linspace(5e5,7e8,self.dist_margd_likelihood_array.shape[0]) # optimal filter snr at fiducial distance of 1 Mpc
self.rho_mf_1_array = np.linspace(-45000,2e6,self.dist_margd_likelihood_array.shape[1]) # matched filter snr at fiducial distance of 1 Mpc
for ii, rho_opt_ref in enumerate(self.rho_opt_ref_array):
for ii, rho_opt_1 in enumerate(self.rho_opt_1_array): for jj, rho_mf_ref in enumerate(self.rho_mf_ref_array):
for jj, rho_mf_1 in enumerate(self.rho_mf_1_array): optimal_snr_squared_array = rho_opt_ref * self.ref_dist**2. \
optimal_snr_squared_array = rho_opt_1 \
/ self.distance_array ** 2 / self.distance_array ** 2
matched_filter_snr_squared_array = rho_mf_1 \ matched_filter_snr_squared_array = rho_mf_ref * self.ref_dist \
/ self.distance_array / self.distance_array
self.dist_margd_likelihood_array[ii][jj] = \ self.dist_margd_loglikelihood_array[ii][jj] = \
logsumexp(matched_filter_snr_squared_array - \ logsumexp(matched_filter_snr_squared_array - \
optimal_snr_squared_array / 2, \ optimal_snr_squared_array / 2, \
b=self.distance_prior_array * self.delta_distance) b=self.distance_prior_array * self.delta_distance)
log_norm = logsumexp(0 / self.distance_array - 0/self.distance_array**2. / 2, b=self.distance_prior_array * self.delta_distance) log_norm = logsumexp(0 / self.distance_array - 0/self.distance_array**2. / 2, b=self.distance_prior_array * self.delta_distance)
self.dist_margd_likelihood_array -= log_norm self.dist_margd_loglikelihood_array -= log_norm
self.interp_dist_margd_likelihood = interp2d(self.rho_mf_1_array, self.rho_opt_1_array, self.dist_margd_likelihood_array) self.interp_dist_margd_loglikelihood = interp2d(self.rho_mf_ref_array, self.rho_opt_ref_array, self.dist_margd_loglikelihood_array)
#np.save("dist_margd_likelihood_array",self.dist_margd_likelihood_array) #np.save("dist_margd_loglikelihood_array",self.dist_margd_loglikelihood_array)
#sys.exit() #sys.exit()
'''def setupt_time_marginalization(self):
if 'geocent_time' not in self.prior.keys() or not isinstance(self.prior['geocent_time'], tupak.prior.Prior):
logging.info('No prior provided for geocent_time, using default prior.')
self.prior['geocent_time'] ='''
def setup_phase_marginalization(self): def setup_phase_marginalization(self):
if 'psi' not in self.prior.keys() or not isinstance(self.prior['psi'], tupak.prior.Prior): if 'phase' not in self.prior.keys() or not isinstance(self.prior['phase'], tupak.prior.Prior):
logging.info('No prior provided for polarization, using default prior.') logging.info('No prior provided for phase at coalescence, using default prior.')
self.prior['psi'] = tupak.prior.create_default_prior('psi') self.prior['phase'] = tupak.prior.create_default_prior('phase')
self.bessel_function_interped = interp1d(np.linspace(0, 1e6, int(1e5)), self.bessel_function_interped = interp1d(np.linspace(0, 1e6, int(1e5)),
np.log([i0e(snr) for snr in np.linspace(0, 1e6, int(1e5))]) np.log([i0e(snr) for snr in np.linspace(0, 1e6, int(1e5))])
+ np.linspace(0, 1e6, int(1e5)), + np.linspace(0, 1e6, int(1e5)),
bounds_error=False, fill_value=-np.inf) bounds_error=False, fill_value=-np.inf)
class BasicGravitationalWaveTransient(Likelihood): class BasicGravitationalWaveTransient(Likelihood):
""" A basic gravitational wave transient likelihood """ A basic gravitational wave transient likelihood
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment