LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Attributes | List of all members
lsst::meas::base::BlendednessAlgorithm Class Reference

Compute metrics that measure how blended objects are. More...

#include <Blendedness.h>

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

Public Types

typedef BlendednessControl Control
 

Public Member Functions

 BlendednessAlgorithm (Control const &ctrl, std::string const &name, afw::table::Schema &schema)
 
void measureChildPixels (afw::image::MaskedImage< float > const &image, afw::table::SourceRecord &child) const
 
void measureParentPixels (afw::image::MaskedImage< float > const &image, afw::table::SourceRecord &child) const
 
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 float computeAbsExpectation (float data, float variance)
 Compute the posterior expectation value of the true instrumental flux in a pixel from its (Gaussian) likelihood and a flat nonnegative prior. More...
 
static float computeAbsBias (float mu, float variance)
 Compute the bias induced by using the absolute value of a pixel instead of its value. More...
 

Static Public Attributes

static FlagDefinition const FAILURE = flagDefinitions.addFailureFlag()
 
static FlagDefinition const NO_CENTROID
 
static FlagDefinition const NO_SHAPE
 

Protected Attributes

std::string _logName
 

Detailed Description

Compute metrics that measure how blended objects are.

Blendedness is initialized once for a given Schema, then run repeatedly by calls to measureChildPixels and measureParentPixels (in any order, possibly with multiple sources interleaved). Since it needs access to both the image with with noise and the noise replaced children it cannot use the standard plugin interface.

Definition at line 66 of file Blendedness.h.

Member Typedef Documentation

◆ Control

Definition at line 74 of file Blendedness.h.

Constructor & Destructor Documentation

◆ BlendednessAlgorithm()

lsst::meas::base::BlendednessAlgorithm::BlendednessAlgorithm ( Control const &  ctrl,
std::string const &  name,
afw::table::Schema schema 
)

Definition at line 195 of file Blendedness.cc.

