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
PhotometryMapping.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 <cmath>
26 
27 #include "lsst/log/Log.h"
28 
31 
32 namespace {
33 LOG_LOGGER _log = LOG_GET("lsst.jointcal.PhotometryMapping");
34 }
35 
36 namespace lsst {
37 namespace jointcal {
38 
40  if (indices.size() < getNpar()) indices.resize(getNpar());
41  // If we're fitting the chip mapping, fill those indices.
42  if (_nParChip > 0) {
43  _chipMapping->getMappingIndices(indices);
44  }
45  // If we're fitting the visit mapping, fill those indices.
46  if (_nParVisit > 0) {
47  // TODO DM-12169: there is probably a better way to feed a subpart of a std::vector
48  // (maybe a view or iterators?)
49  IndexVector tempIndices(_visitMapping->getNpar());
50  _visitMapping->getMappingIndices(tempIndices);
51  // We have to insert the visit indices starting after the chip indices.
52  for (std::size_t k = 0; k < _visitMapping->getNpar(); ++k) {
53  indices.at(k + _nParChip) = tempIndices.at(k);
54  }
55  }
56 }
57 
58 void ChipVisitPhotometryMapping::setWhatToFit(bool const fittingChips, bool const fittingVisits) {
59  if (fittingChips) {
60  _nParChip = _chipMapping->getNpar();
61  } else {
62  _nParChip = 0;
63  }
64  if (fittingVisits) {
65  _nParVisit = _visitMapping->getNpar();
66  } else {
67  _nParVisit = 0;
68  }
69 }
70 
71 // ChipVisitFluxMapping methods
72 
73 double ChipVisitFluxMapping::transformError(MeasuredStar const &measuredStar, double instFlux,
74  double instFluxErr) const {
75  // The transformed error is s_m = dM(f,x,y)/df + s_f.
76  double tempFlux =
77  _chipMapping->getTransformErrors()->transform(measuredStar.x, measuredStar.y, instFluxErr);
78  return _visitMapping->getTransformErrors()->transform(measuredStar.getXFocal(), measuredStar.getYFocal(),
79  tempFlux);
80 }
81 
82 void ChipVisitFluxMapping::computeParameterDerivatives(MeasuredStar const &measuredStar, double instFlux,
83  Eigen::Ref<Eigen::VectorXd> derivatives) const {
84  // TODO DM-12161: possible optimization is to merge transform and computeDerivatives,
85  // and/or save these intermediate calculations when transforming flux to use in derivatives.
86  // Like what AstrometryMappings do with `computeTransformAndDerivatives` vs. `transformPosAndErrors`.
87 
88  double chipScale = _chipMapping->getTransform()->transform(measuredStar.x, measuredStar.y, 1);
89  double visitScale =
90  _visitMapping->getTransform()->transform(measuredStar.getXFocal(), measuredStar.getYFocal(), 1);
91 
92  // NOTE: chipBlock is the product of the chip derivatives and the visit transforms, and vice versa.
93  // NOTE: See DMTN-036 for the math behind this.
94  if (getNParChip() > 0 && !_chipMapping->isFixed()) {
95  // The chip derivatives start at 0, independent of the full-fit indices.
96  Eigen::Ref<Eigen::VectorXd> chipBlock = derivatives.segment(0, getNParChip());
97  _chipMapping->getTransform()->computeParameterDerivatives(measuredStar.x, measuredStar.y, instFlux,
98  chipBlock);
99  chipBlock *= visitScale;
100  }
101  if (getNParVisit() > 0) {
102  // The visit derivatives start at the last chip derivative, independent of the full-fit indices.
103  Eigen::Ref<Eigen::VectorXd> visitBlock = derivatives.segment(getNParChip(), getNParVisit());
104  _visitMapping->getTransform()->computeParameterDerivatives(
105  measuredStar.getXFocal(), measuredStar.getYFocal(), instFlux, visitBlock);
106  visitBlock *= chipScale;
107  }
108 }
109 
110 // ChipVisitMagnitudeMapping methods
111 
112 double ChipVisitMagnitudeMapping::transformError(MeasuredStar const &measuredStar, double instFlux,
113  double instFluxErr) const {
114  // The transformed error is s_mout = 2.5/ln(10) * instFluxErr / instFlux
115  // because the other components of the mapping (f0, the polynomials) disappear in the partial derivative.
116  return 2.5 / std::log(10.0) * instFluxErr / instFlux;
117 }
118 
120  Eigen::Ref<Eigen::VectorXd> derivatives) const {
121  // TODO DM-12161: possible optimization is to merge transform and computeDerivatives,
122  // and/or save these intermediate calculations when transforming flux to use in derivatives.
123  // Like what AstrometryMappings do with `computeTransformAndDerivatives` vs. `transformPosAndErrors`.
124 
125  // NOTE: See DMTN-036 for the math behind this.
126  if (getNParChip() > 0 && !_chipMapping->isFixed()) {
127  // The chip derivatives start at 0, independent of the full-fit indices.
128  Eigen::Ref<Eigen::VectorXd> chipBlock = derivatives.segment(0, getNParChip());
129  _chipMapping->getTransform()->computeParameterDerivatives(measuredStar.x, measuredStar.y, instFlux,
130  chipBlock);
131  }
132  if (getNParVisit() > 0) {
133  // The visit derivatives start at the last chip derivative, independent of the full-fit indices.
134  Eigen::Ref<Eigen::VectorXd> visitBlock = derivatives.segment(getNParChip(), getNParVisit());
135  _visitMapping->getTransform()->computeParameterDerivatives(
136  measuredStar.getXFocal(), measuredStar.getYFocal(), instFlux, visitBlock);
137  }
138 }
139 
140 } // namespace jointcal
141 } // namespace lsst
LSST DM logging module built on log4cxx.
#define LOG_GET(logger)
Returns a Log object associated with logger.
Definition: Log.h:75
#define LOG_LOGGER
Definition: Log.h:714
T at(T... args)
void computeParameterDerivatives(MeasuredStar const &measuredStar, double value, Eigen::Ref< Eigen::VectorXd > derivatives) const override
Compute the derivatives with respect to the parameters (i.e.
double transformError(MeasuredStar const &measuredStar, double value, double valueErr) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
void computeParameterDerivatives(MeasuredStar const &measuredStar, double value, Eigen::Ref< Eigen::VectorXd > derivatives) const override
Compute the derivatives with respect to the parameters (i.e.
double transformError(MeasuredStar const &measuredStar, double value, double valueErr) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
std::shared_ptr< PhotometryMapping > _visitMapping
std::shared_ptr< PhotometryMapping > _chipMapping
std::size_t getNpar() const override
Number of total parameters in this mapping.
void getMappingIndices(IndexVector &indices) const override
Gets how this set of parameters (of length getNpar()) map into the "grand" fit.
void setWhatToFit(bool const fittingChips, bool const fittingVisits)
Set whether to fit chips or visits.
Sources measured on images.
Definition: MeasuredStar.h:51
double x
coordinate
Definition: Point.h:42
T log(T... args)
A base class for image defects.
T resize(T... args)
T size(T... args)