independent

class cosmic.sample.sampler.independent.InitialBinaryTable

Bases: object

classmethod InitialBinaries(m1, m2, porb, ecc, tphysf, kstar1, kstar2, metallicity, **kwargs)

Create single binary

Parameters:
m1float

Primary mass [Msun]

m2float

Secondary mass [Msun]

porbfloat

Orbital period [days]

eccfloat

Eccentricity

tphysffloat

Time to evolve the binary [Myr]

kstar1array

0-14 Initial stellar type of the larger object; main sequence stars are 0 if m < 0.7 Msun and 1 otherwise

kstar2array

0-14 Initial stellar type of the smaller object; main sequence stars are 0 if m < 0.7 Msun and 1 otherwise

metallicityfloat

Metallicity of the binaries; Z_sun = 0.02

**kwargs
binfracfloat

System-specific probability of the primary star being in a binary

mass0_1,mass0_2,rad1,rad2,lumin1,lumin2, massc1,massc2,radc1,radc2,menv1,menv2,renv1,renv2, ospin1,ospin2,b_0_1,b_0_2,bacc1,bacc2, tacc1,tacc2,epoch1,epoch2,tms1,tms2 bhspin1,bhspin2

Returns:
InitialBinariesDataFrame

Single binary initial conditions

__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'cosmic.sample.initialbinarytable', 'InitialBinaries': <classmethod(<function InitialBinaryTable.InitialBinaries>)>, 'sampler': <classmethod(<function InitialBinaryTable.sampler>)>, '__dict__': <attribute '__dict__' of 'InitialBinaryTable' objects>, '__weakref__': <attribute '__weakref__' of 'InitialBinaryTable' objects>, '__doc__': None, '__annotations__': {}})
__doc__ = None
__module__ = 'cosmic.sample.initialbinarytable'
__weakref__

list of weak references to the object (if defined)

classmethod sampler(format_, *args, **kwargs)

Fetch a method to generate an initial binary sample

Parameters:
formatstr

the method name; Choose from ‘independent’ or ‘multidim’

*args

the arguments necessary for the registered sample method; see help(InitialBinaryTable.sampler(‘independent’) to see the arguments necessary for the independent sample

The available named formats are:
=========== …

Format …

=========== …
independent …

multidim …

=========== …
class cosmic.sample.sampler.independent.Sample

Bases: object

__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'cosmic.sample.sampler.independent', 'sample_primary': <function Sample.sample_primary>, 'sample_secondary': <function Sample.sample_secondary>, 'binary_select': <function Sample.binary_select>, 'sample_porb': <function Sample.sample_porb>, 'sample_ecc': <function Sample.sample_ecc>, 'sample_SFH': <function Sample.sample_SFH>, 'set_kstar': <function Sample.set_kstar>, 'set_reff': <function Sample.set_reff>, '__dict__': <attribute '__dict__' of 'Sample' objects>, '__weakref__': <attribute '__weakref__' of 'Sample' objects>, '__doc__': None, '__annotations__': {}})
__doc__ = None
__module__ = 'cosmic.sample.sampler.independent'
__weakref__

list of weak references to the object (if defined)

binary_select(primary_mass, binfrac_model=0.5, **kwargs)

Select which primary masses will have a companion using either a binary fraction specified by a float or a primary-mass dependent binary fraction following van Haaften et al.(2009) in appdx or Offner et al.(2022) in fig 1

Parameters:
primary_massarray

Mass that determines the binary fraction

binfrac_modelstr or float

vanHaaften - primary mass dependent and ONLY VALID up to 100 Msun

offner22 - primary mass dependent

float - fraction of binaries; 0.5 means 2 in 3 stars are a binary pair while 1 means every star is in a binary pair

Optional kwargs are defined in `get_independent_sampler`
Returns:
stars_in_binaryarray

primary masses that will have a binary companion

stars_in_singlearray

primary masses that will be single stars

binary_fractionarray

system-specific probability of being in a binary

binaryIdxarray

Idx of stars in binary

sample_SFH(SF_start=13700.0, SF_duration=0.0, met=0.02, size=None)

Sample an evolution time for each binary based on a user-specified time at the start of star formation and the duration of star formation. The default is a burst of star formation 13,700 Myr in the past.

Parameters:
SF_startfloat

Time in the past when star formation initiates in Myr

SF_durationfloat

Duration of constant star formation beginning from SF_Start in Myr

metfloat

metallicity of the population [Z_sun = 0.02] Default: 0.02

sizeint, optional

number of evolution times to sample NOTE: this is set in cosmic-pop call as Nstep

Returns:
tphysarray

array of evolution times of size=size

metallicityarray

array of metallicities

sample_ecc(aRL_over_a, ecc_model='sana12', size=None)

Sample the eccentricity according to a user specified model

Parameters:
ecc_modelstring

