Changeset 14802
- Timestamp:
- Sep 10, 2007, 11:31:25 AM (19 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 3 edited
-
pmSubtractionMatch.c (modified) (8 diffs)
-
pmSubtractionStamps.c (modified) (9 diffs)
-
pmSubtractionStamps.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r14801 r14802 47 47 48 48 static bool getStamps(pmSubtractionStampList **stamps, // Stamps to read 49 const psArray *stampsData, // Stamp data from a file50 49 const pmReadout *reference, // Reference readout 51 50 const pmReadout *input, // Input readout, or NULL to generate fake stamps … … 60 59 ) 61 60 { 62 if (stampsData && *stamps) {63 // We've already previously read all the stamps64 return true;65 }66 67 psImage *inImage = NULL; // Input image68 if (input) {69 inImage = input->image;70 }71 72 if (stampsData) {73 psVector *xStamp = NULL, *yStamp = NULL, *fluxStamp = NULL; // Stamp positions and fluxes74 if (input) {75 // We have x, y because the target is provided by the input image76 xStamp = stampsData->data[0];77 yStamp = stampsData->data[1];78 } else {79 // We have x, y and flux in order to generate a target80 xStamp = stampsData->data[0];81 yStamp = stampsData->data[1];82 fluxStamp = stampsData->data[2];83 }84 85 psFree(*stamps);86 // Apply exclusion zone if we're matching to a nominated PSF; otherwise don't care87 *stamps = pmSubtractionSetStamps(xStamp, yStamp, fluxStamp, reference->image, subMask,88 region, stampSpacing, input ? 0 : footprint);89 }90 61 psTrace("psModules.imcombine", 3, "Finding stamps...\n"); 91 *stamps = pmSubtractionFindStamps(*stamps, reference->image, subMask, region, 92 threshold, stampSpacing); 62 *stamps = pmSubtractionStampsFind(*stamps, reference->image, subMask, region, threshold, stampSpacing); 93 63 if (!*stamps) { 94 64 psError(PS_ERR_UNKNOWN, false, "Unable to find stamps."); … … 98 68 memCheck(" find stamps"); 99 69 100 if (!input && !pmSubtraction GenerateStamps(*stamps, targetWidth, footprint, size)) {70 if (!input && !pmSubtractionStampsGenerate(*stamps, targetWidth, footprint, size)) { 101 71 psError(PS_ERR_UNKNOWN, false, "Unable to generate target stamps."); 102 72 return false; 103 73 } 104 74 75 memCheck(" generate stamps"); 76 105 77 psTrace("psModules.imcombine", 3, "Extracting stamps...\n"); 106 if (!pmSubtractionExtractStamps(*stamps, reference->image, inImage, weight, footprint, size)) { 78 if (!pmSubtractionStampsExtract(*stamps, reference->image, input ? input->image : NULL, 79 weight, footprint, size)) { 107 80 psError(PS_ERR_UNKNOWN, false, "Unable to extract stamps."); 108 81 return false; … … 225 198 pmSubtractionKernels *kernels = NULL; // Kernel basis functions 226 199 227 // Read stamps from file228 psArray *stampsData = NULL; // Stamps data read from file229 if (stampsName && strlen(stampsName) > 0) {230 psTrace("psModules.imcombine", 3, "Reading stamps from %s...\n", stampsName);231 if (input) {232 // We have x, y because the target is provided by the input image233 stampsData = psVectorsReadFromFile(stampsName, "%f %f"); // Stamp positions234 } else {235 // We have x, y and flux in order to generate a target236 stampsData = psVectorsReadFromFile(stampsName, "%f %f %f"); // Stamp positions237 }238 if (!stampsData) {239 psError(PS_ERR_IO, false, "Unable to read stamps file %s", stampsName);240 return false;241 }242 243 // Correct for IRAF/FITS (unit-offset) positions to C (zero-offset) positions244 psVector *xStamp = stampsData->data[0]; // x positions245 psVector *yStamp = stampsData->data[1]; // y positions246 psBinaryOp(xStamp, xStamp, "-", psScalarAlloc(1.0, PS_TYPE_F32));247 psBinaryOp(yStamp, yStamp, "-", psScalarAlloc(1.0, PS_TYPE_F32));248 }249 250 200 int numCols = reference->image->numCols, numRows = reference->image->numRows; // Image dimensions 251 201 … … 281 231 } 282 232 233 // Read stamps from file 234 if (stampsName && strlen(stampsName) > 0) { 235 psTrace("psModules.imcombine", 3, "Reading stamps from %s...\n", stampsName); 236 psVector *xStamp = NULL, *yStamp = NULL, *fluxStamp = NULL; // Stamp positions and fluxes 237 if (input) { 238 // We have x, y because the target is provided by the input image 239 psArray *stampsData = psVectorsReadFromFile(stampsName, "%f %f"); // Stamp positions 240 if (!stampsData) { 241 psError(PS_ERR_IO, false, "Unable to read stamps file %s", stampsName); 242 goto ERROR; 243 } 244 xStamp = psMemIncrRefCounter(stampsData->data[0]); 245 yStamp = psMemIncrRefCounter(stampsData->data[1]); 246 psFree(stampsData); 247 } else { 248 // We have x, y and flux in order to generate a target 249 psArray *stampsData = psVectorsReadFromFile(stampsName, "%f %f %f"); // Stamp positions 250 if (!stampsData) { 251 psError(PS_ERR_IO, false, "Unable to read stamps file %s", stampsName); 252 goto ERROR; 253 } 254 xStamp = psMemIncrRefCounter(stampsData->data[0]); 255 yStamp = psMemIncrRefCounter(stampsData->data[1]); 256 fluxStamp = psMemIncrRefCounter(stampsData->data[2]); 257 psFree(stampsData); 258 } 259 260 // Correct for IRAF/FITS (unit-offset) positions to C (zero-offset) positions 261 psBinaryOp(xStamp, xStamp, "-", psScalarAlloc(1.0, PS_TYPE_F32)); 262 psBinaryOp(yStamp, yStamp, "-", psScalarAlloc(1.0, PS_TYPE_F32)); 263 264 stamps = pmSubtractionStampsSet(xStamp, yStamp, fluxStamp, reference->image, subMask, 265 region, stampSpacing, input ? 0 : 2 * footprint); 266 } 267 283 268 // Define kernel basis functions 284 269 if (optimum && (type == PM_SUBTRACTION_KERNEL_ISIS || type == PM_SUBTRACTION_KERNEL_GUNK)) { 285 if (!getStamps(&stamps, stampsData,reference, input, subMask, weight, NULL,270 if (!getStamps(&stamps, reference, input, subMask, weight, NULL, 286 271 threshold, stampSpacing, targetWidth, size, footprint)) { 287 272 goto ERROR; … … 308 293 psTrace("psModules.imcombine", 2, "Iteration %d...\n", k); 309 294 310 if (!getStamps(&stamps, stampsData,reference, input, subMask, weight, region,295 if (!getStamps(&stamps, reference, input, subMask, weight, region, 311 296 threshold, stampSpacing, targetWidth, size, footprint)) { 312 297 goto ERROR; … … 457 442 psFree(subMask); 458 443 subMask = NULL; 459 psFree(stampsData);460 stampsData = NULL;461 444 462 445 if (!pmSubtractionBorder(convolved->image, convolved->weight, convolved->mask, size, maskBlank)) { … … 477 460 psFree(stamps); 478 461 psFree(solution); 479 psFree(stampsData);480 462 psFree(stamps); 481 463 return false; -
trunk/psModules/src/imcombine/pmSubtractionStamps.c
r14801 r14802 5 5 #include <stdio.h> 6 6 #include <pslib.h> 7 8 // All these includes required to get stamps out of an array of pmSources 9 #include "pmMoments.h" 10 #include "pmPeaks.h" 11 #include "pmResiduals.h" 12 #include "pmHDU.h" 13 #include "pmFPA.h" 14 #include "pmGrowthCurve.h" 15 #include "pmPSF.h" 16 #include "pmModel.h" 17 #include "pmSource.h" 18 7 19 8 20 #include "pmSubtraction.h" … … 133 145 134 146 135 pmSubtractionStampList *pmSubtraction FindStamps(pmSubtractionStampList *stamps, const psImage *image,147 pmSubtractionStampList *pmSubtractionStampsFind(pmSubtractionStampList *stamps, const psImage *image, 136 148 const psImage *subMask, const psRegion *region, 137 149 float threshold, float spacing) … … 170 182 int numStamps = stamps->num; // Number of stamp regions 171 183 int numFound = 0; // Number of stamps found 184 int numValid = 0; // Number of valid regions 172 185 for (int i = 0; i < numStamps; i++) { 173 186 pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest … … 177 190 continue; 178 191 } 192 numValid++; 179 193 180 194 float xStamp = 0, yStamp = 0; // Coordinates of stamp … … 238 252 } 239 253 240 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Found %d stamps", numFound); 254 if (numValid > 0) { 255 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Found %d stamps", numFound); 256 } 241 257 242 258 return stamps; … … 244 260 245 261 246 pmSubtractionStampList *pmSubtractionS etStamps(const psVector *x, const psVector *y, const psVector *flux,262 pmSubtractionStampList *pmSubtractionStampsSet(const psVector *x, const psVector *y, const psVector *flux, 247 263 const psImage *image, const psImage *subMask, 248 264 const psRegion *region, float spacing, int exclusionZone) 249 265 { 250 PS_ASSERT_VECTOR_NON_NULL(x, false);251 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false);252 PS_ASSERT_VECTOR_NON_NULL(y, false);253 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false);254 PS_ASSERT_VECTORS_SIZE_EQUAL(y, x, false);266 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 267 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL); 268 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 269 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL); 270 PS_ASSERT_VECTORS_SIZE_EQUAL(y, x, NULL); 255 271 if (flux) { 256 PS_ASSERT_VECTOR_NON_NULL(flux, false);257 PS_ASSERT_VECTOR_TYPE(flux, PS_TYPE_F32, false);258 PS_ASSERT_VECTORS_SIZE_EQUAL(flux, x, false);272 PS_ASSERT_VECTOR_NON_NULL(flux, NULL); 273 PS_ASSERT_VECTOR_TYPE(flux, PS_TYPE_F32, NULL); 274 PS_ASSERT_VECTORS_SIZE_EQUAL(flux, x, NULL); 259 275 } else { 260 PS_ASSERT_IMAGE_NON_NULL(image, false);276 PS_ASSERT_IMAGE_NON_NULL(image, NULL); 261 277 } 262 278 if (subMask) { 263 PS_ASSERT_IMAGE_NON_NULL(subMask, false);264 PS_ASSERT_IMAGE_TYPE(subMask, PS_TYPE_MASK, false);279 PS_ASSERT_IMAGE_NON_NULL(subMask, NULL); 280 PS_ASSERT_IMAGE_TYPE(subMask, PS_TYPE_MASK, NULL); 265 281 if (image) { 266 PS_ASSERT_IMAGE_NON_NULL(image, false); 267 PS_ASSERT_IMAGES_SIZE_EQUAL(image, subMask, false); 268 } 269 } 282 PS_ASSERT_IMAGE_NON_NULL(image, NULL); 283 PS_ASSERT_IMAGES_SIZE_EQUAL(image, subMask, NULL); 284 } 285 } 286 PS_ASSERT_FLOAT_LARGER_THAN(spacing, 0.0, NULL); 287 PS_ASSERT_INT_NONNEGATIVE(exclusionZone, NULL); 270 288 271 289 int numStars = x->n; // Number of stars … … 399 417 400 418 401 bool pmSubtraction ExtractStamps(pmSubtractionStampList *stamps, psImage *reference, psImage *input,419 bool pmSubtractionStampsExtract(pmSubtractionStampList *stamps, psImage *reference, psImage *input, 402 420 psImage *weight, int footprint, int kernelSize) 403 421 { … … 467 485 468 486 469 bool pmSubtraction GenerateStamps(pmSubtractionStampList *stamps, float fwhm, int footprint, int kernelSize)487 bool pmSubtractionStampsGenerate(pmSubtractionStampList *stamps, float fwhm, int footprint, int kernelSize) 470 488 { 471 489 PM_ASSERT_SUBTRACTION_STAMP_LIST_NON_NULL(stamps, false); … … 510 528 return true; 511 529 } 530 531 532 pmSubtractionStampList *pmSubtractionStampsSetFromSources(const psArray *sources, const psImage *subMask, 533 const psRegion *region, float spacing, 534 int exclusionZone) 535 { 536 PS_ASSERT_ARRAY_NON_NULL(sources, NULL); 537 // Let pmSubtractionStampsSet take care of the rest of the assertions 538 539 int numSources = sources->n; // Number of stars 540 541 psVector *x = psVectorAlloc(numSources, PS_TYPE_F32); // x coordinates 542 psVector *y = psVectorAlloc(numSources, PS_TYPE_F32); // y coordinates 543 psVector *flux = psVectorAlloc(numSources, PS_TYPE_F32); // Fluxes 544 545 for (int i = 0; i < numSources; i++) { 546 pmSource *source = sources->data[i]; // Source of interest 547 if (source->modelPSF) { 548 x->data.F32[i] = source->modelPSF->params->data.F32[PM_PAR_XPOS]; 549 y->data.F32[i] = source->modelPSF->params->data.F32[PM_PAR_YPOS]; 550 } else { 551 x->data.F32[i] = source->peak->xf; 552 y->data.F32[i] = source->peak->yf; 553 } 554 flux->data.F32[i] = powf(10.0, -0.4 * source->psfMag); 555 } 556 557 pmSubtractionStampList *stamps = pmSubtractionStampsSet(x, y, flux, NULL, subMask, region, 558 spacing, exclusionZone); // Stamps to return 559 psFree(x); 560 psFree(y); 561 psFree(flux); 562 563 if (!stamps) { 564 psError(PS_ERR_UNKNOWN, false, "Unable to set stamps from sources."); 565 } 566 567 return stamps; 568 } -
trunk/psModules/src/imcombine/pmSubtractionStamps.h
r14801 r14802 67 67 68 68 /// Find stamps on an image 69 pmSubtractionStampList *pmSubtraction FindStamps(pmSubtractionStampList *stamps, ///< Output stamps, or NULL69 pmSubtractionStampList *pmSubtractionStampsFind(pmSubtractionStampList *stamps, ///< Output stamps, or NULL 70 70 const psImage *image, ///< Image for which to find stamps 71 71 const psImage *mask, ///< Mask, or NULL … … 79 79 /// We may optionally apply an exclusion zone around each star --- this is important when we're convolving to 80 80 /// a specified PSF; less so when we're only trying to get a good subtraction. 81 pmSubtractionStampList *pmSubtractionS etStamps(const psVector *x, ///< x coordinates for each stamp81 pmSubtractionStampList *pmSubtractionStampsSet(const psVector *x, ///< x coordinates for each stamp 82 82 const psVector *y, ///< y coordinates for each stamp 83 83 const psVector *flux, ///< Flux for each stamp, or NULL … … 86 86 const psRegion *region, ///< Region to search, or NULL 87 87 float spacing, ///< Rough spacing for stamps 88 int exclusionZone // Exclusion zone around each star 88 int exclusionZone ///< Exclusion zone around each star 89 ); 90 91 /// 92 pmSubtractionStampList *pmSubtractionStampsSetFromSources( 93 const psArray *sources, ///< Sources for each stamp 94 const psImage *subMask, ///< Mask, or NULL 95 const psRegion *region, ///< Region to search, or NULL 96 float spacing, ///< Rough spacing for stamps 97 int exclusionZone ///< Exclusion zone around each star 89 98 ); 90 99 91 100 /// Extract stamps from the images 92 bool pmSubtraction ExtractStamps(pmSubtractionStampList *stamps, ///< Stamps101 bool pmSubtractionStampsExtract(pmSubtractionStampList *stamps, ///< Stamps 93 102 psImage *reference, ///< Reference image 94 103 psImage *input, ///< Input image (or NULL) … … 99 108 100 109 /// Generate target for stamps based on list 101 bool pmSubtraction GenerateStamps(pmSubtractionStampList *stamps, ///< Stamps110 bool pmSubtractionStampsGenerate(pmSubtractionStampList *stamps, ///< Stamps 102 111 float fwhm, ///< FWHM for each stamp 103 112 int footprint, ///< Stamp footprint size
Note:
See TracChangeset
for help on using the changeset viewer.
