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 Member Functions | List of all members
lsst::meas::base::SafeCentroidExtractor Class Reference

Utility class for measurement algorithms that extracts a position from the Centroid slot and handles errors in a safe and consistent way. More...

#include <InputUtilities.h>

Public Member Functions

 SafeCentroidExtractor (afw::table::Schema &schema, std::string const &name, bool isCentroider=false)
 Construct the extractor, creating a flag alias that indicates failure in the input centroid by linking to the slot centroid flag. More...
 
geom::Point2D operator() (afw::table::SourceRecord &record, FlagHandler const &flags) const
 Extract a position from the given record. More...
 

Detailed Description

Utility class for measurement algorithms that extracts a position from the Centroid slot and handles errors in a safe and consistent way.

Definition at line 39 of file InputUtilities.h.

Constructor & Destructor Documentation

◆ SafeCentroidExtractor()

lsst::meas::base::SafeCentroidExtractor::SafeCentroidExtractor ( afw::table::Schema schema,
std::string const &  name,
bool  isCentroider = false 
)

Construct the extractor, creating a flag alias that indicates failure in the input centroid by linking to the slot centroid flag.

Parameters
[out]schemaSchema to which the alias should be added. The "slot_Centroid" alias must already be present in the Schema's AliasMap.
[in]nameThe name of the algorithm; the flag alias added will be "<name>_flag_badCentroid", or "<name>_flag_badInitialCentroid" if isCentroider=true.
[in]isCentroiderIndicates whether the calling algorithm is itself a centroid measurement algorithm. If true,, falling back to the Peak because there was no previous centroider or a previous centroider failed will not cause the general failure flag of the current algorithm to be set.

Definition at line 35 of file InputUtilities.cc.

37  : _name(name), _isCentroider(isCentroider) {
38  // Instead of aliasing e.g. MyAlgorithm_flag_badCentroid->slot_Centroid_flag, we actually
39  // look up the target of slot_Centroid_flag, and alias that to MyAlgorithm_flag_badCentroid.
40  // That way, if someone changes the slots later, after we've already done the measurement,
41  // this alias still points to the right thing.
42  std::string aliasedFlagName = schema.join("slot", "Centroid", "flag");
43  std::string slotFlagName = schema.getAliasMap()->apply(aliasedFlagName);
44  if (_isCentroider) {
45  if (slotFlagName != schema.join(name, "flag")) {
46  // only setup the alias if this isn't the slot algorithm itself (otherwise it'd be circular)
47  schema.getAliasMap()->set(schema.join(name, "flag", "badInitialCentroid"), slotFlagName);
48  }
49  } else {
50  if (aliasedFlagName == slotFlagName) {
51  throw LSST_EXCEPT(
52  pex::exceptions::LogicError,
53  (boost::format("Alias for '%s' must be defined before initializing '%s' plugin.") %
54  aliasedFlagName % name)
55  .str());
56  }
57  schema.getAliasMap()->set(schema.join(name, "flag", "badCentroid"), slotFlagName);
58  }
59 }

Member Function Documentation

◆ operator()()

geom::Point2D lsst::meas::base::SafeCentroidExtractor::operator() ( afw::table::SourceRecord record,
FlagHandler const &  flags 
) const

Extract a position from the given record.

We use the Centroid slot if it is not NaN, and fall back to the Peak on the Footprint otherwise.

If the Centroid slot is not defined, we throw FatalAlgorithmError, as this indicates a configuration problem.

If the Centroid slot value is NaN and is not flagged (or there is no Centroid slot flag), we throw RuntimeError, which should cause the measurement framework to log a warning and set the current algorithm's general failure flag if it is allowed to propagate out of the algorithm implementation.

If the Centroid slot is NaN and there is no Footprint or Peak (even if the centroid is flagged), we also throw RuntimeError, as this indicates something wrong in another stage of the pipeline that should be addressed before measurement is run.

If the Centroid slot is flagged and we nevertheless obtain a usable position (either from a the Centroid slot itself or from a successful fall-back to the Peak), we set the current algorithm's general failure flag, but return the position as well, allowing it to continue while indicating that the result may not be reliable.

Definition at line 84 of file InputUtilities.cc.

85  {
86  if (!record.getTable()->getCentroidKey().isValid()) {
87  if (_isCentroider) {
88  return extractPeak(record, _name);
89  } else {
90  throw LSST_EXCEPT(
91  FatalAlgorithmError,
92  (boost::format("%s requires a centroid, but the centroid slot is not defined") % _name)
93  .str());
94  }
95  }
96  geom::Point2D result = record.getCentroid();
97  if (std::isnan(result.getX()) || std::isnan(result.getY())) {
98  if (!record.getTable()->getCentroidFlagKey().isValid()) {
99  if (_isCentroider) {
100  return extractPeak(record, _name);
101  } else {
102  throw LSST_EXCEPT(
103  pex::exceptions::RuntimeError,
104  (boost::format(
105  "%s: Centroid slot value is NaN, but there is no Centroid slot flag "
106  "(is the executionOrder for %s lower than that of the slot Centroid?)") %
107  _name % _name)
108  .str());
109  }
110  }
111  if (!record.getCentroidFlag() && !_isCentroider) {
112  throw LSST_EXCEPT(
113  pex::exceptions::RuntimeError,
114  (boost::format("%s: Centroid slot value is NaN, but the Centroid slot flag is not set "
115  "(is the executionOrder for %s lower than that of the slot Centroid?)") %
116  _name % _name)
117  .str());
118  }
119  result = extractPeak(record, _name);
120  if (!_isCentroider) {
121  // set the general flag, because using the Peak might affect the current measurement
122  flags.setValue(record, flags.getFailureFlagNumber(), true);
123  }
124  } else if (!_isCentroider && record.getTable()->getCentroidFlagKey().isValid() &&
125  record.getCentroidFlag()) {
126  // we got a usable value, but the centroid flag is still be set, and that might affect
127  // the current measurement
128  flags.setValue(record, flags.getFailureFlagNumber(), true);
129  }
130  return result;
131 }

The documentation for this class was generated from the following files:
schema
table::Schema schema
Definition: Amplifier.cc:115
std::string
STL class.
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
lsst::afw::geom.transform.transformContinued.name
string name
Definition: transformContinued.py:32
std::isnan
T isnan(T... args)
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::geom::Point< double, 2 >