Beispiel #1
0
 def A(self, u):
     s, a = self.dof.unzip(u)
     # U"u = [S"s, 0a]
     Uu = self.dof.zip(en.harm2map(en.map_mul(self.iS, en.map2harm(s))),
                       a * 0)
     # P'N"P u
     PNPu = self.PT(en.map_mul(self.iN, self.P(u)))
     return Uu + PNPu
Beispiel #2
0
 def calc_b(self):
     PNd = self.PT(en.map_mul(self.iN, self.d))
     Uw1_s = en.harm2map(
         en.map_mul(self.hS,
                    en.rand_gauss_harm(self.d.shape[-3:], self.d.wcs)))
     Uw1_a = np.zeros(self.T.shape[0])
     Uw1 = self.dof.zip(Uw1_s, Uw1_a)
     PNw2 = self.PT(
         en.map_mul(self.hN, en.rand_gauss(self.d.shape, self.d.wcs)))
     return PNd + Uw1 + PNw2
Beispiel #3
0
 def M(x):
     map = x[:area.size].reshape(area.shape)
     junk = x[area.size:]
     omap = map * 0
     omap[:] = enmap.map_mul(idiv, map)
     ojunk = junk / jdiv
     return np.concatenate([omap.reshape(-1), ojunk], 0)
Beispiel #4
0
	def M(x):
		map  = x[:area.size].reshape(area.shape)
		junk = x[area.size:]
		omap = map*0
		omap[:] = enmap.map_mul(idiv, map)
		ojunk= junk/jdiv
		return np.concatenate([omap.reshape(-1),ojunk],0)
Beispiel #5
0
 def M(self, u):
     # Multiplying things out, the full expression for A is:
     #  [ S" + sum(N")   sum(N"T) ]
     #  [  sum(T'N")     sum(T'T) ]
     # A reasonable approximation for this is
     #  [ S" + sum(sigma^{-2})    0    ]
     #  [         0           sum(T'T) ]
     # which can be directly inverted.
     s, a = self.dof.unzip(u)
     # Solve for the cmb signal component
     res_s = en.harm2map(en.map_mul(self.S_prec, en.map2harm(s)))
     res_a = np.linalg.solve(self.TT, a)
     return self.dof.zip(res_s, res_a)
Beispiel #6
0
def noise_from_splits(splits, fourier_calc, nthread=0):

    Nsplits = len(splits)

    # Get fourier transforms of I,Q,U
    ksplits = [
        fourier_calc.iqu2teb(split,
                             nthread=nthread,
                             normalize=False,
                             rot=False) for split in splits
    ]

    # Rotate I,Q,U to T,E,B for cross power (not necssary for noise)
    kteb_splits = []
    for ksplit in ksplits:
        kteb_splits.append(ksplit.copy())
        kteb_splits[-1][..., -2:, :, :] = enmap.map_mul(
            fourier_calc.rot, kteb_splits[-1][..., -2:, :, :])

    # get auto power of I,Q,U
    auto = sum([fourier_calc.power2d(kmap=ksplit)[0]
                for ksplit in ksplits]) / Nsplits

    # do cross powers of I,Q,U
    cross_splits = [y for y in itertools.combinations(ksplits, 2)]
    Ncrosses = len(cross_splits)
    assert Ncrosses == (Nsplits * (Nsplits - 1) / 2)
    cross = sum([
        fourier_calc.power2d(kmap=ksplit1, kmap2=ksplit2)[0]
        for (ksplit1, ksplit2) in cross_splits
    ]) / Ncrosses

    # do cross powers of T,E,B
    cross_teb_splits = [y for y in itertools.combinations(kteb_splits, 2)]
    cross_teb = sum([
        fourier_calc.power2d(kmap=ksplit1, kmap2=ksplit2)[0]
        for (ksplit1, ksplit2) in cross_teb_splits
    ]) / Ncrosses

    # get noise model for I,Q,U
    noise = (auto - cross) / Nsplits

    # return I,Q,U noise model and T,E,B cross-power
    return noise, cross_teb
Beispiel #7
0
		rhs  = enmap.zeros((ncomp,)+shape, area.wcs, dtype)
		div  = enmap.zeros((ncomp,ncomp)+shape, area.wcs, dtype)
		junk = np.zeros(pcut.njunk, dtype)
	with bench.show("rhs"):
		tod *= ivar[:,None]
		pcut.backward(tod, junk)
		pmap.backward(tod, rhs)
	with bench.show("hits"):
		for i in range(ncomp):
			div[i,i] = 1
			pmap.forward(tod, div[i])
			tod *= ivar[:,None]
			pcut.backward(tod, junk)
			div[i] = 0
			pmap.backward(tod, div[i])
	with bench.show("map"):
		idiv = array_ops.eigpow(div, -1, axes=[0,1], lim=1e-5)
		map  = enmap.map_mul(idiv, rhs)
	# Estimate central amplitude
	c = np.array(map.shape[-2:])/2
	crad  = 50
	mcent = map[:,c[0]-crad:c[0]+crad,c[1]-crad:c[1]+crad]
	mcent = enmap.downgrade(mcent, 4)
	amp   = np.max(mcent)
	print "%s amp %7.3f asens %7.3f" % (id, amp/1e6, asens)
	with bench.show("write"):
		enmap.write_map("%s%s_map.fits" % (prefix, bid), map)
		enmap.write_map("%s%s_rhs.fits" % (prefix, bid), rhs)
		enmap.write_map("%s%s_div.fits" % (prefix, bid), div)
	del d, scan, pmap, pcut, tod, map, rhs, div, idiv, junk
