LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
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 
41 namespace lsst {
42 namespace afw {
43 namespace geom {
44 namespace ellipses {
45 
46 class Parametric;
47 
55 class BaseCore {
56 public:
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 
67 
68  static std::shared_ptr<BaseCore> make(std::string const& name, ParameterVector const& parameters);
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 
82  std::shared_ptr<BaseCore> clone() const { return _clone(); }
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 
150  ParameterVector const getParameterVector() const;
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 
188 protected:
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 
200  virtual std::shared_ptr<BaseCore> _clone() const = 0;
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 
227 template <typename Output>
229  BaseCore const& input;
230 
231  explicit Converter(BaseCore const& input_) : input(input_) {}
232 
233  operator Output() const { return Output(input); }
235 };
236 
237 template <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< std::string > name
Definition: Amplifier.cc:116
table::Key< int > b
table::Key< int > a
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 ...
Definition: GridTransform.h:48
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
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
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
std::shared_ptr< BaseCore > clone() const
Deep-copy the Core.
Definition: BaseCore.h:82
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.
virtual std::shared_ptr< BaseCore > _clone() 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.
Transformer transform(lsst::geom::LinearTransform const &transform)
Return the transform that maps the ellipse to the unit circle.
Definition: Transformer.h:116
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.
A base class for image defects.
std::shared_ptr< Output > copy() const
Definition: BaseCore.h:234