void SBGaussian::SBGaussianImpl::fillKValue(tmv::MatrixView<std::complex<double> > val, double kx0, double dkx, int izero, double ky0, double dky, int jzero) const { dbg<<"SBGaussian 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 *= _sigma; dkx *= _sigma; ky0 *= _sigma; dky *= _sigma; tmv::Vector<double> gauss_kx(m); It kxit = gauss_kx.begin(); for (int i=0;i<m;++i,kx0+=dkx) *kxit++ = exp(-0.5 * kx0*kx0); tmv::Vector<double> gauss_ky(n); It kyit = gauss_ky.begin(); for (int j=0;j<n;++j,ky0+=dky) *kyit++ = exp(-0.5 * ky0*ky0); val = _flux * gauss_kx ^ gauss_ky; } }
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]; } } }