24 #include "pybind11/pybind11.h"
32 using namespace pybind11::literals;
40 using Control = DoubleShapeletPsfApproxControl;
41 using Algorithm = DoubleShapeletPsfApproxAlgorithm;
43 using PyControl = py::class_<Control, std::shared_ptr<Control>>;
44 using PyAlgorithm = py::class_<Algorithm, std::shared_ptr<Algorithm>, meas::base::SimpleAlgorithm>;
46 PyControl clsControl(mod,
"DoubleShapeletPsfApproxControl");
47 clsControl.def(py::init<>());
57 PyAlgorithm clsAlgorithm(mod,
"DoubleShapeletPsfApproxAlgorithm");
59 clsAlgorithm.attr(
"Control") = clsControl;
60 clsAlgorithm.attr(
"FAILURE") = py::cast(Algorithm::FAILURE);
61 clsAlgorithm.attr(
"INVALID_POINT_FOR_PSF") = py::cast(Algorithm::INVALID_POINT_FOR_PSF);
62 clsAlgorithm.attr(
"INVALID_MOMENTS") = py::cast(Algorithm::INVALID_MOMENTS);
63 clsAlgorithm.attr(
"MAX_ITERATIONS") = py::cast(Algorithm::MAX_ITERATIONS);
65 clsAlgorithm.def(py::init<Control const &, std::string const &, afw::table::Schema &>(),
"ctrl"_a,
66 "name"_a,
"schema"_a);
67 clsAlgorithm.def_static(
"initializeResult", &Algorithm::initializeResult,
"ctrl"_a);
68 clsAlgorithm.def_static(
"fitMoments", &Algorithm::fitMoments,
"result"_a,
"ctrl"_a,
"psfImage"_a);
69 clsAlgorithm.def_static(
"makeObjective", &Algorithm::makeObjective,
"moments"_a,
"ctrl"_a,
"psfImage"_a);
70 clsAlgorithm.def_static(
"fitProfile", &Algorithm::fitProfile,
"result"_a,
"ctrl"_a,
"psfImage"_a);
71 clsAlgorithm.def_static(
"fitShapelets", &Algorithm::fitShapelets,
"result"_a,
"ctrl"_a,
"psfImage"_a);
73 clsAlgorithm.def(
"fail", &Algorithm::fail,
"measRecord"_a,
"error"_a =
nullptr);
77 using ComponentControl = GeneralPsfFitterComponentControl;
78 using Control = GeneralPsfFitterControl;
79 using Fitter = GeneralPsfFitter;
80 using Algorithm = GeneralPsfFitterAlgorithm;
82 using PyComponentControl = py::class_<ComponentControl, std::shared_ptr<ComponentControl>>;
83 using PyControl = py::class_<Control, std::shared_ptr<Control>>;
84 using PyFitter = py::class_<Fitter, std::shared_ptr<Fitter>>;
85 using PyAlgorithm = py::class_<Algorithm, std::shared_ptr<Algorithm>, Fitter>;
87 PyComponentControl clsComponentControl(mod,
"GeneralPsfFitterComponentControl");
88 clsComponentControl.def(py::init<int, double>(),
"order"_a = 0,
"radius"_a = 1.0);
95 PyControl clsControl(mod,
"GeneralPsfFitterControl");
96 clsControl.def(py::init<>());
104 PyFitter clsFitter(mod,
"GeneralPsfFitter");
105 clsFitter.def(py::init<Control const &>(),
"ctrl"_a);
106 clsFitter.def(
"addFields", &Fitter::addFields,
"schema"_a,
"prefix"_a);
107 clsFitter.def(
"getModel", &Fitter::getModel);
108 clsFitter.def(
"getPrior", &Fitter::getPrior);
109 clsFitter.def(
"adapt", &Fitter::adapt,
"previousFit"_a,
"previousModel"_a);
112 clsFitter.def(
"apply", [](Fitter
const &
self, afw::image::Image<Pixel>
const &
image,
113 afw::geom::ellipses::Quadrupole
const &
moments,
115 "image"_a,
"moments"_a,
"noiseSigma"_a = -1);
116 clsFitter.def(
"apply", [](Fitter
const &
self, afw::image::Image<double>
const &
image,
117 afw::geom::ellipses::Quadrupole
const &
moments,
119 "image"_a,
"moments"_a,
"noiseSigma"_a = -1);
120 clsFitter.def(
"apply", [](Fitter
const &
self, afw::image::Image<Pixel>
const &
image,
121 shapelet::MultiShapeletFunction
const &initial,
122 Scalar noiseSigma) {
return self.apply(
image, initial, noiseSigma); },
123 "image"_a,
"initial"_a,
"noiseSigma"_a = -1);
124 clsFitter.def(
"apply", [](Fitter
const &
self, afw::image::Image<double>
const &
image,
125 shapelet::MultiShapeletFunction
const &initial,
126 Scalar noiseSigma) {
return self.apply(
image, initial, noiseSigma); },
127 "image"_a,
"initial"_a,
"noiseSigma"_a = -1);
129 PyAlgorithm clsAlgorithm(mod,
"GeneralPsfFitterAlgorithm");
130 clsAlgorithm.attr(
"Control") = clsControl;
131 clsAlgorithm.attr(
"FAILURE") = py::cast(Algorithm::FAILURE);
132 clsAlgorithm.attr(
"MAX_INNER_ITERATIONS") = py::cast(Algorithm::MAX_INNER_ITERATIONS);
133 clsAlgorithm.attr(
"MAX_OUTER_ITERATIONS") = py::cast(Algorithm::MAX_OUTER_ITERATIONS);
134 clsAlgorithm.attr(
"EXCEPTION") = py::cast(Algorithm::EXCEPTION);
135 clsAlgorithm.attr(
"CONTAINS_NAN") = py::cast(Algorithm::CONTAINS_NAN);
136 clsAlgorithm.def(py::init<Control const &, afw::table::Schema &, std::string const &>(),
"ctrl"_a,
137 "schema"_a,
"prefix"_a);
138 clsAlgorithm.def(
"getKey", &Algorithm::getKey);
139 clsAlgorithm.def(
"measure",
140 (
void (Algorithm::*)(afw::table::SourceRecord &, afw::image::Image<double>
const &,
141 shapelet::MultiShapeletFunction
const &)
const) &
143 "measRecord"_a,
"image"_a,
"initial"_a);
144 clsAlgorithm.def(
"measure",
145 (
void (Algorithm::*)(afw::table::SourceRecord &, afw::image::Image<double>
const &,
146 afw::geom::ellipses::Quadrupole
const &)
const) &
148 "measRecord"_a,
"image"_a,
"moments"_a);
149 clsAlgorithm.def(
"fail", &Algorithm::fail,
"measRecord"_a,
"error"_a =
nullptr);
155 py::module::import(
"lsst.afw.image");
156 py::module::import(
"lsst.afw.geom.ellipses");
157 py::module::import(
"lsst.meas.base");
158 py::module::import(
"lsst.shapelet");
159 py::module::import(
"lsst.meas.modelfit.optimizer");
161 declareDoubleShapelet(mod);