LSST Applications g00274db5b6+edbf708997,g00d0e8bbd7+edbf708997,g199a45376c+5137f08352,g1fd858c14a+1d4b6db739,g262e1987ae+f4d9505c4f,g29ae962dfc+7156fb1a53,g2cef7863aa+73c82f25e4,g35bb328faa+edbf708997,g3e17d7035e+5b3adc59f5,g3fd5ace14f+852fa6fbcb,g47891489e3+6dc8069a4c,g53246c7159+edbf708997,g64539dfbff+9f17e571f4,g67b6fd64d1+6dc8069a4c,g74acd417e5+ae494d68d9,g786e29fd12+af89c03590,g7ae74a0b1c+a25e60b391,g7aefaa3e3d+536efcc10a,g7cc15d900a+d121454f8d,g87389fa792+a4172ec7da,g89139ef638+6dc8069a4c,g8d7436a09f+28c28d8d6d,g8ea07a8fe4+db21c37724,g92c671f44c+9f17e571f4,g98df359435+b2e6376b13,g99af87f6a8+b0f4ad7b8d,gac66b60396+966efe6077,gb88ae4c679+7dec8f19df,gbaa8f7a6c5+38b34f4976,gbf99507273+edbf708997,gc24b5d6ed1+9f17e571f4,gca7fc764a6+6dc8069a4c,gcc769fe2a4+97d0256649,gd7ef33dd92+6dc8069a4c,gdab6d2f7ff+ae494d68d9,gdbb4c4dda9+9f17e571f4,ge410e46f29+6dc8069a4c,geaed405ab2+e194be0d2b,w.2025.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
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 372 of file KronPhotometry.cc.

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

397 {
398 _flagHandler.handleFailure(measRecord, error);
399}

◆ 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 461 of file KronPhotometry.cc.

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

574 {
575 geom::Point2D center = _centroidExtractor(measRecord, _flagHandler);
576 auto xytransform = afw::geom::makeWcsPairTransform(refWcs, *exposure.getWcs());
577 _applyForced(measRecord, exposure, center, refRecord,
578 linearizeTransform(*xytransform, refRecord.getCentroid())
579 );
580
581}
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:163
lsst::geom::AffineTransform linearizeTransform(TransformPoint2ToPoint2 const &original, lsst::geom::Point2D const &inPoint)
Approximate a Transform by its local linearization.

◆ 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: