예제 #1
0
def calc_OmHI(aa, suff):
    """Sums over the halos to compute OmHI."""
    # Work out the base path.
    
    halocat = BigFileCatalog(scratchyf + sim+ '/fastpm_%0.4f//'%aa, dataset='LL-0.200')
    mp = halocat.attrs['MassTable'][1]*1e10##
    halocat['Mass'] = halocat['Length'].compute() * mp
    cencat = BigFileCatalog(scratchcm + sim+'/fastpm_%0.4f/cencat'%aa+suff)
    satcat = BigFileCatalog(scratchcm + sim+'/fastpm_%0.4f/satcat'%aa+suff)

    HImodelz = HImodel(aa)
    halocat['HImass'], cencat['HImass'], satcat['HImass'] = HImodelz.assignHI(halocat, cencat, satcat)

    if mode == 'halos': catalogs = [halocat]
    elif mode == 'galaxies': catalogs = [cencat, satcat]
    elif mode == 'all': catalogs = [halocat, cencat, satcat]
    catalogs = [cencat]
    
    rankweight = sum([cat['HImass'].sum().compute() for cat in catalogs])
    mHI = comm.allreduce(rankweight)

    rankweight = sum([(cat['HImass']**2).sum().compute() for cat in catalogs])
    mHI2 = comm.allreduce(rankweight)

    # Convert to OmegaHI.
    nbar   = mHI**2/mHI2/bs**3
    rhoHI  = mHI/bs**3/aa**3
    cc     = Cosmology()
    #OmHI   = rhoHI/cc.rhoCritCom(1/aa-1)
    OmHI   = rhoHI/2.7754e11
    # For now just print it.
    if rank == 0: print("{:6.2f} {:12.4e} {:12.4e}".format(1/aa-1,OmHI,nbar))
    return OmHI, nbar
예제 #2
0
파일: debug.py 프로젝트: modichirag/21cmhod
def calc_pkhalo(aa, suff):
    if rank ==0 : print('Read in central/satellite catalogs')
    #cencat = BigFileCatalog(project+sim+'/fastpm_%0.4f/cencat'%aa)
    cencat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/cencat-16node'%aa)
    cencat = BigFileCatalog(scratch1+sim+'/fastpm_%0.4f/'%aa+\
                        'LL-0.200','')
    rsdfac = read_conversions(scratch1+sim+'/fastpm_%0.4f/'%aa)
    # Compute the power spectrum
    los = [0,0,1]
    cpos = cencat['Position'].compute()
    start = time()

    cenmesh = pm.paint(cencat['Position'])
    h1mesh = cenmesh
    end = time()
    if rank ==0 : print('Time taken to mesh = ', end - start)
    start = time()
    #pkh1h1   = FFTPower(h1mesh,mode='1d',kmin=0.025,dk=0.0125).power
    pkh1h1   = FFTPower(h1mesh/h1mesh.cmean(),mode='1d').power
    end = time()
    if rank ==0 : print('Time taken to power = ', end - start)
    # Extract the quantities we want and write the file.
    kk   = pkh1h1['k']
    sn   = pkh1h1.attrs['shotnoise']
    pk   = np.abs(pkh1h1['power'])
    if rank ==0 : 
        fout = open("../data/L%04d/Halocat_pks_1d_%0.4f.txt"%(bs, aa),"w")
        fout.write("# Subtracting SN={:15.5e}.\n".format(sn))
        fout.write("# {:>8s} {:>15s}\n".format("k","Pk_0_HI"))
        for i in range(kk.size):
            fout.write("{:10.5f} {:15.5e}\n".format(kk[i],pk[i]-sn))
        fout.close()
예제 #3
0
def calc_bias(aa,mcut,suff):
    '''Compute the bias(es) for the HI'''
    print('Read in DM mesh')
    dm    = BigFileMesh(project+sim+'/fastpm_%0.4f/'%aa+\
                        '/dmesh_N%04d'%nc,'1').paint()
    dm   /= dm.cmean()
    pkmm  = FFTPower(dm,mode='1d').power
    k,pkmm= pkmm['k'],pkmm['power']  # Ignore shotnoise.
    #
    print('Read in central/satellite catalogs')
    cencat = BigFileCatalog(project+sim+'/fastpm_%0.4f/cencat'%aa)
    satcat = BigFileCatalog(project+sim+'/fastpm_%0.4f/satcat'%aa+suff)
    #
    cencat['HImass'] = HI_hod(cencat['Mass'],aa,mcut)   
    satcat['HImass'] = HI_hod(satcat['Mass'],aa,mcut)   
    totHImass        = cencat['HImass'].sum().compute() +\
                       satcat['HImass'].sum().compute()
    cencat['HImass']/= totHImass/float(nc)**3
    satcat['HImass']/= totHImass/float(nc)**3
    #
    allcat = MultipleSpeciesCatalog(['cen','sat'],cencat,satcat)
    #
    h1mesh     = allcat.to_mesh(BoxSize=bs,Nmesh=[nc,nc,nc],weight='HImass')
    pkh1h1     = FFTPower(h1mesh,mode='1d').power
    pkh1h1     = pkh1h1['power']-pkh1h1.attrs['shotnoise']
    pkh1mm     = FFTPower(h1mesh,second=dm,mode='1d').power['power']
    # Compute the biases.
    b1x = np.abs(pkh1mm/(pkmm+1e-10))
    b1a = np.abs(pkh1h1/(pkmm+1e-10))**0.5
    return(k,b1x,b1a,np.abs(pkmm))
