"""Public module for drawing population parameters."""
import numpy as np
[docs]def draw_disk_unbinding_efficiency(output_shape=None):
"""Set the disk unbinding efficiency.
The unbinding efficiency is drawn from a uniform distribution over the
range of values encountered in the literature of long-term GRMHD simulations
of the remnant accretion disk around a neutron star merger remnant. See
the paper for references to Metzger et al. 2008; Siegel & Metzger 2018;
Miller et al. 2019; Fernández et al. 2019.
Parameters
-----------
output_shape: float or tuple
The shape/size of the efficiency values to draw.
Returns
--------
disk_unbinding_efficiency: float or ndarray
The fraction of matter unbound from the accretion disk contributing
to the total radiating ejecta mass of the kilonova.
"""
disk_unbinding_efficiency = np.random.uniform(0.1, 0.4, size=output_shape)
return disk_unbinding_efficiency
[docs]def draw_viewing_angle(output_shape=None):
"""Set the observer viewing-angle.
Function draw the observer angle at which the kilonovae is observed. This
is drawn assuming uniform distribution of binary orbital plane alignment in
the Universe and making the equivalence of the observer angle and the polar
angle of the kNe, due to assumed axisymmetry about the normal axis to the
binary merger plane.
Parameters
-----------
output_shape: float or tuple
The shape/size of the array to be created of viewing_angles
Returns
--------
viewing_angle: float or ndarray
The observer viewing angle, i.e., inclination, with respect to the
binary merger plane.
"""
# Viewing angle compute as a uniform distribution over the half-sphere due
# to planar symmetry of the viewing angle in our model.
viewing_angle = np.arccos(1.0 - np.random.random_sample(size=output_shape))
# in radians
return viewing_angle
[docs]def draw_mass_from_EOS_bounds(maximum_mass_bound, mass_lower_bound=1.0, output_shape=None):
"""Sample a uniform distribution for the mass.
Parameters
-----------
maximum_mass_bound: float
The maximum mass from which to draw the distribution. Typically,
this is the TOV mass associated with the EOS. [solar masses]
mass_lower_bound: float
The minimum mass of the distribution, default 1.0 [solar mass].
output_shape: float or tuple
The number and array shaping structure for the draws.
Returns
--------
source_frame_grav_mass: float
The gravitational mass of the neutron star in the source frame.
"""
source_frame_grav_mass = np.random.uniform(low=mass_lower_bound,
high=maximum_mass_bound,
size=output_shape)
return source_frame_grav_mass
[docs]def draw_masses_from_EOS_bounds_with_mass_ratio_cut(
maximum_mass_bound, mass_lower_bound=1.0, mass_ratio_cut=(2.0/5.0), output_shape=None
):
"""
Draw neutron star component mass in the source frame given constraints.
Draw the neutron star component masses assuming a uniform prior over
the range of masses, as used by LIGO's BNS compact binary waveform search,
but with a maximum mass set by the chosen EOS.
Parameters
-----------
maximum_mass_bound: float
The maximum TOV mass for the given EOS.
mass_lower_bound: float
The lower bound on the allowable mass of the neutron star.
mass_ratio_cut: float
The mass ratio constraint to apply to the mass sampling.
output_shape: float or tuple
The number and array shaping structure for the draws of masses.
Returns
---------------------
mass1: float
The source-frame gravitational mass of the first neutron star
[solar masses].
mass2: float
The source-frame gravitational mass of the second neutron star
[solar masses].
"""
mass1 = draw_mass_from_EOS_bounds(maximum_mass_bound,
mass_lower_bound=mass_lower_bound,
output_shape=output_shape)
mass2 = draw_mass_from_EOS_bounds(mass1,
mass_lower_bound=np.clip(mass1*mass_ratio_cut, a_min=1.0, a_max=None),
output_shape=output_shape)
return mass1, mass2