def process_mock_densdata(options): print("Using mock Pal 5 data from %s" % options.mockfilename) # Read and prep data for mocks xvid= numpy.loadtxt(options.mockfilename) xv= xvid[:,:6] xv= xv[numpy.argsort(xvid[:,6])] XYZ= bovy_coords.galcenrect_to_XYZ(xv[:,0],xv[:,1],xv[:,2], Xsun=R0,Zsun=0.025) lbd= bovy_coords.XYZ_to_lbd(XYZ[0],XYZ[1],XYZ[2],degree=True) radec= bovy_coords.lb_to_radec(lbd[:,0],lbd[:,1],degree=True) xieta= pal5_util.radec_to_pal5xieta(radec[:,0],radec[:,1],degree=True) # make sure the progenitor is at (0,0) xieta[:,0]-= numpy.median(xieta[:,0]) xieta[:,1]-= numpy.median(xieta[:,1]) h,e= numpy.histogram(xieta[:,0],range=[0.2,14.3],bins=141) xdata= numpy.arange(0.25,14.35,0.1) # Compute power spectrum tdata= h-0. pp= Polynomial.fit(xdata,tdata,deg=options.polydeg,w=1./numpy.sqrt(h+1.)) tdata/= pp(xdata) ll= xdata py= signal.csd(tdata,tdata,fs=1./(ll[1]-ll[0]),scaling='spectrum', nperseg=len(ll))[1] py= py.real # Also compute the bispectrum Bspec, Bpx= bispectrum.bispectrum(numpy.vstack((tdata,tdata)).T, nfft=len(tdata),wind=7,nsamp=1,overlap=0) ppyr= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].real) ppyi= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].imag) return (numpy.sqrt(py*(ll[-1]-ll[0])),numpy.sqrt(h+1.)/pp(xdata), ppyr,ppyi)
def process_pal5_densdata(options): # Read and prep data backg= 400. data= numpy.loadtxt('data/ibata_fig7b_raw.dat',delimiter=',') sindx= numpy.argsort(data[:,0]) data= data[sindx] data_lowerr= numpy.loadtxt('data/ibata_fig7b_rawlowerr.dat',delimiter=',') sindx= numpy.argsort(data_lowerr[:,0]) data_lowerr= data_lowerr[sindx] data_uperr= numpy.loadtxt('data/ibata_fig7b_rawuperr.dat',delimiter=',') sindx= numpy.argsort(data_uperr[:,0]) data_uperr= data_uperr[sindx] data_err= 0.5*(data_uperr-data_lowerr) # CUTS indx= (data[:,0] > options.minxi-0.05)*(data[:,0] < options.maxxi) data= data[indx] data_lowerr= data_lowerr[indx] data_uperr= data_uperr[indx] data_err= data_err[indx] # Compute power spectrum tdata= data[:,1]-backg pp= Polynomial.fit(data[:,0],tdata,deg=options.polydeg,w=1./data_err[:,1]) tdata/= pp(data[:,0]) ll= data[:,0] py= signal.csd(tdata,tdata,fs=1./(ll[1]-ll[0]),scaling='spectrum', nperseg=len(ll))[1] py= py.real # Also compute the bispectrum Bspec, Bpx= bispectrum.bispectrum(numpy.vstack((tdata,tdata)).T, nfft=len(tdata),wind=7,nsamp=1,overlap=0) ppyr= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].real) ppyi= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].imag) return (numpy.sqrt(py*(ll[-1]-ll[0])),data_err[:,1]/pp(data[:,0]), ppyr,ppyi)
def process_mock_densdata(options): print ("Using mock Pal 5 data from %s" % options.mockfilename) # Read and prep data for mocks xvid = numpy.loadtxt(options.mockfilename) xv = xvid[:, :6] xv = xv[numpy.argsort(xvid[:, 6])] XYZ = bovy_coords.galcenrect_to_XYZ(xv[:, 0], xv[:, 1], xv[:, 2], Xsun=R0, Zsun=0.025) lbd = bovy_coords.XYZ_to_lbd(XYZ[0], XYZ[1], XYZ[2], degree=True) radec = bovy_coords.lb_to_radec(lbd[:, 0], lbd[:, 1], degree=True) xieta = pal5_util.radec_to_pal5xieta(radec[:, 0], radec[:, 1], degree=True) # make sure the progenitor is at (0,0) xieta[:, 0] -= numpy.median(xieta[:, 0]) xieta[:, 1] -= numpy.median(xieta[:, 1]) h, e = numpy.histogram(xieta[:, 0], range=[0.2, 14.3], bins=141) xdata = numpy.arange(0.25, 14.35, 0.1) # Compute power spectrum tdata = h - 0.0 pp = Polynomial.fit(xdata, tdata, deg=options.polydeg, w=1.0 / numpy.sqrt(h + 1.0)) tdata /= pp(xdata) ll = xdata py = signal.csd(tdata, tdata, fs=1.0 / (ll[1] - ll[0]), scaling="spectrum", nperseg=len(ll))[1] py = py.real # Also compute the bispectrum Bspec, Bpx = bispectrum.bispectrum(numpy.vstack((tdata, tdata)).T, nfft=len(tdata), wind=7, nsamp=1, overlap=0) ppyr = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].real) ppyi = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].imag) return (numpy.sqrt(py * (ll[-1] - ll[0])), numpy.sqrt(h + 1.0) / pp(xdata), ppyr, ppyi)
def process_pal5_densdata(options): # Read and prep data backg = 400.0 data = numpy.loadtxt("data/ibata_fig7b_raw.dat", delimiter=",") sindx = numpy.argsort(data[:, 0]) data = data[sindx] data_lowerr = numpy.loadtxt("data/ibata_fig7b_rawlowerr.dat", delimiter=",") sindx = numpy.argsort(data_lowerr[:, 0]) data_lowerr = data_lowerr[sindx] data_uperr = numpy.loadtxt("data/ibata_fig7b_rawuperr.dat", delimiter=",") sindx = numpy.argsort(data_uperr[:, 0]) data_uperr = data_uperr[sindx] data_err = 0.5 * (data_uperr - data_lowerr) # CUTS indx = (data[:, 0] > options.minxi - 0.05) * (data[:, 0] < options.maxxi) data = data[indx] data_lowerr = data_lowerr[indx] data_uperr = data_uperr[indx] data_err = data_err[indx] # Compute power spectrum tdata = data[:, 1] - backg pp = Polynomial.fit(data[:, 0], tdata, deg=options.polydeg, w=1.0 / data_err[:, 1]) tdata /= pp(data[:, 0]) ll = data[:, 0] py = signal.csd(tdata, tdata, fs=1.0 / (ll[1] - ll[0]), scaling="spectrum", nperseg=len(ll))[1] py = py.real # Also compute the bispectrum Bspec, Bpx = bispectrum.bispectrum(numpy.vstack((tdata, tdata)).T, nfft=len(tdata), wind=7, nsamp=1, overlap=0) ppyr = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].real) ppyi = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].imag) return (numpy.sqrt(py * (ll[-1] - ll[0])), data_err[:, 1] / pp(data[:, 0]), ppyr, ppyi)
def process_mock_densdata(options): print("Using mock Pal 5 data from %s" % options.mockfilename) simn = 2 dat = np.loadtxt( '/Users/hendel/projects/streamgaps/streampepper/data/fakeobs/' + options.mockfilename, delimiter=',') #fix seed for testing if 0: print('warning: Poisson seed fixed') np.random.seed(42) h = dat[simn] + np.random.poisson(options.nbg, size=len(dat[simn])) h = np.maximum(h - options.nbg, np.zeros_like(h)) #h,e= np.histogram(xieta[:,0],range=[0.2,14.3],bins=141) bins = np.linspace(options.ximin, options.ximax, options.nxi) xdata = (bins[1:] + bins[:-1]) / 2. # Compute power spectrum tdata = h - 0. pp = Polynomial.fit(xdata, tdata, deg=options.polydeg, w=1. / np.sqrt(h + 1.)) tdata = tdata / pp(xdata) ll = xdata px, py = signal.csd(tdata, tdata, fs=1. / (ll[1] - ll[0]), scaling='spectrum', nperseg=len(ll)) px = 1. / px py = py.real py = np.sqrt(py * (ll[-1] - ll[0])) #get ps error level nerrsim = 1000 ppy_err = np.empty((nerrsim, len(px))) terr = np.sqrt(h + 1. + options.nbg) / pp(xdata) for ii in range(nerrsim): tmock = terr * np.random.normal(size=len(ll)) ppy_err[ii] = signal.csd(tmock, tmock, fs=1. / (ll[1] - ll[0]), scaling='spectrum', nperseg=len(ll))[1].real py_err = np.sqrt(np.median(ppy_err, axis=0) * (ll[-1] - ll[0])) np.save('/Users/hendel/Desktop/pscrosscheck_abc.npy', (dat[simn], bins, h, tdata, terr, px, py, py_err)) # Also compute the bispectrum Bspec, Bpx = bispectrum.bispectrum(np.vstack((tdata, tdata)).T, nfft=len(tdata), wind=7, nsamp=1, overlap=0) ppyr = np.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].real) ppyi = np.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].imag) return (py, terr, ppyr, ppyi, py_err)
def pal5_abc(sdf_pepper, options): """ """ # Setup apar grid bins = np.linspace(options.ximin, options.ximax, options.nxi) if options.recompute: # Load density and omega from file outsamp = options.outsamp if not options.batch is None: outsamp = outsamp.replace('.dat', '.%i.dat' % options.batch) sampdata = np.genfromtxt(outsamp, delimiter=',', skip_header=1) nd = 0 else: # Setup saving if os.path.exists(options.outsamp): # First read the file to check apar print('does ' + options.outsamp + ' exist?', os.path.exists(options.outsamp)) bins_file = np.genfromtxt(options.outsamp, delimiter=',', max_rows=1) print(np.amax(np.fabs(bins_file - bins))) assert np.amax( np.fabs(bins_file - bins) ) < 10.**-5., 'bins according to options does not correspond to bins already in outsamp' csvsamp = open(options.outsamp, 'a') sampwriter = csv.writer(csvsamp, delimiter=',') else: csvsamp = open(options.outsamp, 'w') sampwriter = csv.writer(csvsamp, delimiter=',') # First write bins sampwriter.writerow([b for b in bins]) csvsamp.flush() # Setup sampling massrange = simulate_streampepper.parse_mass(options.mass) rs = simulate_streampepper.rs sample_GM= lambda: (10.**((-0.5)*massrange[0])\ +(10.**((-0.5)*massrange[1])\ -10.**((-0.5)*massrange[0]))\ *np.random.uniform())**(1./(-0.5))\ /bovy_conversion.mass_in_msol(V0,R0) sample_rs = lambda x: rs(x * bovy_conversion.mass_in_1010msol(V0, R0) * 10.**10., plummer=options.plummer) rate_range = np.arange(massrange[0] + 0.5, massrange[1] + 0.5, 1) cdmrate= np.sum([simulate_streampepper.\ dNencdm(sdf_pepper,10.**r,Xrs=options.Xrs, plummer=options.plummer, rsfac=options.rsfac) for r in rate_range]) print("Using an overall CDM rate of %f" % cdmrate) # Load Pal 5 data to compare to if options.mockfilename is None: power_data, data_err, data_ppyr, data_ppyi=\ process_pal5_densdata(options) else: power_data, data_err, data_ppyr, data_ppyi, data_py_err=\ process_mock_densdata(options) # Run ABC while True: if not options.recompute: # Simulate a rate l10rate = (np.random.uniform() * (options.ratemax - options.ratemin) + options.ratemin) #### fix to CDM for testing if options.fixcdmrate: print('warning: using only CDM rate') l10rate = 0. rate = 10.**l10rate * cdmrate print(l10rate, rate) # Simulate sdf_pepper.simulate(rate=rate, sample_GM=sample_GM, sample_rs=sample_rs, Xrs=options.Xrs) # Compute density along stream try: samp, binn = np.histogram(get_star_dx(sdf_pepper, n=options.nsamples, returnxi=True), bins=bins) except: continue write_samp = [l10rate] write_samp.extend(list(samp)) sampwriter.writerow(write_samp) csvsamp.flush() else: if nd >= len(densdata): break l10rate = densdata[nd, 0] dens = densdata[nd, 1:] omega = omegadata[nd, 1:] nd += 1 # Convert density to observed density xixi = (bins[1:] + bins[:-1]) / 2. dens = samp # Add errors (Rao-Blackwellize...) for ee in range(options.nerrsim): tdens = dens + np.random.poisson(options.nbg, size=len(dens)) tdens = np.maximum(tdens - options.nbg, np.zeros_like(tdens)) pp = Polynomial.fit(xixi, tdens, deg=options.polydeg, w=1. / np.sqrt(tdens + 1.)) tdens = tdens / pp(xixi) # Compute power spectrum tcsd = signal.csd(tdens, tdens, fs=1. / (xixi[1] - xixi[0]), scaling='spectrum', nperseg=len(xixi))[1].real power = np.sqrt(tcsd * (xixi[-1] - xixi[0])) # Compute bispectrum Bspec, Bpx = bispectrum.bispectrum(np.vstack((tdens, tdens)).T, nfft=len(tdens), wind=7, nsamp=1, overlap=0) ppyr = np.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].real) ppyi = np.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].imag) yield ( l10rate, power, ppyr, ppyi, #np.fabs(power[1]-power_data[1]), #np.fabs(power[2]-power_data[2]), #np.fabs(power[3]-power_data[3]), #np.fabs(np.log(np.mean(tdens[7:17])\ # /np.mean(tdens[107:117]))), #np.fabs(ppyr-data_ppyr)[_BISPECIND], #np.fabs(ppyi-data_ppyi)[_BISPECIND], ee)
def pal5_abc(sdf_pepper, sdf_smooth, options): """ """ # Setup apar grid apar = numpy.arange(options.amin, options.amax, options.dapar) dens_unp = numpy.array([sdf_smooth._density_par(a) for a in apar]) if options.recompute: # Load density and omega from file outdens = options.outdens outomega = options.outomega if not options.batch is None: outdens = outdens.replace('.dat', '.%i.dat' % options.batch) if not options.batch is None: outomega = outomega.replace('.dat', '.%i.dat' % options.batch) densdata = numpy.genfromtxt(outdens, delimiter=',', skip_header=1) omegadata = numpy.genfromtxt(outomega, delimiter=',', skip_header=1) nd = 0 else: # Setup saving of the densities and mean Omegas denswriter, omegawriter, csvdens, csvomega=\ setup_densOmegaWriter(apar,options) # Setup sampling massrange = simulate_streampepper.parse_mass(options.mass) rs = simulate_streampepper.rs sample_GM= lambda: (10.**((-0.5)*massrange[0])\ +(10.**((-0.5)*massrange[1])\ -10.**((-0.5)*massrange[0]))\ *numpy.random.uniform())**(1./(-0.5))\ /bovy_conversion.mass_in_msol(V0,R0) sample_rs = lambda x: rs(x * bovy_conversion.mass_in_1010msol(V0, R0) * 10.**10., plummer=options.plummer) rate_range = numpy.arange(massrange[0] + 0.5, massrange[1] + 0.5, 1) cdmrate= numpy.sum([simulate_streampepper.\ dNencdm(sdf_pepper,10.**r,Xrs=options.Xrs, plummer=options.plummer, rsfac=options.rsfac) for r in rate_range]) print "Using an overall CDM rate of %f" % cdmrate # Load Pal 5 data to compare to if options.mockfilename is None: power_data, data_err, data_ppyr, data_ppyi=\ process_pal5_densdata(options) else: power_data, data_err, data_ppyr, data_ppyi=\ process_mock_densdata(options) # Run ABC while True: if not options.recompute: # Simulate a rate l10rate = (numpy.random.uniform() * (options.ratemax - options.ratemin) + options.ratemin) rate = 10.**l10rate * cdmrate print l10rate, rate # Simulate sdf_pepper.simulate(rate=rate, sample_GM=sample_GM, sample_rs=sample_rs, Xrs=options.Xrs) # Compute density and meanOmega and save try: densOmega= numpy.array([\ sdf_pepper._densityAndOmega_par_approx(a) for a in apar]).T except IndexError: # no hit dens = numpy.array([sdf_smooth._density_par(a) for a in apar]) omega = numpy.array( [sdf_smooth.meanOmega(a, oned=True) for a in apar]) else: dens = densOmega[0] omega = densOmega[1] write_dens = [l10rate] write_omega = [l10rate] write_dens.extend(list(dens)) write_omega.extend(list(omega)) denswriter.writerow(write_dens) omegawriter.writerow(write_omega) csvdens.flush() csvomega.flush() else: if nd >= len(densdata): break l10rate = densdata[nd, 0] dens = densdata[nd, 1:] omega = omegadata[nd, 1:] nd += 1 # Convert density to observed density xixi, dens = convert_dens_to_obs(sdf_pepper, apar, dens, omega, dens_unp, minxi=options.minxi, maxxi=options.maxxi) # Add errors (Rao-Blackwellize...) for ee in range(options.nerrsim): tdens = dens + numpy.random.normal(size=len(xixi)) * data_err # Compute power spectrum tcsd = signal.csd(tdens, tdens, fs=1. / (xixi[1] - xixi[0]), scaling='spectrum', nperseg=len(xixi))[1].real power = numpy.sqrt(tcsd * (xixi[-1] - xixi[0])) # Compute bispectrum Bspec, Bpx = bispectrum.bispectrum(numpy.vstack((tdens, tdens)).T, nfft=len(tdens), wind=7, nsamp=1, overlap=0) ppyr = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].real) ppyi = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2:].imag) yield (l10rate, numpy.fabs(power[1]-power_data[1]), numpy.fabs(power[2]-power_data[2]), numpy.fabs(power[3]-power_data[3]), numpy.fabs(numpy.log(numpy.mean(tdens[7:17])\ /numpy.mean(tdens[107:117]))), numpy.fabs(ppyr-data_ppyr)[_BISPECIND], numpy.fabs(ppyi-data_ppyi)[_BISPECIND], ee)
def pal5_abc(sdf_pepper, sdf_smooth, options): """ """ # Setup apar grid apar = numpy.arange(options.amin, options.amax, options.dapar) dens_unp = numpy.array([sdf_smooth._density_par(a) for a in apar]) if options.recompute: # Load density and omega from file outdens = options.outdens outomega = options.outomega if not options.batch is None: outdens = outdens.replace(".dat", ".%i.dat" % options.batch) if not options.batch is None: outomega = outomega.replace(".dat", ".%i.dat" % options.batch) densdata = numpy.genfromtxt(outdens, delimiter=",", skip_header=1) omegadata = numpy.genfromtxt(outomega, delimiter=",", skip_header=1) nd = 0 else: # Setup saving of the densities and mean Omegas denswriter, omegawriter, csvdens, csvomega = setup_densOmegaWriter(apar, options) # Setup sampling massrange = simulate_streampepper.parse_mass(options.mass) rs = simulate_streampepper.rs sample_GM = lambda: ( 10.0 ** ((-0.5) * massrange[0]) + (10.0 ** ((-0.5) * massrange[1]) - 10.0 ** ((-0.5) * massrange[0])) * numpy.random.uniform() ) ** (1.0 / (-0.5)) / bovy_conversion.mass_in_msol(V0, R0) sample_rs = lambda x: rs(x * bovy_conversion.mass_in_1010msol(V0, R0) * 10.0 ** 10.0, plummer=options.plummer) rate_range = numpy.arange(massrange[0] + 0.5, massrange[1] + 0.5, 1) cdmrate = numpy.sum( [ simulate_streampepper.dNencdm( sdf_pepper, 10.0 ** r, Xrs=options.Xrs, plummer=options.plummer, rsfac=options.rsfac ) for r in rate_range ] ) print "Using an overall CDM rate of %f" % cdmrate # Load Pal 5 data to compare to if options.mockfilename is None: power_data, data_err, data_ppyr, data_ppyi = process_pal5_densdata(options) else: power_data, data_err, data_ppyr, data_ppyi = process_mock_densdata(options) # Run ABC while True: if not options.recompute: # Simulate a rate l10rate = numpy.random.uniform() * (options.ratemax - options.ratemin) + options.ratemin rate = 10.0 ** l10rate * cdmrate print l10rate, rate # Simulate sdf_pepper.simulate(rate=rate, sample_GM=sample_GM, sample_rs=sample_rs, Xrs=options.Xrs) # Compute density and meanOmega and save try: densOmega = numpy.array([sdf_pepper._densityAndOmega_par_approx(a) for a in apar]).T except IndexError: # no hit dens = numpy.array([sdf_smooth._density_par(a) for a in apar]) omega = numpy.array([sdf_smooth.meanOmega(a, oned=True) for a in apar]) else: dens = densOmega[0] omega = densOmega[1] write_dens = [l10rate] write_omega = [l10rate] write_dens.extend(list(dens)) write_omega.extend(list(omega)) denswriter.writerow(write_dens) omegawriter.writerow(write_omega) csvdens.flush() csvomega.flush() else: if nd >= len(densdata): break l10rate = densdata[nd, 0] dens = densdata[nd, 1:] omega = omegadata[nd, 1:] nd += 1 # Convert density to observed density xixi, dens = convert_dens_to_obs( sdf_pepper, apar, dens, omega, dens_unp, minxi=options.minxi, maxxi=options.maxxi ) # Add errors (Rao-Blackwellize...) for ee in range(options.nerrsim): tdens = dens + numpy.random.normal(size=len(xixi)) * data_err # Compute power spectrum tcsd = signal.csd(tdens, tdens, fs=1.0 / (xixi[1] - xixi[0]), scaling="spectrum", nperseg=len(xixi))[1].real power = numpy.sqrt(tcsd * (xixi[-1] - xixi[0])) # Compute bispectrum Bspec, Bpx = bispectrum.bispectrum( numpy.vstack((tdens, tdens)).T, nfft=len(tdens), wind=7, nsamp=1, overlap=0 ) ppyr = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].real) ppyi = numpy.fabs(Bspec[len(Bspec) // 2 + _BISPECIND, len(Bspec) // 2 :].imag) yield ( l10rate, numpy.fabs(power[1] - power_data[1]), numpy.fabs(power[2] - power_data[2]), numpy.fabs(power[3] - power_data[3]), numpy.fabs(numpy.log(numpy.mean(tdens[7:17]) / numpy.mean(tdens[107:117]))), numpy.fabs(ppyr - data_ppyr)[_BISPECIND], numpy.fabs(ppyi - data_ppyi)[_BISPECIND], ee, )