예제 #1
0
def redshift():
    """
    Evolution with redshift of matter power spectrum
    """
    zs = M.arange(0.,5.,2.)

    for z in zs:
        print z
        c = pt.Camb(hubble = 70., ombh2 = 0.05*(0.7)**2, omch2 = 0.25*(0.7)**2,transfer_redshift = [z])
        c.run()
        ps = pt.PowerSpectrum(c.cp)
        c.kextend(-10,60) #To ensure accurate sigma(r) -- if it doesn't, a warning will ensue
        pt.normalizePk(c,0.8*ps.d1(z)/ps.d1(0.)) #sigma_8 at redshift z
        
        #Sheth-Tormen
        h = halo.HaloModel(c,st_big_a = 0., st_little_a=0.707, stq = 0.3, k = 10**M.arange(-2,2.01,0.2),massdivsperdex=5)

        h.pmm = halo.getHaloPknl(c,h)
        M.loglog(h.k, h.pmm, label='z='+str(z))
        M.loglog(h.k, h.pk,'k:',label='linear')

        cp_halofit = c.cp
        cp_halofit['do_nonlinear'] = 1 # Halofit (Smith et al) fit
        chalofit = pt.Camb(cambParam=cp_halofit)
        chalofit.run()
        wheretoplot = N.where(chalofit.k > 1e-2)[0]
        M.loglog(chalofit.k[wheretoplot[::10]],chalofit.pk[wheretoplot[::10]],'--',label='halofit')

    M.legend()
    M.show()
예제 #2
0
def getInfoCurve():
    """
    Various functions to calculate example parameter error bars as in
    Neyrinck & Szapudi 2007, MNRAS 375, L51
    """

    c = pt.Camb(hubble = 70., ombh2 = 0.05*(0.7)**2, omch2 = 0.25*(0.7)**2)
    c.run()
    c.kextend(-10,60) # necessary to make sigma(m) integral converge well.
    pt.normalizePk(c,0.8) #sigma_8

    outputdir = 'example/'
    #Sheth-Tormen
    h = halo.HaloModel(c,st_big_a = 0., st_little_a=0.707, stq = 0.3, k = 10.**M.arange(-2,1.01,0.25),massdivsperdex=5)
    #For final calculations, should use more massdivsperdex, e.g. 20 (maybe 10 is ok)
    #also, k is really coarse, as you'll see if you run this.

    # get covariance matrix from halo-model trispectrum (saves it in the 'prefix' directory)
    # it also automatically runs halo.getHaloPknl
    halo.getHaloCov(outputdir,c,h)

    # power spectrum at h.k (range of k at which halo model quantities are evaluated)
    M.loglog(h.k,h.pnl)
    M.show()

    # get derivs wrt ln A, tilt
    h.dloga = halo.getdlogPnldCosmoParam(c,h,'scalar_amp',linlog='log')
    h.dtilt = halo.getdlogPnldCosmoParam(c,h,'scalar_spectral_index',linlog='lin')
    M.loglog(h.k,h.dloga**2,label='ln A')
    M.loglog(h.k,h.dtilt**2,label='tilt')
    M.legend()
    M.show()
    M.save(outputdir+'dlogpnldloga.dat',M.transpose([h.k,h.dloga]),fmt='%6.5e')
    M.save(outputdir+'dlogpnldtilt.dat',M.transpose([h.k,h.dtilt]),fmt='%6.5e')

    # get parameter covariance matrix (just a function of k, since there's only one variable)
    k, covmat = info.getParamCovMat(outputdir,dlogfilenames=['dlogpnldloga.dat','dlogpnldtilt.dat'])

    # plot the unmarginalized error bars in ln A and the tilt,
    # if the matter power spectrum is analyzed from k= k[0] to k.

    M.loglog(k, M.sqrt(covmat[0,0,:]),label='ln A')
    M.loglog(k, M.sqrt(covmat[1,1,:]),label='tilt')

    M.legend()
    M.show()
