Beispiel #1
0
    def rebin(self, dfacs, dfacmu):
        """
    Rebin by factor dfacs/dfacmu in s, mu.
    Creates a new xismu object and returns it.
    """

        if self is None:
            return None
        ## can't do this calculation without pair counts/volumes.
        if (self.Np is None or self.vol is None):
            return None

        ## make sure the binning works out ok; its ok if it's not even for ns
        if self.nmu % dfacmu != 0:
            return None

        nmudown = self.nmu / dfacmu
        ristart = 0
        nsdown = (self.ns) / dfacs
        #### don't need these.
        sdown = ximisc.downsample1d(self.s1d, dfacs)
        assert len(sdown) == nsdown
        mudown = ximisc.downsample1d(self.mu1d, dfacmu)
        ## this is more general than equal bins.
        xinew = np.zeros([nsdown, nmudown])

        for i in range(nsdown):
            for ishort in range(dfacs):
                i1 = (ristart + ishort) * self.nmu
                i2 = (ristart + ishort + 1) * self.nmu
                if (ishort == 0):
                    myvol = ximisc.downsample1dsum(self.vol[i1:i2], dfacmu)
                    myNp = ximisc.downsample1dsum(self.Np[i1:i2], dfacmu)
                else:
                    myvol = myvol + ximisc.downsample1dsum(
                        self.vol[i1:i2], dfacmu)
                    myNp = myNp + ximisc.downsample1dsum(
                        self.Np[i1:i2], dfacmu)

            xinew[i, :] = myNp / myvol - 1.
            ristart += dfacs

        s2d, mu2d = ximisc.one2twod(sdown, mudown)
        #x = copy.deepcopy(self)
        #xismu.__init__(x,smuxilist=[s2d.flatten(),mu2d.flatten(),xinew])
        #return x
        return xismu(
            smuxilist=[s2d.flatten(
            ), mu2d.flatten(), xinew.flatten()])
Beispiel #2
0
  def rebin(self,dfacs,dfacmu):
    """
    Rebin by factor dfacs/dfacmu in s, mu.
    Creates a new xismu object and returns it.
    """

    if self is None:
      return None
    ## can't do this calculation without pair counts/volumes.
    if(self.Np is None or self.vol is None):
      return None

    ## make sure the binning works out ok; its ok if it's not even for ns
    if self.nmu % dfacmu != 0:
      return None 

    nmudown = self.nmu/dfacmu
    ristart = 0
    nsdown = (self.ns)/dfacs
    #### don't need these.
    sdown = ximisc.downsample1d(self.s1d,dfacs)
    assert len(sdown) == nsdown
    mudown = ximisc.downsample1d(self.mu1d,dfacmu)
    ## this is more general than equal bins.
    xinew = np.zeros([nsdown,nmudown])


    for i in range(nsdown):
      for ishort in range(dfacs):
        i1 = (ristart+ishort)*self.nmu
        i2 = (ristart+ishort+1)*self.nmu
        if(ishort == 0):
          myvol = ximisc.downsample1dsum(self.vol[i1:i2],dfacmu)
          myNp = ximisc.downsample1dsum(self.Np[i1:i2],dfacmu)
        else:
          myvol = myvol + ximisc.downsample1dsum(self.vol[i1:i2],dfacmu)
          myNp = myNp + ximisc.downsample1dsum(self.Np[i1:i2],dfacmu)
  
      xinew[i,:] = myNp/myvol-1.
      ristart += dfacs

    s2d, mu2d = ximisc.one2twod(sdown,mudown)
    #x = copy.deepcopy(self)
    #xismu.__init__(x,smuxilist=[s2d.flatten(),mu2d.flatten(),xinew])
    #return x
    return xismu(smuxilist=[s2d.flatten(),mu2d.flatten(),xinew.flatten()])