‘thermal’ samples from a thermal eccentricity distribution following Heggie (1975) ‘uniform’ samples from a uniform eccentricity distribution ‘sana12’ samples from the eccentricity distribution from Sana+2012 <https://ui.adsabs.harvard.edu/abs/2012Sci…337..444S/abstract>_ ‘circular’ assumes zero eccentricity for all systems DEFAULT = ‘sana12’

aRL_over_aratio of the minimum seperation (where RL overflow starts)

to the sampled semi-major axis. Use this to truncate the eccentricitiy

sizeint, optional

number of eccentricities to sample this is set in cosmic-pop call as Nstep

Returns:
eccarray

array of sampled eccentricities with size=size

sample_porb(mass1, mass2, rad1, rad2, porb_model, porb_max=None, size=None, **kwargs)

Sample the orbital period according to the user-specified model

Parameters:
mass1array

primary masses

mass2array

secondary masses

rad1array

radii of the primaries.

rad2array

radii of the secondaries

porb_modelstr or dict

selects which model to sample orbital periods, choices include: log_uniform : semi-major axis flat in log space from RRLO < 0.5 up to 1e5 Rsun according to Abt (1983) and consistent with Dominik+2012,2013 and then converted to orbital period in days using Kepler III sana12 : power law orbital period between 0.15 < log(P/day) < 5.5 following Sana+2012 <https://ui.adsabs.harvard.edu/abs/2012Sci…337..444S/abstract>_ renzo19 : power law orbital period for m1 > 15Msun binaries from Sana+2012 <https://ui.adsabs.harvard.edu/abs/2012Sci…337..444S/abstract>_ following the implementation of Renzo+2019 <https://ui.adsabs.harvard.edu/abs/2019A%26A…624A..66R/abstract>_ and flat in log otherwise raghavan10 : log normal orbital periods in days with mean_logP = 4.9 and sigma_logP = 2.3 between 0 < log10(P/day) < 9 following Raghavan+2010 <https://ui.adsabs.harvard.edu/abs/2010ApJS..190….1R/abstract>_ moe19 : log normal orbital periods in days with mean_logP = 4.9 and sigma_logP = 2.3 between 0 < log10(P/day) < 9 following Raghavan+2010 <https://ui.adsabs.harvard.edu/abs/2010ApJS..190….1R/abstract>_ but with different close binary fractions following Moe+2019 <https://ui.adsabs.harvard.edu/abs/2019ApJ…875…61M/abstract>_ Custom power law distribution defined with a dictionary with keys “min”, “max”, and “slope” (e.g. porb_model={“min”: 0.15, “max”: 0.55, “slope”: -0.55}) would reproduce the Sana+2012 distribution.

metfloat

metallicity of the population

Returns:
porbarray

orbital period with array size equalling array size of mass1 and mass2 in units of days

aRL_over_a: array

ratio of radius where RL overflow starts to the sampled seperation used to truncate the eccentricitiy distribution

sample_primary(primary_model='kroupa01', size=None, **kwargs)

Sample the primary mass (always the most massive star) from a user-selected model

kroupa93 follows Kroupa (1993), normalization comes from Hurley 2002 between 0.08 and 150 Msun salpter55 follows Salpeter (1955) between 0.08 and 150 Msun kroupa01 follows Kroupa (2001) <https://arxiv.org/abs/astro-ph/0009005> between 0.08 and 100 Msun

Parameters:
primary_modelstr, optional
model for mass distribution; choose from:
kroupa93 follows Kroupa (1993), normalization comes from
`Hurley 2002 <https://arxiv.org/abs/astro-ph/0201220>`_
valid for masses between 0.1 and 100 Msun
salpter55 follows
`Salpeter (1955) <http://adsabs.harvard.edu/abs/1955ApJ…121..161S>`_
valid for masses between 0.1 and 100 Msun
kroupa01 follows Kroupa (2001), normalization comes from
`Hurley 2002 <https://arxiv.org/abs/astro-ph/0009005>`_
valid for masses between 0.1 and 100 Msun
custom is a generic piecewise power law that takes in the power
law slopes and break points given in the optional input lists (alphas, mcuts)
default alphas and mcuts yield an IMF identical to kroupa01
Default kroupa01
sizeint, optional
number of initial primary masses to sample
NOTE: this is set in cosmic-pop call as Nstep
alphasarray, optional
absolute values of the power law slopes for primary_model = ‘custom’
Default [-1.3,-2.3,-2.3] (identical to slopes for primary_model = ‘kroupa01’)
mcutsarray, optional, units of Msun
break points separating the power law ‘pieces’ for primary_model = ‘custom’
Default [0.08,0.5,1.0,150.] (identical to breaks for primary_model = ‘kroupa01’)
Optional kwargs are defined in `get_independent_sampler`
Returns:
a_0array
Sampled primary masses
np.sum(a_0)float
Total amount of mass sampled
sample_secondary(primary_mass, q_power_law=0, **kwargs)

Sample a secondary mass using draws from a uniform mass ratio distribution motivated by Mazeh et al. (1992) and Goldberg & Mazeh (1994)

NOTE: the lower lim is set by either qmin or m2_min which are passed as kwargs

