lsst.jointcal  16.0-21-g96865c2+1
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 double instFluxFromMag(double mag) { return std::pow(10, mag / -2.5); }
13 } // namespace
14 
15 namespace lsst {
16 namespace jointcal {
17 
18 unsigned SimplePhotometryModel::assignIndices(std::string const &whatToFit, unsigned firstIndex) {
19  unsigned ipar = firstIndex;
20  for (auto const &i : _myMap) {
21  auto mapping = i.second.get();
22  mapping->setIndex(ipar);
23  ipar += mapping->getNpar();
24  }
25  return ipar;
26 }
27 
28 void SimplePhotometryModel::offsetParams(Eigen::VectorXd const &delta) {
29  for (auto &i : _myMap) {
30  auto mapping = i.second.get();
31  mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
32  }
33 }
34 
36  for (auto &i : _myMap) {
37  i.second->freezeErrorTransform();
38  }
39 }
40 
42  std::vector<unsigned> &indices) const {
43  auto mapping = findMapping(ccdImage);
44  if (indices.size() < mapping->getNpar()) indices.resize(mapping->getNpar());
45  indices[0] = mapping->getIndex();
46 }
47 
49  int total = 0;
50  for (auto &i : _myMap) {
51  total += i.second->getNpar();
52  }
53  return total;
54 }
55 
57  CcdImage const &ccdImage,
58  Eigen::VectorXd &derivatives) const {
59  auto mapping = findMapping(ccdImage);
60  mapping->computeParameterDerivatives(measuredStar, measuredStar.getInstFlux(), derivatives);
61 }
62 
64  for (auto &i : _myMap) {
65  stream << i.first << ": ";
66  i.second->dump(stream);
67  stream << ", ";
68  }
69 }
70 
72  auto i = _myMap.find(ccdImage.getHashKey());
73  if (i == _myMap.end())
75  "SimplePhotometryModel cannot find CcdImage " + ccdImage.getName());
76  return i->second.get();
77 }
78 
79 SimpleFluxModel::SimpleFluxModel(CcdImageList const &ccdImageList, double errorPedestal_)
80  : SimplePhotometryModel(ccdImageList, LOG_GET("jointcal.SimpleFluxModel"), errorPedestal_) {
81  for (auto const &ccdImage : ccdImageList) {
82  auto photoCalib = ccdImage->getPhotoCalib();
83  // Use the single-frame processing calibration from the PhotoCalib as the initial value.
84  auto transfo = std::make_shared<FluxTransfoSpatiallyInvariant>(photoCalib->getCalibrationMean());
85  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
86  }
87  LOGLS_INFO(_log, "SimpleFluxModel got " << _myMap.size() << " ccdImage mappings.");
88 }
89 
90 double SimpleFluxModel::computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const {
91  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getFlux();
92 }
93 
94 double SimpleFluxModel::transform(CcdImage const &ccdImage, MeasuredStar const &star) const {
95  auto mapping = findMapping(ccdImage);
96  return mapping->transform(star, star.getInstFlux());
97 }
98 
100  auto mapping = findMapping(ccdImage);
101  double tempErr = tweakFluxError(star);
102  return mapping->transformError(star, star.getInstFlux(), tempErr);
103 }
104 
106  double calibration = (findMapping(ccdImage)->getParameters()[0]);
107  auto oldPhotoCalib = ccdImage.getPhotoCalib();
108  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
109 }
110 
111 SimpleMagnitudeModel::SimpleMagnitudeModel(CcdImageList const &ccdImageList, double errorPedestal_)
112  : SimplePhotometryModel(ccdImageList, LOG_GET("jointcal.SimpleMagnitudeModel"), errorPedestal_) {
113  for (auto const &ccdImage : ccdImageList) {
114  auto photoCalib = ccdImage->getPhotoCalib();
115  // Use the single-frame processing calibration from the PhotoCalib as the default.
116  double calib = magFromFlux(photoCalib->getCalibrationMean());
117  auto transfo = std::make_shared<MagnitudeTransfoSpatiallyInvariant>(calib);
118  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
119  }
120  LOGLS_INFO(_log, "SimpleMagnitudeModel got " << _myMap.size() << " ccdImage mappings.");
121 }
122 
124  MeasuredStar const &measuredStar) const {
125  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getMag();
126 }
127 
129  auto mapping = findMapping(ccdImage);
130  return mapping->transform(star, star.getInstMag());
131 }
132 
134  auto mapping = findMapping(ccdImage);
135  double tempErr = tweakMagnitudeError(star);
136  return mapping->transformError(star, star.getInstMag(), tempErr);
137 }
138 
140  // NOTE: photocalib is defined as instFlux * calibration = flux
141  double calibration = instFluxFromMag(findMapping(ccdImage)->getParameters()[0]);
142  auto oldPhotoCalib = ccdImage.getPhotoCalib();
143  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
144 }
145 
146 } // namespace jointcal
147 } // 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.
LOG_LOGGER _log
lsst.logging instance, to be created by a subclass so that messages have consistent name...
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().