def cloudy_spectrum(ax): from prospect.models import model_setup param_file = '/Users/joel/code/python/prospector_alpha/parameter_files/brownseds_np/brownseds_np_params.py' run_params = model_setup.get_run_params(param_file=param_file) sps = model_setup.load_sps(**run_params) model = model_setup.load_model(**run_params) model.params['dust2'] = np.array(0.0) obs = model_setup.load_obs(**run_params) spec,_,_ = model.mean_model(model.initial_theta, obs, sps=sps) model.params['add_neb_emission'] = np.array(False) model.params['add_neb_continuum'] = np.array(False) spec_neboff,_,_ = model.mean_model(model.initial_theta, obs, sps=sps) spec_neb = (spec-spec_neboff)*3e18/sps.wavelengths**2 in_plot = (sps.wavelengths/1e4 > 6) & (sps.wavelengths/1e4 < 30) spec_neb_smooth = smooth_spectrum(sps.wavelengths[in_plot], spec_neb[in_plot], 3500) spec_neb_smooth *= 1e5 / spec_neb_smooth.max() ''' neb_color = '0.7' alpha = 0.7 ax.fill_between(sps.wavelengths[in_plot]/1e4, np.zeros_like(spec_neb_smooth), spec_neb_smooth, color=neb_color, alpha=alpha) ### label H2 + [ArII] (second is in cloudy but very small) ax.fill_between([9.55,9.85],[0,0],[1,1],color=neb_color,alpha=alpha) ax.fill_between([6.8,7.1],[0,0],[1,1],color=neb_color,alpha=alpha) ''' lines = ['[ArII]',r'H$_2$','[SIV]','[NeIII]','[SIII]'] lam = [6.95,9.7,10.45,15.5,18.7] # removed because they're too weak, just distracting #lines = ['[ArIII]','[NeII]'] #lam = [9.0,12.8] for ii in xrange(len(lines)): ax.text(lam[ii]*1.008,0.14,lines[ii], ha='left',fontsize=9.5) for ii in xrange(len(lam)): ax.plot([lam[ii],lam[ii]],[0,1e5],linestyle='--',lw=1.5,color='k')
import numpy as np import matplotlib.pyplot as plt import spot_utils as pread from prospect.io.read_results import results_from from prospect.models import model_setup paramfile = 'ad_params.py' clargs = {'param_file': paramfile} run_params = model_setup.get_run_params(argv=paramfile, **clargs) print(run_params) obs = model_setup.load_obs(**run_params) sps = model_setup.load_sps(**run_params) model = model_setup.load_model(**run_params) wspec = sps.csp.wavelengths # *restframe* spectral wavelengths a = 1.0 + model.params.get('zred', 0.6) # cosmological redshifting wphot = np.array([f.wave_effective for f in obs['filters']]) # In [21] # grab results, powell results, and our corresponding models #res, pr, mod = results_from("{}_mcmc.h5".format(outroot)) res, pr, mod = results_from("demo_galphot_1508433060_mcmc.h5") # In [22] # To see how our MCMC samples look, we can examine a few traces choice = np.random.choice tracefig = pread.param_evol(res, figsize=(20, 10), chains=choice(128, size=10, replace=False))
# load sps model (default) sps = model_setup.load_sps(**run_params) print(sps) # In [6] # load noise model (none) spec_noise, phot_noise = model_setup.load_gp(**run_params) # In [7] # demo model model = model_setup.load_model(**run_params) # In [8] # demo data (generated from the script) # note: the phottable=photfile line is an addiiton obs = model_setup.load_obs(phottable=photfile, **run_params) #obs = model_setup.load_obs(**run_params) #print('Mock S/N={}'.format(obs['mock_snr'])) #if run_params['add_noise']: # print('Noise realization added to mock photometry') #else: # print('No noise added to mock photometry') # In [9] from prospect.likelihood import lnlike_spec, lnlike_phot, write_log # In [10] def lnprobfn(theta): """Given a parameter vector, a dictionary of observational data and a model object, return the ln of the posterior.
def compute_specmags(runname=None, outfolder=None): ''' step 1: load observed spectra, model spectra, photometry step 2: normalize model spectra to observed spectra (at red end, + blue if using u-band) step 3: meld them together step 4: calculate u, g, r mags from spectra step 5: plot spectral u, g, r versus photometric u, g, r dump into pickle file, call perform_wavelength_cal() to apply future steps: don't use super low-res spectra ''' print 'THIS FUNCTION IS BROKEN, UNTIL YOU LET THREED_DUTILS USE LUMDIST' from bsfh import model_setup if runname == None: runname = 'brownseds' #### load up prospector results filebase, parm_basename, ancilname=prosp_dutils.generate_basenames(runname) outname = os.getenv('APPS')+'/prospector_alpha/plots/'+runname+'/pcomp/sfrcomp.png' alldata = prospector_io.load_alldata(runname=runname) sps = prosp_dutils.setup_sps(custom_filter_key=None) optphot = np.zeros(shape=(3,len(alldata))) obsphot = np.zeros(shape=(3,len(alldata))) for ii,dat in enumerate(alldata): #### load up model spec z = dat['residuals']['phot']['z'] mod_spec = dat['bfit']['spec'] mod_wav = sps.wavelengths #### load up observed spec # arrives in maggies * Hz # change to maggies spec_dict = prospector_io.load_spectra(dat['objname']) opt_idx = spec_dict['source'] == 1 obs_wav = spec_dict['obs_lam'][opt_idx] obs_spec = spec_dict['flux'][opt_idx] / (3e18 / obs_wav) #### find adjoining sections in model minwav = np.min(obs_wav) maxwav = np.max(obs_wav) lamlim = (2800,7500) lower_join = (mod_wav > lamlim[0]) & (mod_wav < minwav) upper_join = (mod_wav < lamlim[1]) & (mod_wav > maxwav) #### normalize and combine # take 300 angstrom slices on either side dellam = 300 low_obs = obs_wav < minwav+dellam low_mod = (mod_wav < minwav + dellam) & (mod_wav > minwav) up_obs = obs_wav > maxwav-dellam up_mod = (mod_wav > maxwav - dellam) & (mod_wav < maxwav) # avoid known emission lines: [OII], [NII], Halpha, [SII] elines = np.array([3727,6549,6563,6583,6717,6731]) lambuff = 22 for line in elines: low_obs[(obs_wav > line - lambuff) & (obs_wav < line + lambuff)] = False low_mod[(mod_wav > line - lambuff) & (mod_wav < line + lambuff)] = False up_obs[(obs_wav > line - lambuff) & (obs_wav < line + lambuff)] = False up_mod[(mod_wav > line - lambuff) & (mod_wav < line + lambuff)] = False # calculate mean lownorm = np.mean(obs_spec[low_obs]) / np.mean(mod_spec[low_mod]) upnorm = np.mean(obs_spec[up_obs]) / np.mean(mod_spec[up_mod]) # combine comblam = np.concatenate((mod_wav[lower_join],obs_wav,mod_wav[upper_join])) combspec = np.concatenate((mod_spec[lower_join]*lownorm,obs_spec,mod_spec[upper_join]*upnorm)) # plot conjoined spectra if True: # observed spectra plt.plot(obs_wav,np.log10(obs_spec),color='black') #plt.plot(obs_wav[up_obs],np.log10(obs_spec[up_obs]),color='purple') #plt.plot(mod_wav[up_mod],np.log10(mod_spec[up_mod]),color='green') # post-break model plt.plot(mod_wav[lower_join],np.log10(mod_spec[lower_join]*lownorm),color='red') plt.plot(mod_wav[upper_join],np.log10(mod_spec[upper_join]*upnorm),color='red') plt.plot(mod_wav[lower_join],np.log10(mod_spec[lower_join]),color='grey') plt.plot(mod_wav[upper_join],np.log10(mod_spec[upper_join]),color='grey') # limits, save plt.xlim(2800,7200) plt.savefig('/Users/joel/code/python/prospector_alpha/plots/'+runname+'/pcomp/specnorm/'+dat['objname']+'.png',dpi=100) plt.close() #### convert combspec from maggies to Lsun/Hz pc2cm = 3.08568E18 dfactor = (1+z) / ( 4.0 * np.pi * (dat['residuals']['phot']['lumdist']*1e6*pc2cm)**2) combspec *= 3631*1e-23 / constants.L_sun.cgs.value / dfactor # to Jy, to erg/s/cm^2/Hz, to Lsun/cm^2/Hz, to Lsun/Hz #### integrate spectra, save mags optphot[0,ii],_ = prosp_dutils.integrate_mag(comblam,combspec,'SDSS Camera u',alt_file='/Users/joel/code/fsps/data/allfilters.dat',z=z) optphot[1,ii],_ = prosp_dutils.integrate_mag(comblam,combspec,'SDSS Camera g',alt_file='/Users/joel/code/fsps/data/allfilters.dat',z=z) optphot[2,ii],_ = prosp_dutils.integrate_mag(comblam,combspec,'SDSS Camera r',alt_file='/Users/joel/code/fsps/data/allfilters.dat',z=z) optphot[:,ii] = 10**(-0.4*optphot[:,ii]) #### save observed mags run_params = model_setup.get_run_params(param_file=parm_basename[ii]) obs = model_setup.load_obs(**run_params) obsphot[0,ii] = obs['maggies'][obs['filters'] == 'SDSS_u'] obsphot[1,ii] = obs['maggies'][obs['filters'] == 'SDSS_g'] obsphot[2,ii] = obs['maggies'][obs['filters'] == 'SDSS_r'] ##### plot kwargs = {'color':'0.5','alpha':0.8,'histtype':'bar','lw':2,'normed':1,'range':(0.5,2.0)} nbins = 80 x = obsphot / optphot t**s = [r'(photometric flux / spectral flux) [u-band]', r'(photometric flux / spectral flux) [g-band]', r'(photometric flux / spectral flux) [r-band]'] #### ALL GALAXIES fig, axes = plt.subplots(1, 3, figsize = (18.75,6)) for ii, ax in enumerate(axes): num, b, p = ax.hist(x[ii,:],nbins,**kwargs) save_xlim = ax.get_xlim() b = (b[:-1] + b[1:])/2. ax.set_ylabel('N') ax.set_xlabel(t**s[ii]) ax.set_xlim(save_xlim) ax.xaxis.set_major_locator(MaxNLocator(5)) plt.savefig('/Users/joel/code/python/prospector_alpha/plots/'+runname+'/pcomp/spectral_integration.png',dpi=dpi) plt.close() out = {'obs_phot':obsphot,'spec_phot':optphot} prospector_io.save_spec_cal(out,runname=runname)
def compare_sed(): ### custom parameter file ### where mass is a six-parameter thing param_file = 'brownseds_np_params.py' run_params = model_setup.get_run_params(param_file=param_file) sps = model_setup.load_sps(**run_params) model = model_setup.load_model(**run_params) obs = model_setup.load_obs(**run_params) thetas = model.initial_theta ### create star formation history and metallicity history mformed = 1e10 m_constant = return_declining_sfh(model,mformed, tau=1e12) met = return_zt(model) #met = np.ones_like(met) thetas[model.theta_labels().index('logzsol')] = 0.0 ### simple i1, i2 = model.theta_index['mass'] thetas[i1:i2] = m_constant nsamp = 21 met_comp = np.linspace(-1,0,nsamp) spec, phot = [], [] for m in met_comp: thetas[model.theta_labels().index('logzsol')] = m specx, photx, x = model.mean_model(thetas, obs, sps=sps) spec.append(specx) phot.append(photx) ### complex for i in xrange(met.shape[0]): # zero out all masses thetas[i1:i2] = np.zeros_like(m_constant) # fill in masses and metallicities thetas[model.theta_labels().index('logzsol')] = np.log10(met[i]) thetas[i1+i] = m_constant[i] # generate spectrum, add to existing spectrum sps.ssp.params.dirtiness = 1 specx, photx, x = model.mean_model(thetas, obs, sps=sps) if i == 0: spec_agez, phot_agez = specx, photx else: spec_agez += specx phot_agez += photx ### plot fig, ax = plt.subplots(1,1, figsize=(8, 7)) cmap = get_cmap(nsamp) for i in xrange(0,nsamp,4): ax.plot(sps.wavelengths/1e4, np.log10(spec[i] / spec_agez),color=cmap(i), label=met_comp[i]) ax.axhline(0, linestyle='--', color='0.1') ax.legend(loc=4,prop={'size':20},title=r'log(Z/Z$_{\odot}$) [fixed]') ax.set_xlim(0.1,10) ax.set_xscale('log',nonposx='clip',subsx=(2,5)) ax.xaxis.set_minor_formatter(minorFormatter) ax.xaxis.set_major_formatter(majorFormatter) ax.set_ylabel(r'log(f$_{\mathrm{Z}_{\mathrm{fixed}}}$ / f$_{\mathrm{Z(t)}}$)') ax.set_xlabel('wavelength [microns]') ax.set_ylim(-0.4,0.4) plt.tight_layout() plt.show() print 1/0
mpl.rc('text', usetex=True) mpl.rcParams['text.latex.preamble']=[r"\usepackage{bm}"] mpl.rcParams.update({'font.size': 30}) sfhsize = 40 #### parameter plot style colors = ['blue', 'black', 'red'] alpha = 0.8 lw = 3 #### define model param_file='/Users/joel/code/python/prospector_alpha/parameter_files/brownseds_np/brownseds_np_params.py' run_params = model_setup.get_run_params(param_file=param_file) sps = model_setup.load_sps(**run_params) model = model_setup.load_model(**run_params) obs = model_setup.load_obs(**run_params) #### output locations out1 = '/Users/joel/code/python/prospector_alpha/plots/brownseds_np/pcomp/model_diagram1.png' out2 = '/Users/joel/code/python/prospector_alpha/plots/brownseds_np/pcomp/model_diagram2.png' #### set initial theta # 'logmass','sfr_fraction_1', sfr_fraction_2, # sfr_fraction_3, sfr_fraction_4, 'sfr_fraction_5', # dust2', 'logzsol', 'dust_index', # 'dust1', 'duste_qpah', 'duste_gamma', # 'duste_umin' labels = model.theta_labels() itheta = np.array([10, 0.02, 0.1, 0.15, 0.2, 0.25,