LSSTApplications  8.0.0.0+107,8.0.0.1+13,9.1+18,9.2,master-g084aeec0a4,master-g0aced2eed8+6,master-g15627eb03c,master-g28afc54ef9,master-g3391ba5ea0,master-g3d0fb8ae5f,master-g4432ae2e89+36,master-g5c3c32f3ec+17,master-g60f1e072bb+1,master-g6a3ac32d1b,master-g76a88a4307+1,master-g7bce1f4e06+57,master-g8ff4092549+31,master-g98e65bf68e,master-ga6b77976b1+53,master-gae20e2b580+3,master-gb584cd3397+53,master-gc5448b162b+1,master-gc54cf9771d,master-gc69578ece6+1,master-gcbf758c456+22,master-gcec1da163f+63,master-gcf15f11bcc,master-gd167108223,master-gf44c96c709
LSSTDataManagementBasePackage
SdssShapeImpl.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 #if !defined(LSST_MEAS_BASE_ALGORITHMS_DETAIL_H)
3 #define LSST_MEAS_BASE_ALGORITHMS_DETAIL_H 1
4 
5 #include <bitset>
6 
8 #include "lsst/afw/geom/Angle.h"
9 
10 namespace lsst { namespace meas { namespace base { namespace detail {
11 
12 int const SDSS_SHAPE_MAX_ITER = 100; // Default maximum number of iterations
13 float const SDSS_SHAPE_TOL1 = 1.0e-5; // Default convergence tolerance for e1,e2
14 float const SDSS_SHAPE_TOL2 = 1.0e-4; // Default convergence tolerance for FWHM
15 
17 public:
18  typedef Eigen::Matrix<double,4,4,Eigen::DontAlign> Matrix4; // type for the 4x4 covariance matrix
19 
20  enum Flag {
26  };
27 
28  typedef std::bitset<N_FLAGS> FlagSet;
29 
30  SdssShapeImpl(double i0=NAN, double ixx=NAN, double ixy=NAN, double iyy=NAN) :
31  _i0(i0),
32  _x(NAN), _xErr(NAN), _y(NAN), _yErr(NAN),
33  _ixx(ixx), _ixy(ixy), _iyy(iyy),
34  _covar(),
35  _ixy4(NAN),
36  _flags()
37  {
38  _covar.setConstant(NAN);
39  }
40 
41  explicit SdssShapeImpl(
44  ) : _i0(NAN),
45  _x(centroid.getX()), _xErr(NAN), _y(centroid.getY()), _yErr(NAN),
46  _ixx(shape.getIxx()), _ixy(shape.getIxy()), _iyy(shape.getIyy()),
47  _covar(),
48  _ixy4(NAN),
49  _flags()
50  {
51  _covar.setConstant(NAN);
52  }
53 
54  void setI0(double i0) { _i0 = i0; }
55  double getI0() const { return _i0; }
56  double getI0Err() const { return ::sqrt(_covar(0, 0)); }
57 
58  double getX() const { return _x; }
59  double getXErr() const { return _xErr; }
60  void setX(double const x) { _x = x; }
61 
62  double getY() const { return _y; }
63  double getYErr() const { return _yErr; }
64  void setY(double const y) { _y = y; }
65 
66  void setIxx(double ixx) { _ixx = ixx; }
67  double getIxx() const { return _ixx; }
68  double getIxxErr() const { return ::sqrt(_covar(1, 1)); }
69 
70  void setIxy(double ixy) { _ixy = ixy; }
71  double getIxy() const { return _ixy; }
72  double getIxyErr() const { return ::sqrt(_covar(2, 2)); }
73 
74  void setIyy(double iyy) { _iyy = iyy; }
75  double getIyy() const { return _iyy; }
76  double getIyyErr() const { return ::sqrt(_covar(3, 3)); }
77 
78  void setIxy4(double ixy4) { _ixy4 = ixy4; }
79  double getIxy4() const { return _ixy4; }
80 
81  void setFlag(Flag flag) { _flags.set(flag); }
82  void resetFlag(Flag flag) { _flags.reset(flag); }
83  bool getFlag(Flag flag) const { return _flags.test(flag); }
84 
85  void setCovar(Matrix4 covar) { _covar = covar; }
86  const Matrix4& getCovar() const { return _covar; }
87 
89  double getFluxScale() const {
90  /*
91  * The shape is an ellipse that's axis-aligned in (u, v) [<uv> = 0] after rotation by theta:
92  * <x^2> + <y^2> = <u^2> + <v^2>
93  * <x^2> - <y^2> = cos(2 theta)*(<u^2> - <v^2>)
94  * 2*<xy> = sin(2 theta)*(<u^2> - <v^2>)
95  */
96  double const Mxx = getIxx(); // <x^2>
97  double const Mxy = getIxy(); // <xy>
98  double const Myy = getIyy(); // <y^2>
99 
100  double const Muu_p_Mvv = Mxx + Myy; // <u^2> + <v^2>
101  double const Muu_m_Mvv = ::sqrt(::pow(Mxx - Myy, 2) + 4*::pow(Mxy, 2)); // <u^2> - <v^2>
102  double const Muu = 0.5*(Muu_p_Mvv + Muu_m_Mvv);
103  double const Mvv = 0.5*(Muu_p_Mvv - Muu_m_Mvv);
104 
105  return lsst::afw::geom::TWOPI * ::sqrt(Muu*Mvv);
106  }
107 
108  PTR(SdssShapeImpl) transform(lsst::afw::geom::AffineTransform const& trans) const {
109  PTR(SdssShapeImpl) shape = boost::make_shared<SdssShapeImpl>();
110 
111  double invJacobian = 1.0 / trans.getLinear().computeDeterminant();
112  lsst::afw::geom::Point2D const& center = trans(lsst::afw::geom::Point2D(_x, _y));
115 
116  shape->setI0(_i0 * invJacobian);
117  shape->setX(center.getX());
118  shape->setY(center.getY());
119  shape->setIxx(moments.getIxx());
120  shape->setIxy(moments.getIxy());
121  shape->setIyy(moments.getIyy());
122  // XXX errors?
123  // XXX covar?
124  // XXX ixy4?
125 
126  shape->_flags = _flags;
127 
128  return shape;
129  }
130 
131 #if !defined(SWIG) // XXXX
132  double getE1() const;
133  double getE1Err() const;
134  double getE2() const;
135  double getE2Err() const;
136  double getE1E2Err() const;
137  double getRms() const;
138  double getRmsErr() const;
139 #endif
140 
141 #ifndef SWIG
142  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
143 #endif
144 
145 private:
146  double _i0; // 0-th moment
147 
148  double _x, _xErr, _y, _yErr; // <x>, <y> and errors
149 
150  double _ixx, _ixy, _iyy; // <xx> <xy> <yy>
151  Matrix4 _covar; // covariance matrix for (_i0, _ixx, _ixy, _iyy)
152  double _ixy4; // 4th moment used for shear calibration
153  FlagSet _flags; // flags describing processing
154 };
155 
160 template<typename ImageT>
161 bool getAdaptiveMoments(
162  ImageT const& mimage,
163  double bkgd,
164  double xcen,
165  double ycen,
166  double shiftmax,
167  SdssShapeImpl *shape,
168  int maxIter=SDSS_SHAPE_MAX_ITER,
169  float tol1=SDSS_SHAPE_TOL1,
170  float tol2=SDSS_SHAPE_TOL2
171  );
172 
173 template<typename ImageT>
174 std::pair<double, double>
175 getFixedMomentsFlux(ImageT const& mimage, double bkgd, double xcen, double ycen,
176  SdssShapeImpl const& shape);
177 
178 }}}} //xyzzy
179 
180 #endif
181 
An ellipse core with quadrupole moments as parameters.
Definition: Quadrupole.h:45
#define PTR(...)
Definition: base.h:41
Public header class for ellipse library.
int y
SelectEigenView< T >::Type copy(Eigen::EigenBase< T > const &other)
Copy an arbitrary Eigen expression into a new EigenView.
Definition: eigen.h:390
SdssShapeImpl(double i0=NAN, double ixx=NAN, double ixy=NAN, double iyy=NAN)
Definition: SdssShapeImpl.h:30
boost::shared_ptr< SdssShapeImpl > transform(lsst::afw::geom::AffineTransform const &trans) const
double getFluxScale() const
Return multiplier that transforms I0 to a total flux.
Definition: SdssShapeImpl.h:89
Eigen::Matrix< double, 4, 4, Eigen::DontAlign > Matrix4
Definition: SdssShapeImpl.h:18
int x
std::pair< double, double > getFixedMomentsFlux(ImageT const &image, double bkgd, double xcen, double ycen, SdssShapeImpl const &shape_)
Return the flux of an object, using the aperture described by the SdssShape object.
Definition: SdssShape.cc:692
SdssShapeImpl(afw::geom::Point2D const &centroid, afw::geom::ellipses::Quadrupole const &shape)
Definition: SdssShapeImpl.h:41
double const TWOPI
Definition: Angle.h:19
const Matrix4 & getCovar() const
Definition: SdssShapeImpl.h:86
bool getAdaptiveMoments(ImageT const &mimage, double bkgd, double xcen, double ycen, double shiftmax, SdssShapeImpl *shape, int maxIter, float tol1, float tol2)
Definition: SdssShape.cc:448