Beispiel #3
0
def xiellfromDR(fbase,nell=3,binfile=None,rperpcut=-1.,
                dfacs=1,dfacmu=1,icovfname=None,smincut=-1.,smaxcut=1.e12,\
                DRfacinfo=None,smallRRcut=-1.,periodicopt=0,printmaskopt=0,xiopt=0):
  """
  This function should supercede older codes with names like rebinxismugeneric*py
  input the base for the DR files, as well as optional bin files and small scale 
  cutoff for masking (rperpcut).  If you don't want to use a binfile to specify
  the downsampling, use dfacs and dfacmu inputs.
  smincut/smaxcut will only be used if binfile is None.
  DRfacinfo is used to pass [DRfac, fixRR] (dont get it from file headers in this case)
  That feature is necessary for computing covariance matrices from bootstrap, where that factor
  should be fixed by total N and/or S, it does not vary from bootstrap region to region.
  smallRRcut allows you to replace randoms(mu) with the average over mu where the total number of 
  randoms in the bin is smaller than smallRRcut, just to keep Poisson noise down.
  If periodicopt == 1, assume the input is file containing [rg, mug, Vg, Ng] as currently output
  by correlationfxnMASTERv4.
  xiopt introduced on May 13 2014 to input xi(s,mu) and simply rebin (for comparison with Hong).
  """
  if periodicopt == 1: # periodic box.
    rg, mug, Vg, Ng = np.loadtxt(fbase,unpack=True)
    Vzerochk = Vg.min()*0.1
    fDR = fbase ## just for the return xiell purposes.
  elif xiopt == 1:
    rg, mug, xig = np.loadtxt(fbase,unpack=True,usecols=[0,1,2])  ## Hong format.
    fDR = fbase
    if binfile is None:
      ikeep = np.where((rg >= smincut) & (rg <= smaxcut))[0]
      rg = rg[ikeep]
      mug = mug[ikeep]
      xig = xig[ikeep]
  else: # DD,RR counts.
    fDD = fbase+'.DRopt1'
    fDR = fbase+'.DRopt2'
    fRR = fbase+'.DRopt3'
    rg, mug, DDg = np.loadtxt(fDD,skiprows=3,unpack=True)
    rg, mug, DRg = np.loadtxt(fDR,skiprows=3,unpack=True)
    rg, mug, RRg = np.loadtxt(fRR,skiprows=3,unpack=True)
    if binfile is None:
      ikeep = np.where((rg >= smincut) & (rg <= smaxcut))[0]
      rg = rg[ikeep]
      mug = mug[ikeep]
      DDg = DDg[ikeep]
      DRg = DRg[ikeep]
      RRg = RRg[ikeep]

    if DRfacinfo is None:
      DRfac, fixRR = ximisc.getDRfactors(fbase)
    else:
      DRfac = DRfacinfo[0]
      fixRR = DRfacinfo[1]


  nmu = len(np.where(rg == rg[0])[0])
  dmu  = 1./float(nmu)
  nr = len(np.where(mug == mug[0])[0])
  if nmu*nr != len(rg):
    return None

  ## is s (called r here) log or linear binning?
  s1d = rg.reshape([nr,nmu])[:,0]
  mu1d = rg.reshape([nr,nmu])[0,:]
  ## compute linear spacings.
  dmutmp = (mu1d[1:]-mu1d[:-1]).mean()
  ds = (s1d[1:]-s1d[:-1]).mean()
  dlogs = (np.log(s1d[1:]/s1d[:-1])).mean()
  if (np.fabs(mu1d[1:]-mu1d[:-1] - dmutmp) > 0.0001*dmutmp).any():
    ## not linear binning!
    ## this shouldn't be the case for a s,mu grid.
    assert 0==1
    assert np.fabs(dmutmp - dmu) < 1.0e-4

  if (np.fabs(s1d[1:]-s1d[:-1] - ds) < 0.0001*ds).all():
    logsopt = 0
    rglowedge = rg.copy()
    rglowedge = rglowedge-0.5*ds
    ## added specifically for xiopt
    rghighedge = rg.copy()
    rghighedge = rghighedge+0.5*ds
  if (np.fabs(np.log(s1d[1:])-np.log(s1d[:-1]) - dlogs) < 0.0001*dlogs).all():
    logsopt = 1
    rglowedge = rg.copy()
    rglowedge = rglowedge*np.exp(-0.5*dlogs)
    ## added specifically for xiopt
    rghighedge = rg.copy()
    rghighedge = rghighedge*np.exp(0.5*dlogs)

  assert logsopt == 0 or logsopt == 1
  if xiopt == 1:
    Vg = rghighedge**3 - rglowedge**3  ## just need something proportional to volume.
    Vzerochk = Vg.min()*0.1

  ## cut at edge of bin.
  xx = np.where(rglowedge*(1-(mug+0.5*dmu)**2)**0.5 < rperpcut)[0]
  if(rperpcut < 0.):  assert len(xx) == 0
  if len(xx) > 0:
    if periodicopt == 1:
      Vg[xx] = 0.
      Ng[xx] = 0.
    elif xiopt == 1:
      Vg[xx] = 0.
      xig[xx] = 0.

    else:
      DDg[xx] = 0.
      DRg[xx] = 0.
      RRg[xx] = 0.

  mymask = np.zeros(len(rg),dtype='int')
  mymask[xx] = 1

  ## tmp!  print a mask file.
  if(printmaskopt == 1):
    print 'yoyoyo opening masktmp.dat'
    ofpmask = open('masktmp.dat','w')
    for i in range(len(mymask)):
      ofpmask.write('%d\n' % (mymask[i]))
    ofpmask.close()

  if(printmaskopt == 2):
