LSSTApplications  18.1.0
LSSTDataManagementBasePackage
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  typedef Eigen::Vector3d ParameterVector;
64  typedef Eigen::Matrix3d Jacobian;
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 
73 
75 
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 
123  Transformer const transform(lsst::geom::LinearTransform const& transform) const;
125 
132  GridTransform const getGridTransform() const;
133 
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  BaseCore(BaseCore const&) = default;
193  BaseCore(BaseCore&&) = default;
194 
195  static void registerSubclass(std::shared_ptr<BaseCore> const& example);
196 
197  template <typename T>
198  struct Registrar {
199  Registrar() { registerSubclass(std::make_shared<T>()); }
200  };
201 
202  virtual std::shared_ptr<BaseCore> _clone() const = 0;
203 
204  static void _assignQuadrupoleToAxes(double ixx, double iyy, double ixy, double& a, double& b,
205  double& theta);
206 
207  static Jacobian _dAssignQuadrupoleToAxes(double ixx, double iyy, double ixy, double& a, double& b,
208  double& theta);
209 
210  static void _assignAxesToQuadrupole(double a, double b, double theta, double& ixx, double& iyy,
211  double& ixy);
212 
213  static Jacobian _dAssignAxesToQuadrupole(double a, double b, double theta, double& ixx, double& iyy,
214  double& ixy);
215 
216  virtual void _assignToQuadrupole(double& ixx, double& iyy, double& ixy) const = 0;
217  virtual void _assignFromQuadrupole(double ixx, double iyy, double ixy) = 0;
218 
219  virtual void _assignToAxes(double& a, double& b, double& theta) const = 0;
220  virtual void _assignFromAxes(double a, double b, double theta) = 0;
221 
222  virtual Jacobian _dAssignToQuadrupole(double& ixx, double& iyy, double& ixy) const = 0;
223  virtual Jacobian _dAssignFromQuadrupole(double ixx, double iyy, double ixy) = 0;
224 
225  virtual Jacobian _dAssignToAxes(double& a, double& b, double& theta) const = 0;
226  virtual Jacobian _dAssignFromAxes(double a, double b, double theta) = 0;
227 };
228 
229 template <typename Output>
230 struct BaseCore::Converter {
231  BaseCore const& input;
232 
233  explicit Converter(BaseCore const& input_) : input(input_) {}
234 
235  operator Output() const { return Output(input); }
236  std::shared_ptr<Output> copy() const { return std::shared_ptr<Output>(new Output(input)); }
237 };
238 
239 template <typename Output>
241  return Converter<Output>(*this);
242 }
243 } // namespace ellipses
244 } // namespace geom
245 } // namespace afw
246 } // namespace lsst
247 
248 #endif // !LSST_AFW_GEOM_ELLIPSES_BaseCore_h_INCLUDED
static Jacobian _dAssignQuadrupoleToAxes(double ixx, double iyy, double ixy, double &a, double &b, double &theta)
Definition: BaseCore.cc:194
Jacobian dAssign(BaseCore const &other)
Assign other to this and return the derivative of the conversion, d(this)/d(other).
Definition: BaseCore.cc:169
static Jacobian _dAssignAxesToQuadrupole(double a, double b, double theta, double &ixx, double &iyy, double &ixy)
Definition: BaseCore.cc:232
A temporary-only expression object for ellipse core transformations.
Definition: Transformer.h:49
A temporary-only expression object representing an lsst::geom::LinearTransform that maps the ellipse ...
Definition: GridTransform.h:48
std::shared_ptr< Output > copy() const
Definition: BaseCore.h:236
virtual Jacobian _dAssignToQuadrupole(double &ixx, double &iyy, double &ixy) const =0
virtual Jacobian _dAssignToAxes(double &a, double &b, double &theta) const =0
table::Key< int > b
table::Key< int > a
static void _assignQuadrupoleToAxes(double ixx, double iyy, double ixy, double &a, double &b, double &theta)
Definition: BaseCore.cc:184
GridTransform const getGridTransform() const
Return the transform that maps the ellipse to the unit circle.
std::shared_ptr< BaseCore > clone() const
Deep-copy the Core.
Definition: BaseCore.h:82
lsst::geom::Extent2D computeDimensions() const
Return the size of the bounding box for the ellipse core.
Definition: BaseCore.cc:130
double getTraceRadius() const
Return the radius defined as the square root of one half the trace of the quadrupole matrix...
Definition: BaseCore.cc:124
STL class.
static std::shared_ptr< BaseCore > make(std::string const &name)
Definition: BaseCore.cc:56
void setParameterVector(ParameterVector const &vector)
Set the core parameters from a vector.
Definition: BaseCore.cc:150
Converter< Output > as() const
Convert this to the core type specified as a template parameter.
Definition: BaseCore.h:240
ParameterVector const getParameterVector() const
Return the core parameters as a vector.
Definition: BaseCore.cc:144
BaseCore & operator=(BaseCore const &other)
Set the parameters of this ellipse core from another.
Definition: BaseCore.cc:156
A base class for image defects.
void grow(double buffer)
Increase the major and minor radii of the ellipse core by the given buffer.
Definition: BaseCore.cc:96
Eigen::Vector3d ParameterVector
Parameter vector type.
Definition: BaseCore.h:61
Convolution convolve(BaseCore const &other)
Definition: Convolution.h:93
virtual void _assignFromAxes(double a, double b, double theta)=0
void scale(double factor)
Scale the size of the ellipse core by the given factor.
Definition: BaseCore.cc:104
static void _assignAxesToQuadrupole(double a, double b, double theta, double &ixx, double &iyy, double &ixy)
Definition: BaseCore.cc:219
double getArea() const
Return the area of the ellipse core.
Definition: BaseCore.cc:112
virtual void _assignToAxes(double &a, double &b, double &theta) const =0
bool operator!=(BaseCore const &other) const
Compare two ellipse cores for inequality.
Definition: BaseCore.h:167
virtual void normalize()=0
Put the parameters into a "standard form", and throw InvalidParameterError if they cannot be normaliz...
Eigen::Matrix3d Jacobian
Parameter Jacobian matrix type.
Definition: BaseCore.h:64
Transformer transform(lsst::geom::LinearTransform const &transform)
Definition: Transformer.h:116
virtual std::shared_ptr< BaseCore > _clone() const =0
A base class for parametrizations of the "core" of an ellipse - the ellipticity and size...
Definition: BaseCore.h:55
virtual void readParameters(double const *iter)=0
A functor that returns points on the boundary of the ellipse as a function of a parameter that runs b...
Definition: Parametric.h:39
virtual std::string getName() const =0
Return a string that identifies this parametrization.
ItemVariant const * other
Definition: Schema.cc:56
virtual Jacobian _dAssignFromAxes(double a, double b, double theta)=0
virtual Jacobian _dAssignFromQuadrupole(double ixx, double iyy, double ixy)=0
double getDeterminantRadius() const
Return the radius defined as the 4th root of the determinant of the quadrupole matrix.
Definition: BaseCore.cc:118
static void registerSubclass(std::shared_ptr< BaseCore > const &example)
Definition: BaseCore.cc:92
bool operator==(BaseCore const &other) const
Compare two ellipse cores for equality.
Definition: BaseCore.cc:152
virtual void _assignToQuadrupole(double &ixx, double &iyy, double &ixy) const =0
A temporary-only expression object for ellipse core convolution.
Definition: Convolution.h:46
virtual void writeParameters(double *iter) const =0
A 2D linear coordinate transformation.
virtual void _assignFromQuadrupole(double ixx, double iyy, double ixy)=0