2Core python module for the IMR consistency test
4P. Ajith, Abhirup Ghosh, 2015-09-15
10import scipy.ndimage.filters
as filter
11from multiprocessing
import Pool
12from functools
import partial
13from .
import nrutils
as nr
15""" calculate the mass and spin of the final black hole using an NR-inspired fitting formula """
17 """ Calculate the mass and spin of the final black hole using an NR-inspired fitting formula.
20 m1, m2: initial masses
21 chi1, chi2: initial spin magnitudes
22 chi1z, chi2z: z-components of the initial spins
23 phi12: in-plane angle between initial spins
24 fit_formula: fitting formula to be used
for the calculation of final mass/spin
27 mf, chif: final mass, final spin
30 tilt1 = np.arccos(chi1z/chi1)
31 tilt2 = np.arccos(chi2z/chi2)
33 if fit_formula ==
'nospin_Pan2011':
34 chif = nr.bbh_final_spin_non_spinning_Panetal(m1, m2)
35 mf = nr.bbh_final_mass_non_spinning_Panetal(m1, m2)
36 elif fit_formula ==
'nonprecspin_Healy2014':
37 chif = nr.bbh_final_spin_non_precessing_Healyetal(m1, m2, chi1z, chi2z, version=
"2014")
38 mf = nr.bbh_final_mass_non_precessing_Healyetal(m1, m2, chi1z, chi2z, version=
"2014", chif=chif)
39 elif fit_formula ==
'nonprecspin_Husa2015':
40 chif = nr.bbh_final_spin_non_precessing_Husaetal(m1, m2, chi1z, chi2z)
41 mf = nr.bbh_final_mass_non_precessing_Husaetal(m1, m2, chi1z, chi2z)
42 elif fit_formula ==
'bbh_average_fits_precessing':
43 mf_fits = [
"UIB2016",
"HL2016"]
44 chif_fits = [
"UIB2016",
"HBR2016",
"HL2016"]
45 mf = nr.bbh_average_fits_precessing(m1, m2, chi1, chi2, tilt1, tilt2, 0,
"Mf", mf_fits)
46 chif = nr.bbh_average_fits_precessing(m1, m2, chi1, chi2, tilt1, tilt2, phi12,
"af", chif_fits)
48 raise ValueError(
"unknown spin fit formula")
51""" compute the integrand of P(dMf/Mfbar, dchif/chifbar). """
52def P_integrand(chif, Mf, v1, v2, P_Mfchif_i_interp_object, P_Mfchif_r_interp_object):
54 """ Compute the integrand of P(dMf/Mfbar, dchif/chifbar).
57 chif: vector of values of final spin
58 Mf: vector of values of final mass
60 v2: dchif/chifbar value
61 P_Mfchif_i_interp_object: interpolation function of P_i(Mf, chif)
62 P_Mfchif_r_interp_object: interpolation function of P_r(Mf, chif)
64 output: integrand of P(dMf/Mfbar, dchif/chifbar)
68 Mf_mat, chif_mat = np.meshgrid(Mf, chif)
74 dchif_i = (1.+v2/2.)*chif
77 dchif_r = (1.-v2/2.)*chif
80 dMf_i = np.flipud(dMf_i)
82 dchif_i = np.flipud(dchif_i)
91 dMf_r = np.flipud(dMf_r)
93 dchif_r = np.flipud(dchif_r)
101 return P_i*P_r*abs(Mf_mat*chif_mat), P_i, P_r
103""" compute P(dMf/Mfbar, dchif/chifbar). """
104def calc_sum(Mf, chif, v1, v2, P_Mfchif_i_interp_object, P_Mfchif_r_interp_object):
106 Pintg, P_i, P_r =
P_integrand(chif, Mf, v1, v2, P_Mfchif_i_interp_object, P_Mfchif_r_interp_object)
109""" gaussian filter of histogram """
111 return filter.gaussian_filter(P, sigma=2.0)
113""" generate prior samples in (Mf, chif) assuming uniform prior in component masses """
114def calc_Mfchif_prior_samples(comp_mass_prior_min, comp_mass_prior_max, comp_spin_min, comp_spin_max, Mf_bins, chif_bins, fit_formula, spin_angle_dist, N_sampl, thread):
117 m1_pr = np.random.uniform(comp_mass_prior_min, comp_mass_prior_max, N_sampl)
118 m2_pr = np.random.uniform(comp_mass_prior_min, comp_mass_prior_max, N_sampl)
121 if spin_angle_dist ==
'aligned':
122 chi1_pr = np.random.uniform(comp_spin_min, comp_spin_max, N_sampl)
123 chi2_pr = np.random.uniform(comp_spin_min, comp_spin_max, N_sampl)
125 elif spin_angle_dist ==
'isotropic':
126 chi1_pr = np.random.uniform(comp_spin_min, comp_spin_max, N_sampl)*np.random.uniform(-1., 1., N_sampl)
127 chi2_pr = np.random.uniform(comp_spin_min, comp_spin_max, N_sampl)*np.random.uniform(-1., 1., N_sampl)
132""" calculate the prior distribution in (Mf, chif) assuming uniform prior in component masses """
133def calc_Mfchif_prior(comp_mass_prior_min, comp_mass_prior_max, comp_spin_min, comp_spin_max, Mf_bins, chif_bins, fit_formula, spin_angle_dist, N_sampl, num_threads):
136 if comp_mass_prior_min < 1.
or comp_mass_prior_min > 1000.:
raise ValueError(
"comp_mass_prior_min should be in the interval [1, 1000]")
137 if comp_mass_prior_max < 1.
or comp_mass_prior_max > 1000.:
raise ValueError(
"comp_mass_prior_max should be in the interval [1, 1000]")
138 if comp_mass_prior_max <= comp_mass_prior_min :
raise ValueError(
"comp_mass_prior_max should be greater than comp_mass_prior_min")
139 if N_sampl < 1:
raise ValueError(
"N_sampl should be greater than 1")
140 if comp_spin_max < comp_spin_min:
raise ValueError(
"comp_spin_max should be greater than comp_spin_min")
141 if spin_angle_dist ==
'aligned':
142 if comp_spin_min < -1.
or comp_spin_min > 1.:
raise ValueError(
"comp_spin_min should be in the interval [-1, 1] for the case of aligned spin distributions")
143 if comp_spin_max < -1.
or comp_spin_max > 1.:
raise ValueError(
"comp_spin_max should be in the interval [-1, 1] for the case of aligned spin distributions")
144 elif spin_angle_dist ==
'isotropic':
145 if comp_spin_min < 0.
or comp_spin_min > 1.:
raise ValueError(
"comp_spin_min should be in the interval [0, 1] for the case of isotrpic spin distributions")
146 if comp_spin_max < 0.
or comp_spin_max > 1.:
raise ValueError(
"comp_spin_max should be in the interval [0, 1] for the case of isotrpic spin distributions")
148 raise ValueError(
"spin_angle_dist should be 'aligned' or 'isotropic'")
152 thread_vec = range(num_threads)
153 N_sampl =
int(N_sampl/num_threads)
154 p = Pool(num_threads)
155 func = partial(calc_Mfchif_prior_samples, comp_mass_prior_min, comp_mass_prior_max, comp_spin_min, comp_spin_max, Mf_bins, chif_bins, fit_formula, spin_angle_dist, N_sampl)
156 final_params = p.map(func, thread_vec)
160 final_params = np.array(final_params)
161 final_params.reshape(N_sampl*num_threads, 2)
162 Mf_pr = np.ravel(final_params[:,0])
163 chif_pr = np.ravel(final_params[:,1])
166 P_Mfchif_pr, Mf_bins, chif_bins = np.histogram2d(Mf_pr, chif_pr, bins=(Mf_bins, chif_bins), density=
True)
P_Mfchif_i_interp_object
compute the posterior of (delta_Mf/Mf, delta_chif/chif)
def calc_final_mass_spin(m1, m2, chi1, chi2, chi1z, chi2z, phi12, fit_formula)
calculate the mass and spin of the final black hole using an NR-inspired fitting formula Calculate th...
def calc_Mfchif_prior(comp_mass_prior_min, comp_mass_prior_max, comp_spin_min, comp_spin_max, Mf_bins, chif_bins, fit_formula, spin_angle_dist, N_sampl, num_threads)
def P_integrand(chif, Mf, v1, v2, P_Mfchif_i_interp_object, P_Mfchif_r_interp_object)
Compute the integrand of P(dMf/Mfbar, dchif/chifbar).
def calc_Mfchif_prior_samples(comp_mass_prior_min, comp_mass_prior_max, comp_spin_min, comp_spin_max, Mf_bins, chif_bins, fit_formula, spin_angle_dist, N_sampl, thread)
def calc_sum(Mf, chif, v1, v2, P_Mfchif_i_interp_object, P_Mfchif_r_interp_object)