510 "Error: variance less than 0.0");
514 "Error: variance equals 0.0, cannot inverse variance weight");
522 std::dynamic_pointer_cast<afwMath::LinearCombinationKernel>(this->
_kernel)->getKernelList();
537 int growPix = (*kiter)->getCtr().getX();
541 for (
typename afwDet::FootprintSet::FootprintList::iterator
542 ptr = maskedFpSetGrown.getFootprints()->begin(),
543 end = maskedFpSetGrown.getFootprints()->end();
547 afwDet::setMaskFromFootprint(finalMask,
554 for (
auto const & foot : *(maskedFpSetGrown.getFootprints())) {
558 finalMask.writeFits(
"finalmask.fits");
561 ndarray::Array<int, 1, 1> maskArray =
562 ndarray::allocate(ndarray::makeVector(fullFp->getArea()));
563 fullFp->getSpans()->flatten(maskArray, finalMask.getArray(), templateImage.
getXY0());
564 auto maskEigen = ndarray::asEigenMatrix(maskArray);
566 ndarray::Array<InputT, 1, 1> arrayTemplate =
567 ndarray::allocate(ndarray::makeVector(fullFp->getArea()));
568 fullFp->getSpans()->flatten(arrayTemplate, templateImage.
getArray(), templateImage.
getXY0());
569 auto eigenTemplate0 = ndarray::asEigenMatrix(arrayTemplate);
571 ndarray::Array<InputT, 1, 1> arrayScience =
572 ndarray::allocate(ndarray::makeVector(fullFp->getArea()));
573 fullFp->getSpans()->flatten(arrayScience, scienceImage.
getArray(), scienceImage.
getXY0());
574 auto eigenScience0 = ndarray::asEigenMatrix(arrayScience);
576 ndarray::Array<afwImage::VariancePixel, 1, 1> arrayVariance =
577 ndarray::allocate(ndarray::makeVector(fullFp->getArea()));
578 fullFp->getSpans()->flatten(arrayVariance, varianceEstimate.
getArray(), varianceEstimate.
getXY0());
579 auto eigenVariance0 = ndarray::asEigenMatrix(arrayVariance);
582 for (
int i = 0; i < maskEigen.size(); i++) {
583 if (maskEigen(i) == 0.0)
587 Eigen::VectorXd eigenTemplate(nGood);
588 Eigen::VectorXd eigenScience(nGood);
589 Eigen::VectorXd eigenVariance(nGood);
591 for (
int i = 0; i < maskEigen.size(); i++) {
592 if (maskEigen(i) == 0.0) {
593 eigenTemplate(nUsed) = eigenTemplate0(i);
594 eigenScience(nUsed) = eigenScience0(i);
595 eigenVariance(nUsed) = eigenVariance0(i);
604 unsigned int const nKernelParameters = basisList.
size();
606 unsigned int const nParameters = nKernelParameters + nBackgroundParameters;
618 for (kiter = basisList.
begin(); kiter != basisList.
end(); ++kiter, ++eiter) {
621 ndarray::Array<InputT, 1, 1> arrayC =
622 ndarray::allocate(ndarray::makeVector(fullFp->getArea()));
623 fullFp->getSpans()->flatten(arrayC, cimage.getArray(), cimage.getXY0());
624 auto eigenC0 = ndarray::asEigenMatrix(arrayC);
626 Eigen::VectorXd eigenC(nGood);
628 for (
int i = 0; i < maskEigen.size(); i++) {
629 if (maskEigen(i) == 0.0) {
630 eigenC(nUsed) = eigenC0(i);
637 double time = t.elapsed();
638 LOGL_DEBUG(
"TRACE3.ip.diffim.StaticKernelSolution.buildWithMask",
639 "Total compute time to do basis convolutions : %.2f s", time);
643 Eigen::MatrixXd cMat(eigenTemplate.size(), nParameters);
646 for (
unsigned int kidxj = 0; eiterj != eiterE; eiterj++, kidxj++) {
647 cMat.block(0, kidxj, eigenTemplate.size(), 1) =
648 Eigen::MatrixXd(*eiterj).block(0, 0, eigenTemplate.size(), 1);
652 cMat.col(nParameters-1).fill(1.);
655 this->
_ivVec = eigenVariance.array().inverse().matrix();
656 this->
_iVec = eigenScience;