Beispiel #8
0
		rhs  = enmap.zeros((ncomp,)+shape, area.wcs, dtype)
		div  = enmap.zeros((ncomp,ncomp)+shape, area.wcs, dtype)
		junk = np.zeros(pcut.njunk, dtype)
	with bench.show("rhs"):
		tod *= ivar[:,None]
		pcut.backward(tod, junk)
		pmap.backward(tod, rhs)
	with bench.show("hits"):
		for i in range(ncomp):
			div[i,i] = 1
			pmap.forward(tod, div[i])
			tod *= ivar[:,None]
			pcut.backward(tod, junk)
			div[i] = 0
			pmap.backward(tod, div[i])
	with bench.show("map"):
		idiv = array_ops.eigpow(div, -1, axes=[0,1], lim=1e-5)
		map  = enmap.map_mul(idiv, rhs)
	# Estimate central amplitude
	c = np.array(map.shape[-2:])/2
	crad  = 50
	mcent = map[:,c[0]-crad:c[0]+crad,c[1]-crad:c[1]+crad]
	mcent = enmap.downgrade(mcent, 4)
	amp   = np.max(mcent)
	print("%s amp %7.3f asens %7.3f" % (id, amp/1e6, asens))
	with bench.show("write"):
		enmap.write_map("%s%s_map.fits" % (prefix, bid), map)
		enmap.write_map("%s%s_rhs.fits" % (prefix, bid), rhs)
		enmap.write_map("%s%s_div.fits" % (prefix, bid), div)
	del d, scan, pmap, pcut, tod, map, rhs, div, idiv, junk
Beispiel #9
0
            t = np.zeros([scan.ndet, scan.nsamp], dtype)
            scan.pmap.forward(t, (lam * scan.T)**-1 * map)
            scan.pcut.forward(t, (lam * scan.T)**-1 *
                              junk[scan.cut_range[0]:scan.cut_range[1]])
            if not args.precompute:
                t += scan.Nbd
            t = scan.iNbT.apply(t)
            t /= scan.T
            scan.pcut.backward(t, junk[scan.cut_range[0]:scan.cut_range[1]])
            scan.pmap.backward(t, rhs)
        rhs = utils.allreduce(rhs, comm)
        if args.precompute:
            rhs += prec_NNmap[lam]
            junk += prec_NNjunk[lam]
        junk /= jdiv
        map[:] = enmap.map_mul(idiv, rhs)
        if comm.rank == 0:
            print "%4d %15.7e %8.1f" % (i + 1, np.std(map), lam)
            if (i + 1) % args.ostep == 0:
                enmap.write_map(args.odir + "/map%04d.fits" % (i + 1), map)

elif args.method == "cg":

    def A(x):
        map = x[:area.size].reshape(area.shape)
        junk = x[area.size:]
        omap = map * 0
        ojunk = junk * 0
        for scan in scans:
            tod = np.zeros([scan.ndet, scan.nsamp], dtype)
            scan.pmap.forward(tod, map)
Beispiel #10
0
		for si, scan in enumerate(scans):
			t = np.zeros([scan.ndet,scan.nsamp],dtype)
			scan.pmap.forward(t, (lam*scan.T)**-1*map)
			scan.pcut.forward(t, (lam*scan.T)**-1*junk[scan.cut_range[0]:scan.cut_range[1]])
			if not args.precompute:
				t += scan.Nbd
			t  = scan.iNbT.apply(t)
			t /= scan.T
			scan.pcut.backward(t, junk[scan.cut_range[0]:scan.cut_range[1]])
			scan.pmap.backward(t, rhs)
		rhs    = utils.allreduce(rhs, comm)
		if args.precompute:
			rhs  += prec_NNmap[lam]
			junk += prec_NNjunk[lam]
		junk  /= jdiv
		map[:] = enmap.map_mul(idiv, rhs)
		if comm.rank == 0:
			print "%4d %15.7e %8.1f" % (i+1, np.std(map), lam)
			if (i+1) % args.ostep == 0:
				enmap.write_map(args.odir + "/map%04d.fits" % (i+1), map)

elif args.method == "cg":
	def A(x):
		map  = x[:area.size].reshape(area.shape)
		junk = x[area.size:]
		omap = map*0
		ojunk= junk*0
		for scan in scans:
			tod = np.zeros([scan.ndet,scan.nsamp],dtype)
			scan.pmap.forward(tod, map)
			scan.pcut.forward(tod, junk[scan.cut_range[0]:scan.cut_range[1]])
Beispiel #11
0
def solve(w, m):
    if w.ndim == 2: return m / w[None]
    elif w.ndim == 3: return m / w
    elif w.ndim == 4: return enmap.map_mul(enmap.multi_pow(w, -1), m)
    else: raise NotImplementedError("Only 2d, 3d or 4d weight maps understood")
Beispiel #12
0
def mul(w, m):
    if w.ndim == 2: return m * w[None]
    elif w.ndim == 3: return m * w
    elif w.ndim == 4: return enmap.map_mul(w, m)
    else: raise NotImplementedError("Only 2d, 3d or 4d weight maps understood")