예제 #3
0
def hod():
    """
    Displays various galaxy power spectra w/ different HOD's.
    See param.py for explanations of hod params.

    camb needs to be in ../CAMB by default, but that can be changed in pt.py
    """

    c = pt.Camb(hubble = 70., ombh2 = 0.05*(0.7)**2, omch2 = 0.25*(0.7)**2) #may want to go out to transfer_kmax=100 for high accuracy
    c.run()
    pt.normalizePk(c,0.8) #sigma_8
    c.kextend(-10,60) #needed so that sigma(r) integral converges for a wide range of r

    #Sheth-Tormen
    h = halo.HaloModel(c,st_big_a = 0., st_little_a=0.707, stq = 0.3, k = 10**M.arange(-2,2.,0.1),massdivsperdex=5)

    h.pmm = halo.getHaloPknl(c,h)
    
    h.p.whichp='gg' # by default, h.p.whichp = 'mm', returning the matter power spectrum

    # by default, h.p.k_mmin_msun = 1e11, h.p,k_betas = 1
    mmins = 10.**M.arange(10.,12.01,0.2)
    for i in range(len(mmins)):
        h.p.k_mmin_msun = mmins[i]
        h.refreshHOD(c)
        h.pgg = halo.getHaloPknl(c,h)
        M.loglog(h.k,h.pgg,'y')

    M.loglog(h.k,h.pk,'k')
    M.loglog(h.k,h.pmm,'b')
    M.show()

    betas = M.arange(0.5,1.5,0.1)
    h.p.k_mmin_msun = 1e11
    for i in range(len(betas)):
        h.p.k_betas = betas[i]
        h.refreshHOD(c)
        h.pgg = halo.getHaloPknl(c,h)
        M.loglog(h.k,h.pgg,'y')

    M.loglog(h.k,h.pk,'k')
    M.loglog(h.k,h.pmm,'b')
    M.show()
