Changeset 20049 for trunk/psModules/src/imcombine/pmSubtractionMatch.c
- Timestamp:
- Oct 10, 2008, 1:54:33 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r19532 r20049 15 15 #include "pmSubtractionEquation.h" 16 16 #include "pmSubtraction.h" 17 #include "pmSubtractionAnalysis.h" 17 18 #include "pmSubtractionMask.h" 18 19 #include "pmSubtractionThreads.h" … … 20 21 21 22 22 #define KERNEL_MOSAIC 2 // Half-number of kernel instances in the mosaic image23 23 #define BG_STAT PS_STAT_ROBUST_MEDIAN // Statistic to use for background 24 24 … … 91 91 92 92 93 // Record the variance factor in a readout94 static bool recordVarianceFactor(pmReadout *ro, // Readout of interest95 float varFactor, // Variance factor96 const psRegion *region // Region of interest97 )98 {99 if (region) {100 varFactor *= (region->x1 - region->x0 + 1) * (region->y1 - region->y0 + 1) /101 (ro->image->numCols * ro->image->numRows);102 }103 104 psMetadataItem *vfItem = psMetadataLookup(ro->analysis, PM_SUBTRACTION_ANALYSIS_VARFACTOR);105 if (vfItem) {106 psAssert(vfItem->type == PS_TYPE_F32, "Should be the type we said.");107 vfItem->data.F32 += varFactor;108 } else {109 psMetadataAddF32(ro->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_VARFACTOR, 0,110 "Variance factor weighted by the area", varFactor);111 }112 113 return true;114 }115 116 93 bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, 117 94 int footprint, float regionSize, float stampSpacing, float threshold, … … 254 231 } 255 232 233 psMetadata *analysis = psMetadataAlloc(); // QA data 234 256 235 // Iterate over iso-kernel regions 257 236 for (int j = 0; j < yRegions; j++) { … … 338 317 } 339 318 340 // Add analysis metadata341 {342 psRegion *subRegion; // Region over which subtraction was performed343 if (region) {344 subRegion = psMemIncrRefCounter(region);345 } else {346 subRegion = psRegionAlloc(0, numCols, 0, numRows);347 }348 349 if (subMode == PM_SUBTRACTION_MODE_1 || subMode == PM_SUBTRACTION_MODE_DUAL) {350 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,351 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);352 psMetadataAddS32(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,353 PS_META_DUPLICATE_OK, "Subtraction kernels", subMode);354 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,355 PS_DATA_REGION | PS_META_DUPLICATE_OK,356 "Region over which subtraction was performed", subRegion);357 }358 if (subMode == PM_SUBTRACTION_MODE_2 || subMode == PM_SUBTRACTION_MODE_DUAL) {359 psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL,360 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels);361 psMetadataAddS32(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE,362 PS_META_DUPLICATE_OK, "Subtraction kernels", subMode);363 psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION,364 PS_DATA_REGION | PS_META_DUPLICATE_OK,365 "Region over which subtraction was performed", subRegion);366 }367 psFree(subRegion);368 }369 370 319 memCheck("kernels"); 371 320 … … 435 384 memCheck("solution"); 436 385 437 { 438 psTrace("psModules.imcombine", 2, "Generating diagnostics...\n"); 439 // Generate image with convolution kernels 440 int fullSize = 2 * size + 1 + 1; // Full size of kernel 441 int imageSize = (2 * KERNEL_MOSAIC + 1) * fullSize; 442 psImage *convKernels = psImageAlloc((subMode == PM_SUBTRACTION_MODE_DUAL ? 2 : 1) * 443 imageSize - 1 + 444 (subMode == PM_SUBTRACTION_MODE_DUAL ? 4 : 0), 445 imageSize - 1, PS_TYPE_F32); 446 psImageInit(convKernels, NAN); 447 for (int j = -KERNEL_MOSAIC; j <= KERNEL_MOSAIC; j++) { 448 for (int i = -KERNEL_MOSAIC; i <= KERNEL_MOSAIC; i++) { 449 psImage *kernel = pmSubtractionKernelImage(kernels, (float)i / (float)KERNEL_MOSAIC, 450 (float)j / (float)KERNEL_MOSAIC, 451 false); // Image of the kernel 452 if (!kernel) { 453 psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image."); 454 psFree(convKernels); 455 goto MATCH_ERROR; 456 } 457 458 if (psImageOverlaySection(convKernels, kernel, (i + KERNEL_MOSAIC) * fullSize, 459 (j + KERNEL_MOSAIC) * fullSize, "=") == 0) { 460 psError(PS_ERR_UNKNOWN, false, "Unable to overlay kernel image."); 461 psFree(kernel); 462 psFree(convKernels); 463 goto MATCH_ERROR; 464 } 465 psFree(kernel); 466 467 if (subMode == PM_SUBTRACTION_MODE_DUAL) { 468 kernel = pmSubtractionKernelImage(kernels, (float)i / (float)KERNEL_MOSAIC, 469 (float)j / (float)KERNEL_MOSAIC, 470 true); // Image of the kernel 471 if (!kernel) { 472 psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image."); 473 psFree(convKernels); 474 goto MATCH_ERROR; 475 } 476 477 if (psImageOverlaySection(convKernels, kernel, 478 (2 * KERNEL_MOSAIC + 1 + i + KERNEL_MOSAIC) * fullSize + 479 4, 480 (j + KERNEL_MOSAIC) * fullSize, "=") == 0) { 481 psError(PS_ERR_UNKNOWN, false, "Unable to overlay kernel image."); 482 psFree(kernel); 483 psFree(convKernels); 484 goto MATCH_ERROR; 485 } 486 psFree(kernel); 487 } 488 489 } 490 } 491 492 psString comment = NULL; // Comment for metadata 493 psStringAppend(&comment, "Subtraction kernel for region %s", regionString); 494 psMetadataAddImage(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL.IMAGE", 495 PS_META_DUPLICATE_OK, comment, convKernels); 496 psFree(comment); 497 psFree(convKernels); 498 } 499 500 #if 0 501 { 502 // Generate images of the kernel components 503 psMetadata *header = psMetadataAlloc(); // Header 504 for (int i = 0; i < solution->n; i++) { 505 psString name = NULL; // Header keyword 506 psStringAppend(&name, "SOLN%04d", i); 507 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, solution->data.F64[i]); 508 psFree(name); 509 } 510 psArray *kernelImages = pmSubtractionKernelSolutions(solution, kernels, 0.0, 0.0); 511 psFits *kernelFile = psFitsOpen("kernels.fits", "w"); 512 (void)psFitsWriteImageCube(kernelFile, header, kernelImages, NULL); 513 psFitsClose(kernelFile); 514 psFree(kernelImages); 515 psFree(header); 516 } 517 #endif 386 if (!pmSubtractionAnalysis(analysis, kernels, region, numCols, numRows)) { 387 psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data"); 388 goto MATCH_ERROR; 389 } 518 390 519 391 memCheck("diag outputs"); … … 524 396 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 525 397 goto MATCH_ERROR; 526 }527 528 // Set the variance factors529 switch (subMode) {530 case PM_SUBTRACTION_MODE_1: {531 recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),532 region);533 break;534 }535 case PM_SUBTRACTION_MODE_2:536 recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),537 region);538 break;539 case PM_SUBTRACTION_MODE_DUAL:540 recordVarianceFactor(conv1, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false),541 region);542 recordVarianceFactor(conv2, pmSubtractionVarianceFactor(kernels, 0.5, 0.5, true),543 region);544 break;545 default:546 psAbort("Should never reach here.");547 398 } 548 399 … … 583 434 memCheck("convolution"); 584 435 436 if (conv1) { 437 psMetadataCopy(conv1->analysis, analysis); 438 } 439 if (conv2) { 440 psMetadataCopy(conv2->analysis, analysis); 441 } 442 psFree(analysis); 585 443 586 444 #ifdef TESTING … … 603 461 604 462 MATCH_ERROR: 463 psFree(analysis); 605 464 psFree(region); 606 465 psFree(regionString);
Note:
See TracChangeset
for help on using the changeset viewer.
