def forward(self, tod, amps, pmul=1): # Amps should be [nsrc,ndir,ndet|1,npol] params = self.params.copy() params[...,2:2+amps.shape[-1]] = amps self.psrc.forward(tod, params, pmul=pmul) sampcut.gapfill_linear(self.cut, tod, inplace=True) return tod
def calc_model_constrained(tod, cut, srate=400, mask_scale=0.3, lim=3e-4, maxiter=50, verbose=False): # First do some simple gapfilling to avoid messing up the noise model tod = sampcut.gapfill_linear(cut, tod, inplace=False) ft = fft.rfft(tod) * tod.shape[1]**-0.5 iN = nmat_measure.detvecs_jon(ft, srate) del ft iV = iN.ivar * mask_scale def A(x): x = x.reshape(tod.shape) Ax = iN.apply(x.copy()) Ax += sampcut.gapfill_const(cut, x * iV[:, None], 0, inplace=True) return Ax.reshape(-1) b = sampcut.gapfill_const(cut, tod * iV[:, None], 0, inplace=True).reshape(-1) x0 = sampcut.gapfill_linear(cut, tod).reshape(-1) solver = cg.CG(A, b, x0) while solver.i < maxiter and solver.err > lim: solver.step() if verbose: print("%5d %15.7e" % (solver.i, solver.err)) res = solver.x.reshape(tod.shape) res = smooth(res, srate) return res
def forward(self, tod, amps, pmul=1): # Amps should be [nsrc,ndir,ndet|1,npol] params = self.params.copy() # this assumes that the input amps params start from tqu onwards (no ra,dec) params[...,2:2+amps.shape[-1]] = amps self.psrc.forward(tod, params, pmul=pmul) sampcut.gapfill_linear(self.cut, tod, inplace=True) return tod
def backward(self, tod, amps=None, pmul=1, ncomp=3): params = self.params.copy() tod = sampcut.gapfill_linear(self.cut, tod, inplace=False, transpose=True) self.psrc.backward(tod, params, pmul=pmul) if amps is None: amps = params[...,2:2+ncomp] else: amps[:] = params[...,2:2+amps.shape[-1]] return amps
def backward(self, tod, amps=None, pmul=1): params = self.params.copy() tod = sampcut.gapfill_linear(self.cut, tod, inplace=False, transpose=True) self.psrc.backward(tod, params, pmul=pmul) if amps is None: amps = params[...,2] else: amps[:] = params[...,2] return amps
def calc_model_constrained(tod, cut, srate=400, mask_scale=0.3, lim=3e-4, maxiter=50, verbose=False): # First do some simple gapfilling to avoid messing up the noise model tod = sampcut.gapfill_linear(cut, tod, inplace=False) ft = fft.rfft(tod) * tod.shape[1]**-0.5 iN = nmat_measure.detvecs_jon(ft, srate) del ft iV = iN.ivar*mask_scale def A(x): x = x.reshape(tod.shape) Ax = iN.apply(x.copy()) Ax += sampcut.gapfill_const(cut, x*iV[:,None], 0, inplace=True) return Ax.reshape(-1) b = sampcut.gapfill_const(cut, tod*iV[:,None], 0, inplace=True).reshape(-1) x0 = sampcut.gapfill_linear(cut, tod).reshape(-1) solver = cg.CG(A, b, x0) while solver.i < maxiter and solver.err > lim: solver.step() if verbose: print "%5d %15.7e" % (solver.i, solver.err) return solver.x.reshape(tod.shape)
def gapfill_linear(tod, cut, inplace=False, overlap=None): overlap = config.get("gapfill_context", overlap) return sampcut.gapfill_linear(cut, tod, inplace=inplace, context=overlap)
def forward(self, tod, amps, pmul=1): params = self.params.copy() params[...,2] = amps self.psrc.forward(tod, params, pmul=pmul) sampcut.gapfill_linear(self.cut, tod, inplace=True)