197  : _ctrl(ctrl) {
198  if (_ctrl.doOld) {
199  _old = schema.addField<double>(
200  schema.join(name, "old"),
201  "Blendedness from dot products: (child.dot(parent)/child.dot(child) - 1)");
202  }
203  if (_ctrl.doFlux) {
204  _raw = schema.addField<double>(
205  schema.join(name, "raw"),
206  "Measure of how much the flux is affected by neighbors: "
207  "(1 - child_instFlux/parent_instFlux). Operates on the \"raw\" pixel values.");
208  _instFluxChildRaw = schema.addField<double>(
209  schema.join(name, "raw_child_instFlux"),
210  "Instrumental flux of the child, measured with a Gaussian weight matched to the child. "
211  "Operates on the \"raw\" pixel values.", "count");
212  _instFluxParentRaw = schema.addField<double>(
213  schema.join(name, "raw_parent_instFlux"),
214  "Instrumental flux of the parent, measured with a Gaussian weight matched to the child. "
215  "Operates on the \"raw\" pixel values.", "count");
216  _abs = schema.addField<double>(
217  schema.join(name, "abs"),
218  "Measure of how much the flux is affected by neighbors: "
219  "(1 - child_instFlux/parent_instFlux). "
220  "Operates on the absolute value of the pixels to try to obtain a \"de-noised\" value. "
221  "See section 4.9.11 of Bosch et al. 2018, PASJ, 70, S5 for details.");
222  _instFluxChildAbs = schema.addField<double>(
223  schema.join(name, "abs_child_instFlux"),
224  "Instrumental flux of the child, measured with a Gaussian weight matched to the child. "
225  "Operates on the absolute value of the pixels to try to obtain a \"de-noised\" value. "
226  "See section 4.9.11 of Bosch et al. 2018, PASJ, 70, S5 for details.", "count");
227  _instFluxParentAbs = schema.addField<double>(
228  schema.join(name, "abs_parent_instFlux"),
229  "Instrumental flux of the parent, measured with a Gaussian weight matched to the child. "
230  "Operates on the absolute value of the pixels to try to obtain a \"de-noised\" value. "
231  "See section 4.9.11 of Bosch et al. 2018, PASJ, 70, S5 for details.", "count");
232  }
233  if (_ctrl.doShape) {
234  _shapeChildRaw = ShapeResultKey::addFields(
235  schema, schema.join(name, "raw_child"),
236  "Shape of the child, measured with a Gaussian weight matched to the child. "
237  "Operates on the \"raw\" pixel values.", NO_UNCERTAINTY);
238  _shapeParentRaw = ShapeResultKey::addFields(
239  schema, schema.join(name, "raw_parent"),
240  "Shape of the parent, measured with a Gaussian weight matched to the child. "
241  "Operates on the \"raw\" pixel values.", NO_UNCERTAINTY);
242  _shapeChildAbs = ShapeResultKey::addFields(
243  schema, schema.join(name, "abs_child"),
244  "Shape of the child, measured with a Gaussian weight matched to the child. "
245  "Operates on the absolute value of the pixels to try to obtain a \"de-noised\" value. "
246  "See section 4.9.11 of Bosch et al. 2018, PASJ, 70, S5 for details.",
248  _shapeParentAbs = ShapeResultKey::addFields(
249  schema, schema.join(name, "abs_parent"),
250  "Shape of the parent, measured with a Gaussian weight matched to the child. "
251  "Operates on the absolute value of the pixels to try to obtain a \"de-noised\" value. "
252  "See section 4.9.11 of Bosch et al. 2018, PASJ, 70, S5 for details.",
254  }
255  if (_ctrl.doShape || _ctrl.doFlux) {
257  }
258 }
table::Key< std::string > name
Definition: Amplifier.cc:116
table::Schema schema
Definition: python.h:134
static FlagDefinitionList const & getFlagDefinitions()
Definition: Blendedness.cc:49
bool doOld
"Whether to compute HeavyFootprint dot products (the old deblend.blendedness parameter)" ;
Definition: Blendedness.h:44
bool doShape
"Whether to compute quantities related to the Gaussian-weighted shape" ;
Definition: Blendedness.h:48
bool doFlux
"Whether to compute quantities related to the Gaussian-weighted flux" ;
Definition: Blendedness.h:46
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
static ShapeResultKey addFields(afw::table::Schema &schema, std::string const &name, std::string const &doc, UncertaintyEnum uncertainty, afw::table::CoordinateType coordType=afw::table::CoordinateType::PIXEL)
Add the appropriate fields to a Schema, and return a ShapeResultKey that manages them.
@ NO_UNCERTAINTY
Algorithm provides no uncertainy information at all.
Definition: constants.h:44

Member Function Documentation

◆ computeAbsBias()

float lsst::meas::base::BlendednessAlgorithm::computeAbsBias ( float  mu,
float  variance 
)
static

Compute the bias induced by using the absolute value of a pixel instead of its value.

The computation assumes the true distribution for the pixel is a Gaussian with mean mu and the given variance. To compute mu from the data, use computeAbsExpectation.

This computes

\[ \sqrt{\frac{2}{\pi}}\sigma e^{-\frac{\mu^2}{2\sigma^2}} - \mu\,\mathrm{erfc}\left(\frac{\mu}{\sqrt{2}\sigma}\right) \]

where \(\mu\) is the mean of the underlying distribution and \(\sigma^2\) is its variance. See section 4.9.11 of Bosch, J. et al. 2018, PASJ, 70, S5 for further details.

Definition at line 270 of file Blendedness.cc.

270  {
271  return (std::sqrt(2.0f * variance / boost::math::constants::pi<float>()) *
272  std::exp(-0.5f * (mu * mu) / variance)) -
273  mu * std::erfc(mu / std::sqrt(2.0f * variance));
274 }
afw::table::Key< afw::table::Array< VariancePixelT > > variance
T erfc(T... args)
T exp(T... args)
T sqrt(T... args)

◆ computeAbsExpectation()

float lsst::meas::base::BlendednessAlgorithm::computeAbsExpectation ( float  data,
float  variance 
)
static

Compute the posterior expectation value of the true instrumental flux in a pixel from its (Gaussian) likelihood and a flat nonnegative prior.

This computes

\[ \frac{\int_0^\infty f \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(f-z)^2}{2\sigma^2}} df} {\int_0^\infty \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(f-z)^2}{2\sigma^2}} df} \]

