def metalProfile(group, nbins=20, center="pot", family="bar"): if (group in charm.getGroups()) == False: print "Group does not exist, please try again." return if (family in ["star", "bar", "gas"]) == False: print 'Invalid family. Need "bar","gas", or "star"' return center = findcenter.findCenter(group2=group, method=center) radialStep = getgroupradius.getGroupRadius(group, center) / nbins metalRad = [0] * (nbins) metalProf = [0] * (nbins) numStar = charm.getNumParticles(group, "star") numGas = charm.getNumParticles(group, "gas") if (numGas == 0) & (numStar == 0): return metalProf if (numStar != 0) & (family == "star"): charm.createGroup_Family("groupMetStar", group, "star") metalStar = charm.reduceParticle("groupMetStar", massMetal, reduceMassMetal, (radialStep, center)) for i in range(len(metalStar)): metalProf[metalStar[i][0]] = metalStar[i][1] / metalStar[i][2] if (numGas != 0) & (family == "gas"): charm.createGroup_Family("groupMetGas", group, "gas") metalGas = charm.reduceParticle("groupMetGas", massMetal, reduceMassMetal, (radialStep, center)) for i in range(len(metalGas)): metalProf[metalGas[i][0]] = metalGas[i][1] / metalGas[i][2] if family == "bar": charm.createGroup_Family("groupMetGas", group, "gas") charm.createGroup_Family("groupMetStar", group, "star") metalProfGas = [[0, 0]] * nbins metalProfStar = [[0, 0]] * nbins metalGas = charm.reduceParticle("groupMetGas", massMetal, reduceMassMetal, (radialStep, center)) for i in range(len(metalGas)): metalProfGas[metalGas[i][0]][0] = metalGas[i][1] metalProfGas[metalGas[i][0]][1] = metalGas[i][2] metalStar = charm.reduceParticle("groupMetStar", massMetal, reduceMassMetal, (radialStep, center)) for i in range(len(metalStar)): metalProfStar[metalStar[i][0]][0] = metalStar[i][1] metalProfStar[metalStar[i][0]][1] = metalStar[i][2] for i in range(len(metalProf)): metalTot = metalProfStar[i][0] + metalProfGas[i][0] massTot = metalProfStar[i][1] + metalProfGas[i][1] if massTot != 0: metalProf[i] = metalTot / massTot for i in range(nbins): metalRad[i] = (i + 0.5) * radialStep return (metalRad, metalProf)
def SFRSurfaceProfile(minRadius=.1, numBins=50,tstep='00512',nbins=500): """Returns the list of tuples (radius, SFR, diskSFR, bulgeSFR) in solar masses/year! (for the 0.5Gyr preceding each time)""" #read in initial masses from file filename = quesoConfig.dataDir + quesoConfig.preTimestepFilename + tstep + ".massform" charm.readTipsyArray(filename,'initialMass') virialRadius = virialgroup.getVirialGroup() rgal = quesoConfig.rgalFraction*virialRadius center = findcenter.findCenter() radialStep = ((math.log10(rgal)-math.log10(minRadius))/(float(numBins)-1)) simTime = getSimTime(timestep=tstep)/quesoConfig.timeunit #time in simulation units sfr = [[]]*numBins #initialize relevant attributes galcoord.calcGalacticCoordinates() #create sphere of stars charm.createGroupAttributeSphere('galStar', 'All', 'position', center[0], center[1], center[2], rgal) charm.createGroup_Family('galStar', 'galStar', 'star') formHigh = simTime formLow = formHigh-quesoConfig.sfrLookback/quesoConfig.timeunit param = (formLow, formHigh, radialStep, quesoConfig.kpcunit*charm.getTime(), minRadius) reduceResult = charm.reduceParticle('galStar' , mapSFRProfile, reduceSFRProfile, param) print reduceResult print (formLow,formHigh) maxbin=0 for i in range(0,len(reduceResult)): if (reduceResult[i][0]>maxbin):maxbin=reduceResult[i][0] for i in range(0,len(reduceResult)): radiusOut = math.pow(10, radialStep*reduceResult[i][0]) radiusInside = math.pow(10, radialStep*(reduceResult[i][0]-1)) radius = (radiusOut+radiusInside)/2 area = math.pi*(radiusOut**2-radiusInside**2) formationRate = reduceResult[i][1]*quesoConfig.msolunit/quesoConfig.sfrLookback/area #msolar/yr/kpc^2 bin = reduceResult[i][0]+numBins-maxbin-1 sfr[bin]=(radius, formationRate) print sfr[bin] for i in range(0,numBins): if (sfr[i] == []): radiusOut = math.pow(10, radialStep*(i+1)) radiusInside = math.pow(10, radialStep*i) radius = (radiusOut+radiusInside)/2 sfr[i]=(radius,0,0,0) sfrData = [[],[]] for i in range(len(sfr)): sfrData[0].append(sfr[i][0]) sfrData[1].append(sfr[i][1]) return sfrData
def getSFRTimeProfile(nbins=500): """Returns the list of tuples (time, SFR) in solar masses/year! (for the 0.5Gyr preceding each time)""" #read in initial masses from file filename = quesoConfig.dataDir + quesoConfig.preTimestepFilename + quesoConfig.nTimesteps + ".massform" charm.readTipsyArray(filename,'initialMass') simTime = getSimTime()/quesoConfig.timeunit #time in simulation units profileTStep = simTime/nbins sfr = [(0,0)]*nbins center = findcenter.findCenter() rgal = virialgroup.getVirialGroup()*quesoConfig.rgalFraction charm.createGroupAttributeSphere('galStar', 'star', 'position', center[0], center[1], center[2], rgal) #Particles within galactic radius charm.createGroup_Family('galStar', 'galStar', 'star') param = (profileTStep, nbins) reduceResult = charm.reduceParticle('galStar' , mapSFR, reduceSFR, param) #sum = 0.0 for i in range(0,len(reduceResult)): #try: formationRate = reduceResult[i][1]*quesoConfig.msolunit/(profileTStep*quesoConfig.timeunit) #msolar/yr age = (simTime -reduceResult[i][0]*profileTStep)*quesoConfig.timeunit/1e9 #in gyr sfr[reduceResult[i][0]-1] =(age, formationRate) return sfr
def findCenter(group='All', cent='pot'): """ Finds the center of a given group based on cent= 'com' or 'pot', center of mass or potential minimum respectively. """ return findcenter.findCenter(group2=group, method=cent)
def writeBoxAscii(boxRadius, filename, angMomGroup=None, centerMethod ='pot'): """Writes out an tipsy-ascii (filename) representation for a box aligned with the galactic coordinate system spanning +-boxRadius (given in kpc) in the galcoord directions. center can be 'pot' or 'com'. Default angMomGroup is cold galactic gas.""" if (angMomGroup==None): angMomGroup = 'angMomGroup' center = findcenter.findCenter(method=centerMethod) virialRadius = virialgroup.getVirialGroup() charm.createGroupAttributeSphere('angMomGroup', 'All', 'position', center[0], center[1], center[2], virialRadius*quesoConfig.rgalFraction) charm.createGroup_Family('angMomGroup', 'angMomGroup', 'gas') charm.createGroup_AttributeRange('angMomGroup', 'angMomGroup', 'temperature', 0, quesoConfig.coldGasTemp) else: center = findcenter.findCenter(group2=angMomGroup,method=center) boxRad1 = boxRadius/(charm.getTime()*quesoConfig.kpcunit) print 'here' galcoord.calcGalacticCoordinates(angMomGroup=angMomGroup, center=centerMethod) galZ = vectormath.normalizeVector(angmom.getAngMomVector(angMomGroup)) galX = vectormath.normalizeVector(vectormath.crossVectors((0,1,0),galZ)) galY = vectormath.normalizeVector(vectormath.crossVectors(galZ,galX)) #=========================================================================== # Create the cube #=========================================================================== cornerVec = vectormath.addVectors(vectormath.multVectorScalar(boxRad1, galX),vectormath.multVectorScalar(boxRad1, galY)) cornerVec = vectormath.addVectors(cornerVec,vectormath.multVectorScalar(boxRad1, galZ)) cornerVec = vectormath.subVectors(center, cornerVec) edge1 = vectormath.multVectorScalar(2*boxRad1,galX) edge2 = vectormath.multVectorScalar(2*boxRad1,galY) edge3 = vectormath.multVectorScalar(2*boxRad1,galZ) charm.createGroupAttributeBox('galBox', 'All', 'position', cornerVec[0],cornerVec[1],cornerVec[2], edge1[0] ,edge1[1] ,edge1[2], edge2[0] ,edge2[1] ,edge2[2], edge3[0] ,edge3[1] ,edge3[2]) numStars = charm.getNumParticles('galBox','star') numGas = charm.getNumParticles('galBox','gas') numDark = charm.getNumParticles('galBox','dark') numTotal = numStars + numGas + numDark #=========================================================================== # This region outputs the ascii file to be read in by tipsy #=========================================================================== f = open(filename, 'w') # overwrites pre-existing file f.write(str(numTotal) + ' ' + str(numGas) + ' ' + str(numStars)) f.write('\n3') f.write('\n'+ str(charm.getTime())+ '\n') f.close() for each in ['star','dark','gas']:charm.createScalarAttribute(each, 'tmpWorking') def writeAndAppend(attribute): charm.writeGroupArray('tmpGalBox', attribute, '/tmp/out.tmp') os.system('tail -n +2 /tmp/out.tmp >> ' + filename) return families = ['gas','dark','star'] for each in families: charm.createGroup_Family('tmpGalBox', 'galBox', each) writeAndAppend('mass') # Positions for i in range(0,3): for each in families: charm.createGroup_Family('tmpGalBox', 'galBox', each) charm.runLocalParticleCodeGroup('tmpGalBox', vectorWriter, ('pos', i)) writeAndAppend('tmpWorking') # Velocities for i in range(0,3): for each in families: charm.createGroup_Family('tmpGalBox', 'galBox', each) charm.runLocalParticleCodeGroup('tmpGalBox', vectorWriter, ('vel', i)) writeAndAppend('tmpWorking') # Star and dark softening for each in ['dark', 'star']: charm.createGroup_Family('tmpGalBox', 'galBox', each) writeAndAppend('softening') # Gas attributes charm.createGroup_Family('tmpGalBox', 'galBox', 'gas') for each in ['density','temperature','softening','metals']: writeAndAppend(each) #Star stuff charm.createGroup_Family('tmpGalBox', 'galBox', 'star') for each in ['metals','formationtime']: writeAndAppend(each) #potential for each in families: charm.createGroup_Family('tmpGalBox', 'galBox', each) writeAndAppend('potential') charm.deleteGroup('tmpGalBox') #print 'num lines in ' + filename + ' should be: ' + str(9*numTotal+3*numGas+2*numStars+3) return