8000 Added functions to save singles data by aliperego · Pull Request #701 · COSMIC-PopSynth/COSMIC · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Added functions to save singles data #701

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related e 8000 mails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 45 additions & 15 deletions bin/cosmic-pop
10000
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ if __name__ == '__main__':
else:
raise ValueError("You must specify either qmin or m2_min in the",
" inifile if you are using the independent sampler")
IBT, mass_singles, mass_binaries, n_singles, n_binaries = init_samp_list
IBT, mass_singles, mass_binaries, n_singles, n_binaries, n_singles_table = init_samp_list

if sampling['sampling_method'] == 'multidim':
init_samp_list = InitialBinaryTable.sampler(format_ = sampling['sampling_method'],
Expand Down Expand Up @@ -387,6 +387,22 @@ if __name__ == '__main__':
dtp=dtp,
timestep_conditions=filters['timestep_conditions'])

# extract single stars

if (args.keep_singles==True):
bcm_init = bcm.loc[bcm.tphys==0]
if sampling['sampling_method'] == 'multidim':
bcm_init_singles = bcm_init.iloc[-n_singles:]
if sampling['sampling_method'] == 'independent':
bcm_init_singles = bcm_init.iloc[-n_singles_table:]

bcm_singles = bcm.loc[bcm.bin_num.isin(bcm_init_singles.bin_num)]
bpp_singles = bpp.loc[bpp.bin_num.isin(bcm_init_singles.bin_num)]

bpp = bpp.loc[~bpp.bin_num.isin(bcm_init_singles.bin_num)]
bcm = bcm.loc[~bcm.bin_num.isin(bcm_init_singles.bin_num)]
initCond = initCond.loc[~initCond.bin_num.isin(bcm_init_singles.bin_num)]
kick_info = kick_info.loc[~kick_info.bin_num.isin(bcm_init_singles.bin_num)]
# get any nans and pull them out for now
nans = np.isnan(bpp.sep)
if nans.any():
Expand All @@ -410,19 +426,27 @@ if __name__ == '__main__':
# If dtp is not set, filter out first timestep in bcm
if np.all(dtp == IBT['tphysf'].values):
bcm = bcm.loc[bcm['tphys'].isin(dtp)]
if (args.keep_singles==True):
bcm_singles = bcm_singles.loc[bcm_singles['tphys'].isin(dtp)]

# Now get the converging population and bin_nums for conv systems whic
# satisfy the convergence_limits
conv_filter, conv_lims_bin_num = utils.conv_select(bcm, bpp,
kstar1_range, kstar2_range,
convergence['pop_select'],
convergence['convergence_limits'])
if (args.keep_singles==True):
conv_singles_filter = utils.conv_select_singles(bcm_singles, bpp_singles, kstar1_range)

if conv_filter.empty:
warnings.warn("After filtering for desired convegence systems there were no systems matching your request. It is possible you are suggesting incompatible bin_state choices and pop_select, e.g. bin_state=[0,1], pop_select='disruption'")
log_file.write("After filtering for desired convegence systems there were no systems matching your request. It is possible you are suggesting incompatible bin_state choices and pop_select, e.g. bin_state=[0,1], pop_select='disruption'")

bcm_filter = bcm.loc[bcm.bin_num.isin(conv_filter.bin_num)]
bpp_filter = bpp.loc[bpp.bin_num.isin(conv_filter.bin_num)]
if (args.keep_singles==True):
bpp_singles_filter = bpp_singles.loc[bpp_singles.bin_num.isin(conv_singles_filter.bin_num)]
bcm_singles_filter = bcm_singles.loc[bcm_singles.bin_num.isin(conv_singles_filter.bin_num)]
initC_filter = initCond.loc[initCond.bin_num.isin(conv_filter.bin_num)]
kick_info_filter = kick_info.loc[kick_info.bin_num.isin(conv_filter.bin_num)]

