void SBTopHat::SBTopHatImpl::fillKImage(ImageView<std::complex<double> > im, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBTopHat 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 *= _r0; dkx *= _r0; ky0 *= _r0; dky *= _r0; for (int j=0; j<n; ++j,ky0+=dky,ptr+=skip) { double kx = kx0; double kysq = ky0*ky0; for (int i=0; i<m; ++i,kx+=dkx) *ptr++ = kValue2(kx*kx + kysq); } } }
void SBGaussian::SBGaussianImpl::fillKImage(ImageView<std::complex<T> > im, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBGaussian 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<T>* ptr = im.getData(); int skip = im.getNSkip(); assert(im.getStep() == 1); kx0 *= _sigma; dkx *= _sigma; ky0 *= _sigma; dky *= _sigma; // The Gaussian profile is separable: // im(kx,ky) = _flux * exp(-0.5 * (kx*kx + ky*ky) // = _flux * exp(-0.5 * kx*kx) * exp(-0.5 * ky*ky) std::vector<double> gauss_kx(m); std::vector<double> gauss_ky(n); typedef std::vector<double>::iterator It; It kxit = gauss_kx.begin(); for (int i=0; i<m; ++i,kx0+=dkx) *kxit++ = fmath::expd(-0.5 * kx0*kx0); if ((kx0 == ky0) && (dkx == dky) && (m==n)) { gauss_ky = gauss_kx; } else { It kyit = gauss_ky.begin(); for (int j=0; j<n; ++j,ky0+=dky) *kyit++ = fmath::expd(-0.5 * ky0*ky0); } for (int j=0; j<n; ++j,ptr+=skip) { for (int i=0; i<m; ++i) *ptr++ = _flux * gauss_kx[i] * gauss_ky[j]; } } }
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]; } } }