예제 #4
0
def calc_pk1d(aa, suff):
    '''Compute the 1D redshift-space P(k) for the HI'''
    if rank == 0: print('Read in central/satellite catalogs')
    cencat = BigFileCatalog(scratch2 + sim +
                            '/fastpm_%0.4f/cencat-16node' % aa)
    satcat = BigFileCatalog(scratch2 + sim + '/fastpm_%0.4f/satcat' % aa +
                            suff)
    rsdfac = read_conversions(scratch1 + sim + '/fastpm_%0.4f/' % aa)
    # Compute the power spectrum
    los = [0, 0, 1]
    cencat['RSDpos'] = cencat['Position'] + cencat['Velocity'] * los * rsdfac
    satcat['RSDpos'] = satcat['Position'] + satcat['Velocity'] * los * rsdfac
    cencat['HImass'] = HI_hod(cencat['Mass'], aa)
    satcat['HImass'] = HI_hod(satcat['Mass'], aa)
    rankHImass       = cencat['HImass'].sum().compute() +\
                       satcat['HImass'].sum().compute()
    totHImass = comm.allreduce(rankHImass)
    cencat['HImass'] /= totHImass / float(nc)**3
    satcat['HImass'] /= totHImass / float(nc)**3
    allcat = MultipleSpeciesCatalog(['cen', 'sat'], cencat, satcat)
    h1mesh  = allcat.to_mesh(BoxSize=bs,Nmesh=[nc,nc,nc],\
                             position='RSDpos',weight='HImass')
    pkh1h1 = FFTPower(h1mesh, mode='1d', kmin=0.025, dk=0.0125).power
    # Extract the quantities we want and write the file.
    kk = pkh1h1['k']
    sn = pkh1h1.attrs['shotnoise']
    pk = np.abs(pkh1h1['power'])
    if rank == 0:
        fout = open("HI_pks_1d_{:6.4f}.txt".format(aa), "w")
        fout.write("# Subtracting SN={:15.5e}.\n".format(sn))
        fout.write("# {:>8s} {:>15s}\n".format("k", "Pk_0_HI"))
        for i in range(kk.size):
            fout.write("{:10.5f} {:15.5e}\n".format(kk[i], pk[i] - sn))
        fout.close()
예제 #5
0
def compute_power(output, Nmesh=4096):
    """Compute the compensated power spectrum from a catalogue."""
    catcdm = BigFileCatalog(output, dataset='1/', header='Header')
    assert 1 - catcdm.attrs['Time'] < 0.01
    catcdm.to_mesh(Nmesh=Nmesh,
                   resampler='cic',
                   compensated=True,
                   interlaced=True)
    pkcdm = FFTPower(catcdm, mode='1d', Nmesh=Nmesh)
    return pkcdm.power
예제 #6
0
파일: xi2.py 프로젝트: modichirag/21cmhod
def readincatalog(aa, matter=False):

    if matter: dmcat = BigFileCatalog(scratch + sim + '/fastpm_%0.4f/'%aa, dataset='1')
    halocat = BigFileCatalog(scratch + sim + '/fastpm_%0.4f/'%aa, dataset='LL-0.200')
    mp = halocat.attrs['MassTable'][1]*1e10
    print('Mass of particle is = %0.2e'%mp)
    halocat['Mass'] = halocat['Length'] * mp
    print(halocat['Mass'][:5].compute()/1e10)
    halocat['Position'] = halocat['Position']%bs # Wrapping positions assuming periodic boundary conditions
    if matter:
        return dmcat, halocat
    else: return halocat
예제 #7
0
파일: fithod.py 프로젝트: bccp/simplehod
def readcat(path, subsample=False):
    # Only used to compute concentration etc from halo mass
    # thus no need to be accurate.
    CP = cosmology.Cosmology(Omega0_cdm=0.3, h=0.677, Omega0_b=.05)

    cat = BigFileCatalog(path, dataset='LL-0.200')
    if subsample:
        cat = cat[:subsample]

    M0 = cat.attrs['M0'] * 1e10
    if cat.comm.rank == 0:
        cat.logger.info("mass of a particle %e" % M0)

    cat['Mass'] = cat['Length'] * M0
    if 'Aemit' in cat.columns:
        redshift = 1 / cat['Aemit'] - 1
    else:
        redshift = 1 / cat.attrs['Time'] - 1
    cat['conc'] = transform.HaloConcentration(
        cat['Mass'], CP, redshift).compute(scheduler="single-threaded")
    # proper to comoving
    cat['rvir'] = transform.HaloRadius(cat['Mass'], CP,
                                       redshift).compute() * (1 + redshift)
    cat['vdisp'] = transform.HaloVelocityDispersion(cat['Mass'], CP,
                                                    redshift).compute()

    if 'Aemit' not in cat.columns:
        cat['Aemit'] = cat.attrs['Time'][0]

    mean, std = stat(cat['Aemit'].compute(), cat.comm)
    if cat.comm.rank == 0:
        cat.logger.info("Aemit mean = %g std = %g" % (mean, std))

    mean, std = stat(cat['Mass'].compute(), cat.comm)
    if cat.comm.rank == 0:
        cat.logger.info("mass mean, std = %g, %g" % (mean, std))

    mean, std = stat(cat['conc'].compute(), cat.comm)
    if cat.comm.rank == 0:
        cat.logger.info("conc mean, std = %g, %g" % (mean, std))

    mean, std = stat(cat['rvir'].compute(), cat.comm)
    if cat.comm.rank == 0:
        cat.logger.info("rvir mean, std = %g, %g" % (mean, std))

    mean, std = stat(cat['vdisp'].compute(), cat.comm)
    if cat.comm.rank == 0:
        cat.logger.info("vdisp mean, std = %g, %g" % (mean, std))

    cat.attrs['BoxSize'] = numpy.ones(3) * cat.attrs['BoxSize'][0]
    return cat
예제 #8
0
def compute_power(output, Nmesh=1024, species=2, spec2=None):
    """Compute the compensated power spectrum from a catalogue."""
    catnu = BigFileCatalog(output, dataset=str(species) + '/', header='Header')
    sp = sptostr(species)
    sp2 = sptostr(spec2)
    outfile = path.join(
        output, "../power-" + sp + sp2 + "-%.4f.txt" % catnu.attrs["Time"][0])
    if path.isfile(outfile):
        return
    catnu.to_mesh(Nmesh=Nmesh, window='cic', compensated=True, interlaced=True)
    if spec2 is not None:
        catcdm = BigFileCatalog(output,
                                dataset=str(spec2) + '/',
                                header='Header')
        catcdm.to_mesh(Nmesh=Nmesh,
                       window='cic',
                       compensated=True,
                       interlaced=True)
        pkcross = FFTPower(catnu, mode='1d', Nmesh=1024, second=catcdm)
        power = pkcross.power
    else:
        pknu = FFTPower(catnu, mode='1d', Nmesh=1024)
        power = pknu.power
    numpy.savetxt(
        outfile,
        numpy.array([power['k'], power['power'].real, power['modes']]).T)
    return power
