Changeset 27531 for trunk/psModules/src/objects/pmSourcePhotometry.c
- Timestamp:
- Mar 30, 2010, 1:29:50 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/objects/pmSourcePhotometry.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/pmSourcePhotometry.c
r25980 r27531 109 109 psAssert (isfinite(fluxScale), "how can the flux scale be invalid? source at %d, %d\n", source->peak->x, source->peak->y); 110 110 psAssert (fluxScale > 0.0, "how can the flux scale be negative? source at %d, %d\n", source->peak->x, source->peak->y); 111 source->psfMag = -2.5*log10(fluxScale * source->modelPSF->params->data.F32[PM_PAR_I0]); 111 source->psfFlux = fluxScale * source->modelPSF->params->data.F32[PM_PAR_I0]; 112 source->psfFluxErr = fluxScale * source->modelPSF->dparams->data.F32[PM_PAR_I0]; 113 source->psfMag = -2.5*log10(source->psfFlux); 112 114 } else { 113 status = pmSourcePhotometryModel (&source->psfMag, source->modelPSF); 115 status = pmSourcePhotometryModel (&source->psfMag, &source->psfFlux, source->modelPSF); 116 source->psfFluxErr = source->psfFlux * (source->modelPSF->dparams->data.F32[PM_PAR_I0] / source->modelPSF->params->data.F32[PM_PAR_I0]); 114 117 } 115 118 … … 119 122 for (int i = 0; i < source->modelFits->n; i++) { 120 123 pmModel *model = source->modelFits->data[i]; 121 status = pmSourcePhotometryModel (&model->mag, model);124 status = pmSourcePhotometryModel (&model->mag, NULL, model); 122 125 if (model == source->modelEXT) foundEXT = true; 123 126 } … … 125 128 source->extMag = source->modelEXT->mag; 126 129 } else { 127 status = pmSourcePhotometryModel (&source->extMag, source->modelEXT);130 status = pmSourcePhotometryModel (&source->extMag, NULL, source->modelEXT); 128 131 } 129 132 } else { 130 133 if (source->modelEXT) { 131 status = pmSourcePhotometryModel (&source->extMag, source->modelEXT);134 status = pmSourcePhotometryModel (&source->extMag, NULL, source->modelEXT); 132 135 } 133 136 } … … 143 146 if (mode & PM_SOURCE_PHOT_WEIGHT) { 144 147 pmSourcePixelWeight (&source->pixWeight, model, source->maskObj, maskVal); 148 } 149 150 // measure the contribution of included pixels 151 if (mode & PM_SOURCE_PHOT_DIFFSTATS) { 152 pmSourceMeasureDiffStats (source, maskVal); 145 153 } 146 154 … … 217 225 218 226 // return source model magnitude 219 bool pmSourcePhotometryModel (float *fitMag, pmModel *model) 220 { 221 PS_ASSERT_PTR_NON_NULL(fitMag, false); 222 if (model == NULL) { 223 return false; 224 } 225 226 float fitSum = 0; 227 *fitMag = NAN; 227 bool pmSourcePhotometryModel (float *fitMag, float *fitFlux, pmModel *model) 228 { 229 psAssert (fitMag || fitFlux, "at least one of magnitude or flux must be requested (not NULL)"); 230 if (model == NULL) return false; 231 232 float mag = NAN; 233 float flux = NAN; 228 234 229 235 // measure fitMag 230 fitSum = model->modelFlux (model->params); 231 if (fitSum <= 0) 232 return false; 233 if (!isfinite(fitSum)) 234 return false; 235 *fitMag = -2.5*log10(fitSum); 236 flux = model->modelFlux (model->params); 237 if (flux > 0) { 238 mag = -2.5*log10(flux); 239 } 240 if (fitMag) { 241 *fitMag = mag; 242 } 243 if (fitFlux) { 244 *fitFlux = flux; 245 } 246 247 if (flux <= 0) return false; 248 if (!isfinite(flux)) return false; 236 249 237 250 return (true); … … 356 369 357 370 *pixWeight = validSum / modelSum; 371 return (true); 372 } 373 374 # define FLUX_LIMIT 3.0 375 376 // return source aperture magnitude 377 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal) 378 { 379 PS_ASSERT_PTR_NON_NULL(source, false); 380 381 if (source->diffStats == NULL) { 382 source->diffStats = pmSourceDiffStatsAlloc(); 383 } 384 385 float fGood = 0.0; 386 float fBad = 0.0; 387 int nGood = 0; 388 int nMask = 0; 389 int nBad = 0; 390 391 psImage *flux = source->pixels; 392 psImage *variance = source->variance; 393 psImage *mask = source->maskObj; 394 395 for (int iy = 0; iy < flux->numRows; iy++) { 396 for (int ix = 0; ix < flux->numCols; ix++) { 397 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & maskVal) { 398 nMask ++; 399 continue; 400 } 401 402 float SN = flux->data.F32[iy][ix] / sqrt(variance->data.F32[iy][ix]); 403 404 if (SN > +FLUX_LIMIT) { 405 nGood ++; 406 fGood += fabs(flux->data.F32[iy][ix]); 407 } 408 409 if (SN < -FLUX_LIMIT) { 410 nBad ++; 411 fBad += fabs(flux->data.F32[iy][ix]); 412 } 413 } 414 } 415 416 source->diffStats->nGood = nGood; 417 source->diffStats->fRatio = (fGood + fBad == 0.0) ? NAN : fGood / (fGood + fBad); 418 source->diffStats->nRatioBad = (nGood + nBad == 0) ? NAN : nGood / (float) (nGood + nBad); 419 source->diffStats->nRatioMask = (nGood + nMask == 0) ? NAN : nGood / (float) (nGood + nMask); 420 source->diffStats->nRatioAll = (nGood + nMask + nBad == 0) ? NAN : nGood / (float) (nGood + nMask + nBad); 421 358 422 return (true); 359 423 }
Note:
See TracChangeset
for help on using the changeset viewer.