where \(z\) is the (noisy) pixel value and \(\sigma^2\) is the pixel variance. This approaches \(z\) when \(z \gg \sigma\) and \(0\) when \(z \ll -\sigma\).

We use single precision here for performance reasons; this function is called in a loop over single-precision pixels, and relies on a number of calls to exp and erfc, which are much faster in single precision.

Definition at line 260 of file Blendedness.cc.

260  {
261  float normalization = 0.5f * std::erfc(-data / std::sqrt(2.0f * variance));
262  if (!(normalization > 0)) {
263  // avoid division by zero; we know the limit at data << -sigma -> 0.
264  return 0.0;
265  }
266  return data + (std::sqrt(0.5f * variance / boost::math::constants::pi<float>()) *
267  std::exp(-0.5f * (data * data) / variance) / normalization);
268 }
char * data
Definition: BaseRecord.cc:61

◆ fail()

virtual void lsst::meas::base::BlendednessAlgorithm::fail ( afw::table::SourceRecord measRecord,
MeasurementError error = nullptr 
) const
inlinevirtual

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 123 of file Blendedness.h.

123 {}

◆ getFlagDefinitions()

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

Definition at line 49 of file Blendedness.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()

virtual void lsst::meas::base::BlendednessAlgorithm::measure ( afw::table::SourceRecord measRecord,
afw::image::Exposure< float > const &  exposure 
) const
inlinevirtual

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 120 of file Blendedness.h.

121  {}

◆ measureChildPixels()

void lsst::meas::base::BlendednessAlgorithm::measureChildPixels ( afw::image::MaskedImage< float > const &  image,
afw::table::SourceRecord child 
) const

Definition at line 346 of file Blendedness.cc.

347  {
348  _measureMoments(image, child, _instFluxChildRaw, _instFluxChildAbs, _shapeChildRaw, _shapeChildAbs);
349 }
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.

◆ 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  }
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.

◆ 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 }
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48

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

◆ measureParentPixels()

void lsst::meas::base::BlendednessAlgorithm::measureParentPixels ( afw::image::MaskedImage< float > const &  image,
afw::table::SourceRecord child 
) const

Definition at line 351 of file Blendedness.cc.

352  {
353  if (_ctrl.doOld) {
354  child.set(_old, computeOldBlendedness(child.getFootprint(), *image.getImage()));
355  }
356  _measureMoments(image, child, _instFluxParentRaw, _instFluxParentAbs, _shapeParentRaw, _shapeParentAbs);
357  if (_ctrl.doFlux) {
358  child.set(_raw, 1.0 - child.get(_instFluxChildRaw) / child.get(_instFluxParentRaw));
359  child.set(_abs, 1.0 - child.get(_instFluxChildAbs) / child.get(_instFluxParentAbs));
360  if (child.get(_instFluxParentAbs) == 0.0) {
361  // We can get NaNs in the absolute measure if both parent and child have only negative
362  // biased-corrected instFluxes (which we clip to zero). We can't really recover from this,
363  // so we should set the flag.
364  _flagHandler.setValue(child, FAILURE.number, true);
365  }
366  }
367 }
static FlagDefinition const FAILURE
Definition: Blendedness.h:70
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

Member Data Documentation

◆ _logName

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

Definition at line 69 of file Algorithm.h.

◆ FAILURE

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

Definition at line 70 of file Blendedness.h.

◆ NO_CENTROID

FlagDefinition const lsst::meas::base::BlendednessAlgorithm::NO_CENTROID
static
Initial value:
=
flagDefinitions.add("flag_noCentroid", "Object has no centroid")

Definition at line 71 of file Blendedness.h.

◆ NO_SHAPE

FlagDefinition const lsst::meas::base::BlendednessAlgorithm::NO_SHAPE
static
Initial value:
=
flagDefinitions.add("flag_noShape", "Object has no shape")

Definition at line 72 of file Blendedness.h.


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