import numpy as np
import scipy.constants
from scipy.integrate import quad
import pycbc.cosmology
[docs]
def mg_to_lambda_g(mg):
'''
Convert graviton mass to Compton wavelength.
Parameters
----------
mg : float
Graviton mass in eV/c^2
Returns
-------
lambda_g : float
Compton wavelength of graviton in km
'''
h_eV_s, _, _ = scipy.constants.physical_constants['Planck constant in eV/Hz']
return h_eV_s / (mg / scipy.constants.c) / 1000 # convert from m to km
[docs]
def lambda_g_to_mg(lambda_g):
'''
Convert graviton Compton wavelength to mass.
Parameters
----------
lambda_g : float
Compton wavelength of graviton in km
Returns
-------
mg : float
Graviton mass in eV/c^2
'''
h_eV_s, _, _ = scipy.constants.physical_constants['Planck constant in eV/Hz']
lambda_g_m = lambda_g * 1000 # convert from km to m
return h_eV_s / (lambda_g_m / scipy.constants.c)
def _get_cosmology(cosmology=None, **kwargs):
return pycbc.cosmology.get_cosmology(cosmology=cosmology, **kwargs)
def _effective_distance_from_redshift(z, cosmo):
def integrand(zp):
return 1.0 / ((1.0 + zp)**2 * cosmo.efunc(zp))
integral, _ = quad(integrand, 0, z)
c_km_s = scipy.constants.c / 1000.0
return c_km_s * (1.0 + z) / cosmo.H0.value * integral
[docs]
def effective_distance(luminosity_distance, cosmology=None, **kwargs):
'''
Calculate effective distance D_eff for massive graviton phase correction.
D_eff = (1+z) * c / H0 * integral_0^z dz' / ((1+z')^2 * E(z'))
Parameters
----------
luminosity_distance : float
Luminosity distance to the source in Mpc
Returns
-------
deff : float
Effective distance in Mpc
'''
cosmo = _get_cosmology(cosmology=cosmology, **kwargs)
z = pycbc.cosmology.redshift(luminosity_distance, cosmology=cosmo)
return _effective_distance_from_redshift(z, cosmo)
[docs]
def mg_phase_correction(mg, distance, frequencies, cosmology=None, **kwargs):
'''
Calculate the massive graviton phase correction for given frequencies.
delta_phi = -pi * D_eff * c^3 * m_g^2 / h^2 / (1 + z) / f
Parameters
----------
mg : float
Graviton mass in eV/c^2
distance : float
Luminosity distance to the source in Mpc
frequencies : array-like
Array of frequencies in Hz
Returns
-------
delta_phi : array-like
Phase correction for each frequency in radians
'''
cosmo = _get_cosmology(cosmology=cosmology, **kwargs)
z = pycbc.cosmology.redshift(distance, cosmology=cosmo)
deff = _effective_distance_from_redshift(z, cosmo) * 1e6 * scipy.constants.parsec # in unit of m
c = scipy.constants.speed_of_light
h_eV_s, _, _ = scipy.constants.physical_constants['Planck constant in eV/Hz']
delta_phi = - np.pi * deff * mg**2 / c / h_eV_s**2 / (1 + z) / frequencies
return delta_phi