- Timestamp:
- Jan 29, 2010, 6:02:38 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c
r26733 r26739 70 70 const psImage *subMask, // Mask for subtraction, or NULL 71 71 psImage *variance, // Variance map 72 const psRegion *region, // Region of interest , or NULL72 const psRegion *region, // Region of interest 73 73 float thresh1, // Threshold for stamp finding on readout 1 74 74 float thresh2, // Threshold for stamp finding on readout 2 … … 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 … … 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; … … 319 326 pmSubtractionMaskInvalid(ro2, maskVal); 320 327 321 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0, 328 psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels 329 330 psImage *subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, 0, 322 331 badFrac, mode); // Subtraction mask 323 332 if (!subMask) { … … 441 450 // Putting important variable declarations here, since they are freed after a "goto" if there is an error. 442 451 psImage *subMask = NULL; // Mask for subtraction 443 psRegion *region = NULL;// Iso-kernel region452 psRegion *region = psRegionAlloc(NAN, NAN, NAN, NAN); // Iso-kernel region 444 453 psString regionString = NULL; // String for region 445 454 pmSubtractionStampList *stamps = NULL; // Stamps for matching PSF … … 457 466 pmSubtractionMaskInvalid(ro2, maskVal); 458 467 459 subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, footprint, 460 badFrac, subMode); 468 psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels 469 470 subMask = pmSubtractionMask(&bounds, ro1, ro2, maskVal, size, footprint, badFrac, subMode); 461 471 if (!subMask) { 462 472 psError(psErrorCodeLast(), false, "Unable to generate subtraction mask."); … … 468 478 // Get region of interest 469 479 int xRegions = 1, yRegions = 1; // Number of iso-kernel regions 470 float xRegionSize = 0, yRegionSize = 0; // Size of iso-kernel regions480 float xRegionSize = NAN, yRegionSize = NAN; // Size of iso-kernel regions 471 481 if (isfinite(regionSize) && regionSize != 0.0) { 472 xRegions = numCols / regionSize + 1; 473 yRegions = numRows / regionSize + 1; 474 xRegionSize = (float)numCols / (float)xRegions; 475 yRegionSize = (float)numRows / (float)yRegions; 476 region = psRegionAlloc(NAN, NAN, NAN, NAN); 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; 477 489 } 478 490 … … 480 492 float stampThresh1 = NAN, stampThresh2 = NAN; // Stamp thresholds for images 481 493 { 482 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 483 495 if (ro1) { 484 496 psStatsInit(bg); … … 504 516 } 505 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_1 || 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 558 506 559 // Iterate over iso-kernel regions 507 560 for (int j = 0; j < yRegions; j++) { … … 509 562 psTrace("psModules.imcombine", 1, "Subtracting region %d of %d...\n", 510 563 j * xRegions + i + 1, xRegions * yRegions); 511 if (region) {512 *region = psRegionSet((int)(i * xRegionSize),(int)((i + 1) * xRegionSize),513 (int)(j * yRegionSize), (int)((j + 1) * yRegionSize));514 psFree(regionString);515 regionString = psRegionToString(*region);516 psTrace("psModules.imcombine", 3, "Iso-kernel region: %s out of %d,%d\n",517 regionString, numCols, numRows);518 }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); 519 572 520 573 if (stampsName && strlen(stampsName) > 0) { … … 530 583 // We get the stamps here; we will also attempt to get stamps at the first iteration, but it 531 584 // doesn't matter. 532 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,585 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, stampThresh1, stampThresh2, 533 586 stampSpacing, normFrac, sysError, skyError, size, footprint, subMode)) { 534 587 goto MATCH_ERROR; … … 544 597 // Define kernel basis functions 545 598 if (optimum && (type == PM_SUBTRACTION_KERNEL_ISIS || type == PM_SUBTRACTION_KERNEL_GUNK)) { 546 kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder, optFWHMs, optOrder, 547 stamps, footprint, optThreshold, penalty, subMode); 599 kernels = pmSubtractionKernelsOptimumISIS(type, size, inner, spatialOrder, 600 optFWHMs, optOrder, stamps, footprint, 601 optThreshold, penalty, bounds, subMode); 548 602 if (!kernels) { 549 603 psErrorClear(); … … 554 608 // Not an ISIS/GUNK kernel, or the optimum kernel search failed 555 609 kernels = pmSubtractionKernelsGenerate(type, size, spatialOrder, isisWidths, isisOrders, 556 inner, binning, ringsOrder, penalty, subMode);610 inner, binning, ringsOrder, penalty, bounds, subMode); 557 611 // pmSubtractionVisualShowKernels(kernels); 558 612 } … … 603 657 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Iteration %d.", k); 604 658 605 #if 0606 659 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, 607 660 stampThresh1, stampThresh2, stampSpacing, normFrac, … … 609 662 goto MATCH_ERROR; 610 663 } 611 #endif612 664 613 665 // generate the window function from the set of stamps
Note:
See TracChangeset
for help on using the changeset viewer.
