Source code for phazap.pe_input

import numpy as np
import pandas as pd

_required_parameters = [
    "mass_1",
    "mass_2",
    "a_1",
    "a_2",
    "tilt_1",
    "tilt_2",
    "phi_12",
    "phi_jl",
    "luminosity_distance",
    "theta_jn",
    "phase", 
    "ra",
    "dec",
    "geocent_time",
    "psi",
]

[docs] class ParameterEstimationInput():
[docs] def __init__( self, posterior_samples, reference_frequency, sampling_frequency, duration, waveform_approximant, ifo_list, ): """ A class to store the input for parameter estimation Parameters ---------- posterior_samples: dict A dictionary of posterior samples reference_frequency: float Reference frequency chosen for this set of samples sampling_frequency: float Sampling frequency duration: float Duration waveform_approximant: str Waveform approximant ifo_list: list List of interferometers Returns ------- ParameterEstimationInput The ParameterEstimationInput instance """ self.posterior_samples = posterior_samples self.reference_frequency = reference_frequency self.sampling_frequency = sampling_frequency self.duration = duration self.waveform_approximant = waveform_approximant self.ifo_list = ifo_list
[docs] @classmethod def from_bilby_result_file(cls, result_file): """ Load the parameter estimation input from a bilby result file Parameters ---------- result_file: str Path to the result file Returns ------- ParameterEstimationInput The ParameterEstimationInput instance """ import bilby import bilby_pipe r = bilby.result.read_in_result(result_file) # Extract run information fref = r.meta_data["likelihood"]["waveform_arguments"]["reference_frequency"] fs = r.meta_data["likelihood"]["sampling_frequency"] duration = r.meta_data["likelihood"]["duration"] waveform_approximant = r.meta_data["likelihood"]["waveform_arguments"]["waveform_approximant"] if r.meta_data["command_line_args"]["sampler"] == "parallel_bilby": ifos = r.meta_data["config_file"]["detectors"] else: ifos = bilby_pipe.utils.convert_detectors_input(r.meta_data["command_line_args"]["detectors"]) # Extract only the parameters that we need posterior_samples = pd.DataFrame({p: r.posterior[p].to_numpy() for p in _required_parameters}) return cls( posterior_samples, fref, fs, duration, waveform_approximant, ifos, )
[docs] @classmethod def from_PESummary_file(cls, hdf5_file): """ Load the parameter estimation input from a PESummary hdf5 file Parameters ---------- hdf5_file: str Path to the PESummary file Returns ------- ParameterEstimationInput The ParameterEstimationInput instance """ # TODO: Re-write the whole thing to actually NOT use PESummary because it is just SLOW from pesummary.io import read r = read(hdf5_file, package="gw") # There could be multiple datasets present in the file _available_dataset = sorted([k for k in r.pe_algorithm.keys() if "Mixed" not in k]) # Prefer IMRPhenom-family waveform over EOB-family waveform _tag = _available_dataset[0] if r.pe_algorithm[_tag] == "bilby" or "bilby" in str(r.config[_tag]): # Bilby fref = float(r.config[_tag]["config"]["reference-frequency"]) waveform_approximant = r.config[_tag]["config"]["waveform-approximant"] fs = float(r.config[_tag]["config"]["sampling-frequency"]) duration = float(r.config[_tag]["config"]["duration"]) ifos = eval(r.config[_tag]["config"]["detectors"]) elif r.pe_algorithm[_tag] == "lalinference" or "lalinference" in str(r.config[_tag]): # LALInference fref = float(r.config[_tag]["engine"]["fref"]) fs = float(r.config[_tag]["engine"]["srate"]) duration = float(r.config[_tag]["engine"]["seglen"]) waveform_approximant = r.config[_tag]["engine"]["approx"] if "pseudo" in waveform_approximant: import lalsimulation # Genius waveform_approximant = \ lalsimulation.GetStringFromApproximant(lalsimulation.GetApproximantFromString(waveform_approximant)) ifos = eval(r.config[_tag]["analysis"]["ifos"]) else: raise ValueError("Cannot parse the input file") # Extract only the parameters that we need # WARNING: PESummary is VERY slow for whatever reason # You know what, let us just load the file again with h5py import h5py f = h5py.File(hdf5_file, "r") posterior_samples = {p: np.array(f[_tag]["posterior_samples"][p]) for p in _required_parameters} f.close() return cls( posterior_samples, fref, fs, duration, waveform_approximant, ifos, )