Parameters:
primary_massarray

sets the maximum secondary mass (for a maximum mass ratio of 1)

Optional kwargs are defined in `get_independent_sampler`
Returns:
secondary_massarray

sampled secondary masses with array size matching size of primary_mass

set_kstar(mass)

Initialize stellar types according to BSE classification kstar=1 if M>=0.7 Msun; kstar=0 if M<0.7 Msun

Parameters:
massarray

array of masses

Returns:
kstararray

array of initial stellar types

set_reff(mass, metallicity, zsun=0.02)

Better way to set the radii from BSE, by calling it directly

takes masses and metallicities, and returns the radii

Note that the BSE function is hard-coded to go through arrays of length 10^5. If your masses are more than that, you’ll need to divide it into chunks

cosmic.sample.sampler.independent.get_independent_sampler(final_kstar1, final_kstar2, primary_model, ecc_model, porb_model, SF_start, SF_duration, binfrac_model, met, size=None, total_mass=inf, sampling_target='size', trim_extra_samples=False, q_power_law=0, **kwargs)

Generates an initial binary sample according to user specified models

Parameters:
final_kstar1int or list

Int or list of final kstar1

final_kstar2int or list

Int or list of final kstar2

primary_modelstr

Model to sample primary mass; choices include: kroupa93, kroupa01, salpeter55, custom if ‘custom’ is selected, must also pass arguemts: alphas : array

list of power law indicies

mcutsarray

breaks in the power laws.

e.g. alphas=[-1.3,-2.3,-2.3],mcuts=[0.08,0.5,1.0,150.] reproduces standard Kroupa2001 IMF

ecc_modelstr

Model to sample eccentricity; choices include: thermal, uniform, sana12

porb_modelstr or dict

Model to sample orbital period; choices include: log_uniform, sana12, raghavan10, moe19 or a custom power law distribution defined with a dictionary with keys “min”, “max”, and “slope” (e.g. {“min”: 0.15, “max”: 0.55, “slope”: -0.55}) would reproduce the Sana+2012 distribution

qminfloat

kwarg which sets the minimum mass ratio for sampling the secondary where the mass ratio distribution is flat in q if q > 0, qmin sets the minimum mass ratio q = -1, this limits the minimum mass ratio to be set such that the pre-MS lifetime of the secondary is not longer than the full lifetime of the primary if it were to evolve as a single star

m_maxfloat

kwarg which sets the maximum primary and secondary mass for sampling NOTE: this value changes the range of the IMF and should not be used

as a means of selecting certain kstar types!

m1_minfloat

kwarg which sets the minimum primary mass for sampling NOTE: this value changes the range of the IMF and should not be used

as a means of selecting certain kstar types!

m2_minfloat

kwarg which sets the minimum secondary mass for sampling the secondary as uniform in mass_2 between m2_min and mass_1

msortfloat

Stars with M>msort can have different pairing and sampling of companions

qmin_msortfloat

Same as qmin for M>msort

m2_min_msortfloat

Same as m2_min for M>msort

SF_startfloat

Time in the past when star formation initiates in Myr

SF_durationfloat

Duration of constant star formation beginning from SF_Start in Myr

binfrac_modelstr or float

Model for binary fraction; choices include: vanHaaften, offner22, or a fraction where 1.0 is 100% binaries

binfrac_model_msortstr or float

Same as binfrac_model for M>msort

metfloat

Sets the metallicity of the binary population where solar metallicity is zsun

sizeint

Size of the population to sample

total_massfloat

Total mass to use as a target for sampling

sampling_targetstr

Which type of target to use for sampling (either “size” or “total_mass”), by default “size”. Note that total_mass must not be None when sampling_target==”total_mass”.

trim_extra_samplesstr

Whether to trim the sampled population so that the total mass sampled is as close as possible to total_mass. Ignored when sampling_target==size. Note that given the discrete mass of stars, this could mean your sample is off by 300 solar masses in the worst case scenario (of a 150+150 binary being sampled). In reality the majority of cases track the target total mass to within a solar mass.

zsunfloat

optional kwarg for setting effective radii, default is 0.02

q_power_lawfloat

Exponent for the mass ratio distribution power law, default is 0 (flat in q). Note that q_power_law cannot be exactly -1, as this would result in a divergent distribution.

Returns:
InitialBinaryTablepandas.DataFrame

DataFrame in the format of the InitialBinaryTable

mass_singlesfloat

Total mass in single stars needed to generate population

mass_binariesfloat

Total mass in binaries needed to generate population

n_singlesint

Number of single stars needed to generate a population

n_binariesint

Number of binaries needed to generate a population

cosmic.sample.sampler.independent.register_sampler(data_format, data_class, function, force=False, usage=None)

Register a new method to InitialBinaryTable.sampler() for a given format

Parameters:
data_formatstr

name of the format to be registered

data_classtype

the class that the sampler returns

functioncallable

the method to call from InitialBinaryTable.sampler()

forcebool, optional

overwrite existing registration for data_format if found, default: False