Data release supporting:
Here provide our database and a short python code to query it.
You are more than welcome to use our database in your research; we kindly ask you to cite our papers above. For questions or bugs, just ask me. Oh, and before you ask, SPopS means “Spinning black-hole binary POPulation Synthesis”. If you want to cite the database specifically, it’s
To access the effective spin distribution and the LIGO detection rates of one specific model with python:
import spops
db=spops.database()
model = {"kicks":"70", "spins":"collapse", "tides":"time", "detector":"LIGO"}
var='chieff'
print(db(model,var))
var='detectionrate'
print(db(model,var))
For the same population synthesis simulation, this is the mass ratio of black hole binaries detectable by a multiband LISA+CosmicExplorer network
model = {"kicks":"70", "spins":"collapse", "tides":"time", "detector":"LISACosmicExplorer", "Tobs":"10", "SNRthr":"8"}
var='q'
print(db(model,var))
var='detectionrate'
print(db(model,var))
We provide a database in h5
format containing all population sysnthesis distributions perfomed with StarTrack and post-processed with precession.
The database’s size is ~17GB, and needs to be downloaded in chunks from the GitHub release page. Execute the following:
for i in $(seq -f "%02g" 0 16); do
wget "https://github.com/dgerosa/spops/releases/download/v0.2/spops.h5_"$i;
done
cat spops.h5_* > spops.h5; rm spops.h5_*
(on mac: `brew install wget’).
Models are described by the following options:
['0','25','50','70','130','200','265']
.['collapse','max','uniform']
.['time','alltides','notides']
.['LIGO','Voyager','CosmicExplorer','LISA','LISALIGO','LISACosmicExplorer']
.['4','10]
.['4','8]
.Not all options are required for all the variables (for instance, LISA duration does not need to be specified to access ground-only information).
The following variables are available:
Mzams_a
: ZAMS mass of the heavier star (solar masses).Mzams_b
: ZAMS mass of the lighter star (solar masses).M_a
: Mass of the black hole formed by the heavier ZAMS star (solar masses).M_b
: Mass of the black hole formed by the lighter ZAMS star (solar masses).zmer
: Merger redshift.met
: Metallicity.path
: Formation pathway, convention in Sec. 2D of arXiv:1808.02491.tidealign
: boolean flag marking if the stellar spin was realigned by tides.M
: Black-hole binary total mass (solar masses).q
: Black-hole binary mass ratio.chi1
: Spin of the heavier black hole.chi2
: Spin of the lighter black hole.chieff
: Black-hole binary effective spinmorph
: Spin morphology (-1: Librating about 0, 0: Circulating, +1: Librating about pi)theta1
: Tilt angle of the heavier black hole at 20 Hz.theta2
: Tilt angle of the heavier black hole at 20 Hz.deltaphi
: Difference between the azimuthal spin angles at 20 Hz.SNR
: Signal-to-noise ratio. For ground-based detector returns the optimal SNR. For LISA returns SNR evaluated at Tobs.detectionrate
: Detection rate for the targeted detector.We also provide a simple python module to query the database. spops
is compatible with both Python 2 and Python 3 and can be installed from the Python Package index using:
pip install spops
Remember to download and assemble the database as described above. The module contains a single class, called database
. To initialize the class:
import spops
db = spops.database(h5filename='spops.h5',h5dir=None)
The input parameters are:
h5filename
: database file name, default is spops.h5
.h5dir
: directory of the database; if None
(default) the code will look for detabase in both the location where the spops
module is installed (this is os.path.dirname(os.path.abspath(spops.__file__))
) and the execution location (this is .
).The population sysnthesis run of interest can be specified using a python dictionary with the keys as above, so for instance
model = {"kicks":"70", "spins":"collapse", "tides":"time", "detector":"LIGO"}
One can then access the datasets described above by just calling the database class:
var='chieff'
print(db(model,var))
To list the model options and the available variables use
print(db.options)
print(db.vars)
The database
class is a singleton: only one istance can exist at any time. Multiple calls will return pointers to the same instance. This is done to prevent useless memory allocation. For instance:
db1=spops.database()
db2=spops.database()
print(db1==db2)
>>>> True
We do lazy loading here and only read in a dataset when/if the user asks for it. Moreover, spops
remembers which dataset have already been loaded, such that each subsequent access is read in from memory, not disk. So for instance:
from contexttimer import timer
@timer()
def read_from_spops(model,var):
return db(model,var)
var='Mzams_a'
read_from_spops(model,var)
read_from_spops(model,var)
>>>> function read_from_spops execution time: 0.002
>>>> function read_from_spops execution time: 0.000