예제 #4
0
def generate(c=None,d=None,dk=None,ng=64,boxsize=128.,sigma8=0.829, sigmaalpt = 10.,scheme='muscle',largescale=None,smallscale=None,exactpk=False, seed = 42389,returnfft = False, dopbc=True, fileroot=None, returnpos=True, returndisp = False, plottest=False, returninitdens=False, justreturnc = False, returnvel=False,deltaz4vel=1./128., hubble=67.77, ombh2 = 0.048252*0.6777**2, omch2 = (0.30712-0.048252)*0.6777**2, redshift = 0.,kmax=30.,omk=0.):
    """ 
    possible inputs:
    c = Camb instance; contains cosmological parameters, power spectrum
    d = configuration-space density field
    dk = FFT of a density field

    parameters:
    sigmaalpt = Gaussian k-space interpolation smoothing scale, as in ALPT
    scheme: can be 'zeld'ovich, '2lpt', 'sc' (single-scale spherical collapse), 'muscle' (multiscale)
    largescale/smallscale: use for scale interpolation
    dopbc: False to preserve distortion of particle lattice, not enforcing periodic boundary conditions
    returnpos, returndisp, returnvel: return position, displacement field at particles, velocities [velocities only work for Zeld, 2LPT currently!]
    plottest: show a slice of the particles
    exactpk: Set each Fourier amplitude exactly to the linear power spectrum, 
             suppressing fluctuations in Fourier amplitudes
    """
    
    if (returnpos & returndisp):
        print 'Choose either position or displacement field to return'
        return
    if returnvel:
        omegam = (ombh2+omch2)/(hubble/100.)**2
        omegal = 1.-omk-omegam
        hubble_z = 100.*N.sqrt(omegam*(1.+redshift)**3 + omk*(1+redshift)**2 + omegal)
        # Valid only for simple dark energy; doesn't allow w != -1

    if ((((c == None) | (returnvel & (smallscale != None))) &
        ((d == None) & (dk == None))) | (justreturnc == True)):
        print 'c == None:', (c == None)
        print 'returnvel = ', returnvel
        c = pt.Camb(hubble=hubble, ombh2 = ombh2, omch2 = omch2,omk=omk,
                    transfer_kmax=kmax,transfer_redshift=[0.])
        if (dk == None):
            c.run()
            sigma82default_z0 = pt.normalizePk(c,sigma8)
            if redshift != 0.:
                c = pt.Camb(hubble=hubble, ombh2 = ombh2, omch2 = omch2,omk=omk,
                            transfer_kmax=kmax,transfer_redshift=[redshift])
                c.run()
                c.pk *= sigma8**2/sigma82default_z0
                c.logpk = N.log(c.pk)
                c.pkSplineCoeff = SS.cspline1d(c.logpk)
        if justreturnc:
            return c

        if (returnvel & (smallscale != None)):
            print 'Numerically computing velocity'
            cplusdeltaz = pt.Camb(hubble=hubble, ombh2 = ombh2, omch2 = omch2, omk=omk,
                                  transfer_kmax=kmax,transfer_redshift=[redshift+deltaz4vel])
            cplusdeltaz.run()

            cplusdeltaz.pk *= sigma8**2/sigma82default_z0
            cplusdeltaz.logpk = N.log(cplusdeltaz.pk)
            growthindeltaz=N.mean(c.logpk-cplusdeltaz.logpk)

            print 'camb:', growthindeltaz
            print 'naive:',2.*N.log(getgrowth(c,z=redshift)/getgrowth(c,z=redshift+deltaz4vel))
        
            noiselevel = N.std(c.logpk-cplusdeltaz.logpk)
            print 'std/mean(growth from camb)=',noiselevel/growthindeltaz
            if (noiselevel/growthindeltaz > 1./8.):
                print "Warning! deltaz so small that it's giving lots of noise."
            cplusdeltaz.pk = c.pk * N.exp(growthindeltaz)
            cplusdeltaz.logpk = c.logpk + growthindeltaz
            cplusdeltaz.pkSplineCoeff = SS.cspline1d(cplusdeltaz.logpk)
            
            #The Hubble parameter at z=redshift
            dispplusdeltaz = generate(c=cplusdeltaz,ng=ng,boxsize=boxsize,sigmaalpt = sigmaalpt,
                                     largescale=largescale,smallscale=smallscale, seed = seed,
                                     dopbc=dopbc, fileroot=fileroot, returnpos=False, returndisp=True,
                                     plottest=False, returnvel=False,exactpk=exactpk)

    # the Zel'dovich displacement-divergence in Fourier space
    if d == None:
        if dk == None:
            kgrid = getkgrid(ng=ng,boxsize=boxsize,whattoget='k')
            dk=makegauss(c,kgrid,boxsize=boxsize,exactpk=exactpk,returnfft=True,seed=seed)
            if returnfft:
                return dk
        else:
            #(over)write ng
            ng=dk.shape[0]
        d = N.fft.irfftn(dk)

    else: #shouldn't have both d and dk non-None
        print 'd supplied'
        ng = d.shape[0]
        kgrid = getkgrid(ng=ng,boxsize=boxsize,whattoget='k')
        dk = N.fft.rfftn(d)

    if ((scheme != None) & ((smallscale != None) | (largescale != None))):
        print "Please specify only 'scheme' or ('smallscale' and 'largescale')"
    
    if (smallscale == None) & (largescale == None):
        if (scheme != None):
            largescale = scheme
        else:
            print "Please specify either a full 'scheme' or "
            print "a 'smallscale' and 'largescale' displacement field scheme."
            return

    print 'largescale=',largescale

    if smallscale == 'sc':
        psismall = N.fft.rfftn(sc(-d))
    elif smallscale == 'muscle':
        psismall = N.fft.rfftn(muscle(-d))
    elif smallscale == 'zeld':
        psismall = -dk

    if largescale == 'zeld':
        psilarge = -dk
    elif largescale == '2lpt':
        psiquadratic = N.fft.rfftn(twolpt(-dk,boxsize=boxsize))
        psilarge = psiquadratic - dk
        # dk because we didn't add it in twolpt for efficiency reasons
    elif largescale == 'sc':
        psilarge = N.fft.rfftn(sc(-d))
    elif largescale == 'muscle':
        psilarge = N.fft.rfftn(muscle(-d))

    if (smallscale != None) & (largescale != None):
        psik = scalegaussinterp(psilarge,psismall,kgrid,sigma=sigmaalpt)
    elif smallscale != None:
        psik = psismall
    elif largescale != None:
        psik = psilarge

    disp = invdiv(dk=psik,boxsize=boxsize,dopsi2pos=False).reshape(ng,ng,ng,3)
    pos = psi2pos(disp,boxsize=boxsize,dopbc=dopbc)

    if returnvel: # only works for Zeld, 2LPT
        time = 1./(1.+redshift)
        print 'time, hubble_z, f_omega = ',time,hubble_z,f_omega(c,time)
        vel = disp * time *hubble_z * f_omega(c,time)
        print 'total factor = ',time*hubble_z*f_omega(c,time)
        print 'factor in gadget = ',N.sqrt(time)*hubble_z*f_omega(c,time)
        if scheme == '2lpt':
            vel += 3./7. * time * hubble_z * f2_omega(c,time)* \
                invdiv(dk=psiquadratic,boxsize=boxsize,dopsi2pos=False)#.swapaxes(0,2)

    if plottest:
        if fileroot == None:
            fileroot='plottest'
        plotslice(pos,filename=fileroot+'.png',boxsize=boxsize)

    if returndisp:
        return disp
    if (returninitdens & (returnpos == False) & (returnvel == False)):
        return d
    if (returnpos & returnvel & (returninitdens == False)):
        return pos,vel
    if (returnpos & returninitdens & (returnvel == False)):
        return pos,d
    if (returnpos & returnvel & returninitdens):
        return pos,vel,d
    if returnpos:
        return pos
    if returnvel:
        return vel
    return
