Source code for hierarc.Likelihood.SneLikelihood.sne_pantheon_plus
import os
import pandas as pd
import numpy as np
import hierarc
_PATH_2_DATA = os.path.join(os.path.dirname(hierarc.__file__), "Data", "SNe")
[docs]
class PantheonPlusData(object):
"""This class is a lightweight version of the Pantheon+ analysis presented in
`Pantheon+ likelihood`_.
The data covariances that are stored in hierArc are originally from `Pantheon+ Data products`_.
If you make use of these products, please cite `Brout et al. 2022`_
.. _Brout et al. 2022: https://ui.adsabs.harvard.edu/abs/2022arXiv220204077B/abstract
.. _Pantheon+ Data products: https://github.com/PantheonPlusSH0ES/DataRelease/tree/main/Pantheon%2B_Data/4_DISTANCES_AND_COVAR
.. _Pantheon+ likelihood: https://github.com/PantheonPlusSH0ES/DataRelease/blob/main/Pantheon%2B_Data/5_COSMOLOGY/cosmosis_likelihoods/Pantheon%2B_only_cosmosis_likelihood.py
"""
def __init__(self):
self._data_file = os.path.join(
_PATH_2_DATA, "Pantheon+SH0ES", "Pantheon+SH0ES.dat"
)
self._cov_file = os.path.join(
_PATH_2_DATA, "Pantheon+SH0ES", "Pantheon+SH0ES_STAT+SYS.cov"
)
data = pd.read_csv(self._data_file, delim_whitespace=True)
self.origlen = len(data)
self.ww = data["zHD"] > 0.01
self.zCMB = data["zHD"][
self.ww
].to_numpy() # use the vpec corrected redshift for zCMB
self.zHEL = data["zHEL"][self.ww].to_numpy()
self.m_obs = data["m_b_corr"][self.ww].to_numpy()
self.cov_mag_b = self.build_covariance()
[docs]
def build_covariance(self):
"""Run once at the start to build the covariance matrix for the data."""
filename = self._cov_file
# The file format for the covariance has the first line as an integer
# indicating the number of covariance elements, and the the subsequent
# lines being the elements.
# This function reads in the file and the nasty for loops trim down the covariance
# to match the only rows of data that are used for cosmology
f = open(filename)
line = f.readline()
n = int(len(self.zCMB))
C = np.zeros((n, n))
ii = -1
jj = -1
mine = 999
maxe = -999
for i in range(self.origlen):
jj = -1
if self.ww[i]:
ii += 1
for j in range(self.origlen):
if self.ww[j]:
jj += 1
val = float(f.readline())
if self.ww[i]:
if self.ww[j]:
C[ii, jj] = val
f.close()
return C