#### nevermind, let's print below the boundaries of each s,mu bin.
#    print 'yoyoyo opening masktmp2.dat'
#    ofpmask = open('masktmp2.dat','w')
    mumaxlist = np.zeros(len(s1d)) + 1.
    for qi in range(len(s1d)):
      rgval = s1d[qi]
      qq = np.where((rg == rgval) & (mymask == 1))[0]
      ww = np.where((rg == rgval))[0]
      assert len(ww) > 0
      if(len(qq) == 0):
        pass
#        ofpmask.write('%e %e %e\n' % (rgval,rglowedge[ww[0]],1.0))
      else:
#        ofpmask.write('%e %e %e\n' % (rgval,rglowedge[ww[0]],mug[qq].max()))
        mumaxlist[qi] = mug[qq].min()-0.5*dmu
### testing.
#      print s1d[qi], mumaxlist[qi]
      #ofpmask.write('%d\n' % (mymask[i]))
#    ofpmask.close()
    
  
  if binfile is not None:
    ## specifies how many rbins to join together for first bin, next bin, etc.
    rjoin, mujoin = np.loadtxt(binfile,unpack=True,dtype='int')
    nrcut = len(rjoin)
    ### use later.
    #bintag = binfile.split('.')[0]
  else:
#    dfacs = dfacsin
#    dfacmu = dfacmuin
    nrcut = len(s1d)/dfacs
    dmudown = dfacmu*dmu

  if printmaskopt == 2:
    ofpmask = open('masktmp2.dat','w')

  ## check mask if I'm going to cut more.
  ristart = 0
  badlist = np.zeros(nrcut,dtype='int')
  for i in range(nrcut):
    if binfile is not None:
      dfacs = rjoin[i]
    if (mymask[ristart*nmu:(ristart+dfacs)*nmu] == 1).all():
      badlist[i] = 1
    ristart = ristart + dfacs

  nrcutkeep = nrcut-len(np.where(badlist == 1)[0])

  xi = np.zeros([nell,nrcutkeep],dtype=float)
  svec = np.zeros([nell,nrcutkeep],dtype=float)

  rcen = np.zeros(nrcut,dtype=float)
  ristart = 0
  xiindx = 0
  for i in range(nrcut):
    if binfile is not None:
      dfacs = rjoin[i]
      dfacmu = mujoin[i]
      dmudown = dfacmu*dmu
    riend = ristart + dfacs - 1
    if logsopt == 0:
      rcen[i] = 0.5*(s1d[ristart] + s1d[riend])
    if logsopt == 1:
      rcen[i] = np.exp(0.5*np.log(s1d[ristart]*s1d[riend]))
    for ishort in range(dfacs):
      i1 = (ristart+ishort)*nmu
      i2 = (ristart+ishort+1)*nmu
      if periodicopt == 1:
        if(ishort == 0):
          mymu = ximisc.downsample1d(mug[i1:i2],dfacmu)
          myVg = ximisc.downsample1dsum(Vg[i1:i2],dfacmu)
          myNg = ximisc.downsample1dsum(Ng[i1:i2],dfacmu)
        else:
          myVg = myVg + ximisc.downsample1dsum(Vg[i1:i2],dfacmu)
          myNg = myNg + ximisc.downsample1dsum(Ng[i1:i2],dfacmu)
      elif xiopt == 1:
        if(ishort == 0):
          mymu = ximisc.downsample1d(mug[i1:i2],dfacmu)
          myxig = ximisc.downsample1dvweight(xig[i1:i2],Vg[i1:i2],dfacmu)  #perform volume weighted sum. 
          myVg = ximisc.downsample1dsum(Vg[i1:i2],dfacmu)
        else:
          myxig = myxig + ximisc.downsample1dvweight(xig[i1:i2],Vg[i1:i2],dfacmu) # perform volume weighted sum, divide out at the end.
          myVg = myVg + ximisc.downsample1dsum(Vg[i1:i2],dfacmu)

      else:
        if(ishort == 0):
          mymu = ximisc.downsample1d(mug[i1:i2],dfacmu)
          mydd = ximisc.downsample1dsum(DDg[i1:i2],dfacmu)
          mydr = ximisc.downsample1dsum(DRg[i1:i2],dfacmu)
          myrr = ximisc.downsample1dsum(RRg[i1:i2],dfacmu)
        else:
          mydd = mydd + ximisc.downsample1dsum(DDg[i1:i2],dfacmu)
          mydr = mydr + ximisc.downsample1dsum(DRg[i1:i2],dfacmu)
          myrr = myrr + ximisc.downsample1dsum(RRg[i1:i2],dfacmu)

    if periodicopt == 1:
      yy = np.where(myVg < Vzerochk)[0]
      xitmp = myNg/myVg-1.
      xitmp[yy] = 0.

    elif xiopt == 1:
      yy = np.where(myVg < Vzerochk)[0]
      xitmp = myxig/myVg
      xitmp[yy] = 0.
      ## for now, nothing to 0 out (?)

    else:  ##DR stuff
      zz = np.where(myrr < smallRRcut)[0]
      if(len(zz) > 0):
        print 'using smallRRcut!  here are details',i,rcen[i],smallRRcut
        myrr = myrr.mean()

      yy = np.where(myrr < 0.01)[0]
      xitmp = (mydd-mydr*DRfac)/myrr/DRfac**2/fixRR**2+1.
      xitmp[yy] = 0.  ## fix 0'd out regions

      if(len(yy) > 0 and 0==1):
        print 'ack why zerod out regions?'
        print len(yy)
        print i, dfacs, dfacmu
        print myrr
        print mymu

    for ell in np.arange(0,nell*2,2):
      if(badlist[i] == 0):
        xi[ell/2,xiindx] = (xitmp*ximisc.legendre(ell,mymu)).sum()*dmudown*(2.*ell+1.)
        svec[ell/2,xiindx] = rcen[i]

    if printmaskopt == 2:
      ofpmask.write('%e %e %e %e %e ' % (rcen[i], s1d[ristart]*np.exp(-0.5*dlogs), s1d[riend]*np.exp(0.5*dlogs), mumaxlist[ristart],mumaxlist[riend]))
      for ell in np.arange(0,nell*2,2):
        if badlist[i] == 0:
          ofpmask.write('%e ' % (xi[ell/2,xiindx]))
        else:
          ofpmask.write('%e ' % (0.0))

      ofpmask.write('\n')

    ristart = ristart + dfacs

    if(badlist[i] == 0):
      xiindx += 1

  return xiell(xiellfname=fDR,sxilist=[svec, xi],icovfname=icovfname)
