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
SimpleAstrometryMapping.h
Go to the documentation of this file.
1 // -*- LSST-C++ -*-
2 /*
3  * This file is part of jointcal.
4  *
5  * Developed for the LSST Data Management System.
6  * This product includes software developed by the LSST Project
7  * (https://www.lsst.org).
8  * See the COPYRIGHT file at the top-level directory of this distribution
9  * for details of code ownership.
10  *
11  * This program is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program. If not, see <https://www.gnu.org/licenses/>.
23  */
24 
25 #ifndef LSST_JOINTCAL_SIMPLE_ASTROMETRY_MAPPING_H
26 #define LSST_JOINTCAL_SIMPLE_ASTROMETRY_MAPPING_H
27 
28 #include <memory> // for unique_ptr
29 
32 
34 
38 namespace lsst {
39 namespace jointcal {
40 
42 public:
43  SimpleAstrometryMapping(AstrometryTransform const &astrometryTransform, bool toBeFit = true)
44  : toBeFit(toBeFit),
45  transform(astrometryTransform.clone()),
48 
54 
55  virtual void freezeErrorTransform() {
56  // from there on, updating the transform does not change the errors.
57  errorProp = transform->clone();
58  }
59 
61  std::size_t getNpar() const override {
62  if (toBeFit)
63  return transform->getNpar();
64  else
65  return 0;
66  }
67 
69  void getMappingIndices(IndexVector &indices) const override;
70 
72  void transformPosAndErrors(FatPoint const &where, FatPoint &outPoint) const override;
73 
75  void positionDerivative(Point const &where, Eigen::Matrix2d &derivative, double epsilon) const override;
76 
78  void offsetParams(Eigen::VectorXd const &delta) override {
79  if (toBeFit) transform->offsetParams(delta);
80  }
81 
83  Eigen::Index getIndex() const { return index; }
84 
86  void setIndex(Eigen::Index i) { index = i; }
87 
89  virtual void computeTransformAndDerivatives(FatPoint const &where, FatPoint &outPoint,
90  Eigen::MatrixX2d &H) const override;
91 
93  virtual AstrometryTransform const &getTransform() const { return *transform; }
94 
96  bool getToBeFit() const { return toBeFit; }
98  void setToBeFit(bool value) { toBeFit = value; }
99 
100  void print(std::ostream &out) const override;
101 
102 protected:
103  // Whether this Mapping is fit as part of a Model.
104  bool toBeFit;
105  Eigen::Index index;
106  /* inheritance may also work. Perhaps with some trouble because
107  some routines in Mapping and AstrometryTransform have the same name */
109 
111  /* to avoid allocation at every call of positionDerivative.
112  use a pointer for constness */
114 };
115 
118 public:
120 
121  // ! contructor.
124  SimplePolyMapping(AstrometryTransformLinear const &CenterAndScale,
126 
132 
133  /* The SimpleAstrometryMapping version does not account for the
134  _centerAndScale transform */
135 
136  void positionDerivative(Point const &where, Eigen::Matrix2d &derivative, double epsilon) const override;
137 
139  /* We should put the computation of error propagation and
140  parameter derivatives into the same AstrometryTransform routine because
141  it could be significantly faster */
142  void computeTransformAndDerivatives(FatPoint const &where, FatPoint &outPoint,
143  Eigen::MatrixX2d &H) const override;
144 
146  void transformPosAndErrors(FatPoint const &where, FatPoint &outPoint) const override;
147 
149  AstrometryTransform const &getTransform() const override;
150 
151 private:
152  /* to better condition the 2nd derivative matrix, the
153  transformed coordinates are mapped (roughly) on [-1,1].
154  We need both the transform and its derivative. */
155  AstrometryTransformLinear _centerAndScale;
156  Eigen::Matrix2d preDer;
157 
158  /* Where we store the combination. */
159  mutable AstrometryTransformPolynomial actualResult;
160 };
161 
162 #ifdef STORAGE
165 class SimpleIdentityMapping : public SimpleAstrometryMapping<AstrometryTransformIdentity> {
166 public:
168  virtual void computeTransformAndDerivatives(FatPoint const &where, FatPoint &outPoint,
169  Eigen::MatrixX2d &H) const {
170  outPoint = where;
171  }
172 };
173 #endif
174 } // namespace jointcal
175 } // namespace lsst
176 
177 #endif // LSST_JOINTCAL_SIMPLE_ASTROMETRY_MAPPING_H
Eigen::Matrix< double, Eigen::Dynamic, 2 > MatrixX2d
Definition: Eigenstuff.h:33
virtual class needed in the abstraction of the distortion model
a virtual (interface) class for geometric transformations.
implements the linear transformations (6 real coefficients).
A Point with uncertainties.
Definition: FatPoint.h:34
A point in a plane.
Definition: Point.h:37
std::shared_ptr< AstrometryTransform > errorProp
SimpleAstrometryMapping & operator=(SimpleAstrometryMapping &&)=delete
bool getToBeFit() const
Get whether this mapping is fit as part of a Model.
virtual void computeTransformAndDerivatives(FatPoint const &where, FatPoint &outPoint, Eigen::MatrixX2d &H) const override
Actually applies the AstrometryMapping and evaluates the derivatives w.r.t the fitted parameters.
void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
std::size_t getNpar() const override
Number of parameters in total.
void setIndex(Eigen::Index i)
Set the index of this mapping in the grand fit.
std::shared_ptr< AstrometryTransform > transform
SimpleAstrometryMapping & operator=(SimpleAstrometryMapping const &)=delete
SimpleAstrometryMapping(SimpleAstrometryMapping &&)=delete
void getMappingIndices(IndexVector &indices) const override
Sets how this set of parameters (of length Npar()) map into the "grand" fit Expects that indices has ...
void setToBeFit(bool value)
Set whether this Mapping is to be fit as part of a Model.
std::unique_ptr< AstrometryTransformLinear > lin
SimpleAstrometryMapping(AstrometryTransform const &astrometryTransform, bool toBeFit=true)
virtual AstrometryTransform const & getTransform() const
Access to the (fitted) transform.
void transformPosAndErrors(FatPoint const &where, FatPoint &outPoint) const override
The same as above but without the parameter derivatives (used to evaluate chi^2)
Eigen::Index getIndex() const
position of the parameters within the grand fitting scheme
void positionDerivative(Point const &where, Eigen::Matrix2d &derivative, double epsilon) const override
The derivative w.r.t. position.
void offsetParams(Eigen::VectorXd const &delta) override
Remember the error scale and freeze it.
SimpleAstrometryMapping(SimpleAstrometryMapping const &)=delete
No copy or move: there is only ever one instance of a given mapping (i.e.. per ccd+visit)
Mapping implementation for a polynomial transformation.
SimplePolyMapping(SimplePolyMapping const &)=delete
No copy or move: there is only ever one instance of a given mapping (i.e.. per ccd+visit)
SimplePolyMapping(SimplePolyMapping &&)=delete
void computeTransformAndDerivatives(FatPoint const &where, FatPoint &outPoint, Eigen::MatrixX2d &H) const override
Calls the transforms and implements the centering and scaling of coordinates.
void positionDerivative(Point const &where, Eigen::Matrix2d &derivative, double epsilon) const override
The derivative w.r.t. position.
SimplePolyMapping(AstrometryTransformLinear const &CenterAndScale, AstrometryTransformPolynomial const &transform)
The transformation will be initialized to transform, so that the effective transformation reads trans...
SimplePolyMapping & operator=(SimplePolyMapping &&)=delete
SimplePolyMapping & operator=(SimplePolyMapping const &)=delete
AstrometryTransform const & getTransform() const override
Access to the (fitted) transform.
void transformPosAndErrors(FatPoint const &where, FatPoint &outPoint) const override
The same as above but without the parameter derivatives (used to evaluate chi^2)
A base class for image defects.