Changeset 26747 for branches/eam_branches/psModules.stack.20100120/src/imcombine/pmSubtractionMatch.c
- Timestamp:
- Jan 31, 2010, 5:00:42 PM (16 years ago)
- Location:
- branches/eam_branches/psModules.stack.20100120
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/imcombine/pmSubtractionMatch.c (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/psModules.stack.20100120
- Property svn:mergeinfo changed
/branches/eam_branches/20091201/psModules (added) merged: 26686-26687,26693,26702-26703,26731-26735,26737,26739,26741-26743
- Property svn:mergeinfo changed
-
branches/eam_branches/psModules.stack.20100120/src/imcombine/pmSubtractionMatch.c
r26667 r26747 33 33 # else 34 34 # define SUBMODE PM_SUBTRACTION_EQUATION_ALL 35 // # define SUBMODE PM_SUBTRACTION_EQUATION_KERNELS36 35 # endif 37 36 … … 71 70 const psImage *subMask, // Mask for subtraction, or NULL 72 71 psImage *variance, // Variance map 73 const psRegion *region, // Region of interest , or NULL72 const psRegion *region, // Region of interest 74 73 float thresh1, // Threshold for stamp finding on readout 1 75 74 float thresh2, // Threshold for stamp finding on readout 2 76 75 float stampSpacing, // Spacing between stamps 76 float normFrac, // Fraction of flux in window for normalisation window 77 77 float sysError, // Relative systematic error in images 78 78 float skyError, // Relative systematic error in images … … 82 82 ) 83 83 { 84 PS_ASSERT_PTR_NON_NULL(stamps, false); 85 PM_ASSERT_READOUT_NON_NULL(ro1, false); 86 PM_ASSERT_READOUT_NON_NULL(ro2, false); 87 PS_ASSERT_IMAGE_NON_NULL(subMask, false); 88 PS_ASSERT_IMAGE_NON_NULL(variance, false); 89 PS_ASSERT_PTR_NON_NULL(region, false); 90 84 91 psTrace("psModules.imcombine", 3, "Finding stamps...\n"); 85 92 … … 87 94 88 95 *stamps = pmSubtractionStampsFind(*stamps, image1, image2, subMask, region, thresh1, thresh2, 89 size, footprint, stampSpacing, sysError, skyError, mode);96 size, footprint, stampSpacing, normFrac, sysError, skyError, mode); 90 97 if (!*stamps) { 91 98 psError(psErrorCodeLast(), false, "Unable to find stamps."); … … 96 103 97 104 psTrace("psModules.imcombine", 3, "Extracting stamps...\n"); 98 if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2 ? ro2->image : NULL, variance, size)) {105 if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2->image, variance, size, *region)) { 99 106 psError(PS_ERR_UNKNOWN, false, "Unable to extract stamps."); 100 107 return false; … … 110 117 const pmReadout *ro1, const pmReadout *ro2, // Input images 111 118 int stride, // Size for convolution patches 119 float normFrac, // Fraction of window for normalisation window 112 120 float sysError, // Systematic error in images 113 121 float skyError, // Systematic error in images … … 158 166 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false); 159 167 PS_ASSERT_INT_NONNEGATIVE(stride, false); 168 if (isfinite(normFrac)) { 169 PS_ASSERT_FLOAT_LARGER_THAN(normFrac, 0.0, false); 170 PS_ASSERT_FLOAT_LESS_THAN(normFrac, 1.0, false); 171 } 160 172 if (isfinite(sysError)) { 161 173 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false); … … 210 222 } 211 223 224 bool pmSubtractionMaskInvalid (const pmReadout *readout, psImageMaskType maskVal) { 225 226 if (!readout) return true; 227 228 psImage *image = readout->image; 229 psImage *mask = readout->mask; 230 psImage *variance = readout->variance; 231 for (int y = 0; y < image->numRows; y++) { 232 for (int x = 0; x < image->numCols; x++) { 233 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & maskVal) continue; 234 bool valid = false; 235 valid = isfinite(image->data.F32[y][x]); 236 if (variance) { 237 valid &= isfinite(variance->data.F32[y][x]); 238 } 239 if (valid) continue; 240 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = maskVal; 241 } 242 } 243 244 return true; 245 } 212 246 213 247 bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, … … 282 316 } 283 317 284 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, NAN, NAN, kernelError,318 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, NAN, NAN, NAN, kernelError, 285 319 maskVal, maskBad, maskPoor, poorFrac, badFrac, mode)) { 286 320 psFree(kernels); … … 289 323 } 290 324 291 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0, 325 pmSubtractionMaskInvalid(ro1, maskVal); 326 pmSubtractionMaskInvalid(ro2, maskVal); 327 328 psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels 329 330 psImage *subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, 0, 292 331 badFrac, mode); // Subtraction mask 293 332 if (!subMask) { … … 348 387 int inner, int ringsOrder, int binning, float penalty, 349 388 bool optimum, const psVector *optFWHMs, int optOrder, float optThreshold, 350 int iter, float rej, float sysError, float skyError, float kernelError, psImageMaskType maskVal,351 psImageMaskType maskBad, psImageMaskType maskPoor, float poorFrac,352 float badFrac, pmSubtractionMode subMode)389 int iter, float rej, float normFrac, float sysError, float skyError, 390 float kernelError, psImageMaskType maskVal, psImageMaskType maskBad, 391 psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode) 353 392 { 354 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, skyError, kernelError,393 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, normFrac, sysError, skyError, kernelError, 355 394 maskVal, maskBad, maskPoor, poorFrac, badFrac, subMode)) { 356 395 return false; … … 411 450 // Putting important variable declarations here, since they are freed after a "goto" if there is an error. 412 451 psImage *subMask = NULL; // Mask for subtraction 413 psRegion *region = NULL;// Iso-kernel region452 psRegion *region = psRegionAlloc(NAN, NAN, NAN, NAN); // Iso-kernel region 414 453 psString regionString = NULL; // String for region 415 454 pmSubtractionStampList *stamps = NULL; // Stamps for matching PSF … … 424 463 memCheck("start"); 425 464 426 subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, footprint, 427 badFrac, subMode); 465 pmSubtractionMaskInvalid(ro1, maskVal); 466 pmSubtractionMaskInvalid(ro2, maskVal); 467 468 psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels 469 470 subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, footprint, badFrac, subMode); 428 471 if (!subMask) { 429 472 psError(psErrorCodeLast(), false, "Unable to generate subtraction mask."); … … 435 478 // Get region of interest 436 479 int xRegions = 1, yRegions = 1; // Number of iso-kernel regions 437 float xRegionSize = 0, yRegionSize = 0; // Size of iso-kernel regions480 float xRegionSize = NAN, yRegionSize = NAN; // Size of iso-kernel regions 438 481 if (isfinite(regionSize) && regionSize != 0.0) { 439 xRegions = numCols / regionSize + 1; 440 yRegions = numRows / regionSize + 1; 441 xRegionSize = (float)numCols / (float)xRegions; 442 yRegionSize = (float)numRows / (float)yRegions; 443 region = psRegionAlloc(NAN, NAN, NAN, NAN); 444 } 445 482 xRegions = (bounds.x1 - bounds.x0) / regionSize + 1; 483 yRegions = (bounds.y1 - bounds.y0) / regionSize + 1; 484 xRegionSize = (float)(bounds.x1 - bounds.x0) / (float)xRegions; 485 yRegionSize = (float)(bounds.y1 - bounds.y0) / (float)yRegions; 486 } else { 487 xRegionSize = bounds.x1 - bounds.x0; 488 yRegionSize = bounds.y1 - bounds.y0; 489 } 490 491 // General background subtraction and measurement of stamp threshold 446 492 float stampThresh1 = NAN, stampThresh2 = NAN; // Stamp thresholds for images 447 493 { 448 psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for backgroun 494 psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for background 449 495 if (ro1) { 496 psStatsInit(bg); 450 497 if (!psImageBackground(bg, NULL, ro1->image, ro1->mask, maskVal, rng)) { 451 498 psError(PS_ERR_UNKNOWN, false, "Unable to measure background statistics."); … … 453 500 goto MATCH_ERROR; 454 501 } 455 stampThresh1 = bg->robustMedian + threshold * bg->robustStdev; 502 stampThresh1 = threshold * bg->robustStdev; 503 psBinaryOp(ro1->image, ro1->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32)); 456 504 } 457 505 if (ro2) { 506 psStatsInit(bg); 458 507 if (!psImageBackground(bg, NULL, ro2->image, ro2->mask, maskVal, rng)) { 459 508 psError(PS_ERR_UNKNOWN, false, "Unable to measure background statistics."); … … 461 510 goto MATCH_ERROR; 462 511 } 463 stampThresh2 = bg->robustMedian + threshold * bg->robustStdev; 464 } 512 stampThresh2 = threshold * bg->robustStdev; 513 psBinaryOp(ro2->image, ro2->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32)); 514 } 465 515 psFree(bg); 466 516 } 517 518 // Just in case the iso-kernel region doesn't cover the entire image... 519 if (subMode == PM_SUBTRACTION_MODE_1 || subMode == PM_SUBTRACTION_MODE_UNSURE || 520 subMode == PM_SUBTRACTION_MODE_DUAL) { 521 if (!conv1->image) { 522 conv1->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 523 } 524 psImageInit(conv1->image, NAN); 525 if (ro1->variance) { 526 if (!conv1->variance) { 527 conv1->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 528 } 529 psImageInit(conv1->variance, NAN); 530 } 531 if (subMask) { 532 if (!conv1->mask) { 533 conv1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 534 } 535 psImageInit(conv1->mask, maskBad); 536 } 537 } 538 if (subMode == PM_SUBTRACTION_MODE_2 || subMode == PM_SUBTRACTION_MODE_UNSURE || 539 subMode == PM_SUBTRACTION_MODE_DUAL) { 540 if (!conv2->image) { 541 conv2->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 542 } 543 psImageInit(conv2->image, NAN); 544 if (ro2->variance) { 545 if (!conv2->variance) { 546 conv2->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 547 } 548 psImageInit(conv2->variance, NAN); 549 } 550 if (subMask) { 551 if (!conv2->mask) { 552 conv2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 553 } 554 psImageInit(conv2->mask, maskBad); 555 } 556 } 557 467 558 468 559 // Iterate over iso-kernel regions … … 471 562 psTrace("psModules.imcombine", 1, "Subtracting region %d of %d...\n", 472 563 j * xRegions + i + 1, xRegions * yRegions); 473 if (region) {474 *region = psRegionSet((int)(i * xRegionSize),(int)((i + 1) * xRegionSize),475 (int)(j * yRegionSize), (int)((j + 1) * yRegionSize));476 psFree(regionString);477 regionString = psRegionToString(*region);478 psTrace("psModules.imcombine", 3, "Iso-kernel region: %s out of %d,%d\n",479 regionString, numCols, numRows);480 }564 *region = psRegionSet(bounds.x0 + (int)(i * xRegionSize), 565 bounds.x0 + (int)((i + 1) * xRegionSize), 566 bounds.y0 + (int)(j * yRegionSize), 567 bounds.y0 + (int)((j + 1) * yRegionSize)); 568 psFree(regionString); 569 regionString = psRegionToString(*region); 570 psLogMsg("psModules.imcombine", PS_LOG_DETAIL, "Iso-kernel region: %s out of %d,%d\n", 571 regionString, numCols, numRows); 481 572 482 573 if (stampsName && strlen(stampsName) > 0) { 483 574 stamps = pmSubtractionStampsSetFromFile(stampsName, ro1->image, subMask, region, size, 484 footprint, stampSpacing, sysError, skyError, subMode); 575 footprint, stampSpacing, normFrac, 576 sysError, skyError, subMode); 485 577 } else if (sources) { 486 578 stamps = pmSubtractionStampsSetFromSources(sources, ro1->image, subMask, region, size, 487 footprint, stampSpacing, sysError, skyError, subMode); 579 footprint, stampSpacing, normFrac, 580 sysError, skyError, subMode); 488 581 } 489 582 490 583 // We get the stamps here; we will also attempt to get stamps at the first iteration, but it 491 584 // doesn't matter. 492 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,493 stampSpacing, sysError, skyError, size, footprint, subMode)) {585 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, stampThresh1, stampThresh2, 586 stampSpacing, normFrac, sysError, skyError, size, footprint, subMode)) { 494 587 goto MATCH_ERROR; 495 588 } … … 498 591 // generate the window function from the set of stamps 499 592 if (!pmSubtractionStampsGetWindow(stamps, size)) { 593 psError(PS_ERR_UNKNOWN, false, "Unable to get stamp window."); 500 594 goto MATCH_ERROR; 501 595 } … … 503 597 // Define kernel basis functions 504 598 if (optimum && (type == PM_SUBTRACTION_KERNEL_ISIS || type == PM_SUBTRACTION_KERNEL_GUNK)) { 505 kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder, optFWHMs, optOrder, 506 stamps, footprint, optThreshold, penalty, subMode); 599 kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder, 600 optFWHMs, optOrder, stamps, footprint, 601 optThreshold, penalty, bounds, subMode); 507 602 if (!kernels) { 508 603 psErrorClear(); … … 513 608 // Not an ISIS/GUNK kernel, or the optimum kernel search failed 514 609 kernels = pmSubtractionKernelsGenerate(type, size, spatialOrder, isisWidths, isisOrders, 515 inner, binning, ringsOrder, penalty, subMode);610 inner, binning, ringsOrder, penalty, bounds, subMode); 516 611 // pmSubtractionVisualShowKernels(kernels); 517 612 } … … 563 658 564 659 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, 565 stampThresh1, stampThresh2, stampSpacing, sysError, skyError,566 s ize, footprint, subMode)) {660 stampThresh1, stampThresh2, stampSpacing, normFrac, 661 sysError, skyError, size, footprint, subMode)) { 567 662 goto MATCH_ERROR; 568 663 } … … 570 665 // generate the window function from the set of stamps 571 666 if (!pmSubtractionStampsGetWindow(stamps, size)) { 667 psError(PS_ERR_UNKNOWN, false, "Unable to get stamps window."); 572 668 goto MATCH_ERROR; 573 669 }
Note:
See TracChangeset
for help on using the changeset viewer.
