Loading [MathJax]/extensions/tex2jax.js
LSST Applications g0fba68d861+849f694866,g1fd858c14a+7a7b9dd5ed,g2c84ff76c0+5cb23283cf,g30358e5240+f0e04ebe90,g35bb328faa+fcb1d3bbc8,g436fd98eb5+bdc6fcdd04,g4af146b050+742274f7cd,g4d2262a081+9d5bd0394b,g4e0f332c67+cb09b8a5b6,g53246c7159+fcb1d3bbc8,g5a012ec0e7+477f9c599b,g60b5630c4e+bdc6fcdd04,g67b6fd64d1+2218407a0c,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g87b7deb4dc+777438113c,g8852436030+ebf28f0d95,g89139ef638+2218407a0c,g9125e01d80+fcb1d3bbc8,g989de1cb63+2218407a0c,g9f33ca652e+42fb53f4c8,g9f7030ddb1+11b9b6f027,ga2b97cdc51+bdc6fcdd04,gab72ac2889+bdc6fcdd04,gabe3b4be73+1e0a283bba,gabf8522325+3210f02652,gb1101e3267+9c79701da9,gb58c049af0+f03b321e39,gb89ab40317+2218407a0c,gcf25f946ba+ebf28f0d95,gd6cbbdb0b4+e8f9c9c900,gd9a9a58781+fcb1d3bbc8,gde0f65d7ad+47bbabaf80,gded526ad44+8c3210761e,ge278dab8ac+3ef3db156b,ge410e46f29+2218407a0c,gf67bdafdda+2218407a0c,v29.0.0.rc3
LSST Data Management Base Package
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
photometryKron.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 <cstdint>
27
28#include "lsst/pex/config/python.h" // defines LSST_DECLARE_CONTROL_FIELD
29#include "lsst/geom/Point.h"
36
37namespace py = pybind11;
38using namespace pybind11::literals;
39
40namespace lsst {
41namespace meas {
42namespace extensions {
43namespace photometryKron {
44
45namespace {
46
47void declareKronFluxControl(py::module &mod) {
48 py::class_<KronFluxControl> cls(mod, "KronFluxControl");
49
50 cls.def(py::init<>());
51
53 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, nSigmaForRadius);
54 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, nIterForRadius);
55 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, nRadiusForFlux);
58 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, enforceMinimumRadius);
59 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, useFootprintRadius);
60 LSST_DECLARE_CONTROL_FIELD(cls, KronFluxControl, smoothingSigma);
62}
63
64void declareKronFluxAlgorithm(py::module &mod) {
65 py::class_<KronFluxAlgorithm, std::shared_ptr<KronFluxAlgorithm>, base::SimpleAlgorithm> cls(
66 mod, "KronFluxAlgorithm");
67
68 cls.def_static("getFlagDefinitions", &KronFluxAlgorithm::getFlagDefinitions,
69 py::return_value_policy::copy);
70 cls.attr("FAILURE") = py::cast(KronFluxAlgorithm::FAILURE);
71 cls.attr("EDGE") = py::cast(KronFluxAlgorithm::EDGE);
72 cls.attr("BAD_SHAPE_NO_PSF") = py::cast(KronFluxAlgorithm::BAD_SHAPE_NO_PSF);
73 cls.attr("NO_MINIMUM_RADIUS") = py::cast(KronFluxAlgorithm::NO_MINIMUM_RADIUS);
74 cls.attr("NO_FALLBACK_RADIUS") = py::cast(KronFluxAlgorithm::NO_FALLBACK_RADIUS);
75 cls.attr("BAD_RADIUS") = py::cast(KronFluxAlgorithm::BAD_RADIUS);
76 cls.attr("USED_MINIMUM_RADIUS") = py::cast(KronFluxAlgorithm::USED_MINIMUM_RADIUS);
77 cls.attr("USED_PSF_RADIUS") = py::cast(KronFluxAlgorithm::USED_PSF_RADIUS);
78 cls.attr("SMALL_RADIUS") = py::cast(KronFluxAlgorithm::SMALL_RADIUS);
79 cls.attr("BAD_SHAPE") = py::cast(KronFluxAlgorithm::BAD_SHAPE);
80
81 cls.def(py::init<KronFluxAlgorithm::Control const &, std::string const &, afw::table::Schema &,
82 daf::base::PropertySet &>(),
83 "ctrl"_a, "name"_a, "schema"_a, "metadata"_a);
84
85 cls.def("measure", &KronFluxAlgorithm::measure, "measRecord"_a, "exposure"_a);
86 cls.def("measureForced", &KronFluxAlgorithm::measureForced, "measRecord"_a, "exposure"_a, "refRecord"_a,
87 "refWcs"_a);
88 cls.def("fail", &KronFluxAlgorithm::fail, "measRecord"_a, "error"_a = NULL);
89}
90
91using PyKronAperture = py::class_<KronAperture>;
92
99template <typename ImageT>
100void declareKronApertureTemplatedMethods(PyKronAperture &cls) {
101 cls.def_static("determineRadius", &KronAperture::determineRadius<ImageT>, "image"_a, "axes"_a, "center"_a,
102 "ctrl"_a);
103 cls.def("measureFlux", &KronAperture::measureFlux<ImageT>, "image"_a, "nRadiusForFlux"_a,
104 "maxSincRadius"_a);
105}
106
107void declareKronAperture(py::module &mod) {
108 PyKronAperture cls(mod, "KronAperture");
109
110 cls.def(py::init<geom::Point2D const &, afw::geom::ellipses::BaseCore const &, float>(), "center"_a,
111 "core"_a, "radiusForRadius"_a = std::nanf(""));
112 cls.def(py::init<afw::table::SourceRecord const &, float>(), "source"_a,
113 "radiusForRadius"_a = std::nanf(""));
114 cls.def(py::init<afw::table::SourceRecord const &, geom::AffineTransform const &, double, float>(),
115 "reference"_a, "refToMeas"_a, "radius"_a, "radiusForRadius"_a = std::nanf(""));
116
117 cls.def_static("getKronAxes", &KronAperture::getKronAxes, "shape"_a, "transformation"_a, "radius"_a);
118
119 cls.def("getX", &KronAperture::getX);
120 cls.def("getY", &KronAperture::getY);
121 cls.def("getRadiusForRadius", &KronAperture::getRadiusForRadius);
122 cls.def("getCenter", &KronAperture::getCenter);
123 cls.def("getAxes", (afw::geom::ellipses::Axes & (KronAperture::*)()) & KronAperture::getAxes,
124 py::return_value_policy::reference_internal);
125 cls.def("transform", &KronAperture::transform, "trans"_a);
126
127 declareKronApertureTemplatedMethods<afw::image::MaskedImage<float>>(cls);
128}
129
130} // <anonymous>
131
133 py::module::import("lsst.afw.geom");
134 py::module::import("lsst.afw.image");
135 py::module::import("lsst.afw.table");
136 py::module::import("lsst.daf.base");
137
138 declareKronFluxControl(mod);
139 declareKronFluxAlgorithm(mod);
140 declareKronAperture(mod);
141}
142
143} // photometryKron
144} // extensions
145} // meas
146} // lsst
std::pair< double, double > measureFlux(ImageT const &image, double const nRadiusForFlux, double const maxSincRadius) const
Photometer within the Kron Aperture on an image.
std::shared_ptr< KronAperture > transform(geom::AffineTransform const &trans) const
Transform a Kron Aperture to a different frame.
static afw::geom::ellipses::Axes getKronAxes(afw::geom::ellipses::Axes const &shape, geom::LinearTransform const &transformation, double const radius)
Determine Kron axes from a reference image.
static std::shared_ptr< KronAperture > determineRadius(ImageT const &image, afw::geom::ellipses::Axes axes, geom::Point2D const &center, KronFluxControl const &ctrl)
Determine the Kron Aperture from an image.
static meas::base::FlagDefinition const BAD_RADIUS
static meas::base::FlagDefinition const USED_MINIMUM_RADIUS
static meas::base::FlagDefinition const FAILURE
static meas::base::FlagDefinition const SMALL_RADIUS
KronFluxControl Control
A typedef to the Control object for this algorithm, defined above.
virtual 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.
virtual void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Called to measure a single child source in an image.
static meas::base::FlagDefinition const BAD_SHAPE
static meas::base::FlagDefinitionList const & getFlagDefinitions()
virtual void measureForced(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure, afw::table::SourceRecord const &refRecord, afw::geom::SkyWcs const &refWcs) const
Called to measure a single child source in an image.
static meas::base::FlagDefinition const EDGE
static meas::base::FlagDefinition const NO_MINIMUM_RADIUS
static meas::base::FlagDefinition const NO_FALLBACK_RADIUS
static meas::base::FlagDefinition const BAD_SHAPE_NO_PSF
static meas::base::FlagDefinition const USED_PSF_RADIUS
T nanf(T... args)
#define LSST_DECLARE_CONTROL_FIELD(WRAPPER, CLASS, NAME)
Macro used to wrap fields declared by LSST_CONTROL_FIELD using Pybind11.
Definition python.h:50