Coverage for pesummary/gw/reweight.py: 100.0%

26 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2025-11-05 13:38 +0000

1# Licensed under an MIT style license -- see LICENSE.md 

2 

3from ..utils.utils import logger 

4from ..core.reweight import rejection_sampling, options 

5from .cosmology import hubble_distance, hubble_parameter 

6 

7__author__ = ["Charlie Hoy <charlie.hoy@ligo.org>"] 

8 

9 

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 

17 

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 hd = hubble_distance(cosmology) 

69 hp = hubble_parameter(cosmology, redshift) 

70 weights = 1.0 / ( 

71 (1 + redshift)**(2. - star_formation_rate_power) * ( 

72 hp * (luminosity_distance / hd) 

73 ) + (1. + redshift)**2. 

74 ) 

75 return rejection_sampling(samples, weights) 

76 

77 

78options.update( 

79 { 

80 "uniform_in_comoving_volume": ( 

81 uniform_in_comoving_volume_from_uniform_in_volume 

82 ) 

83 } 

84)