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
BaseCore.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_BaseCore_h_INCLUDED
26#define LSST_AFW_GEOM_ELLIPSES_BaseCore_h_INCLUDED
27
28/*
29 * Forward declarations, typedefs, and definitions for BaseCore.
30 *
31 * Note: do not include directly; use the main ellipse header file.
32 */
33
34#include <memory>
35
36#include "Eigen/Core"
37
38#include "lsst/pex/exceptions.h"
40
41namespace lsst {
42namespace afw {
43namespace geom {
44namespace ellipses {
45
46class Parametric;
47
55class BaseCore {
56public:
57 class Transformer;
58 class GridTransform;
59 class Convolution;
60 template <typename Output>
61 struct Converter;
62
63 using ParameterVector = Eigen::Vector3d;
64 using Jacobian = Eigen::Matrix3d;
65
66 static std::shared_ptr<BaseCore> make(std::string const& name);
67
69
70 static std::shared_ptr<BaseCore> make(std::string const& name, double v1, double v2, double v3);
71
72 static std::shared_ptr<BaseCore> make(std::string const& name, BaseCore const& other);
73
74 static std::shared_ptr<BaseCore> make(std::string const& name, Transformer const& other);
75
76 static std::shared_ptr<BaseCore> make(std::string const& name, Convolution const& other);
77
79 virtual std::string getName() const = 0;
80
83
88 virtual void normalize() = 0;
89
91 void grow(double buffer);
92
94 void scale(double factor);
95
97 double getArea() const;
98
105 double getDeterminantRadius() const;
106
112 double getTraceRadius() const;
113
125
132 GridTransform const getGridTransform() const;
133
138 Convolution convolve(BaseCore const& other);
139 Convolution const convolve(BaseCore const& other) const;
141
144
145 virtual void readParameters(double const* iter) = 0;
146
147 virtual void writeParameters(double* iter) const = 0;
148
151
153 void setParameterVector(ParameterVector const& vector);
154
160 bool operator==(BaseCore const& other) const;
161
167 bool operator!=(BaseCore const& other) const { return !operator==(other); }
168
174 BaseCore& operator=(BaseCore const& other);
175 BaseCore& operator=(BaseCore&& other);
176
178 Jacobian dAssign(BaseCore const& other);
179
183 template <typename Output>
184 Converter<Output> as() const;
185
186 virtual ~BaseCore() = default;
187
188protected:
189 friend class Parametric;
190
191 BaseCore() = default;
192
193 static void registerSubclass(std::shared_ptr<BaseCore> const& example);
194
195 template <typename T>
196 struct Registrar {
197 Registrar() { registerSubclass(std::make_shared<T>()); }
198 };
199
201
202 static void _assignQuadrupoleToAxes(double ixx, double iyy, double ixy, double& a, double& b,
203 double& theta);
204
205 static Jacobian _dAssignQuadrupoleToAxes(double ixx, double iyy, double ixy, double& a, double& b,
206 double& theta);
207
208 static void _assignAxesToQuadrupole(double a, double b, double theta, double& ixx, double& iyy,
209 double& ixy);
210
211 static Jacobian _dAssignAxesToQuadrupole(double a, double b, double theta, double& ixx, double& iyy,
212 double& ixy);
213
214 virtual void _assignToQuadrupole(double& ixx, double& iyy, double& ixy) const = 0;
215 virtual void _assignFromQuadrupole(double ixx, double iyy, double ixy) = 0;
216
217 virtual void _assignToAxes(double& a, double& b, double& theta) const = 0;
218 virtual void _assignFromAxes(double a, double b, double theta) = 0;
219
220 virtual Jacobian _dAssignToQuadrupole(double& ixx, double& iyy, double& ixy) const = 0;
221 virtual Jacobian _dAssignFromQuadrupole(double ixx, double iyy, double ixy) = 0;
222
223 virtual Jacobian _dAssignToAxes(double& a, double& b, double& theta) const = 0;
224 virtual Jacobian _dAssignFromAxes(double a, double b, double theta) = 0;
225};
226
227template <typename Output>
230
231 explicit Converter(BaseCore const& input_) : input(input_) {}
232
233 operator Output() const { return Output(input); }
234 std::shared_ptr<Output> copy() const { return std::shared_ptr<Output>(new Output(input)); }
235};
236
237template <typename Output>
239 return Converter<Output>(*this);
240}
241} // namespace ellipses
242} // namespace geom
243} // namespace afw
244} // namespace lsst
245
246#endif // !LSST_AFW_GEOM_ELLIPSES_BaseCore_h_INCLUDED
table::Key< int > transform
table::Key< int > b
A temporary-only expression object for ellipse core convolution.
Definition Convolution.h:44
A temporary-only expression object representing an lsst::geom::LinearTransform that maps the ellipse ...
A temporary-only expression object for ellipse core transformations.
Definition Transformer.h:49
A base class for parametrizations of the "core" of an ellipse - the ellipticity and size.
Definition BaseCore.h:55
GridTransform const getGridTransform() const
Return the transform that maps the ellipse to the unit circle.
virtual void writeParameters(double *iter) const =0
Return the size of the bounding box for the ellipse core.
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
std::shared_ptr< BaseCore > clone() const
Deep-copy the Core.
Definition BaseCore.h:82
Convolution convolve(BaseCore const &other)
Return the size of the bounding box for the ellipse core.
Definition Convolution.h:91
Eigen::Vector3d ParameterVector
Parameter vector type.
Definition BaseCore.h:63
static void registerSubclass(std::shared_ptr< BaseCore > const &example)
Return the size of the bounding box for the ellipse core.
Definition BaseCore.cc:91
virtual std::shared_ptr< BaseCore > _clone() const =0
Return the size of the bounding box for the ellipse core.
bool operator!=(BaseCore const &other) const
Compare two ellipse cores for inequality.
Definition BaseCore.h:167
void scale(double factor)
Scale the size of the ellipse core by the given factor.
Definition BaseCore.cc:103
virtual void readParameters(double const *iter)=0
Return the size of the bounding box for the ellipse core.
double getArea() const
Return the area of the ellipse core.
Definition BaseCore.cc:111
virtual void _assignToQuadrupole(double &ixx, double &iyy, double &ixy) const =0
Return the size of the bounding box for the ellipse core.
void setParameterVector(ParameterVector const &vector)
Set the core parameters from a vector.
Definition BaseCore.cc:149
virtual Jacobian _dAssignToQuadrupole(double &ixx, double &iyy, double &ixy) const =0
Return the size of the bounding box for the ellipse core.
virtual std::string getName() const =0
Return a string that identifies this parametrization.
BaseCore()=default
Return the size of the bounding box for the ellipse core.
virtual void _assignToAxes(double &a, double &b, double &theta) const =0
Return the size of the bounding box for the ellipse core.
double getDeterminantRadius() const
Return the radius defined as the 4th root of the determinant of the quadrupole matrix.
Definition BaseCore.cc:117
bool operator==(BaseCore const &other) const
Compare two ellipse cores for equality.
Definition BaseCore.cc:151
virtual Jacobian _dAssignFromQuadrupole(double ixx, double iyy, double ixy)=0
Return the size of the bounding box for the ellipse core.
lsst::geom::Extent2D computeDimensions() const
Return the size of the bounding box for the ellipse core.
Definition BaseCore.cc:129
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
virtual void _assignFromQuadrupole(double ixx, double iyy, double ixy)=0
Return the size of the bounding box for the ellipse core.
virtual void normalize()=0
Put the parameters into a "standard form", and throw InvalidParameterError if they cannot be normaliz...
ParameterVector const getParameterVector() const
Return the core parameters as a vector.
Definition BaseCore.cc:143
Jacobian dAssign(BaseCore const &other)
Assign other to this and return the derivative of the conversion, d(this)/d(other).
Definition BaseCore.cc:168
virtual ~BaseCore()=default
Return the size of the bounding box for the ellipse core.
virtual void _assignFromAxes(double a, double b, double theta)=0
Return the size of the bounding box for the ellipse core.
static std::shared_ptr< BaseCore > make(std::string const &name)
Definition BaseCore.cc:55
void grow(double buffer)
Increase the major and minor radii of the ellipse core by the given buffer.
Definition BaseCore.cc:95
virtual Jacobian _dAssignToAxes(double &a, double &b, double &theta) const =0
Return the size of the bounding box for the ellipse core.
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
Converter< Output > as() const
Convert this to the core type specified as a template parameter.
Definition BaseCore.h:238
virtual Jacobian _dAssignFromAxes(double a, double b, double theta)=0
Return the size of the bounding box for the ellipse core.
double getTraceRadius() const
Return the radius defined as the square root of one half the trace of the quadrupole matrix.
Definition BaseCore.cc:123
BaseCore & operator=(BaseCore const &other)
Set the parameters of this ellipse core from another.
Definition BaseCore.cc:155
Eigen::Matrix3d Jacobian
Parameter Jacobian matrix type.
Definition BaseCore.h:64
A functor that returns points on the boundary of the ellipse as a function of a parameter that runs b...
Definition Parametric.h:39
A 2D linear coordinate transformation.
std::shared_ptr< Output > copy() const
Definition BaseCore.h:234