Changeset 27838 for branches/tap_branches/ppStack/src/ppStackMatch.c
- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_branches
- Files:
-
- 3 edited
-
. (modified) (1 prop)
-
ppStack/src (modified) (1 prop)
-
ppStack/src/ppStackMatch.c (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/ppStack/src
- Property svn:ignore
-
old new 10 10 stamp-h1 11 11 ppStackVersionDefinitions.h 12 ppStackErrorCodes.c 13 ppStackErrorCodes.h
-
- Property svn:ignore
-
branches/tap_branches/ppStack/src/ppStackMatch.c
r25467 r27838 18 18 #define COVAR_FRAC 0.01 // Truncation fraction for covariance matrix 19 19 20 // #define TESTING // Enable debugging output20 // #define TESTING // Enable debugging output 21 21 22 22 #ifdef TESTING … … 31 31 psFree(resolved); 32 32 if (!fits) { 33 psError(P S_ERR_IO, false, "Unable to open previously produced image: %s", name);33 psError(PPSTACK_ERR_IO, false, "Unable to open previously produced image: %s", name); 34 34 return false; 35 35 } 36 36 psImage *image = psFitsReadImage(fits, psRegionSet(0,0,0,0), 0); // Image of interest 37 37 if (!image) { 38 psError(P S_ERR_IO, false, "Unable to read previously produced image: %s", name);38 psError(PPSTACK_ERR_IO, false, "Unable to read previously produced image: %s", name); 39 39 psFitsClose(fits); 40 40 return false; … … 115 115 psFree(coords); 116 116 psFree(tree); 117 psFree(x); 118 psFree(y); 117 119 118 120 psLogMsg("ppStack", PS_LOG_INFO, "Filtered out %d of %d sources", numFiltered, numGood); … … 144 146 psMetadataAddU8(psphotRecipe, PS_LIST_TAIL, "MASK.PSPHOT", PS_META_REPLACE, "user-defined mask", maskBad); 145 147 146 psImage *binned = psphot BackgroundModel(ro, config); // Binned background model148 psImage *binned = psphotModelBackgroundReadoutNoFile(ro, config); // Binned background model 147 149 psImageBinning *binning = psMetadataLookupPtr(NULL, ro->analysis, 148 150 "PSPHOT.BACKGROUND.BINNING"); // Binning for model … … 150 152 psImage *unbinned = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Unbinned background model 151 153 if (!psImageUnbin(unbinned, binned, binning)) { 152 psError(PS_ERR_UNKNOWN, false, "Unable to unbin background model"); 154 psError(PPSTACK_ERR_DATA, false, "Unable to unbin background model"); 155 psFree(binned); 153 156 psFree(unbinned); 154 157 return NULL; 155 158 } 156 157 // XXX should these really be here?? (probably not...) 158 // pmFPAfileDropInternal(config->files, "PSPHOT.BACKMDL"); 159 // pmFPAfileDropInternal(config->files, "PSPHOT.BACKMDL.STDEV"); 160 161 return unbinned; 159 psFree(binned); 160 161 return unbinned; 162 162 } 163 163 … … 167 167 ) 168 168 { 169 #if 1 169 170 bool mdok; // Status of metadata lookups 170 171 … … 176 177 int num = psMetadataLookupS32(&mdok, recipe, "RENORM.NUM"); 177 178 if (!mdok) { 178 psError(P S_ERR_BAD_PARAMETER_VALUE, true, "RENORM.NUM is not set in the recipe");179 psError(PPSTACK_ERR_CONFIG, true, "RENORM.NUM is not set in the recipe"); 179 180 return false; 180 181 } 181 182 float minValid = psMetadataLookupF32(&mdok, recipe, "RENORM.MIN"); 182 183 if (!mdok) { 183 psError(P S_ERR_BAD_PARAMETER_VALUE, true, "RENORM.MIN is not set in the recipe");184 psError(PPSTACK_ERR_CONFIG, true, "RENORM.MIN is not set in the recipe"); 184 185 return false; 185 186 } 186 187 float maxValid = psMetadataLookupF32(&mdok, recipe, "RENORM.MAX"); 187 188 if (!mdok) { 188 psError(P S_ERR_BAD_PARAMETER_VALUE, true, "RENORM.MAX is not set in the recipe");189 psError(PPSTACK_ERR_CONFIG, true, "RENORM.MAX is not set in the recipe"); 189 190 return false; 190 191 } … … 192 193 psImageMaskType maskBad = pmConfigMaskGet("BLANK", config); // Bits to mask 193 194 195 psImageCovarianceTransfer(readout->variance, readout->covariance); 194 196 return pmReadoutVarianceRenormalise(readout, maskBad, num, minValid, maxValid); 197 #else 198 return true; 199 #endif 195 200 } 196 201 … … 212 217 int size = psMetadataLookupS32(NULL, ppsub, "KERNEL.SIZE"); // Kernel half-size 213 218 214 psString maskValStr = psMetadataLookupStr(NULL, recipe, "MASK.VAL"); // Name of bits to mask going in219 psString maskValStr = psMetadataLookupStr(NULL, ppsub, "MASK.VAL"); // Name of bits to mask going in 215 220 psImageMaskType maskVal = pmConfigMaskGet(maskValStr, config); // Bits to mask going in to pmSubtractionMatch 216 221 psString maskPoorStr = psMetadataLookupStr(NULL, recipe, "MASK.POOR"); // Name of bits to mask for poor … … 224 229 225 230 if (!pmReadoutMaskNonfinite(readout, maskVal)) { 226 psError( PS_ERR_UNKNOWN, false, "Unable to mask non-finite pixels in readout.");231 psError(psErrorCodeLast(), false, "Unable to mask non-finite pixels in readout."); 227 232 return false; 228 233 } … … 251 256 psFree(resolved); 252 257 if (!fits || !pmReadoutReadSubtractionKernels(conv, fits)) { 253 psError(P S_ERR_IO, false, "Unable to read previously produced kernel");258 psError(PPSTACK_ERR_IO, false, "Unable to read previously produced kernel"); 254 259 psFitsClose(fits); 255 260 return false; … … 257 262 psFitsClose(fits); 258 263 259 if (!readImage(&readout->image, options-> imageNames->data[index], config) ||260 !readImage(&readout->mask, options-> maskNames->data[index], config) ||261 !readImage(&readout->variance, options-> varianceNames->data[index], config)) {262 psError(P S_ERR_IO, false, "Unable to read previously produced image.");264 if (!readImage(&readout->image, options->convImages->data[index], config) || 265 !readImage(&readout->mask, options->convMasks->data[index], config) || 266 !readImage(&readout->variance, options->convVariances->data[index], config)) { 267 psError(PPSTACK_ERR_IO, false, "Unable to read previously produced image."); 263 268 return false; 264 269 } … … 269 274 PM_SUBTRACTION_ANALYSIS_KERNEL); 270 275 271 pmSubtractionAnalysis( readout->analysis, NULL, kernels, region,276 pmSubtractionAnalysis(conv->analysis, NULL, kernels, region, 272 277 readout->image->numCols, readout->image->numRows); 273 278 274 279 psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, false); // Convolution kernel 280 bool oldThreads = psImageCovarianceSetThreads(true); // Old thread setting 275 281 psKernel *covar = psImageCovarianceCalculate(kernel, readout->covariance); // Covariance matrix 282 psImageCovarianceSetThreads(oldThreads); 276 283 psFree(readout->covariance); 277 284 readout->covariance = covar; … … 292 299 int iter = psMetadataLookupS32(NULL, ppsub, "ITER"); // Rejection iterations 293 300 float rej = psMetadataLookupF32(NULL, ppsub, "REJ"); // Rejection threshold 294 float sysError = psMetadataLookupF32(NULL, ppsub, "SYS"); // Relative systematic error in kernel 301 float kernelError = psMetadataLookupF32(NULL, ppsub, "KERNEL.ERR"); // Relative systematic error in kernel 302 float normFrac = psMetadataLookupF32(NULL, ppsub, "NORM.FRAC"); // Fraction of window for normalisn windw 303 float sysError = psMetadataLookupF32(NULL, ppsub, "SYS.ERR"); // Relative systematic error in images 304 float skyErr = psMetadataLookupF32(NULL, ppsub, "SKY.ERR"); // Additional error in sky 305 float covarFrac = psMetadataLookupF32(NULL, ppsub, "COVAR.FRAC"); // Fraction for covariance calculation 306 295 307 const char *typeStr = psMetadataLookupStr(NULL, ppsub, "KERNEL.TYPE"); // Kernel type 296 308 pmSubtractionKernelsType type = pmSubtractionKernelsTypeFromString(typeStr); // Kernel type … … 309 321 float poorFrac = psMetadataLookupF32(&mdok, ppsub, "POOR.FRACTION"); // Fraction for "poor" 310 322 323 bool scale = psMetadataLookupBool(NULL, ppsub, "SCALE"); // Scale kernel parameters? 324 float scaleRef = psMetadataLookupF32(NULL, ppsub, "SCALE.REF"); // Reference for scaling 325 float scaleMin = psMetadataLookupF32(NULL, ppsub, "SCALE.MIN"); // Minimum for scaling 326 float scaleMax = psMetadataLookupF32(NULL, ppsub, "SCALE.MAX"); // Maximum for scaling 327 if (!isfinite(scaleRef) || !isfinite(scaleMin) || !isfinite(scaleMax)) { 328 psError(PPSTACK_ERR_CONFIG, false, 329 "Scale parameters (SCALE.REF=%f, SCALE.MIN=%f, SCALE.MAX=%f) not set in PPSUB recipe.", 330 scaleRef, scaleMin, scaleMax); 331 return false; 332 } 333 334 311 335 // These values are specified specifically for stacking 312 336 const char *stampsName = psMetadataLookupStr(NULL, config->arguments, "STAMPS");// Stamps filename … … 322 346 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 323 347 if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) { 324 psError(P S_ERR_UNKNOWN, false, "Can't measure background for image.");348 psError(PPSTACK_ERR_DATA, false, "Can't measure background for image."); 325 349 psFree(fake); 326 350 psFree(optWidths); … … 338 362 footprint); // Filtered list of sources 339 363 364 bool oldThreads = pmReadoutFakeThreads(true); // Old threading state 340 365 if (!pmReadoutFakeFromSources(fake, readout->image->numCols, readout->image->numRows, 341 366 stampSources, SOURCE_MASK, NULL, NULL, options->psf, 342 367 minFlux, footprint + size, false, true)) { 343 psError(P S_ERR_UNKNOWN, false, "Unable to generate fake image with target PSF.");368 psError(PPSTACK_ERR_DATA, false, "Unable to generate fake image with target PSF."); 344 369 psFree(fake); 345 370 psFree(optWidths); … … 347 372 return false; 348 373 } 374 pmReadoutFakeThreads(oldThreads); 349 375 350 376 fake->mask = psImageCopy(NULL, readout->mask, PS_TYPE_IMAGE_MASK); 351 377 378 #if 1 352 379 // Add the background into the target image 353 380 psImage *bgImage = stackBackgroundModel(readout, config); // Image of background 354 381 psBinaryOp(fake->image, fake->image, "+", bgImage); 355 382 psFree(bgImage); 383 #endif 356 384 357 385 #ifdef TESTING … … 379 407 380 408 if (threads > 0) { 381 pmSubtractionThreadsInit( readout, fake);409 pmSubtractionThreadsInit(); 382 410 } 383 411 … … 387 415 if (kernel) { 388 416 if (!pmSubtractionMatchPrecalc(NULL, conv, fake, readout, readout->analysis, 389 stride, sysError, maskVal, maskBad, maskPoor,417 stride, kernelError, covarFrac, maskVal, maskBad, maskPoor, 390 418 poorFrac, badFrac)) { 391 psError( PS_ERR_UNKNOWN, false, "Unable to convolve images.");419 psError(psErrorCodeLast(), false, "Unable to convolve images."); 392 420 psFree(fake); 393 421 psFree(optWidths); … … 395 423 psFree(conv); 396 424 if (threads > 0) { 397 pmSubtractionThreadsFinalize( readout, fake);425 pmSubtractionThreadsFinalize(); 398 426 } 399 427 return false; 400 428 } 401 429 } else { 402 if (!pmSubtractionMatch(NULL, conv, fake, readout, footprint, stride, regionSize, spacing, 403 threshold, stampSources, stampsName, type, size, order, widths, 404 orders, inner, ringsOrder, binning, penalty, 405 optimum, optWidths, optOrder, optThresh, iter, rej, sysError, 406 maskVal, maskBad, maskPoor, poorFrac, badFrac, 407 PM_SUBTRACTION_MODE_2)) { 408 psError(PS_ERR_UNKNOWN, false, "Unable to match images."); 430 // Scale the input parameters 431 psVector *widthsCopy = psVectorCopy(NULL, widths, PS_TYPE_F32); // Copy of kernel widths 432 if (scale && !pmSubtractionParamsScale(&size, &footprint, widthsCopy, 433 options->inputSeeing->data.F32[index], 434 options->targetSeeing, scaleRef, scaleMin, scaleMax)) { 435 psError(psErrorCodeLast(), false, "Unable to scale kernel parameters"); 409 436 psFree(fake); 410 437 psFree(optWidths); 411 438 psFree(stampSources); 412 439 psFree(conv); 440 psFree(widthsCopy); 413 441 if (threads > 0) { 414 pmSubtractionThreadsFinalize( readout, fake);442 pmSubtractionThreadsFinalize(); 415 443 } 416 444 return false; 417 445 } 418 } 446 447 if (!pmSubtractionMatch(NULL, conv, fake, readout, footprint, stride, regionSize, spacing, 448 threshold, stampSources, stampsName, type, size, order, widthsCopy, 449 orders, inner, ringsOrder, binning, penalty, 450 optimum, optWidths, optOrder, optThresh, iter, rej, normFrac, 451 sysError, skyErr, kernelError, covarFrac, maskVal, maskBad, maskPoor, 452 poorFrac, badFrac, PM_SUBTRACTION_MODE_2)) { 453 psError(psErrorCodeLast(), false, "Unable to match images."); 454 psFree(fake); 455 psFree(optWidths); 456 psFree(stampSources); 457 psFree(conv); 458 psFree(widthsCopy); 459 if (threads > 0) { 460 pmSubtractionThreadsFinalize(); 461 } 462 return false; 463 } 464 psFree(widthsCopy); 465 } 466 419 467 420 468 #ifdef TESTING … … 447 495 448 496 if (threads > 0) { 449 pmSubtractionThreadsFinalize( readout, fake);497 pmSubtractionThreadsFinalize(); 450 498 } 451 499 … … 487 535 while ((item = psMetadataGetAndIncrement(iter))) { 488 536 assert(item->type == PS_DATA_UNKNOWN); 489 // Set the normalisation dimensions, since these will be otherwise unavailable when reading490 // the images by scans.491 537 pmSubtractionKernels *kernel = item->data.V; // Kernel used in subtraction 492 kernel->numCols = readout->image->numCols;493 kernel->numRows = readout->image->numRows;494 495 538 kernels = psArrayAdd(kernels, ARRAY_BUFFER, kernel); 496 539 } … … 518 561 } 519 562 563 // Kernel normalisation 564 { 565 double sum = 0.0; // Sum of chi^2 566 int num = 0; // Number of measurements of chi^2 567 psString regex = NULL; // Regular expression 568 psStringAppend(®ex, "^%s$", PM_SUBTRACTION_ANALYSIS_NORM); 569 psMetadataIterator *iter = psMetadataIteratorAlloc(conv->analysis, PS_LIST_HEAD, regex); 570 psFree(regex); 571 psMetadataItem *item = NULL;// Item from iteration 572 while ((item = psMetadataGetAndIncrement(iter))) { 573 assert(item->type == PS_TYPE_F32); 574 float norm = item->data.F32; // Normalisation 575 sum += norm; 576 num++; 577 } 578 psFree(iter); 579 float conv = sum/num; // Mean normalisation from convolution 580 float stars = powf(10.0, -0.4 * options->norm->data.F32[index]); // Normalisation from stars 581 float renorm = stars / conv; // Renormalisation to apply 582 psLogMsg("ppStack", PS_LOG_INFO, "Renormalising image %d by %f (kernel: %f, stars: %f)\n", 583 index, renorm, conv, stars); 584 psBinaryOp(readout->image, readout->image, "*", psScalarAlloc(renorm, PS_TYPE_F32)); 585 psBinaryOp(readout->variance, readout->variance, "*", psScalarAlloc(PS_SQR(renorm), PS_TYPE_F32)); 586 } 587 520 588 // Reject image completely if the maximum deconvolution fraction exceeds the limit 521 589 float deconv = psMetadataLookupF32(NULL, conv->analysis, 522 590 PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Max deconvolution fraction 523 591 if (deconv > deconvLimit) { 524 psWarning("Maximum deconvolution fraction (%f) exceeds limit (%f) --- rejecting \n",525 deconv, deconvLimit );592 psWarning("Maximum deconvolution fraction (%f) exceeds limit (%f) --- rejecting image %d\n", 593 deconv, deconvLimit, index); 526 594 psFree(conv); 527 595 return NULL; … … 542 610 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 543 611 if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) { 544 psWarning("Can't measure background for image.");545 psErrorClear();612 psWarning("Can't measure background for image."); 613 psErrorClear(); 546 614 } else { 547 if (!psMetadataLookupBool(NULL, config->arguments, "PPSTACK.SKIP.BG.SUB")) {548 psLogMsg("ppStack", PS_LOG_INFO, "Correcting convolved image background by %lf (+/- %lf)",549 psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), psStatsGetValue(bg, PS_STAT_ROBUST_STDEV));550 (void)psBinaryOp(readout->image, readout->image, "-",551 psScalarAlloc(psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), PS_TYPE_F32));552 }615 if (!psMetadataLookupBool(NULL, config->arguments, "PPSTACK.SKIP.BG.SUB")) { 616 psLogMsg("ppStack", PS_LOG_INFO, "Correcting convolved image background by %lf (+/- %lf)", 617 psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), psStatsGetValue(bg, PS_STAT_ROBUST_STDEV)); 618 (void)psBinaryOp(readout->image, readout->image, "-", 619 psScalarAlloc(psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN), PS_TYPE_F32)); 620 } 553 621 } 554 622 … … 560 628 561 629 // Measure the variance level for the weighting 562 if (!psImageBackground(bg, NULL, readout->variance, readout->mask, maskVal | maskBad, rng)) { 563 psError(PS_ERR_UNKNOWN, false, "Can't measure mean variance for image."); 564 psFree(rng); 565 psFree(bg); 566 return false; 567 } 568 options->weightings->data.F32[index] = 1.0 / (psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN) * 569 psImageCovarianceFactor(readout->covariance)); 570 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "PPSTACK.WEIGHTING", 0, 571 "Weighting by 1/noise^2 for stack", options->weightings->data.F32[index]); 630 if (psMetadataLookupBool(NULL, recipe, "WEIGHTS")) { 631 if (!psImageBackground(bg, NULL, readout->variance, readout->mask, maskVal | maskBad, rng)) { 632 psError(PPSTACK_ERR_DATA, false, "Can't measure mean variance for image."); 633 psFree(rng); 634 psFree(bg); 635 return false; 636 } 637 options->weightings->data.F32[index] = 1.0 / (psStatsGetValue(bg, PS_STAT_ROBUST_MEDIAN) * 638 psImageCovarianceFactor(readout->covariance)); 639 } else { 640 options->weightings->data.F32[index] = 1.0; 641 } 642 psLogMsg("ppStack", PS_LOG_INFO, "Weighting for image %d is %f\n", 643 index, options->weightings->data.F32[index]); 572 644 573 645 psFree(rng);
Note:
See TracChangeset
for help on using the changeset viewer.
