Component spin models

We investigate potential features in the underlying binary black hole component spin magnitude and tilt angle distributions using several different models.

Beta + Mixture betaplusmixture-image

Following the GWTC-3 Rates and Populations paper, our simplest approach is to model the spin magnitudes \(\chi_i\) as a beta distribution and the cosines of the spin tilt angles \(\cos\theta_i\) as a mixture between aligned and isotropic subpopulations:

\[p(\chi | \alpha, \beta) \propto \chi^{1-\alpha} \, (1-\chi)^{1-\beta}\]

and

\[p(\cos\theta|f_\mathrm{iso},\sigma_t) = \frac{f_\mathrm{iso}}{2} + (1-f_\mathrm{iso}){\mathcal {N}}_{[-1,1]}(\cos\theta|1,\sigma_t)\,.\]

Here the isotropic subpopulation is uniform over \(\cos\theta_i \in [-1,1]\) and the aligned spin population is a truncated half gaussian \(\mathcal{N}\) peaking at \(\cos\theta_i = 1\) with a width \(\sigma_t\).

This model can be rerun as follows:

$ conda activate gwtc3-spin-studies
$ cd code/emceeCode/
$ python run_beta_plus_mixture.py

The output will be a .json file storing the resulting posterior samples:

data/component_spin_betaPlusMixture.json

Note

A notebook that demonstrates how to load in, inspect, and manipulate this output file can be found here.

Beta + Truncated Mixture betaplustruncmixture-image

Here, we keep the same \(\chi_i\) distribution as in Beta Plus Mixture but add a lower truncation bound \(z_\mathrm{min}\) to the \(\cos\theta_i\) distribution:

\[p(\cos\theta|f_\mathrm{iso},\sigma_t,z_\mathrm{min}) = \frac{f_\mathrm{iso}}{1-z_\mathrm{min}} + (1-f_\mathrm{iso}){\mathcal {N}}_{[z_\mathrm{min},1]}(\cos\theta|1,\sigma_t)\,.\]

This model can be rerun as follows:

$ conda activate gwtc3-spin-studies
$ cd code/emceeCode/
$ python run_beta_plus_truncated_mixture.py

The output will be a .json file storing the resulting posterior samples:

data/component_spin_betaPlusTruncatedMixture.json

Note

A notebook that demonstrates how to load in, inspect, and manipulate this output file can be found here.

Beta Spike + Mixture betaspikeplusmixture-image

Here, we keep the same \(\cos\theta_i\) distribution as in Beta Plus Mixture but add a spike to the \(\chi_i\) distribution. This spike is a truncated half-gaussian centered at \(\chi=0\):

\[p(\chi | \alpha, \beta, f_\mathrm{spike}, \epsilon_\mathrm{spike}) = f_\mathrm{spike}{\mathcal {N}}_{[0,1]}(\chi|0,\epsilon_\mathrm{spike}) + \frac{1-f_\mathrm{spike}}{c(\alpha,\beta)} \chi_i^{1-\alpha} \, (1-\chi_i)^{1-\beta}\]

where \(f_\mathrm{spike}\) is the fraction of the population in the spike, \(\epsilon_\mathrm{spike}\) is the width of the spike, and \(c(\alpha,\beta)\) is a normalization factor for the beta distribution (not a hyperparameter).

This model can be rerun as follows:

$ conda activate gwtc3-spin-studies
$ cd code/emceeCode/
$ python run_beta_spike_plus_mixture.py

The output will be a .json file storing the resulting posterior samples:

data/component_spin_betaSpikePlusMixture.json

Note

A notebook that demonstrates how to load in, inspect, and manipulate this output file can be found here.

Beta Spike + Truncated Mixture betaspikeplustruncmixture-image

In our model with the most features, we use \(\chi_i\) distribution from Beta Spike Plus Mixture and the \(\cos\theta_i\) distribution from Beta Plus Truncated Mixture.

This model can be rerun as follows:

$ conda activate gwtc3-spin-studies
$ cd code/emceeCode/
$ python run_beta_spike_plus_truncated_mixture.py

The output will be a .json file storing the resulting posterior samples:

data/component_spin_betaSpikePlusTruncatedMixture.json

Note

A notebook that demonstrates how to load in, inspect, and manipulate this output file can be found here.

emceeCode.posteriors.betaPlusMixture(c, sampleDict, injectionDict, priorDict)[source]

Implementation of the Beta+Mixture model: a component spin distribution with spin magnitude as a beta distribution and the cosine of the tilt angle as a mixture of aligned + isotropic, for inference within emcee.

