LSST Applications g0265f82a02+c6dfa2ddaf,g1162b98a3f+ffe7eabc7e,g2079a07aa2+1b2e822518,g2bbee38e9b+c6dfa2ddaf,g337abbeb29+c6dfa2ddaf,g36da64cc00+ea84795170,g3ddfee87b4+955a963fd8,g50ff169b8f+2eb0e556e8,g52b1c1532d+90ebb246c7,g555ede804d+955a963fd8,g591dd9f2cf+bac198a2cb,g5ec818987f+420292cfeb,g858d7b2824+d6c9a0a3b8,g876c692160+aabc49a3c3,g8a8a8dda67+90ebb246c7,g8cdfe0ae6a+4fd9e222a8,g99cad8db69+e6cd765486,g9ddcbc5298+a1346535a5,ga1e77700b3+df8f93165b,ga8c6da7877+acd47f83f4,gae46bcf261+c6dfa2ddaf,gb0e22166c9+8634eb87fb,gb3f2274832+12c8382528,gba4ed39666+1ac82b564f,gbb8dafda3b+0574160a1f,gbeb006f7da+dea2fbb49f,gc28159a63d+c6dfa2ddaf,gc86a011abf+d6c9a0a3b8,gcf0d15dbbd+955a963fd8,gdaeeff99f8+1cafcb7cd4,gdc0c513512+d6c9a0a3b8,ge79ae78c31+c6dfa2ddaf,geb67518f79+ba1859f325,gee10cc3b42+90ebb246c7,gf1cff7945b+d6c9a0a3b8,w.2024.13
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Attributes | List of all members
lsst::meas::extensions::photometryKron::KronFluxAlgorithm Class Reference

A measurement algorithm that estimates flux using Kron photometry. More...

#include <photometryKron.h>

Inheritance diagram for lsst::meas::extensions::photometryKron::KronFluxAlgorithm:
lsst::meas::base::SimpleAlgorithm lsst::meas::base::SingleFrameAlgorithm lsst::meas::base::ForcedAlgorithm lsst::meas::base::BaseAlgorithm lsst::meas::base::BaseAlgorithm

Public Types

typedef KronFluxControl Control
 A typedef to the Control object for this algorithm, defined above.
 

Public Member Functions

 KronFluxAlgorithm (Control const &ctrl, std::string const &name, afw::table::Schema &schema, daf::base::PropertySet &metadata)
 A class that knows how to calculate fluxes using the KRON photometry algorithm.
 
