from readgadget import *
import numpy as np
[docs]class ParticleData(object):
"""Class container for holding particle data. """
def __init__(self,obj):
self.obj = obj
self.opts = obj.rto.pygr_OPTS
[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,VEL=1,NE=1):
self.opts = self.obj.rto.pygr_OPTS
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, lowres_mass = [],[],[],[]
total_cnt = 0
for i in range(0,6):
if self.obj.nparts[i] > 0:
if (1<<i) & LOWRES:
total_cnt += COUNT.get(i)
self.obj.logOutput('reading %s...' % PARTS.get(i))
tmp = readsnap(s,'pos',PARTS.get(i),**self.opts)/h
lowres_x.extend(tmp[:,0])
lowres_y.extend(tmp[:,1])
lowres_z.extend(tmp[:,2])
tmp = readsnap(s,'mass',PARTS.get(i),**self.opts) * MCONVERT/h
lowres_mass.extend(tmp)
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
self.lowresmass = np.asarray(lowres_mass)
lowres_x = None
lowres_y = None
lowres_z = None
lowres_mass = None
return
if GAS:
self.gpos = readsnap(s,'pos', 'gas',**self.opts) / h
self.gvel = readsnap(s,'vel', 'gas',**self.opts) * vfactor
self.gmass = readsnap(s,'mass','gas',**self.opts) * MCONVERT/h
self.grho = readsnap(s,'rho', 'gas',**self.opts)
self.grho = self.grho.astype(np.float64) * MCONVERT * h**2 / LCONVERT**3
self.gTemp = readsnap(s,'u', 'gas',units=1,**self.opts)
self.gu = readsnap(s,'u', 'gas',**self.opts)
self.gsfr = readsnap(s,'sfr', 'gas',**self.opts)
self.gHSML = readsnap(s,'hsml','gas',**self.opts) / h
self.gnh = readsnap(s,'nh', 'gas',**self.opts)
if NE:
self.gne = readsnap(s,'ne','gas',**self.opts)
if self.obj.snapAttribs.flagMetals:
self.gZ = readsnap(s,'z','gas',**self.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.opts)
#self.gsigma = readsnap(s,'sigma','gas',**self.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.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.opts) / h
self.svel = readsnap(s,'vel', 'star',**self.opts) * vfactor
self.smass = readsnap(s,'mass','star',**self.opts) * MCONVERT/h
if self.obj.snapAttribs.flagMetals:
self.sZ = readsnap(s,'z','star',**self.opts)
else:
self.sZ = np.zeros(self.n_star,dtype=np.float32)
if self.obj.snapAttribs.flagAge:
self.sage = readsnap(s,'age','star',**self.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.opts)
if self.massTable[1] > 0:
self.dmmass = self.massTable[1] * MCONVERT/h
else:
self.dmmass = readsnap(s,'mass','dm',**self.opts) * MCONVERT/h
if CONSERVE:
self.obj.logOutput('CONSERVE_MEMORY=1, not reading in dmpos! (no maxrad calc)',indent=1)
return
self.dmpos = readsnap(s,'pos', 'dm',**self.opts) / h
if VEL:
self.dmvel = readsnap(s,'vel', 'dm',**self.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')