191 xdbg<<
"Start MeasureShapelet: order = "<<order<<std::endl;
192 xdbg<<
"b.order, sigma = "<<
b.getOrder()<<
", "<<
b.getSigma()<<std::endl;
193 xdbg<<
"el = "<<*
this<<std::endl;
194 if (maxm < 0 || maxm > order) maxm = order;
195 xdbg<<
"order = "<<order<<
','<<order2<<
','<<maxm<<std::endl;
206 double sigma =
b.getSigma();
210 std::complex<double>
m = exp(-
_mu)/sqrt(1.-gsq);
213 const int nExp = pix.size();
214 for(
int i=0;i<nExp;++i) nTot += pix[i].size();
215 dbg<<
"ntot = "<<nTot<<
" in "<<nExp<<
" images\n";
221 for(
int k=0,n=0;k<nExp;++k) {
224 sqrt(pow(sigma,2)+pow((*psf)[k].getSigma(),2)) :
226 dbg<<
"sigma_obs["<<k<<
"] = "<<sigma_obs<<std::endl;
228 const int nPix = pix[k].size();
229 for(
int i=0;i<nPix;++i,++n) {
230 I(n) = pix[k][i].getFlux()*pix[k][i].getInverseSigma();
231 W(n) = pix[k][i].getInverseSigma();
232 std::complex<double> z1 = pix[k][i].getPos();
234 Z(n) = z2 / sigma_obs;
241 int bsize = (order+1)*(order+2)/2;
242 xdbg<<
"bsize = "<<bsize<<std::endl;
243 int bsize2 = (order2+1)*(order2+2)/2;
244 xdbg<<
"bsize2 = "<<bsize2<<std::endl;
250 tmv::Permutation P(bsize);
253 tmv::Vector<double> mvals(bsize);
254 for(
int n=0,k=0;n<=order;++n) {
255 for(
int m=n;m>=0;m-=2) {
257 if (m > 0) mvals[k++] =
m;
260 dbg<<
"mvals = "<<mvals<<std::endl;
262 dbg<<
"mvals => "<<mvals<<std::endl;
271 msize = (maxm+1)*(maxm+2)/2 + (2*maxm+1)*(order-maxm)/2;
272 dbg<<
"msize = "<<msize<<std::endl;
273 dbg<<
"mvals["<<msize-1<<
"] = "<<mvals[msize-1]<<std::endl;
274 dbg<<
"mvals["<<msize<<
"] = "<<mvals[msize]<<std::endl;
275 Assert(mvals[msize-1] == maxm);
276 Assert(mvals[msize] == maxm+1);
285 for(
int k=0,n=0,nx;k<nExp;++k,n=nx) {
286 xdbg<<
"psf = "<<(*psf)[k]<<std::endl;
287 int psforder = (*psf)[k].getOrder();
288 int newpsforder = std::max(psforder,order2);
289 xdbg<<
"psforder = "<<psforder<<std::endl;
290 xdbg<<
"newpsforder = "<<newpsforder<<std::endl;
291 const double psfsigma = (*psf)[k].getSigma();
292 xdbg<<
"sigma = "<<psfsigma<<std::endl;
293 BVec newpsf(newpsforder,psfsigma);
294 int psfsize = (*psf)[k].size();
295 int newpsfsize = newpsf.size();
296 xdbg<<
"psfsize = "<<psfsize<<std::endl;
301 newpsf.vec() = S * (*psf)[k].vec();
303 xdbg<<
"newpsf = "<<newpsf<<std::endl;
307 DMatrix D(newpsfsize,newpsfsize);
309 newpsf.vec() = D * newpsf.vec();
313 newpsf.vec() = D * (*psf)[k].vec();
316 newpsf.vec() *= exp(2.*
real(
_mu));
317 xdbg<<
"newpsf => "<<newpsf<<std::endl;
319 if (imag(
_mu) != 0.) {
327 newpsf.vec() = R * newpsf.vec();
335 newpsf.vec() = R * (*psf)[k].vec();
338 xdbg<<
"newpsf => "<<newpsf<<std::endl;
347 const int nPix = pix[k].size();
350 makePsi(A1,Z.TMV_subVector(n,nx),order2,&W);
356 const double MAX_CONDITION = 1.e8;
360 tmv::MatrixView<double> Am = A.colRange(0,msize);
367 Am.divideUsing(tmv::QRP);
369 xdbg<<
"R diag = "<<Am.qrpd().getR().diag()<<std::endl;
371 #
if TMV_VERSION_AT_LEAST(0,65)
372 Am.qrpd().isSingular() ||
376 (Am.qrpd().getR().minAbs2Element() <
377 1.e-16 * Am.qrpd().getR().maxAbs2Element()) ||
379 DiagMatrixViewOf(Am.qrpd().getR().diag()).condition() >
381 dbg<<
"Poor condition in MeasureShapelet: \n";
382 dbg<<
"R diag = "<<Am.qrpd().getR().diag()<<std::endl;
383 dbg<<
"condition = "<<
384 DiagMatrixViewOf(Am.qrpd().getR().diag()).condition()<<
386 dbg<<
"det = "<<Am.qrpd().det()<<std::endl;
389 b.vec().subVector(0,msize) = I/Am;
390 xdbg<<
"b = "<<
b<<std::endl;
391 xdbg<<
"Norm(I) = "<<Norm(I)<<std::endl;
392 xdbg<<
"Norm(Am*b) = "<<Norm(Am*
b.vec().subVector(0,msize))<<std::endl;
393 xdbg<<
"Norm(I-Am*b) = "<<Norm(I-Am*
b.vec().subVector(0,msize))<<std::endl;
394 b.vec().subVector(msize,bsize).setZero();
395 b.vec() = P.transpose() *
b.vec();
396 xdbg<<
"b => "<<
b<<std::endl;
400 Am.makeInverseATA(bCov->subMatrix(0,msize,0,msize));
401 *bCov = P.transpose() * (*bCov) * P;
405 Eigen::JacobiSVD<DMatrix> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
406 const DVector& svd_s = svd.singularValues();
407 double max = svd_s(0);
408 double min = svd_s(svd_s.size()-1);
409 if (max > MAX_CONDITION * min) {
410 xdbg<<
"Poor condition in MeasureShapelet: \n";
411 xdbg<<
"svd = "<<svd_s.transpose()<<std::endl;
412 xdbg<<
"condition = "<<max/min<<std::endl;
417 DVector temp = svd.matrixU().transpose() * I;
418 temp = svd_s.array().inverse().matrix().asDiagonal() * temp;
419 b.vec().TMV_subVector(0,bsize) = svd.matrixV() * temp;
425 svd_s.array().square().inverse().matrix().asDiagonal() * svd.matrixV().transpose();
426 bCov->TMV_subMatrix(0,bsize,0,bsize) = svd.matrixV() * temp2;
430 dbg<<
"Calculated b vector has negative b(0):\n";
431 dbg<<
"b = "<<
b<<std::endl;
434 if (order <
b.getOrder()) {
435 xdbg<<
"Need to zero the rest of b\n";
436 xdbg<<
"bsize = "<<bsize<<
" b.size = "<<
b.size()<<std::endl;
438 b.vec().TMV_subVector(bsize,
b.size()).setZero();
440 xdbg<<
"Done measure Shapelet\n";
441 xdbg<<
"b = "<<
b.vec()<<std::endl;
Eigen::VectorXcd CDVector
void calculateGTransform(std::complex< double > g, int order1, int order2, DMatrix &S)
std::complex< double > _gamma
afw::table::Key< double > sigma
void makePsi(DMatrix &psi, CDVectorView z, int order, const DVector *coeff=0)
void calculateThetaTransform(double theta, int order1, int order2, DBandMatrix &R)
Eigen::MatrixXd DBandMatrix
std::complex< double > _cen
afw::table::Key< double > b
#define TMV_rowRange(m, i1, i2)
void calculatePsfConvolve(const BVec &bpsf, int order1, int order2, double sigma, DMatrix &C)
void calculateMuTransform(double mu, int order1, int order2, DMatrix &D)
std::complex< double > _mu