Changeset 25060
- Timestamp:
- Aug 12, 2009, 6:51:33 PM (17 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 3 edited
-
pmSubtractionAnalysis.c (modified) (7 diffs)
-
pmSubtractionAnalysis.h (modified) (1 diff)
-
pmSubtractionMatch.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionAnalysis.c
r25044 r25060 17 17 18 18 19 bool pmSubtractionAnalysis(psMetadata *analysis, pmSubtractionKernels *kernels, psRegion *region, 19 bool pmSubtractionAnalysis(psMetadata *analysis, psMetadata *header, 20 pmSubtractionKernels *kernels, psRegion *region, 20 21 int numCols, int numRows) 21 22 { 22 if (analysis) { 23 PS_ASSERT_METADATA_NON_NULL(analysis, false); 24 } 23 PS_ASSERT_METADATA_NON_NULL(analysis, false); 24 PS_ASSERT_METADATA_NON_NULL(header, false); 25 25 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernels, false); 26 26 PM_ASSERT_SUBTRACTION_KERNELS_SOLUTION(kernels, false); … … 38 38 PS_DATA_REGION | PS_META_DUPLICATE_OK, 39 39 "Region over which subtraction was performed", subRegion); 40 41 psString string = psRegionToString(*subRegion); 40 42 psFree(subRegion); 43 44 psMetadataAddPtr(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION, 45 PS_DATA_REGION | PS_META_DUPLICATE_OK, 46 "Region over which subtraction was performed", string); 47 psFree(string); 41 48 } 42 49 … … 45 52 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 46 53 psMetadataAddS32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 47 PS_META_DUPLICATE_OK, "Subtraction kernels", kernels->mode); 54 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 55 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 56 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 48 57 49 58 // Realisations of kernel … … 163 172 psFree(image); 164 173 165 psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 166 if (item) { 167 item->data.F32 = PS_MAX(item->data.F32, max); 168 } else { 169 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 170 "Maximum deconvolution fraction", max); 174 { 175 psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 176 if (item) { 177 max = item->data.F32 = PS_MAX(item->data.F32, max); 178 } else { 179 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 180 "Maximum deconvolution fraction", max); 181 } 182 } 183 184 { 185 psMetadataItem *item = psMetadataLookup(header, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 186 if (item) { 187 item->data.F32 = max; 188 } else { 189 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 190 "Maximum deconvolution fraction", max); 191 } 171 192 } 172 193 } … … 216 237 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 217 238 PS_META_DUPLICATE_OK, "Moment in yy", m02); 239 240 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_NORM, 241 PS_META_DUPLICATE_OK, "Normalisation", m00); 242 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MX, 243 PS_META_DUPLICATE_OK, "Moment in x", m10); 244 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MY, 245 PS_META_DUPLICATE_OK, "Moment in y", m01); 246 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXX, 247 PS_META_DUPLICATE_OK, "Moment in xx", m20); 248 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXY, 249 PS_META_DUPLICATE_OK, "Moment in xy", m11); 250 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 251 PS_META_DUPLICATE_OK, "Moment in yy", m02); 218 252 } 219 253 … … 225 259 226 260 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 261 PS_META_DUPLICATE_OK, "Background difference", bg); 262 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 227 263 PS_META_DUPLICATE_OK, "Background difference", bg); 228 264 psFree(polyValues); … … 237 273 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 238 274 kernels->rms); 275 276 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_STAMPS, 0, "Number of stamps", 277 kernels->numStamps); 278 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_MEAN, 0, "Mean stamp deviation", 279 kernels->mean); 280 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 281 kernels->rms); 239 282 } 240 283 -
trunk/psModules/src/imcombine/pmSubtractionAnalysis.h
r21149 r25060 27 27 bool pmSubtractionAnalysis( 28 28 psMetadata *analysis, ///< Metadata container for QA information 29 psMetadata *header, ///< Metadata container for QA information to put in header 29 30 pmSubtractionKernels *kernels, ///< Kernels 30 31 psRegion *region, ///< Region for subtraction -
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r24292 r25060 10 10 #include "pmHDU.h" 11 11 #include "pmFPA.h" 12 #include "pmHDUUtils.h" 12 13 #include "pmSubtractionParams.h" 13 14 #include "pmSubtractionKernels.h" … … 58 59 59 60 60 static bool getStamps(pmSubtractionStampList **stamps, // Stamps to read61 const pmReadout *ro1, // Readout 162 const pmReadout *ro2, // Readout 263 const psImage *subMask, // Mask for subtraction, or NULL64 psImage *variance, // Variance map65 const psRegion *region, // Region of interest, or NULL66 float thresh1, // Threshold for stamp finding on readout 167 float thresh2, // Threshold for stamp finding on readout 268 float stampSpacing, // Spacing between stamps69 int size, // Kernel half-size70 int footprint, // Convolution footprint for stamps71 pmSubtractionMode mode // Mode for subtraction61 static bool subtractionGetStamps(pmSubtractionStampList **stamps, // Stamps to read 62 const pmReadout *ro1, // Readout 1 63 const pmReadout *ro2, // Readout 2 64 const psImage *subMask, // Mask for subtraction, or NULL 65 psImage *variance, // Variance map 66 const psRegion *region, // Region of interest, or NULL 67 float thresh1, // Threshold for stamp finding on readout 1 68 float thresh2, // Threshold for stamp finding on readout 2 69 float stampSpacing, // Spacing between stamps 70 int size, // Kernel half-size 71 int footprint, // Convolution footprint for stamps 72 pmSubtractionMode mode // Mode for subtraction 72 73 ) 73 74 { … … 163 164 } 164 165 166 static void subtractionAnalysisUpdate(pmReadout *conv1, pmReadout *conv2, // Convolved images 167 const psMetadata *analysis, // Analysis metadata 168 const psMetadata *header // Header metadata 169 ) 170 { 171 if (conv1) { 172 conv1->analysis = psMetadataCopy(conv1->analysis, analysis); 173 } 174 if (conv2) { 175 conv2->analysis = psMetadataCopy(conv2->analysis, analysis); 176 } 177 178 if (conv1 && conv1->parent) { 179 pmHDU *hdu = pmHDUFromCell(conv1->parent); 180 if (hdu) { 181 hdu->header = psMetadataCopy(hdu->header, header); 182 } 183 } 184 if (conv2 && conv2->parent) { 185 pmHDU *hdu = pmHDUFromCell(conv2->parent); 186 if (hdu) { 187 hdu->header = psMetadataCopy(hdu->header, header); 188 } 189 } 190 191 return; 192 } 165 193 166 194 … … 253 281 254 282 psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values 283 psMetadata *outHeader = psMetadataAlloc(); // Output header values 255 284 256 285 psTrace("psModules.imcombine", 2, "Convolving...\n"); … … 259 288 psRegion *region = regions->data[i]; // Region of interest 260 289 261 if (!pmSubtractionAnalysis(outAnalysis, kernel, region, ro1->image->numCols, ro1->image->numRows)) { 290 if (!pmSubtractionAnalysis(outAnalysis, outHeader, kernel, region, 291 ro1->image->numCols, ro1->image->numRows)) { 262 292 psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data"); 263 293 psFree(outAnalysis); 294 psFree(outHeader); 264 295 psFree(subMask); 265 296 psFree(kernels); … … 272 303 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 273 304 psFree(outAnalysis); 305 psFree(outHeader); 274 306 psFree(subMask); 275 307 psFree(kernels); … … 283 315 psFree(regions); 284 316 285 if (conv1) { 286 psMetadataCopy(conv1->analysis, outAnalysis); 287 } 288 if (conv2) { 289 psMetadataCopy(conv2->analysis, outAnalysis); 290 } 317 subtractionAnalysisUpdate(conv1, conv2, outAnalysis, outHeader); 291 318 psFree(outAnalysis); 319 psFree(outHeader); 292 320 293 321 return true; … … 369 397 pmSubtractionKernels *kernels = NULL; // Kernel basis functions 370 398 psMetadata *analysis = psMetadataAlloc(); // QA data 399 psMetadata *header = psMetadataAlloc(); // QA data for header 371 400 372 401 int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions … … 442 471 // We get the stamps here; we will also attempt to get stamps at the first iteration, but it 443 472 // doesn't matter. 444 if (! getStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2,473 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, NULL, stampThresh1, stampThresh2, 445 474 stampSpacing, size, footprint, subMode)) { 446 475 goto MATCH_ERROR; … … 504 533 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Iteration %d.", k); 505 534 506 if (!getStamps(&stamps, ro1, ro2, subMask, variance, region, stampThresh1, stampThresh2, 507 stampSpacing, size, footprint, subMode)) { 535 if (!subtractionGetStamps(&stamps, ro1, ro2, subMask, variance, region, 536 stampThresh1, stampThresh2, stampSpacing, 537 size, footprint, subMode)) { 508 538 goto MATCH_ERROR; 509 539 } … … 565 595 memCheck("solution"); 566 596 567 if (!pmSubtractionAnalysis(analysis, kernels, region, numCols, numRows)) {597 if (!pmSubtractionAnalysis(analysis, header, kernels, region, numCols, numRows)) { 568 598 psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data"); 569 599 goto MATCH_ERROR; … … 601 631 memCheck("convolution"); 602 632 603 if (conv1) { 604 psMetadataCopy(conv1->analysis, analysis); 605 } 606 if (conv2) { 607 psMetadataCopy(conv2->analysis, analysis); 608 } 633 subtractionAnalysisUpdate(conv1, conv2, analysis, header); 609 634 psFree(analysis); 635 psFree(header); 610 636 611 637 #ifdef TESTING … … 629 655 MATCH_ERROR: 630 656 psFree(analysis); 657 psFree(header); 631 658 psFree(region); 632 659 psFree(regionString);
Note:
See TracChangeset
for help on using the changeset viewer.