예제 #9
0
def read_cat_nsel(ns, nsel, nmin0, nmin1):
    cat = BigFileCatalog(ns.catalog, header='Header', dataset=ns.dataset)
    volume = cat.attrs['BoxSize'][0]**3

    if 'Length' in cat.columns:
        while nmin1 - nmin0 > 1:
            nminc = (nmin1 + nmin0) / 2

            sel = True
            sel = sel & (cat['Length'] >= nminc)

            nsel1 = cat.comm.allreduce(sel.sum().compute())
            if nsel1 < nsel:  # too few
                nmin1 = nminc
            else:
                nmin0 = nminc

        if cat.comm.rank == 0:
            print('found nmin', nmin1, nmin0, 'nsel is', nsel1, 'target is',
                  nsel)

        cat['Selection'] = sel
    cat['RSDPosition'] = cat[
        'Position'] + cat.attrs['RSDFactor'] * cat['Velocity'] * [0, 0, 1]
    return cat
예제 #10
0
def plotH1mass(fname, fsize=15):
    '''plot cdf of H1'''
    fig, ax = plt.subplots(1, 2, figsize=(9, 4))
    for i, aa in enumerate(aafiles):
        zz = zzfiles[i]
        print(zz)
        halos = BigFileCatalog(project + sim + '/fastpm_%0.4f/halocat/' % aa)
        hmass, h1mass = halos["Mass"].compute(), halos['H1mass'].compute()
        ax[0].plot(hmass, h1mass, label=zz, lw=2)
        #     plt.plot(hmass, np.cumsum(h1mass)/h1mass.sum(), label=zz, lw=2)
        ax[1].plot(hmass[::-1],
                   np.cumsum(h1mass[::-1]) / h1mass.sum(),
                   label=zz,
                   lw=2)

    ax[0].loglog()
    ax[1].legend(ncol=2, fontsize=13)
    ax[1].set_xscale('log')
    ax[0].set_ylabel('$M_{H1}$', fontsize=fsize)
    ax[1].set_ylabel('$M_{H1}$ CDF', fontsize=fsize)
    for axis in ax:
        axis.set_xlabel('$M_h$', fontsize=fsize)
        #axis.grid(which='both', lw=0.5, color='gray')
    fig.tight_layout()
    fig.savefig(figpath + fname)
