LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
SimplePhotometryModel.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 <iostream>
26 #include <cmath>
27 
28 #include "lsst/log/Log.h"
32 #include "lsst/jointcal/CcdImage.h"
34 
35 namespace lsst {
36 namespace jointcal {
37 
38 Eigen::Index SimplePhotometryModel::assignIndices(std::string const &whatToFit, Eigen::Index firstIndex) {
39  Eigen::Index ipar = firstIndex;
40  for (auto const &i : _myMap) {
41  auto mapping = i.second.get();
42  mapping->setIndex(ipar);
43  ipar += mapping->getNpar();
44  }
45  return ipar;
46 }
47 
48 void SimplePhotometryModel::offsetParams(Eigen::VectorXd const &delta) {
49  for (auto &i : _myMap) {
50  auto mapping = i.second.get();
51  mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
52  }
53 }
54 
56  for (auto &i : _myMap) {
57  i.second->freezeErrorTransform();
58  }
59 }
60 
62  std::vector<Eigen::Index> &indices) const {
63  auto mapping = findMapping(ccdImage);
64  if (indices.size() < mapping->getNpar()) indices.resize(mapping->getNpar());
65  indices[0] = mapping->getIndex();
66 }
67 
69  std::size_t total = 0;
70  for (auto &i : _myMap) {
71  total += i.second->getNpar();
72  }
73  return total;
74 }
75 
77  CcdImage const &ccdImage,
78  Eigen::VectorXd &derivatives) const {
79  auto mapping = findMapping(ccdImage);
80  mapping->computeParameterDerivatives(measuredStar, measuredStar.getInstFlux(), derivatives);
81 }
82 
84  for (auto &i : _myMap) {
85  out << i.first << ": ";
86  i.second->print(out);
87  out << std::endl;
88  }
89 }
90 
92  auto i = _myMap.find(ccdImage.getHashKey());
93  if (i == _myMap.end())
95  "SimplePhotometryModel cannot find CcdImage " + ccdImage.getName());
96  return i->second.get();
97 }
98 
99 SimpleFluxModel::SimpleFluxModel(CcdImageList const &ccdImageList, double errorPedestal)
100  : SimplePhotometryModel(ccdImageList, LOG_GET("jointcal.SimpleFluxModel"), errorPedestal) {
101  for (auto const &ccdImage : ccdImageList) {
102  auto photoCalib = ccdImage->getPhotoCalib();
103  // Use the single-frame processing calibration from the PhotoCalib as the initial value.
104  auto transform = std::make_shared<FluxTransformSpatiallyInvariant>(photoCalib->getCalibrationMean());
105  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transform));
106  }
107  LOGLS_INFO(_log, "SimpleFluxModel got " << _myMap.size() << " ccdImage mappings.");
108 }
109 
110 double SimpleFluxModel::computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const {
111  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getFlux();
112 }
113 
114 double SimpleFluxModel::transform(CcdImage const &ccdImage, MeasuredStar const &star) const {
115  auto mapping = findMapping(ccdImage);
116  return mapping->transform(star, star.getInstFlux());
117 }
118 
119 double SimpleFluxModel::transformError(CcdImage const &ccdImage, MeasuredStar const &star) const {
120  auto mapping = findMapping(ccdImage);
121  double tempErr = tweakFluxError(star);
122  return mapping->transformError(star, star.getInstFlux(), tempErr);
123 }
124 
126  double calibration = (findMapping(ccdImage)->getParameters()[0]);
127  auto oldPhotoCalib = ccdImage.getPhotoCalib();
128  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
129 }
130 
132  out << "SimpleFluxModel (" << _myMap.size() << " mappings):" << std::endl;
134 }
135 
136 SimpleMagnitudeModel::SimpleMagnitudeModel(CcdImageList const &ccdImageList, double errorPedestal)
137  : SimplePhotometryModel(ccdImageList, LOG_GET("jointcal.SimpleMagnitudeModel"), errorPedestal) {
138  for (auto const &ccdImage : ccdImageList) {
139  auto photoCalib = ccdImage->getPhotoCalib();
140  // Use the single-frame processing calibration from the PhotoCalib as the default.
141  double calib = utils::nanojanskyToABMagnitude(photoCalib->getCalibrationMean());
142  auto transform = std::make_shared<MagnitudeTransformSpatiallyInvariant>(calib);
143  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transform));
144  }
145  LOGLS_INFO(_log, "SimpleMagnitudeModel got " << _myMap.size() << " ccdImage mappings.");
146 }
147 
149  MeasuredStar const &measuredStar) const {
150  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getMag();
151 }
152 
153 double SimpleMagnitudeModel::transform(CcdImage const &ccdImage, MeasuredStar const &star) const {
154  auto mapping = findMapping(ccdImage);
155  return mapping->transform(star, star.getInstMag());
156 }
157 
158 double SimpleMagnitudeModel::transformError(CcdImage const &ccdImage, MeasuredStar const &star) const {
159  auto mapping = findMapping(ccdImage);
160  double tempErr = tweakMagnitudeError(star);
161  return mapping->transformError(star, star.getInstMag(), tempErr);
162 }
163 
165  // NOTE: photocalib is defined as `instFlux * calibration = flux`,
166  // so we have to convert the transform from magnitude space.
167  double calibration = utils::ABMagnitudeToNanojansky(findMapping(ccdImage)->getParameters()[0]);
168  auto oldPhotoCalib = ccdImage.getPhotoCalib();
169  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
170 }
171 
173  out << "SimpleMagnitudeModel (" << _myMap.size() << " mappings):" << std::endl;
175 }
176 
177 } // namespace jointcal
178 } // namespace lsst
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
LSST DM logging module built on log4cxx.
#define LOG_GET(logger)
Returns a Log object associated with logger.
Definition: Log.h:75
#define LOGLS_INFO(logger, message)
Log a info-level message using an iostream-based interface.
Definition: Log.h:639
Handler of an actual image from a single CCD.
Definition: CcdImage.h:64
std::shared_ptr< afw::image::PhotoCalib > getPhotoCalib() const
Return the exposure's photometric calibration.
Definition: CcdImage.h:160
std::string getName() const
Return the _name that identifies this ccdImage.
Definition: CcdImage.h:79
CcdImageKey getHashKey() const
Definition: CcdImage.h:152
Sources measured on images.
Definition: MeasuredStar.h:51
std::shared_ptr< FittedStar > getFittedStar() const
Definition: MeasuredStar.h:118
Relates transform(s) to their position in the fitting matrix and allows interaction with the transfor...
virtual Eigen::VectorXd getParameters()=0
LOG_LOGGER _log
lsst.logging instance, to be created by a subclass so that messages have consistent name.
double tweakFluxError(jointcal::MeasuredStar const &measuredStar) const
Add a fraction of the instrumental flux to the instrumental flux error, in quadrature.
double tweakMagnitudeError(jointcal::MeasuredStar const &measuredStar) const
Add a small magnitude offset to the "instrumental magnitude" error, in quadrature.
void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
double transformError(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
double transform(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux for measuredStar on ccdImage.
SimpleFluxModel(CcdImageList const &ccdImageList, double errorPedestal=0)
double computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Compute the residual between the model applied to a star and its associated fittedStar.
std::shared_ptr< afw::image::PhotoCalib > toPhotoCalib(CcdImage const &ccdImage) const override
Return the mapping of ccdImage represented as a PhotoCalib.
double computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Compute the residual between the model applied to a star and its associated fittedStar.
std::shared_ptr< afw::image::PhotoCalib > toPhotoCalib(CcdImage const &ccdImage) const override
Return the mapping of ccdImage represented as a PhotoCalib.
double transform(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux for measuredStar on ccdImage.
SimpleMagnitudeModel(CcdImageList const &ccdImageList, double errorPedestal=0)
double transformError(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
Photometric response model which has a single photometric factor per CcdImage.
void computeParameterDerivatives(MeasuredStar const &measuredStar, CcdImage const &ccdImage, Eigen::VectorXd &derivatives) const override
Compute the parametric derivatives of this model.
std::size_t getTotalParameters() const override
Return the total number of parameters in this model.
PhotometryMappingBase * findMapping(CcdImage const &ccdImage) const override
Return the mapping associated with this ccdImage.
void getMappingIndices(CcdImage const &ccdImage, IndexVector &indices) const override
Get how this set of parameters (of length Npar()) map into the "grand" fit.
void offsetParams(Eigen::VectorXd const &delta) override
Offset the parameters by the provided amounts (by -delta).
Eigen::Index assignIndices(std::string const &whatToFit, Eigen::Index firstIndex) override
Assign indices in the full matrix to the parameters being fit in the mappings, starting at firstIndex...
void freezeErrorTransform() override
Once this routine has been called, the error transform is not modified by offsetParams().
virtual void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
Reports invalid arguments.
Definition: Runtime.h:66
T emplace(T... args)
T end(T... args)
T endl(T... args)
T find(T... args)
double ABMagnitudeToNanojansky(double magnitude)
Convert an AB magnitude to a flux in nanojansky.
Definition: Magnitude.cc:32
double nanojanskyToABMagnitude(double flux)
Convert a flux in nanojansky to AB magnitude.
Definition: Magnitude.cc:30
A base class for image defects.
T resize(T... args)
T size(T... args)
Key< int > photoCalib
Definition: Exposure.cc:67
Key< int > calib
Definition: Exposure.cc:66