Beispiel #4
0
def xiellfromDR(fbase,nell=3,binfile=None,rperpcut=-1.,
                dfacs=1,dfacmu=1,icovfname=None,smincut=-1.,smaxcut=1.e12,\
                DRfacinfo=None,smallRRcut=-1.,periodicopt=0,printmaskopt=0,xiopt=0):
    """
  This function should supercede older codes with names like rebinxismugeneric*py
  input the base for the DR files, as well as optional bin files and small scale 
  cutoff for masking (rperpcut).  If you don't want to use a binfile to specify
  the downsampling, use dfacs and dfacmu inputs.
  smincut/smaxcut will only be used if binfile is None.
  DRfacinfo is used to pass [DRfac, fixRR] (dont get it from file headers in this case)
  That feature is necessary for computing covariance matrices from bootstrap, where that factor
  should be fixed by total N and/or S, it does not vary from bootstrap region to region.
  smallRRcut allows you to replace randoms(mu) with the average over mu where the total number of 
  randoms in the bin is smaller than smallRRcut, just to keep Poisson noise down.
  If periodicopt == 1, assume the input is file containing [rg, mug, Vg, Ng] as currently output
  by correlationfxnMASTERv4.
  xiopt introduced on May 13 2014 to input xi(s,mu) and simply rebin (for comparison with Hong).
  """
    if periodicopt == 1:  # periodic box.
        rg, mug, Vg, Ng = np.loadtxt(fbase, unpack=True)
        Vzerochk = Vg.min() * 0.1
        fDR = fbase  ## just for the return xiell purposes.
    elif xiopt == 1:
        rg, mug, xig = np.loadtxt(fbase, unpack=True,
                                  usecols=[0, 1, 2])  ## Hong format.
        fDR = fbase
        if binfile is None:
            ikeep = np.where((rg >= smincut) & (rg <= smaxcut))[0]
            rg = rg[ikeep]
            mug = mug[ikeep]
            xig = xig[ikeep]
    else:  # DD,RR counts.
        fDD = fbase + '.DRopt1'
        fDR = fbase + '.DRopt2'
        fRR = fbase + '.DRopt3'
        rg, mug, DDg = np.loadtxt(fDD, skiprows=3, unpack=True)
        rg, mug, DRg = np.loadtxt(fDR, skiprows=3, unpack=True)
        rg, mug, RRg = np.loadtxt(fRR, skiprows=3, unpack=True)
        if binfile is None:
            ikeep = np.where((rg >= smincut) & (rg <= smaxcut))[0]
            rg = rg[ikeep]
            mug = mug[ikeep]
            DDg = DDg[ikeep]
            DRg = DRg[ikeep]
            RRg = RRg[ikeep]

        if DRfacinfo is None:
            DRfac, fixRR = ximisc.getDRfactors(fbase)
        else:
            DRfac = DRfacinfo[0]
            fixRR = DRfacinfo[1]

    nmu = len(np.where(rg == rg[0])[0])
    dmu = 1. / float(nmu)
    nr = len(np.where(mug == mug[0])[0])
    if nmu * nr != len(rg):
        return None

    ## is s (called r here) log or linear binning?
    s1d = rg.reshape([nr, nmu])[:, 0]
    mu1d = rg.reshape([nr, nmu])[0, :]
    ## compute linear spacings.
    dmutmp = (mu1d[1:] - mu1d[:-1]).mean()
    ds = (s1d[1:] - s1d[:-1]).mean()
    dlogs = (np.log(s1d[1:] / s1d[:-1])).mean()
    if (np.fabs(mu1d[1:] - mu1d[:-1] - dmutmp) > 0.0001 * dmutmp).any():
        ## not linear binning!
        ## this shouldn't be the case for a s,mu grid.
        assert 0 == 1
        assert np.fabs(dmutmp - dmu) < 1.0e-4

    if (np.fabs(s1d[1:] - s1d[:-1] - ds) < 0.0001 * ds).all():
        logsopt = 0
        rglowedge = rg.copy()
        rglowedge = rglowedge - 0.5 * ds
        ## added specifically for xiopt
        rghighedge = rg.copy()
        rghighedge = rghighedge + 0.5 * ds
    if (np.fabs(np.log(s1d[1:]) - np.log(s1d[:-1]) - dlogs) <
            0.0001 * dlogs).all():
        logsopt = 1
        rglowedge = rg.copy()
        rglowedge = rglowedge * np.exp(-0.5 * dlogs)
        ## added specifically for xiopt
        rghighedge = rg.copy()
        rghighedge = rghighedge * np.exp(0.5 * dlogs)

    assert logsopt == 0 or logsopt == 1
    if xiopt == 1:
        Vg = rghighedge**3 - rglowedge**3  ## just need something proportional to volume.
        Vzerochk = Vg.min() * 0.1

    ## cut at edge of bin.
    xx = np.where(rglowedge * (1 - (mug + 0.5 * dmu)**2)**0.5 < rperpcut)[0]
    if (rperpcut < 0.): assert len(xx) == 0
    if len(xx) > 0:
        if periodicopt == 1:
            Vg[xx] = 0.
            Ng[xx] = 0.
        elif xiopt == 1:
            Vg[xx] = 0.
            xig[xx] = 0.

        else:
            DDg[xx] = 0.
            DRg[xx] = 0.
            RRg[xx] = 0.

    mymask = np.zeros(len(rg), dtype='int')
    mymask[xx] = 1

    ## tmp!  print a mask file.
    if (printmaskopt == 1):
        print 'yoyoyo opening masktmp.dat'
        ofpmask = open('masktmp.dat', 'w')
        for i in range(len(mymask)):
            ofpmask.write('%d\n' % (mymask[i]))
        ofpmask.close()

    if (printmaskopt == 2):
        #### nevermind, let's print below the boundaries of each s,mu bin.
        #    print 'yoyoyo opening masktmp2.dat'
        #    ofpmask = open('masktmp2.dat','w')
        mumaxlist = np.zeros(len(s1d)) + 1.
        for qi in range(len(s1d)):
            rgval = s1d[qi]
            qq = np.where((rg == rgval) & (mymask == 1))[0]
            ww = np.where((rg == rgval))[0]
            assert len(ww) > 0
            if (len(qq) == 0):
                pass
