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
ScaledPolynomialTransformFitter.h
Go to the documentation of this file.
1 // -*- LSST-C++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2016 LSST/AURA
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 #ifndef LSST_MEAS_ASTROM_TanSipFitter_INCLUDED
25 #define LSST_MEAS_ASTROM_TanSipFitter_INCLUDED
26 
27 #include "lsst/pex/config.h"
28 #include "lsst/geom/Box.h"
30 #include "lsst/afw/geom/SkyWcs.h"
31 #include "lsst/afw/table/Catalog.h"
35 
36 namespace lsst {
37 namespace meas {
38 namespace astrom {
39 
46 public:
48 
49  LSST_CONTROL_FIELD(nSigma, double, "Number of sigma to clip at.");
50 
51  LSST_CONTROL_FIELD(nClipMin, int, "Always clip at least this many matches.");
52 
53  LSST_CONTROL_FIELD(nClipMax, int, "Never clip more than this many matches.");
54 };
55 
102 public:
137  static ScaledPolynomialTransformFitter fromMatches(int maxOrder,
138  afw::table::ReferenceMatchVector const& matches,
139  afw::geom::SkyWcs const& initialWcs,
140  double intrinsicScatter);
141 
170  static ScaledPolynomialTransformFitter fromGrid(int maxOrder, geom::Box2D const& bbox, int nGridX,
171  int nGridY, ScaledPolynomialTransform const& toInvert);
172 
185  void fit(int order = -1);
186 
194  void updateModel();
195 
208  double updateIntrinsicScatter();
209 
219  double getIntrinsicScatter() const { return _intrinsicScatter; }
220 
240 
249  afw::table::BaseCatalog const& getData() const { return _data; }
250 
260  ScaledPolynomialTransform const& getTransform() const { return _transform; }
261 
265  PolynomialTransform const& getPoly() const { return _transform.getPoly(); }
266 
270  geom::AffineTransform const& getInputScaling() const { return _transform.getInputScaling(); }
271 
275  geom::AffineTransform const& getOutputScaling() const { return _outputScaling; }
276 
277 private:
278  class Keys;
279 
280  ScaledPolynomialTransformFitter(afw::table::BaseCatalog const& data, Keys const& keys, int maxOrder,
281  double intrinsicScatter, geom::AffineTransform const& inputScaling,
282  geom::AffineTransform const& outputScaling);
283 
284  double computeIntrinsicScatter() const;
285 
286  // Normally it's not safe to use a reference as a data member because the
287  // class holding it can't control when the referenced object gets
288  // destroyed, but this points to one of two singletons (which never get
289  // destroyed).
290  Keys const& _keys;
291  double _intrinsicScatter;
293  geom::AffineTransform _outputScaling;
294  ScaledPolynomialTransform _transform;
295  // 2-d generalization of the Vandermonde matrix: evaluates polynomial at
296  // all data points when multiplied by a vector of packed polynomial
297  // coefficients.
298  Eigen::MatrixXd _vandermonde;
299 };
300 
301 } // namespace astrom
302 } // namespace meas
303 } // namespace lsst
304 
305 #endif // !LSST_MEAS_ASTROM_TanSipFitter_INCLUDEDtr
AmpInfoBoxKey bbox
Definition: Amplifier.cc:117
char * data
Definition: BaseRecord.cc:61
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
Definition: SkyWcs.h:117
An affine coordinate transformation consisting of a linear transformation and an offset.
A floating-point coordinate rectangle geometry.
Definition: Box.h:413
Control object for outlier rejection in ScaledPolynomialTransformFitter.
int nClipMax
"Never clip more than this many matches." ;
int nClipMin
"Always clip at least this many matches." ;
A 2-d coordinate transform represented by a pair of standard polynomials (one for each coordinate).
A fitter class for scaled polynomial transforms.
afw::table::BaseCatalog const & getData() const
Return a catalog of data points and model values for diagnostic purposes.
static ScaledPolynomialTransformFitter fromMatches(int maxOrder, afw::table::ReferenceMatchVector const &matches, afw::geom::SkyWcs const &initialWcs, double intrinsicScatter)
Initialize a fit from intermediate world coordinates to pixels using source/reference matches.
ScaledPolynomialTransform const & getTransform() const
Return the best-fit transform.
geom::AffineTransform const & getOutputScaling() const
Return the output scaling transform that maps output data points to [-1, 1].
std::pair< double, size_t > rejectOutliers(OutlierRejectionControl const &ctrl)
Mark outliers in the data catalog using sigma clipping.
double getIntrinsicScatter() const
Return the current estimate of the intrinsic scatter.
void updateModel()
Update the 'model' field in the data catalog using the current best- fit transform.
void fit(int order=-1)
Perform a linear least-squares fit of the polynomial coefficients.
geom::AffineTransform const & getInputScaling() const
Return the input scaling transform that maps input data points to [-1, 1].
PolynomialTransform const & getPoly() const
Return the polynomial part of the best-fit transform.
double updateIntrinsicScatter()
Infer the intrinsic scatter in the offset between the data points and the best-fit model,...
static ScaledPolynomialTransformFitter fromGrid(int maxOrder, geom::Box2D const &bbox, int nGridX, int nGridY, ScaledPolynomialTransform const &toInvert)
Initialize a fit that inverts an existing transform by evaluating and fitting to points on a grid.
A 2-d coordinate transform represented by a lazy composition of an AffineTransform,...
geom::AffineTransform const & getInputScaling() const
Return the first affine transform applied to input points.
PolynomialTransform const & getPoly() const
Return the polynomial transform applied after the input scaling.
#define LSST_CONTROL_FIELD(NAME, TYPE, DOC)
A preprocessor macro used to define fields in C++ "control object" structs.
Definition: config.h:43
A base class for image defects.
table::Key< int > order