LSSTApplications  20.0.0
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
lsst::jointcal::MeasuredStar
objects measured on actual images.
Definition: MeasuredStar.h:46
LOG_LOGGER
#define LOG_LOGGER
Definition: Log.h:703
std::vector::resize
T resize(T... args)
lsst::jointcal::ChipVisitPhotometryMapping::setWhatToFit
void setWhatToFit(bool const fittingChips, bool const fittingVisits)
Set whether to fit chips or visits.
Definition: PhotometryMapping.cc:58
lsst::jointcal::ChipVisitMagnitudeMapping::transformError
double transformError(MeasuredStar const &measuredStar, double value, double valueErr) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
Definition: PhotometryMapping.cc:112
std::vector
STL class.
MeasuredStar.h
std::vector::size
T size(T... args)
LOG_GET
#define LOG_GET(logger)
Definition: Log.h:75
lsst::jointcal::ChipVisitPhotometryMapping::_nParVisit
std::size_t _nParVisit
Definition: PhotometryMapping.h:282
lsst::jointcal::MeasuredStar::getYFocal
double getYFocal() const
Definition: MeasuredStar.h:110
lsst::jointcal::ChipVisitPhotometryMapping::_nParChip
std::size_t _nParChip
Definition: PhotometryMapping.h:282
lsst::jointcal::Point::y
double y
Definition: Point.h:41
std::log
T log(T... args)
std::vector::at
T at(T... args)
lsst::jointcal::ChipVisitFluxMapping::computeParameterDerivatives
void computeParameterDerivatives(MeasuredStar const &measuredStar, double value, Eigen::Ref< Eigen::VectorXd > derivatives) const override
Compute the derivatives with respect to the parameters (i.e.
Definition: PhotometryMapping.cc:82
lsst::jointcal::ChipVisitPhotometryMapping::_visitMapping
std::shared_ptr< PhotometryMapping > _visitMapping
Definition: PhotometryMapping.h:286
lsst::jointcal
Definition: Associations.h:49
lsst
A base class for image defects.
Definition: imageAlgorithm.dox:1
lsst::jointcal::ChipVisitPhotometryMapping::getNParChip
std::size_t getNParChip() const
Definition: PhotometryMapping.h:277
lsst::jointcal::ChipVisitPhotometryMapping::getNParVisit
std::size_t getNParVisit() const
Definition: PhotometryMapping.h:278
lsst::jointcal::ChipVisitPhotometryMapping::_chipMapping
std::shared_ptr< PhotometryMapping > _chipMapping
Definition: PhotometryMapping.h:285
lsst::jointcal::ChipVisitMagnitudeMapping::computeParameterDerivatives
void computeParameterDerivatives(MeasuredStar const &measuredStar, double value, Eigen::Ref< Eigen::VectorXd > derivatives) const override
Compute the derivatives with respect to the parameters (i.e.
Definition: PhotometryMapping.cc:119
lsst::jointcal::ChipVisitPhotometryMapping::getMappingIndices
void getMappingIndices(IndexVector &indices) const override
Gets how this set of parameters (of length getNpar()) map into the "grand" fit.
Definition: PhotometryMapping.cc:39
std::size_t
lsst::jointcal::ChipVisitPhotometryMapping::getNpar
std::size_t getNpar() const override
Number of total parameters in this mapping.
Definition: PhotometryMapping.h:229
lsst::jointcal::Point::x
double x
coordinate
Definition: Point.h:41
lsst::jointcal::MeasuredStar::getXFocal
double getXFocal() const
Definition: MeasuredStar.h:108
Log.h
LSST DM logging module built on log4cxx.
PhotometryMapping.h
lsst::jointcal::ChipVisitFluxMapping::transformError
double transformError(MeasuredStar const &measuredStar, double value, double valueErr) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
Definition: PhotometryMapping.cc:73