Source code for master_thesis_code.datamodels.emri_detection
"""EMRIDetection datamodel for Bayesian H₀ inference."""
from dataclasses import dataclass
import numpy as np
from master_thesis_code.constants import (
FRACTIONAL_LUMINOSITY_ERROR,
FRACTIONAL_MEASURED_MASS_ERROR,
TRUE_HUBBLE_CONSTANT,
)
from master_thesis_code.datamodels.galaxy import Galaxy
from master_thesis_code.physical_relations import dist, redshifted_mass
[docs]
@dataclass
class EMRIDetection:
"""A simulated EMRI detection with noisy measured observables.
Holds the LISA-measured quantities that enter the Bayesian H₀ likelihood.
All angular quantities use ecliptic coordinates.
Attributes:
measured_luminosity_distance: Measured luminosity distance :math:`\\hat{d}_L`
in Gpc.
measured_redshifted_mass: Measured redshifted central BH mass
:math:`\\hat{M}_z = M(1+z)` in solar masses.
measured_right_ascension: Measured sky azimuthal angle in radians.
measured_declination: Measured sky polar angle in radians.
"""
measured_luminosity_distance: float # Gpc
measured_redshifted_mass: float # solar masses
measured_right_ascension: float # radians
measured_declination: float # radians
[docs]
@classmethod
def from_host_galaxy(
cls,
host_galaxy: Galaxy,
use_measurement_noise: bool = True,
rng: np.random.Generator | None = None,
) -> "EMRIDetection":
if not use_measurement_noise:
measured_luminosity_distance = dist(host_galaxy.redshift, TRUE_HUBBLE_CONSTANT)
measured_redshifted_mass = redshifted_mass(
mass=host_galaxy.central_black_hole_mass,
redshift=host_galaxy.redshift,
)
else:
if rng is None:
rng = np.random.default_rng()
measured_luminosity_distance = float(
rng.normal(
loc=dist(host_galaxy.redshift, TRUE_HUBBLE_CONSTANT),
scale=FRACTIONAL_LUMINOSITY_ERROR
* dist(
host_galaxy.redshift,
TRUE_HUBBLE_CONSTANT,
),
)
)
measured_redshifted_mass = float(
rng.normal(
loc=redshifted_mass(
mass=host_galaxy.central_black_hole_mass,
redshift=host_galaxy.redshift,
),
scale=FRACTIONAL_MEASURED_MASS_ERROR
* redshifted_mass(
mass=host_galaxy.central_black_hole_mass,
redshift=host_galaxy.redshift,
),
)
)
return cls(
measured_luminosity_distance=measured_luminosity_distance,
measured_redshifted_mass=measured_redshifted_mass,
measured_right_ascension=host_galaxy.right_ascension,
measured_declination=host_galaxy.declination,
)