lsst.meas.base  13.0-33-gb1a1d47+5
FlagHandler.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 /*
3  * LSST Data Management System
4  * Copyright 2008-2014 LSST Corporation.
5  *
6  * This product includes software developed by the
7  * LSST Project (http://www.lsst.org/).
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the LSST License Statement and
20  * the GNU General Public License along with this program. If not,
21  * see <http://www.lsstcorp.org/LegalNotices/>.
22  */
23 
25 
26 namespace lsst { namespace meas { namespace base {
27 
28 // so pybind11 can get the address of number_undefined
29 constexpr std::size_t FlagDefinition::number_undefined;
30 
32  std::string const & doc
33 ) {
34  return add(FlagHandler::getFailureFlagName(), doc);
35 }
36 
38  afw::table::Schema & schema,
39  std::string const & prefix,
40  FlagDefinitionList const & flagDefs,
41  FlagDefinitionList const & exclDefs
42 ) {
43  FlagHandler r;
44  r._vector.reserve(flagDefs.size());
45  for (std::size_t i = 0; i < flagDefs.size(); i++) {
46  FlagDefinition const & flagDef = flagDefs[i];
47  if (exclDefs.hasDefinition(flagDef.name)) {
48  afw::table::Key<afw::table::Flag> key;
49  r._vector.push_back( std::make_pair( flagDef.name, key));
50  }
51  else {
52  afw::table::Key<afw::table::Flag> key(schema.addField<afw::table::Flag>(schema.join(prefix, flagDef.name), flagDef.doc));
53  r._vector.push_back( std::make_pair( flagDef.name, key));
54  if (flagDef.name == FlagHandler::getFailureFlagName()) {
55  r.failureFlagNumber = i;
56  }
57  }
58  }
59  return r;
60 }
61 
63  afw::table::SubSchema const & s,
64  FlagDefinitionList const & flagDefs,
65  FlagDefinitionList const & exclDefs
66 ) : failureFlagNumber(FlagDefinition::number_undefined) {
67  _vector.reserve(flagDefs.size());
68  for (std::size_t i = 0; i < flagDefs.size(); i++ ) {
69  FlagDefinition const & flagDef = flagDefs[i];
70  if (exclDefs.hasDefinition(flagDef.name)) {
71  afw::table::Key<afw::table::Flag> key;
72  _vector.push_back(
73  std::make_pair(
74  flagDef.name,
75  key
76  )
77  );
78  }
79  else {
80  _vector.push_back(
81  std::make_pair(
82  flagDef.name,
83  s[flagDef.name]
84  )
85  );
86  if (flagDef.name == FlagHandler::getFailureFlagName()) {
88  }
89  }
90  }
91 }
92 
93 void FlagHandler::handleFailure(afw::table::BaseRecord & record, MeasurementError const * error) const {
94  std::size_t const numFlags = _vector.size();
95  if (failureFlagNumber != FlagDefinition::number_undefined) {
96  record.set(_vector[failureFlagNumber].second, true);
97  }
98  if (error && error->getFlagBit() != FlagDefinition::number_undefined) {
99  assert(numFlags > error->getFlagBit()); // We need the particular flag
100  record.set(_vector[error->getFlagBit()].second, true);
101  }
102 }
103 
104 }}} // lsst::meas::base
std::size_t size() const
return the current size (number of defined elements) of the collection
Definition: FlagHandler.h:133
Simple class used to define and document flags The name and doc constitute the identity of the FlagDe...
Definition: FlagHandler.h:38
Exception to be thrown when a measurement algorithm experiences a known failure mode.
Definition: exceptions.h:48
FlagDefinition addFailureFlag(std::string const &doc="General Failure Flag")
Add a Flag Defintion to act as a "General" failure flag This flag will be set if a Measurement error ...
Definition: FlagHandler.cc:31
static constexpr std::size_t number_undefined
Definition: FlagHandler.h:40
Utility class for handling flag fields that indicate the failure modes of an algorithm.
Definition: FlagHandler.h:156
Definition: mainpage.dox:3
FlagHandler()
Each error should have a corresponding static FlagDefinition object.
Definition: FlagHandler.h:184
bool hasDefinition(std::string const &name) const
See if there is a FlagDefinition with specified name.
Definition: FlagHandler.h:108
FlagDefinition add(std::string const &name, std::string const &doc)
Add a new FlagDefinition to this list.
Definition: FlagHandler.h:124
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 std::string const & getFailureFlagName()
Define the universal name of the general failure flag.
Definition: FlagHandler.h:189
std::size_t getFlagBit() const
Return the flag bit associated with the error.
Definition: exceptions.h:64
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:93
vector-type utility class to build a collection of FlagDefinitions
Definition: FlagHandler.h:63