Changeset 26894 for trunk/psphot/src/psphotBlendFit.c
- Timestamp:
- Feb 10, 2010, 7:36:29 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotBlendFit.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotBlendFit.c
r25755 r26894 1 1 # include "psphotInternal.h" 2 2 3 // for now, let's store the detections on the readout->analysis for each readout 4 bool psphotBlendFit (pmConfig *config, const pmFPAview *view) 5 { 6 bool status = true; 7 8 // select the appropriate recipe information 9 psMetadata *recipe = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE); 10 psAssert (recipe, "missing recipe?"); 11 12 int num = psMetadataLookupS32 (&status, config->arguments, "PSPHOT.INPUT.NUM"); 13 psAssert (status, "programming error: must define PSPHOT.INPUT.NUM"); 14 15 // loop over the available readouts 16 for (int i = 0; i < num; i++) { 17 if (!psphotBlendFitReadout (config, view, "PSPHOT.INPUT", i, recipe)) { 18 psError (PSPHOT_ERR_CONFIG, false, "failed to fit sources (non-linear) for PSPHOT.INPUT entry %d", i); 19 return false; 20 } 21 } 22 return true; 23 } 24 3 25 // XXX I don't like this name 4 bool psphotBlendFit (pmConfig *config, pmReadout *readout, psArray *sources, pmPSF *psf) {26 bool psphotBlendFitReadout (pmConfig *config, const pmFPAview *view, const char *filename, int index, psMetadata *recipe) { 5 27 6 28 int Nfit = 0; … … 12 34 psTimerStart ("psphot.fit.nonlinear"); 13 35 14 // select the appropriate recipe information 15 psMetadata *recipe = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE); 16 assert (recipe); 36 // find the currently selected readout 37 pmFPAfile *file = pmFPAfileSelectSingle(config->files, filename, index); // File of interest 38 psAssert (file, "missing file?"); 39 40 pmReadout *readout = pmFPAviewThisReadout(view, file->fpa); 41 psAssert (readout, "missing readout?"); 42 43 pmDetections *detections = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.DETECTIONS"); 44 psAssert (detections, "missing detections?"); 45 46 psArray *sources = detections->allSources; 47 psAssert (sources, "missing sources?"); 48 49 if (!sources->n) { 50 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping blend fit"); 51 return true; 52 } 53 54 pmPSF *psf = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.PSF"); 55 psAssert (psf, "missing psf?"); 17 56 18 57 // determine the number of allowed threads … … 40 79 psphotInitLimitsPSF (recipe, readout); 41 80 psphotInitLimitsEXT (recipe); 42 psphotInitRadiusPSF (recipe, psf->type);81 psphotInitRadiusPSF (recipe, readout->analysis, psf->type); 43 82 44 83 // starts the timer, sets up the array of fitSets … … 47 86 // source analysis is done in S/N order (brightest first) 48 87 sources = psArraySort (sources, pmSourceSortBySN); 88 if (!sources->n) { 89 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping blend"); 90 return true; 91 } 49 92 50 93 // choose Cx, Cy (see psphotThreadTools.c for overview of the concepts) … … 272 315 } 273 316 274 # if (0)275 bool psphotBlendFit_Unthreaded (int *nfit, int *npsf, int *next, int *nfail, pmReadout *readout, psMetadata *recipe, psArray *sources, pmPSF *psf, psArray *newSources) {276 277 bool status = false;278 int Nfit = 0;279 int Npsf = 0;280 int Next = 0;281 int Nfail = 0;282 283 // bit-masks to test for good/bad pixels284 psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT");285 assert (maskVal);286 287 // bit-mask to mark pixels not used in analysis288 psImageMaskType markVal = psMetadataLookupImageMask(&status, recipe, "MARK.PSPHOT");289 assert (markVal);290 291 // maskVal is used to test for rejected pixels, and must include markVal292 maskVal |= markVal;293 294 // S/N limit to perform full non-linear fits295 float FIT_SN_LIM = psMetadataLookupF32 (&status, recipe, "FULL_FIT_SN_LIM");296 297 // option to limit analysis to a specific region298 char *region = psMetadataLookupStr (&status, recipe, "ANALYSIS_REGION");299 psRegion AnalysisRegion = psRegionForImage (readout->image, psRegionFromString (region));300 if (psRegionIsNaN (AnalysisRegion)) psAbort("analysis region mis-defined");301 302 for (int i = 0; i < sources->n; i++) {303 pmSource *source = sources->data[i];304 305 // skip non-astronomical objects (very likely defects)306 if (source->mode & PM_SOURCE_MODE_BLEND) continue;307 if (source->mode & PM_SOURCE_MODE_CR_LIMIT) continue;308 if (source->type == PM_SOURCE_TYPE_DEFECT) continue;309 if (source->type == PM_SOURCE_TYPE_SATURATED) continue;310 311 // skip DBL second sources (ie, added by psphotFitBlob)312 if (source->mode & PM_SOURCE_MODE_PAIR) continue;313 314 // limit selection to some SN limit315 if (source->peak->SN < FIT_SN_LIM) continue;316 317 // exclude sources outside optional analysis region318 if (source->peak->xf < AnalysisRegion.x0) continue;319 if (source->peak->yf < AnalysisRegion.y0) continue;320 if (source->peak->xf > AnalysisRegion.x1) continue;321 if (source->peak->yf > AnalysisRegion.y1) continue;322 323 // if model is NULL, we don't have a starting guess324 if (source->modelPSF == NULL) continue;325 326 // skip sources which are insignificant flux?327 // XXX this is somewhat ad-hoc328 if (source->modelPSF->params->data.F32[1] < 0.1) {329 psTrace ("psphot", 5, "skipping near-zero source: %f, %f : %f\n",330 source->modelPSF->params->data.F32[1],331 source->modelPSF->params->data.F32[2],332 source->modelPSF->params->data.F32[3]);333 continue;334 }335 336 // replace object in image337 if (source->tmpFlags & PM_SOURCE_TMPF_SUBTRACTED) {338 pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);339 }340 Nfit ++;341 342 // try fitting PSFs or extended sources depending on source->mode343 // these functions subtract the resulting fitted source344 if (source->mode & PM_SOURCE_MODE_EXT_LIMIT) {345 if (psphotFitBlob (readout, source, newSources, psf, maskVal, markVal)) {346 source->type = PM_SOURCE_TYPE_EXTENDED;347 psTrace ("psphot", 5, "source at %7.1f, %7.1f is ext", source->peak->xf, source->peak->yf);348 Next ++;349 continue;350 }351 } else {352 if (psphotFitBlend (readout, source, psf, maskVal, markVal)) {353 source->type = PM_SOURCE_TYPE_STAR;354 psTrace ("psphot", 5, "source at %7.1f, %7.1f is psf", source->peak->xf, source->peak->yf);355 Npsf ++;356 continue;357 }358 }359 360 psTrace ("psphot", 5, "source at %7.1f, %7.1f failed", source->peak->xf, source->peak->yf);361 Nfail ++;362 363 // re-subtract the object, leave local sky364 pmSourceCacheModel (source, maskVal);365 pmSourceSub (source, PM_MODEL_OP_FULL, maskVal);366 }367 368 // change the value of a scalar on the array (wrap this and put it in psArray.h)369 *nfit = Nfit;370 *npsf = Npsf;371 *next = Next;372 *nfail = Nfail;373 374 // moments are modified by the fit; re-display375 psphotVisualPlotMoments (recipe, sources);376 psphotVisualShowResidualImage (readout);377 378 return true;379 }380 # endif
Note:
See TracChangeset
for help on using the changeset viewer.
