LSST Applications g042eb84c57+730a74494b,g04e9c324dd+8c5ae1fdc5,g134cb467dc+1f1e3e7524,g199a45376c+0ba108daf9,g1fd858c14a+fa7d31856b,g210f2d0738+f66ac109ec,g262e1987ae+83a3acc0e5,g29ae962dfc+d856a2cb1f,g2cef7863aa+aef1011c0b,g35bb328faa+8c5ae1fdc5,g3fd5ace14f+a1e0c9f713,g47891489e3+0d594cb711,g4d44eb3520+c57ec8f3ed,g4d7b6aa1c5+f66ac109ec,g53246c7159+8c5ae1fdc5,g56a1a4eaf3+fd7ad03fde,g64539dfbff+f66ac109ec,g67b6fd64d1+0d594cb711,g67fd3c3899+f66ac109ec,g6985122a63+0d594cb711,g74acd417e5+3098891321,g786e29fd12+668abc6043,g81db2e9a8d+98e2ab9f28,g87389fa792+8856018cbb,g89139ef638+0d594cb711,g8d7436a09f+80fda9ce03,g8ea07a8fe4+760ca7c3fc,g90f42f885a+033b1d468d,g97be763408+a8a29bda4b,g99822b682c+e3ec3c61f9,g9d5c6a246b+0d5dac0c3d,ga41d0fce20+9243b26dd2,gbf99507273+8c5ae1fdc5,gd7ef33dd92+0d594cb711,gdab6d2f7ff+3098891321,ge410e46f29+0d594cb711,geaed405ab2+c4bbc419c6,gf9a733ac38+8c5ae1fdc5,w.2025.38
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