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
Separable.cc
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 */
29
30namespace lsst {
31namespace afw {
32namespace geom {
33namespace ellipses {
34
35template <typename Ellipticity_, typename Radius_>
36BaseCore::Registrar<Separable<Ellipticity_, Radius_> > Separable<Ellipticity_, Radius_>::registrar;
37
38template <typename Ellipticity_, typename Radius_>
40 return "Separable" + Ellipticity_::getName() + Radius_::getName();
41}
42
43template <typename Ellipticity_, typename Radius_>
45 _ellipticity.normalize();
46 _radius.normalize();
47}
48
49template <typename Ellipticity_, typename Radius_>
51 setE1(*iter++);
52 setE2(*iter++);
53 setRadius(*iter++);
54}
55
56template <typename Ellipticity_, typename Radius_>
58 *iter++ = getE1();
59 *iter++ = getE2();
60 *iter++ = getRadius();
61}
62
63template <typename Ellipticity_, typename Radius_>
66 _ellipticity = other._ellipticity;
67 _radius = other._radius;
68 return *this;
69}
70
71// Delegate to copy-constructor for backwards compatibility
72template <typename Ellipticity_, typename Radius_>
75 return *this = other;
76}
77template <typename Ellipticity_, typename Radius_>
78Separable<Ellipticity_, Radius_>::Separable(double e1, double e2, double radius, bool normalize)
79 : _ellipticity(e1, e2), _radius(radius) {
80 if (normalize) this->normalize();
81}
82
83template <typename Ellipticity_, typename Radius_>
85 bool normalize)
86 : _ellipticity(complex), _radius(radius) {
87 if (normalize) this->normalize();
88}
89
90template <typename Ellipticity_, typename Radius_>
91Separable<Ellipticity_, Radius_>::Separable(Ellipticity const& ellipticity, double radius, bool normalize)
92 : _ellipticity(ellipticity), _radius(radius) {
93 if (normalize) this->normalize();
94}
95
96template <typename Ellipticity_, typename Radius_>
98 : _ellipticity(vector[0], vector[1]), _radius(vector[2]) {
99 if (normalize) this->normalize();
100}
101
102template <typename Ellipticity_, typename Radius_>
103void Separable<Ellipticity_, Radius_>::_assignToQuadrupole(double& ixx, double& iyy, double& ixy) const {
104 Distortion distortion(_ellipticity);
105 _radius.assignToQuadrupole(distortion, ixx, iyy, ixy);
106}
107
108template <typename Ellipticity_, typename Radius_>
110 double& ixy) const {
111 Distortion distortion;
112 BaseCore::Jacobian rhs = Jacobian::Identity();
113 rhs.block<2, 2>(0, 0) = distortion.dAssign(_ellipticity);
114 BaseCore::Jacobian lhs = _radius.dAssignToQuadrupole(distortion, ixx, iyy, ixy);
115 return lhs * rhs;
116}
117
118template <typename Ellipticity_, typename Radius_>
119void Separable<Ellipticity_, Radius_>::_assignToAxes(double& a, double& b, double& theta) const {
120 double ixx, iyy, ixy;
121 this->_assignToQuadrupole(ixx, iyy, ixy);
122 BaseCore::_assignQuadrupoleToAxes(ixx, iyy, ixy, a, b, theta);
123}
124
125template <typename Ellipticity_, typename Radius_>
127 double& theta) const {
128 double ixx, iyy, ixy;
129 BaseCore::Jacobian rhs = this->_dAssignToQuadrupole(ixx, iyy, ixy);
130 BaseCore::Jacobian lhs = BaseCore::_dAssignQuadrupoleToAxes(ixx, iyy, ixy, a, b, theta);
131 return lhs * rhs;
132}
133
134template <typename Ellipticity_, typename Radius_>
135void Separable<Ellipticity_, Radius_>::_assignFromQuadrupole(double ixx, double iyy, double ixy) {
136 Distortion distortion;
137 _radius.assignFromQuadrupole(ixx, iyy, ixy, distortion);
138 _ellipticity = distortion;
139}
140
141template <typename Ellipticity_, typename Radius_>
143 double ixy) {
144 Distortion distortion;
145 BaseCore::Jacobian rhs = _radius.dAssignFromQuadrupole(ixx, iyy, ixy, distortion);
146 BaseCore::Jacobian lhs = BaseCore::Jacobian::Identity();
147 lhs.block<2, 2>(0, 0) = _ellipticity.dAssign(distortion);
148 return lhs * rhs;
149}
150
151template <typename Ellipticity_, typename Radius_>
152void Separable<Ellipticity_, Radius_>::_assignFromAxes(double a, double b, double theta) {
153 double ixx, iyy, ixy;
154 BaseCore::_assignAxesToQuadrupole(a, b, theta, ixx, iyy, ixy);
155 this->_assignFromQuadrupole(ixx, iyy, ixy);
156}
157
158template <typename Ellipticity_, typename Radius_>
160 double ixx, iyy, ixy;
161 BaseCore::Jacobian rhs = BaseCore::_dAssignAxesToQuadrupole(a, b, theta, ixx, iyy, ixy);
162 BaseCore::Jacobian lhs = this->_dAssignFromQuadrupole(ixx, iyy, ixy);
163 return lhs * rhs;
164}
165
170
175
180} // namespace ellipses
181} // namespace geom
182} // namespace afw
183} // namespace lsst
table::Key< int > b
table::Key< int > a
static Jacobian _dAssignAxesToQuadrupole(double a, double b, double theta, double &ixx, double &iyy, double &ixy)
Return the size of the bounding box for the ellipse core.
Definition: BaseCore.cc:231
Eigen::Vector3d ParameterVector
Parameter vector type.
Definition: BaseCore.h:63
static void _assignAxesToQuadrupole(double a, double b, double theta, double &ixx, double &iyy, double &ixy)
Return the size of the bounding box for the ellipse core.
Definition: BaseCore.cc:218
static Jacobian _dAssignQuadrupoleToAxes(double ixx, double iyy, double ixy, double &a, double &b, double &theta)
Return the size of the bounding box for the ellipse core.
Definition: BaseCore.cc:193
static void _assignQuadrupoleToAxes(double ixx, double iyy, double ixy, double &a, double &b, double &theta)
Return the size of the bounding box for the ellipse core.
Definition: BaseCore.cc:183
Eigen::Matrix3d Jacobian
Parameter Jacobian matrix type.
Definition: BaseCore.h:64
A complex ellipticity with magnitude .
Definition: Distortion.h:44
Jacobian dAssign(Distortion const &other)
Definition: Distortion.h:70
An ellipse core with a complex ellipticity and radius parameterization.
Definition: Separable.h:50
Jacobian _dAssignToQuadrupole(double &ixx, double &iyy, double &ixy) const override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:109
void readParameters(double const *iter) override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:50
Jacobian _dAssignToAxes(double &a, double &b, double &theta) const override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:126
void _assignToAxes(double &a, double &b, double &theta) const override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:119
Separable & operator=(Separable const &other)
Standard assignment.
Definition: Separable.cc:64
void _assignFromAxes(double a, double b, double theta) override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:152
Separable(double e1=0.0, double e2=0.0, double radius=Radius(), bool normalize=true)
Construct from parameter values.
Definition: Separable.cc:78
Jacobian _dAssignFromAxes(double a, double b, double theta) override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:159
void _assignFromQuadrupole(double ixx, double iyy, double ixy) override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:135
void _assignToQuadrupole(double &ixx, double &iyy, double &ixy) const override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:103
std::string getName() const override
Return a string that identifies this parametrization.
Definition: Separable.cc:39
void writeParameters(double *iter) const override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:57
Jacobian _dAssignFromQuadrupole(double ixx, double iyy, double ixy) override
Return the size of the bounding box for the ellipse core.
Definition: Separable.cc:142
void normalize() override
Put the parameters into a "standard form", and throw InvalidParameterError if they cannot be normaliz...
Definition: Separable.cc:44
A base class for image defects.