Expand All @@ -444,19 +468,15 @@ if __name__ == '__main__':
conv_filter = conv_filter.loc[conv_filter.bin_num.isin(conv_lims_bin_num)]

# Filter the bcm and bpp arrays according to user specified filters
if len(bcm_filter_match) == 0:
bcm_filter_match = bcm_filter.copy()
bpp_filter_match = bpp_filter.copy()
initC_filter_match = initC_filter.copy()
conv_filter_match = conv_filter.copy()
kick_info_filter_match = kick_info_filter.copy()
else:
bcm_filter_match = pd.concat([bcm_filter_match,bcm_filter], ignore_index=True)
bpp_filter_match = pd.concat([bpp_filter_match,bpp_filter], ignore_index=True)
initC_filter_match = pd.concat([initC_filter_match,initC_filter], ignore_index=True)
kick_info_filter_match = pd.concat([kick_info_filter_match,kick_info_filter], ignore_index=True)
conv_filter_match = pd.concat([conv_filter_match,conv_filter.loc[conv_filter.bin_num.isin(conv_lims_bin_num)]], ignore_index=True)

bcm_filter_match = bcm_filter.copy()
bpp_filter_match = bpp_filter.copy()
initC_filter_match = initC_filter.copy()
conv_filter_match = conv_filter.copy()
kick_info_filter_match = kick_info_filter.copy()
if (args.keep_singles==True):
conv_singles_filter_match = conv_singles_filter.copy()
bpp_singles_filter_match = bpp_singles_filter.copy()
bcm_singles_filter_match = bcm_singles_filter.copy()

if len(conv_filter_match) >= np.min([50, args.Niter]):
conv_save = pd.concat([conv_save, pd.DataFrame(conv_filter_match)], ignore_index=True)
Expand All @@ -478,7 +498,13 @@ if __name__ == '__main__':
# write the data and the logs!
mass_list = [total_mass_singles, total_mass_binaries, total_mass_stars]
n_list = [total_n_singles, total_n_binaries, total_n_stars]
utils.pop_write(dat_store, log_file, mass_list, n_list, bcm_filter_match,

if (args.keep_singles==True):
utils.pop_write(dat_store, log_file, mass_list, n_list, bcm_filter_match,
bpp_filter_match, initC_filter_match, conv_filter_match, kick_info_filter_match,
bin_state_nums, match_save, idx, conv_singles=conv_singles_filter_match, bcm_singles=bcm_singles_filter_match, bpp_singles=bpp_singles_filter_match)
else:
utils.pop_write(dat_store, log_file, mass_list, n_list, bcm_filter_match,
bpp_filter_match, initC_filter_match, conv_filter_match, kick_info_filter_match,
bin_state_nums, match_save, idx)

Expand All @@ -488,6 +514,10 @@ if __name__ == '__main__':
initC_filter_match = []
conv_filter_match = []
kick_info_filter_match = []
if (args.keep_singles==True):
conv_singles_filter_match = []
bpp_singles_filter_match = []
bcm_singles_filter_match = []
log_file.write('\n')
Nstep += args.Nstep
log_file.flush()
Expand Down
3 changes: 2 additions & 1 deletion src/cosmic/sample/sampler/independent.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@
np.ones_like(mass1_singles) * 15, # kstar2 (all massless remnants)
metallicity_singles, # metallicity
)
binary_table = pd.concat([binary_table, singles_table])
binary_table = pd.concat([binary_table, singles_table], ignore_index=True)

Check warning on line 346 in src/cosmic/sample/sampler/independent.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/independent.py#L346

Added line #L346 was not covered by tests
else:
binary_table = InitialBinaryTable.InitialBinaries(
mass1_binary,
Expand All @@ -363,6 +363,7 @@
m_sampled_binaries,
n_singles,
n_binaries,
len(mass1_singles)
)


Expand Down
37 changes: 23 additions & 14 deletions src/cosmic/sample/sampler/multidim.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from ... import utils

