Changeset 34086 for trunk/psphot/src/psphotFitSourcesLinear.c
- Timestamp:
- Jun 26, 2012, 11:33:10 AM (14 years ago)
- Location:
- trunk/psphot
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20120601/psphot (added) merged: 34002,34032,34049,34051,34053,34055-34056,34060-34061,34071-34073,34076,34078
- Property svn:mergeinfo changed
-
trunk/psphot/src
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20120601/psphot/src (added) merged: 34049,34051,34053,34060-34061,34071-34073,34078
- Property svn:mergeinfo changed
-
trunk/psphot/src/psphotFitSourcesLinear.c
r33994 r34086 12 12 static bool SetBorderMatrixElements (psSparseBorder *border, pmReadout *readout, psArray *sources, bool constant_weights, int SKY_FIT_ORDER, psImageMaskType markVal); 13 13 14 # if (HAVE_MODEL_VAR)15 bool psphotGenerateModelVariance (pmConfig *config, const pmFPAview *view, pmFPAfile *file, int index, psMetadata *recipe, pmReadout *readout, psArray *sources);16 pmSourceFitVarMode psphotGetFitVarMode (psMetadata *recipe);17 bool psphotFreeModelVariance (pmReadout *readout, psArray *sources);18 # endif19 20 14 // for now, let's store the detections on the readout->analysis for each readout 21 15 bool psphotFitSourcesLinear (pmConfig *config, const pmFPAview *view, const char *filerule, bool final) … … 30 24 assert (recipe); 31 25 32 # if (HAVE_MODEL_VAR)33 26 pmSourceFitVarMode fitVarMode = psphotGetFitVarMode (recipe); 34 27 if (!fitVarMode) { … … 40 33 // do a single pass. 41 34 pmSourceFitVarMode fitVarModePass1 = (fitVarMode == PM_SOURCE_PHOTFIT_MODEL_VAR) ? PM_SOURCE_PHOTFIT_CONST : fitVarMode; 42 # endif43 35 44 36 int num = psphotFileruleCount(config, filerule); … … 68 60 psAssert (psf, "missing psf?"); 69 61 70 # if (HAVE_MODEL_VAR) 71 if (!psphotFitSourcesLinearReadout (recipe, readout, sources, psf, final, fitVarModePass1)) 72 # else 73 if (!psphotFitSourcesLinearReadout (recipe, readout, sources, psf, final)) 74 # endif 75 { 62 if (!psphotFitSourcesLinearReadout (recipe, readout, sources, psf, final, fitVarModePass1)) { 76 63 psError (PSPHOT_ERR_CONFIG, false, "failed to fit sources (linear) for %s entry %d", filerule, i); 77 64 return false; 78 65 } 79 66 80 # if (HAVE_MODEL_VAR)81 67 // the MODEL_VAR weighting scheme requires knowledge of the model fluxes to generate the variance 82 68 // after we have determined the initial set of fits, then we can generate the variance image and … … 104 90 } 105 91 } 106 # endif107 92 108 93 psphotVisualShowResidualImage (readout, (num > 0)); … … 113 98 } 114 99 115 # if (HAVE_MODEL_VAR)116 100 // look up the fit variance mode from the recipe; older recipes do not have the value 117 101 // 'LINEAR_FIT_VARIANCE_MODE'; in those cases, look for 'CONSTANT_PHOTOMETRIC_WEIGHTS' as a boolean and … … 136 120 return PM_SOURCE_PHOTFIT_IMAGE_VAR; 137 121 } 122 if (!strcasecmp(fitVarModeString, "SKY") || !strcasecmp(fitVarModeString, "MODEL_SKY")) { 123 return PM_SOURCE_PHOTFIT_MODEL_SKY; 124 } 138 125 if (!strcasecmp(fitVarModeString, "MODEL") || !strcasecmp(fitVarModeString, "MODEL_VAR")) { 139 126 return PM_SOURCE_PHOTFIT_MODEL_VAR; … … 142 129 return PM_SOURCE_PHOTFIT_NONE; 143 130 } 144 # endif 145 146 # if (HAVE_MODEL_VAR) 147 bool psphotFitSourcesLinearReadout (psMetadata *recipe, pmReadout *readout, psArray *sources, pmPSF *psf, bool final, pmSourceFitVarMode fitVarMode) 148 # else 149 bool psphotFitSourcesLinearReadout (psMetadata *recipe, pmReadout *readout, psArray *sources, pmPSF *psf, bool final) 150 # endif 151 { 131 132 bool psphotFitSourcesLinearReadout (psMetadata *recipe, pmReadout *readout, psArray *sources, pmPSF *psf, bool final, pmSourceFitVarMode fitVarMode) { 152 133 bool status; 153 134 float x; … … 185 166 if (psRegionIsNaN (AnalysisRegion)) psAbort("analysis region mis-defined"); 186 167 187 # if (!HAVE_MODEL_VAR)188 bool CONSTANT_PHOTOMETRIC_WEIGHTS =189 psMetadataLookupBool(&status, recipe, "CONSTANT_PHOTOMETRIC_WEIGHTS");190 if (!status) {191 psAbort("You must provide a value for the BOOL recipe CONSTANT_PHOTOMETRIC_WEIGHTS");192 }193 # endif194 168 int SKY_FIT_ORDER = psMetadataLookupS32(&status, recipe, "SKY_FIT_ORDER"); 195 169 if (!status) { … … 299 273 source->mode |= PM_SOURCE_MODE_PSFMODEL; 300 274 } 301 275 302 276 psArrayAdd (fitSources, 100, source); 303 277 } … … 319 293 psSparseBorder *border = psSparseBorderAlloc (sparse, nBorder); 320 294 321 # if (HAVE_MODEL_VAR)322 295 // if fitVarMode is MODEL_VAR, then we need to generate the model image variance 323 296 // XXX we have two possibilities here: … … 327 300 328 301 // 2) do a single pass, and use the model guess to define the model variance (but do I trust the Model Guess?) 329 # endif330 302 331 303 // fill out the sparse matrix elements and border elements (B) … … 336 308 337 309 // diagonal elements of the sparse matrix (auto-cross-product) 338 # if (HAVE_MODEL_VAR) 339 f = pmSourceModelDotModel (SRCi, SRCi, fitVarMode, covarFactor, maskVal); 340 # else 341 f = pmSourceModelDotModel (SRCi, SRCi, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal); 342 # endif 343 psSparseMatrixElement (sparse, i, i, f); 344 345 # if (HAVE_MODEL_VAR) 346 // if we have used CONSTANT errors, then we need to calculate the value of the parameter error 310 float MM = pmSourceModelDotModel (SRCi, SRCi, fitVarMode, covarFactor, maskVal); 311 psSparseMatrixElement (sparse, i, i, MM); 312 313 // if we have used CONSTANT errors, then we need to re-calculate the value of the parameter error 347 314 if (fitVarMode != PM_SOURCE_PHOTFIT_IMAGE_VAR) { 348 315 float var = pmSourceModelDotModel (SRCi, SRCi, PM_SOURCE_PHOTFIT_IMAGE_VAR, covarFactor, maskVal); 349 316 errors->data.F32[i] = 1.0 / sqrt(var); 350 317 } else { 351 errors->data.F32[i] = 1.0 / sqrt(f); 352 } 353 # else 354 // the formal error depends on the weighting scheme 355 if (CONSTANT_PHOTOMETRIC_WEIGHTS) { 356 float var = pmSourceModelDotModel (SRCi, SRCi, false, covarFactor, maskVal); 357 errors->data.F32[i] = 1.0 / sqrt(var); 358 } else { 359 errors->data.F32[i] = 1.0 / sqrt(f); 360 } 361 # endif 318 errors->data.F32[i] = 1.0 / sqrt(MM); 319 } 362 320 363 321 // find the image x model value 364 # if (HAVE_MODEL_VAR) 365 f = pmSourceDataDotModel (SRCi, SRCi, fitVarMode, covarFactor, maskVal); 366 # else 367 f = pmSourceDataDotModel (SRCi, SRCi, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal); 368 # endif 369 psSparseVectorElement (sparse, i, f); 322 float FM = pmSourceDataDotModel (SRCi, SRCi, fitVarMode, covarFactor, maskVal); 323 psSparseVectorElement (sparse, i, FM); 370 324 371 325 // add the per-source variances (border region) 372 326 switch (SKY_FIT_ORDER) { 373 327 case 1: 374 # if (HAVE_MODEL_VAR)375 328 f = pmSourceModelWeight (SRCi, 1, fitVarMode, covarFactor, maskVal); 376 329 psSparseBorderElementB (border, i, 1, f); 377 330 f = pmSourceModelWeight (SRCi, 2, fitVarMode, covarFactor, maskVal); 378 331 psSparseBorderElementB (border, i, 2, f); 379 # else380 f = pmSourceModelWeight (SRCi, 1, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal);381 psSparseBorderElementB (border, i, 1, f);382 f = pmSourceModelWeight (SRCi, 2, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal);383 psSparseBorderElementB (border, i, 2, f);384 # endif385 332 386 333 case 0: 387 # if (HAVE_MODEL_VAR)388 334 f = pmSourceModelWeight (SRCi, 0, fitVarMode, covarFactor, maskVal); 389 # else390 f = pmSourceModelWeight (SRCi, 0, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal);391 # endif392 335 psSparseBorderElementB (border, i, 0, f); 393 336 break; … … 409 352 410 353 // got an overlap; calculate cross-product and add to output array 411 # if (HAVE_MODEL_VAR)412 354 f = pmSourceModelDotModel (SRCi, SRCj, fitVarMode, covarFactor, maskVal); 413 # else414 f = pmSourceModelDotModel (SRCi, SRCj, CONSTANT_PHOTOMETRIC_WEIGHTS, covarFactor, maskVal);415 # endif416 355 psSparseMatrixElement (sparse, j, i, f); 417 356 } … … 451 390 452 391 // set the sky, sky_x, sky_y components of border matrix 453 # if (HAVE_MODEL_VAR)454 392 SetBorderMatrixElements (border, readout, fitSources, (fitVarMode == PM_SOURCE_PHOTFIT_CONST), SKY_FIT_ORDER, markVal); 455 # else456 SetBorderMatrixElements (border, readout, fitSources, CONSTANT_PHOTOMETRIC_WEIGHTS, SKY_FIT_ORDER, markVal);457 # endif458 393 459 394 psSparseConstraint constraint; … … 500 435 psLogMsg ("psphot.ensemble", PS_LOG_MINUTIA, "sub models: %f sec (%d elements)\n", psTimerMark ("psphot.linear"), sparse->Nelem); 501 436 437 // mean stats on fit windows 438 float sumRadius = 0.0; 439 float sumPixels = 0.0; 440 float sumSource = 0.0; 441 502 442 // measure chisq for each source 503 443 // for (int i = 0; final && (i < fitSources->n); i++) { … … 505 445 pmSource *source = fitSources->data[i]; 506 446 pmModel *model = pmSourceGetModel (NULL, source); 447 448 // accumulate fit windows statistics 449 sumRadius += model->fitRadius; 450 sumPixels += M_PI*PS_SQR(model->fitRadius); 451 sumSource += 1.0; 452 507 453 if (!(source->mode & PM_SOURCE_MODE_NONLINEAR_FIT)) { 508 454 model->nPar = 1; // LINEAR-only sources have 1 parameter; NONLINEAR sources have their original value … … 511 457 } 512 458 psLogMsg ("psphot.ensemble", PS_LOG_MINUTIA, "get chisqs: %f sec (%d elements)\n", psTimerMark ("psphot.linear"), sparse->Nelem); 459 460 float meanRadius = sumRadius / sumSource; 461 float meanPixels = sumPixels / sumSource; 513 462 514 463 // psFree (index); … … 520 469 psFree (border); 521 470 522 psLogMsg ("psphot.ensemble", PS_LOG_WARN, "measure ensemble of PSFs : %f sec\n", psTimerMark ("psphot.linear"));471 psLogMsg ("psphot.ensemble", PS_LOG_WARN, "measure ensemble of PSFs (mean radius = %f pixels, mean area = %f pixels: %f sec\n", meanRadius, meanPixels, psTimerMark ("psphot.linear")); 523 472 524 473 psphotVisualPlotChisq (sources); … … 531 480 return true; 532 481 } 533 534 // XXX do we need this?535 // XXX disallow the simultaneous sky fit and remove this code...536 482 537 483 // Calculate the weight terms for the sky fit component of the matrix. This function operates … … 614 560 } 615 561 616 # if (HAVE_MODEL_VAR)617 562 bool psphotModelBackgroundReadout(psImage *model, // Model image 618 563 psImage *modelStdev, // Model stdev image … … 624 569 ); 625 570 626 bool psphotGenerateModelVariance (pmConfig *config, const pmFPAview *view, pmFPAfile *file, int index, psMetadata *recipe, pmReadout *readout, psArray *sources) {571 bool psphotGenerateModelVariance (pmConfig *config, const pmFPAview *view, pmFPAfile *file, int index, psMetadata *recipe, pmReadout *readout, psArray *sources) { 627 572 628 573 bool status = false; … … 650 595 psImage *varModelStdev = psImageAlloc(backBinning->nXruff, backBinning->nYruff, PS_TYPE_F32); // Background model 651 596 597 // generate an image of the mean variance image in DN 652 598 if (!psphotModelBackgroundReadout(varModel, varModelStdev, NULL, readout, backBinning, config, true)) { 653 599 psError(PS_ERR_UNKNOWN, false, "Unable to generate background model"); … … 664 610 return false; 665 611 } 666 667 612 psFree (varModel); 668 613 psFree (varModelStdev); 669 614 670 // XXX for a test: 671 psphotSaveImage (NULL, modelVar, "model.bck.fits"); 615 float gain = 1.0; // accept 1.0 as a default since it is not critical to the analysis 616 pmCell *cell = readout->parent; // The parent cell 617 if (cell) { 618 gain = psMetadataLookupF32(&status, cell->concepts, "CELL.GAIN"); // Cell gain 619 if (!status) { 620 gain = 1.0; // set note above 621 } 622 } 623 if (gain > 2.0) { /* warn? */ } 624 // XXX we are not actually using the gain, but need to test it to avoid gcc pedantic warnings 672 625 673 626 // insert all of the source models … … 690 643 691 644 // add the source model to the model variance image 645 // XXX note that this should be added with gain applied 646 // var_DN = flux_DN / gain [e/DN] 647 // to do this requires an API upgrade... 692 648 pmSourceAdd (source, PM_MODEL_OP_MODELVAR, maskVal); 693 649 } 694 695 // XXX for a test:696 psphotSaveImage (NULL, modelVar, "model.var.fits");697 psphotSaveImage (NULL, readout->variance, "image.var.fits");698 650 699 651 // we save the model variance for future reference … … 724 676 return true; 725 677 } 726 # endif
Note:
See TracChangeset
for help on using the changeset viewer.
