Spin-aligned waveforms IMRPhenomXHM and SEOBNRv4HM_ROM unable to recover injected parameters

Hello,
I am studying EOB waveforms SEOBNRv4HM_ROM, but I’ve found something weird. I injected a GW190521-like signal and used Bilby to perform parameter estimation. I only estimated four parameters: chirp mass, mass ratio, luminosity distance, and theta_jn, while all other parameters are fixed to the injected values. Specifically, I generated and injected signal using IMRPhenomXPHM, IMRPhenomXHM, and SEOBNRv4HM_ROM, and then conducted estimation using the same templates. However, while IMRPhenomXPHM successfully recovered the signal, the other two waveforms failed to do so. The posterior distribution of IMRPhenomXHM displayed discrete peaks, while SEOBNRv4HM_ROM deviated from the injected parameters at all, with its posterior seems “sticking to the edges of the prior range”.

The following figures are the results of these three analyses.


Fig.1 The result of IMRPhenomXHM

Fig.2 The result of IMRPhenomXPHM

Fig.3 The result of SEOBNRv4HM_ROM

Fig.4 The reconstructed waveform of SEOBNRv4HM_ROM at H1
One can find that it didn’t manage to recover the injected waveform

The following is my Python script for SEOBNRv4HM_ROM and its priors. I generally followed the fast tutorial.

import bilby
import numpy as np

duration = 8.0
sampling_frequency = 1024.0

outdir = "outdir2"
label = "fast_tutorial"
bilby.core.utils.setup_logger(outdir=outdir, label=label)
trigger_time = 1242442967.459473

np.random.seed(88170235)

injection_parameters = dict(
    chirp_mass = 63.0,
    mass_ratio = 0.63,
    chi_1 = -0.37,
    chi_2 = 0.19,
    theta_jn = 1.13,
    luminosity_distance = 2000.0, 
    phase = 3.78,
    psi = 2.38,
    ra = 3.6,
    dec = -0.7,
    geocent_time = 1242442967.459473,
)

waveform_arguments = dict(
    waveform_approximant="SEOBNRv4HM_ROM",
    reference_frequency=10.0,
    minimum_frequency=10.0,
)

waveform_generator = bilby.gw.WaveformGenerator(
    duration=duration,
    sampling_frequency=sampling_frequency,
    frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole,
    parameter_conversion=bilby.gw.conversion.convert_to_lal_binary_black_hole_parameters,
    waveform_arguments=waveform_arguments,
)

ifos = bilby.gw.detector.InterferometerList(["H1", "L1","V1"])
ifos.set_strain_data_from_power_spectral_densities(
    sampling_frequency=sampling_frequency,
    duration=duration,
    start_time=injection_parameters["geocent_time"] - 6,
)

ifos.inject_signal(
    waveform_generator=waveform_generator, parameters=injection_parameters
)

priors = bilby.gw.prior.BBHPriorDict("fast_aligned_spins_bbh.prior")

likelihood = bilby.gw.GravitationalWaveTransient(
    interferometers=ifos,
    waveform_generator=waveform_generator,
)

result = bilby.run_sampler(
    likelihood=likelihood,
    priors=priors,
    sampler="dynesty",
    nlive=1000,
    maxmcmc=5000,
    check_point_delta_t = 1800,
    injection_parameters=injection_parameters,
    outdir=outdir,
    label=label,
    result_class=bilby.gw.result.CBCResult,
)

# Plot the inferred waveform superposed on the actual data.
result.plot_waveform_posterior(n_samples=1000)

# Make a corner plot.
result.plot_corner(save=True)

####THE PRIOR####
### I mixed them into one box ###

mass_1 = Constraint(name='mass_1', minimum=5, maximum=100)
mass_2 = Constraint(name='mass_2', minimum=5, maximum=100)
mass_ratio = bilby.gw.prior.UniformInComponentsMassRatio(name='mass_ratio', minimum=0.125, maximum=1)
chirp_mass = bilby.gw.prior.UniformInComponentsChirpMass(name='chirp_mass', minimum=25, maximum=100)
luminosity_distance = bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1e2, maximum=5e3)
dec = 0.7
ra = 3.6
theta_jn = Sine(name='theta_jn')
psi = 2.38
phase = 3.78
chi_1 = -0.37
chi_2 = 0.19
geocent_time = 1242442967.459473

The following is my Python script for IMRPhenomXPHM (and IMRPhenomXHM, I used the same script)

import bilby

duration = 8.0
sampling_frequency = 1024.0
minimum_frequency = 10

outdir = "outdir3"
label = "fast_tutorial"
bilby.core.utils.setup_logger(outdir=outdir, label=label)

bilby.core.utils.random.seed(88170235)

injection_parameters = dict(
    chirp_mass=63,
    mass_ratio=0.63,
    a_1 = 0.79,
    a_2 = 0.63,
    tilt_1 = 2.06,
    tilt_2 = 1.26,
    phi_12 = 3.41,
    phi_jl = 2.85,
    luminosity_distance=4300.0,
    theta_jn=1.13,
    psi=2.38,
    phase=3.78,
    geocent_time=1242442967.459473,
    ra=3.6,
    dec=-0.7,
)

waveform_arguments = dict(
    waveform_approximant="IMRPhenomXPHM",
    reference_frequency=10.0,
    minimum_frequency=minimum_frequency,
)

waveform_generator = bilby.gw.WaveformGenerator(
    duration=duration,
    sampling_frequency=sampling_frequency,
    frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole,
    parameter_conversion=bilby.gw.conversion.convert_to_lal_binary_black_hole_parameters,
    waveform_arguments=waveform_arguments,
)

ifos = bilby.gw.detector.InterferometerList(["H1", "L1"])
ifos.set_strain_data_from_power_spectral_densities(
    sampling_frequency=sampling_frequency,
    duration=duration,
    start_time=injection_parameters["geocent_time"] - 6,
)
ifos.inject_signal(
    waveform_generator=waveform_generator, parameters=injection_parameters
)

priors = bilby.gw.prior.BBHPriorDict(aligned_spin=False) # True for IMRPhenomXHM
for key in [
    "a_1",
    "a_2",
    "tilt_1",
    "tilt_2",
    "phi_12",
    "phi_jl",
    "psi",
    "ra",
    "dec",
    "geocent_time",
    "phase",
]:
    priors[key] = injection_parameters[key]

priors.validate_prior(duration, minimum_frequency)

likelihood = bilby.gw.GravitationalWaveTransient(
    interferometers=ifos, waveform_generator=waveform_generator
)

result = bilby.run_sampler(
    likelihood=likelihood,
    priors=priors,
    sampler="dynesty",
    npoints=1000,
    maxmcmc=5000,
    injection_parameters=injection_parameters,
    outdir=outdir,
    label=label,
    result_class=bilby.gw.result.CBCResult,
)

result.plot_waveform_posterior(n_samples=1000)

result.plot_corner(save=True)

In my analyses, spin-aligned waveforms seem to perform worse and are not capable enough to recover injected waveforms. I suppose I missed something important when performing spin-aligned injection analysis, but I have no idea what they are. =(

Besides, I tried the example eccentric_inspiral.py and failed to recover the injected parameters as well. Therefore I suppose it is a problem related to spin-aligned waveform rather than merely IMRPhenomXHM and SEOBNRv4HM_ROM

Thanks!