33 #include "boost/iterator/iterator_adaptor.hpp" 34 #include "boost/iterator/transform_iterator.hpp" 35 #include "ndarray/eigen.h" 45 #include "lsst/afw/table/io/Persistable.cc" 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 &) {
108 geom::Point2D p = coaddWcs.skyToPixel(i->getWcs()->pixelToSky(i->getPsf()->getAveragePosition()));
109 AvgPosItem item(p.getX(), p.getY(), i->get(weightKey));
110 if (goodPixKey.isValid()) {
111 item.w *= i->get(goodPixKey);
126 catalog.subsetContaining(result.getPoint(),
coaddWcs,
true).empty(); ++iter) {
127 if (iter == items.
end()) {
132 "Could not find a valid average position for CoaddPsf");
136 return result.getPoint();
143 : _coaddWcs(coaddWcs),
144 _warpingKernelName(warpingKernelName),
145 _warpingControl(
std::make_shared<
afw::math::WarpingControl>(warpingKernelName,
"", cacheSize)) {
152 mapper.addMapping(goodPixKey,
true);
159 _weightKey =
mapper.addMapping(weightKey, weightField);
164 record->assign(*i,
mapper);
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();
211 targetSubImage.
scaledPlus(weight / sum, cSubImage);
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) {
229 geom::Box2I componentBBox = warpedPsf.computeBBox(ccdXY, color);
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) {
263 exposureRecord.getId())
267 imgVector.push_back(componentImg);
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)) {
357 schema.getCitizen().markPersistent();
367 if (catalogs.size() == 1u) {
371 return readV0(archive, catalogs);
374 CoaddPsfPersistenceHelper
const &keys1 = CoaddPsfPersistenceHelper::get();
380 record1.get(keys1.averagePosition), record1.get(keys1.warpingKernelName),
381 record1.get(keys1.cacheSize)));
393 auto coaddWcs = internalCat.back().getWcs();
394 internalCat.pop_back();
400 weightKey = internalCat.getSchema()[
"weight"];
403 auto averagePos = computeAveragePosition(internalCat, *coaddWcs, weightKey);
412 std::string getCoaddPsfPersistenceName() {
return "CoaddPsf"; }
423 CoaddPsfPersistenceHelper
const &keys1 = CoaddPsfPersistenceHelper::get();
426 auto coaddWcsPtr = std::make_shared<afw::geom::SkyWcs>(_coaddWcs);
427 record1->set(keys1.coaddWcs, handle.
put(coaddWcsPtr));
428 record1->set(keys1.cacheSize, _warpingControl->getCacheSize());
429 record1->set(keys1.averagePosition, _averagePosition);
430 record1->set(keys1.warpingKernelName, _warpingKernelName);
439 _weightKey(_catalog.getSchema()[
"weight"]),
440 _averagePosition(averagePosition),
441 _warpingKernelName(warpingKernelName),
442 _warpingControl(new
afw::math::WarpingControl(warpingKernelName,
"", cacheSize)) {}
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
static std::shared_ptr< T > dynamicCast(std::shared_ptr< Persistable > const &ptr)
Dynamically cast a shared_ptr.
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
afw::table::Key< int > cacheSize
int put(Persistable const *obj, bool permissive=false)
Save an object to the archive and return a unique ID that can be used to retrieve it from an InputArc...
Image< LhsPixelT > & operator+=(Image< LhsPixelT > &lhs, Image< RhsPixelT > const &rhs)
Add lhs to Image rhs (i.e. pixel-by-pixel addition) where types are different.
An object passed to Persistable::write to allow it to persist itself.
double getWeight(int index)
Get the weight of the component image at index.
afw::table::Key< std::string > warpingKernelName
ExposureCatalogT subsetContaining(lsst::geom::SpherePoint const &coord, bool includeValidPolygon=false) const
Return a shallow subset of the catalog with only those records that contain the given point...
A mapping between the keys of two Schemas, used to copy data between them.
#define CONST_PTR(...)
A shared pointer to a const object.
A base class for factory classes used to reconstruct objects from records.
std::shared_ptr< Table > getTable() const
Return the table associated with the catalog.
geom::Box2I getBBox(int index)
Get the bounding box (in component image Pixel coordinates) of the component image at index...
std::shared_ptr< Image< PixelT > > operator+(Image< PixelT > const &img, ImageSlice< PixelT > const &slc)
Overload operator+()
boost::shared_ptr< afw::detection::Psf::Image > doComputeKernelImage(geom::Point2D const &ccdXY, afw::image::Color const &color) const override
These virtual member functions are private, not protected, because we only want derived classes to im...
static PointKey addFields(Schema &schema, std::string const &name, std::string const &doc, std::string const &unit)
Add a pair of _x, _y fields to a Schema, and return a PointKey that points to them.
static Schema makeMinimalSchema()
Return a minimal schema for Exposure tables and records.
boost::shared_ptr< afw::detection::Psf > clone() const override
Polymorphic deep copy. Usually unnecessary, as Psfs are immutable.
Schema getSchema() const
Return the schema associated with the catalog's table.
CoaddPsf(afw::table::ExposureCatalog const &catalog, afw::geom::SkyWcs const &coaddWcs, std::string const &weightFieldName="weight", std::string const &warpingKernelName="lanczos3", int cacheSize=10000)
Main constructors for CoaddPsf.
Point< double, 2 > Point2D
int getComponentCount() const
Return the number of component Psfs in this CoaddPsf.
Factory(std::string const &name)
A base class for objects that can be persisted via afw::table::io Archive classes.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
boost::shared_ptr< afw::detection::Psf > resized(int width, int height) const override
Return a clone with specified kernel dimensions.
Reports attempts to access elements using an invalid key.
void push_back(Record const &r)
Add a copy of the given record to the end of the catalog.
std::string getPythonModule() const override
Return the fully-qualified Python module that should be imported to guarantee that its factory is reg...
A base class for image defects.
lsst::geom::Box2I getBBox(ImageOrigin origin=PARENT) const
iterator end()
Iterator access.
CoaddPsf is the Psf derived to be used for non-PSF-matched Coadd images.
Iterator class for CatalogT.
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
A description of a field in a table.
std::shared_ptr< afw::table::io::Persistable > readV0(InputArchive const &archive, CatalogVector const &catalogs) const
void scaledPlus(double const c, Image< PixelT > const &rhs)
Add Image c*rhs to lhs.
Reports errors in the logical structure of the program.
bool empty() const
Return true if the catalog has no records.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
afw::table::PointKey< double > averagePosition
std::shared_ptr< Image< PixelT > > operator-(Image< PixelT > const &img, ImageSlice< PixelT > const &slc)
Overload operator-()
afw::table::Key< double > weight
memId getId() const
Return the Citizen's ID.
std::shared_ptr< TransformPoint2ToPoint2 > makeWcsPairTransform(SkyWcs const &src, SkyWcs const &dst)
A Transform obtained by putting two SkyWcs objects "back to back".
afw::table::Key< int > coaddWcs
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
A vector of catalogs used by Persistable.
Base class for all records.
Base::const_iterator const_iterator
void include(Point2I const &point)
Expand this to ensure that this->contains(point).
afw::geom::SkyWcs getWcs(int index)
Get the Wcs of the component image at index.
geom::Box2I getOverallBBox(std::vector< boost::shared_ptr< afw::image::Image< double > >> const &imgVector)
Image< LhsPixelT > & operator-=(Image< LhsPixelT > &lhs, Image< RhsPixelT > const &rhs)
Subtract lhs from Image rhs (i.e. pixel-by-pixel subtraction) where types are different.
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
static ExposureCatalogT readFromArchive(io::InputArchive const &archive, BaseCatalog const &catalog)
Convenience input function for Persistables that contain an ExposureCatalog.
void clip(Box2I const &other) noexcept
Shrink this to ensure that other.contains(*this).
Custom catalog class for ExposureRecord/Table.
void writeToArchive(io::OutputArchiveHandle &handle, bool ignoreUnpersistable=true) const
Convenience output function for Persistables that contain an ExposureCatalog.
void addToImage(boost::shared_ptr< afw::image::Image< double > > image, std::vector< boost::shared_ptr< afw::image::Image< double > >> const &imgVector, std::vector< double > const &weightVector)
std::shared_ptr< Image > computeKernelImage(lsst::geom::Point2D position=makeNullPoint(), image::Color color=image::Color(), ImageOwnerEnum owner=COPY) const
Return an Image of the PSF, in a form suitable for convolution.
std::shared_ptr< RecordT > const get(size_type i) const
Return a pointer to the record at index i.
Reports invalid arguments.
geom::Box2I doComputeBBox(geom::Point2D const &position, afw::image::Color const &color) const override
These virtual member functions are private, not protected, because we only want derived classes to im...
Record class used to store exposure metadata.
size_type size() const
Return the number of elements in the catalog.
ItemVariant const * other
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
ExposureCatalogT< ExposureRecord > ExposureCatalog
Describe the colour of a source.
std::vector< SchemaItem< Flag > > * items
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...
iterator begin()
Iterator access.
A polymorphic base class for representing an image's Point Spread Function.
#define LSST_EXCEPT_ADD(e, m)
Add the current location and a message to an existing exception before rethrowing it...
An integer coordinate rectangle.
A class to represent a 2-dimensional array of pixels.
Reports when the result of an operation cannot be represented by the destination type.
afw::table::Schema schema
A Psf class that maps an arbitrary Psf through a coordinate transformation.
boost::shared_ptr< afw::detection::Psf const > getPsf(int index)
Get the Psf of the component image at index.
boost::shared_ptr< afw::geom::polygon::Polygon const > getValidPolygon(int index)
Get the validPolygon (in component image Pixel coordinates) of the component image at index...
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.