import numpy as np
import os
import bilby.core.prior
from bilby.core.prior import PriorDict
import redback.model_library
from redback.utils import logger
[docs]def get_priors(model, times=None, y=None, yerr=None, dt=None, **kwargs):
"""
Get the prior for the given model. If the model is a prompt model, the times, y, and yerr must be provided.
:param model: String referring to a name of a model implemented in Redback.
:param times: Time array
:param y: Y values, arbitrary units
:param yerr: Error on y values, arbitrary units
:param dt: time interval
:param kwargs: Extra arguments to be passed to the prior function
:return: priors: PriorDict object
"""
prompt_prior_functions = dict(gaussian=get_gaussian_priors, skew_gaussian=get_skew_gaussian_priors,
skew_exponential=get_skew_exponential_priors, fred=get_fred_priors,
fred_extended=get_fred_extended_priors)
if model in redback.model_library.modules_dict['prompt_models']:
if times is None:
times = np.array([0, 100])
if y is None:
y = np.array([1, 1e6])
if yerr is None:
yerr = np.array([1, 1e3])
if dt is None:
dt = np.ones(len(times))
rate = y * dt
priors = prompt_prior_functions[model](times=times, y=rate, yerr=yerr)
priors['background_rate'] = bilby.core.prior.LogUniform(minimum=np.min(rate), maximum=np.max(rate),
name='background_rate')
return priors
priors = PriorDict()
try:
filename = os.path.join(os.path.dirname(__file__), 'priors', f'{model}.prior')
priors.from_file(filename)
except FileNotFoundError as e:
logger.warning(e)
logger.warning('Returning empty PriorDict.')
return priors
[docs]def get_prompt_priors(model, times, y, yerr, **kwargs):
if model == 'gaussian':
get_gaussian_priors(times=times, y=y, yerr=yerr, **kwargs)
[docs]def get_gaussian_priors(times, y, yerr, **kwargs):
dt = np.min(np.diff(times))
duration = times[-1] - times[0]
priors = bilby.core.prior.PriorDict()
priors['amplitude'] = bilby.core.prior.LogUniform(minimum=np.min(yerr), maximum=np.max(y),
name='amplitude', latex_label=r'$A$')
priors['sigma'] = bilby.core.prior.LogUniform(minimum=3*dt, maximum=duration, name="sigma", latex_label=r"$\sigma$")
priors['t_0'] = bilby.core.prior.Uniform(minimum=times[0], maximum=times[-1], name="t_0", latex_label=r"$t_0$")
return priors
[docs]def get_skew_gaussian_priors(times, y, yerr, **kwargs):
priors = get_gaussian_priors(times=times, y=y, yerr=yerr, **kwargs)
for latex_label, part in zip([r"$\sigma_{\mathrm{rise}}$" r"$\sigma_{\mathrm{rise}}$"], ['rise', 'fall']):
priors[f'sigma_{part}'] = bilby.core.prior.LogUniform(
minimum=priors['sigma'].minimum, maximum=priors['sigma'].maximum,
name=f"sigma_{part}", latex_label=latex_label)
del priors['sigma']
return priors
[docs]def get_skew_exponential_priors(times, y, yerr, **kwargs):
priors = get_gaussian_priors(times=times, y=y, yerr=yerr, **kwargs)
for latex_label, part in zip([r"$\tau_{\mathrm{rise}}$" r"$\tau_{\mathrm{rise}}$"], ['rise', 'fall']):
priors[f'tau_{part}'] = bilby.core.prior.LogUniform(
minimum=priors['sigma'].minimum, maximum=priors['sigma'].maximum,
name=f"tau_{part}", latex_label=latex_label)
del priors['sigma']
return priors
[docs]def get_fred_priors(times, y, yerr, **kwargs):
priors = bilby.core.prior.PriorDict()
priors['amplitude'] = bilby.core.prior.LogUniform(minimum=np.min(yerr), maximum=np.max(y),
name='amplitude', latex_label=r'$A$')
priors['tau'] = bilby.core.prior.Uniform(minimum=1e-3, maximum=1e3, name="t_0", latex_label=r"$t_0$")
priors['psi'] = bilby.core.prior.Uniform(minimum=1e-3, maximum=1e3, name=r"\psi")
priors['delta'] = bilby.core.prior.Uniform(minimum=times[0], maximum=times[-1], name=r"\delta")
return priors
[docs]def get_fred_extended_priors(times, y, yerr, **kwargs):
priors = get_fred_priors(times=times, y=y, yerr=yerr, **kwargs)
priors['gamma'] = bilby.core.prior.LogUniform(minimum=1e-3, maximum=1e3, name=r"$\gamma$")
priors['nu'] = bilby.core.prior.LogUniform(minimum=1e-3, maximum=1e3, name=r"$\nu")