Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
0
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)
Example #5
0
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