LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
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_>
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
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