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)
Example #3
0
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)
Example #4
0
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)
Example #7
0
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)
Example #8
0
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,
            )