55bool ptrEquals(T a, T
b) {
69 return ptrEquals(field, rhs.
field) && ptrEquals(wcs, rhs.
wcs) &&
75 :
afw::math::BoundedField(
bbox),
76 _throwOnMissing(true),
79 _elements(elements) {}
83 :
afw::math::BoundedField(
bbox),
84 _throwOnMissing(false),
87 _elements(elements) {}
90 auto coord = _coaddWcs->pixelToSky(position);
93 for (ElementVector::const_iterator i = _elements.
begin(); i != _elements.
end(); ++i) {
94 geom::Point2D transformedPosition = i->wcs->skyToPixel(coord);
95 bool inValidArea = i->validPolygon ? i->validPolygon->contains(transformedPosition) :
true;
97 sum += i->weight * i->field->evaluate(transformedPosition);
102 if (_throwOnMissing) {
104 (boost::format(
"No constituent fields to evaluate at point %f, %f") %
105 position.getX() % position.getY())
123class CoaddBoundedFieldPersistenceKeys1 {
132 static CoaddBoundedFieldPersistenceKeys1
const& get() {
133 static CoaddBoundedFieldPersistenceKeys1
const instance;
138 CoaddBoundedFieldPersistenceKeys1(
const CoaddBoundedFieldPersistenceKeys1&) =
delete;
139 CoaddBoundedFieldPersistenceKeys1& operator=(
const CoaddBoundedFieldPersistenceKeys1&) =
delete;
142 CoaddBoundedFieldPersistenceKeys1(CoaddBoundedFieldPersistenceKeys1&&) =
delete;
143 CoaddBoundedFieldPersistenceKeys1& operator=(CoaddBoundedFieldPersistenceKeys1&&) =
delete;
146 CoaddBoundedFieldPersistenceKeys1()
149 "lower-left corner of bounding box",
"pixel")),
151 "upper-right corner of bounding box",
"pixel")),
154 "throwOnMissing",
"whether to throw an exception on missing data")),
156 "default value to use when throwOnMissing is False")) {}
160class CoaddBoundedFieldPersistenceKeys2 {
162 afw::table::Schema
schema;
168 static CoaddBoundedFieldPersistenceKeys2
const& get() {
169 static CoaddBoundedFieldPersistenceKeys2
const instance;
174 CoaddBoundedFieldPersistenceKeys2(
const CoaddBoundedFieldPersistenceKeys2&) =
delete;
175 CoaddBoundedFieldPersistenceKeys2& operator=(
const CoaddBoundedFieldPersistenceKeys2&) =
delete;
178 CoaddBoundedFieldPersistenceKeys2(CoaddBoundedFieldPersistenceKeys2&&) =
delete;
179 CoaddBoundedFieldPersistenceKeys2& operator=(CoaddBoundedFieldPersistenceKeys2&&) =
delete;
182 CoaddBoundedFieldPersistenceKeys2()
184 field(
schema.addField<
int>(
"field",
"archive ID of the BoundedField to be coadded")),
185 wcs(
schema.addField<
int>(
"wcs",
"archive ID of the Wcs associated with this element")),
187 "archive ID of the Polygon associated with this element")),
188 weight(
schema.addField<double>(
"weight",
"weight value for this element")) {}
197 CoaddBoundedFieldPersistenceKeys1
const& keys1 = CoaddBoundedFieldPersistenceKeys1::get();
198 CoaddBoundedFieldPersistenceKeys2
const& keys2 = CoaddBoundedFieldPersistenceKeys2::get();
204 elements.
reserve(catalogs.back().size());
210 i->get(keys2.weight)));
212 return std::make_shared<CoaddBoundedField>(
215 record1.
get(keys1.default_));
223std::string getCoaddBoundedFieldPersistenceName() {
return "CoaddBoundedField"; }
225CoaddBoundedField::Factory registration(getCoaddBoundedFieldPersistenceName());
234 CoaddBoundedFieldPersistenceKeys1
const& keys1 = CoaddBoundedFieldPersistenceKeys1::get();
235 CoaddBoundedFieldPersistenceKeys2
const& keys2 = CoaddBoundedFieldPersistenceKeys2::get();
238 record1->set(keys1.bboxMin,
getBBox().getMin());
239 record1->set(keys1.bboxMax,
getBBox().getMax());
240 record1->set(keys1.coaddWcs, handle.
put(_coaddWcs));
241 record1->set(keys1.default_, _default);
244 for (ElementVector::const_iterator i = _elements.
begin(); i != _elements.
end(); ++i) {
246 record2->set(keys2.field, handle.
put(i->field));
247 record2->set(keys2.wcs, handle.
put(i->wcs));
248 record2->set(keys2.validPolygon, handle.
put(i->validPolygon));
249 record2->set(keys2.weight, i->weight);
260 if (!rhsCasted)
return false;
262 return (
getBBox() == rhsCasted->getBBox()) && (_default == rhsCasted->_default) &&
263 ptrEquals(_coaddWcs, rhsCasted->_coaddWcs) && (_elements == rhsCasted->_elements);
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
table::Key< table::Array< std::uint8_t > > wcs
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
An abstract base class for 2-d functions defined on an integer bounding boxes.
lsst::geom::Box2I getBBox() const
Return the bounding box that defines the region where the field is valid.
Tag types used to declare specialized field types.
Base class for all records.
Field< T >::Value get(Key< T > const &key) const
Return the value of a field for the given key.
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
A vector of catalogs used by Persistable.
An object passed to Persistable::write to allow it to persist itself.
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
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...
static std::shared_ptr< T > dynamicCast(std::shared_ptr< Persistable > const &ptr)
Dynamically cast a shared_ptr.
A base class for factory classes used to reconstruct objects from records.
A floating-point coordinate rectangle geometry.
bool contains(Point2D const &point) const noexcept
Return true if the box contains the point.
An integer coordinate rectangle.
Factory(std::string const &name)
virtual std::shared_ptr< afw::table::io::Persistable > read(InputArchive const &archive, CatalogVector const &catalogs) const
Construct a new object from the given InputArchive and vector of catalogs.
CoaddBoundedField(geom::Box2I const &bbox, std::shared_ptr< afw::geom::SkyWcs const > coaddWcs, ElementVector const &elements)
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
std::shared_ptr< afw::math::BoundedField > operator*(double const scale) const override
Return a scaled BoundedField.
std::string getPythonModule() const override
Return the fully-qualified Python module that should be imported to guarantee that its factory is reg...
double evaluate(geom::Point2D const &position) const override
Evaluate the field at the given point.
bool operator==(BoundedField const &rhs) const override
BoundedFields (of the same sublcass) are equal if their bounding boxes and parameters are equal.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
Reports arguments outside the domain of an operation.
Reports attempts to access elements using an invalid key.
afw::table::Key< double > weight
afw::table::PointKey< int > bboxMax
afw::table::Key< afw::table::Flag > throwOnMissing
afw::table::Key< int > coaddWcs
afw::table::Key< double > default_
afw::table::PointKey< int > bboxMin
Struct used to hold one Exposure's data in a CoaddBoundedField.
std::shared_ptr< afw::geom::SkyWcs const > wcs
std::shared_ptr< afw::math::BoundedField > field
std::shared_ptr< afw::geom::polygon::Polygon const > validPolygon