예제 #5
0
def getdlogPnldCosmoParam(c,h,paramstring,epsilon = 2.**(-6),linlog='log',sig8 = 0.,usepnl=True, usehalofit=False):
    """
    Returns dlog(Pnl(k))/d(parameter)

    linlog: if 'lin' (or anything but 'log'), do dlogP/dparam; if 'log', do dlogP/dlogparam

    epsilon = interval in param or log param

    Warning; this keeps the scalar amplitude A constant, not sigma_8.
    To keep sigma_8 constant, set sig8 to be nonzero.
    To get linear power spectrum dlog's, set usepnl = False
    Should use Smith et al. HALOFIT power spectrum if usepnl=False, usehalofit=True (though this hasn't been tested).
    """

    cp = copy.copy(c.cp)

    if (usehalofit):
        cp['do_nonlinear'] = 1

    if linlog == 'log':
        multfact = M.exp(epsilon)
        divfact = M.exp(-epsilon)
    else:
        multfact = 1. + epsilon
        divfact = 1. - epsilon

    if (paramstring == 'barf'):
        ommh2 = cp['ombh2']+cp['omch2']
        cp['ombh2'] *= multfact
        cp['omch2'] = ommh2 - cp['ombh2']
    elif isinstance(cp[paramstring],float):
        cp[paramstring] *= multfact
    else:
        for i in range(len(cp[paramstring])):
            cp[paramstring][i] *= multfact

    cplus = pt.Camb(cambParam = cp)
    cplus.run()

    if (paramstring == 'barf'):
        cp['ombh2'] *= divfact/multfact #since we're starting from the cplus params
        cp['omch2'] = ommh2 - cp['ombh2']
    elif isinstance(cp[paramstring],float):
        cp[paramstring] *= multfact
    else:
        for i in range(len(cp[paramstring])):
            cp[paramstring][i] *= divfact/multfact #since we're starting from the cplus params

    cminus = pt.Camb(cambParam = cp)
    cminus.run()

    cplus.kextend(-10,60)
    cminus.kextend(-10,60)

    if (sig8 > 0.):
        pt.normalizePk(cplus,sig8)
        pt.normalizePk(cminus,sig8)

    if (usepnl):
        hplus = HaloModel(cplus,haloModelParam = h.p)
        hplus.pknl = getHaloPknl(cplus,hplus)
        hminus = HaloModel(cminus,haloModelParam = h.p)
        hminus.pknl = getHaloPknl(cminus,hminus)
    else:
        hplus = copy.deepcopy(h)
        hplus.pknl = cplus.pkInterp(h.k)
        hminus = copy.deepcopy(h)
        hminus.pknl = cminus.pkInterp(h.k)

    dlog = M.log(hplus.pknl/hminus.pknl)/(2.*epsilon)    

    #M.loglog(h.k,hplus.pknl)
    #M.loglog(h.k,hminus.pknl)
    #M.show()

    return dlog