from readgadget import *
import numpy as np
[docs]class ParticleData(object):
"""Class container for holding particle data. """
def __init__(self,obj):
self.obj = obj
[docs] def getParticleIDs(self, GAS=0, STAR=1, DM=0):
if GAS: self.gIDs = readsnap(self.obj.snap,'pid','gas', **self.obj.rto.pygr_OPTS)
if STAR: self.sIDs = readsnap(self.obj.snap,'pid','star',**self.obj.rto.pygr_OPTS)
if DM: self.dmIDs = readsnap(self.obj.snap,'pid','dm', **self.obj.rto.pygr_OPTS)
[docs] def deleteParticleIDs(self):
if hasattr(self,'gIDs'): del self.gIDs
if hasattr(self,'sIDs'): del self.sIDs
if hasattr(self,'dmIDs'): del self.dmIDs
[docs] def getRawParticleData(self):
self.raw_grho = readsnap(self.obj.snap,'rho','gas',**self.obj.rto.pygr_OPTS)
self.raw_gu = readsnap(self.obj.snap,'u','gas',**self.obj.rto.pygr_OPTS)
[docs] def getParticleData(self, GAS=1, STAR=1, DM=1, DISK=0, BULGE=0, BNDRY=0,
LOWRES=0, GRHO_UNITS=1, METALARRAY=0,CONSERVE=0):
MCONVERT = self.obj.conversionFactors.MCONVERT
LCONVERT = self.obj.conversionFactors.LCONVERT
vfactor = self.obj.conversionFactors.vfactor
s = self.obj.snap
h = self.obj.h
if LOWRES > 0:
PARTS = {0:'gas',1:'dm',2:'disk',3:'bulge',4:'star',5:'bndry'}
COUNT = {0:self.obj.nparts[0],1:self.obj.nparts[1],2:self.obj.nparts[2],
3:self.obj.nparts[3],4:self.obj.nparts[4],5:self.obj.nparts[5]}
lowres_x, lowres_y, lowres_z = [],[],[]
total_cnt = 0
for i in range(0,6):
if self.obj.nparts[i] > 0:
if (1<<i) & (self.obj.rto.ZOOM_LOWRES):
total_cnt += COUNT.get(i)
self.obj.logOutput('reading %s...' % PARTS.get(i))
tmp = readsnap(s,'pos',PARTS.get(i),**self.obj.rto.pygr_OPTS)/h
lowres_x.extend(tmp[:,0])
lowres_y.extend(tmp[:,1])
lowres_z.extend(tmp[:,2])
self.lowrespos = np.zeros((total_cnt,3),dtype=np.float32)
self.lowrespos[:,0] = lowres_x
self.lowrespos[:,1] = lowres_y
self.lowrespos[:,2] = lowres_z
lowres_x = None
lowres_y = None
lowres_z = None
return
if GAS:
self.gpos = readsnap(s,'pos','gas',**self.obj.rto.pygr_OPTS) / h
self.gvel = readsnap(s,'vel','gas',**self.obj.rto.pygr_OPTS) * vfactor
self.gmass = readsnap(s,'mass','gas',**self.obj.rto.pygr_OPTS) * MCONVERT/h
self.grho = readsnap(s,'rho', 'gas',**self.obj.rto.pygr_OPTS)
self.grho = self.grho.astype(np.float64) * MCONVERT * h**2 / LCONVERT**3
self.gTemp = readsnap(s,'u','gas',units=1,**self.obj.rto.pygr_OPTS)
#self.gu = readsnap(s,'u','gas',**self.obj.rto.pygr_OPTS)
self.gsfr = readsnap(s,'sfr','gas',**self.obj.rto.pygr_OPTS)
self.gHSML = readsnap(s,'hsml','gas',**self.obj.rto.pygr_OPTS) / h
self.gnh = readsnap(s,'nh','gas',**self.obj.rto.pygr_OPTS)
self.gne = readsnap(s,'ne','gas',**self.obj.rto.pygr_OPTS)
if self.obj.snapAttribs.flagMetals:
self.gZ = readsnap(s,'z','gas',**self.obj.rto.pygr_OPTS)
else:
self.gZ = np.zeros(self.obj.nparts[0],dtype=np.float32)
if self.obj.snapAttribs.flagFH2:
self.gfH2 = readsnap(s,'fh2','gas',**self.obj.rto.pygr_OPTS)
self.gsigma = readsnap(s,'sigma','gas',**self.obj.rto.pygr_OPTS)
else:
self.gfH2 = np.zeros(self.obj.nparts[0],dtype=np.float32)
self.gsigma = np.zeros(self.obj.nparts[0],dtype=np.float32)
if METALARRAY and self.obj.snapAttribs.flagMetals > 1:
self.zarray = readsnap(s,'metals','gas',**self.obj.rto.pygr_OPTS)
## grho currently in Msun/kpc^3, lets now move to g/cm^3
if GRHO_UNITS:
self.grho *= self.obj.constants.Msun_in_g ## to grams
self.grho /= self.obj.constants.kpc_to_cm**3 ## to cm^3
self.grho /= self.obj.snapAttribs.time**3 ## to physical
if self.obj.file_type == 'TIPSY':
self.gpos *= h
self.gpos += 0.5
self.gpos *= LCONVERT
self.gHSML *= LCONVERT * h
if STAR:
if self.obj.snapAttribs.n_star > 0:
self.spos = readsnap(s,'pos', 'star',**self.obj.rto.pygr_OPTS) / h
self.svel = readsnap(s,'vel', 'star',**self.obj.rto.pygr_OPTS) * vfactor
self.smass = readsnap(s,'mass','star',**self.obj.rto.pygr_OPTS) * MCONVERT/h
if self.obj.snapAttribs.flagMetals:
self.sZ = readsnap(s,'z','star',**self.obj.rto.pygr_OPTS)
else:
self.sZ = np.zeros(self.n_star,dtype=np.float32)
if self.obj.snapAttribs.flagAge:
self.sage = readsnap(s,'age','star',**self.obj.rto.pygr_OPTS)
else:
self.sage = np.zeros(self.n_star,dtype=np.float32)
else:
self.spos = np.zeros((0,3),dtype=np.float32)
self.svel = np.zeros((0,3),dtype=np.float32)
self.smass = np.zeros(0,dtype=np.float32)
self.sZ = np.zeros(0,dtype=np.float32)
self.sage = np.zeros(0,dtype=np.float32)
if self.obj.file_type == 'TIPSY':
self.spos *= h
self.spos += 0.5
self.spos *= LCONVERT
if DM:
self.massTable = readhead(s,'mass',**self.obj.rto.pygr_OPTS)
if self.massTable[1] > 0:
self.dmmass = self.massTable[1] * MCONVERT/h
else:
self.dmmass = readsnap(s,'mass','dm',**self.obj.rto.pygr_OPTS) * MCONVERT/h
if CONSERVE:
self.obj.logOutput('CONSERVE_MEMORY=1, not reading in dmpos & dmvel!',indent=1)
return
self.dmpos = readsnap(s,'pos', 'dm',**self.obj.rto.pygr_OPTS) / h
self.dmvel = readsnap(s,'vel', 'dm',**self.obj.rto.pygr_OPTS) * vfactor
if self.obj.file_type == 'TIPSY':
self.dmpos *= h
self.dmpos += 0.5
self.dmpos *= LCONVERT
[docs] def cleanUp(self):
self.deleteParticleData()
self.deleteParticleIDs()
[docs] def deleteAttribute(self,attrib):
if hasattr(self, attrib):
delattr(self,attrib)
[docs] def deleteParticleData(self):
'Function to delete particle data from the object for storing'
self.deleteAttribute('gpos')
self.deleteAttribute('gvel')
self.deleteAttribute('gmass')
self.deleteAttribute('grho')
self.deleteAttribute('gTemp')
self.deleteAttribute('gsfr')
self.deleteAttribute('gZ')
self.deleteAttribute('gHSML')
self.deleteAttribute('gnh')
self.deleteAttribute('gne')
self.deleteAttribute('gfH2')
self.deleteAttribute('gsigma')
self.deleteAttribute('zarray')
self.deleteAttribute('spos')
self.deleteAttribute('svel')
self.deleteAttribute('smass')
self.deleteAttribute('sZ')
self.deleteAttribute('sage')
self.deleteAttribute('dmpos')
self.deleteAttribute('dmvel')
self.deleteAttribute('dmmass')
self.deleteAttribute('lowrespos')