lsst.jointcal  16.0-18-gdf247dd
SimplePhotometryModel.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <cmath>
3 
4 #include "lsst/log/Log.h"
10 
11 namespace {
12 LOG_LOGGER _log = LOG_GET("jointcal.SimplePhotometryModel");
13 }
14 
15 namespace {
16 double instFluxFromMag(double mag) { return std::pow(10, mag / -2.5); }
17 } // namespace
18 
19 namespace lsst {
20 namespace jointcal {
21 
22 unsigned SimplePhotometryModel::assignIndices(std::string const &whatToFit, unsigned firstIndex) {
23  unsigned ipar = firstIndex;
24  for (auto const &i : _myMap) {
25  auto mapping = i.second.get();
26  mapping->setIndex(ipar);
27  ipar += mapping->getNpar();
28  }
29  return ipar;
30 }
31 
32 void SimplePhotometryModel::offsetParams(Eigen::VectorXd const &delta) {
33  for (auto &i : _myMap) {
34  auto mapping = i.second.get();
35  mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
36  }
37 }
38 
40  for (auto &i : _myMap) {
41  i.second->freezeErrorTransform();
42  }
43 }
44 
46  std::vector<unsigned> &indices) const {
47  auto mapping = findMapping(ccdImage);
48  if (indices.size() < mapping->getNpar()) indices.resize(mapping->getNpar());
49  indices[0] = mapping->getIndex();
50 }
51 
53  int total = 0;
54  for (auto &i : _myMap) {
55  total += i.second->getNpar();
56  }
57  return total;
58 }
59 
61  CcdImage const &ccdImage,
62  Eigen::VectorXd &derivatives) const {
63  auto mapping = findMapping(ccdImage);
64  mapping->computeParameterDerivatives(measuredStar, measuredStar.getInstFlux(), derivatives);
65 }
66 
68  for (auto &i : _myMap) {
69  stream << i.first << ": ";
70  i.second->dump(stream);
71  stream << ", ";
72  }
73 }
74 
76  auto i = _myMap.find(ccdImage.getHashKey());
77  if (i == _myMap.end())
79  "SimplePhotometryModel cannot find CcdImage " + ccdImage.getName());
80  return i->second.get();
81 }
82 
83 SimpleFluxModel::SimpleFluxModel(CcdImageList const &ccdImageList, double errorPedestal_)
84  : SimplePhotometryModel(ccdImageList, errorPedestal_) {
85  for (auto const &ccdImage : ccdImageList) {
86  auto photoCalib = ccdImage->getPhotoCalib();
87  // Use the single-frame processing calibration from the PhotoCalib as the initial value.
88  auto transfo = std::make_shared<FluxTransfoSpatiallyInvariant>(photoCalib->getCalibrationMean());
89  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
90  }
91  LOGLS_INFO(_log, "SimpleFluxModel got " << _myMap.size() << " ccdImage mappings.");
92 }
93 
94 double SimpleFluxModel::computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const {
95  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getFlux();
96 }
97 
98 double SimpleFluxModel::transform(CcdImage const &ccdImage, MeasuredStar const &star) const {
99  auto mapping = findMapping(ccdImage);
100  return mapping->transform(star, star.getInstFlux());
101 }
102 
104  auto mapping = findMapping(ccdImage);
105  double tempErr = tweakFluxError(star);
106  return mapping->transformError(star, star.getInstFlux(), tempErr);
107 }
108 
110  double calibration = (findMapping(ccdImage)->getParameters()[0]);
111  auto oldPhotoCalib = ccdImage.getPhotoCalib();
112  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
113 }
114 
115 SimpleMagnitudeModel::SimpleMagnitudeModel(CcdImageList const &ccdImageList, double errorPedestal_)
116  : SimplePhotometryModel(ccdImageList, errorPedestal_) {
117  for (auto const &ccdImage : ccdImageList) {
118  auto photoCalib = ccdImage->getPhotoCalib();
119  // Use the single-frame processing calibration from the PhotoCalib as the default.
120  double calib = magFromFlux(photoCalib->getCalibrationMean());
121  auto transfo = std::make_shared<MagnitudeTransfoSpatiallyInvariant>(calib);
122  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
123  }
124  LOGLS_INFO(_log, "SimpleMagnitudeModel got " << _myMap.size() << " ccdImage mappings.");
125 }
126 
128  MeasuredStar const &measuredStar) const {
129  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getMag();
130 }
131 
133  auto mapping = findMapping(ccdImage);
134  return mapping->transform(star, star.getInstMag());
135 }
136 
138  auto mapping = findMapping(ccdImage);
139  double tempErr = tweakMagnitudeError(star);
140  return mapping->transformError(star, star.getInstMag(), tempErr);
141 }
142 
144  // NOTE: photocalib is defined as instFlux * calibration = flux
145  double calibration = instFluxFromMag(findMapping(ccdImage)->getParameters()[0]);
146  auto oldPhotoCalib = ccdImage.getPhotoCalib();
147  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
148 }
149 
150 } // namespace jointcal
151 } // namespace lsst
double transform(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux for measuredStar on ccdImage.
std::shared_ptr< afw::image::PhotoCalib > toPhotoCalib(CcdImage const &ccdImage) const override
Return the mapping of ccdImage represented as a PhotoCalib.
Key< int > calib
Relates transfo(s) to their position in the fitting matrix and allows interaction with the transfo(s)...
virtual Eigen::VectorXd getParameters()=0
std::string getName() const
Return the _name that identifies this ccdImage.
Definition: CcdImage.h:56
int getTotalParameters() const override
Return the total number of parameters in this model.
SimpleMagnitudeModel(CcdImageList const &ccdImageList, double errorPedestal_=0)
std::shared_ptr< afw::image::PhotoCalib > toPhotoCalib(CcdImage const &ccdImage) const override
Return the mapping of ccdImage represented as a PhotoCalib.
T end(T... args)
void computeParameterDerivatives(MeasuredStar const &measuredStar, CcdImage const &ccdImage, Eigen::VectorXd &derivatives) const override
Compute the parametric derivatives of this model.
PhotometryMappingBase * findMapping(CcdImage const &ccdImage) const override
Return the mapping associated with this ccdImage.
T resize(T... args)
#define LOGLS_INFO(logger, message)
STL class.
void getMappingIndices(CcdImage const &ccdImage, std::vector< unsigned > &indices) const override
Get how this set of parameters (of length Npar()) map into the "grand" fit.
std::shared_ptr< afw::image::PhotoCalib > getPhotoCalib() const
Return the exposure&#39;s photometric calibration.
Definition: CcdImage.h:137
Class for a simple mapping implementing a generic Gtransfo.
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.
objects measured on actual images.
Definition: MeasuredStar.h:19
double transform(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux for measuredStar on ccdImage.
unsigned assignIndices(std::string const &whatToFit, unsigned firstIndex) override
Assign indices in the full matrix to the parameters being fit in the mappings, starting at firstIndex...
T find(T... args)
T size(T... args)
#define LSST_EXCEPT(type,...)
double tweakFluxError(jointcal::MeasuredStar const &measuredStar) const
Add a fraction of the instrumental flux to the instrumental flux error, in quadrature.
void offsetParams(Eigen::VectorXd const &delta) override
Offset the parameters by the provided amounts (by -delta).
double tweakMagnitudeError(jointcal::MeasuredStar const &measuredStar) const
Add a small magnitude offset to the "instrumental magnitude" error, in quadrature.
double computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Compute the residual between the model applied to a star and its associated fittedStar.
T pow(T... args)
T emplace(T... args)
CcdImageKey getHashKey() const
Definition: CcdImage.h:128
void dump(std::ostream &stream=std::cout) const override
Dump the contents of the transfos, for debugging.
Handler of an actual image from a single CCD.
Definition: CcdImage.h:41
std::shared_ptr< FittedStar > getFittedStar() const
Definition: MeasuredStar.h:85
STL class.
#define LOG_GET(logger)
double transformError(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
Photometric response model which has a single photometric factor per CcdImage.
double transformError(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const override
Return the on-sky transformed flux uncertainty for measuredStar on ccdImage.
void freezeErrorTransform() override
Once this routine has been called, the error transform is not modified by offsetParams().