def calc_bias(aa, h1mesh, suff): '''Compute the bias(es) for the HI''' if rank == 0: print('Calculating bias') if rank == 0: print("Processing a={:.4f}...".format(aa)) print('Reading DM mesh...') dm = BigFileMesh(args['matterfile'] % (aa), 'N1024').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.') # pkh1h1 = FFTPower(h1mesh, mode='1d').power kk = pkh1h1.coords['k'] 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(outfolder + "HI_bias_{:6.4f}.txt".format(aa), "w") 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].real)) fout.close()
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
def main(ns, ns1, ns2): if ns.verbose: setup_logging('info') print('\n Catalogs are - \n%s\n%s\n' % (ns1, ns2)) cat1 = read_cat(ns1) mesh1 = cat1.to_mesh(interlaced=True, compensated=True, window='tsc', Nmesh=ns.nmesh).paint(mode='complex') cat2 = read_cat(ns2) if ns.unique_k: dk = 0 else: dk = None rm = FFTPower(mesh1, second=mesh1, mode='1d', dk=dk) nmin = numpy.unique( numpy.int32( numpy.logspace(numpy.log10(ns.nmin), numpy.log10(ns.nmax), ns.nn, endpoint=True))) nmin0 = cat1.comm.allreduce(cat2['Length'].min().compute(), MPI.MIN) nmax0 = cat1.comm.allreduce(cat2['Length'].max().compute(), MPI.MAX) nmin = nmin[nmin >= nmin0] nmin = nmin[nmin < nmax0] save_bs(ns.output, 'a-matter', rm) r = [] b = [] a = [] for nmin1 in nmin: cat2 = read_cat(ns2, nmin1) mesh2 = cat2.to_mesh(interlaced=True, compensated=True, window='tsc', Nmesh=ns.nmesh) r.append(FFTPower(mesh1, second=mesh2, mode='1d', dk=dk)) save_bs(ns.output, 'x-nmin-%05d' % nmin1, r[-1]) bias = fit_bias(r[-1], rm) abundance = r[-1].attrs['N2'] / cat2.attrs['BoxSize'][0]**3 b.append(bias) a.append(abundance) if cat1.comm.rank == 0: print('Bias of N=', nmin1, bias, abundance) basename = ns.output.rsplit('.', 1)[0] if cat1.comm.rank == 0: numpy.savetxt(basename + '-bias.txt', numpy.array([nmin, b, a]).T) if ns.with_plot: if cat1.comm.rank == 0: figure = make_plot(rm, r, nmin) figure.savefig(basename + '.png')
def fiddlebias(aa, saveb=False, bname='h1bias.txt', ofolder=None): #Fiddling bias for halos. Deprecated. print('Read in catalogs') halocat = readincatalog(aa, matter=False) hpos = halocat['Position'] hmass = halocat['Mass'] h1mass = dohod.HI_mass(hmass, aa) dm = BigFileMesh(project + sim + '/fastpm_%0.4f/'%aa + '/dmesh_N%04d'%nc, '1').paint() if ofolder is None: ofolder = project + '/%s/fastpm_%0.4f/'%(sim, aa) #measure power pm = ParticleMesh(BoxSize = bs, Nmesh = [nc, nc, nc]) pkm = FFTPower(dm/dm.cmean(), mode='1d').power k, pkm = pkm['k'], pkm['power'] ##H1 print("H1") h1mesh = pm.paint(hpos, 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 b1h1 = pkh1m/pkm b1h1sq = pkh1/pkm if saveb: np.savetxt(ofolder+bname, np.stack((k, b1h1, b1h1sq**0.5), axis=1), header='k, pkh1xm/pkm, pkh1/pkm^0.5') return k, b1h1, b1h1sq
def evaluate1(model, data, norm=True, kmin=None, dk=None): '''return position order: px,p1,p2 ''' from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower if kmin is None: kmin = 0 if dk is None: dk = 2 * numpy.pi / model.BoxSize[0] if norm: mod = model / model.cmean() dat = data / data.cmean() else: mod, dat = model, data px = FFTPower(first=FieldMesh(mod), second=FieldMesh(dat), mode='1d', kmin=kmin, dk=dk) p1 = FFTPower(first=FieldMesh(mod), mode='1d', kmin=kmin, dk=dk) p2 = FFTPower(first=FieldMesh(dat), mode='1d', kmin=kmin, dk=dk) return px.power, p1.power, p2.power
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))
def calc_bias(aa, h1mesh, suff): '''Compute the bias(es) for the HI''' if rank == 0: print("Processing a={:.4f}...".format(aa)) print('Reading DM mesh...') if ncsim == 10240: dm = BigFileMesh(scratchyf+sim+'/fastpm_%0.4f/'%aa+\ '/1-mesh/N%04d'%nc,'').paint() else: dm = BigFileMesh(project+sim+'/fastpm_%0.4f/'%aa+\ '/dmesh_N%04d/1/'%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.') # 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))
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))
def evaluate(self, model, data): from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower xm = FFTPower(first=FieldMesh(model.mapp/model.mapp.cmean()), second=FieldMesh(data.mapp/data.mapp.cmean()), mode='1d') xd = FFTPower(first=FieldMesh(model.d), second=FieldMesh(data.d), mode='1d') xs = FFTPower(first=FieldMesh(model.s), second=FieldMesh(data.s), mode='1d') pm1 = FFTPower(first=FieldMesh(model.mapp/model.mapp.cmean()), mode='1d') pd1 = FFTPower(first=FieldMesh(model.d), mode='1d') ps1 = FFTPower(first=FieldMesh(model.s), mode='1d') pm2 = FFTPower(first=FieldMesh(data.mapp/data.mapp.cmean()), mode='1d') pd2 = FFTPower(first=FieldMesh(data.d), mode='1d') ps2 = FFTPower(first=FieldMesh(data.s), mode='1d') data_preview = dict(s=[], d=[], mapp=[]) model_preview = dict(s=[], d=[], mapp=[]) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview['d'].append(data.d.preview(axes=axes)) data_preview['s'].append(data.s.preview(axes=axes)) data_preview['mapp'].append(data.mapp.preview(axes=axes)) model_preview['d'].append(model.d.preview(axes=axes)) model_preview['s'].append(model.s.preview(axes=axes)) model_preview['mapp'].append(model.mapp.preview(axes=axes)) #data_preview['mapp'] = data.mapp.preview(axes=(0, 1)) #model_preview['mapp'] = model.mapp.preview(axes=(0, 1)) return xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power, data_preview, model_preview
def getps2D(f1, f2=None, p2=False): p1 = FFTPower(f1, mode='2d').power['power'] if f2 is not None: px = FFTPower(f1, second=f2, mode='2d').power['power'] if p2: p2 = FFTPower(f2, mode='2d').power['power'] return p1, p2, px else: return p1, px else: return p1
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
def evaluate1(model, data, field, M0=0, stoch=False, kmin=None, dk=None): '''return position order: xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power, data_preview, model_preview ''' from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower if kmin is None: kmin = 0 if dk is None: dk = 2*numpy.pi/model.s.BoxSize[0] model.mapp += M0 data.mapp += M0 #print('Means are : ', model.mapp.cmean(), data.mapp.cmean()) if abs(model.mapp.cmean()) > 1e-3: modmappmean = model.mapp.cmean() else: modmappmean = 1. if abs(data.mapp.cmean()) > 1e-3: datmappmean = data.mapp.cmean() else: datmappmean = 1. modmappmean, datmappmean = 1., 1. #if abs(model.mapp.cmean()) > 1e-3: modmappmean = model.mapp.cmean() #else: modmappmean = 1. #if abs(data.mapp.cmean()) > 1e-3: datmappmean = data.mapp.cmean() #else: datmappmean = 1. data_preview, model_preview = [], [] if field == 'mapp': x = FFTPower(first=FieldMesh(model.mapp/modmappmean), second=FieldMesh(data.mapp/datmappmean), mode='1d', kmin=kmin, dk=dk) p1 = FFTPower(first=FieldMesh(model.mapp/modmappmean), mode='1d', kmin=kmin, dk=dk) p2 = FFTPower(first=FieldMesh(data.mapp/datmappmean), mode='1d', kmin=kmin, dk=dk) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview.append(data.mapp.preview(axes=axes)) model_preview.append(model.mapp.preview(axes=axes)) elif field == 's': x = FFTPower(first=FieldMesh(model.s), second=FieldMesh(data.s), mode='1d', kmin=kmin, dk=dk) p1 = FFTPower(first=FieldMesh(model.s), mode='1d', kmin=kmin, dk=dk) p2 = FFTPower(first=FieldMesh(data.s), mode='1d', kmin=kmin, dk=dk) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview.append(data.s.preview(axes=axes)) model_preview.append(model.s.preview(axes=axes)) elif field == 'd': x = FFTPower(first=FieldMesh(model.d), second=FieldMesh(data.d), mode='1d', kmin=kmin, dk=dk) p1 = FFTPower(first=FieldMesh(model.d), mode='1d', kmin=kmin, dk=dk) p2 = FFTPower(first=FieldMesh(data.d), mode='1d', kmin=kmin, dk=dk) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview.append(data.d.preview(axes=axes)) model_preview.append(model.d.preview(axes=axes)) else: print('Field not recongnized') return 0 return x.power, p1.power, p2.power, data_preview, model_preview
def eval_bfit(hmesh, mod, ofolder, noise=None, title=None, fsize=15, suff=None, save=True): pmod = FFTPower(mod, mode='1d').power k, pmod = pmod['k'], pmod['power'] ph = FFTPower(hmesh, mode='1d').power['power'] pxmodh = FFTPower(hmesh, second=mod, mode='1d').power['power'] perr = FFTPower(hmesh - mod, mode='1d').power['power'] if save: fig, ax = plt.subplots(1, 3, figsize=(15, 4)) ax[0].plot(k, pxmodh / (pmod * ph)**0.5) ax[0].set_ylabel('$r_{cc}$', fontsize=fsize) ax[1].plot(k, (pmod / ph)**0.5) ax[1].set_ylabel('$\sqrt{P_{mod}/P_{hh}}$', fontsize=fsize) ax[2].plot(k, perr) ax[2].set_yscale('log') ax[2].set_ylabel('$P_{\delta{mod}-\delta_h}$', fontsize=fsize) if noise is not None: ax[2].axhline(noise) if hmesh.pm.comm.rank == 0: for axis in ax: axis.set_xscale('log') axis.grid(which='both') axis.set_xlabel('$k$ (h/Mpc)', fontsize=fsize) axis.legend(fontsize=fsize) if title is not None: plt.suptitle(title, fontsize=fsize) plt.tight_layout(rect=[0, 0, 1, 0.95]) fname = ofolder + 'evalbfit' if suff is not None: fname = fname + '%s' % suff print(fname) fig.savefig(fname + '.png') plt.close() return k[1:], perr.real[1:] else: return k, ph, pmod, pxmodh, perr
def calc_pkmu(aa, h1mesh, outfolder, los=[0, 0, 1], Nmu=int(4)): '''Compute the redshift-space P(k) for the HI in mu bins''' if rank == 0: print('Calculating pkmu') pkh1h1 = FFTPower(h1mesh, mode='2d', Nmu=Nmu, los=los).power # Extract what we want. kk = pkh1h1.coords['k'] sn = pkh1h1.attrs['shotnoise'] pk = pkh1h1['power'] if rank == 0: print('For mu-bins', pkh1h1.coords['mu']) # Write the results to a file. if rank == 0: fout = open( outfolder + "HI_pks_mu_{:02d}_{:06.4f}.txt".format(Nmu, 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()
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()
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()
def savenoisep2d(Nmu=4): for ia, aa in enumerate([0.3333, 0.2000, 0.1429]): zz = 1/aa-1 for iw, wopt in enumerate(['opt', 'pess']): #for iw, wopt in enumerate(['opt']): for it, thopt in enumerate(['opt', 'pess', 'reas']): #for it, thopt in enumerate([ 'reas']): if rank == 0: print(aa, wopt, thopt) dpath = '/global/cscratch1/sd/chmodi/m3127/21cm_cleaning/recon/fastpm_%0.4f/wedge_kmin%0.2f_%s/'%(aa, 0.03, wopt) dpath += 'L%04d-N%04d-R//thermal-%s-hex/ZA/opt_s999_h1massA_fourier_rsdpos/'%(bs, nc, thopt) ofolder = '../../data/ZArecon-rsd/kmin-003_wedge-%s/thermal-%s-hex/Nmu%d/'%(wopt, thopt, Nmu) try: os.makedirs(ofolder) except: pass fname = ofolder + 'pnoise-L%04d_%0.4f.txt'%(bs, aa) if args.pp : fname = fname[:-4] + '-up.txt' try: rep = np.loadtxt(fname).T rpfit = [{'k':rep[0], 'power':rep[i+1]} for i in range(3)] except: pass if args.pp: ivar = BigFileMesh(dpath+'/ivarmesh_up', 'ivar').paint() else: ivar = BigFileMesh(dpath+'/ivarmesh', 'ivar').paint() svar = (ivar.r2c()**-0.5).c2r() p0 = FFTPower(svar, mode='2d', Nmu=Nmu).power if rank == 0: np.savetxt(fname, p0['power'].real)
def savestd(): #for ia, aa in enumerate([0.3333, 0.2000, 0.1429]): for ia, aa in enumerate([0.1429]): #for ia, aa in enumerate([0.3333, 0.2000, 0.1429]): zz = 1 / aa - 1 for iw, wopt in enumerate(['opt', 'pess']): #for iw, wopt in enumerate(['opt']): for it, thopt in enumerate(['opt', 'pess', 'reas']): #for it, thopt in enumerate([ 'pess']): if rank == 0: print(aa, wopt, thopt) dpath = '/global/cscratch1/sd/chmodi/m3127/21cm_cleaning/recon/fastpm_%0.4f/wedge_kmin%0.2f_%s/' % ( aa, 0.03, wopt) dpath += 'L%04d-N%04d-R//thermal-%s-hex/ZA/opt_s999_h1massA_fourier_rsdpos/' % ( bs, nc, thopt) ofolder = '../../data/ZArecon-rsd/kmin-003_wedge-%s/thermal-%s-hex/' % ( wopt, thopt) fname = ofolder + 'std-L%04d_%0.4f.txt' % (bs, aa) fxname = ofolder + 'xstd-L%04d_%0.4f.txt' % (bs, aa) if args.pp: fname = fname[:-4] + '-up.txt' if args.pp: fxname = fxname[:-4] + '-up.txt' try: rep = np.loadtxt(fname + 's').T except: try: if args.pp: std = BigFileMesh(dpath + '/stdrecon_up-noise', 'std').paint() ss = BigFileMesh(dpath + '/datap_up', 's').paint() else: std = BigFileMesh(dpath + '/stdrecon-noise', 'std').paint() ss = BigFileMesh(dpath + '/datap', 's').paint() p0 = FFTPower(std, mode='1d').power px = FFTPower(std, second=ss, mode='1d').power if rank == 0: np.savetxt(fname, np.stack([p0['k']] + [p0['power'].real]).T, header='k, p0') if rank == 0: np.savetxt(fxname, np.stack([px['k']] + [px['power'].real]).T, header='k, px') except Exception as e: print(e)
def evaluate2d(model, data, M0=0, kmin=None, dk=None, Nmu=5, retmesh=False, los=[0, 0, 1]): '''return position order: xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power, data_preview, model_preview ''' from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower if kmin is None: kmin = 0 if dk is None: dk = 2*numpy.pi/model.s.BoxSize[0] model.mapp += M0 data.mapp += M0 if abs(model.mapp.cmean()) > 1e-3: modmappmean = model.mapp.cmean() else: modmappmean = 1. if abs(data.mapp.cmean()) > 1e-3: datmappmean = data.mapp.cmean() else: datmappmean = 1. modmappmean, datmappmean = 1., 1. xm = FFTPower(first=FieldMesh(model.mapp/modmappmean), second=FieldMesh(data.mapp/datmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) xd = FFTPower(first=FieldMesh(model.d), second=FieldMesh(data.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) xs = FFTPower(first=FieldMesh(model.s), second=FieldMesh(data.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) pm1 = FFTPower(first=FieldMesh(model.mapp/modmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) pd1 = FFTPower(first=FieldMesh(model.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) ps1 = FFTPower(first=FieldMesh(model.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) pm2 = FFTPower(first=FieldMesh(data.mapp/datmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) pd2 = FFTPower(first=FieldMesh(data.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) ps2 = FFTPower(first=FieldMesh(data.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) if retmesh: data_preview = dict(s=[], d=[], mapp=[]) model_preview = dict(s=[], d=[], mapp=[]) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview['d'].append(data.d.preview(axes=axes)) data_preview['s'].append(data.s.preview(axes=axes)) data_preview['mapp'].append(data.mapp.preview(axes=axes)) model_preview['d'].append(model.d.preview(axes=axes)) model_preview['s'].append(model.s.preview(axes=axes)) model_preview['mapp'].append(model.mapp.preview(axes=axes)) return xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power,\ data_preview, model_preview else: return xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power
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')
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))
def main(ns, ns1, ns2): if ns.verbose: setup_logging('info') cat1 = read_cat(ns1) mesh1 = cat1.to_mesh(interlaced=True, compensated=True, window='tsc', Nmesh=ns.nmesh) if ns1 is not ns2: cat2 = read_cat(ns2) mesh2 = cat2.to_mesh(interlaced=True, compensated=True, window='tsc', Nmesh=ns.nmesh) else: mesh2 = None if ns1.with_rsd != ns2.with_rsd: warnings.warn("Two catalogs have different with-rsd settings, this may not be intended.") if ns.mode is None: if ns1.with_rsd or ns2.with_rsd: ns.mode = '2d' else: ns.mode = '1d' if ns.unique_k: dk = 0 else: dk = None r = FFTPower(mesh1, second=mesh2, mode=ns.mode, dk=dk) basename = ns.output.rsplit('.', 1)[0] if ns.output.endswith('.json'): r.save(ns.output) elif ns.output.endswith('.txt'): if cat1.comm.rank == 0: for var in r.power.data.dtype.names: numpy.savetxt(basename + '-%s.txt' % var, r.power[var].real ) if ns.with_plot: if cat1.comm.rank == 0: figure = make_plot(r) figure.savefig(basename + '.png')
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
def write_power(d, path, a): meshsource = FieldMesh(d) r = FFTPower(meshsource, mode='1d') if config.pm.comm.rank == 0: print('Writing matter power spectrum at %s' % path) # only root rank saves numpy.savetxt(path, numpy.array([ r.power['k'], r.power['power'].real, r.power['modes'], r.power['power'].real / solver.cosmology.scale_independent_growth_factor(1.0 / a - 1) ** 2, ]).T, comments='# k p N p/D**2')
def calc_bias(aa,h1mesh, outfolder, fname): '''Compute the bias(es) for the HI''' if rank==0: print('Calculating bias') if rank==0: print("Processing a={:.4f}...".format(aa)) print('Reading DM mesh...') if ncsim == 10240: dm = BigFileMesh(scratchyf+sim+'/fastpm_%0.4f/'%aa+\ '/1-mesh/N%04d'%nc,'').paint() else: dm = BigFileMesh(project+sim+'/fastpm_%0.4f/'%aa+\ '/dmesh_N%04d/1/'%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.') # pkh1h1 = FFTPower(h1mesh,mode='1d').power kk = pkh1h1.coords['k'] 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(outfolder + "{}_bias_{:6.4f}.txt".format(fname, aa),"w") 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].real)) fout.close()
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
def evaluate(model, data): from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower #print('Means are : ', model.mapp.cmean(), data.mapp.cmean()) if abs(model.mapp.cmean()) > 1e-3: modmappmean = model.mapp.cmean() else: modmappmean = 1. if abs(data.mapp.cmean()) > 1e-3: datmappmean = data.mapp.cmean() else: datmappmean = 1. modmappmean, datmappmean = 1., 1. xm = FFTPower(first=FieldMesh(model.mapp / modmappmean), second=FieldMesh(data.mapp / datmappmean), mode='1d') xd = FFTPower(first=FieldMesh(model.d), second=FieldMesh(data.d), mode='1d') xs = FFTPower(first=FieldMesh(model.s), second=FieldMesh(data.s), mode='1d') pm1 = FFTPower(first=FieldMesh(model.mapp / modmappmean), mode='1d') pd1 = FFTPower(first=FieldMesh(model.d), mode='1d') ps1 = FFTPower(first=FieldMesh(model.s), mode='1d') pm2 = FFTPower(first=FieldMesh(data.mapp / datmappmean), mode='1d') pd2 = FFTPower(first=FieldMesh(data.d), mode='1d') ps2 = FFTPower(first=FieldMesh(data.s), mode='1d') data_preview = dict(s=[], d=[], mapp=[]) model_preview = dict(s=[], d=[], mapp=[]) for axes in [[1, 2], [0, 2], [0, 1]]: data_preview['d'].append(data.d.preview(axes=axes)) data_preview['s'].append(data.s.preview(axes=axes)) data_preview['mapp'].append(data.mapp.preview(axes=axes)) model_preview['d'].append(model.d.preview(axes=axes)) model_preview['s'].append(model.s.preview(axes=axes)) model_preview['mapp'].append(model.mapp.preview(axes=axes)) #data_preview['mapp'] = data.mapp.preview(axes=(0, 1)) #model_preview['mapp'] = model.mapp.preview(axes=(0, 1)) return xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power, data_preview, model_preview
def evaluate2d1(model, data, field, M0=0, kmin=None, dk=None, Nmu=5, retmesh=False, los=[0, 0, 1]): '''return position order: xm.power, xs.power, xd.power, pm1.power, pm2.power, ps1.power, ps2.power, pd1.power, pd2.power, data_preview, model_preview ''' from nbodykit.lab import FieldMesh, FFTPower, ProjectedFFTPower if kmin is None: kmin = 0 if dk is None: dk = 2*numpy.pi/model.s.BoxSize[0] model.mapp += M0 data.mapp += M0 if abs(model.mapp.cmean()) > 1e-3: modmappmean = model.mapp.cmean() else: modmappmean = 1. if abs(data.mapp.cmean()) > 1e-3: datmappmean = data.mapp.cmean() else: datmappmean = 1. modmappmean, datmappmean = 1., 1. if field == 'mapp': x = FFTPower(first=FieldMesh(model.mapp/modmappmean), second=FieldMesh(data.mapp/datmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p1 = FFTPower(first=FieldMesh(model.mapp/modmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p2 = FFTPower(first=FieldMesh(data.mapp/datmappmean), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) elif field == 's': x = FFTPower(first=FieldMesh(model.s), second=FieldMesh(data.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p1 = FFTPower(first=FieldMesh(model.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p2 = FFTPower(first=FieldMesh(data.s), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) elif field == 'd': x = FFTPower(first=FieldMesh(model.d), second=FieldMesh(data.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p1 = FFTPower(first=FieldMesh(model.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) p2 = FFTPower(first=FieldMesh(data.d), mode='2d', kmin=kmin, dk=dk, Nmu=Nmu, los=[0, 0, 1]) else: print('Field not recongnized') return 0 return x.power, p1.power, p2.power
def calc_pk1d(aa, h1mesh, outfolder, fname): '''Compute the 1D redshift-space P(k) for the HI''' if rank==0: print('Calculating pk1d') 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(outfolder + fname + "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()
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)))