Skip to content
Snippets Groups Projects
example_plotting_distributions.py 6.81 KiB
Newer Older
import math

import numpy as np
import matplotlib.pyplot as plt

from binarycpython.utils.distribution_functions import (
    three_part_powerlaw,
    Kroupa2001,
    Arenou2010_binary_fraction,
    raghavan2010_binary_fraction,
    imf_scalo1998,
    imf_scalo1986,
    imf_tinsley1980,
    imf_scalo1998,
    imf_chabrier2003,
    flatsections,
    duquennoy1991,
    sana12,
from binarycpython.utils.useful_funcs import calc_sep_from_period
################################################
# Example script to plot the available probability distributions.

################################################
# mass distribution plots
################################################
David Hendriks's avatar
David Hendriks committed

David Hendriks's avatar
David Hendriks committed
    mass_values = np.arange(0.11, 80, 0.1)

    kroupa_probability = [Kroupa2001(mass) for mass in mass_values]
    scalo1986 = [imf_scalo1986(mass) for mass in mass_values]
    tinsley1980 = [imf_tinsley1980(mass) for mass in mass_values]
    scalo1998 = [imf_scalo1998(mass) for mass in mass_values]
    chabrier2003 = [imf_chabrier2003(mass) for mass in mass_values]

David Hendriks's avatar
David Hendriks committed
    plt.plot(mass_values, kroupa_probability, label="Kroupa")
    plt.plot(mass_values, scalo1986, label="scalo1986")
    plt.plot(mass_values, tinsley1980, label="tinsley1980")
    plt.plot(mass_values, scalo1998, label="scalo1998")
    plt.plot(mass_values, chabrier2003, label="chabrier2003")

    plt.title("Probability distribution for mass of primary")
    plt.ylabel(r"Probability")
    plt.xlabel(r"Mass (M$_{\odot}$)")
    plt.yscale("log")
    plt.xscale("log")
David Hendriks's avatar
David Hendriks committed

################################################
# Binary fraction distributions
################################################

David Hendriks's avatar
David Hendriks committed

David Hendriks's avatar
David Hendriks committed
    arenou_binary_distibution = [
        Arenou2010_binary_fraction(mass) for mass in mass_values
    ]
    raghavan2010_binary_distribution = [
        raghavan2010_binary_fraction(mass) for mass in mass_values
    ]

    plt.plot(mass_values, arenou_binary_distibution, label="arenou 2010")
    plt.plot(mass_values, raghavan2010_binary_distribution, label="Raghavan 2010")
    plt.title("Binary fractions distributions")
    plt.ylabel(r"Binary fraction")
    plt.xlabel(r"Mass (M$_{\odot}$)")
David Hendriks's avatar
David Hendriks committed
    plt.xscale("log")
David Hendriks's avatar
David Hendriks committed

################################################
# Mass ratio distributions
################################################

David Hendriks's avatar
David Hendriks committed

David Hendriks's avatar
David Hendriks committed
    mass_ratios = np.arange(0, 1, 0.01)
David Hendriks's avatar
David Hendriks committed
                {"min": 0.1 / example_mass, "max": 0.8, "height": 1},
                {"min": 0.8, "max": 1.0, "height": 1.0},
            ],
        )
        for q in mass_ratios
    ]

    plt.plot(mass_ratios, flat_dist, label="Flat")
    plt.title("Mass ratio distributions")
    plt.ylabel(r"Probability")
    plt.xlabel(r"Mass ratio (q = $\frac{M1}{M2}$) ")
David Hendriks's avatar
David Hendriks committed

################################################
# Period distributions
################################################


def plot_period_distributions():
    logperiod_values = np.arange(-2, 12, 0.1)
    duquennoy1991_distribution = [duquennoy1991(logper) for logper in logperiod_values]

    # Sana12 distributions
    period_min = 10 ** 0.15
    period_max = 10 ** 5.5

    m1 = 20
    m2 = 15
    sana12_distribution_q05 = [
        sana12(
            m1,
            m2,
            calc_sep_from_period(m1, m2, 10 ** logper),
            10 ** logper,
            calc_sep_from_period(m1, m2, period_min),
            calc_sep_from_period(m1, m2, period_max),
            math.log10(period_min),
            math.log10(period_max),
            -0.55,
        )
        for logper in logperiod_values
    ]

    m1 = 30
    m2 = 1
    sana12_distribution_q0033 = [
        sana12(
            m1,
            m2,
            calc_sep_from_period(m1, m2, 10 ** logper),
            10 ** logper,
            calc_sep_from_period(m1, m2, period_min),
            calc_sep_from_period(m1, m2, period_max),
            math.log10(period_min),
            math.log10(period_max),
            -0.55,
        )
        for logper in logperiod_values
    ]

    m1 = 30
    m2 = 3
    sana12_distribution_q01 = [
        sana12(
            m1,
            m2,
            calc_sep_from_period(m1, m2, 10 ** logper),
            10 ** logper,
            calc_sep_from_period(m1, m2, period_min),
            calc_sep_from_period(m1, m2, period_max),
            math.log10(period_min),
            math.log10(period_max),
            -0.55,
        )
        for logper in logperiod_values
    ]

    m1 = 30
    m2 = 30
    sana12_distribution_q1 = [
        sana12(
            m1,
            m2,
            calc_sep_from_period(m1, m2, 10 ** logper),
            10 ** logper,
            calc_sep_from_period(m1, m2, period_min),
            calc_sep_from_period(m1, m2, period_max),
            math.log10(period_min),
            math.log10(period_max),
            -0.55,
        )
        for logper in logperiod_values
    ]

David Hendriks's avatar
David Hendriks committed
    Izzard2012_period_distribution_10 = [
        Izzard2012_period_distribution(10 ** logperiod, 10)
        for logperiod in logperiod_values
    ]
    Izzard2012_period_distribution_20 = [
        Izzard2012_period_distribution(10 ** logperiod, 20)
        for logperiod in logperiod_values
    ]
David Hendriks's avatar
David Hendriks committed
    plt.plot(
        logperiod_values, duquennoy1991_distribution, label="Duquennoy & Mayor 1991"
    )
    plt.plot(logperiod_values, sana12_distribution_q0033, label="Sana 12 (q=0.033)")
    plt.plot(logperiod_values, sana12_distribution_q05, label="Sana 12 (q=0.5)")
    plt.plot(logperiod_values, sana12_distribution_q01, label="Sana 12 (q=0.1)")
    plt.plot(logperiod_values, sana12_distribution_q1, label="Sana 12 (q=1)")

David Hendriks's avatar
David Hendriks committed
    plt.plot(
        logperiod_values, Izzard2012_period_distribution_10, label="Izzard2012 (M=10)"
    )
    plt.plot(
        logperiod_values, Izzard2012_period_distribution_20, label="Izzard2012 (M=20)"
    )

    plt.title("Period distributions")
    plt.ylabel(r"Probability")
    plt.xlabel(r"Log10(orbital period)")
    plt.grid()
    plt.legend()
    plt.show()

David Hendriks's avatar
David Hendriks committed

################################################
# Sampling part of distribution and calculating probability ratio
################################################

# TODO show the difference between sampling over the full range, or taking a smaller range initially and compensating for it.


# val = Izzard2012_period_distribution(1000, 10)
# print(val)
# val2 = Izzard2012_period_distribution(100, 10)
# print(val2)


# from binarycpython.utils.distribution_functions import (interpolate_in_mass_izzard2012)
# # print(interpolate_in_mass_izzard2012(15, 0.3, -1))