LSST Applications g04e9c324dd+8c5ae1fdc5,g134cb467dc+1b3060144d,g18429d2f64+f642bf4753,g199a45376c+0ba108daf9,g1fd858c14a+2dcf163641,g262e1987ae+7b8c96d2ca,g29ae962dfc+3bd6ecb08a,g2cef7863aa+aef1011c0b,g35bb328faa+8c5ae1fdc5,g3fd5ace14f+53e1a9e7c5,g4595892280+fef73a337f,g47891489e3+2efcf17695,g4d44eb3520+642b70b07e,g53246c7159+8c5ae1fdc5,g67b6fd64d1+2efcf17695,g67fd3c3899+b70e05ef52,g74acd417e5+317eb4c7d4,g786e29fd12+668abc6043,g87389fa792+8856018cbb,g89139ef638+2efcf17695,g8d7436a09f+3be3c13596,g8ea07a8fe4+9f5ccc88ac,g90f42f885a+a4e7b16d9b,g97be763408+ad77d7208f,g9dd6db0277+b70e05ef52,ga681d05dcb+a3f46e7fff,gabf8522325+735880ea63,gac2eed3f23+2efcf17695,gb89ab40317+2efcf17695,gbf99507273+8c5ae1fdc5,gd8ff7fe66e+b70e05ef52,gdab6d2f7ff+317eb4c7d4,gdc713202bf+b70e05ef52,gdfd2d52018+b10e285e0f,ge365c994fd+310e8507c4,ge410e46f29+2efcf17695,geaed405ab2+562b3308c0,gffca2db377+8c5ae1fdc5,w.2025.35
LSST Data Management Base Package
Loading...
Searching...
No Matches
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();
82
83template <typename Ellipticity_, typename Radius_>
86 : _ellipticity(complex), _radius(radius) {
87 if (normalize) this->normalize();
89
90template <typename Ellipticity_, typename Radius_>
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);
131 return lhs * rhs;
132}
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;
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
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
Radius const & getRadius() const
Definition Separable.h:63
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