#        ofpmask.write('%e %e %e\n' % (rgval,rglowedge[ww[0]],1.0))
            else:
                #        ofpmask.write('%e %e %e\n' % (rgval,rglowedge[ww[0]],mug[qq].max()))
                mumaxlist[qi] = mug[qq].min() - 0.5 * dmu
### testing.
#      print s1d[qi], mumaxlist[qi]
#ofpmask.write('%d\n' % (mymask[i]))
#    ofpmask.close()

    if binfile is not None:
        ## specifies how many rbins to join together for first bin, next bin, etc.
        rjoin, mujoin = np.loadtxt(binfile, unpack=True, dtype='int')
        nrcut = len(rjoin)
        ### use later.
        #bintag = binfile.split('.')[0]
    else:
        #    dfacs = dfacsin
        #    dfacmu = dfacmuin
        nrcut = len(s1d) / dfacs
        dmudown = dfacmu * dmu

    if printmaskopt == 2:
        ofpmask = open('masktmp2.dat', 'w')

    ## check mask if I'm going to cut more.
    ristart = 0
    badlist = np.zeros(nrcut, dtype='int')
    for i in range(nrcut):
        if binfile is not None:
            dfacs = rjoin[i]
        if (mymask[ristart * nmu:(ristart + dfacs) * nmu] == 1).all():
            badlist[i] = 1
        ristart = ristart + dfacs

    nrcutkeep = nrcut - len(np.where(badlist == 1)[0])

    xi = np.zeros([nell, nrcutkeep], dtype=float)
    svec = np.zeros([nell, nrcutkeep], dtype=float)

    rcen = np.zeros(nrcut, dtype=float)
    ristart = 0
    xiindx = 0
    for i in range(nrcut):
        if binfile is not None:
            dfacs = rjoin[i]
            dfacmu = mujoin[i]
            dmudown = dfacmu * dmu
        riend = ristart + dfacs - 1
        if logsopt == 0:
            rcen[i] = 0.5 * (s1d[ristart] + s1d[riend])
        if logsopt == 1:
            rcen[i] = np.exp(0.5 * np.log(s1d[ristart] * s1d[riend]))
        for ishort in range(dfacs):
            i1 = (ristart + ishort) * nmu
            i2 = (ristart + ishort + 1) * nmu
            if periodicopt == 1:
                if (ishort == 0):
                    mymu = ximisc.downsample1d(mug[i1:i2], dfacmu)
                    myVg = ximisc.downsample1dsum(Vg[i1:i2], dfacmu)
                    myNg = ximisc.downsample1dsum(Ng[i1:i2], dfacmu)
                else:
                    myVg = myVg + ximisc.downsample1dsum(Vg[i1:i2], dfacmu)
                    myNg = myNg + ximisc.downsample1dsum(Ng[i1:i2], dfacmu)
            elif xiopt == 1:
                if (ishort == 0):
                    mymu = ximisc.downsample1d(mug[i1:i2], dfacmu)
                    myxig = ximisc.downsample1dvweight(
                        xig[i1:i2], Vg[i1:i2],
                        dfacmu)  #perform volume weighted sum.
                    myVg = ximisc.downsample1dsum(Vg[i1:i2], dfacmu)
                else:
                    myxig = myxig + ximisc.downsample1dvweight(
                        xig[i1:i2], Vg[i1:i2], dfacmu
                    )  # perform volume weighted sum, divide out at the end.
                    myVg = myVg + ximisc.downsample1dsum(Vg[i1:i2], dfacmu)

            else:
                if (ishort == 0):
                    mymu = ximisc.downsample1d(mug[i1:i2], dfacmu)
                    mydd = ximisc.downsample1dsum(DDg[i1:i2], dfacmu)
                    mydr = ximisc.downsample1dsum(DRg[i1:i2], dfacmu)
                    myrr = ximisc.downsample1dsum(RRg[i1:i2], dfacmu)
                else:
                    mydd = mydd + ximisc.downsample1dsum(DDg[i1:i2], dfacmu)
                    mydr = mydr + ximisc.downsample1dsum(DRg[i1:i2], dfacmu)
                    myrr = myrr + ximisc.downsample1dsum(RRg[i1:i2], dfacmu)

        if periodicopt == 1:
            yy = np.where(myVg < Vzerochk)[0]
            xitmp = myNg / myVg - 1.
            xitmp[yy] = 0.

        elif xiopt == 1:
            yy = np.where(myVg < Vzerochk)[0]
            xitmp = myxig / myVg
            xitmp[yy] = 0.
            ## for now, nothing to 0 out (?)

        else:  ##DR stuff
            zz = np.where(myrr < smallRRcut)[0]
            if (len(zz) > 0):
                print 'using smallRRcut!  here are details', i, rcen[
                    i], smallRRcut
                myrr = myrr.mean()

            yy = np.where(myrr < 0.01)[0]
            xitmp = (mydd - mydr * DRfac) / myrr / DRfac**2 / fixRR**2 + 1.
            xitmp[yy] = 0.  ## fix 0'd out regions

            if (len(yy) > 0 and 0 == 1):
                print 'ack why zerod out regions?'
                print len(yy)
                print i, dfacs, dfacmu
                print myrr
                print mymu

        for ell in np.arange(0, nell * 2, 2):
            if (badlist[i] == 0):
                xi[ell / 2, xiindx] = (xitmp * ximisc.legendre(
                    ell, mymu)).sum() * dmudown * (2. * ell + 1.)
                svec[ell / 2, xiindx] = rcen[i]

        if printmaskopt == 2:
            ofpmask.write(
                '%e %e %e %e %e ' %
                (rcen[i], s1d[ristart] * np.exp(-0.5 * dlogs), s1d[riend] *
                 np.exp(0.5 * dlogs), mumaxlist[ristart], mumaxlist[riend]))
            for ell in np.arange(0, nell * 2, 2):
                if badlist[i] == 0:
                    ofpmask.write('%e ' % (xi[ell / 2, xiindx]))
                else:
                    ofpmask.write('%e ' % (0.0))

            ofpmask.write('\n')

        ristart = ristart + dfacs

        if (badlist[i] == 0):
            xiindx += 1

    return xiell(xiellfname=fDR, sxilist=[svec, xi], icovfname=icovfname)