26 #include "boost/algorithm/string.hpp" 28 #include "ndarray/eigen.h" 40 FlagDefinitionList flagDefinitions;
45 flagDefinitions.add(
"flag_apertureTruncated",
"aperture did not fit within measurement image");
47 "flag_sincCoeffsTruncated",
"full sinc coefficient image did not fit within measurement image");
53 static std::array<double, 10> defaultRadii = {{3.0, 4.5, 6.0, 9.0, 12.0, 17.0, 25.0, 35.0, 50.0, 70.0}};
59 return boost::replace_all_copy(prefix,
".",
"_");
75 : _ctrl(ctrl), _centroidExtractor(schema, name) {
79 boost::to_upper(upperName);
80 metadata.
add(upperName +
"_RADII", ctrl.
radii[i]);
82 std::string doc = (boost::format(
"instFlux within %f-pixel aperture") % ctrl.
radii[i]).str();
92 _keys[i].flags.handleFailure(measRecord, error);
98 record.
set(_keys[index].instFluxKey, result);
114 template <
typename T>
124 if (!bbox.
contains(cImage->getBBox())) {
129 result.
setFlag(ApertureFluxAlgorithm::SINC_COEFFS_TRUNCATED.number);
135 result.
setFlag(ApertureFluxAlgorithm::APERTURE_TRUNCATED.number);
136 result.
setFlag(ApertureFluxAlgorithm::FAILURE.number);
138 cImage = std::make_shared<afw::image::Image<T> >(*cImage, overlap);
145 template <
typename T>
153 (ndarray::asEigenArray(subImage.getArray()) * ndarray::asEigenArray(cImage->getArray())).sum();
157 template <
typename T>
165 result.instFlux = (ndarray::asEigenArray(subImage.getImage()->getArray()) *
166 ndarray::asEigenArray(cImage->getArray()))
169 std::sqrt((ndarray::asEigenArray(subImage.getVariance()->getArray()).
template cast<T>() *
170 ndarray::asEigenArray(cImage->getArray()).square())
175 template <
typename T>
187 spanIter != spanEnd; ++spanIter) {
189 image.
x_at(spanIter->getBeginX() - image.
getX0(), spanIter->getY() - image.
getY0());
195 template <
typename T>
209 spanIter != spanEnd; ++spanIter) {
211 spanIter->getBeginX() - image.
getX0(), spanIter->getY() - image.
getY0());
213 spanIter->getBeginX() - image.
getX0(), spanIter->getY() - image.
getY0());
222 template <
typename T>
231 template <
typename T>
239 #define INSTANTIATE(T) \ 240 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeFlux( \ 241 afw::image::Image<T> const &, afw::geom::ellipses::Ellipse const &, Control const &); \ 242 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeFlux( \ 243 afw::image::MaskedImage<T> const &, afw::geom::ellipses::Ellipse const &, Control const &); \ 244 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeSincFlux( \ 245 afw::image::Image<T> const &, afw::geom::ellipses::Ellipse const &, Control const &); \ 246 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeSincFlux( \ 247 afw::image::MaskedImage<T> const &, afw::geom::ellipses::Ellipse const &, Control const &); \ 248 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeNaiveFlux( \ 249 afw::image::Image<T> const &, afw::geom::ellipses::Ellipse const &, Control const &); \ 250 template ApertureFluxAlgorithm::Result ApertureFluxAlgorithm::computeNaiveFlux( \ 251 afw::image::MaskedImage<T> const &, afw::geom::ellipses::Ellipse const &, Control const &) 263 flag == ApertureFluxAlgorithm::SINC_COEFFS_TRUNCATED) {
268 .
find<afw::table::Flag>(
269 (boost::format(
"%s_%s") %
291 for (; inSrc != inputCatalog.
end() && outSrc != outputCatalog.
end(); ++inSrc, ++outSrc) {
293 FluxResult instFluxResult = instFluxKeys[i].get(*inSrc);
std::size_t size() const
return the current size (number of defined elements) of the collection
VariancePtr getVariance() const
lsst::geom::Point2D const & getCenter() const
lsst::geom::Box2I const & getBBox() const
static boost::shared_ptr< CoeffT const > get(afw::geom::ellipses::Axes const &outerEllipse, float const innerRadiusFactor=0.0)
Get the coefficients for an aperture.
virtual void fail(afw::table::SourceRecord &measRecord, MeasurementError *error=nullptr) const
Handle an exception thrown by the current algorithm by setting flags in the given record...
bool getFlag(unsigned int index) const
Return the flag value associated with the given bit.
void setFlag(unsigned int index, bool value=true)
Set the flag value associated with the given bit.
Schema const getInputSchema() const
static FlagDefinitionList const & getFlagDefinitions()
Simple class used to define and document flags The name and doc constitute the identity of the FlagDe...
_view_t::x_iterator x_iterator
double instFluxToMagnitude(double instFlux, lsst::geom::Point< double, 2 > const &point) const
BaseCore const & getCore() const
ApertureFluxAlgorithm(Control const &ctrl, std::string const &name, afw::table::Schema &schema, daf::base::PropertySet &metadata)
Construct the algorithm and add its fields to the given Schema.
void copyResultToRecord(Result const &result, afw::table::SourceRecord &record, int index) const
meas::base::FluxErrElement instFluxErr
Standard deviation of instFlux in DN.
Exception to be thrown when a measurement algorithm experiences a known failure mode.
static FluxResultKey addFields(afw::table::Schema &schema, std::string const &name, std::string const &doc)
Add a pair of _instFlux, _instFluxErr fields to a Schema, and return a FluxResultKey that points to t...
ImagePtr getImage() const
Configuration object for multiple-aperture flux algorithms.
std::vector< Span >::const_iterator Iterator
SchemaItem< T > find(std::string const &name) const
static FlagDefinition const FAILURE
static FlagDefinition const APERTURE_TRUNCATED
lsst::geom::Box2I getBBox(ImageOrigin origin=PARENT) const
static Result computeFlux(afw::image::Image< T > const &image, afw::geom::ellipses::Ellipse const &ellipse, Control const &ctrl=Control())
Compute the instFlux (and optionally, uncertanties) within an aperture using the algorithm determined...
double maxSincRadius
"Maximum radius (in pixels) for which the sinc algorithm should be used instead of the " "faster naiv...
static std::string makeFieldPrefix(std::string const &name, double radius)
Construct an appropriate prefix for table fields.
static FlagDefinition const SINC_COEFFS_TRUNCATED
lsst::geom::Box2D computeBBox() const
static Result computeNaiveFlux(afw::image::Image< T > const &image, afw::geom::ellipses::Ellipse const &ellipse, Control const &ctrl=Control())
Compute the instFlux (and optionally, uncertanties) within an aperture using naive photometry...
Schema & editOutputSchema()
A FunctorKey for FluxResult.
std::unique_ptr< SchemaItem< U > > result
static FlagHandler addFields(afw::table::Schema &schema, std::string const &prefix, FlagDefinitionList const &flagDefs, FlagDefinitionList const &exclDefs=FlagDefinitionList::getEmptyList())
Add Flag fields to a schema, creating a FlagHandler object to manage them.
static MagResultKey addFields(afw::table::Schema &schema, std::string const &name)
Add a pair of _mag, _magErr fields to a Schema, and return a MagResultKey that points to them...
bool contains(Box2I const &other) const noexcept
std::shared_ptr< ImageT > offsetImage(ImageT const &image, float dx, float dy, std::string const &algorithmName="lanczos5", unsigned int buffer=0)
Base::const_iterator const_iterator
void clip(Box2I const &other) noexcept
static Result computeSincFlux(afw::image::Image< T > const &image, afw::geom::ellipses::Ellipse const &ellipse, Control const &ctrl=Control())
Compute the instFlux (and optionally, uncertanties) within an aperture using Sinc photometry...
x_iterator x_at(int x, int y) const
void set(Key< T > const &key, U const &value)
meas::base::Flux instFlux
Measured instFlux in DN.
Key< T > addMapping(Key< T > const &inputKey, bool doReplace=false)
std::string shiftKernel
"Warping kernel used to shift Sinc photometry coefficients to different center positions" ; ...
std::vector< double > radii
"Radius (in pixels) of apertures." ;
vector-type utility class to build a collection of FlagDefinitions
void add(std::string const &name, T const &value)
lsst::geom::Box2I getBBox(ImageOrigin const origin=PARENT) const
A reusable result struct for instFlux measurements.
CatalogIterator< typename Internal::iterator > iterator
A Result struct for running an aperture flux algorithm with a single radius.