33 #include "boost/iterator/iterator_adaptor.hpp"
34 #include "boost/iterator/transform_iterator.hpp"
35 #include "ndarray/eigen.h"
60 namespace algorithms {
71 explicit AvgPosItem(
double wx_ = 0.0,
double wy_ = 0.0,
double w_ = 0.0) :
wx(wx_),
wy(wy_),
w(w_) {}
77 bool operator<(AvgPosItem
const &other)
const {
return w <
other.w; }
79 AvgPosItem &
operator+=(AvgPosItem
const &other) {
86 AvgPosItem &
operator-=(AvgPosItem
const &other) {
93 friend AvgPosItem
operator+(AvgPosItem a, AvgPosItem
const &
b) {
return a +=
b; }
95 friend AvgPosItem
operator-(AvgPosItem a, AvgPosItem
const &
b) {
return a -=
b; }
99 afw::geom::SkyWcs
const &
coaddWcs, afw::table::Key<double> weightKey) {
100 afw::table::Key<int> goodPixKey;
102 goodPixKey = catalog.getSchema()[
"goodpix"];
103 }
catch (pex::exceptions::NotFoundError &) {
106 items.reserve(catalog.size());
109 AvgPosItem item(p.getX(), p.getY(), i->get(weightKey));
110 if (goodPixKey.isValid()) {
111 item.w *= i->get(goodPixKey);
115 items.push_back(item);
126 catalog.subsetContaining(
result.getPoint(),
coaddWcs,
true).empty(); ++iter) {
127 if (iter ==
items.end()) {
132 "Could not find a valid average position for CoaddPsf");
152 mapper.addMapping(goodPixKey,
true);
159 _weightKey =
mapper.addMapping(weightKey, weightField);
164 record->assign(*i,
mapper);
165 _catalog.push_back(record);
167 _averagePosition = computeAveragePosition(_catalog, _coaddWcs, _weightKey);
182 for (
unsigned int i = 0; i < imgVector.size(); i++) {
195 assert(imgVector.size() == weightVector.
size());
196 for (
unsigned int i = 0; i < imgVector.size(); i++) {
198 double weight = weightVector[i];
199 double sum = ndarray::asEigenMatrix(componentImg->getArray()).sum();
217 if (subcat.empty()) {
220 (boost::format(
"Cannot compute BBox at point %s; no input images at that point.") % ccdXY)
225 for (
auto const &exposureRecord : subcat) {
228 WarpedPsf warpedPsf =
WarpedPsf(exposureRecord.getPsf(), exposureToCoadd, _warpingControl);
237 CoaddPsf::doComputeKernelImage(geom::
Point2D const &ccdXY, afw::image::Color const &color)
const {
240 if (subcat.empty()) {
243 (boost::format(
"Cannot compute CoaddPsf at point %s; no input images at that point.") % ccdXY)
246 double weightSum = 0.0;
254 for (
auto const &exposureRecord : subcat) {
259 WarpedPsf warpedPsf =
WarpedPsf(exposureRecord.getPsf(), exposureToCoadd, _warpingControl);
262 LSST_EXCEPT_ADD(exc, (boost::format(
"Computing WarpedPsf kernel image for id=%d") %
263 exposureRecord.getId())
268 weightSum += exposureRecord.get(_weightKey);
269 weightVector.
push_back(exposureRecord.get(_weightKey));
288 return _catalog[index].getPsf();
295 return *_catalog[index].getWcs();
302 return _catalog[index].getValidPolygon();
309 return _catalog[index].get(_weightKey);
316 return _catalog[index].getId();
323 return _catalog[index].getBBox();
335 class CoaddPsfPersistenceHelper {
343 static CoaddPsfPersistenceHelper
const &get() {
344 static CoaddPsfPersistenceHelper
const instance;
349 CoaddPsfPersistenceHelper()
351 coaddWcs(
schema.addField<int>(
"coaddwcs",
"archive ID of the coadd's WCS")),
352 cacheSize(
schema.addField<int>(
"cachesize",
"size of the warping cache")),
354 schema,
"avgpos",
"PSF accessors default position",
"pixel")),
356 schema.addField<
std::string>(
"warpingkernelname",
"warping kernel name", 32)) {}
365 if (catalogs.size() == 1u) {
369 return readV0(archive, catalogs);
372 CoaddPsfPersistenceHelper
const &keys1 = CoaddPsfPersistenceHelper::get();
378 record1.
get(keys1.averagePosition), record1.
get(keys1.warpingKernelName),
379 record1.
get(keys1.cacheSize)));
391 auto coaddWcs = internalCat.back().getWcs();
392 internalCat.pop_back();
398 weightKey = internalCat.getSchema()[
"weight"];
401 auto averagePos = computeAveragePosition(internalCat, *
coaddWcs, weightKey);
410 std::string getCoaddPsfPersistenceName() {
return "CoaddPsf"; }
412 CoaddPsf::Factory registration(getCoaddPsfPersistenceName());
421 CoaddPsfPersistenceHelper
const &keys1 = CoaddPsfPersistenceHelper::get();
424 auto coaddWcsPtr = std::make_shared<afw::geom::SkyWcs>(_coaddWcs);
425 record1->set(keys1.coaddWcs, handle.put(coaddWcsPtr));
426 record1->set(keys1.cacheSize, _warpingControl->getCacheSize());
427 record1->set(keys1.averagePosition, _averagePosition);
428 record1->set(keys1.warpingKernelName, _warpingKernelName);
429 handle.saveCatalog(cat1);
437 _weightKey(_catalog.getSchema()[
"weight"]),