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

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

#include <InputUtilities.h>

Public Member Functions

 SafeShapeExtractor (afw::table::Schema &schema, std::string const &name)
 Construct the extractor, creating a flag alias that indicates failure in the input centroid by linking to the slot shape flag. More...
 
afw::geom::ellipses::Quadrupole operator() (afw::table::SourceRecord &record, FlagHandler const &flags) const
 Extract a shape from the given record. More...
 

Detailed Description

Utility class for measurement algorithms that extracts an ellipse from the Shape slot and handles errors in a safe and consistent way.

Definition at line 90 of file InputUtilities.h.

Constructor & Destructor Documentation

◆ SafeShapeExtractor()

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

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

Parameters
[out]schemaSchema to which the alias should be added. The "slot_Shape" alias must already be present in the Schema's AliasMap.
[in]nameThe name of the algorithm; the flag alias added will be "<name>_flag_badShape".

Definition at line 133 of file InputUtilities.cc.

133  : _name(name) {
134  // Instead of aliasing e.g. MyAlgorithm_flag_badShape->slot_Shape_flag, we actually
135  // look up the target of slot_Shape_flag, and alias that to MyAlgorithm_flag_badCentroid.
136  // That way, if someone changes the slots later, after we've already done the measurement,
137  // this alias still points to the right thing.
138  std::string aliasedFlagName = schema.join("slot", "Shape", "flag");
139  std::string slotFlagName = schema.getAliasMap()->apply(aliasedFlagName);
140  if (aliasedFlagName == slotFlagName) {
141  throw LSST_EXCEPT(pex::exceptions::LogicError,
142  (boost::format("Alias for '%s' must be defined before initializing '%s' plugin.") %
143  aliasedFlagName % name)
144  .str());
145  }
146  schema.getAliasMap()->set(schema.join(name, "flag", "badShape"), slotFlagName);
147 }
table::Key< std::string > name
Definition: Amplifier.cc:116
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
table::Schema schema
Definition: python.h:134
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174

Member Function Documentation

◆ operator()()

afw::geom::ellipses::Quadrupole lsst::meas::base::SafeShapeExtractor::operator() ( afw::table::SourceRecord record,
FlagHandler const &  flags 
) const

Extract a shape from the given record.

We use the Shape slot if it is not NaN, and throw MeasurementError if it is (with only the general failure code attached to the MeasurementError).

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

If the Shape slot value is NaN and is not flagged (or there is no Shape 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 Shape slot is flagged and we nevertheless obtain a usable ellipse, we set the current algorithm's general failure flag, but return the ellipse as well, allowing it to continue while indicating that the result may not be reliable. A singular ellipse (i.e. one with a non-positive quadrupole matrix determinant) is treated the same as a NaN ellipse; it is not considered usable.

Definition at line 149 of file InputUtilities.cc.

150  {
151  if (!record.getTable()->getCentroidSlot().getMeasKey().isValid()) {
152  throw LSST_EXCEPT(
153  FatalAlgorithmError,
154  (boost::format("%s requires a shape, but the shape slot is not defined") % _name).str());
155  }
156  afw::geom::ellipses::Quadrupole result = record.getShape();
157  if (std::isnan(result.getIxx()) || std::isnan(result.getIyy()) || std::isnan(result.getIxy()) ||
158  result.getIxx() * result.getIyy() < (1.0 + 1.0e-6) * result.getIxy() * result.getIxy()
159  // We are checking that Ixx*Iyy > (1 + epsilon)*Ixy*Ixy where epsilon is suitably small. The
160  // value of epsilon used here is a magic number. DM-5801 is supposed to figure out if we are
161  // to keep this value.
162  ) {
163  if (!record.getTable()->getShapeSlot().getFlagKey().isValid()) {
164  throw LSST_EXCEPT(
165  pex::exceptions::RuntimeError,
166  (boost::format("%s: Shape slot value is NaN, but there is no Shape slot flag "
167  "(is the executionOrder for %s lower than that of the slot Shape?)") %
168  _name % _name)
169  .str());
170  }
171  if (!record.getShapeFlag()) {
172  throw LSST_EXCEPT(
173  pex::exceptions::RuntimeError,
174  (boost::format("%s: Shape slot value is NaN, but the Shape slot flag is not set "
175  "(is the executionOrder for %s lower than that of the slot Shape?)") %
176  _name % _name)
177  .str());
178  }
179  throw LSST_EXCEPT(
180  MeasurementError,
181  (boost::format("%s: Shape needed, and Shape slot measurement failed.") % _name).str(),
182  flags.getFailureFlagNumber());
183  } else if (record.getTable()->getShapeSlot().getFlagKey().isValid() && record.getShapeFlag()) {
184  // we got a usable value, but the shape flag might still be set, and that might affect
185  // the current measurement
186  flags.setValue(record, flags.getFailureFlagNumber(), true);
187  }
188  return result;
189 }
py::object result
Definition: _schema.cc:429
T isnan(T... args)

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