lsst.jointcal
g29ae962dfc+7e0e65d7b2
Toggle main menu visibility
Loading...
Searching...
No Matches
src
ChipVisitAstrometryMapping.cc
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
#include <memory>
26
#include <utility>
27
28
#include "
lsst/jointcal/ChipVisitAstrometryMapping.h
"
29
#include "
lsst/pex/exceptions.h
"
30
31
namespace
pexExcept
=
lsst::pex::exceptions
;
32
33
namespace
lsst
{
34
namespace
jointcal
{
35
36
ChipVisitAstrometryMapping::ChipVisitAstrometryMapping
(
std::shared_ptr<SimpleAstrometryMapping>
chipMapping,
37
std::shared_ptr<SimpleAstrometryMapping>
visitMapping)
38
: _m1(
std
::
move
(chipMapping)), _m2(
std
::
move
(visitMapping)) {
39
/* Allocate the record of temporary variables, so that they are not
40
allocated at every call. This is hidden behind a pointer in order
41
to be allowed to alter them in a const routine. */
42
tmp = std::make_unique<tmpVars>();
43
setWhatToFit(
true
,
true
);
44
}
45
46
std::size_t
ChipVisitAstrometryMapping::getNpar
()
const
{
return
_nPar1 + _nPar2; }
47
48
void
ChipVisitAstrometryMapping::getMappingIndices
(
IndexVector
&indices)
const
{
49
std::size_t
npar =
getNpar
();
50
if
(indices.
size
() < npar) indices.
resize
(npar);
51
// in case we are only fitting one of the two transforms
52
if
(_nPar1)
53
_m1->getMappingIndices(indices);
54
else
if
(_nPar2) {
55
_m2->getMappingIndices(indices);
56
return
;
57
}
58
// if we get here we are fitting both
59
// there is probably a more elegant way to feed a subpart of a std::vector
60
IndexVector
ind2(_nPar2);
61
_m2->getMappingIndices(ind2);
62
for
(Eigen::Index k = 0; k < _nPar2; ++k) indices.
at
(k + _nPar1) = ind2.
at
(k);
63
}
64
65
void
ChipVisitAstrometryMapping::computeTransformAndDerivatives
(
FatPoint
const
&where,
FatPoint
&outPoint,
66
Eigen::MatrixX2d &H)
const
{
67
// not true in general. Will crash if H is too small.
68
// assert(H.cols()==Npar());
69
70
FatPoint
pMid;
71
// don't need errors there but no Mapping::Transform() routine.
72
73
if
(_nPar1) {
74
_m1->computeTransformAndDerivatives(where, pMid, tmp->h1);
75
// the last argument is epsilon and is not used for polynomials
76
_m2->positionDerivative(pMid, tmp->dt2dx, 1e-4);
77
H.block(0, 0, _nPar1, 2) = tmp->h1 * tmp->dt2dx;
78
}
else
79
_m1->transformPosAndErrors(where, pMid);
80
if
(_nPar2) {
81
_m2->computeTransformAndDerivatives(pMid, outPoint, tmp->h2);
82
H.block(_nPar1, 0, _nPar2, 2) = tmp->h2;
83
}
else
84
_m2->transformPosAndErrors(pMid, outPoint);
85
}
86
91
void
ChipVisitAstrometryMapping::setWhatToFit(
const
bool
fittingT1,
const
bool
fittingT2) {
92
if
(fittingT1) {
93
_nPar1 = _m1->getNpar();
94
tmp->h1 = Eigen::MatrixX2d(_nPar1, 2);
95
}
else
96
_nPar1 = 0;
97
if
(fittingT2) {
98
_nPar2 = _m2->getNpar();
99
tmp->h2 = Eigen::MatrixX2d(_nPar2, 2);
100
}
else
101
_nPar2 = 0;
102
}
103
104
void
ChipVisitAstrometryMapping::transformPosAndErrors
(
const
FatPoint
&where,
FatPoint
&outPoint)
const
{
105
FatPoint
pMid;
106
_m1->transformPosAndErrors(where, pMid);
107
_m2->transformPosAndErrors(pMid, outPoint);
108
}
109
110
void
ChipVisitAstrometryMapping::positionDerivative
(
Point
const
&where, Eigen::Matrix2d &derivative,
111
double
epsilon)
const
{
112
Eigen::Matrix2d d1, d2;
// seems that it does not trigger dynamic allocation
113
_m1->positionDerivative(where, d1, 1e-4);
114
FatPoint
pMid;
115
_m1->transformPosAndErrors(where, pMid);
116
_m2->positionDerivative(pMid, d2, 1e-4);
117
/* The following line is not a mistake. It is a consequence
118
of chosing derivative(0,1) = d(y_out)/d x_in. */
119
derivative = d1 * d2;
120
}
121
122
void
ChipVisitAstrometryMapping::freezeErrorTransform
() {
123
throw
LSST_EXCEPT
(
pexExcept::TypeError
,
124
" The routine ChipVisitAstrometryMapping::freezeErrorTransform() was thought to be "
125
"useless and is not implemented (yet)"
);
126
}
127
128
void
ChipVisitAstrometryMapping::print
(
std::ostream
&out)
const
{
129
out <<
"Composed Astrometry Mapping:"
<<
std::endl
;
130
out <<
"Sensor f(x,y)->(u,v): "
<< *_m1 <<
std::endl
;
131
out <<
"Visit f(u,v)->alpha,delta: "
<< *_m2 <<
std::endl
;
132
}
133
134
}
// namespace jointcal
135
}
// namespace lsst
ChipVisitAstrometryMapping.h
IndexVector
std::vector< std::ptrdiff_t > IndexVector
Definition
Eigenstuff.h:38
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
std::vector::at
T at(T... args)
std::ostream
lsst::jointcal::ChipVisitAstrometryMapping::getNpar
std::size_t getNpar() const override
Number of parameters in total.
Definition
ChipVisitAstrometryMapping.cc:46
lsst::jointcal::ChipVisitAstrometryMapping::getMappingIndices
void getMappingIndices(IndexVector &indices) const override
Sets how this set of parameters (of length Npar()) map into the "grand" fit Expects that indices has ...
Definition
ChipVisitAstrometryMapping.cc:48
lsst::jointcal::ChipVisitAstrometryMapping::freezeErrorTransform
void freezeErrorTransform()
Currently not implemented.
Definition
ChipVisitAstrometryMapping.cc:122
lsst::jointcal::ChipVisitAstrometryMapping::computeTransformAndDerivatives
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.
Definition
ChipVisitAstrometryMapping.cc:65
lsst::jointcal::ChipVisitAstrometryMapping::positionDerivative
void positionDerivative(Point const &where, Eigen::Matrix2d &derivative, double epsilon) const override
The derivative w.r.t. position.
Definition
ChipVisitAstrometryMapping.cc:110
lsst::jointcal::ChipVisitAstrometryMapping::print
void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
Definition
ChipVisitAstrometryMapping.cc:128
lsst::jointcal::ChipVisitAstrometryMapping::ChipVisitAstrometryMapping
ChipVisitAstrometryMapping(std::shared_ptr< SimpleAstrometryMapping > chipMapping, std::shared_ptr< SimpleAstrometryMapping > visitMapping)
Definition
ChipVisitAstrometryMapping.cc:36
lsst::jointcal::ChipVisitAstrometryMapping::transformPosAndErrors
void transformPosAndErrors(FatPoint const &where, FatPoint &outPoint) const override
The same as above but without the parameter derivatives (used to evaluate chi^2).
Definition
ChipVisitAstrometryMapping.cc:104
lsst::jointcal::FatPoint
A Point with uncertainties.
Definition
FatPoint.h:34
lsst::jointcal::Point
A point in a plane.
Definition
Point.h:37
lsst::pex::exceptions::TypeError
std::endl
T endl(T... args)
exceptions.h
std::move
T move(T... args)
lsst::jointcal
Definition
Associations.h:50
lsst::pex::exceptions
lsst
std
STL namespace.
std::vector::resize
T resize(T... args)
std::shared_ptr
std::vector::size
T size(T... args)
std::size_t
Generated on
for lsst.jointcal by
1.17.0