23 #include "pybind11/pybind11.h" 27 #include "lsst/pex/config/python.h" 30 #include "lsst/afw/table/FunctorKey.h" 34 namespace py = pybind11;
43 using PyShapeControl = py::class_<SdssShapeControl>;
46 using PyShapeResultKey = py::class_<SdssShapeResultKey, std::shared_ptr<SdssShapeResultKey>>;
47 using PyShapeResult = py::class_<SdssShapeResult, std::shared_ptr<SdssShapeResult>, ShapeResult,
48 CentroidResult, FluxResult>;
49 using PyShapeAlgorithm = py::class_<SdssShapeAlgorithm, std::shared_ptr<SdssShapeAlgorithm>, SimpleAlgorithm>;
50 using PyShapeTransform = py::class_<SdssShapeTransform, std::shared_ptr<SdssShapeTransform>,
BaseTransform>;
52 PyShapeControl declareShapeControl(py::module &mod) {
53 PyShapeControl cls(mod,
"SdssShapeControl");
55 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, background);
56 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, maxIter);
57 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, maxShift);
58 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, tol1);
59 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, tol2);
60 LSST_DECLARE_CONTROL_FIELD(cls, SdssShapeControl, doMeasurePsf);
62 cls.def(py::init<>());
67 void declareShapeResultKey(py::module &mod) {
68 PyShapeResultKey cls(mod,
"SdssShapeResultKey");
71 cls.def(py::init<afw::table::SubSchema const &>(),
"subSchema"_a);
73 cls.def_static(
"addFields", &FluxResultKey::addFields,
"schema"_a,
"name"_a,
"doMeasurePsf"_a);
75 cls.def(
"__eq__", &SdssShapeResultKey::operator==, py::is_operator());
76 cls.def(
"__ne__", &SdssShapeResultKey::operator!=, py::is_operator());
78 cls.def(
"get", &SdssShapeResultKey::get,
"record"_a);
79 cls.def(
"set", &SdssShapeResultKey::set,
"record"_a,
"value"_a);
80 cls.def(
"getPsfShape", &SdssShapeResultKey::getPsfShape,
"record"_a);
81 cls.def(
"setPsfShape", &SdssShapeResultKey::setPsfShape,
"record"_a,
"value"_a);
82 cls.def(
"isValid", &SdssShapeResultKey::isValid);
83 cls.def(
"getFlagHandler", &SdssShapeResultKey::getFlagHandler);
86 template <
typename ImageT>
87 static void declareComputeMethods(PyShapeAlgorithm & cls) {
89 "computeAdaptiveMoments",
92 afw::geom::Point2D
const &,
94 SdssShapeControl
const &
95 )) &SdssShapeAlgorithm::computeAdaptiveMoments,
96 "image"_a,
"position"_a,
"negative"_a=
false,
"ctrl"_a=SdssShapeControl()
99 "computeFixedMomentsFlux",
102 afw::geom::ellipses::Quadrupole
const &,
103 afw::geom::Point2D
const &
104 )) &SdssShapeAlgorithm::computeFixedMomentsFlux,
105 "image"_a,
"shape"_a,
"position"_a
109 PyShapeAlgorithm declareShapeAlgorithm(py::module &mod) {
110 PyShapeAlgorithm cls(mod,
"SdssShapeAlgorithm");
112 cls.attr(
"FAILURE") = py::cast(SdssShapeAlgorithm::FAILURE);
113 cls.attr(
"UNWEIGHTED_BAD") = py::cast(SdssShapeAlgorithm::UNWEIGHTED_BAD);
114 cls.attr(
"UNWEIGHTED") = py::cast(SdssShapeAlgorithm::UNWEIGHTED);
115 cls.attr(
"SHIFT") = py::cast(SdssShapeAlgorithm::SHIFT);
116 cls.attr(
"MAXITER") = py::cast(SdssShapeAlgorithm::MAXITER);
117 cls.attr(
"PSF_SHAPE_BAD") = py::cast(SdssShapeAlgorithm::PSF_SHAPE_BAD);
119 cls.def(py::init<SdssShapeAlgorithm::Control const &, std::string const &, afw::table::Schema &>(),
120 "ctrl"_a,
"name"_a,
"schema"_a);
122 declareComputeMethods<afw::image::Image<int>>(cls);
123 declareComputeMethods<afw::image::Image<float>>(cls);
124 declareComputeMethods<afw::image::Image<double>>(cls);
125 declareComputeMethods<afw::image::MaskedImage<int>>(cls);
126 declareComputeMethods<afw::image::MaskedImage<float>>(cls);
127 declareComputeMethods<afw::image::MaskedImage<double>>(cls);
129 cls.def(
"measure", &SdssShapeAlgorithm::measure,
"measRecord"_a,
"exposure"_a);
130 cls.def(
"fail", &SdssShapeAlgorithm::fail,
"measRecord"_a,
"error"_a =
nullptr);
135 void declareShapeResult(py::module &mod) {
136 PyShapeResult cls(mod,
"SdssShapeResult");
138 cls.def(py::init<>());
140 cls.def_readwrite(
"flux_xx_Cov", &SdssShapeResult::flux_xx_Cov);
141 cls.def_readwrite(
"flux_yy_Cov", &SdssShapeResult::flux_yy_Cov);
142 cls.def_readwrite(
"flux_xy_Cov", &SdssShapeResult::flux_xy_Cov);
143 cls.def_readwrite(
"flags", &SdssShapeResult::flags);
146 cls.def(
"getFlag", (
bool (SdssShapeResult::*)(
unsigned int)
const) & SdssShapeResult::getFlag,
149 (
bool (SdssShapeResult::*)(std::string
const &name)
const) & SdssShapeResult::getFlag,
153 PyShapeTransform declareShapeTransform(py::module &mod) {
154 PyShapeTransform cls(mod,
"SdssShapeTransform");
156 cls.def(py::init<SdssShapeTransform::Control const &, std::string const &, afw::table::SchemaMapper &>(),
157 "ctrl"_a,
"name"_a,
"mapper"_a);
159 cls.def(
"__call__", &SdssShapeTransform::operator(),
"inputCatalog"_a,
"outputCatalog"_a,
"wcs"_a,
168 py::module::import(
"lsst.afw.geom");
169 py::module::import(
"lsst.afw.table");
170 py::module::import(
"lsst.meas.base.algorithm");
171 py::module::import(
"lsst.meas.base.flagHandler");
172 py::module::import(
"lsst.meas.base.centroidUtilities");
173 py::module::import(
"lsst.meas.base.fluxUtilities");
174 py::module::import(
"lsst.meas.base.shapeUtilities");
175 py::module::import(
"lsst.meas.base.transform");
177 py::module mod(
"sdssShape");
179 auto clsShapeControl = declareShapeControl(mod);
180 declareShapeResultKey(mod);
181 auto clsShapeAlgorithm = declareShapeAlgorithm(mod);
182 declareShapeResult(mod);
183 auto clsShapeTransform = declareShapeTransform(mod);
185 clsShapeAlgorithm.attr(
"Control") = clsShapeControl;
186 clsShapeTransform.attr(
"Control") = clsShapeControl;
188 python::declareAlgorithm<SdssShapeAlgorithm, SdssShapeControl, SdssShapeTransform>(
189 clsShapeAlgorithm, clsShapeControl, clsShapeTransform);
PYBIND11_PLUGIN(sdssShape)