7 #include "Eigen/Sparse" 21 void PhotometryFit::leastSquareDerivativesMeasurement(CcdImage
const &
ccdImage, TripletList &tripletList,
22 Eigen::VectorXd &grad,
23 MeasuredStarList
const *measuredStarList)
const {
32 if (measuredStarList) assert(&(measuredStarList->front()->getCcdImage()) == &ccdImage);
34 unsigned nparModel = (_fittingModel) ? _photometryModel->getNpar(ccdImage) : 0;
35 unsigned nparFlux = (_fittingFluxes) ? 1 : 0;
36 unsigned nparTotal = nparModel + nparFlux;
38 if (_fittingModel) _photometryModel->getMappingIndices(ccdImage, indices);
40 Eigen::VectorXd H(nparTotal);
42 unsigned kTriplets = tripletList.getNextFreeIndex();
43 const MeasuredStarList &catalog = (measuredStarList) ? *measuredStarList : ccdImage.getCatalogForFit();
45 for (
auto const &measuredStar : catalog) {
46 if (!measuredStar->isValid())
continue;
49 double residual = _photometryModel->computeResidual(ccdImage, *measuredStar);
50 double inverseSigma = 1.0 / _photometryModel->transformError(ccdImage, *measuredStar);
51 double W =
std::pow(inverseSigma, 2);
54 _photometryModel->computeParameterDerivatives(*measuredStar, ccdImage, H);
55 for (
unsigned k = 0; k < indices.size(); k++) {
56 unsigned l = indices[k];
57 tripletList.addTriplet(l, kTriplets, H[k] * inverseSigma);
58 grad[l] += H[k] * W * residual;
62 unsigned index = measuredStar->getFittedStar()->getIndexInMatrix();
64 tripletList.addTriplet(index, kTriplets, -1.0 * inverseSigma);
65 grad[index] += -1.0 * W * residual;
70 tripletList.setNextFreeIndex(kTriplets);
73 void PhotometryFit::leastSquareDerivativesReference(FittedStarList
const &fittedStarList,
74 TripletList &tripletList, Eigen::VectorXd &grad)
const {
81 if (!_fittingFluxes)
return;
85 unsigned kTriplets = tripletList.getNextFreeIndex();
87 for (
auto const &fittedStar : fittedStarList) {
88 auto refStar = fittedStar->getRefStar();
89 if (refStar ==
nullptr)
continue;
97 double inverseSigma = 1.0 / _photometryModel->getRefError(*refStar);
99 double residual = _photometryModel->computeRefResidual(*fittedStar, *refStar);
101 unsigned index = fittedStar->getIndexInMatrix();
103 tripletList.addTriplet(index, kTriplets, 1.0 * inverseSigma);
104 grad(index) += 1.0 *
std::pow(inverseSigma, 2) * residual;
107 tripletList.setNextFreeIndex(kTriplets);
110 void PhotometryFit::accumulateStatImageList(
CcdImageList const &ccdImageList, Chi2Accumulator &accum)
const {
115 for (
auto const &ccdImage : ccdImageList) {
116 auto &catalog = ccdImage->getCatalogForFit();
118 for (
auto const &measuredStar : catalog) {
119 if (!measuredStar->isValid())
continue;
120 double sigma = _photometryModel->transformError(*ccdImage, *measuredStar);
121 double residual = _photometryModel->computeResidual(*ccdImage, *measuredStar);
123 double chi2Val =
std::pow(residual / sigma, 2);
124 accum.addEntry(chi2Val, 1, measuredStar);
129 void PhotometryFit::accumulateStatRefStars(Chi2Accumulator &accum)
const {
135 FittedStarList &fittedStarList =
_associations->fittedStarList;
136 for (
auto const &fittedStar : fittedStarList) {
137 auto refStar = fittedStar->getRefStar();
138 if (refStar ==
nullptr)
continue;
139 double sigma = _photometryModel->getRefError(*refStar);
140 double residual = _photometryModel->computeRefResidual(*fittedStar, *refStar);
141 double chi2 =
std::pow(residual / sigma, 2);
142 accum.addEntry(chi2, 1, fittedStar);
149 void PhotometryFit::getIndicesOfMeasuredStar(MeasuredStar
const &measuredStar,
153 _photometryModel->getMappingIndices(measuredStar.getCcdImage(), indices);
155 if (_fittingFluxes) {
157 unsigned fsIndex = fs->getIndexInMatrix();
166 _fittingFluxes = (
_whatToFit.
find(
"Fluxes") != std::string::npos);
169 _nParModel = (_fittingModel) ? _photometryModel->assignIndices(whatToFit, 0) : 0;
170 unsigned ipar = _nParModel;
172 if (_fittingFluxes) {
178 fittedStar->setIndexInMatrix(ipar);
182 _nParFluxes = ipar - _nParModel;
185 "nParameters total: " <<
_nParTot <<
" model: " << _nParModel <<
" fluxes: " << _nParFluxes);
191 "PhotometryFit::offsetParams : the provided vector length is not compatible with " 192 "the current whatToFit setting");
193 if (_fittingModel) _photometryModel->offsetParams(delta);
195 if (_fittingFluxes) {
200 unsigned index = fittedStar->getIndexInMatrix();
201 _photometryModel->offsetFittedStar(*fittedStar, delta(index));
210 ofile <<
"#id" << separator <<
"xccd" << separator <<
"yccd" << separator;
211 ofile <<
"mag" << separator <<
"instMag" << separator <<
"instMagErr" << separator;
212 ofile <<
"instFlux" << separator <<
"instFluxErr" << separator;
213 ofile <<
"inputFlux" << separator <<
"inputFluxErr" << separator;
214 ofile <<
"transformedFlux" << separator <<
"transformedFluxErr" << separator;
215 ofile <<
"fittedFlux" << separator;
216 ofile <<
"mjd" << separator <<
"color" << separator;
217 ofile <<
"fsindex" << separator;
218 ofile <<
"ra" << separator <<
"dec" << separator;
219 ofile <<
"chi2" << separator <<
"nm" << separator;
220 ofile <<
"chip" << separator <<
"visit" << separator <<
std::endl;
222 ofile <<
"#id in source catalog" << separator <<
"coordinates in CCD" << separator << separator;
223 ofile <<
"fitted magnitude" << separator <<
"measured magnitude" << separator
224 <<
"measured magnitude error" << separator;
225 ofile <<
"measured instrumental flux (ADU)" << separator <<
"measured instrument flux error" << separator;
226 ofile <<
"measured flux (maggies)" << separator <<
"measured flux error" << separator;
227 ofile << separator << separator;
228 ofile <<
"fitted flux (maggies)" << separator;
229 ofile <<
"modified Julian date of the measurement" << separator <<
"currently unused" << separator;
230 ofile <<
"unique index of the fittedStar" << separator;
231 ofile <<
"on-sky position of fitted star" << separator << separator;
232 ofile <<
"contribution to Chi2 (1 dof)" << separator <<
"number of measurements of this FittedStar" 234 ofile <<
"chip id" << separator <<
"visit id" <<
std::endl;
237 for (
auto const &ccdImage : ccdImageList) {
239 for (
auto const &measuredStar : cat) {
240 if (!measuredStar->isValid())
continue;
242 double instFluxErr = _photometryModel->tweakFluxError(*measuredStar);
243 double flux = _photometryModel->transform(*ccdImage, *measuredStar);
244 double fluxErr = _photometryModel->transformError(*ccdImage, *measuredStar);
245 double jd = ccdImage->getMjd();
247 double residual = _photometryModel->computeResidual(*ccdImage, *measuredStar);
248 double chi2Val =
std::pow(residual / fluxErr, 2);
251 ofile << measuredStar->getId() << separator << measuredStar->x << separator << measuredStar->y
253 ofile << fittedStar->getMag() << separator << measuredStar->getInstMag() << separator
254 << measuredStar->getInstMagErr() << separator;
255 ofile << measuredStar->getInstFlux() << separator << instFluxErr << separator;
256 ofile << measuredStar->getFlux() << separator << measuredStar->getFluxErr() << separator;
257 ofile << flux << separator << fluxErr << separator << fittedStar->getFlux() << separator;
258 ofile << jd << separator << fittedStar->color << separator;
259 ofile << fittedStar->getIndexInMatrix() << separator;
260 ofile << fittedStar->x << separator << fittedStar->y << separator;
261 ofile << chi2Val << separator << fittedStar->getMeasurementCount() << separator;
262 ofile << ccdImage->getCcdId() << separator << ccdImage->getVisit() <<
std::endl;
271 ofile <<
"#ra" << separator <<
"dec " << separator;
272 ofile <<
"mag" << separator <<
"color" << separator;
273 ofile <<
"refFlux" << separator <<
"refFluxErr" << separator;
274 ofile <<
"fittedFlux" << separator <<
"fittedFluxErr" << separator;
275 ofile <<
"fsindex" << separator <<
"chi2" << separator <<
"nm" <<
std::endl;
277 ofile <<
"#coordinates of fittedStar" << separator << separator;
278 ofile <<
"magnitude" << separator <<
"currently unused" << separator;
279 ofile <<
"refStar flux (maggies)" << separator <<
"refStar fluxErr" << separator;
280 ofile <<
"fittedStar flux (maggies)" << separator <<
"fittedStar fluxErr" << separator;
281 ofile <<
"unique index of the fittedStar" << separator <<
"refStar contribution to Chi2 (1 dof)" 282 << separator <<
"number of measurements of this FittedStar" <<
std::endl;
286 for (
auto const &fittedStar : fittedStarList) {
287 const RefStar *refStar = fittedStar->getRefStar();
288 if (refStar ==
nullptr)
continue;
293 ofile << fittedStar->x << separator << fittedStar->y << separator;
294 ofile << fittedStar->getMag() << separator << fittedStar->color << separator;
296 ofile << fittedStar->getFlux() << separator << fittedStar->getFluxErr() << separator;
297 ofile << fittedStar->getIndexInMatrix() << separator << chi2 << separator
298 << 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
#define LOGLS_INFO(logger, message)
void offsetParams(Eigen::VectorXd const &delta) override
Offset the parameters by the requested quantities.
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
void assignIndices(std::string const &whatToFit) override
Set parameters to fit and assign indices in the big matrix.
#define LSST_EXCEPT(type,...)
#define LOGLS_DEBUG(logger, message)
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.