LSSTApplications  17.0+124,17.0+14,17.0+73,18.0.0+37,18.0.0+80,18.0.0-4-g68ffd23+4,18.1.0-1-g0001055+12,18.1.0-1-g03d53ef+5,18.1.0-1-g1349e88+55,18.1.0-1-g2505f39+44,18.1.0-1-g5315e5e+4,18.1.0-1-g5e4b7ea+14,18.1.0-1-g7e8fceb+4,18.1.0-1-g85f8cd4+48,18.1.0-1-g8ff0b9f+4,18.1.0-1-ga2c679d+1,18.1.0-1-gd55f500+35,18.1.0-10-gb58edde+2,18.1.0-11-g0997b02+4,18.1.0-13-gfe4edf0b+12,18.1.0-14-g259bd21+21,18.1.0-19-gdb69f3f+2,18.1.0-2-g5f9922c+24,18.1.0-2-gd3b74e5+11,18.1.0-2-gfbf3545+32,18.1.0-26-g728bddb4+5,18.1.0-27-g6ff7ca9+2,18.1.0-3-g52aa583+25,18.1.0-3-g8ea57af+9,18.1.0-3-gb69f684+42,18.1.0-3-gfcaddf3+6,18.1.0-32-gd8786685a,18.1.0-4-gf3f9b77+6,18.1.0-5-g1dd662b+2,18.1.0-5-g6dbcb01+41,18.1.0-6-gae77429+3,18.1.0-7-g9d75d83+9,18.1.0-7-gae09a6d+30,18.1.0-9-gc381ef5+4,w.2019.45
LSSTDataManagementBasePackage
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("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
#define LOG_LOGGER
Definition: Log.h:703
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
void setWhatToFit(bool const fittingChips, bool const fittingVisits)
Set whether to fit chips or visits.
T log(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.
std::shared_ptr< PhotometryMapping > _chipMapping
T resize(T... args)
LSST DM logging module built on log4cxx.
double x
coordinate
Definition: Point.h:41
T at(T... args)
A base class for image defects.
void computeParameterDerivatives(MeasuredStar const &measuredStar, double value, Eigen::Ref< Eigen::VectorXd > derivatives) const override
Compute the derivatives with respect to the parameters (i.e.
objects measured on actual images.
Definition: MeasuredStar.h:46
void getMappingIndices(IndexVector &indices) const override
Gets how this set of parameters (of length getNpar()) map into the "grand" fit.
std::size_t getNpar() const override
Number of total parameters in this mapping.
T size(T... args)
STL class.
#define LOG_GET(logger)
Returns a Log object associated with logger.
Definition: Log.h:75