23 #include "pybind11/pybind11.h" 24 #include "pybind11/stl.h" 28 #include "lsst/utils/python.h" 31 namespace py = pybind11;
40 void declareFlagDefinition(py::module &mod) {
41 py::class_<FlagDefinition, std::shared_ptr<FlagDefinition>> cls(mod,
"FlagDefinition");
43 cls.def(py::init<>());
44 cls.def(py::init<std::string, std::string, std::size_t>(),
"name"_a,
"doc"_a,
45 "number"_a = FlagDefinition::number_undefined);
47 cls.def_readwrite(
"name", &FlagDefinition::name);
48 cls.def_readwrite(
"doc", &FlagDefinition::doc);
49 cls.def_readwrite(
"number", &FlagDefinition::number);
51 cls.def(
"__eq__", &FlagDefinition::operator==, py::is_operator());
52 cls.def(
"__ne__", &FlagDefinition::operator!=, py::is_operator());
55 void declareFlagDefinitionList(py::module &mod) {
56 py::class_<FlagDefinitionList, std::shared_ptr<FlagDefinitionList>> cls(mod,
"FlagDefinitionList");
58 cls.def(py::init<>());
59 cls.def(py::init<std::initializer_list<FlagDefinition>
const &>());
61 cls.def(
"__getitem__",
62 [](FlagDefinitionList
const &
self,
int i) {
64 auto cind = lsst::utils::python::cppIndex(
self.size(), i);
66 }
catch (pex::exceptions::OutOfRangeError & err) {
68 PyErr_SetString(PyExc_IndexError, err.what());
69 throw py::error_already_set();
72 cls.def(
"__len__", &FlagDefinitionList::size);
74 cls.def(
"getEmptyList", &FlagDefinitionList::getEmptyList);
75 cls.def(
"getDefinition",
76 (FlagDefinition(FlagDefinitionList::*)(std::size_t)
const) & FlagDefinitionList::getDefinition,
78 cls.def(
"getDefinition", (FlagDefinition(FlagDefinitionList::*)(std::string
const &)
const) &
79 FlagDefinitionList::getDefinition,
81 cls.def(
"hasDefinition", &FlagDefinitionList::hasDefinition,
"name"_a);
82 cls.def(
"addFailureFlag", &FlagDefinitionList::addFailureFlag,
"doc"_a =
"General Failure Flag");
83 cls.def(
"add", &FlagDefinitionList::add,
"name"_a,
"doc"_a);
86 void declareFlagHandler(py::module &mod) {
87 py::class_<FlagHandler, std::shared_ptr<FlagHandler>> cls(mod,
"FlagHandler");
89 cls.def(py::init<>());
90 cls.def(py::init<afw::table::SubSchema const &, FlagDefinitionList const &, FlagDefinitionList const &>(),
91 "s"_a,
"flagDefs"_a,
"exclDefs"_a = FlagDefinitionList::getEmptyList());
93 cls.def_static(
"getFailureFlagName", &FlagHandler::getFailureFlagName);
94 cls.def_static(
"addFields", &FlagHandler::addFields,
"schema"_a,
"prefix"_a,
"flagDefs"_a,
95 "exclDefs"_a=FlagDefinitionList::getEmptyList());
97 cls.def(
"getFlagNumber", &FlagHandler::getFlagNumber,
"flagName"_a);
98 cls.def(
"getFlagName", &FlagHandler::getFlagName,
"i"_a);
99 cls.def(
"getValue", (
bool (FlagHandler::*)(afw::table::BaseRecord
const &, std::size_t)
const) &
100 FlagHandler::getValue,
102 cls.def(
"getValue", (
bool (FlagHandler::*)(afw::table::BaseRecord
const &, std::string
const &)
const) &
103 FlagHandler::getValue,
104 "record"_a,
"flagName"_a);
105 cls.def(
"setValue", (
void (FlagHandler::*)(afw::table::BaseRecord &, std::size_t,
bool)
const) &
106 FlagHandler::setValue,
107 "record"_a,
"i"_a,
"value"_a);
108 cls.def(
"setValue", (
void (FlagHandler::*)(afw::table::BaseRecord &, std::string
const &,
bool)
const) &
109 FlagHandler::setValue,
110 "record"_a,
"flagName"_a,
"value"_a);
111 cls.def(
"getFailureFlagNumber", &FlagHandler::getFailureFlagNumber);
112 cls.def(
"handleFailure", &FlagHandler::handleFailure,
"record"_a,
"error"_a =
nullptr);
118 py::module::import(
"lsst.afw.table");
120 py::module mod(
"flagHandler");
122 declareFlagDefinition(mod);
123 declareFlagDefinitionList(mod);
124 declareFlagHandler(mod);
PYBIND11_PLUGIN(flagHandler)