import numpy as np
import pandas as pd

Check warning on line 28 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L28

Added line #L28 was not covered by tests

__author__ = "Katelyn Breivik <katie.breivik@gmail.com>"
__credits__ = "Scott Coughlin <scott.coughlin@ligo.org>"
Expand Down Expand Up @@ -146,6 +147,7 @@
mass2_binary,
porb,
ecc,
single_mass_list,
mass_singles,
mass_binaries,
n_singles,
Expand Down Expand Up @@ -187,22 +189,22 @@
binfrac=binfrac,
)
tphysf, metallicity = initconditions.sample_SFH(
SF_start=SF_start, SF_duration=SF_duration, met=met, size=mass_singles.size
SF_start=SF_start, SF_duration=SF_duration, met=met, size=single_mass_list.size
)
metallicity[metallicity < 1e-4] = 1e-4
metallicity[metallicity > 0.03] = 0.03
kstar1 = initconditions.set_kstar(mass_singles)
kstar1 = initconditions.set_kstar(single_mass_list)

Check warning on line 196 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L196

Added line #L196 was not covered by tests
singles_table = InitialBinaryTable.InitialBinaries(
mass_singles,
np.ones_like(mass_singles)*0,
np.ones_like(mass_singles)*-1,
np.ones_like(mass_singles)*-1,
single_mass_list,
np.ones_like(single_mass_list)*0,
np.ones_like(single_mass_list)*-1,
np.ones_like(single_mass_list)*-1,
tphysf,
kstar1,
np.ones_like(mass_singles)*0,
np.ones_like(single_mass_list)*0,
metallicity,
)
binary_table = binary_table.append(singles_table)
binary_table = pd.concat([binary_table, singles_table], ignore_index=True)

Check warning on line 207 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L207

Added line #L207 was not covered by tests
else:
binary_table = InitialBinaryTable.InitialBinaries(
mass1_binary,
Expand Down Expand Up @@ -321,6 +323,8 @@
array of orbital periods in days with size=size
ecc_list : array
array of eccentricities with size=size
single_mass_list : array
array of mass of single stars
mass_singles : `float`
Total mass in single stars needed to generate population
mass_binaries : `float`
Expand Down Expand Up @@ -360,7 +364,7 @@
worker = Worker()
results = list(pool.map(worker, inputs))

dat_lists = [[], [], [], [], [], [], [], [], []]
dat_lists = [[], [], [], [], [], [], [], [], [], []]

Check warning on line 367 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L367

Added line #L367 was not covered by tests

for output_list in results:
ii = 0
Expand All @@ -372,17 +376,19 @@
secondary_mass_list = np.hstack(dat_lists[1])
porb_list = np.hstack(dat_lists[2])
ecc_list = np.hstack(dat_lists[3])
mass_singles = np.sum(dat_lists[4])
mass_binaries = np.sum(dat_lists[5])
n_singles = np.sum(dat_lists[6])
n_binaries = np.sum(dat_lists[7])
binfrac_list = np.hstack(dat_lists[8])
single_mass_list = np.hstack(dat_lists[4])
mass_singles = np.sum(dat_lists[5]) 2364
mass_binaries = np.sum(dat_lists[6])
n_singles = np.sum(dat_lists[7])
n_binaries = np.sum(dat_lists[8])
binfrac_list = np.hstack(dat_lists[9])

Check warning on line 384 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L379-L384

Added lines #L379 - L384 were not covered by tests

return (
primary_mass_list,
secondary_mass_list,
porb_list,
ecc_list,
single_mass_list,
mass_singles,
mass_binaries,
n_singles,
Expand Down Expand Up @@ -773,6 +779,7 @@
n_binaries = 0
primary_mass_list = []
secondary_mass_list = []
single_mass_list = []

Check warning on line 782 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L782

Added line #L782 was not covered by tests
porb_list = []
ecc_list = []
binfrac_list = []
Expand Down Expand Up @@ -857,6 +864,7 @@
mass_binaries += myq * myM1
n_binaries += 1
else:
single_mass_list.append(myM1)

Check warning on line 867 in src/cosmic/sample/sampler/multidim.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/sample/sampler/multidim.py#L867

Added line #L867 was not covered by tests
mass_singles += myM1
n_singles += 1

Expand All @@ -865,6 +873,7 @@
secondary_mass_list,
porb_list,
ecc_list,
single_mass_list,
mass_singles,
mass_binaries,
n_singles,
Expand Down
2 changes: 1 addition & 1 deletion src/cosmic/tests/test_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ def test_set_kstar(self):

def test_Moe_sample(self):
# Test the multidim sampler and system-by-system binary fraction
m1, m2, porb, ecc, mass_singles, mass_binaries, n_singles, n_binaries, binfrac = MULTIDIMSAMPLECLASS.initial_sample(rand_seed = 2, size=10, nproc=1, mp_seeds=[0])
m1, m2, porb, ecc, single_mass_list, mass_singles, mass_binaries, n_singles, n_binaries, binfrac = MULTIDIMSAMPLECLASS.initial_sample(rand_seed = 2, size=10, nproc=1, mp_seeds=[0])
self.assertEqual(np.sum(mass_singles), MOE_TOTAL_MASS)
self.assertAlmostEqual(binfrac.max(), MULTIDIM_BINFRAC_MAX)
self.assertAlmostEqual(binfrac.min(), MULTIDIM_BINFRAC_MIN)
Expand Down
31 changes: 31 additions & 0 deletions src/cosmic/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,15 @@

return bcm, bin_state_fraction

def conv_select_singles(bcm_save, bpp_save, final_kstar_1): # fix

Check warning on line 176 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L176

Added line #L176 was not covered by tests
"""Select singles"""
conv_save = bpp_save.loc[

Check warning on line 178 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L178

Added line #L178 was not covered by tests
(bpp_save.kstar_1.isin(final_kstar_1))
]
# select the formation parameters
conv_save = conv_save.groupby("bin_num").first().reset_index()
return conv_save

Check warning on line 183 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L182-L183

Added lines #L182 - L183 were not covered by tests


def conv_select(bcm_save, bpp_save, final_kstar_1, final_kstar_2, method, conv_lims):
"""Select bcm data for special convergence cases
Expand Down Expand Up @@ -352,6 +361,7 @@
bin_state_nums,
match,
idx,
**kwargs,
):
"""Writes all the good stuff that you want to save from runFixedPop in a
single function
Expand Down Expand Up @@ -396,6 +406,15 @@
contains the index of the bcm so we can pick up where we left off
if runFixedPop hits a wall time

conv_singles : `pandas.DataFrame`
kwargs conv_singles array to write

bcm_singles : `pandas.DataFrame`
kwargs bcm_singles array to write

bpp_singles : `pandas.DataFrame`
kwargs bpp_singles array to write

Returns
-------
Nothing!
Expand Down Expand Up @@ -433,6 +452,18 @@

# Save the index
dat_store.append("idx", pd.DataFrame([idx]))

if "conv_singles" in kwargs.keys():

Check warning on line 456 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L456

Added line #L456 was not covered by tests

# Save the singles dataframe
dat_store.append("conv_singles", kwargs["conv_singles"])

Check warning on line 459 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L459

Added line #L459 was not covered by tests

# Save the singles dataframe
dat_store.append("bcm_singles", kwargs["bcm_singles"])

Check warning on line 462 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L462

Added line #L462 was not covered by tests

# Save the singles dataframe
dat_store.append("bpp_singles", kwargs["bpp_singles"])

Check warning on line 465 in src/cosmic/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cosmic/utils.py#L465

Added line #L465 was not covered by tests

return


Expand Down
0