6 #include "Eigen/Sparse" 20 void PhotometryFit::leastSquareDerivativesMeasurement(CcdImage
const &
ccdImage, TripletList &tripletList,
21 Eigen::VectorXd &grad,
22 MeasuredStarList
const *measuredStarList)
const {
31 if (measuredStarList) assert(&(measuredStarList->front()->getCcdImage()) == &ccdImage);
33 unsigned nparModel = (_fittingModel) ? _photometryModel->getNpar(ccdImage) : 0;
34 unsigned nparFlux = (_fittingFluxes) ? 1 : 0;
35 unsigned nparTotal = nparModel + nparFlux;
37 if (_fittingModel) _photometryModel->getMappingIndices(ccdImage, indices);
39 Eigen::VectorXd H(nparTotal);
41 unsigned kTriplets = tripletList.getNextFreeIndex();
42 const MeasuredStarList &catalog = (measuredStarList) ? *measuredStarList : ccdImage.getCatalogForFit();
44 for (
auto const &measuredStar : catalog) {
45 if (!measuredStar->isValid())
continue;
48 TweakPhotomMeasurementErrors(inPos, *measuredStar, _fluxError);
52 double residual = _photometryModel->computeResidual(ccdImage, *measuredStar);
53 double inverseSigma = 1.0 / _photometryModel->transformError(ccdImage, *measuredStar);
54 double W =
std::pow(inverseSigma, 2);
57 _photometryModel->computeParameterDerivatives(*measuredStar, ccdImage, H);
58 for (
unsigned k = 0; k < indices.size(); k++) {
59 unsigned l = indices[k];
60 tripletList.addTriplet(l, kTriplets, H[k] * inverseSigma);
61 grad[l] += H[k] * W * residual;
65 unsigned index = measuredStar->getFittedStar()->getIndexInMatrix();
67 tripletList.addTriplet(index, kTriplets, -1.0 * inverseSigma);
68 grad[index] += -1.0 * W * residual;
73 tripletList.setNextFreeIndex(kTriplets);
76 void PhotometryFit::leastSquareDerivativesReference(FittedStarList
const &fittedStarList,
77 TripletList &tripletList, Eigen::VectorXd &grad)
const {
84 if (!_fittingFluxes)
return;
88 unsigned kTriplets = tripletList.getNextFreeIndex();
90 for (
auto const &fittedStar : fittedStarList) {
91 auto refStar = fittedStar->getRefStar();
92 if (refStar ==
nullptr)
continue;
100 double inverseSigma = 1.0 / _photometryModel->getRefError(*refStar);
102 double residual = _photometryModel->computeRefResidual(*fittedStar, *refStar);
104 unsigned index = fittedStar->getIndexInMatrix();
106 tripletList.addTriplet(index, kTriplets, 1.0 * inverseSigma);
107 grad(index) += 1.0 *
std::pow(inverseSigma, 2) * residual;
110 tripletList.setNextFreeIndex(kTriplets);
113 void PhotometryFit::accumulateStatImageList(
CcdImageList const &ccdImageList, Chi2Accumulator &accum)
const {
118 for (
auto const &ccdImage : ccdImageList) {
119 auto &catalog = ccdImage->getCatalogForFit();
121 for (
auto const &measuredStar : catalog) {
122 if (!measuredStar->isValid())
continue;
123 double sigma = _photometryModel->transformError(*ccdImage, *measuredStar);
125 TweakPhotomMeasurementErrors(inPos, measuredStar, _fluxError);
127 double residual = _photometryModel->computeResidual(*ccdImage, *measuredStar);
129 double chi2Val =
std::pow(residual / sigma, 2);
130 accum.addEntry(chi2Val, 1, measuredStar);
135 void PhotometryFit::accumulateStatRefStars(Chi2Accumulator &accum)
const {
141 FittedStarList &fittedStarList =
_associations->fittedStarList;
142 for (
auto const &fittedStar : fittedStarList) {
143 auto refStar = fittedStar->getRefStar();
144 if (refStar ==
nullptr)
continue;
145 double sigma = _photometryModel->getRefError(*refStar);
146 double residual = _photometryModel->computeRefResidual(*fittedStar, *refStar);
147 double chi2 =
std::pow(residual / sigma, 2);
148 accum.addEntry(chi2, 1, fittedStar);
155 void PhotometryFit::getIndicesOfMeasuredStar(MeasuredStar
const &measuredStar,
159 _photometryModel->getMappingIndices(measuredStar.getCcdImage(), indices);
161 if (_fittingFluxes) {
163 unsigned fsIndex = fs->getIndexInMatrix();
172 _fittingFluxes = (
_whatToFit.
find(
"Fluxes") != std::string::npos);
175 _nParModel = (_fittingModel) ? _photometryModel->assignIndices(whatToFit, 0) : 0;
176 unsigned ipar = _nParModel;
178 if (_fittingFluxes) {
184 fittedStar->setIndexInMatrix(ipar);
188 _nParFluxes = ipar - _nParModel;
191 "nParameters total: " <<
_nParTot <<
" model: " << _nParModel <<
" fluxes: " << _nParFluxes);
197 "PhotometryFit::offsetParams : the provided vector length is not compatible with " 198 "the current whatToFit setting");
199 if (_fittingModel) _photometryModel->offsetParams(delta);
201 if (_fittingFluxes) {
206 unsigned index = fittedStar->getIndexInMatrix();
207 _photometryModel->offsetFittedStar(*fittedStar, delta(index));
216 ofile <<
"#id" << separator <<
"xccd" << separator <<
"yccd" << separator;
217 ofile <<
"mag" << separator <<
"instMag" << separator <<
"instMagErr" << separator;
218 ofile <<
"instFlux" << separator <<
"instFluxErr" << separator;
219 ofile <<
"inputFlux" << separator <<
"inputFluxErr" << separator;
220 ofile <<
"transformedFlux" << separator <<
"transformedFluxErr" << separator;
221 ofile <<
"fittedFlux" << separator;
222 ofile <<
"mjd" << separator <<
"color" << separator;
223 ofile <<
"fsindex" << separator;
224 ofile <<
"ra" << separator <<
"dec" << separator;
225 ofile <<
"chi2" << separator <<
"nm" << separator;
226 ofile <<
"chip" << separator <<
"visit" << separator <<
std::endl;
228 ofile <<
"#id in source catalog" << separator <<
"coordinates in CCD" << separator << separator;
229 ofile <<
"fitted magnitude" << separator <<
"measured magnitude" << separator
230 <<
"measured magnitude error" << separator;
231 ofile <<
"measured instrument flux (ADU)" << separator <<
"measured instrument flux error" << separator;
232 ofile <<
"measured flux (maggies)" << separator <<
"measured flux error" << separator;
233 ofile << separator << separator;
234 ofile <<
"fitted flux (maggies)" << separator;
235 ofile <<
"modified Julian date of the measurement" << separator <<
"currently unused" << separator;
236 ofile <<
"unique index of the fittedStar" << separator;
237 ofile <<
"on-sky position of fitted star" << separator << separator;
238 ofile <<
"contribution to Chi2 (1 dof)" << separator <<
"number of measurements of this FittedStar" 240 ofile <<
"chip id" << separator <<
"visit id" <<
std::endl;
243 for (
auto const &ccdImage : ccdImageList) {
245 for (
auto const &measuredStar : cat) {
246 if (!measuredStar->isValid())
continue;
247 double sigma = _photometryModel->transformError(*ccdImage, *measuredStar);
249 tweakPhotomMeasurementErrors(inPos, measuredStar, _fluxError);
251 double flux = _photometryModel->transform(*ccdImage, *measuredStar);
252 double fluxErr = _photometryModel->transformError(*ccdImage, *measuredStar);
253 double jd = ccdImage->getMjd();
255 double residual = _photometryModel->computeResidual(*ccdImage, *measuredStar);
256 double chi2Val =
std::pow(residual / sigma, 2);
259 ofile << measuredStar->getId() << separator << measuredStar->x << separator << measuredStar->y
261 ofile << fittedStar->getMag() << separator << measuredStar->getInstMag() << separator
262 << measuredStar->getInstMagErr() << separator;
263 ofile << measuredStar->getInstFlux() << separator << measuredStar->getInstFluxErr() << separator;
264 ofile << measuredStar->getFlux() << separator << measuredStar->getFluxErr() << separator;
265 ofile << flux << separator << fluxErr << separator << fittedStar->getFlux() << separator;
266 ofile << jd << separator << fittedStar->color << separator;
267 ofile << fittedStar->getIndexInMatrix() << separator;
268 ofile << fittedStar->x << separator << fittedStar->y << separator;
269 ofile << chi2Val << separator << fittedStar->getMeasurementCount() << separator;
270 ofile << ccdImage->getCcdId() << separator << ccdImage->getVisit() <<
std::endl;
279 ofile <<
"#ra" << separator <<
"dec " << separator;
280 ofile <<
"mag" << separator <<
"color" << separator;
281 ofile <<
"refFlux" << separator <<
"refFluxErr" << separator;
282 ofile <<
"fittedFlux" << separator <<
"fittedFluxErr" << separator;
283 ofile <<
"fsindex" << separator <<
"chi2" << separator <<
"nm" <<
std::endl;
285 ofile <<
"#coordinates of fittedStar" << separator << separator;
286 ofile <<
"magnitude" << separator <<
"currently unused" << separator;
287 ofile <<
"refStar flux (maggies)" << separator <<
"refStar fluxErr" << separator;
288 ofile <<
"fittedStar flux (maggies)" << separator <<
"fittedStar fluxErr" << separator;
289 ofile <<
"unique index of the fittedStar" << separator <<
"refStar contribution to Chi2 (1 dof)" 290 << separator <<
"number of measurements of this FittedStar" <<
std::endl;
294 for (
auto const &fittedStar : fittedStarList) {
295 const RefStar *refStar = fittedStar->getRefStar();
296 if (refStar ==
nullptr)
continue;
301 ofile << fittedStar->x << separator << fittedStar->y << separator;
302 ofile << fittedStar->getMag() << separator << fittedStar->color << separator;
304 ofile << fittedStar->getFlux() << separator << fittedStar->getFluxErr() << separator;
305 ofile << fittedStar->getIndexInMatrix() << separator << chi2 << separator
306 << fittedStar->getMeasurementCount() <<
std::endl;
Objects used as position anchors, typically USNO stars.
double getFluxErr(size_t filter) const
reference fluxErr in a given filter
void saveChi2RefContributions(std::string const &baseName) const override
Save a CSV file containing residuals of reference terms.
A list of MeasuredStar. They are usually filled in Associations::createCcdImage.
afw::table::Key< double > sigma
void offsetParams(Eigen::VectorXd const &delta) override
Offset the parameters by the requested quantities.
#define LOGLS_DEBUG(logger, message)
Class for a simple mapping implementing a generic Gtransfo.
A list of FittedStar s. Such a list is typically constructed by Associations.
std::shared_ptr< Associations > _associations
#define LOGLS_INFO(logger, message)
void assignIndices(std::string const &whatToFit) override
Set parameters to fit and assign indices in the big matrix.
#define LSST_EXCEPT(type,...)
double getFlux(size_t filter) const
reference flux in a given filter
std::list< std::shared_ptr< CcdImage > > CcdImageList
T setprecision(T... args)
void saveChi2MeasContributions(std::string const &baseName) const override
Save a CSV file containing residuals of measurement terms.