Source code for progenner

from common import *
from pylab import *


[docs]def progenInit(objs,SN1,SN2, IDs,progenType): """Function used to initialize progen data. Parameters ---------- objs : list List of SPHGR objects SN1 : int Starting snapnum SN2 : int Ending snapnum (typically 0) IDs : list List of galaxy or halo indexes of interest progenType : string specify 'galaxy' or 'halo' Notes ----- This function does not return anything. However, it does add the following information to the root of your object (data not saved to disk): 'galaxy' ******** - obj.galaxies[n].progen_z - obj.galaxies[n].progen_indexes - obj.galaxies[n].progen_central - obj.galaxies[n].progen_cmx - obj.galaxies[n].progen_cmy - obj.galaxies[n].progen_cmz - obj.galaxies[n].progen_HMR - obj.galaxies[n].progen_FMR - obj.galaxies[n].progen_SFR - obj.galaxies[n].progen_gas_mass - obj.galaxies[n].progen_stellar_mass - obj.galaxies[n].progen_total_mass - obj.galaxies[n].progen_halo_mass - obj.galaxies[n].progen_halo_gmass - obj.galaxies[n].progen_halo_smass - obj.galaxies[n].progen_indexes2 - obj.galaxies[n].progen_central2 - obj.galaxies[n].progen_cmx2 - obj.galaxies[n].progen_cmy2 - obj.galaxies[n].progen_cmz2 - obj.galaxies[n].progen_HMR2 - obj.galaxies[n].progen_FMR2 - obj.galaxies[n].progen_SFR2 - obj.galaxies[n].progen_gas_mass2 - obj.galaxies[n].progen_stellar_mass2 - obj.galaxies[n].progen_total_mass2 - obj.galaxies[n].progen_halo_mass2 - obj.galaxies[n].progen_halo_gmass2 - obj.galaxies[n].progen_halo_smass2 'halo' ****** - obj.halos[n].progen_z = z - obj.halos[n].progen_r = r - obj.halos[n].progen_m = m Examples -------- >>> import initSnap as iS >>> pList = iS.initSnap(SNAPNUM1,SNAPNUM1) >>> sims = [] >>> for i in range(0,len(pList)): >>> sims.append(iS.loadPickle(pList[i])) >>> progenInit(sims,SNAPNUM1,SNAPNUM2,'galaxy') """ snaps = np.arange(SN2,SN1+1,1) ## check for progen files ## for i in range(0,len(objs)): query_progens(objs[i],snaps,progenType) print shape(IDs) if shape(IDs)[0] == 1: IDs = [IDs] print IDs ## process galaxy history ## for i in range(0,len(objs)): for j in range(0,len(IDs[i])): if progenType == 'galaxy': print IDs[i][j] getGalaxyProgens(objs[i],IDs[i][j]) else: getHaloProgens(objs[i],IDs[i][j]) return
[docs]def query_progens(obj,snaps,progenType): """Function to check for the exitstance of PROGEN files on disk. Parameters ---------- obj : SPHGR object snaps : numpy_array array of snapshots going from SN2-->SN1+1 See Also -------- progenInit Examples -------- >>> for i in range(0,len(objs)): >>> query_progens(objs[i],snaps) """ progens = [] missing = [] for i in snaps: progen_tmp = '%s/%s_progens_%04d_to_%04d.npz' % (obj.locs.PROGEN_DIR, progenType,i,i-1) if os.path.isfile(progen_tmp): progens.append(progen_tmp) elif i > 0: #print 'could not find',progen_tmp missing.append(progen_tmp[-16:-4]) obj.locs.progen_files = progens obj.locs.progen_missing = missing return
[docs]def getGalaxyProgens(obj,galID): """Function to gather galaxy PROGEN data Parameters ---------- obj : SPHGR object galID : galaxy ID to PROGEN Notes ----- This function is responsible for filling out the progen_data within the SPHGR object. It reads in progen_SNAPNUM1_to_SNAPNUM2, and finds information about the the galaxy in the previous snapshot, then leapfrogs backwards until a -1 is encountered in the index. Examples -------- >>> for i in range(0,len(objs)): >>> getGalaxyProgens(objs[i],galaxyIDs[i]) """ dataLen = len(obj.locs.progen_files) z, HMR, FMR, SFR, T_M, G_M, S_M = [],[],[],[],[],[],[] HM, HGM, HSM = [],[],[] CENTRAL = [] INDEXLIST = [] cmx,cmy,cmz=[],[],[] alpha = [] beta = [] HMR2, FMR2, SFR2, T_M2, G_M2, S_M2 = [],[],[],[],[],[] cmx2,cmy2,cmz2,CENTRAL2,HM2,HGM2,HSM2 = [],[],[],[],[],[],[] INDEXLIST2=[] print 'PROGEN-ING GAL',galID j = galID INDEXLIST.append(int(j)) ## load in data from current snapshot object ## h = obj.h time = 1. / (1.+obj.redshift) z.append(obj.redshift) HMR.append(obj.galaxies[j].HMR * time) FMR.append(obj.galaxies[j].FMR * time) SFR.append(obj.galaxies[j].sfr) T_M.append(obj.galaxies[j].gas_mass + obj.galaxies[j].stellar_mass) G_M.append(obj.galaxies[j].gas_mass) S_M.append(obj.galaxies[j].stellar_mass) HM.append( obj.galaxies[j].halo_mass) HGM.append(obj.galaxies[j].halo_gmass) HSM.append(obj.galaxies[j].halo_smass) CENTRAL.append(obj.galaxies[j].central) cmx.append(obj.galaxies[j].cm[0]*h) cmy.append(obj.galaxies[j].cm[1]*h) cmz.append(obj.galaxies[j].cm[2]*h) alpha.append(obj.galaxies[j].ALPHA) beta.append(obj.galaxies[j].BETA) HMR2.append(0) FMR2.append(0) SFR2.append(0) T_M2.append(0) G_M2.append(0) S_M2.append(0) HM2.append(0) HGM2.append(0) HSM2.append(0) cmx2.append(0) cmy2.append(0) cmz2.append(0) CENTRAL2.append(0) INDEXLIST2.append(int(j)) print 'MISSING:' for i in range(0,len(obj.locs.progen_missing)): print obj.locs.progen_missing[i] indexer = np.arange(0,len(obj.locs.progen_files)) print indexer for i in indexer[::-1]: ## we first read in progen_SNAPNUM1_to_SNAPNUM2, ## this gives us information about the progen ## galaxy in the previous snapshot, then we leapfrog ## backwards until a -1 is encountered in the index #print('reading in %s' % obj.progen_files[i]) #yum = np.load(obj.locs.progen_files[i]) #progens = yum['progen'] progens = np.load(obj.locs.progen_files[i]) #prev_index = progens[j,1] prev_index = progens['index'][j] if prev_index == -1: break redshift = progens['redshift'] time = 1.0 / (1.0 + redshift) z.append(float(redshift)) HMR.append(progens['HMR'][j] * time) FMR.append(progens['FMR'][j] * time) SFR.append(progens['sfr'][j]) G_M.append(progens['gmass'][j]) S_M.append(progens['smass'][j]) T_M.append(progens['gmass'][j]+progens['smass'][j]) HM.append( progens['RS_mass'][j]) HGM.append(progens['RS_gmass'][j]) HSM.append(progens['RS_smass'][j]) CENTRAL.append(progens['central'][j]) alpha.append(progens['ALPHA'][j]) beta.append( progens['BETA'][j]) cmx.append(progens['cm'][j,0]*h) cmy.append(progens['cm'][j,1]*h) cmz.append(progens['cm'][j,2]*h) ####### SECOND MOST MASSIVE PROGEN ####### prev_index2 = progens['index2'][j] HMR2.append(progens['HMR2'][j] * time) FMR2.append(progens['FMR2'][j] * time) SFR2.append(progens['sfr2'][j]) G_M2.append(progens['gmass2'][j]) S_M2.append(progens['smass2'][j]) T_M2.append(progens['gmass2'][j]+progens['smass2'][j]) HM2.append( progens['RS_mass2'][j]) HGM2.append(progens['RS_gmass2'][j]) HSM2.append(progens['RS_smass2'][j]) CENTRAL2.append(progens['central2'][j]) cmx2.append(progens['cm'][j,0]*h) cmy2.append(progens['cm'][j,1]*h) cmz2.append(progens['cm'][j,2]*h) """ redshift = progens[j,0] time = 1./(1.+redshift) z.append(redshift) HMR.append(progens[j,5] * time) FMR.append(progens[j,6] * time) SFR.append(progens[j,9]) G_M.append(progens[j,7]) S_M.append(progens[j,8]) T_M.append(progens[j,7]+progens[j,8]) HM.append( progens[j,11]) HGM.append(progens[j,12]) HSM.append(progens[j,13]) CENTRAL.append(int(progens[j,14])) cmx.append(progens[j,2]*h) cmy.append(progens[j,3]*h) cmz.append(progens[j,4]*h) ####### SECOND MOST MASSIVE PROGEN ####### prev_index2 = progens[j,15] HMR2.append(progens[j,5+14] * time) FMR2.append(progens[j,6+14] * time) SFR2.append(progens[j,9+14]) G_M2.append(progens[j,7+14]) S_M2.append(progens[j,8+14]) T_M2.append(progens[j,7+14]+progens[j,8+14]) HM2.append( progens[j,11+14]) HGM2.append(progens[j,12+14]) HSM2.append(progens[j,13+14]) CENTRAL2.append(int(progens[j,14+14])) cmx2.append(progens[j,2+14]*h) cmy2.append(progens[j,3+14]*h) cmz2.append(progens[j,4+14]*h) """ ## assign index for nex iteration ## j = prev_index INDEXLIST.append(int(j)) INDEXLIST2.append(int(prev_index2)) ## assign data to object ## obj.galaxies[galID].progen_z = z obj.galaxies[galID].progen_HMR = HMR obj.galaxies[galID].progen_FMR = FMR obj.galaxies[galID].progen_SFR = SFR obj.galaxies[galID].progen_gas_mass = G_M obj.galaxies[galID].progen_stellar_mass = S_M obj.galaxies[galID].progen_total_mass = T_M obj.galaxies[galID].progen_halo_mass = HM obj.galaxies[galID].progen_halo_gmass = HGM obj.galaxies[galID].progen_halo_smass = HSM obj.galaxies[galID].progen_central = CENTRAL obj.galaxies[galID].progen_indexes = INDEXLIST obj.galaxies[galID].progen_cmx = cmx obj.galaxies[galID].progen_cmy = cmy obj.galaxies[galID].progen_cmz = cmz obj.galaxies[galID].progen_ALPHA = alpha obj.galaxies[galID].progen_BETA = beta ### SECOND MOST MASSIVE PROGEN ### obj.galaxies[galID].progen_HMR2 = HMR2 obj.galaxies[galID].progen_FMR2 = FMR2 obj.galaxies[galID].progen_SFR2 = SFR2 obj.galaxies[galID].progen_gas_mass2 = G_M2 obj.galaxies[galID].progen_stellar_mass2 = S_M2 obj.galaxies[galID].progen_total_mass2 = T_M2 obj.galaxies[galID].progen_halo_mass2 = HM2 obj.galaxies[galID].progen_halo_gmass2 = HGM2 obj.galaxies[galID].progen_halo_smass2 = HSM2 obj.galaxies[galID].progen_central2 = CENTRAL2 obj.galaxies[galID].progen_indexes2 = INDEXLIST2 obj.galaxies[galID].progen_cmx2 = cmx2 obj.galaxies[galID].progen_cmy2 = cmy2 obj.galaxies[galID].progen_cmz2 = cmz2
[docs]def getHaloProgens(obj,halID): dataLen = len(obj.locs.progen_files) z, r, m = [],[],[] CENTRAL = [] INDEXLIST = [] cmx,cmy,cmz=[],[],[] print 'PROGEN-ING HALO',halID j = halID INDEXLIST.append(int(j)) ## load in data from current snapshot object ## h = obj.h z.append(obj.redshift) r.append(obj.halos[j].r200 / (1.+obj.redshift)) m.append(obj.halos[j].mass) #CENTRAL.append(obj.galaxies[j].central) #cmx.append(obj.galaxies[j].cm[0]*h) #cmy.append(obj.galaxies[j].cm[1]*h) #cmz.append(obj.galaxies[j].cm[2]*h) print 'MISSING:' for i in range(0,len(obj.locs.progen_missing)): print obj.locs.progen_missing[i] indexer = np.arange(0,len(obj.locs.progen_files)) for i in indexer[::-1]: ## we first read in progen_SNAPNUM1_to_SNAPNUM2, ## this gives us information about the progen ## galaxy in the previous snapshot, then we leapfrog ## backwards until a -1 is encountered in the index #print('reading in %s' % obj.progen_files[i]) progens = np.load(obj.locs.progen_files[i]) prev_index = progens['index'][j] if prev_index == -1: break redshift = progens['redshift'] time = 1.0 / (1.0 + redshift) z.append(redshift) r.append(progens['radius'][j] * time) m.append(progens['mass'][j]) """ yum = np.load(obj.locs.progen_files[i]) progens = yum['progen'] prev_index = progens[j,0] if prev_index == -1: print 'breaking at',i break redshift = progens[j,1] z.append(redshift) r.append(progens[j,3] / (1.+redshift)) m.append(progens[j,2]) #CENTRAL.append(int(progens[j,14])) #cmx.append(progens[j,2]*h) #cmy.append(progens[j,3]*h) #cmz.append(progens[j,4]*h) """ ## assign index for nex iteration ## j = prev_index INDEXLIST.append(int(j)) ## assign data to object ## obj.halos[halID].progen_z = z obj.halos[halID].progen_r = r obj.halos[halID].progen_m = m #obj.galaxies[galID].progen_central = CENTRAL #obj.galaxies[galID].progen_indexes = INDEXLIST #obj.galaxies[galID].progen_cmx = cmx #obj.galaxies[galID].progen_cmy = cmy #obj.galaxies[galID].progen_cmz = cmz
[docs]class progenPlot(object): """Class to assist in the plotting of PROGEN data. Parameters ---------- objs : list of SPHGR objects galIDs : list of galaxy IDs to plot COLORS : list of colors LABELS : list of labels """ def __init__(self,objs,galIDs,COLORS,LABELS): self.makeplot(objs,galIDs,COLORS,LABELS)
[docs] def makeplot(self,objs,galIDs,COLORS,LABELS): fig=figure() ax1=fig.add_subplot(111) ax2=twinx() legendlinestmp = [] for i in range(0,len(objs)): for j in range(0,len(galIDs[i])): FS = objs[i].rto.FS if not objs[i].snapAttribs.DM_ONLY: curGal = objs[i].galaxies[galIDs[i][j]] x = curGal.progen_z l1 = ax1.plot(x, np.log10(curGal.progen_total_mass), '-', color=COLORS[i],lw=1.5, label='%s total M' % LABELS[i]) l2 = ax1.plot(x, np.log10(curGal.progen_stellar_mass), '*-',color=COLORS[i],mfc=COLORS[i], label='%s stellar' % LABELS[i]) l3 = ax1.plot(x, np.log10(curGal.progen_gas_mass), 'o-',color=COLORS[i],mfc=COLORS[i], label='%s gas' % LABELS[i]) l4 = ax2.plot(x, np.log10(curGal.progen_SFR), '-.',color=COLORS[i], label='%s SFR' % LABELS[i]) l5 = ax2.plot(x, np.log10(curGal.progen_HMR), '--',color=COLORS[i], label='%s HMR' % LABELS[i]) #l6 = ax1.plot(x, np.log10(curGal.progen_halo_mass) , # '-', color='k', label='RS mass') #l7 = ax1.plot(x, np.log10(curGal.progen_halo_gmass), # '--',color='k', label='RS gmass') #l8 = ax1.plot(x, np.log10(curGal.progen_halo_smass), # '-.',color='k', label='RS smass') legendlinestmp.extend((l1,l2,l3,l4,l5)) else: curHalo = objs[i].halos[galIDs[i][j]] x = curHalo.progen_z l1 = ax1.plot(x, np.log10(curHalo.progen_m), '-',color=COLORS[i],lw=1.5, label='%s Mass' % LABELS[i]) l2 = ax2.plot(x, np.log10(curHalo.progen_r), '--',color=COLORS[i], label='%s r' % LABELS[i]) legendlinestmp.extend((l1,l2)) #gca().invert_xaxis() #ax1.set_xlabel(r'$z$',fontsize=FS) #ax1.set_ylabel(r'Log M [M$_\odot$]',fontsize=FS) #ax2.set_ylabel(r'Log r [kpc]',fontsize=FS) #ax1.minorticks_on() #ax2.minorticks_on() #return legendlines = legendlinestmp[0] for i in range(1,len(legendlinestmp)): legendlines += legendlinestmp[i] legendlabels = [l.get_label() for l in legendlines] l100 = ax2.plot(0,0,'k-',label=r'M$_{total}$') l101 = ax2.plot(0,0,'*-',color='k',label=r'M$_\star$') l102 = ax2.plot(0,0,'o-',color='k',label=r'M$_{gas}$') l103 = ax2.plot(0,0,'-.',color='k',label=r'SFR') l104 = ax2.plot(0,0,'--',color='k',label=r'HMR') legendlines1 = l100+l101+l102+l103+l104 legendlabels1 = [l.get_label() for l in legendlines1] legendlines2=[] for i in range(0,len(objs)): ltmp = ax2.fill(0,0,color=COLORS[i],label=LABELS[i]) legendlines2.extend(ltmp) legendlabels2 = [l.get_label() for l in legendlines2] gca().invert_xaxis() ax1.minorticks_on() ax2.minorticks_on() #ax1.legend(legendlines, legendlabels, loc=2,frameon=True,fancybox=True) legend1 = ax1.legend(legendlines1, legendlabels1, loc=2,frameon=True,fancybox=True) ax1.legend(legendlines2, legendlabels2, loc=4,frameon=True,fancybox=True) gca().add_artist(legend1) ax1.set_xlabel(r'$z$',fontsize=FS) ax1.set_ylabel(r'Log M [M$_\odot$]',fontsize=FS) ax2.set_ylabel(r'Log SFR [M$_\odot$ yr$^{-1}$], Log r [kpc]', fontsize=FS)