LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
dipoleAlgorithms.cc
Go to the documentation of this file.
1/*
2 * LSST Data Management System
3 *
4 * This product includes software developed by the
5 * LSST Project (http://www.lsst.org/).
6 * See the COPYRIGHT file
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the LSST License Statement and
19 * the GNU General Public License along with this program. If not,
20 * see <https://www.lsstcorp.org/LegalNotices/>.
21 */
22
23#include "pybind11/pybind11.h"
24#include "pybind11/stl.h"
25
26#include <memory>
27#include <string>
28
31#include "lsst/pex/config/python.h" // for LSST_DECLARE_CONTROL_FIELD
32
33namespace py = pybind11;
34using namespace pybind11::literals;
35
36namespace lsst {
37namespace ip {
38namespace diffim {
39
40namespace {
41
42void declareDipoleCentroidControl(py::module &mod) {
43 py::class_<DipoleCentroidControl, std::shared_ptr<DipoleCentroidControl>> cls(mod,
44 "DipoleCentroidControl");
45
46 cls.def(py::init<>());
47}
48
49void declareDipoleFluxControl(py::module &mod) {
50 py::class_<DipoleFluxControl, std::shared_ptr<DipoleFluxControl>> cls(mod, "DipoleFluxControl");
51
52 cls.def(py::init<>());
53}
54
55void declareDipolePsfFluxControl(py::module &mod) {
56 py::class_<PsfDipoleFluxControl, std::shared_ptr<PsfDipoleFluxControl>, DipoleFluxControl> cls(
57 mod, "PsfDipoleFluxControl");
58
59 cls.def(py::init<>());
60
65}
66
67void declareDipoleCentroidAlgorithm(py::module &mod) {
68 // Abstract class, so add a leading underscore to Python name and do not wrap constructor
69 py::class_<DipoleCentroidAlgorithm, std::shared_ptr<DipoleCentroidAlgorithm>, meas::base::SimpleAlgorithm>
70 cls(mod, "_DipoleCentroidAlgorithm");
71
72 cls.attr("FAILURE") = py::cast(DipoleCentroidAlgorithm::FAILURE);
73 cls.attr("POS_FLAG") = py::cast(DipoleCentroidAlgorithm::POS_FLAG);
74 cls.attr("NEG_FLAG") = py::cast(DipoleCentroidAlgorithm::NEG_FLAG);
75 cls.def_static("getFlagDefinitions", &DipoleCentroidAlgorithm::getFlagDefinitions,
76 py::return_value_policy::copy);
77
78 cls.def("getPositiveKeys", &DipoleCentroidAlgorithm::getPositiveKeys);
79 cls.def("getNegativeKeys", &DipoleCentroidAlgorithm::getNegativeKeys);
80}
81
82void declareDipoleFluxAlgorithm(py::module &mod) {
83 // Abstract class, so add a leading underscore to Python name and do not wrap constructor
84 py::class_<DipoleFluxAlgorithm, std::shared_ptr<DipoleFluxAlgorithm>, meas::base::SimpleAlgorithm> cls(
85 mod, "_DipoleFluxAlgorithm");
86
87 cls.attr("FAILURE") = py::cast(DipoleFluxAlgorithm::FAILURE);
88 cls.attr("POS_FLAG") = py::cast(DipoleFluxAlgorithm::POS_FLAG);
89 cls.attr("NEG_FLAG") = py::cast(DipoleFluxAlgorithm::NEG_FLAG);
90 cls.def_static("getFlagDefinitions", &DipoleFluxAlgorithm::getFlagDefinitions,
91 py::return_value_policy::copy);
92
93 cls.def("getPositiveKeys", &DipoleFluxAlgorithm::getPositiveKeys);
94 cls.def("getNegativeKeys", &DipoleFluxAlgorithm::getNegativeKeys);
95}
96
97void declareNaiveDipoleFlux(py::module &mod) {
98 py::module::import("lsst.meas.base");
99
100 py::class_<NaiveDipoleFlux, std::shared_ptr<NaiveDipoleFlux>, DipoleFluxAlgorithm> cls(mod,
101 "NaiveDipoleFlux");
102
103 cls.def(py::init<NaiveDipoleFlux::Control const &, std::string const &, afw::table::Schema &>(), "ctrl"_a,
104 "name"_a, "schema"_a);
105
106 cls.def("measure", &NaiveDipoleFlux::measure, "measRecord"_a, "exposure"_a);
107 cls.def("fail", &NaiveDipoleFlux::fail, "measRecord"_a, "error"_a = NULL);
108}
109
110void declareNaiveDipoleCentroid(py::module &mod) {
111 py::class_<NaiveDipoleCentroid, std::shared_ptr<NaiveDipoleCentroid>, DipoleCentroidAlgorithm> cls(
112 mod, "NaiveDipoleCentroid");
113
114 cls.def(py::init<NaiveDipoleCentroid::Control const &, std::string const &, afw::table::Schema &>(),
115 "ctrl"_a, "name"_a, "schema"_a);
116
117 cls.def("getCenterKeys", &NaiveDipoleCentroid::getCenterKeys);
118 cls.def("getPositiveKeys", &NaiveDipoleCentroid::getPositiveKeys);
119 cls.def("getNegativeKeys", &NaiveDipoleCentroid::getNegativeKeys);
120
121 cls.def("measure", &NaiveDipoleCentroid::measure, "measRecord"_a, "exposure"_a);
122 cls.def("mergeCentroids", &NaiveDipoleCentroid::mergeCentroids, "source"_a, "posValue"_a, "negValue"_a);
123 cls.def("fail", &NaiveDipoleCentroid::fail, "measRecord"_a, "error"_a = NULL);
124}
125
126void declarePsfDipoleFlux(py::module &mod) {
127 py::class_<PsfDipoleFlux, std::shared_ptr<PsfDipoleFlux>, DipoleFluxAlgorithm> cls(mod, "PsfDipoleFlux");
128
129 cls.def(py::init<PsfDipoleFlux::Control const &, std::string const &, afw::table::Schema &>(), "ctrl"_a,
130 "name"_a, "schema"_a);
131
132 cls.def("chi2", &PsfDipoleFlux::chi2, "source"_a, "exposure"_a, "negCenterX"_a, "negCenterY"_a,
133 "negFlux"_a, "posCenterX"_a, "posCenterY"_a, "posFlux"_a);
134 cls.def("measure", &PsfDipoleFlux::measure, "measRecord"_a, "exposure"_a);
135 cls.def("fail", &PsfDipoleFlux::fail, "measRecord"_a, "error"_a = NULL);
136}
137
138} // namespace lsst::ip::diffim::<anonymous>
139
140PYBIND11_MODULE(_dipoleAlgorithms, mod) {
141 py::module::import("lsst.afw.table");
142 py::module::import("lsst.meas.base");
143 py::module::import("lsst.pex.config");
144
145 declareDipoleCentroidControl(mod);
146 declareDipoleFluxControl(mod);
147 declareDipolePsfFluxControl(mod);
148 declareDipoleCentroidAlgorithm(mod);
149 declareDipoleFluxAlgorithm(mod);
150 declareNaiveDipoleFlux(mod);
151 declareNaiveDipoleCentroid(mod);
152 declarePsfDipoleFlux(mod);
153}
154
155} // diffim
156} // ip
157} // lsst
ResultKey const & getPositiveKeys() const
Return the standard centroid keys registered by this algorithm.
static meas::base::FlagDefinition const FAILURE
static meas::base::FlagDefinition const POS_FLAG
ResultKey const & getNegativeKeys() const
static meas::base::FlagDefinition const NEG_FLAG
static meas::base::FlagDefinitionList const & getFlagDefinitions()
static meas::base::FlagDefinitionList const & getFlagDefinitions()
ResultKey const & getPositiveKeys() const
Return the standard flux keys registered by this algorithm.
static meas::base::FlagDefinition const POS_FLAG
static meas::base::FlagDefinition const NEG_FLAG
ResultKey const & getNegativeKeys() const
static meas::base::FlagDefinition const FAILURE
ResultKey const & getPositiveKeys() const
ResultKey const & getNegativeKeys() const
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Given an image and a pixel position, return a Centroid using a naive 3x3 weighted moment.
void mergeCentroids(afw::table::SourceRecord &source, double posValue, double negValue) const
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record.
ResultKey const & getCenterKeys() const
Return the standard centroid keys registered by this algorithm.
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Given an image and a pixel position, return a Centroid using a naive 3x3 weighted moment.
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record.
std::pair< double, int > chi2(afw::table::SourceRecord &source, afw::image::Exposure< float > const &exposure, double negCenterX, double negCenterY, double negFlux, double posCenterX, double poCenterY, double posFlux) const
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Called to measure a single child source in an image.
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record.
PYBIND11_MODULE(basisLists, mod)
Definition: basisLists.cc:39
A base class for image defects.
#define LSST_DECLARE_CONTROL_FIELD(WRAPPER, CLASS, NAME)
Macro used to wrap fields declared by LSST_CONTROL_FIELD using Pybind11.
Definition: python.h:50