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
overwrite=True) #print(tbl['SpT','Msun','lyclum','logL','Teff'][:40]) 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')
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()))
synth_data = {} # uniform random sampling from 100 to 10^5 msun for stop_crit in ('nearest', 'before', 'after', 'sorted'): 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,
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)]