void SBBox::SBBoxImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBBox fillKValue\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKValueQuadrant(val,kx0,dkx,izero,ky0,dky,jzero); } else { xdbg<<"Non-Quadrant\n"; assert(val.stepi() == 1); const int m = val.colsize(); const int n = val.rowsize(); typedef tmv::VIt<double,1,tmv::NonConj> It; kx0 *= _wo2pi; dkx *= _wo2pi; ky0 *= _ho2pi; dky *= _ho2pi; // The Box profile in Fourier space is separable: // val(x,y) = _flux * sinc(x * _width/2pi) * sinc(y * _height/2pi) tmv::Vector<double> sinc_kx(m); It kxit = sinc_kx.begin(); for (int i=0;i<m;++i,kx0+=dkx) *kxit++ = sinc(kx0); tmv::Vector<double> sinc_ky(n); It kyit = sinc_ky.begin(); for (int j=0;j<n;++j,ky0+=dky) *kyit++ = sinc(ky0); val = _flux * sinc_kx ^ sinc_ky; } }
void SBBox::SBBoxImpl::fillKImage(ImageView<std::complex<double> > im, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBBox fillKImage\n"; dbg<<"kx = "<<kx0<<" + i * "<<dkx<<", izero = "<<izero<<std::endl; dbg<<"ky = "<<ky0<<" + j * "<<dky<<", jzero = "<<jzero<<std::endl; if (izero != 0 || jzero != 0) { xdbg<<"Use Quadrant\n"; fillKImageQuadrant(im,kx0,dkx,izero,ky0,dky,jzero); } else { xdbg<<"Non-Quadrant\n"; const int m = im.getNCol(); const int n = im.getNRow(); std::complex<double>* ptr = im.getData(); int skip = im.getNSkip(); assert(im.getStep() == 1); kx0 *= _wo2pi; dkx *= _wo2pi; ky0 *= _ho2pi; dky *= _ho2pi; // The Box profile in Fourier space is separable: // val(x,y) = _flux * sinc(x * _width/2pi) * sinc(y * _height/2pi) std::vector<double> sinc_kx(m); std::vector<double> sinc_ky(n); typedef std::vector<double>::iterator It; It kxit = sinc_kx.begin(); for (int i=0; i<m; ++i,kx0+=dkx) *kxit++ = sinc(kx0); if ((kx0 == ky0) && (dkx == dky) && (m==n)) { sinc_ky = sinc_kx; } else { It kyit = sinc_ky.begin(); for (int j=0; j<n; ++j,ky0+=dky) *kyit++ = sinc(ky0); } for (int j=0; j<n; ++j,ptr+=skip) { for (int i=0; i<m; ++i) *ptr++ = _flux * sinc_kx[i] * sinc_ky[j]; } } }