From 3e9ddb5efb7d95bc8ea2b42632460344ffbc3dba Mon Sep 17 00:00:00 2001 From: Gregory Ashton <gregory.ashton@ligo.org> Date: Sun, 1 Dec 2019 19:13:55 -0600 Subject: [PATCH] Add a safety check to the time reconstruction If the time reconstruction fails. This returns a NaN rather than breaking the run. --- bilby/core/likelihood.py | 4 ++++ bilby/gw/conversion.py | 20 +++++++++++++++----- bilby/gw/likelihood.py | 16 +++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/bilby/core/likelihood.py b/bilby/core/likelihood.py index 10feec207..e2b391420 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 3ee33ebb0..aeaa0c1b8 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 02bc2452e..44aef9cda 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): """ -- GitLab