lsst.jointcal  16.0-16-g925333c+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 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 
84  for (auto const &ccdImage : ccdImageList) {
85  auto photoCalib = ccdImage->getPhotoCalib();
86  // Use the single-frame processing calibration from the PhotoCalib as the initial value.
87  auto transfo = std::make_shared<FluxTransfoSpatiallyInvariant>(photoCalib->getCalibrationMean());
88  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
89  }
90  LOGLS_INFO(_log, "SimpleFluxModel got " << _myMap.size() << " ccdImage mappings.");
91 }
92 
93 double SimpleFluxModel::computeResidual(CcdImage const &ccdImage, MeasuredStar const &measuredStar) const {
94  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getFlux();
95 }
96 
97 double SimpleFluxModel::transform(CcdImage const &ccdImage, MeasuredStar const &star) const {
98  auto mapping = findMapping(ccdImage);
99  return mapping->transform(star, star.getInstFlux());
100 }
101 
103  auto mapping = findMapping(ccdImage);
104  return mapping->transformError(star, star.getInstFlux(), star.getInstFluxErr());
105 }
106 
108  double calibration = (findMapping(ccdImage)->getParameters()[0]);
109  auto oldPhotoCalib = ccdImage.getPhotoCalib();
110  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
111 }
112 
114  : SimplePhotometryModel(ccdImageList) {
115  for (auto const &ccdImage : ccdImageList) {
116  auto photoCalib = ccdImage->getPhotoCalib();
117  // Use the single-frame processing calibration from the PhotoCalib as the default.
118  double calib = magFromFlux(photoCalib->getCalibrationMean());
119  auto transfo = std::make_shared<MagnitudeTransfoSpatiallyInvariant>(calib);
120  _myMap.emplace(ccdImage->getHashKey(), std::make_unique<PhotometryMapping>(transfo));
121  }
122  LOGLS_INFO(_log, "SimpleMagnitudeModel got " << _myMap.size() << " ccdImage mappings.");
123 }
124 
126  MeasuredStar const &measuredStar) const {
127  return transform(ccdImage, measuredStar) - measuredStar.getFittedStar()->getMag();
128 }
129 
131  auto mapping = findMapping(ccdImage);
132  return mapping->transform(star, star.getInstMag());
133 }
134 
136  auto mapping = findMapping(ccdImage);
137  return mapping->transformError(star, star.getInstMag(), star.getInstMagErr());
138 }
139 
141  // NOTE: photocalib is defined as instFlux * calibration = flux
142  double calibration = instFluxFromMag(findMapping(ccdImage)->getParameters()[0]);
143  auto oldPhotoCalib = ccdImage.getPhotoCalib();
144  return std::make_unique<afw::image::PhotoCalib>(calibration, oldPhotoCalib->getCalibrationErr());
145 }
146 
147 } // namespace jointcal
148 } // 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
SimpleFluxModel(CcdImageList const &ccdImageList)
int getTotalParameters() const override
Return the total number of parameters in this model.
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.
SimpleMagnitudeModel(CcdImageList const &ccdImageList)
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.
double getInstMagErr() const
Definition: MeasuredStar.h:72
double getInstFluxErr() const
Definition: MeasuredStar.h:70
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,...)
void offsetParams(Eigen::VectorXd const &delta) override
Offset the parameters by the provided amounts (by -delta).
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().