예제 #11
0
def check_ic_power_spectra(genicfileout, camb_zstr, outdir=".", accuracy=0.07, m_nu=0):
    """Generate the power spectrum for each particle type from the generated simulation files
    and check that it matches the input. This is a consistency test on each simulation output."""
    #Generate power spectra
    output = os.path.join(outdir, genicfileout)
    #Now check that they match what we put into the simulation, from CAMB
    #Reload the CAMB files from disc, just in case something went wrong writing them.
    matterpow = os.path.join(outdir,"camb_linear/ics_matterpow_"+camb_zstr+".dat")
    transfer = os.path.join(outdir, "camb_linear/ics_transfer_"+camb_zstr+".dat")
    #Load DM catalog and try for a baryon catalog
    cats = {1: BigFileCatalog(output, dataset='1/', header='Header')}
    try:
        cats[0] = BigFileCatalog(output, dataset='0/', header='Header')
    except:
        pass
    omegab = cats[1].attrs['OmegaBaryon']
    omega0 = cats[1].attrs['Omega0']
    hubble = cats[1].attrs['HubbleParam']
    npart = int(np.round(np.cbrt(cats[1].attrs['TotNumPart'][1])))
    assert npart > 0
    cambpow = CLASSPowerSpectrum(matterpow, transfer,omega0=omega0, omegab=omegab, omeganu=m_nu/93.14/hubble**2)
    for sp in cats.keys():
        #GenPK output is at PK-[nu,by,DM]-basename(genicfileout)
        cats[sp].to_mesh(Nmesh=npart*2, window='cic', compensated=True, interlaced=True)
        pk = FFTPower(cats[sp], mode='1d', Nmesh=npart*2, dk=5.0e-6)
        #GenPK output is at PK-[nu,by,DM]-basename(genicfileout)
        #Load the power spectra
        #Convert units from kpc/h to Mpc/h
        kk_ic = pk.power['k'][1:]*1e3
        Pk_ic = pk.power['power'][1:].real/1e9
        modes_ic = pk.power['modes'][1:]
        ii = np.isfinite(kk_ic)
        kk_ic = kk_ic[ii]
        Pk_ic = Pk_ic[ii]
        #Load the power spectrum. Note that DM may be total.
        ccsp = sp
        if len(cats) == 1:
            ccsp = -1
            if m_nu > 0:
                ccsp = 3
        Pk_camb = cambpow.get_class_power(species=ccsp)
        (kk_ic, Pk_ic) = modecount_rebin(kk_ic, Pk_ic, modes_ic[ii], Pk_camb, ndesired=npart//2)
        error = plot_ic_power(kk_ic, Pk_ic, Pk_camb(kk_ic), sp=sp, npart=npart, outdir=outdir)
        #Don't worry too much about one failing mode.
        if np.size(np.where(error > accuracy)) > 3:
            raise RuntimeError("Pk accuracy check failed for "+str(sp)+". Max error: "+str(np.max(error)))
예제 #12
0
def make_galaxy_pk(scale_factor,nc,seed,bs=1536,T=40,B=2,simpath=sc_simpath,outpath=sc_outpath,Rsm=0):
    
    aa = scale_factor # since particle IDs are ordered only need to load at one redshift
    zz = 1/aa-1
    dgrow = cosmo.scale_independent_growth_factor(zz)

    fname = get_filename(nc,seed,T=T,B=B)
    spath = simpath + fname
    opath = outpath + fname
    galpath = opath + '/hod/'

    try: os.makedirs(opath+'spectra/')
    except : pass
    
    zz = 1/aa-1
        
    pm = ParticleMesh(BoxSize=bs, Nmesh=[nc, nc, nc], dtype='f8')
    rank = pm.comm.rank
    dyn = BigFileCatalog(spath +  '/fastpm_%0.4f/1'%aa)
        
    # Load Matter Mesh
    fpos = dyn['Position'].compute()
    mlay = pm.decompose(fpos)
    mmesh = pm.paint(fpos, layout=mlay)
    mmesh /= mmesh.cmean()

    # Load halo mesh: HOD parameters fixed for now...
    mmin = 10**12.5; m1fac = 20
    cendir ='cencat-aa-%.04f-Mmin-%.1f-M1f-%.1f-alpha-0p8-subvol'%(aa,np.log10(mmin), m1fac)
    satdir ='satcat-aa-%.04f-Mmin-%.1f-M1f-%.1f-alpha-0p8-subvol'%(aa,np.log10(mmin), m1fac)
    
    cencat = BigFileCatalog(galpath + cendir)
    satcat = BigFileCatalog(galpath + satdir)    
        
    hpos = np.concatenate((cencat['Position'],satcat['Position']))
    hlay = pm.decompose(hpos)
    hmesh = pm.paint(hpos, layout=hlay)
    hmesh /= hmesh.cmean()

    phm = FFTPower(mmesh, second=hmesh, mode='1d').power
    k, phm = phm['k'],  phm['power'].real
        
    phh = FFTPower(hmesh, mode='1d').power
    k, phh = phh['k'],  phh['power'].real

    np.savetxt(opath+'spectra/pks-%04d-%04d-%04d-gal.txt'%(aa*10000, bs, nc), np.vstack([k, phh, phm]).T.real, header='k, phh, phm/ ', fmt='%0.4e')
예제 #13
0
def read_cat1(ns, nmin=None):
    if ns.mesh:
        mesh = BigFileMesh(ns.catalog, dataset=ns.dataset)
    else:
        cat = BigFileCatalog(ns.catalog, header='Header', dataset=ns.dataset)
        volume = cat.attrs['BoxSize'][0] ** 3

        if nmin is not None and nmin != 0:
            sel = True
            sel = sel & (cat['Length'] >= nmin)

            cat['Selection'] = sel
        cat['RSDPosition'] = cat['Position'] + cat.attrs['RSDFactor'] * cat['Velocity'] * [0, 0, 1]

        mesh = cat.to_mesh(interlaced=True, compensated=True, window='tsc', Nmesh=ns.nmesh)

    return mesh
예제 #14
0
파일: debug.py 프로젝트: modichirag/21cmhod
def calc_pkmu(aa,suff):
    '''Compute the redshift-space P(k) for the HI in mu bins'''
    if rank ==0 : print('Read in central/satellite catalogs')
    cencat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/cencat-16node'%aa)
    satcat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/satcat'%aa+suff)
    rsdfac = read_conversions(scratch1+sim+'/fastpm_%0.4f/'%aa)
    # Compute P(k,mu).
    los = [0,0,1]
    cencat['RSDpos'] = cencat['Position']+cencat['Velocity']*los * rsdfac
    satcat['RSDpos'] = satcat['Position']+satcat['Velocity']*los * rsdfac
    cencat['HImass'] = HI_hod(cencat['Mass'],aa)
    satcat['HImass'] = HI_hod(satcat['Mass'],aa)
    totHImass        = cencat['HImass'].sum().compute() +\
                       satcat['HImass'].sum().compute()
    cencat['HImass']/= totHImass/float(nc)**3
    satcat['HImass']/= totHImass/float(nc)**3
    allcat = MultipleSpeciesCatalog(['cen','sat'],cencat,satcat)
    h1mesh = allcat.to_mesh(BoxSize=bs,Nmesh=[nc,nc,nc],\
                             position='RSDpos',weight='HImass')
    #pkh1h1 = FFTPower(h1mesh,mode='2d',Nmu=4,los=los).power

    cenmesh = pm.paint(cencat['RSDpos'], mass=cencat['HImass'])
    satmesh = pm.paint(satcat['RSDpos'], mass=satcat['HImass'])
    h1mesh = cenmesh + satmesh

    pkh1h1 = FFTPower(h1mesh,mode='2d',Nmu=4,los=los).power
    # Extract what we want.
    kk = pkh1h1.coords['k']
    sn = pkh1h1.attrs['shotnoise']
    pk = pkh1h1['power']
    # Write the results to a file.
    if rank ==0 : 
        fout = open("../data/HI_pks_mu_{:06.4f}.txt".format(aa),"w")
        fout.write("# Redshift space power spectrum in mu bins.\n")
        fout.write("# Subtracting SN={:15.5e}.\n".format(sn))
        ss = "# {:>8s}".format(r'k\mu')
        for i in range(pkh1h1.shape[1]):
            ss += " {:15.5f}".format(pkh1h1.coords['mu'][i])
        fout.write(ss+"\n")
        for i in range(1,pk.shape[0]):
            ss = "{:10.5f}".format(kk[i])
            for j in range(pk.shape[1]):
                ss += " {:15.5e}".format(np.abs(pk[i,j]-sn))
            fout.write(ss+"\n")
        fout.close()
예제 #15
0
def calc_bias(aa, mcut, suff):
    '''Compute the bias(es) for the HI'''
    if rank == 0:
        print("Processing a={:.4f}...".format(aa))
        print('Reading DM mesh...')
    dm    = BigFileMesh(scratch1+sim+'/fastpm_%0.4f/'%aa+\
                        '/1-mesh/N%04d'%nc,'').paint()
    dm /= dm.cmean()
    if rank == 0: print('Computing DM P(k)...')
    pkmm = FFTPower(dm, mode='1d').power
    k, pkmm = pkmm['k'], pkmm['power']  # Ignore shotnoise.
    if rank == 0: print('Done.')
    #
    if rank == 0: print('Reading central/satellite catalogs...')
    cencat = BigFileCatalog(scratch2 + sim +
                            '/fastpm_%0.4f/cencat-16node' % aa)
    satcat = BigFileCatalog(scratch2 + sim + '/fastpm_%0.4f/satcat' % aa +
                            suff)
    if rank == 0: print('Catalogs read.')
    #
    if rank == 0: print('Computing HI masses...')
    cencat['HImass'] = HI_hod(cencat['Mass'], aa, mcut)
    satcat['HImass'] = HI_hod(satcat['Mass'], aa, mcut)
    rankHImass       = cencat['HImass'].sum().compute() +\
                       satcat['HImass'].sum().compute()
    rankHImass = np.array([rankHImass])
    totHImass = np.zeros(1, dtype='float')
    comm.Allreduce(rankHImass, totHImass, MPI.SUM)
    totHImass = totHImass[0]
    cencat['HImass'] /= totHImass / float(nc)**3
    satcat['HImass'] /= totHImass / float(nc)**3
    if rank == 0: print('HI masses done.')
    #
    if rank == 0: print('Combining catalogs and computing P(k)...')
    allcat = MultipleSpeciesCatalog(['cen', 'sat'], cencat, satcat)
    h1mesh = allcat.to_mesh(BoxSize=bs, Nmesh=[nc, nc, nc], weight='HImass')
    pkh1h1 = FFTPower(h1mesh, mode='1d').power
    pkh1h1 = pkh1h1['power'] - pkh1h1.attrs['shotnoise']
    pkh1mm = FFTPower(h1mesh, second=dm, mode='1d').power['power']
    if rank == 0: print('Done.')
    # Compute the biases.
    b1x = np.abs(pkh1mm / (pkmm + 1e-10))
    b1a = np.abs(pkh1h1 / (pkmm + 1e-10))**0.5
    if rank == 0: print("Finishing processing a={:.4f}.".format(aa))
    return (k, b1x, b1a, np.abs(pkmm))
예제 #16
0
파일: debug.py 프로젝트: modichirag/21cmhod
def calc_bias(aa,mcut,suff):
    '''Compute the bias(es) for the HI'''
    if rank==0:
        print("Processing a={:.4f}...".format(aa))
        print('Reading DM mesh...')
    dm    = BigFileMesh(scratch1+sim+'/fastpm_%0.4f/'%aa+\
                        '/1-mesh/N%04d'%nc,'').paint()
    dm   /= dm.cmean()
    if rank==0: print('Computing DM P(k)...')
    pkmm  = FFTPower(dm,mode='1d').power
    k,pkmm= pkmm['k'],pkmm['power']  # Ignore shotnoise.
    if rank==0: print('Done.')
    #
    if rank==0: print('Reading central/satellite catalogs...')
    cencat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/cencat-16node'%aa)
#    satcat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/satcat'%aa+suff)
#    if rank==0: print('Catalogs read.')
#    #
#    if rank==0: print('Computing HI masses...')
#    cencat['HImass'] = HI_hod(cencat['Mass'],aa,mcut)   
#    satcat['HImass'] = HI_hod(satcat['Mass'],aa,mcut)   
#    totHImass        = cencat['HImass'].sum().compute() +\
#                       satcat['HImass'].sum().compute()
#    cencat['HImass']/= totHImass/float(nc)**3
#    satcat['HImass']/= totHImass/float(nc)**3
#    if rank==0: print('HI masses done.')
#    #
#    if rank==0: print('Combining catalogs and computing P(k)...')
#    allcat = MultipleSpeciesCatalog(['cen','sat'],cencat,satcat)
#    #h1mesh = allcat.to_mesh(BoxSize=bs,Nmesh=[nc,nc,nc],weight='HImass')

    cenmesh = pm.paint(cencat['Position'])
    #satmesh = pm.paint(satcat['Position'], mass=satcat['HImass'])
    h1mesh = cenmesh 
    pkh1h1 = FFTPower(h1mesh,mode='1d').power
    pkh1h1 = pkh1h1['power']-pkh1h1.attrs['shotnoise']
    pkh1mm = FFTPower(h1mesh,second=dm,mode='1d').power['power']
    if rank==0: print('Done.')
    # Compute the biases.
    b1x = np.abs(pkh1mm/(pkmm+1e-10))
    b1a = np.abs(pkh1h1/(pkmm+1e-10))**0.5
    if rank==0: print("Finishing processing a={:.4f}.".format(aa))
    if rank==0:
        fout = open("../data/L%04d/HI_bias_halo_%0.4f.txt"%(bs, aa),"w")
        fout.write("# Mcut={:12.4e}Msun/h.\n".format(mcut))
        fout.write("# {:>8s} {:>10s} {:>10s} {:>15s}\n".\
                   format("k","b1_x","b1_a","Pkmm"))
        for i in range(1,kk.size):
            fout.write("{:10.5f} {:10.5f} {:10.5f} {:15.5e}\n".\
                       format(kk[i],b1x[i],b1a[i],pkmm[i]))
        fout.close()
        bavg = np.mean(b1x[1:10])
        flog.write("{:6.2f} {:12.4e} {:6.3f}\n".format(1/aa-1,mcut,bavg))
        flog.flush()
    if rank==0: flog.close()
    #
    return(k,b1x,b1a,np.abs(pkmm))
예제 #17
0
def plot_image(snapshot, dataset=1, colorbar=True, Nmesh=None):
    """Make a pretty picture of the mass distribution."""
    cat = BigFileCatalog(snapshot, dataset=str(dataset) + '/', header='Header')
    if Nmesh is None:
        Nmesh = 2 * int(np.round(np.cbrt(cat.attrs['TotNumPart'][dataset])))
    box = cat.attrs['BoxSize'] / 1000
    mesh = cat.to_mesh(Nmesh=Nmesh)
    plt.clf()
    plt.imshow(np.log10(mesh.preview(axes=(0, 1)) / Nmesh),
               extent=(0, box, 0, box))
    if colorbar:
        plt.colorbar()
    plt.xlabel("x (Mpc/h)")
    plt.ylabel("y (Mpc/h)")
    plt.tight_layout()
    snap = os.path.basename(os.path.normpath(snapshot))
    plt.savefig("dens-plt-type" + str(dataset) + snap + ".pdf")
    plt.clf()
예제 #18
0
파일: debug.py 프로젝트: modichirag/21cmhod
def calc_pkll(aa,suff):
    '''Compute the redshift-space P_ell(k) for the HI'''
    if rank ==0 : print('Read in central/satellite catalogs')
    cencat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/cencat-16node'%aa)
    satcat = BigFileCatalog(scratch2+sim+'/fastpm_%0.4f/satcat'%aa+suff)
    rsdfac = read_conversions(scratch1+sim+'/fastpm_%0.4f/'%aa)
    #
    los = [0,0,1]
    cencat['RSDpos'] = cencat['Position']+cencat['Velocity']*los * rsdfac
    satcat['RSDpos'] = satcat['Position']+satcat['Velocity']*los * rsdfac
    cencat['HImass'] = HI_hod(cencat['Mass'],aa)
    satcat['HImass'] = HI_hod(satcat['Mass'],aa)
    totHImass        = cencat['HImass'].sum().compute() +\
                       satcat['HImass'].sum().compute()
    cencat['HImass']/= totHImass/float(nc)**3
    satcat['HImass']/= totHImass/float(nc)**3
    allcat = MultipleSpeciesCatalog(['cen','sat'],cencat,satcat)

    h1mesh = allcat.to_mesh(BoxSize=bs,Nmesh=[nc,nc,nc],\
                             position='RSDpos',weight='HImass')
    #pkh1h1 = FFTPower(h1mesh,mode='2d',Nmu=8,los=los,poles=[0,2,4]).poles
    
    cenmesh = pm.paint(cencat['RSDpos'], mass=cencat['HImass'])
    satmesh = pm.paint(satcat['RSDpos'], mass=satcat['HImass'])
    h1mesh = cenmesh + satmesh

    pkh1h1 = FFTPower(h1mesh,mode='2d',Nmu=8,los=los,poles=[0,2,4]).poles
    # Extract the quantities of interest.
    kk = pkh1h1.coords['k']
    sn = pkh1h1.attrs['shotnoise']
    P0 = pkh1h1['power_0'].real - sn
    P2 = pkh1h1['power_2'].real
    P4 = pkh1h1['power_4'].real
    # Write the results to a file.
    if rank ==0 : 
        fout = open("../data/HI_pks_ll_{:06.4f}.txt".format(aa),"w")
        fout.write("# Redshift space power spectrum multipoles.\n")
        fout.write("# Subtracting SN={:15.5e} from monopole.\n".format(sn))
        fout.write("# {:>8s} {:>15s} {:>15s} {:>15s}\n".format("k","P0","P2","P4"))
        for i in range(1,kk.size):
            fout.write("{:10.5f} {:15.5e} {:15.5e} {:15.5e}\n".\
                       format(kk[i],P0[i],P2[i],P4[i]))
        fout.close()
예제 #19
0
def savecatalogmesh(bs, nc, aa):
    dmcat = BigFileCatalog(scratchyf + sim + '/fastpm_%0.4f/' % aa,
                           dataset='1')
    pm = ParticleMesh(BoxSize=bs, Nmesh=[nc, nc, nc])
    pos = dmcat['Position'].compute()
    layout = pm.decompose(pos)
    mesh = pm.paint(pos, layout=layout)
    mesh = FieldMesh(mesh)
    path = project + sim + '/fastpm_%0.4f/' % aa + '/dmesh_N%04d' % nc
    mesh.save(path, dataset='1', mode='real')
예제 #20
0
파일: fof.py 프로젝트: stjordanis/fastpm
def main():
    ap = ArgumentParser()
    ap.add_argument('fpm', help='e.g. /scratch/fpm_0.1000/')
    ap.add_argument('ll', type=float, help='e.g. 0.2 or 0.168') 
    ap.add_argument('--with-peak', help='Find Peaks KDDensity estimation (slow)', default=True)
    ap.add_argument('fof', help='e.g. /scratch/fpm_0.1000/fof . Will write to {fof}/{ll}')
    ap.add_argument('--nmin', type=int, default=20, help='min number of particles to be in the catalogue')

    ns = ap.parse_args()

    cat = BigFileCatalog(ns.fpm, header='Header', dataset='1/')

    cat.attrs['BoxSize']  = numpy.ones(3) * cat.attrs['BoxSize'][0]
    cat.attrs['Nmesh']  = numpy.ones(3) * cat.attrs['NC'][0]

    cosmo = Planck15.match(Omega0_m=cat.attrs['OmegaM'])

    M0 = cat.attrs['OmegaM'][0] * 27.75 * 1e10 * cat.attrs['BoxSize'].prod() / cat.csize

    if cat.comm.rank == 0:
        print('BoxSize', cat.attrs['BoxSize'])
        print('Nmesh', cat.attrs['Nmesh'])
        print('Mass of a particle', M0)
        print('OmegaM', cosmo.Om0)


    if ns.with_peak:
        cat['Density'] = KDDensity(cat).density

    fof = FOF(cat, linking_length=ns.ll, nmin=ns.nmin)

    if ns.with_peak:
        features = fof.find_features(peakcolumn='Density')
    else:
        features = fof.find_features(peakcolumn=None)

    features['Mass'] = M0 * features['Length']
    if fof.comm.rank == 0:
        print('Total number of features found', features.csize)
        print('Saving columns', features.columns)

    features.save(ns.fof + '/%0.3f' % ns.ll, features.columns)
예제 #21
0
def read_cat2(ns, nmin=None):
    cat = BigFileCatalog(ns.catalog, header='Header', dataset=ns.dataset)
    volume = cat.attrs['BoxSize'][0] ** 3

    if nmin is not None and nmin != 0:
        sel = True
        sel = sel & (cat['Length'] >= nmin)

        cat['Selection'] = sel
    cat['RSDPosition'] = cat['Position'] + cat.attrs['RSDFactor'] * cat['Velocity'] * [0, 0, 1]
    return cat
예제 #22
0
def plot_image(sim, snap, dataset=1, colorbar=False):
    """Make a pretty picture of the mass distribution."""
    pp = os.path.join(os.path.join(datadir, sim), "output/PART_00" + str(snap))
    cat = BigFileCatalog(pp, dataset=str(dataset), header='Header')
    mesh = cat.to_mesh(Nmesh=512)
    plt.clf()
    plt.imshow(np.log10(mesh.preview(axes=(0, 1)) / 512),
               extent=(0, 3, 0, 3),
               vmin=-0.2,
               vmax=0.2)
    if colorbar:
        plt.colorbar()
    plt.xlabel("x (100 Mpc/h)")
    plt.ylabel("y (100 Mpc/h)")
    plt.tight_layout()
    plt.savefig(
        os.path.join(
            savedir,
            "dens-plt-" + munge_scale(sim) + "t" + str(dataset) + ".pdf"))
    plt.clf()
예제 #23
0
    def find_haloes_epoch(self, filename, z, N_min=None, with_peak=True):
        if N_min is not None: self.N_min = N_min

        cat = BigFileCatalog(filename, header='Header', dataset='1/')
        self.cosmo = self.cosmo.match(Omega0_m=cat.attrs['Om0'])
        if self.n_p is None: self.n_p = cat.attrs['nc'][0]

        cat.attrs['boxsize'] = np.ones(3) * cat.attrs['boxsize'][0]
        cat.attrs['Nmesh'] = np.ones(3) * cat.attrs['nc'][0]

        # M0 = cat.attrs['Om0'][0] * 27.75 * 1e10 * cat.attrs['boxsize'].prod() / cat.csize
        M0 = cat.attrs['Om0'][0] * critical_density0(
            cosmo=self.cosmo,
            hunits=True).value * cat.attrs['boxsize'].prod() / cat.csize
        self.M_p = M0
        cat.attrs['BoxSize'] = cat.attrs['boxsize']

        print('BoxSize:', cat.attrs['boxsize'], 'Mpc')
        print('Nmesh:', cat.attrs['Nmesh'])
        print('Mass of a particle:', np.round(M0 / 1e8, decimals=3),
              'x 1e8 solar mass')
        print('OmegaM:', np.round(self.cosmo.Om0, decimals=3))

        print('Finding haloes...')
        cat['Density'] = KDDensity(cat).density
        fof = FOF(cat, linking_length=self.b, nmin=self.N_min)
        features = fof.find_features(
            peakcolumn='Density') if with_peak else fof.find_features(
                peakcolumn=None)

        halo_catalog = fof.to_halos(M0, self.cosmo, z)
        # print(halo_catalog)
        features['Mass'] = M0 * features['Length']

        print('...done')
        print('Total number of haloes found:', halo_catalog.csize)
        # print('Saving columns', features.columns)
        # print('halos', halo_catalog.columns)

        return halo_catalog
예제 #24
0
def fiddlebiasgal(aa, suff, nc=nc, mcfv=[1.], saveb=False, bname='h1bias', ofolder=None):
    '''Fiddle bias for galaxies'''

    if ofolder is None: ofolder = project + '/%s/fastpm_%0.4f/'%(sim, aa)
    pm = ParticleMesh(BoxSize = bs, Nmesh = [nc, nc, nc])

    print('Read in catalogs')
    cencat = BigFileCatalog(project + sim + '/fastpm_%0.4f/cencat'%aa)
    satcat = BigFileCatalog(project + sim + '/fastpm_%0.4f/satcat'%aa+suff)

    cpos, spos = cencat['Position'], satcat['Position']
    cmass, smass = cencat['Mass'], satcat['Mass']
    pos = np.concatenate((cpos, spos), axis=0)

    dm = BigFileMesh(project + sim + '/fastpm_%0.4f/'%aa + '/dmesh_N%04d'%nc, '1').paint()
    pkm = FFTPower(dm/dm.cmean(), mode='1d').power
    k, pkm = pkm['k'], pkm['power']

    b1, b1sq = np.zeros((k.size, len(mcfv))), np.zeros((k.size, len(mcfv)))

    for imc, mcf in enumerate(mcfv):
        print(mcf)
        ch1mass =  HI_masscutfiddle(cmass, aa, mcutf=mcf)   
        sh1mass =  HI_masscutfiddle(smass, aa, mcutf=mcf)   
        h1mass = np.concatenate((ch1mass, sh1mass), axis=0)    
        #
        h1mesh = pm.paint(pos, mass=h1mass)    
        pkh1 = FFTPower(h1mesh/h1mesh.cmean(), mode='1d').power['power']
        pkh1m = FFTPower(h1mesh/h1mesh.cmean(), second=dm/dm.cmean(), mode='1d').power['power']
        #Bias
        b1[:, imc] = pkh1m/pkm
        b1sq[:, imc] = pkh1/pkm

    np.savetxt(ofolder+bname+'auto'+suff+'.txt', np.concatenate((k.reshape(-1, 1), b1sq**0.5), axis=1), 
                                           header='mcut factors = %s\nk, pkh1xm/pkm, pkh1/pkm^0.5'%mcfv)
    np.savetxt(ofolder+bname+'cross'+suff+'.txt', np.concatenate((k.reshape(-1, 1), b1), axis=1), 
                                           header='mcut factors = %s\nk, pkh1xm/pkm, pkh1mx/pkm'%mcfv)

    return k, b1, b1sq
예제 #25
0
def read_cat(ns, nmin=None):
    cat = BigFileCatalog(ns.catalog, header='Header', dataset=ns.dataset)
    volume = cat.attrs['BoxSize'][0]**3

    if nmin is not None:
        sel = True
        sel = sel & (cat['Length'] >= nmin)

        cat['Selection'] = sel


#        cat = cat[sel]

    return cat
예제 #26
0
파일: tools.py 프로젝트: modichirag/21cmhod
def readinhalos(aafiles, sim, dpath=project, HI_hod=HI_hod):
    aafiles = np.array(aafiles)
    zzfiles = np.array([round(atoz(aa), 2) for aa in aafiles])
    hpos, hmass, hid, h1mass = {}, {}, {}, {}
    size = {}

    for i, aa in enumerate(aafiles):
        zz = zzfiles[i]
        halos = BigFileCatalog(dpath + sim + '/fastpm_%0.4f/halocat/' % aa)
        hmass[zz] = halos["Mass"].compute()
        if HI_hod is not None: h1mass[zz] = HI_hod(halos['Mass'].compute(), aa)
        hpos[zz] = halos['Position'].compute()
        hid[zz] = np.arange(hmass[zz].size).astype(int)
        size[zz] = halos.csize
    return hpos, hmass, hid, h1mass, size
예제 #27
0
파일: tools.py 프로젝트: modichirag/21cmhod
def readinsatellites(aafiles, suff, sim, dpath=myscratch, HI_hod=HI_hod):
    aafiles = np.array(aafiles)
    zzfiles = np.array([round(atoz(aa), 2) for aa in aafiles])

    spos, smass, sh1mass, shid = {}, {}, {}, {}
    size = {}
    for i, aa in enumerate(aafiles):
        zz = zzfiles[i]
        sat = BigFileCatalog(dpath + sim + '/fastpm_%0.4f/satcat' % aa + suff)
        smass[zz] = sat["Mass"].compute()
        if HI_hod is not None: sh1mass[zz] = HI_hod(sat['Mass'].compute(), aa)
        spos[zz] = sat['Position'].compute()
        shid[zz] = sat['GlobalID'].compute()
        size[zz] = sat.csize
    return spos, smass, shid, sh1mass, size
예제 #28
0
파일: tools.py 프로젝트: modichirag/21cmhod
def readincentrals(aafiles, suff, sim, dpath=myscratch, HI_hod=HI_hod):
    aafiles = np.array(aafiles)
    zzfiles = np.array([round(atoz(aa), 2) for aa in aafiles])

    cpos, cmass, ch1mass, chid = {}, {}, {}, {}
    size = {}
    for i, aa in enumerate(aafiles):
        zz = zzfiles[i]
        cen = BigFileCatalog(dpath + sim + '/fastpm_%0.4f/cencat' % aa + suff)
        cmass[zz] = cen["Mass"].compute()
        if HI_hod is not None: ch1mass[zz] = HI_hod(cen['Mass'].compute(), aa)
        cpos[zz] = cen['Position'].compute()
        chid[zz] = cen['GlobalID'].compute()
        size[zz] = cen.csize
    return cpos, cmass, chid, ch1mass, size
예제 #29
0
def compute_fast_power(output,
                       ICS,
                       vthresh=850,
                       Nmesh=1024,
                       species=2,
                       spec2=None):
    """Compute the compensated power spectrum from a catalogue."""
    sp = sptostr(species)
    sp2 = sptostr(spec2)
    catnu = BigFileCatalog(output, dataset=str(species) + '/', header='Header')
    outfile = path.join(
        output,
        "../power-fast-" + sp + sp2 + "-%.4f.txt" % catnu.attrs["Time"][0])
    if path.isfile(outfile):
        return
    catics = BigFileCatalog(ICS, dataset=str(species) + '/', header='Header')
    fast = (catics['Velocity']**
            2).sum(axis=1) < vthresh**2 / catics.attrs["Time"]**3
    fastids = catics["ID"][fast].compute()
    fastids.sort()
    #Note: map_blocks runs elementwise over blocks.
    #So we need to pre-compute fastids: if we do not we will
    #end up checking whether elements in a block of catnu["ID"]
    #are in the equivalent block in fastids.
    select = catnu["ID"].map_blocks(wrapper,
                                    fastids,
                                    dtype=numpy.bool,
                                    chunks=catnu["ID"].chunks)
    catnu[select].to_mesh(Nmesh=Nmesh,
                          window='cic',
                          compensated=True,
                          interlaced=True)
    if spec2 is not None:
        catcdm = BigFileCatalog(output,
                                dataset=str(spec2) + '/',
                                header='Header')
        catcdm.to_mesh(Nmesh=Nmesh,
                       window='cic',
                       compensated=True,
                       interlaced=True)
        pkcross = FFTPower(catnu[select],
                           mode='1d',
                           Nmesh=Nmesh,
                           second=catcdm,
                           dk=5.0e-6)
        power = pkcross.power
    else:
        pknu = FFTPower(catnu[select], mode='1d', Nmesh=Nmesh, dk=5.0e-6)
        power = pknu.power
    numpy.savetxt(
        outfile,
        numpy.array([power['k'], power['power'].real, power['modes']]).T)
    return power
예제 #30
0
파일: power.py 프로젝트: stjordanis/fastpm
def read_cat(ns):
    cat = BigFileCatalog(ns.catalog, header='Header', dataset=ns.dataset)
    volume = cat.attrs['BoxSize'][0] ** 3
    sel = True
    if ns.abundance is not None:
        if cat.comm.rank == 0:
            print('Abundance cut %g / %d halos ' %  (volume * ns.abundance, cat.csize))
        sel = sel & (cat.Index < volume * ns.abundance)
    if ns.nmin is not None:
        sel = sel & (cat['Length'] >= ns.nmin)
    if ns.nmax is not None:
        sel = sel & (cat['Length'] <= ns.nmax)

    cat['VelocityOffset'] = cat['Velocity'] * cat.attrs['RSDFactor']

    cat['Selection'] = sel
    if ns.with_rsd:
        cat['Position'] += cat['VelocityOffset'] * [0, 0, 1.]
    return cat