Parameters
  • c (numpy.array) –

    array containing hyper-parameter samples in the order: [ mu_chi, sigma_chi, MF_cost, sigma_cost, Bq ] where

    • mu_chi = mean of spin magnitude beta distribution

    • sigma_chi = std. dev. of spin magnitude beta distribution

    • MF_cost = mixing fraction in aligned spin subpopulation for cos tilt angle distribution

    • sigma_cost = std. dev. of aligned spin subpopulation for cos tilt angle distribution

    • Bq = power law slope of the mass ratio distribution

  • sampleDict (dict) – Precomputed dictionary containing posterior samples for each event in our catalog

  • injectionDict (dict) – Precomputed dictionary containing successfully recovered injections

  • priorDict (dict) – Precomputed dictionary containing bounds for the priors on each hyper-parameter

Returns

logP – log posterior for the input sample ‘c’

Return type

float

emceeCode.posteriors.betaPlusTruncatedMixture(c, sampleDict, injectionDict, priorDict)[source]

Implementation of the Beta+TruncatedMixture model: a component spin distribution with spin magnitude as a beta distribution and the cosine of the tilt angle as a mixture of aligned + isotropic with a lower truncation, for inference within emcee.

Parameters
  • c (numpy.array) –

    array containing hyper-parameter samples in the order: [ mu_chi, sigma_chi, MF_cost, sigma_cost, cost_min, Bq ] where

    • mu_chi = mean of spin magnitude beta distribution

    • sigma_chi = std. dev. of spin magnitude beta distribution

    • MF_cost = mixing fraction in aligned spin subpopulation for cos tilt angle distribution

    • sigma_cost = std. dev. of aligned spin subpopulation for cos tilt angle distribution

    • cost_min = lower truncation bound on the cosine tilt angle distribution

    • Bq = power law slope of the mass ratio distribution

  • sampleDict (dict) – Precomputed dictionary containing posterior samples for each event in our catalog

  • injectionDict (dict) – Precomputed dictionary containing successfully recovered injections

  • priorDict (dict) – Precomputed dictionary containing bounds for the priors on each hyper-parameter

Returns

logP – log posterior for the input sample ‘c’

Return type

float

emceeCode.posteriors.betaSpikePlusMixture(c, sampleDict, injectionDict, priorDict)[source]

Implementation of the BetaSpike+Mixture model: a component spin distribution with spin magnitude as a beta distribution + a half gaussian “spike” centered at 0 and the cosine of the tilt angle as a mixture of aligned + isotropic, for inference within emcee.

Parameters
  • c (numpy.array) –

    array containing hyper-parameter samples in the order: [ mu_chi, sigma_chi, MF_cost, sigma_cost, frac_in_spike, sigma_spike, Bq ] where

    • mu_chi = mean of spin magnitude beta distribution

    • sigma_chi = std. dev. of spin magnitude beta distribution

    • MF_cost = mixing fraction in aligned spin subpopulation for cos tilt angle distribution

    • sigma_cost = std. dev. of aligned spin subpopulation for cos tilt angle distribution

    • frac_in_spike = mixing fraction in half gaussian spike at spin mag. = 0

    • sigma_spike = std. dev. of half gaussian spike at spin mag. = 0

    • Bq = power law slope of the mass ratio distribution

  • sampleDict (dict) – Precomputed dictionary containing posterior samples for each event in our catalog

  • injectionDict (dict) – Precomputed dictionary containing successfully recovered injections

  • priorDict (dict) – Precomputed dictionary containing bounds for the priors on each hyper-parameter

Returns

logP – log posterior for the input sample ‘c’

Return type

float

emceeCode.posteriors.betaSpikePlusTruncatedMixture(c, sampleDict, injectionDict, priorDict)[source]

Implementation of the BetaSpike+TruncatedMixture model: a component spin distribution with spin magnitude as a beta distribution + a half gaussian “spike” centered at 0 and the cosine of the tilt angle as a mixture of aligned + isotropic with a lower truncation, for inference within emcee.

Parameters
  • c (numpy.array) –

    array containing hyper-parameter samples in the order: [ mu_chi, sigma_chi, MF_cost, sigma_cost, frac_in_spike, sigma_spike, cost_min, Bq ] where

    • mu_chi = mean of spin magnitude beta distribution

    • sigma_chi = std. dev. of spin magnitude beta distribution

    • MF_cost = mixing fraction in aligned spin subpopulation for cos tilt angle distribution

    • sigma_cost = std. dev. of aligned spin subpopulation for cos tilt angle distribution

    • frac_in_spike = mixing fraction in half gaussian spike at spin mag. = 0

    • sigma_spike = std. dev. of half gaussian spike at spin mag. = 0

    • cost_min = lower truncation bound on the cosine tilt angle distribution

    • Bq = power law slope of the mass ratio distribution

  • sampleDict (dict) – Precomputed dictionary containing posterior samples for each event in our catalog

  • injectionDict (dict) – Precomputed dictionary containing successfully recovered injections

  • priorDict (dict) – Precomputed dictionary containing bounds for the priors on each hyper-parameter

Returns

logP – log posterior for the input sample ‘c’

Return type

float