virtual void measure (afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
 Called to measure a single child source in an image.
 
virtual void measureForced (afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure, afw::table::SourceRecord const &refRecord, afw::geom::SkyWcs const &refWcs) const
 Called to measure a single child source in an image.
 
virtual void fail (afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
 Handle an exception thrown by the current algorithm by setting flags in the given record.
 
void measureNForced (afw::table::SourceCatalog const &measCat, afw::image::Exposure< float > const &exposure, afw::table::SourceCatalog const &refRecord, afw::geom::SkyWcs const &refWcs) const override
 Called to simultaneously measure all children in a deblend family, in a single image.
 
virtual void measureN (afw::table::SourceCatalog const &measCat, afw::image::Exposure< float > const &exposure) const
 Called to simultaneously measure all children in a deblend family, in a single image.
 
std::string getLogName () const
 

Static Public Member Functions

static meas::base::FlagDefinitionList const & getFlagDefinitions ()
 

Static Public Attributes

static meas::base::FlagDefinition const FAILURE = flagDefinitions.addFailureFlag( "general failure flag, set if anything went wrong")
 
static meas::base::FlagDefinition const EDGE = flagDefinitions.add("flag_edge", "bad measurement due to image edge")
 
static meas::base::FlagDefinition const BAD_SHAPE_NO_PSF = flagDefinitions.add("flag_bad_shape_no_psf", "bad shape and no PSF")
 
static meas::base::FlagDefinition const NO_MINIMUM_RADIUS = flagDefinitions.add("flag_no_minimum_radius", "minimum radius could not enforced: no minimum value or PSF")
 
static meas::base::FlagDefinition const NO_FALLBACK_RADIUS = flagDefinitions.add("flag_no_fallback_radius", "no minimum radius and no PSF provided")
 
static meas::base::FlagDefinition const BAD_RADIUS = flagDefinitions.add("flag_bad_radius", "bad Kron radius")
 
static meas::base::FlagDefinition const USED_MINIMUM_RADIUS = flagDefinitions.add("flag_used_minimum_radius", "used the minimum radius for the Kron aperture")
 
static meas::base::FlagDefinition const USED_PSF_RADIUS = flagDefinitions.add("flag_used_psf_radius", "used the PSF Kron radius for the Kron aperture")
 
static meas::base::FlagDefinition const SMALL_RADIUS = flagDefinitions.add("flag_small_radius", "measured Kron radius was smaller than that of the PSF")
 
static meas::base::FlagDefinition const BAD_SHAPE = flagDefinitions.add("flag_bad_shape", "shape for measuring Kron radius is bad; used PSF shape")
 

Protected Attributes

std::string _logName
 

Detailed Description

A measurement algorithm that estimates flux using Kron photometry.

Definition at line 90 of file photometryKron.h.

Member Typedef Documentation

◆ Control

A typedef to the Control object for this algorithm, defined above.

The control object contains the configuration parameters for this algorithm.

Definition at line 108 of file photometryKron.h.

Constructor & Destructor Documentation

◆ KronFluxAlgorithm()

lsst::meas::extensions::photometryKron::KronFluxAlgorithm::KronFluxAlgorithm ( Control const & ctrl,
std::string const & name,
afw::table::Schema & schema,
daf::base::PropertySet & metadata )

A class that knows how to calculate fluxes using the KRON photometry algorithm.

/

Definition at line 371 of file KronPhotometry.cc.

376 : _name(name),
377 _ctrl(ctrl),
378 _fluxResultKey(
379 meas::base::FluxResultKey::addFields(schema, name, "flux from Kron Flux algorithm")
380 ),
381 _radiusKey(schema.addField<float>(name + "_radius", "Kron radius (sqrt(a*b))")),
382 _radiusForRadiusKey(schema.addField<float>(name + "_radius_for_radius",
383 "radius used to estimate <radius> (sqrt(a*b))")),
384 _psfRadiusKey(schema.addField<float>(name + "_psf_radius", "Radius of PSF")),
385 _centroidExtractor(schema, name, true)
386{
387 _flagHandler = meas::base::FlagHandler::addFields(schema, name, getFlagDefinitions());
388 auto metadataName = name + "_nRadiusForflux";
389 boost::to_upper(metadataName);
390 metadata.add(metadataName, ctrl.nRadiusForFlux);
391}
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 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...
static meas::base::FlagDefinitionList const & getFlagDefinitions()

Member Function Documentation

◆ fail()

void lsst::meas::extensions::photometryKron::KronFluxAlgorithm::fail ( afw::table::SourceRecord & measRecord,
meas::base::MeasurementError * error = NULL ) const
virtual

Handle an exception thrown by the current algorithm by setting flags in the given record.

fail() is called by the measurement framework when an exception is allowed to propagate out of one the algorithm's measure() methods. It should generally set both a general failure flag for the algorithm as well as a specific flag indicating the error condition, if possible. To aid in this, if the exception was an instance of MeasurementError, it will be passed in, carrying information about what flag to set.

An algorithm can also to chose to set flags within its own measure() methods, and then just return, rather than throw an exception. However, fail() should be implemented even when all known failure modes do not throw exceptions, to ensure that unexpected exceptions thrown in lower-level code are properly handled.

Implements lsst::meas::base::BaseAlgorithm.

Definition at line 393 of file KronPhotometry.cc.

396 {
397 _flagHandler.handleFailure(measRecord, error);
398}
void handleFailure(afw::table::BaseRecord &record, MeasurementError const *error=nullptr) const
Handle an expected or unexpected Exception thrown by a measurement algorithm.

◆ getFlagDefinitions()

base::FlagDefinitionList const & lsst::meas::extensions::photometryKron::KronFluxAlgorithm::getFlagDefinitions ( )
static

Definition at line 66 of file KronPhotometry.cc.

66 {
67 return flagDefinitions;
68}

◆ getLogName()

std::string lsst::meas::base::BaseAlgorithm::getLogName ( ) const
inlineinherited

Definition at line 66 of file Algorithm.h.

66{ return _logName; }

◆ measure()

void lsst::meas::extensions::photometryKron::KronFluxAlgorithm::measure ( afw::table::SourceRecord & measRecord,
afw::image::Exposure< float > const & exposure ) const
virtual

Called to measure a single child source in an image.

Before this method is called, all neighbors will be replaced with noise, using the outputs of the deblender. Outputs should be saved in the given SourceRecord, which can also be used to obtain centroid (see SafeCentroidExtractor) and shape (see SafeShapeExtractor) information.

Implements lsst::meas::base::SingleFrameAlgorithm.

Definition at line 460 of file KronPhotometry.cc.

463 {
464 geom::Point2D center = _centroidExtractor(source, _flagHandler);
465
466 // Did we hit a condition that fundamentally prevented measuring the Kron flux?
467 // Such conditions include hitting the edge of the image and bad input shape, but not low signal-to-noise.
468 bool bad = false;
469
470 afw::image::MaskedImage<float> const& mimage = exposure.getMaskedImage();
471
472 double R_K_psf = -1;
473 if (exposure.getPsf()) {
474 R_K_psf = calculatePsfKronRadius(exposure.getPsf(), center, _ctrl.smoothingSigma);
475 }
476
477 //
478 // Get the shape of the desired aperture
479 //
480 afw::geom::ellipses::Axes axes;
481 if (!source.getShapeFlag()) {
482 axes = source.getShape();
483 } else {
484 bad = true;
485 if (!exposure.getPsf()) {
486 throw LSST_EXCEPT(
487 meas::base::MeasurementError,
490 );
491 }
492 axes = exposure.getPsf()->computeShape(exposure.getPsf()->getAveragePosition());
493 _flagHandler.setValue(source, BAD_SHAPE.number, true);
494 }
495 if (_ctrl.useFootprintRadius) {
496 afw::geom::ellipses::Axes footprintAxes(source.getFootprint()->getShape());
497 // if the Footprint's a disk of radius R we want footRadius == R.
498 // As <r^2> = R^2/2 for a disk, we need to scale up by sqrt(2)
499 footprintAxes.scale(::sqrt(2));
500
501 double radius0 = axes.getDeterminantRadius();
502 double const footRadius = footprintAxes.getDeterminantRadius();
503
504 if (footRadius > radius0*_ctrl.nSigmaForRadius) {
505 radius0 = footRadius/_ctrl.nSigmaForRadius; // we'll scale it up by nSigmaForRadius
506 axes.scale(radius0/axes.getDeterminantRadius());
507 }
508 }
509
511 if (_ctrl.fixed) {
512 aperture.reset(new KronAperture(source));
513 } else {
514 try {
515 aperture = KronAperture::determineRadius(mimage, axes, center, _ctrl);
516 } catch (pex::exceptions::OutOfRangeError& e) {
517 // We hit the edge of the image: no reasonable fallback or recovery possible
518 throw LSST_EXCEPT(
519 meas::base::MeasurementError,
520 EDGE.doc,
522 );
523 } catch (BadKronException& e) {
524 // Not setting bad=true because we only failed due to low S/N
525 aperture = _fallbackRadius(source, R_K_psf, e);
526 } catch(pex::exceptions::Exception& e) {
527 bad = true; // There's something fundamental keeping us from measuring the Kron aperture
528 aperture = _fallbackRadius(source, R_K_psf, e);
529 }
530 }
531
532 /*
533 * Estimate the minimum acceptable Kron radius as the Kron radius of the PSF or the
534 * provided minimum radius
535 */
536
537 // Enforce constraints on minimum radius
538 double rad = aperture->getAxes().getDeterminantRadius();
539 if (_ctrl.enforceMinimumRadius) {
540 double newRadius = rad;
541 if (_ctrl.minimumRadius > 0.0) {
542 if (rad < _ctrl.minimumRadius) {
543 newRadius = _ctrl.minimumRadius;
544 _flagHandler.setValue(source, USED_MINIMUM_RADIUS.number, true);
545 }
546 } else if (!exposure.getPsf()) {
547 throw LSST_EXCEPT(
548 meas::base::MeasurementError,
551 );
552 } else if (rad < R_K_psf) {
553 newRadius = R_K_psf;
554 _flagHandler.setValue(source, USED_PSF_RADIUS.number, true);
555 }
556 if (newRadius != rad) {
557 aperture->getAxes().scale(newRadius/rad);
558 _flagHandler.setValue(source, SMALL_RADIUS.number, true); // guilty after all
559 }
560 }
561
562 _applyAperture(source, exposure, *aperture);
563 source.set(_radiusForRadiusKey, aperture->getRadiusForRadius());
564 source.set(_psfRadiusKey, R_K_psf);
565 if (bad) _flagHandler.setValue(source, FAILURE.number, true);
566}
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
void setValue(afw::table::BaseRecord &record, std::size_t i, bool value) const
Set the flag field corresponding to the given flag index.
static std::shared_ptr< KronAperture > determineRadius(ImageT const &image, afw::geom::ellipses::Axes axes, geom::Point2D const &center, KronFluxControl const &ctrl)
Determine the Kron Aperture from an image.
static meas::base::FlagDefinition const USED_MINIMUM_RADIUS
static meas::base::FlagDefinition const FAILURE
static meas::base::FlagDefinition const SMALL_RADIUS
static meas::base::FlagDefinition const BAD_SHAPE
static meas::base::FlagDefinition const EDGE
static meas::base::FlagDefinition const NO_MINIMUM_RADIUS
static meas::base::FlagDefinition const BAD_SHAPE_NO_PSF
static meas::base::FlagDefinition const USED_PSF_RADIUS
double smoothingSigma
"Smooth image with N(0, smoothingSigma^2) Gaussian while estimating R_K" ;
bool fixed
"if true, use existing shape and centroid measurements instead of fitting" ;
bool useFootprintRadius
"Use the Footprint size as part of initial estimate of Kron radius" ;
double minimumRadius
"Minimum Kron radius (if == 0.0 use PSF's Kron radius) if enforceMinimumRadius. " "Also functions as ...
bool enforceMinimumRadius
"If true check that the Kron radius exceeds some minimum" ;
double nSigmaForRadius
"Multiplier of rms size for aperture used to initially estimate the Kron radius" ;
const char * source()
Source function that allows astChannel to source from a Stream.
Definition Stream.h:224
double calculatePsfKronRadius(std::shared_ptr< afw::detection::Psf const > const &psf, geom::Point2D const &center, double smoothingSigma=0.0)
T reset(T... args)

◆ measureForced()

void lsst::meas::extensions::photometryKron::KronFluxAlgorithm::measureForced ( afw::table::SourceRecord & measRecord,
afw::image::Exposure< float > const & exposure,
afw::table::SourceRecord const & refRecord,
afw::geom::SkyWcs const & refWcs ) const
virtual

Called to measure a single child source in an image.

Before this method is called, all neighbors will be replaced with noise, using the outputs of the deblender. Outputs should be saved in the given SourceRecord, which can also be used to obtain centroid (see SafeCentroidExtractor) and shape (see SafeShapeExtractor) information.

Reimplemented from lsst::meas::base::SimpleAlgorithm.

Definition at line 568 of file KronPhotometry.cc.

573 {
574 geom::Point2D center = _centroidExtractor(measRecord, _flagHandler);
575 auto xytransform = afw::geom::makeWcsPairTransform(refWcs, *exposure.getWcs());
576 _applyForced(measRecord, exposure, center, refRecord,
577 linearizeTransform(*xytransform, refRecord.getCentroid())
578 );
579
580}
std::shared_ptr< TransformPoint2ToPoint2 > makeWcsPairTransform(SkyWcs const &src, SkyWcs const &dst)
A Transform obtained by putting two SkyWcs objects "back to back".
Definition SkyWcs.cc:146

◆ measureN()

void lsst::meas::base::SingleFrameAlgorithm::measureN ( afw::table::SourceCatalog const & measCat,
afw::image::Exposure< float > const & exposure ) const
virtualinherited

Called to simultaneously measure all children in a deblend family, in a single image.

Outputs should be saved in the given SourceCatalog, which can also be used to obtain centroid (see SafeCentroidExtractor) and shape (see SafeShapeExtractor) information.

The default implementation simply throws an exception, indicating that simultaneous measurement is not supported.

Definition at line 31 of file Algorithm.cc.

32 {
33 throw LSST_EXCEPT(pex::exceptions::LogicError, "measureN not implemented for this algorithm");
34}

◆ measureNForced()

void lsst::meas::base::SimpleAlgorithm::measureNForced ( afw::table::SourceCatalog const & measCat,
afw::image::Exposure< float > const & exposure,
afw::table::SourceCatalog const & refRecord,
afw::geom::SkyWcs const & refWcs ) const
inlineoverridevirtualinherited

Called to simultaneously measure all children in a deblend family, in a single image.

Outputs should be saved in the given SourceCatalog, which can also be used to obtain centroid (see SafeCentroidExtractor) and shape (see SafeShapeExtractor) information.

The default implementation simply throws an exception, indicating that simultaneous measurement is not supported.

Reimplemented from lsst::meas::base::ForcedAlgorithm.

Definition at line 179 of file Algorithm.h.

182 {
183 measureN(measCat, exposure);
184 }
virtual void measureN(afw::table::SourceCatalog const &measCat, afw::image::Exposure< float > const &exposure) const
Called to simultaneously measure all children in a deblend family, in a single image.
Definition Algorithm.cc:31

Member Data Documentation

◆ _logName

std::string lsst::meas::base::BaseAlgorithm::_logName
protectedinherited

Definition at line 69 of file Algorithm.h.

◆ BAD_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::BAD_RADIUS = flagDefinitions.add("flag_bad_radius", "bad Kron radius")
static

Definition at line 100 of file photometryKron.h.

◆ BAD_SHAPE

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::BAD_SHAPE = flagDefinitions.add("flag_bad_shape", "shape for measuring Kron radius is bad; used PSF shape")
static

Definition at line 104 of file photometryKron.h.

◆ BAD_SHAPE_NO_PSF

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::BAD_SHAPE_NO_PSF = flagDefinitions.add("flag_bad_shape_no_psf", "bad shape and no PSF")
static

Definition at line 97 of file photometryKron.h.

◆ EDGE

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::EDGE = flagDefinitions.add("flag_edge", "bad measurement due to image edge")
static

Definition at line 96 of file photometryKron.h.

◆ FAILURE

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::FAILURE = flagDefinitions.addFailureFlag( "general failure flag, set if anything went wrong")
static

Definition at line 95 of file photometryKron.h.

◆ NO_FALLBACK_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::NO_FALLBACK_RADIUS = flagDefinitions.add("flag_no_fallback_radius", "no minimum radius and no PSF provided")
static

Definition at line 99 of file photometryKron.h.

◆ NO_MINIMUM_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::NO_MINIMUM_RADIUS = flagDefinitions.add("flag_no_minimum_radius", "minimum radius could not enforced: no minimum value or PSF")
static

Definition at line 98 of file photometryKron.h.

◆ SMALL_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::SMALL_RADIUS = flagDefinitions.add("flag_small_radius", "measured Kron radius was smaller than that of the PSF")
static

Definition at line 103 of file photometryKron.h.

◆ USED_MINIMUM_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::USED_MINIMUM_RADIUS = flagDefinitions.add("flag_used_minimum_radius", "used the minimum radius for the Kron aperture")
static

Definition at line 101 of file photometryKron.h.

◆ USED_PSF_RADIUS

base::FlagDefinition const lsst::meas::extensions::photometryKron::KronFluxAlgorithm::USED_PSF_RADIUS = flagDefinitions.add("flag_used_psf_radius", "used the PSF Kron radius for the Kron aperture")
static

Definition at line 102 of file photometryKron.h.


The documentation for this class was generated from the following files: