Changeset 15756 for trunk/psModules/src/imcombine/pmSubtractionMatch.c
- Timestamp:
- Dec 6, 2007, 3:57:15 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r15447 r15756 13 13 #include "pmSubtractionKernels.h" 14 14 #include "pmSubtractionStamps.h" 15 #include "pmSubtractionEquation.h" 15 16 #include "pmSubtraction.h" 17 #include "pmSubtractionMask.h" 16 18 #include "pmSubtractionMatch.h" 17 19 20 #define TOL 1.0e-3 // Tolerance for subtraction solution 21 #define KERNEL_MOSAIC 2 // Half-number of kernel instances in the mosaic image 18 22 19 23 static bool useFFT = true; // Do convolutions using FFT … … 63 67 { 64 68 psTrace("psModules.imcombine", 3, "Finding stamps...\n"); 65 *stamps = pmSubtractionStampsFind(*stamps, ro1->image, subMask, region, threshold, stampSpacing, mode); 69 *stamps = pmSubtractionStampsFind(*stamps, ro1->image, subMask, region, threshold, footprint, 70 stampSpacing, mode); 66 71 if (!*stamps) { 67 72 psError(PS_ERR_UNKNOWN, false, "Unable to find stamps."); … … 72 77 73 78 psTrace("psModules.imcombine", 3, "Extracting stamps...\n"); 74 if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2 ? ro2->image : NULL, weight, footprint,size)) {79 if (!pmSubtractionStampsExtract(*stamps, ro1->image, ro2 ? ro2->image : NULL, weight, size)) { 75 80 psError(PS_ERR_UNKNOWN, false, "Unable to extract stamps."); 76 81 return false; … … 86 91 87 92 88 bool pmSubtractionMatch(pmReadout *conv olved, const pmReadout *ro1, const pmReadout *ro2,93 bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, 89 94 int footprint, float regionSize, float stampSpacing, float threshold, 90 95 const psArray *sources, const char *stampsName, … … 95 100 psMaskType maskBlank, float badFrac, pmSubtractionMode mode) 96 101 { 97 PS_ASSERT_PTR_NON_NULL(convolved, false); 102 PS_ASSERT_PTR_NON_NULL(conv1, false); 103 if (mode == PM_SUBTRACTION_MODE_DUAL) { 104 PS_ASSERT_PTR_NON_NULL(conv2, false); 105 } 98 106 PS_ASSERT_PTR_NON_NULL(ro1, false); 99 107 PS_ASSERT_IMAGE_NON_NULL(ro1->image, false); … … 174 182 175 183 // Reset the output readout, just in case 176 if (conv olved->image) {177 psFree(conv olved->image);178 conv olved->image = NULL;179 } 180 if (conv olved->mask) {181 psFree(conv olved->mask);182 conv olved->mask = NULL;183 } 184 if (conv olved->weight) {185 psFree(conv olved->weight);186 conv olved->weight = NULL;184 if (conv1->image) { 185 psFree(conv1->image); 186 conv1->image = NULL; 187 } 188 if (conv1->mask) { 189 psFree(conv1->mask); 190 conv1->mask = NULL; 191 } 192 if (conv1->weight) { 193 psFree(conv1->weight); 194 conv1->weight = NULL; 187 195 } 188 196 … … 250 258 251 259 if (sources) { 252 stamps = pmSubtractionStampsSetFromSources(sources, subMask, region, stampSpacing, mode); 260 stamps = pmSubtractionStampsSetFromSources(sources, subMask, region, footprint, 261 stampSpacing, mode); 253 262 } else if (stampsName && strlen(stampsName) > 0) { 254 stamps = pmSubtractionStampsSetFromFile(stampsName, subMask, region, stampSpacing, mode); 263 stamps = pmSubtractionStampsSetFromFile(stampsName, subMask, region, footprint, 264 stampSpacing, mode); 255 265 } 256 266 … … 295 305 // Not an ISIS/GUNK kernel, or the optimum kernel search failed 296 306 kernels = pmSubtractionKernelsGenerate(type, size, spatialOrder, isisWidths, isisOrders, 297 inner, binning, ringsOrder );298 } 299 psMetadataAddPtr(conv olved->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL",307 inner, binning, ringsOrder, mode); 308 } 309 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL", 300 310 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 301 311 … … 312 322 313 323 psTrace("psModules.imcombine", 3, "Calculating equation...\n"); 314 if (!pmSubtractionCalculateEquation(stamps, kernels , footprint, mode)) {324 if (!pmSubtractionCalculateEquation(stamps, kernels)) { 315 325 psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation."); 316 326 goto MATCH_ERROR; … … 320 330 321 331 psTrace("psModules.imcombine", 3, "Solving equation...\n"); 322 solution = pmSubtractionSolveEquation(solution, stamps); 323 if (! solution) {332 333 if (!pmSubtractionSolveEquation(kernels, stamps, TOL)) { 324 334 psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation."); 325 335 goto MATCH_ERROR; … … 328 338 memCheck(" solve equation"); 329 339 330 psVector *deviations = pmSubtractionCalculateDeviations(stamps, solution, footprint, kernels, 331 mode); // Deviations for each stamp 340 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations 332 341 if (!deviations) { 333 342 psError(PS_ERR_UNKNOWN, false, "Unable to calculate deviations."); … … 351 360 if (numRejected > 0) { 352 361 psTrace("psModules.imcombine", 3, "Solving equation...\n"); 353 solution = pmSubtractionSolveEquation(solution, stamps); 354 if (!solution) { 362 if (!pmSubtractionSolveEquation(kernels, stamps, TOL)) { 355 363 psError(PS_ERR_UNKNOWN, false, "Unable to calculate least-squares equation."); 356 364 goto MATCH_ERROR; 357 365 } 358 psVector *deviations = pmSubtractionCalculateDeviations(stamps, solution, footprint, kernels, 359 mode); // Deviations for each stamp 366 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations 360 367 if (!deviations) { 361 368 psError(PS_ERR_UNKNOWN, false, "Unable to calculate deviations."); … … 376 383 psImage *convKernels = psImageAlloc(5 * fullSize - 1, 5 * fullSize - 1, PS_TYPE_F32); 377 384 psImageInit(convKernels, NAN); 378 for (int j = -2; j <= 2; j++) { 379 for (int i = -2; i <= 2; i++) { 380 psImage *kernel = pmSubtractionKernelImage(solution, kernels, (float)i / 2.0, 381 (float)j / 2.0); // Image of the kernel 385 for (int j = -KERNEL_MOSAIC; j <= KERNEL_MOSAIC; j++) { 386 for (int i = -KERNEL_MOSAIC; i <= KERNEL_MOSAIC; i++) { 387 psImage *kernel = pmSubtractionKernelImage(kernels, (float)i / (float)KERNEL_MOSAIC, 388 (float)j / (float)KERNEL_MOSAIC, 389 false); // Image of the kernel 382 390 if (!kernel) { 383 391 psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image."); … … 386 394 } 387 395 388 if (psImageOverlaySection(convKernels, kernel, (i + 2) * fullSize,389 (j + 2) * fullSize, "=") == 0) {396 if (psImageOverlaySection(convKernels, kernel, (i + KERNEL_MOSAIC) * fullSize, 397 (j + KERNEL_MOSAIC) * fullSize, "=") == 0) { 390 398 psError(PS_ERR_UNKNOWN, false, "Unable to overlay kernel image."); 391 399 psFree(kernel); … … 399 407 psString comment = NULL; // Comment for metadata 400 408 psStringAppend(&comment, "Subtraction kernel for region %s", regionString); 401 psMetadataAddImage(conv olved->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL.IMAGE",409 psMetadataAddImage(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL.IMAGE", 402 410 PS_META_DUPLICATE_OK, comment, convKernels); 403 411 psFree(comment); … … 427 435 428 436 psTrace("psModules.imcombine", 2, "Convolving...\n"); 429 if (!pmSubtractionConvolve(convolved, ro1, ro2, subMask, maskBlank, region, 430 solution, kernels, mode, useFFT)) { 437 if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, maskBlank, region, kernels, useFFT)) { 431 438 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 432 439 goto MATCH_ERROR; … … 439 446 psString comment = NULL; // Comment for metadata 440 447 psStringAppend(&comment, "Subtraction solution for region %s", regionString); 441 psMetadataAddVector(conv olved->analysis, PS_LIST_TAIL, "SUBTRACTION.SOLUTION",448 psMetadataAddVector(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.SOLUTION", 442 449 PS_META_DUPLICATE_OK, comment, solution); 443 450 psFree(comment); 444 451 if (region) { 445 psMetadataAddPtr(conv olved->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION",452 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION", 446 453 PS_META_DUPLICATE_OK | PS_DATA_REGION, comment, region); 447 454 } else { 448 455 region = psRegionAlloc(0, numCols, 0, numRows); 449 psMetadataAddPtr(conv olved->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION",456 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION", 450 457 PS_META_DUPLICATE_OK | PS_DATA_REGION, comment, region); 451 458 psFree(region); … … 458 465 459 466 // There is data in the readout now 460 convolved->data_exists = true; 461 if (convolved->parent) { 462 convolved->parent->data_exists = true; 463 convolved->parent->parent->data_exists = true; 467 conv1->data_exists = true; 468 if (conv1->parent) { 469 conv1->parent->data_exists = true; 470 conv1->parent->parent->data_exists = true; 471 } 472 if (mode == PM_SUBTRACTION_MODE_DUAL) { 473 conv2->data_exists = true; 474 if (conv2->parent) { 475 conv2->parent->data_exists = true; 476 conv2->parent->parent->data_exists = true; 477 } 464 478 } 465 479 } … … 474 488 weight = NULL; 475 489 476 if (!pmSubtractionBorder(conv olved->image, convolved->weight, convolved->mask, size, maskBlank)) {490 if (!pmSubtractionBorder(conv1->image, conv1->weight, conv1->mask, size, maskBlank)) { 477 491 psError(PS_ERR_UNKNOWN, false, "Unable to set border of convolved image."); 478 492 goto MATCH_ERROR;
Note:
See TracChangeset
for help on using the changeset viewer.
