LSSTApplications  19.0.0-10-g920eed2,19.0.0-11-g48a0200+2,19.0.0-18-gfc4e62b+11,19.0.0-2-g3b2f90d+2,19.0.0-2-gd671419+5,19.0.0-20-g5a5a17ab+9,19.0.0-21-g2644856+11,19.0.0-22-gc5dc5b1+6,19.0.0-23-gdc29a50+3,19.0.0-24-g923e380+11,19.0.0-25-g6c8df7140,19.0.0-28-g9b887e2,19.0.0-3-g2b32d65+5,19.0.0-3-g8227491+10,19.0.0-3-g9c54d0d+10,19.0.0-3-gca68e65+6,19.0.0-3-gcfc5f51+5,19.0.0-3-ge110943+9,19.0.0-3-ge74d124,19.0.0-3-gfe04aa6+11,19.0.0-4-g06f5963+5,19.0.0-4-g3d16501+11,19.0.0-4-g4a9c019+5,19.0.0-4-g5a8b323,19.0.0-4-g66397f0+1,19.0.0-4-g8278b9b+1,19.0.0-4-g8557e14,19.0.0-4-g8964aba+11,19.0.0-4-ge404a01+10,19.0.0-5-g40f3a5a,19.0.0-5-g4db63b3,19.0.0-5-gfb03ce7+11,19.0.0-6-gbaebbfb+10,19.0.0-60-gafafd468+11,19.0.0-67-g3ab1e6e,19.0.0-7-g039c0b5+9,19.0.0-7-gbea9075+4,19.0.0-7-gc567de5+11,19.0.0-8-g3a3ce09+6,19.0.0-9-g463f923+10,w.2020.21
LSSTDataManagementBasePackage
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Attributes | List of all members
lsst::meas::base::PsfFluxAlgorithm Class Reference

A measurement algorithm that estimates instFlux using a linear least-squares fit with the Psf model. More...

#include <PsfFlux.h>

Inheritance diagram for lsst::meas::base::PsfFluxAlgorithm:
lsst::meas::base::SimpleAlgorithm lsst::meas::base::SingleFrameAlgorithm lsst::meas::base::ForcedAlgorithm lsst::meas::base::BaseAlgorithm lsst::meas::base::BaseAlgorithm

Public Types

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

Public Member Functions

 PsfFluxAlgorithm (Control const &ctrl, std::string const &name, afw::table::Schema &schema, std::string const &logName="")
 
