LSSTApplications  16.0-10-g0ee56ad+5,16.0-11-ga33d1f2+5,16.0-12-g3ef5c14+3,16.0-12-g71e5ef5+18,16.0-12-gbdf3636+3,16.0-13-g118c103+3,16.0-13-g8f68b0a+3,16.0-15-gbf5c1cb+4,16.0-16-gfd17674+3,16.0-17-g7c01f5c+3,16.0-18-g0a50484+1,16.0-20-ga20f992+8,16.0-21-g0e05fd4+6,16.0-21-g15e2d33+4,16.0-22-g62d8060+4,16.0-22-g847a80f+4,16.0-25-gf00d9b8+1,16.0-28-g3990c221+4,16.0-3-gf928089+3,16.0-32-g88a4f23+5,16.0-34-gd7987ad+3,16.0-37-gc7333cb+2,16.0-4-g10fc685+2,16.0-4-g18f3627+26,16.0-4-g5f3a788+26,16.0-5-gaf5c3d7+4,16.0-5-gcc1f4bb+1,16.0-6-g3b92700+4,16.0-6-g4412fcd+3,16.0-6-g7235603+4,16.0-69-g2562ce1b+2,16.0-8-g14ebd58+4,16.0-8-g2df868b+1,16.0-8-g4cec79c+6,16.0-8-gadf6c7a+1,16.0-8-gfc7ad86,16.0-82-g59ec2a54a+1,16.0-9-g5400cdc+2,16.0-9-ge6233d7+5,master-g2880f2d8cf+3,v17.0.rc1
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  std::vector<unsigned> tempIndices(_visitMapping->getNpar());
50  _visitMapping->getMappingIndices(tempIndices);
51  // We have to insert the visit indices starting after the chip indices.
52  for (unsigned 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:688
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 getMappingIndices(std::vector< unsigned > &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.
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
T size(T... args)
unsigned getNpar() const override
Number of total parameters in this mapping.
#define LOG_GET(logger)
Returns a Log object associated with logger.
Definition: Log.h:75