diff --git a/bilby/core/likelihood.py b/bilby/core/likelihood.py index 10feec20783621b55cd3a5928b0405a2e601dce3..e2b39142034cb6712fa12f919d49a4d589abf1c5 100644 --- a/bilby/core/likelihood.py +++ b/bilby/core/likelihood.py @@ -455,3 +455,7 @@ class JointLikelihood(Likelihood): def noise_log_likelihood(self): """ This is just the sum of the noise likelihoods of all parts of the joint likelihood""" return sum([likelihood.noise_log_likelihood() for likelihood in self.likelihoods]) + + +class MarginalizedLikelihoodReconstructionError(Exception): + pass diff --git a/bilby/gw/conversion.py b/bilby/gw/conversion.py index 3ee33ebb02effe58b9e4831ee644353a891d2aea..aeaa0c1b83ae31d8a36f30b3b70113bc7d9fe236 100644 --- a/bilby/gw/conversion.py +++ b/bilby/gw/conversion.py @@ -5,6 +5,7 @@ from tqdm import tqdm import numpy as np from pandas import DataFrame +from ..core.likelihood import MarginalizedLikelihoodReconstructionError from ..core.utils import logger, solar_mass from ..core.prior import DeltaFunction from .utils import lalsim_SimInspiralTransformPrecessingNewInitialConditions @@ -665,11 +666,20 @@ def _generate_all_cbc_parameters(sample, defaults, base_conversion, output_sample = fill_from_fixed_priors(output_sample, priors) output_sample, _ = base_conversion(output_sample) if likelihood is not None: - if (hasattr(likelihood, 'phase_marginalization') or - hasattr(likelihood, 'time_marginalization') or - hasattr(likelihood, 'distance_marginalization')): - generate_posterior_samples_from_marginalized_likelihood( - samples=output_sample, likelihood=likelihood) + if ( + hasattr(likelihood, 'phase_marginalization') or + hasattr(likelihood, 'time_marginalization') or + hasattr(likelihood, 'distance_marginalization') + ): + try: + generate_posterior_samples_from_marginalized_likelihood( + samples=output_sample, likelihood=likelihood) + except MarginalizedLikelihoodReconstructionError as e: + logger.warning( + "Marginalised parameter reconstruction failed with message " + "{}. Some parameters may not have the intended " + "interpretation.".format(e) + ) if priors is not None: for par, name in zip( ['distance', 'phase', 'time'], diff --git a/bilby/gw/likelihood.py b/bilby/gw/likelihood.py index 02bc2452e1548b47c6dc8e0b6d9f171689e4504c..44aef9cda01edd136c04689024056100ff98d91f 100644 --- a/bilby/gw/likelihood.py +++ b/bilby/gw/likelihood.py @@ -15,7 +15,7 @@ except ImportError: from scipy.misc import logsumexp from scipy.special import i0e -from ..core import likelihood +from ..core.likelihood import Likelihood, MarginalizedLikelihoodReconstructionError from ..core.utils import BilbyJsonEncoder, decode_bilby_json from ..core.utils import ( logger, UnsortedInterp2d, create_frequency_series, create_time_series, @@ -29,7 +29,7 @@ from .waveform_generator import WaveformGenerator from collections import namedtuple -class GravitationalWaveTransient(likelihood.Likelihood): +class GravitationalWaveTransient(Likelihood): """ A gravitational-wave transient likelihood object This is the usual likelihood object to use for transient gravitational @@ -395,8 +395,14 @@ class GravitationalWaveTransient(likelihood.Likelihood): time_post = time_post[keep] times = times[keep] - new_time = Interped(times, time_post).sample() - return new_time + if len(times) > 1: + new_time = Interped(times, time_post).sample() + return new_time + else: + raise MarginalizedLikelihoodReconstructionError( + "Time posterior reconstruction failed, at least two samples " + "are required." + ) def generate_distance_sample_from_marginalized_likelihood( self, signal_polarizations=None): @@ -712,7 +718,7 @@ class GravitationalWaveTransient(likelihood.Likelihood): lal_version=self.lal_version) -class BasicGravitationalWaveTransient(likelihood.Likelihood): +class BasicGravitationalWaveTransient(Likelihood): def __init__(self, interferometers, waveform_generator): """