38template std::shared_ptr<meas::algorithms::CoaddBoundedField>
55bool ptrEquals(T a, T b) {
76 _throwOnMissing(true),
79 _elements(elements) {}
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()
148 bboxMin(
afw::table::PointKey<int>::addFields(schema,
"bbox_min",
149 "lower-left corner of bounding box",
"pixel")),
150 bboxMax(
afw::table::PointKey<int>::addFields(schema,
"bbox_max",
151 "upper-right corner of bounding box",
"pixel")),
152 coaddWcs(schema.addField<int>(
"coaddWcs",
"archive ID of the coadd's WCS")),
153 throwOnMissing(schema.addField<
afw::table::Flag>(
154 "throwOnMissing",
"whether to throw an exception on missing data")),
155 default_(schema.addField<double>(
"default",
156 "default value to use when throwOnMissing is False")) {}
160class CoaddBoundedFieldPersistenceKeys2 {
162 afw::table::Schema schema;
163 afw::table::Key<int> field;
164 afw::table::Key<int> wcs;
165 afw::table::Key<int> validPolygon;
166 afw::table::Key<double> weight;
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")),
186 validPolygon(
schema.addField<
int>(
"validPolygon",
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)));
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.
#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.
BoundedField(BoundedField const &)=default
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.
CatalogIterator< typename Internal::const_iterator > const_iterator
A class used as a handle to a particular field in a table.
A FunctorKey used to get or set a lsst::geom::Point from an (x,y) pair of int or double Keys.
Defines the fields and offsets for a table.
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.
io::CatalogVector CatalogVector
io::InputArchive InputArchive
PersistableFactory(std::string const &name)
Constructor for the factory.
io::OutputArchiveHandle OutputArchiveHandle
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.
std::vector< Element > ElementVector
CoaddBoundedField(geom::Box2I const &bbox, std::shared_ptr< afw::geom::SkyWcs const > coaddWcs, ElementVector const &elements)
CoaddBoundedFieldElement Element
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.
CatalogT< BaseRecord > BaseCatalog
Point< double, 2 > Point2D
std::shared_ptr< afw::geom::SkyWcs const > wcs
std::shared_ptr< afw::math::BoundedField > field
std::shared_ptr< afw::geom::polygon::Polygon const > validPolygon
CoaddBoundedFieldElement(std::shared_ptr< afw::math::BoundedField > field_, std::shared_ptr< afw::geom::SkyWcs const > wcs_, std::shared_ptr< afw::geom::polygon::Polygon const > validPolygon_, double weight_=1.0)
bool operator==(CoaddBoundedFieldElement const &rhs) const
Elements are equal if all their components are equal.