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

27 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-05-02 08:42 +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 get_cosmology 

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, 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) 

78 

79 

80options.update( 

81 { 

82 "uniform_in_comoving_volume": ( 

83 uniform_in_comoving_volume_from_uniform_in_volume 

84 ) 

85 } 

86)