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)