Coverage for pesummary/gw/reweight.py: 66.7%
27 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-12-09 22:34 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-12-09 22:34 +0000
1# Licensed under an MIT style license -- see LICENSE.md
3from ..utils.utils import logger
4from ..core.reweight import rejection_sampling, options
5from .cosmology import get_cosmology
7__author__ = ["Charlie Hoy <charlie.hoy@ligo.org>"]
10def uniform_in_comoving_volume_from_uniform_in_volume(
11 samples, redshift_method="exact", cosmology="Planck15", convert_kwargs={},
12 star_formation_rate_power=0, **kwargs
13):
14 """Resample a table of posterior distributions from a uniform in volume
15 distance prior to a uniform in comoving volume distance prior. For details
16 see Appendix C of https://arxiv.org/abs/2010.14527
18 Parameters
19 ----------
20 samples: pesummary.utils.samples_dict.SamplesDict
21 table of posterior distributions you wish to resample
22 redshift_method: str, optional
23 method to use when generating a 'redshift' posterior distribution from
24 the 'luminosity_distance' posterior distribution. This is only used
25 when 'redshift' samples are not found in 'samples'. Default "exact"
26 cosmology: str, optional
27 cosmology you wish to use for reweighting. Default "Planck15"
28 covert_kwargs: dict, optional
29 kwargs to pass to pesummary.gw.conversions.dL_from_z when calculating
30 the 'luminosity_distance' posterior from the 'redshift' posterior
31 or kwargs to pass to pesummary.gw.conversions.z_from_dL* when
32 calculating the 'redshift' posterior from the 'luminosity_distance'
33 posterior
34 star_formation_rate_power: int, optional
35 power to use to include a star formation rate evolution. Default 0,
36 i.e. no evolution
37 """
38 import astropy.units as u
39 parameters = samples.keys()
40 if "redshift" not in parameters and "luminosity_distance" in parameters:
41 from pesummary.gw.conversions import Redshift
42 logger.info(
43 "Unable to find samples for 'redshift'. Calculating them from "
44 "the 'luminosity_distance' posterior distribution"
45 )
46 luminosity_distance = samples["luminosity_distance"]
47 redshift = getattr(Redshift.Distance, redshift_method)(
48 luminosity_distance, cosmology=cosmology, **convert_kwargs
49 )
50 elif "redshift" not in parameters:
51 raise ValueError(
52 "Unable to reweight to uniform in comoving volume prior because "
53 "unable to find samples for 'redshift' and 'luminosity_distance'"
54 )
55 elif "redshift" in parameters and "luminosity_distance" not in parameters:
56 from pesummary.gw.conversions import dL_from_z
57 logger.info(
58 "Unable to find samples for 'luminosity_distance'. Calculating "
59 "them from the 'redshift' posterior distribution"
60 )
61 redshift = samples["redshift"]
62 luminosity_distance = dL_from_z(
63 redshift, cosmology=cosmology, **convert_kwargs
64 )
65 else:
66 redshift = samples["redshift"]
67 luminosity_distance = samples["luminosity_distance"]
68 cosmology = get_cosmology(cosmology)
69 hubble_distance = (u.cds.c / cosmology.H0).to_value(unit=u.Mpc)
70 hubble_parameter = cosmology.efunc(redshift)
71 weights = 1.0 / (
72 (1 + redshift)**(2. - star_formation_rate_power) * (
73 hubble_parameter * (luminosity_distance / hubble_distance)
74 + (1. + redshift)**2.
75 )
76 )
77 return rejection_sampling(samples, weights)
80options.update(
81 {
82 "uniform_in_comoving_volume": (
83 uniform_in_comoving_volume_from_uniform_in_volume
84 )
85 }
86)