virtual void measure (afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
 Called to measure a single child source in an image. More...
 
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. More...
 
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. More...
 
virtual void measureNForced (afw::table::SourceCatalog const &measCat, afw::image::Exposure< float > const &exposure, afw::table::SourceCatalog const &refRecord, afw::geom::SkyWcs const &refWcs) const
 Called to simultaneously measure all children in a deblend family, in a single image. More...
 
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. More...
 
std::string getLogName () const
 

Static Public Member Functions

static FlagDefinitionList const & getFlagDefinitions ()
 

Static Public Attributes

static FlagDefinition const FAILURE = flagDefinitions.addFailureFlag()
 
static FlagDefinition const NO_GOOD_PIXELS
 
static FlagDefinition const EDGE
 

Protected Attributes

std::string _logName
 

Detailed Description

A measurement algorithm that estimates instFlux using a linear least-squares fit with the Psf model.

The PsfFlux algorithm is extremely simple: we do a least-squares fit of the Psf model (evaluated at a given position) to the data. For point sources, this provides the optimal instFlux measurement in the limit where the Psf model is correct. We do not use per-pixel weights in the fit, as this results in bright stars being fit with a different effective profile than faint stairs.

Definition at line 69 of file PsfFlux.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 79 of file PsfFlux.h.

Constructor & Destructor Documentation

◆ PsfFluxAlgorithm()

lsst::meas::base::PsfFluxAlgorithm::PsfFluxAlgorithm ( Control const &  ctrl,
std::string const &  name,
afw::table::Schema schema,
std::string const &  logName = "" 
)

Definition at line 53 of file PsfFlux.cc.

55  : _ctrl(ctrl),
56  _instFluxResultKey(FluxResultKey::addFields(
57  schema, name, "instFlux derived from linear least-squares fit of PSF model")),
58  _areaKey(schema.addField<float>(name + "_area", "effective area of PSF", "pixel")),
59  _centroidExtractor(schema, name) {
60  _logName = logName.size() ? logName : name;
62 }

Member Function Documentation

◆ fail()

void lsst::meas::base::PsfFluxAlgorithm::fail ( afw::table::SourceRecord measRecord,
MeasurementError error = nullptr 
) 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 119 of file PsfFlux.cc.

119  {
120  _flagHandler.handleFailure(measRecord, error);
121 }

◆ getFlagDefinitions()

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

Definition at line 49 of file PsfFlux.cc.

49 { return flagDefinitions; }

◆ 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::base::PsfFluxAlgorithm::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 64 of file PsfFlux.cc.

65  {
66  PTR(afw::detection::Psf const) psf = exposure.getPsf();
67  if (!psf) {
68  LOGL_ERROR(getLogName(), "PsfFlux: no psf attached to exposure");
69  throw LSST_EXCEPT(FatalAlgorithmError, "PsfFlux algorithm requires a Psf with every exposure");
70  }
71  geom::Point2D position = _centroidExtractor(measRecord, _flagHandler);
72  PTR(afw::detection::Psf::Image) psfImage = psf->computeImage(position);
73  geom::Box2I fitBBox = psfImage->getBBox();
74  fitBBox.clip(exposure.getBBox());
75  if (fitBBox != psfImage->getBBox()) {
76  _flagHandler.setValue(measRecord, FAILURE.number,
77  true); // if we had a suspect flag, we'd set that instead
78  _flagHandler.setValue(measRecord, EDGE.number, true);
79  }
80  auto fitRegionSpans = std::make_shared<afw::geom::SpanSet>(fitBBox);
81  afw::detection::Footprint fitRegion(fitRegionSpans);
82  if (!_ctrl.badMaskPlanes.empty()) {
83  afw::image::MaskPixel badBits = 0x0;
85  i != _ctrl.badMaskPlanes.end(); ++i) {
86  badBits |= exposure.getMaskedImage().getMask()->getPlaneBitMask(*i);
87  }
88  fitRegion.setSpans(fitRegion.getSpans()
89  ->intersectNot(*exposure.getMaskedImage().getMask(), badBits)
90  ->clippedTo(exposure.getMaskedImage().getMask()->getBBox()));
91  }
92  if (fitRegion.getArea() == 0) {
93  throw LSST_EXCEPT(MeasurementError, NO_GOOD_PIXELS.doc, NO_GOOD_PIXELS.number);
94  }
95  typedef afw::detection::Psf::Pixel PsfPixel;
96  // SpanSet::flatten returns a new ndarray::Array, which must stay in scope
97  // while we use an Eigen::Map view of it
98  auto modelNdArray = fitRegion.getSpans()->flatten(psfImage->getArray(), psfImage->getXY0());
99  auto dataNdArray = fitRegion.getSpans()->flatten(exposure.getMaskedImage().getImage()->getArray(),
100  exposure.getXY0());
101  auto varianceNdArray = fitRegion.getSpans()->flatten(exposure.getMaskedImage().getVariance()->getArray(),
102  exposure.getXY0());
103  auto model = ndarray::asEigenMatrix(modelNdArray);
104  auto data = ndarray::asEigenMatrix(dataNdArray);
105  auto variance = ndarray::asEigenMatrix(varianceNdArray);
106  PsfPixel alpha = model.squaredNorm();
107  FluxResult result;
108  result.instFlux = model.dot(data.cast<PsfPixel>()) / alpha;
109  // If we're not using per-pixel weights to compute the instFlux, we'll still want to compute the
110  // variance as if we had, so we'll apply the weights to the model now, and update alpha.
111  result.instFluxErr = std::sqrt(model.array().square().matrix().dot(variance.cast<PsfPixel>())) / alpha;
112  measRecord.set(_areaKey, model.sum() / alpha);
113  if (!std::isfinite(result.instFlux) || !std::isfinite(result.instFluxErr)) {
114  throw LSST_EXCEPT(PixelValueError, "Invalid pixel value detected in image.");
115  }
116  measRecord.set(_instFluxResultKey, result);
117 }

◆ measureForced()

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

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::ForcedAlgorithm.

Reimplemented in lsst::meas::extensions::photometryKron::KronFluxAlgorithm.

Definition at line 172 of file Algorithm.h.

175  {
176  measure(measRecord, exposure);
177  }

◆ 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()

virtual 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
inlinevirtualinherited

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  }

Member Data Documentation

◆ _logName

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

Definition at line 69 of file Algorithm.h.

◆ EDGE

FlagDefinition const lsst::meas::base::PsfFluxAlgorithm::EDGE
static
Initial value:
= flagDefinitions.add(
"flag_edge", "object was too close to the edge of the image to use the full PSF model")

Definition at line 75 of file PsfFlux.h.

◆ FAILURE

