def lnprob(mass, luminosity=2e7, luminosity_error=5e6):
    if mass < 1:
        return -np.inf, 0
    if mass > 1e5:
        # use a best-fit relation; scatter is minimal
        lum = 10**(np.log10(mass) + 3.55)
        # n > 20 msun
        nostars = 10**(np.log10(mass) - 2.5)
    else:
        cluster = imf.make_cluster(mass, silent=True)
        lum = 10**imf.lum_of_cluster(cluster)
        nostars = (cluster > mmin_ostar).sum()
    return -(luminosity-lum)**2/(2*luminosity_error**2), nostars
def lnprob(mass, luminosity=2e7, luminosity_error=5e6):
    if mass < 1:
        return -np.inf, 0
    if mass > 1e5:
        # use a best-fit relation; scatter is minimal
        lum = 10**(np.log10(mass) + 3.55)
        # n > 20 msun
        nostars = 10**(np.log10(mass) - 2.5)
    else:
        cluster = imf.make_cluster(mass, silent=True)
        lum = 10**imf.lum_of_cluster(cluster)
        nostars = (cluster > mmin_ostar).sum()
    return -(luminosity - lum)**2 / (2 * luminosity_error**2), nostars
closest_type = np.argmin(np.abs(tbl['lyclum'] - qmax))

print("Closest spectral type = {0}".format(tbl['SpT'][closest_type]))
print(tbl['SpT', 'Msun', 'lyclum', 'logL',
          'Teff'][closest_type - 1:closest_type + 1])

# IMF examinations
from imf import imf
cluster_masses = [250, 500, 1000, 2000]
nsamp = 100
clusters = {
    mass: [imf.make_cluster(mass, silent=True) for ii in range(nsamp)]
    for mass in cluster_masses
}
luminosities = {
    mass: [imf.lum_of_cluster(cl) for cl in clusters[mass]]
    for mass in cluster_masses
}
lycluminosities = {
    mass: [imf.lyc_of_cluster(cl) for cl in clusters[mass]]
    for mass in cluster_masses
}

for mass in cluster_masses:
    pl.plot(luminosities[mass], lycluminosities[mass], '.', label=mass)

pl.plot(np.log10(2e4), np.log10(4e45), 'x')

pl.legend(loc='best')
Esempio n. 4
0
import numpy as np
from imf import imf
import pylab as pl
from astropy.utils.console import ProgressBar

clusters, luminosities, masses, mean_luminosities, mean_masses, max_masses = {},{},{},{},{},{}
# uniform random sampling from 100 to 10^5 msun
for clmass in ProgressBar(np.concatenate([10**(np.random.rand(int(1e3))*1 + 4), 10**(np.random.rand(int(1e4))*2.5+1.5)])):
    clusters[clmass] = imf.make_cluster(clmass, 'kroupa', mmax=150, silent=True)
    # cluster luminosities
    luminosities[clmass] = imf.lum_of_cluster(clusters[clmass])
    masses[clmass] = clmass
    mean_luminosities[clmass] = np.mean(luminosities[clmass])
    mean_masses[clmass] = np.mean(clusters[clmass])
    max_masses[clmass] = np.max(clusters[clmass])


mass_to_light = np.array([mean_masses[k]/mean_luminosities[k] for k in sorted(clusters.keys())])

pl.figure(2).clf()
pl.semilogx(sorted(clusters.keys()), mass_to_light**-1, '.', alpha=0.1)
pl.xlabel("Cluster Mass")
pl.ylabel("Light to Mass $L_\odot / M_\odot$")
pl.ylim(6,21)
pl.savefig("light_to_mass_vs_mass.pdf")


pl.figure(3).clf()
pl.loglog(max_masses.keys(), max_masses.values(), '.', alpha=0.1)
pl.xlabel("Cluster Mass")
pl.ylabel("Maximum stellar mass")
import numpy as np
from imf import imf
import pylab as pl
from astropy.utils.console import ProgressBar
import paths
pl.matplotlib.rc_file('pubfiguresrc')

nclusters_per_bin = 100
maxmass = 3e4
mmin_bstar = 8
mmin_ostar = 20

cl_masses = np.logspace(2.5,np.log10(maxmass))
clusters = np.array([[imf.make_cluster(mass*(np.random.randn()/20.+1.),silent=True) for ii in range(nclusters_per_bin)] for mass in ProgressBar(cl_masses)])
luminosities = [imf.lum_of_cluster(cl) for section in ProgressBar(clusters) for cl in section]
#cl_masses_flat = np.array([x for mass in cl_masses for x in [mass for ii in range(nclusters_per_bin)]])
cl_masses_flat = np.array([sum(cl) for section in clusters for cl in section])
n_obstars = np.array([(cl>mmin_bstar).sum() for section in clusters for cl in section])
n_ostars = np.array([(cl>mmin_ostar).sum() for section in clusters for cl in section])

# guess, not measurement
nobstars_w51 = n_obstars[(cl_masses_flat > 4e3) & (cl_masses_flat < 9e3)]
nostars_w51 = n_ostars[(cl_masses_flat > 4e3) & (cl_masses_flat < 9e3)]


print("Implied stellar mass of e1 cluster, assuming 7 stars are OB stars: {0} +/- {1} M_sun".format(cl_masses_flat[n_obstars==7].mean(), cl_masses_flat[n_obstars==7].std()))
print("Implied stellar mass of e1 cluster, assuming 7 stars are O stars: {0} +/- {1} M_sun".format(cl_masses_flat[n_ostars==7].mean(), cl_masses_flat[n_ostars==7].std()))
print("Implied stellar mass of e1 cluster, assuming 6 stars are OB stars: {0} +/- {1} M_sun".format(cl_masses_flat[n_obstars==6].mean(), cl_masses_flat[n_obstars==6].std()))
print("Implied stellar mass of e1 cluster, assuming 6 stars are O stars: {0} +/- {1} M_sun".format(cl_masses_flat[n_ostars==6].mean(), cl_masses_flat[n_ostars==6].std()))
print("Implied stellar mass of e1 cluster, assuming 5 stars are OB stars: {0} +/- {1} M_sun".format(cl_masses_flat[n_obstars==5].mean(), cl_masses_flat[n_obstars==6].std()))
Esempio n. 6
0
import numpy as np
from imf import imf
import pylab as pl
from astropy.utils.console import ProgressBar

clusters, luminosities, masses, mean_luminosities, mean_masses, max_masses = {},{},{},{},{},{}
# uniform random sampling from 100 to 10^5 msun
for clmass in ProgressBar(np.concatenate([10**(np.random.rand(int(1e3))*1 + 4), 10**(np.random.rand(int(1e4))*2.5+1.5)])):
    clusters[clmass] = imf.make_cluster(clmass, 'kroupa', mmax=150, silent=True)
    # cluster luminosities
    luminosities[clmass] = imf.lum_of_cluster(clusters[clmass])
    masses[clmass] = clmass
    mean_luminosities[clmass] = np.mean(luminosities[clmass])
    mean_masses[clmass] = np.mean(clusters[clmass])
    max_masses[clmass] = np.max(clusters[clmass])


mass_to_light = np.array([mean_masses[k]/mean_luminosities[k] for k in sorted(clusters.keys())])

pl.figure(2).clf()
pl.semilogx(sorted(clusters.keys()), mass_to_light**-1, '.', alpha=0.1)
pl.xlabel("Cluster Mass")
pl.ylabel("Light to Mass $L_\odot / M_\odot$")
pl.ylim(6,21)
pl.savefig("light_to_mass_vs_mass.pdf")


pl.figure(3).clf()
pl.loglog(max_masses.keys(), max_masses.values(), '.', alpha=0.1)
pl.xlabel("Cluster Mass")
pl.ylabel("Maximum stellar mass")
Esempio n. 7
0
    print(stop_crit)
    if stop_crit not in synth_data:
        clusters, luminosities, masses, mean_luminosities, mean_masses, max_masses, number = {},{},{},{},{},{},{}
        for clmass in ProgressBar(
                np.concatenate([
                    10**(np.random.rand(int(1e3)) * 1 + 4),
                    10**(np.random.rand(int(1e4)) * 2.5 + 1.5)
                ])):
            key = str(clmass)  # for jsonification
            clusters[key] = imf.make_cluster(clmass,
                                             'kroupa',
                                             mmax=150,
                                             silent=True,
                                             stop_criterion=stop_crit)
            # cluster luminosities
            luminosities[key] = imf.lum_of_cluster(clusters[key])
            masses[key] = clmass
            number[key] = len(clusters[key])
            #mean_luminosities[clmass] = np.mean(luminosities[clmass])
            mean_masses[key] = np.mean(clusters[key])
            max_masses[key] = np.max(clusters[key])

        synth_data[stop_crit] = {  #'clusters': clusters,
            'number': number,
            'luminosities': luminosities,
            'masses': masses,
            'mean_luminosities': mean_luminosities,
            'mean_masses': mean_masses,
            'max_masses': max_masses
        }
    else:
import paths

pl.matplotlib.rc_file('pubfiguresrc')

nclusters_per_bin = 100
maxmass = 3e4
mmin_bstar = 8
mmin_ostar = 20

cl_masses = np.logspace(2.5, np.log10(maxmass))
clusters = np.array([[
    imf.make_cluster(mass * (np.random.randn() / 20. + 1.), silent=True)
    for ii in range(nclusters_per_bin)
] for mass in ProgressBar(cl_masses)])
luminosities = [
    imf.lum_of_cluster(cl) for section in ProgressBar(clusters)
    for cl in section
]
#cl_masses_flat = np.array([x for mass in cl_masses for x in [mass for ii in range(nclusters_per_bin)]])
cl_masses_flat = np.array([sum(cl) for section in clusters for cl in section])
n_obstars = np.array([(cl > mmin_bstar).sum() for section in clusters
                      for cl in section])
n_ostars = np.array([(cl > mmin_ostar).sum() for section in clusters
                     for cl in section])

# guess, not measurement
nobstars_w51 = n_obstars[(cl_masses_flat > 4e3) & (cl_masses_flat < 9e3)]
nostars_w51 = n_ostars[(cl_masses_flat > 4e3) & (cl_masses_flat < 9e3)]

print(
    "Implied stellar mass of e1 cluster, assuming 7 stars are OB stars: {0} +/- {1} M_sun"