lsst.jointcal g15c59248fb+6fd314e22b
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
32namespace {
33LOG_LOGGER _log = LOG_GET("lsst.jointcal.PhotometryMapping");
34}
35
36namespace lsst {
37namespace 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
58void 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
73double 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
82void 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
112double 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_GET(logger)
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)
Class for a simple mapping implementing a generic AstrometryTransform.
T resize(T... args)
T size(T... args)