FlagDefinition const lsst::meas::base::PsfFluxAlgorithm::FAILURE = flagDefinitions.addFailureFlag()
static

Definition at line 73 of file PsfFlux.h.

◆ NO_GOOD_PIXELS

FlagDefinition const lsst::meas::base::PsfFluxAlgorithm::NO_GOOD_PIXELS
static
Initial value:
=
flagDefinitions.add("flag_noGoodPixels", "not enough non-rejected pixels in data to attempt the fit")

Definition at line 74 of file PsfFlux.h.


The documentation for this class was generated from the following files:
schema
table::Schema schema
Definition: Amplifier.cc:115
PTR
#define PTR(...)
Definition: base.h:41
lsst::afw::detection::Psf::Pixel
math::Kernel::Pixel Pixel
Pixel type of Image returned by computeImage.
Definition: Psf.h:82
lsst::meas::base::PsfFluxControl::badMaskPlanes
std::vector< std::string > badMaskPlanes
"Mask planes that indicate pixels that should be excluded from the fit" ;
Definition: PsfFlux.h:51
lsst::meas::base::FlagDefinition::number
std::size_t number
Definition: FlagHandler.h:54
lsst::log.log.logContinued.error
def error(fmt, *args)
Definition: logContinued.py:210
lsst::meas::base::FlagHandler::handleFailure
void handleFailure(afw::table::BaseRecord &record, MeasurementError const *error=nullptr) const
Handle an expected or unexpected Exception thrown by a measurement algorithm.
Definition: FlagHandler.cc:76
std::vector
STL class.
std::string::size
T size(T... args)
psf
Key< int > psf
Definition: Exposure.cc:65
lsst::meas::base::FlagDefinition::doc
std::string doc
Definition: FlagHandler.h:53
lsst::meas::base::PsfFluxAlgorithm::getFlagDefinitions
static FlagDefinitionList const & getFlagDefinitions()
Definition: PsfFlux.cc:49
lsst::afw::geom.transform.transformContinued.name
string name
Definition: transformContinued.py:32
std::sqrt
T sqrt(T... args)
lsst::meas::base::PsfFluxAlgorithm::FAILURE
static FlagDefinition const FAILURE
Definition: PsfFlux.h:73
lsst::meas::base::FlagHandler::setValue
void setValue(afw::table::BaseRecord &record, std::size_t i, bool value) const
Set the flag field corresponding to the given flag index.
Definition: FlagHandler.h:262
data
char * data
Definition: BaseRecord.cc:62
std::isfinite
T isfinite(T... args)
LOGL_ERROR
#define LOGL_ERROR(logger, message...)
Definition: Log.h:552
lsst::afw::detection::Psf::Image
image::Image< Pixel > Image
Image type returned by computeImage.
Definition: Psf.h:83
lsst::meas::base::PsfFluxAlgorithm::NO_GOOD_PIXELS
static FlagDefinition const NO_GOOD_PIXELS
Definition: PsfFlux.h:74
lsst::afw::table::Footprint
lsst::afw::detection::Footprint Footprint
Definition: Source.h:59
lsst::meas::base::SingleFrameAlgorithm::measureN
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
lsst::afw::image::MaskPixel
std::int32_t MaskPixel
default type for Masks and MaskedImage Masks
Definition: LsstImageTypes.h:34
lsst::meas::base::SingleFrameAlgorithm::measure
virtual void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const =0
Called to measure a single child source in an image.
result
py::object result
Definition: _schema.cc:429
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
lsst::meas::base::BaseAlgorithm::getLogName
std::string getLogName() const
Definition: Algorithm.h:66
variance
afw::table::Key< afw::table::Array< VariancePixelT > > variance
Definition: HeavyFootprint.cc:218
lsst::geom::Box2I::clip
void clip(Box2I const &other) noexcept
Shrink this to ensure that other.contains(*this).
Definition: Box.cc:189
lsst::meas::base::BaseAlgorithm::_logName
std::string _logName
Definition: Algorithm.h:69
std::vector::begin
T begin(T... args)
lsst::geom::Point< double, 2 >
lsst::geom::Box2I
An integer coordinate rectangle.
Definition: Box.h:55
lsst::meas::base::PsfFluxAlgorithm::EDGE
static FlagDefinition const EDGE
Definition: PsfFlux.h:75
std::vector::empty
T empty(T... args)
lsst::meas::base::FluxResultKey::addFields
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...
Definition: FluxUtilities.cc:36
std::vector::end
T end(T... args)
lsst::meas::base::FlagHandler::addFields
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.
Definition: FlagHandler.cc:37