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
radii.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2008, 2009, 2010 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24
25#ifndef LSST_AFW_GEOM_ELLIPSES_radii_h_INCLUDED
26#define LSST_AFW_GEOM_ELLIPSES_radii_h_INCLUDED
27
28/*
29 * Helper classes defining radii for Separable core.
30 *
31 * Note: do not include directly; use the main ellipse header file.
32 */
33
36#include <complex>
37
38namespace lsst {
39namespace afw {
40namespace geom {
41namespace ellipses {
42
43template <typename Ellipticity_, typename Radius_>
44class Separable;
45
46class DeterminantRadius;
47class TraceRadius;
48class LogDeterminantRadius;
49class LogTraceRadius;
50
57class DeterminantRadius final {
58public:
59 void normalize() {
60 if (_value < 0)
62 "Ellipse radius cannot be negative.");
63 }
64
65 static std::string getName() { return "DeterminantRadius"; }
66
67 explicit DeterminantRadius(double value = 1.0) : _value(value) {}
68
69 explicit DeterminantRadius(LogDeterminantRadius const &other);
70
73 ~DeterminantRadius() = default;
74
75 operator double const &() const { return _value; }
76
77 operator double &() { return _value; }
78
80 _value = value;
81 return *this;
82 }
83
87
92
93private:
94 template <typename T1, typename T2>
95 friend class Separable;
96
97 void assignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
98
99 BaseCore::Jacobian dAssignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
100
101 void assignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy, double &ixy) const;
102
103 BaseCore::Jacobian dAssignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy,
104 double &ixy) const;
105
106 double _value;
107};
108
114class TraceRadius final {
115public:
116 void normalize() {
117 if (_value < 0)
119 "Ellipse radius cannot be negative.");
120 }
121
122 static std::string getName() { return "TraceRadius"; }
123
124 explicit TraceRadius(double value = 1.0) : _value(value) {}
125
126 explicit TraceRadius(LogTraceRadius const &other);
127
128 TraceRadius(TraceRadius const &) = default;
130 ~TraceRadius() = default;
131
132 operator double const &() const { return _value; }
133
134 operator double &() { return _value; }
135
136 TraceRadius &operator=(double value) {
137 _value = value;
138 return *this;
139 }
140
141 TraceRadius &operator=(LogTraceRadius const &other);
142 TraceRadius &operator=(TraceRadius const &) = default;
144
149
150private:
151 template <typename T1, typename T2>
152 friend class Separable;
153
154 void assignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
155
156 BaseCore::Jacobian dAssignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
157
158 void assignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy, double &ixy) const;
159
160 BaseCore::Jacobian dAssignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy,
161 double &ixy) const;
162
163 double _value;
164};
165
170public:
171 void normalize() {}
172
173 static std::string getName() { return "LogDeterminantRadius"; }
174
175 explicit LogDeterminantRadius(double value = 0.0) : _value(value) {}
176
177 explicit LogDeterminantRadius(DeterminantRadius const &other);
178
182
183 operator double const &() const { return _value; }
184
185 operator double &() { return _value; }
186
188 _value = value;
189 return *this;
190 }
191
195
200
201private:
202 template <typename T1, typename T2>
203 friend class Separable;
204
205 void assignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
206
207 BaseCore::Jacobian dAssignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
208
209 void assignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy, double &ixy) const;
210
211 BaseCore::Jacobian dAssignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy,
212 double &ixy) const;
213
214 double _value;
215};
216
220class LogTraceRadius final {
221public:
222 void normalize() {}
223
224 static std::string getName() { return "LogTraceRadius"; }
225
226 explicit LogTraceRadius(double value = 0.0) : _value(value) {}
227
228 explicit LogTraceRadius(TraceRadius const &other);
229
230 LogTraceRadius(LogTraceRadius const &) = default;
232 ~LogTraceRadius() = default;
233
234 operator double const &() const { return _value; }
235
236 operator double &() { return _value; }
237
238 LogTraceRadius &operator=(double value) {
239 _value = value;
240 return *this;
241 }
242
243 LogTraceRadius &operator=(TraceRadius const &value);
246
251
252private:
253 template <typename T1, typename T2>
254 friend class Separable;
255
256 void assignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
257
258 BaseCore::Jacobian dAssignFromQuadrupole(double ixx, double iyy, double ixy, Distortion &distortion);
259
260 void assignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy, double &ixy) const;
261
262 BaseCore::Jacobian dAssignToQuadrupole(Distortion const &distortion, double &ixx, double &iyy,
263 double &ixy) const;
264
265 double _value;
266};
267
268inline DeterminantRadius::DeterminantRadius(LogDeterminantRadius const &other) : _value(std::exp(other)) {}
269inline TraceRadius::TraceRadius(LogTraceRadius const &other) : _value(std::exp(other)) {}
271inline LogTraceRadius::LogTraceRadius(TraceRadius const &other) : _value(std::log(other)) {}
272
274 _value = std::exp(other);
275 return *this;
276}
277
279 _value = std::exp(other);
280 return *this;
281}
282
284 _value = std::log(other);
285 return *this;
286}
287
289 _value = std::log(other);
290 return *this;
291}
292} // namespace ellipses
293} // namespace geom
294} // namespace afw
295} // namespace lsst
296
297#endif // !LSST_AFW_GEOM_ELLIPSES_radii_h_INCLUDED
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
Eigen::Matrix3d Jacobian
Parameter Jacobian matrix type.
Definition: BaseCore.h:64
The radius defined as the 4th root of the determinant of the quadrupole matrix.
Definition: radii.h:57
DeterminantRadius(DeterminantRadius &&)=default
DeterminantRadius & operator=(DeterminantRadius const &)=default
DeterminantRadius & operator=(double value)
Definition: radii.h:79
DeterminantRadius(DeterminantRadius const &)=default
DeterminantRadius & operator=(LogTraceRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
DeterminantRadius & operator=(TraceRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
DeterminantRadius & operator=(DeterminantRadius &&)=default
A complex ellipticity with magnitude .
Definition: Distortion.h:44
The natural logarithm of the DeterminantRadius.
Definition: radii.h:169
LogDeterminantRadius & operator=(LogTraceRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
LogDeterminantRadius & operator=(TraceRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
LogDeterminantRadius & operator=(double value)
Definition: radii.h:187
LogDeterminantRadius(LogDeterminantRadius &&)=default
LogDeterminantRadius & operator=(LogDeterminantRadius &&)=default
LogDeterminantRadius & operator=(LogDeterminantRadius const &)=default
LogDeterminantRadius(LogDeterminantRadius const &)=default
The natural logarithm of the TraceRadius.
Definition: radii.h:220
LogTraceRadius(LogTraceRadius &&)=default
LogTraceRadius & operator=(LogTraceRadius const &)=default
LogTraceRadius(LogTraceRadius const &)=default
LogTraceRadius & operator=(double value)
Definition: radii.h:238
LogTraceRadius & operator=(LogTraceRadius &&)=default
LogTraceRadius & operator=(DeterminantRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
LogTraceRadius & operator=(LogDeterminantRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
An ellipse core with a complex ellipticity and radius parameterization.
Definition: Separable.h:50
The radius defined as .
Definition: radii.h:114
TraceRadius(TraceRadius const &)=default
TraceRadius(TraceRadius &&)=default
TraceRadius & operator=(TraceRadius const &)=default
TraceRadius & operator=(LogDeterminantRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
TraceRadius & operator=(TraceRadius &&)=default
TraceRadius & operator=(DeterminantRadius const &)=delete
Conversion between trace and determinant radii requires ellipticity.
static std::string getName()
Definition: radii.h:122
TraceRadius & operator=(double value)
Definition: radii.h:136
Reports invalid arguments.
Definition: Runtime.h:66
T exp(T... args)
T log(T... args)
A base class for image defects.
STL namespace.