Changeset 27838 for branches/tap_branches/psphot/src/psphotChoosePSF.c
- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_branches
- Files:
-
- 4 edited
-
. (modified) (1 prop)
-
psphot (modified) (1 prop)
-
psphot/src (modified) (1 prop)
-
psphot/src/psphotChoosePSF.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/psphot
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psphot merged eligible /branches/eam_branches/stackphot.20100406/psphot 27622-27655 /branches/pap_delete/psphot 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/tap_branches/psphot/src
- Property svn:ignore
-
old new 19 19 psphotMomentsStudy 20 20 psphotPetrosianStudy 21 psphotForced 22 psphotMakePSF 23 psphotStack
-
- Property svn:ignore
-
branches/tap_branches/psphot/src/psphotChoosePSF.c
r25755 r27838 1 1 # include "psphotInternal.h" 2 2 3 // generate a PSF model for inputs without PSF models already loaded 4 bool psphotChoosePSF (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 // skip the chisq image (optionally?) 16 int chisqNum = psMetadataLookupS32 (&status, config->arguments, "PSPHOT.CHISQ.NUM"); 17 if (!status) chisqNum = -1; 18 19 // loop over the available readouts 20 for (int i = 0; i < num; i++) { 21 if (i == chisqNum) continue; // skip chisq image 22 if (!psphotChoosePSFReadout (config, view, "PSPHOT.INPUT", i, recipe)) { 23 psError (PSPHOT_ERR_CONFIG, false, "failed to choose a psf model for PSPHOT.INPUT entry %d", i); 24 return false; 25 } 26 } 27 return true; 28 } 29 3 30 // try PSF models and select best option 4 pmPSF *psphotChoosePSF (pmReadout *readout, psArray *sources, psMetadata *recipe) {31 bool psphotChoosePSFReadout (pmConfig *config, const pmFPAview *view, const char *filename, int index, psMetadata *recipe) { 5 32 6 33 bool status; 7 34 8 35 psTimerStart ("psphot.choose.psf"); 36 37 // find the currently selected readout 38 pmFPAfile *file = pmFPAfileSelectSingle(config->files, filename, index); // File of interest 39 psAssert (file, "missing file?"); 40 41 pmReadout *readout = pmFPAviewThisReadout(view, file->fpa); 42 psAssert (readout, "missing readout?"); 43 44 // do not generate a PSF if we already were supplied one 45 if (psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.PSF")) { 46 psLogMsg ("psphot", PS_LOG_DETAIL, "psf model supplied for input file %d", index); 47 return true; 48 } 49 50 pmDetections *detections = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.DETECTIONS"); 51 psAssert (detections, "missing detections?"); 52 53 psArray *sources = detections->newSources; 54 psAssert (sources, "missing sources?"); 55 56 if (!sources->n) { 57 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping PSF model"); 58 return false; 59 } 9 60 10 61 // bit-masks to test for good/bad pixels 11 62 psImageMaskType maskVal = psMetadataLookupImageMask(&status, recipe, "MASK.PSPHOT"); 12 assert (maskVal);63 psAssert (maskVal, "missing mask value?"); 13 64 14 65 // bit-mask to mark pixels not used in analysis 15 66 psImageMaskType markVal = psMetadataLookupImageMask(&status, recipe, "MARK.PSPHOT"); 16 assert (markVal);67 psAssert (markVal, "missing mark value?"); 17 68 18 69 // maskVal is used to test for rejected pixels, and must include markVal … … 61 112 // assert (status); 62 113 63 // We have calculated a Gaussian window function, use that for both the PSF fit radius and 64 // the aperture radius (scaling SIGMA) 65 float gaussSigma = psMetadataLookupF32(&status, recipe, "MOMENTS_GAUSS_SIGMA"); 114 // values on readout->analysis if we have calculated a Gaussian window function, use that 115 // for both the PSF fit radius and the aperture radius (scaling SIGMA), otherwise base the value on the recipe value for MOMENTS_GAUSS_SIGMA 116 float gaussSigma = psMetadataLookupF32 (&status, readout->analysis, "MOMENTS_GAUSS_SIGMA"); 117 if (!status) { 118 gaussSigma = psMetadataLookupF32 (&status, recipe, "MOMENTS_GAUSS_SIGMA"); 119 } 66 120 float fitScale = psMetadataLookupF32(&status, recipe, "PSF_FIT_RADIUS_SCALE"); 67 121 float apScale = psMetadataLookupF32(&status, recipe, "PSF_APERTURE_SCALE"); … … 70 124 71 125 // XXX use the same radii for standard analysis as for the PSF creation 72 psMetadataAddF32(recipe, PS_LIST_TAIL, "PSF_FIT_RADIUS", PS_META_REPLACE, "fit radius", options->fitRadius); 73 psMetadataAddF32(recipe, PS_LIST_TAIL, "PSF_APERTURE", PS_META_REPLACE, "psf aperture", options->apRadius); 74 75 // XXX ROBUST seems to be too agressive given the small numbers. 76 // options->stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); 77 options->stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV); 126 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "PSF_FIT_RADIUS", PS_META_REPLACE, "fit radius", options->fitRadius); 127 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "PSF_APERTURE", PS_META_REPLACE, "psf aperture", options->apRadius); 78 128 79 129 // dimensions of the field for which the PSF is defined … … 116 166 psLogMsg ("psphot.pspsf", PS_LOG_DETAIL, "selected candidate %ld PSF objects\n", stars->n); 117 167 168 if (stars->n < 50) { 169 // ROBUST is too agressive if we only have a small number of PSF stars 170 options->stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV); 171 } else { 172 options->stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); 173 } 174 118 175 // get the list pointers for the PSF_MODEL entries 119 176 psArray *modelNames = NULL; … … 155 212 bool status = true; 156 213 status &= psphotMakeFluxScale (readout->image, recipe, psf); 157 status &= psphotPSFstats (readout, recipe,psf);214 status &= psphotPSFstats (readout, psf); 158 215 if (!status) { 159 216 psError(PSPHOT_ERR_PSF, false, "Failed to fit any models when choosing PSF"); … … 230 287 bool status = true; 231 288 status &= psphotMakeFluxScale (readout->image, recipe, psf); 232 status &= psphotPSFstats (readout, recipe,psf);289 status &= psphotPSFstats (readout, psf); 233 290 if (!status) { 234 291 psError(PSPHOT_ERR_PSF, false, "Failed to fit any models when choosing PSF"); … … 287 344 psFree (models); 288 345 289 if (!psphotPSFstats (readout, recipe,psf)) {346 if (!psphotPSFstats (readout, psf)) { 290 347 psError(PSPHOT_ERR_PSF, false, "cannot measure PSF shape terms"); 291 348 psFree(options); … … 299 356 300 357 psFree (options); 301 return (psf); 358 359 // save PSF on readout->analysis 360 if (!psMetadataAddPtr (readout->analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_META_REPLACE | PS_DATA_UNKNOWN, "psphot psf model", psf)) { 361 psError (PSPHOT_ERR_UNKNOWN, false, "problem saving sources on readout"); 362 return false; 363 } 364 psFree (psf); // XXX double-check 365 366 // move into psphotChoosePSF 367 psphotVisualShowPSFModel (readout, psf); 368 369 return true; 302 370 } 303 371 304 372 // measure average parameters of the PSF model 305 bool psphotPSFstats (pmReadout *readout, p sMetadata *recipe, pmPSF *psf) {373 bool psphotPSFstats (pmReadout *readout, pmPSF *psf) { 306 374 307 375 psEllipseShape shape; … … 309 377 310 378 PS_ASSERT_PTR_NON_NULL(readout, false); 311 PS_ASSERT_PTR_NON_NULL(recipe, false);312 379 PS_ASSERT_PTR_NON_NULL(psf, false); 313 380 … … 329 396 pmModel *modelPSF = pmModelFromPSFforXY (psf, xc, yc, 1.0); 330 397 if (!modelPSF) { 331 fprintf (stderr, "?");332 continue;333 }398 fprintf (stderr, "?"); 399 continue; 400 } 334 401 335 402 // get the model full-width at half-max … … 345 412 float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major); 346 413 if (!isfinite(FWHM_MAJOR) || !isfinite(FWHM_MINOR)) { 347 fprintf (stderr, "!");348 continue;349 }414 fprintf (stderr, "!"); 415 continue; 416 } 350 417 psVectorAppend (fwhmMajor, FWHM_MAJOR); 351 418 psVectorAppend (fwhmMinor, FWHM_MINOR); … … 359 426 } 360 427 361 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FWHM_MAJ", PS_META_REPLACE, "PSF FWHM Major axis (mean)", stats->sampleMean); 362 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_SG", PS_META_REPLACE, "PSF FWHM Major axis (sigma)", stats->sampleStdev); 363 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_LQ", PS_META_REPLACE, "PSF FWHM Major axis (lower quartile)", stats->sampleLQ); 364 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_UQ", PS_META_REPLACE, "PSF FWHM Major axis (upper quartile)", stats->sampleUQ); 428 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FWHM_MAJ", PS_META_REPLACE, "PSF FWHM Major axis (mean)", stats->sampleMean); 429 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_SG", PS_META_REPLACE, "PSF FWHM Major axis (sigma)", stats->sampleStdev); 430 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_LQ", PS_META_REPLACE, "PSF FWHM Major axis (lower quartile)", stats->sampleLQ); 431 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_UQ", PS_META_REPLACE, "PSF FWHM Major axis (upper quartile)", stats->sampleUQ); 432 433 float fwhmMaj = stats->sampleMean; // FWHM on major axis 365 434 366 435 if (!psVectorStats (stats, fwhmMinor, NULL, NULL, 0)) { … … 368 437 return false; 369 438 } 370 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FWHM_MIN", PS_META_REPLACE, "PSF FWHM Minor axis (mean)", stats->sampleMean); 371 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_SG", PS_META_REPLACE, "PSF FWHM Minor axis (sigma)", stats->sampleStdev); 372 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_LQ", PS_META_REPLACE, "PSF FWHM Minor axis (lower quartile)", stats->sampleLQ); 373 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_UQ", PS_META_REPLACE, "PSF FWHM Minor axis (upper quartile)", stats->sampleUQ); 374 375 psMetadataAddF32 (recipe, PS_LIST_TAIL, "ANGLE", PS_META_REPLACE, "PSF angle", axes.theta); 376 psMetadataAddS32 (recipe, PS_LIST_TAIL, "NPSFSTAR", PS_META_REPLACE, "Number of stars used to make PSF", psf->nPSFstars); 377 psMetadataAddBool(recipe, PS_LIST_TAIL, "PSFMODEL", PS_META_REPLACE, "Valid PSF Model?", true); 439 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FWHM_MIN", PS_META_REPLACE, "PSF FWHM Minor axis (mean)", stats->sampleMean); 440 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_SG", PS_META_REPLACE, "PSF FWHM Minor axis (sigma)", stats->sampleStdev); 441 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_LQ", PS_META_REPLACE, "PSF FWHM Minor axis (lower quartile)", stats->sampleLQ); 442 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_UQ", PS_META_REPLACE, "PSF FWHM Minor axis (upper quartile)", stats->sampleUQ); 443 444 float fwhmMin = stats->sampleMean; // FWHM on minor axis 445 if (readout->parent) { 446 pmChip *chip = readout->parent->parent; // Parent chip 447 psAssert(chip, "Cell should be attached to a chip."); 448 psMetadataItem *item = psMetadataLookup(chip->concepts, "CHIP.SEEING"); // Item with chip 449 item->data.F32 = 0.5 * (fwhmMaj + fwhmMin); 450 } 451 452 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "ANGLE", PS_META_REPLACE, "PSF angle", axes.theta); 453 psMetadataAddS32 (readout->analysis, PS_LIST_TAIL, "NPSFSTAR", PS_META_REPLACE, "Number of stars used to make PSF", psf->nPSFstars); 454 psMetadataAddBool(readout->analysis, PS_LIST_TAIL, "PSFMODEL", PS_META_REPLACE, "Valid PSF Model?", true); 378 455 379 456 psFree (fwhmMajor); … … 384 461 385 462 // determine approximate PSF shape parameters based on the moments 386 bool psphotMomentsStats (pmReadout *readout, ps Metadata *recipe, psArray *sources) {463 bool psphotMomentsStats (pmReadout *readout, psArray *sources) { 387 464 388 465 // without the PSF model, we can only rely on the source->moments … … 398 475 399 476 PS_ASSERT_PTR_NON_NULL(readout, false); 400 PS_ASSERT_PTR_NON_NULL(recipe, false);401 477 PS_ASSERT_PTR_NON_NULL(sources, false); 402 478 … … 426 502 FWHM_T /= FWHM_N; 427 503 428 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FWHM_MAJ", PS_META_REPLACE, "PSF FWHM Major axis (mean)", FWHM_X); 429 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_SG", PS_META_REPLACE, "PSF FWHM Major axis (sigma)", 0); 430 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_LQ", PS_META_REPLACE, "PSF FWHM Major axis (lower quartile)", 0); 431 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MJ_UQ", PS_META_REPLACE, "PSF FWHM Major axis (upper quartile)", 0); 432 433 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FWHM_MIN", PS_META_REPLACE, "PSF FWHM Minor axis (mean)", FWHM_Y); 434 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_SG", PS_META_REPLACE, "PSF FWHM Minor axis (sigma)", 0); 435 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_LQ", PS_META_REPLACE, "PSF FWHM Minor axis (lower quartile)", 0); 436 psMetadataAddF32 (recipe, PS_LIST_TAIL, "FW_MN_UQ", PS_META_REPLACE, "PSF FWHM Minor axis (upper quartile)", 0); 437 438 psMetadataAddF32 (recipe, PS_LIST_TAIL, "ANGLE", PS_META_REPLACE, "PSF angle", FWHM_T); 439 psMetadataAddS32 (recipe, PS_LIST_TAIL, "NPSFSTAR", PS_META_REPLACE, "Number of stars used to make PSF", 0); 440 psMetadataAddBool(recipe, PS_LIST_TAIL, "PSFMODEL", PS_META_REPLACE, "Valid PSF Model?", false); 504 if (readout->parent) { 505 pmChip *chip = readout->parent->parent; // Parent chip 506 psAssert(chip, "Cell should be attached to a chip."); 507 psMetadataItem *item = psMetadataLookup(chip->concepts, "CHIP.SEEING"); // Item with chip 508 item->data.F32 = 0.5 * (FWHM_X + FWHM_Y); 509 } 510 511 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FWHM_MAJ", PS_META_REPLACE, "PSF FWHM Major axis (mean)", FWHM_X); 512 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_SG", PS_META_REPLACE, "PSF FWHM Major axis (sigma)", 0); 513 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_LQ", PS_META_REPLACE, "PSF FWHM Major axis (lower quartile)", 0); 514 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MJ_UQ", PS_META_REPLACE, "PSF FWHM Major axis (upper quartile)", 0); 515 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FWHM_MIN", PS_META_REPLACE, "PSF FWHM Minor axis (mean)", FWHM_Y); 516 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_SG", PS_META_REPLACE, "PSF FWHM Minor axis (sigma)", 0); 517 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_LQ", PS_META_REPLACE, "PSF FWHM Minor axis (lower quartile)", 0); 518 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "FW_MN_UQ", PS_META_REPLACE, "PSF FWHM Minor axis (upper quartile)", 0); 519 psMetadataAddF32 (readout->analysis, PS_LIST_TAIL, "ANGLE", PS_META_REPLACE, "PSF angle", FWHM_T); 520 psMetadataAddS32 (readout->analysis, PS_LIST_TAIL, "NPSFSTAR", PS_META_REPLACE, "Number of stars used to make PSF", 0); 521 psMetadataAddBool(readout->analysis, PS_LIST_TAIL, "PSFMODEL", PS_META_REPLACE, "Valid PSF Model?", false); 441 522 442 523 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
