Source code for ligo.skymap.postprocess.cosmology

#
# Copyright (C) 2013-2024  Leo Singer, Rainer Corley
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
"""Cosmology-related utilities.

All functions in this module use the Planck15 cosmological parameters.
"""

import numpy as np
from astropy.cosmology import Planck15 as cosmo, z_at_value
import astropy.units as u


[docs] def dDL_dz_for_z(z): """Derivative of luminosity distance with respect to redshift.""" Ok0 = cosmo.Ok0 DH = cosmo.hubble_distance DC_by_DH = (cosmo.comoving_distance(z) / DH).value if Ok0 == 0.0: ret = 1.0 elif Ok0 > 0.0: ret = np.cosh(np.sqrt(Ok0) * DC_by_DH) else: # Ok0 < 0.0 or Ok0 is nan ret = np.cos(np.sqrt(-Ok0) * DC_by_DH) ret *= (1 + z) * DH * cosmo.inv_efunc(z) ret += cosmo.comoving_transverse_distance(z) return ret
[docs] def dVC_dVL_for_z(z): r"""Ratio, :math:`\mathrm{d}V_C / \mathrm{d}V_L`, between the comoving volume element and a naively Euclidean volume element in luminosity distance space; given as a function of redshift. Given the differential comoving volume per unit redshift, :math:`\mathrm{d}V_C / \mathrm{d}z`, and the derivative of luminosity distance in terms of redshift, :math:`\mathrm{d}D_L / \mathrm{d}z`, this is expressed as: .. math:: \frac{\mathrm{d}V_C}{\mathrm{d}V_L} = \frac{\mathrm{d}V_C}{\mathrm{d}z} \left( {D_L}^2 \frac{\mathrm{d}D_L}{\mathrm{d}z} \right)^{-1}. """ Ok0 = cosmo.Ok0 DH = cosmo.hubble_distance DM_by_DH = (cosmo.comoving_transverse_distance(z) / DH).value DC_by_DH = (cosmo.comoving_distance(z) / DH).value zplus1 = z + 1.0 if Ok0 == 0.0: ret = 1.0 elif Ok0 > 0.0: ret = np.cosh(np.sqrt(Ok0) * DC_by_DH) else: # Ok0 < 0.0 or Ok0 is nan ret = np.cos(np.sqrt(-Ok0) * DC_by_DH) ret *= zplus1 ret += DM_by_DH * cosmo.efunc(z) ret *= np.square(zplus1) return 1.0 / ret
@np.vectorize def z_for_DL(DL): """Redshift as a function of luminosity distance in Mpc.""" return z_at_value(cosmo.luminosity_distance, DL * u.Mpc).to_value( u.dimensionless_unscaled)
[docs] def dVC_dVL_for_DL(DL): """Same as :meth:`dVC_dVL_for_z`, but as a function of luminosity distance. """ return dVC_dVL_for_z(z_for_DL(DL))