- Timestamp:
- May 3, 2010, 8:50:52 AM (16 years ago)
- Location:
- branches/simtest_nebulous_branches
- Files:
-
- 5 edited
-
. (modified) (1 prop)
-
magic (modified) (1 prop)
-
magic/remove (modified) (1 prop)
-
magic/remove/src (modified) (1 prop)
-
magic/remove/src/streaksremove.c (modified) (37 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/simtest_nebulous_branches
- Property svn:mergeinfo changed
-
branches/simtest_nebulous_branches/magic
- Property svn:ignore
-
old new 1 1 magic 2 2 ssa-core-cpp 3 Makefile4 3 Makefile.bak
-
- Property svn:ignore
-
branches/simtest_nebulous_branches/magic/remove
-
Property svn:ignore
set to
configure
Makefile.in
Doxyfile
config.log
depcomp
config.status
config.guess
ltmain.sh
config.sub
autom4te.cache
libtool
missing
Makefile
aclocal.m4
install-sh
-
Property svn:ignore
set to
-
branches/simtest_nebulous_branches/magic/remove/src
- Property svn:ignore
-
old new 4 4 streakscompare 5 5 streaksrelease 6 makefile 6 Makefile 7 Makefile.in 8 config.h 9 .deps 10 streaksVersionDefinitions.h 11 config.h.in 12 stamp-h1
-
- Property svn:ignore
-
branches/simtest_nebulous_branches/magic/remove/src/streaksremove.c
r25001 r27840 12 12 static pmConfig *parseArguments(int argc, char **argv); 13 13 static bool readAndCopyToOutput(streakFiles *sf, bool exciseAll); 14 static void exciseNonWarpedPixels(streakFiles *sfiles, double newMaskValue);15 static bool warpedPixel(streakFiles *sfiles, int x, int y);16 static void excisePixel(streakFiles *sfiles, unsigned int x, unsigned int y, bool streak, double newMaskValue);14 static long exciseNonDiffedPixels(streakFiles *sfiles, psImageMaskType newMaskValue); 15 static bool diffedPixel(streakFiles *sfiles, int x, int y); 16 static void excisePixel(streakFiles *sfiles, unsigned int x, unsigned int y, bool streak, psImageMaskType newMaskValue); 17 17 static void writeImages(streakFiles *sf, bool exciseImageCube); 18 18 static void updateAstrometry(streakFiles *sfiles); 19 static void censorSources(streakFiles *sfiles, psU32 maskStreak); 20 19 static void censorSources(streakFiles *sfiles, psImageMaskType maskStreak); 20 static long censorPixels(streakFiles *sfiles, psImage * pixels, bool checkNonDiffedPixels, psU16 maskStreak); 21 22 char *streaksProgram = "streaksremove"; 23 24 // Note: For clarity the flow of this program is in main(). 25 // There is not a lot of error checking is done in main. 26 // Until the end, where we might be doing Nebulous operations, called functions exit when an error 27 // is encountered. 21 28 int 22 29 main(int argc, char *argv[]) … … 25 32 26 33 psLibInit(NULL); 27 psTimerStart(" STREAKSREMOVE");34 psTimerStart("TOTAL_TIME"); 28 35 29 36 pmConfig *config = parseArguments(argc, argv); … … 33 40 } 34 41 35 // Values to set for masked pixels36 psU32 maskStreak = 0; // for the image and weight (usually NAN, MAXINT for integer images)37 psU32 maskMask = 0; // value looked up for MASK.STREAK38 39 42 psString streaksFileName = psMetadataLookupStr(NULL, config->arguments, "STREAKS"); 40 43 … … 42 45 Streaks *streaks = readStreaksFile(streaksFileName); 43 46 if (!streaks) { 44 psError(PS_ERR_UNKNOWN, "failed to read streaks file: %s", streaksFileName);47 psError(PS_ERR_UNKNOWN, false, "failed to read streaks file: %s", streaksFileName); 45 48 streaksExit("", PS_EXIT_PROG_ERROR); 46 49 } … … 49 52 streakFiles *sfiles = openFiles(config, true, argv[0]); 50 53 setupAstrometry(sfiles); 54 sfiles->stats = psMetadataAlloc(); 51 55 52 56 // Optionally we can set pixels that are masked to NAN since they couldn't have been … … 60 64 61 65 bool exciseAll = false; 62 // --keepnon warped is a test and debug mode63 bool keepNon WarpedPixels = psMetadataLookupBool(&status, config->arguments, "KEEP_NON_WARPED");64 65 // we need to check for non warped pixels unless we've been asked not to or the stage is diff66 // (By definition pixels in diff images were included in a diff)67 bool checkNon WarpedPixels = ! (keepNonWarpedPixels || (sfiles->stage == IPP_STAGE_DIFF) );68 69 if (checkNon WarpedPixels ) {66 // --keepnondiffed is a test and debug mode 67 bool keepNonDiffedPixels = psMetadataLookupBool(&status, config->arguments, "KEEP_NON_DIFFED"); 68 69 // we need to check for non diffed pixels unless we've been asked not to or the stage is diff 70 // (By definition pixels in diff images were included in the difference images) 71 bool checkNonDiffedPixels = ! (keepNonDiffedPixels || (sfiles->stage == IPP_STAGE_DIFF) ); 72 73 if (checkNonDiffedPixels ) { 70 74 // From magic ICD: 71 75 // In the raw and detrended images, the pixels which were not … … 75 79 // if no skycells are provided sfiles->exciseAll is set to true 76 80 77 psTimerStart("COMPUTE_ WARPED_PIXELS");78 if (! compute WarpedPixels(sfiles) ) {81 psTimerStart("COMPUTE_DIFFED_PIXELS"); 82 if (! computeDiffedPixels(sfiles) ) { 79 83 // we have no choice to excise all pixels 80 84 exciseAll = true; 81 85 } 82 psF64 cwp_t = psTimerClear("COMPUTE_WARPED_PIXELS"); 83 psLogMsg("streaksremove", PS_LOG_INFO, "time to compute warped pixels: %f\n", cwp_t); 84 } 85 86 psF64 cdp_t = psTimerClear("COMPUTE_DIFFED_PIXELS"); 87 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "COMPUTE_UNDIFFED_PIXELS", PS_META_REPLACE, "time to compute non-diffedpixels", cdp_t); 88 psLogMsg("streaksremove", PS_LOG_INFO, "time to compute diffed pixels: %f\n", cdp_t); 89 } 90 86 91 if (sfiles->stage == IPP_STAGE_RAW) { 87 92 // Except for raw stage, all of our (GPC1) files have one image extension. … … 97 102 } 98 103 99 int totalPixels = 0; 100 int totalStreakPixels = 0; 101 104 long totalPixels = 0; 105 long totalStreakPixels = 0; 106 long nonDiffedPixels = 0; 107 108 // accumulators for the various timers 109 psF64 gsp_t = 0; 110 psF64 enw_t = 0; 111 psF64 rms_t = 0; 112 psF64 cs_t = 0; 113 psF64 wi_t = 0; 114 psF64 ua_t = 0; 102 115 // Iterate through each component of the input (except for raw images there is only one) 103 116 do { … … 117 130 118 131 // now that we've read the input files, lookup the mask values 119 if (maskStreak == 0) { 120 strkGetMaskValues(sfiles, &maskStreak, &maskMask); 121 } 132 strkGetMaskValues(sfiles); 122 133 123 134 totalPixels += sfiles->inImage->numRows * sfiles->inImage->numCols; … … 131 142 StreakPixels *pixels = streak_on_component(streaks, sfiles->astrom, sfiles->inImage->numCols, 132 143 sfiles->inImage->numRows); 144 gsp_t += psTimerClear("GET_STREAK_PIXELS"); 145 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "GET_STREAK_PIXELS", PS_META_REPLACE, "", gsp_t); 133 146 psLogMsg("streaksremove", PS_LOG_INFO, "time to get streak pixels: %f\n", psTimerClear("GET_STREAK_PIXELS")); 134 147 135 148 // if this extension contained an image, excise the streaked pixels. 136 149 // otherwise it contained an image cube (video cell) which is handled in the if block 137 150 if (sfiles->inImage->image) { 138 if (checkNon WarpedPixels) {139 psTimerStart("EXCISE_NON_ WARPED");140 141 // set non- warped pixels and variance to NAN, mask to maskStreak (since the pixel151 if (checkNonDiffedPixels) { 152 psTimerStart("EXCISE_NON_DIFFED"); 153 154 // set non-diffed pixels and variance to NAN, mask to maskStreak (since the pixel 142 155 // is excised as part of the destreaking process) 143 exciseNonWarpedPixels(sfiles, maskStreak); 144 145 psLogMsg("streaksremove", PS_LOG_INFO, "time to excise non warped pixels: %f\n", psTimerClear("EXCISE_NON_WARPED")); 156 nonDiffedPixels += exciseNonDiffedPixels(sfiles, sfiles->maskStreak); 157 158 enw_t += psTimerClear("EXCISE_NON_DIFFED"); 159 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "EXCISE_NON_DIFFED", PS_META_REPLACE, "", enw_t); 160 psLogMsg("streaksremove", PS_LOG_INFO, "time to excise non diffed pixels: %f\n", enw_t); 146 161 } 147 162 148 149 163 psTimerStart("REMOVE_STREAKS"); 150 164 151 for (int y=0 ; y < sfiles->inImage->numRows; y++) { 152 for (int x = 0; x < sfiles->inImage->numCols; x++) { 153 if (psImageGet(pixels, x, y)) { 154 ++totalStreakPixels; 155 if (!checkNonWarpedPixels || warpedPixel(sfiles, x, y)) { 156 157 excisePixel(sfiles, x, y, true, maskStreak); 158 159 } else { 160 // This pixel was not included in any warp and has thus already excised 161 // by exciseNonWarpedPixels 162 } 163 } 164 } 165 } 166 167 psLogMsg("streaksremove", PS_LOG_INFO, "time to remove streak pixels: %f\n", psTimerClear("REMOVE_STREAKS")); 165 totalStreakPixels += censorPixels(sfiles, pixels, checkNonDiffedPixels, sfiles->maskStreak); 166 167 rms_t += psTimerClear("REMOVE_STREAKS"); 168 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "REMOVE_STREAKS", PS_META_REPLACE, "", enw_t); 169 psLogMsg("streaksremove", PS_LOG_INFO, "time to remove streak pixels: %f\n", rms_t); 168 170 169 171 if (nanForRelease) { 170 172 // set any pixels that were masked, to NAN (unless they are already NAN) 171 setMaskedToNAN(sfiles, maskMask, true);173 setMaskedToNAN(sfiles, sfiles->maskMask, true); 172 174 } 173 175 174 } else { 176 } else { 175 177 // this component contains an image cube 176 178 // For now excise it completely … … 184 186 // chip processed files with the data calcuated by psastro at the camera stage 185 187 // (actually we use a linear approximation) 188 psTimerStart("UPDATE_ASTROMETRY"); 186 189 updateAstrometry(sfiles); 187 } 188 189 censorSources(sfiles, maskStreak); 190 ua_t += psTimerClear("UPDATE_ASTROMETRY"); 191 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "UPDATE_ASTROMETRY", PS_META_REPLACE, "", ua_t); 192 psLogMsg("streaksremove", PS_LOG_INFO, "time to update astrometry: %f\n", ua_t); 193 } 194 195 psTimerStart("CENSOR_SOURCES"); 196 censorSources(sfiles, sfiles->maskStreak); 197 cs_t += psTimerClear("CENSOR_SOURCES"); 198 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "CENSOR_SOURCES", PS_META_REPLACE, "", cs_t); 190 199 191 200 // write the destreaked "temporary" images and the recovery images 201 psTimerStart("WRITE_IMAGES"); 192 202 writeImages(sfiles, exciseImageCube); 193 203 wi_t += psTimerClear("WRITE_IMAGES"); 204 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "WRITE_IMAGES", PS_META_REPLACE, "", wi_t); 194 205 195 206 psLogMsg("streaksremove", PS_LOG_INFO, "time to process component %d: %f\n", sfiles->extnum, psTimerClear("PROCESS_COMPONENT")); 207 196 208 } while (streakFilesNextExtension(sfiles)); 197 209 … … 199 211 psFree(streaks); 200 212 201 psLogMsg("streaksremove", PS_LOG_INFO, "pixels: %ld streak pixels: %ld %4.2f%%\n", totalPixels, totalStreakPixels, 100. * totalStreakPixels / totalPixels); 213 if (exciseAll) { 214 totalStreakPixels = totalPixels; 215 } 216 217 psF64 streakFraction = (double) totalStreakPixels / totalPixels; 218 psLogMsg("streaksremove", PS_LOG_INFO, " total pixels: %8ld\n", totalPixels); 219 psLogMsg("streaksremove", PS_LOG_INFO, " streak pixels: %8ld %4.2f%%\n", totalStreakPixels, streakFraction * 100); 220 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "STREAK_FRACTION", PS_META_REPLACE, "", streakFraction); 221 222 psF64 nonDiffedFraction = (double) nonDiffedPixels / totalPixels; 223 psLogMsg("streaksremove", PS_LOG_INFO, "nondiffed pixels: %8ld %4.2f%%\n", nonDiffedPixels, nonDiffedFraction * 100); 224 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "NONDIFFED_FRACTION", PS_META_REPLACE, "", nonDiffedFraction); 202 225 203 226 // check the weight and mask files for extra extensions that might be in files … … 208 231 209 232 psTimerStart("CLOSE_IMAGES"); 210 211 233 closeImages(sfiles); 212 213 psLogMsg("streaksremove", PS_LOG_INFO, "time to close images: %f\n", psTimerClear("CLOSE_IMAGES")); 214 215 234 psF64 ci_t = psTimerClear("CLOSE_IMAGES"); 235 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "CLOSE_IMAGES", PS_META_REPLACE, "", ci_t); 236 237 psLogMsg("streaksremove", PS_LOG_INFO, "time to close images: %f\n", ci_t); 238 239 #ifdef DO_REPLICATE 240 psTimerStart("REPLICATE_OUTPUTS"); 216 241 if (!replicateOutputs(sfiles)) { 217 psError (PS_ERR_UNKNOWN, false, "failed to replicate output files");242 psErrorStackPrint(stderr, "failed to replicate output files"); 218 243 deleteTemps(sfiles); 219 psErrorStackPrint(stderr, "");220 244 exit(PS_EXIT_UNKNOWN_ERROR); 221 245 } 246 psF64 ro_t = psTimerClear("REPLICATE_OUTPUTS"); 247 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "REPLICATE_OUTPUTS", PS_META_REPLACE, "", ro_t); 248 #endif 222 249 223 250 // NOTE: from here on we can't just quit if something goes wrong. … … 229 256 // swap the instances for the input and output 230 257 // Note this is a nebulous database operation. No file I/O is performed 258 psTimerStart("SWAP_INSTANCES"); 231 259 if (!swapOutputsToInputs(sfiles)) { 232 // XXX: Now what?233 260 // It is up to the program that reverts failed destreak runs to insure that 234 // any input files that have been swapped are restored and that the de-streaked235 // versions are deleted 261 // any original non-destreaked input files that have been swapped are restored and that the de-streaked 262 // versions are deleted. 236 263 237 264 psErrorStackPrint(stderr, "failed to swap files"); … … 239 266 // XXX: pick a specific error code for this failure 240 267 exit(PS_EXIT_UNKNOWN_ERROR); 268 } 269 psF64 si_t = psTimerClear("SWAP_INSTANCES"); 270 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "SWAP_INSTANCES", PS_META_REPLACE, "", si_t); 271 } 272 273 psF64 total_time = psTimerClear("TOTAL_TIME"); 274 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "TOTAL_TIME", PS_META_REPLACE, "", total_time); 275 psLogMsg("streaksremove", PS_LOG_INFO, "time to run streaksremove: %f\n", total_time); 276 277 if (sfiles->statsFile) { 278 const char *statsMDC = psMetadataConfigFormat(sfiles->stats); 279 if (!statsMDC || strlen(statsMDC) == 0) { 280 psError(PS_ERR_IO, false, "Unable to get statistics MDC file.\n"); 281 } else { 282 fprintf(sfiles->statsFile, "%s", statsMDC); 283 psFree(statsMDC); 284 fclose(sfiles->statsFile); 285 sfiles->statsFile = NULL; 286 psFree(sfiles->stats); 287 sfiles->stats = NULL; 241 288 } 242 289 } … … 247 294 pmConceptsDone(); 248 295 pmModelClassCleanup(); 249 streaksNebulousCleanup(); 296 streaksNebulousCleanup(); 250 297 pmConfigDone(); 251 psLogMsg("streaksremove", PS_LOG_INFO, "time to run streaksremove: %f\n", psTimerClear("STREAKSREMOVE"));252 298 psLibFinalize(); 253 299 … … 255 301 256 302 return 0; 303 } 304 305 static long 306 censorPixels(streakFiles *sfiles, psImage *pixels, bool checkNonDiffedPixels, psU16 maskStreak) 307 { 308 long streakPixels = 0; 309 310 for (int y=0 ; y < sfiles->inImage->numRows; y++) { 311 for (int x = 0; x < sfiles->inImage->numCols; x++) { 312 if (psImageGet(pixels, x, y)) { 313 if (!checkNonDiffedPixels || diffedPixel(sfiles, x, y)) { 314 ++streakPixels; 315 316 excisePixel(sfiles, x, y, true, maskStreak); 317 318 } else { 319 // This pixel was not included in any warp and has thus already excised 320 // by exciseNonDiffedPixels 321 } 322 } 323 } 324 } 325 return streakPixels; 257 326 } 258 327 … … 266 335 fprintf(stderr, "\t-weight WEIGHT.fits: weight file to de-streak\n"); 267 336 fprintf(stderr, "\t-replace: replace the input images with the output\n"); 268 fprintf(stderr, "\t-keepnon warped: do not exise pixels that were not part of difference processing\n");337 fprintf(stderr, "\t-keepnondiffed: do not exise pixels that were not part of difference processing\n"); 269 338 fprintf(stderr, "\t-transparent val: instead of setting excicsed pixel to NAN add val\n"); 270 339 fprintf(stderr, "\t-chip_mask MASK.fits: name of mask for chip stage (camera stage mask is passed tih -mask)\n"); … … 356 425 true); 357 426 } 358 359 if ((argnum = psArgumentGet(argc, argv, "-keepnon warped"))) {360 psArgumentRemove(argnum, &argc, argv); 361 psMetadataAddBool(config->arguments, PS_LIST_TAIL, "KEEP_NON_ WARPED", 0,362 "skip excising of non warped pixels", true);427 428 if ((argnum = psArgumentGet(argc, argv, "-keepnondiffed"))) { 429 psArgumentRemove(argnum, &argc, argv); 430 psMetadataAddBool(config->arguments, PS_LIST_TAIL, "KEEP_NON_DIFFED", 0, 431 "skip excising of non diffed pixels", true); 363 432 } 364 433 … … 370 439 psArgumentRemove(argnum, &argc, argv); 371 440 double transparentStreaks = atof(argv[argnum]); 372 psMetadataAddF 64(config->arguments, PS_LIST_TAIL, "TRANSPARENT_STREAKS", 0,441 psMetadataAddF32(config->arguments, PS_LIST_TAIL, "TRANSPARENT_STREAKS", 0, 373 442 "value to adjust excised pixels", transparentStreaks); 374 443 psArgumentRemove(argnum, &argc, argv); 375 444 } 376 377 // if skycells are not provided then we have to execise all pixels unless -keepnon warped445 446 // if skycells are not provided then we have to execise all pixels unless -keepnondiffed 378 447 pmConfigFileSetsMD(config->arguments, &argc, argv, "SKYCELLS", "-skycell", "-skycelllist"); 379 448 … … 441 510 } 442 511 512 if ((argnum = psArgumentGet(argc, argv, "-stats"))) { 513 psArgumentRemove(argnum, &argc, argv); 514 psMetadataAddStr(config->arguments, PS_LIST_TAIL, "STATS", 0, 515 "name of input stats file", argv[argnum]); 516 psArgumentRemove(argnum, &argc, argv); 517 } 518 443 519 if ((argnum = psArgumentGet(argc, argv, "-tmproot"))) { 444 520 psArgumentRemove(argnum, &argc, argv); … … 483 559 updateAstrometry(streakFiles *sf) 484 560 { 485 // XXX: why do I check this here? Shouldn't it be just around the call to linearizeTransforms?486 561 if (sf->bilevelAstrometry) { 487 488 562 if (!linearizeTransforms(sf->astrom)) { 489 // fit failed, leave the astrometryunchanged563 // fit failed, leave the transform in the file unchanged 490 564 return; 491 565 } 492 493 if (!pmAstromWriteWCS(sf->outImage->header, sf->inAstrom->fpa, sf->chip, 0.001)) { 494 psError(PS_ERR_UNKNOWN, false, "failed to update astrometry for extension %d", sf->extnum); 495 streaksExit("", PS_EXIT_UNKNOWN_ERROR); 496 } 497 if (sf->outMask) { 498 pmAstromWriteWCS(sf->outMask->header, sf->inAstrom->fpa, sf->chip, 0.001); 499 } 500 if (sf->outWeight) { 501 pmAstromWriteWCS(sf->outWeight->header, sf->inAstrom->fpa, sf->chip, 0.001); 566 } 567 if (!pmAstromWriteWCS(sf->outImage->header, sf->inAstrom->fpa, sf->chip, 0.001)) { 568 psError(PS_ERR_UNKNOWN, false, "failed to update astrometry for extension %d", sf->extnum); 569 streaksExit("", PS_EXIT_UNKNOWN_ERROR); 570 } 571 if (sf->outMask) { 572 pmAstromWriteWCS(sf->outMask->header, sf->inAstrom->fpa, sf->chip, 0.001); 573 } 574 if (sf->outWeight) { 575 pmAstromWriteWCS(sf->outWeight->header, sf->inAstrom->fpa, sf->chip, 0.001); 576 } 577 } 578 579 static void 580 setStreakBits(psImage *maskImage, psU32 maskStreak) 581 { 582 for (int y=0 ; y < maskImage->numRows; y++) { 583 for (int x=0 ; x < maskImage->numCols; x++) { 584 maskImage->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= maskStreak; 502 585 } 503 586 } … … 508 591 readAndCopyToOutput(streakFiles *sf, bool exciseAll) 509 592 { 510 bool updateAstrometry = false;511 593 if (sf->inImage->pmfile) { 512 594 // image data from pmFPAfile (diff or warp file) … … 526 608 streaksExit("", PS_EXIT_UNKNOWN_ERROR); 527 609 } 528 // For the chip level files, copy the WCS from the astrometry file to the header529 // XXX: do we want to do this for raw images as well?530 if (sf->stage == IPP_STAGE_CHIP) {531 if (!sf->bilevelAstrometry) {532 updateAstrometry = true;533 if (!pmAstromWriteWCS(sf->inImage->header, sf->inAstrom->fpa, sf->chip, 0.001)) {534 psError(PS_ERR_UNKNOWN, false, "failed to update astrometry for extension %d", sf->extnum);535 streaksExit("", PS_EXIT_UNKNOWN_ERROR);536 }537 }538 }539 610 sf->outImage->header = psMemIncrRefCounter(sf->inImage->header); 540 611 if (sf->recImage) { … … 569 640 } 570 641 addDestreakKeyword(sf->outMask->header); 571 if (updateAstrometry) { 572 pmAstromWriteWCS(sf->outMask->header, sf->inAstrom->fpa, sf->chip, 0.001); 573 } 574 setupImageRefs(sf->outMask, sf->recMask, sf->inMask, sf->extnum, exciseAll); 642 // Note: we don't excise the mask pixels even if exciseAll is true. 643 setupImageRefs(sf->outMask, sf->recMask, sf->inMask, sf->extnum, false); 644 if (exciseAll) { 645 strkGetMaskValues(sf); 646 647 // add the STREAK bit to the mask image pixels 648 setStreakBits(sf->inMask->image, sf->maskStreak); 649 } 575 650 if (sf->outChMask) { 576 651 sf->outChMask->header = (psMetadata *) psMemIncrRefCounter(sf->outMask->header); … … 597 672 } 598 673 addDestreakKeyword(sf->outWeight->header); 599 if (updateAstrometry) {600 pmAstromWriteWCS(sf->inWeight->header, sf->inAstrom->fpa, sf->chip, 0.001);601 }602 674 setupImageRefs(sf->outWeight, sf->recWeight, sf->inWeight, sf->extnum, exciseAll); 603 675 … … 622 694 } else { 623 695 // we have an image cube 624 double initValue;625 696 if (exciseImageCube) { 626 697 // copy the entire input image to the recovery image 627 698 writeImageCube(sf->recImage, sf->inImage->imagecube, extname, sf->extnum); 628 initValue = NAN;629 699 } else { 630 // otherwise write it to the output 700 // otherwise write it to the output 631 701 writeImageCube(sf->outImage, sf->inImage->imagecube, extname, sf->extnum); 632 initValue = 0; 633 } 634 635 // borrow one of the images from the imagecube and set it to init value 636 psImage *image = psArrayGet (sf->inImage->imagecube, 0); 637 psMemIncrRefCounter(image); 638 psImageInit(image, initValue); 702 } 703 704 // Now deal with the other output image 639 705 if (exciseImageCube) { 640 sf->outImage->image = image; 641 writeImage(sf->outImage, extname, sf->extnum); 706 // Set the values in the imagecube images to NAN and write them to the output image 707 for (int i = 0; i < psArrayLength(sf->inImage->imagecube); i++) { 708 psImage *image = psArrayGet (sf->inImage->imagecube, i); 709 // XXX: NAN isn't right. It should be the integer equivalent. Should use exciseValue 710 // but it isn't set with this code path. Fix that. 711 psImageInit(image, 65535); 712 } 713 writeImageCube(sf->outImage, sf->inImage->imagecube, extname, sf->extnum); 642 714 } else { 643 // write zero valued image to reccovery644 715 if (sf->recImage) { 645 sf->recImage->image = image; 646 writeImage(sf->recImage, extname, sf->extnum); 716 // Set the values in the imagecube images to zero 717 for (int i = 0; i < psArrayLength(sf->inImage->imagecube); i++) { 718 psImage *image = psArrayGet (sf->inImage->imagecube, i); 719 psImageInit(image, 0); 720 } 721 // copy the entire zeroed image to the recovery image 722 writeImageCube(sf->recImage, sf->inImage->imagecube, extname, sf->extnum); 647 723 } 648 724 } … … 666 742 667 743 static void 668 excisePixel(streakFiles *sfiles, unsigned int x, unsigned int y, bool streak, double newMaskValue)744 excisePixel(streakFiles *sfiles, unsigned int x, unsigned int y, bool streak, psImageMaskType newMaskValue) 669 745 { 670 746 double exciseValue = sfiles->inImage->exciseValue; … … 675 751 } 676 752 677 double imageValue = psImageGet (sfiles->inImage->image, x, y); 678 if (sfiles->recImage && !isExciseValue(imageValue, sfiles->inImage->exciseValue) ) { 679 psImageSet (sfiles->recImage->image, x, y, imageValue); 680 } 681 682 if (sfiles->transparentStreaks == 0) { 683 psImageSet (sfiles->outImage->image, x, y, exciseValue); 753 if (sfiles->inImage->image->type.type == PS_TYPE_U16) { 754 psU16 imageValue = sfiles->inImage->image->data.U16[y][x]; 755 if (sfiles->recImage && !isExciseValue(imageValue, sfiles->inImage->exciseValue) ) { 756 sfiles->recImage->image->data.U16[y][x] = imageValue; 757 } 758 759 if (sfiles->transparentStreaks == 0) { 760 sfiles->outImage->image->data.U16[y][x] = exciseValue; 761 } else { 762 if (streak) { 763 // as a visualization aid don't mask the pixel, just change the intensity 764 sfiles->outImage->image->data.U16[y][x] = imageValue + sfiles->transparentStreaks; 765 } else { 766 sfiles->outImage->image->data.U16[y][x] = exciseValue; 767 } 768 } 684 769 } else { 685 if (streak) { 686 // as a visualization aid don't mask the pixel, just change the intensity 687 psImageSet (sfiles->outImage->image, x, y, imageValue + sfiles->transparentStreaks); 770 float imageValue = sfiles->inImage->image->data.F32[y][x]; 771 if (sfiles->recImage && !isExciseValue(imageValue, sfiles->inImage->exciseValue) ) { 772 sfiles->recImage->image->data.F32[y][x] = imageValue; 773 } 774 775 if (sfiles->transparentStreaks == 0) { 776 sfiles->outImage->image->data.F32[y][x] = exciseValue; 688 777 } else { 689 psImageSet (sfiles->outImage->image, x, y, exciseValue); 778 if (streak) { 779 // as a visualization aid don't mask the pixel, just change the intensity 780 sfiles->outImage->image->data.F32[y][x] = imageValue + sfiles->transparentStreaks; 781 } else { 782 sfiles->outImage->image->data.F32[y][x] = exciseValue; 783 } 690 784 } 691 785 } … … 693 787 if (sfiles->outWeight) { 694 788 if (sfiles->recWeight) { 695 double weightValue = psImageGet (sfiles->inWeight->image, x, y); 696 psImageSet (sfiles->recWeight->image, x, y, weightValue); 789 sfiles->recWeight->image->data.F32[y][x] = sfiles->inWeight->image->data.F32[y][x]; 697 790 } 698 791 // Assume that weight images are always a floating point type 699 psImageSet (sfiles->outWeight->image, x, y, NAN);792 sfiles->outWeight->image->data.F32[y][x] = NAN; 700 793 } 701 794 if (sfiles->outMask) { 702 795 if (sfiles->recMask) { 703 double maskValue = psImageGet (sfiles->inMask->image, x, y);704 psImageSet (sfiles->recMask->image, x, y, maskValue);705 } 706 psImageSet (sfiles->outMask->image, x, y, newMaskValue);707 } 708 } 709 710 static void711 exciseNon WarpedPixels(streakFiles *sfiles, double newMaskValue)796 sfiles->recMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 797 sfiles->inMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 798 } 799 sfiles->outMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= newMaskValue; 800 } 801 } 802 803 static long 804 exciseNonDiffedPixels(streakFiles *sfiles, psImageMaskType newMaskValue) 712 805 { 713 806 int cell_x0 = sfiles->astrom->cell_x0; … … 717 810 int numCols = sfiles->inImage->numCols; // for raw images this was calculated from the width of datasec 718 811 int numRows = sfiles->inImage->numRows; // for raw images this was calculated from the height of datasec 812 813 long excisedPixels = 0; 719 814 720 815 // printf("%2d x0: %4d y0: %4d xpar: %d ypar: %d\n", sfiles->extnum, cell_x0, cell_y0, xParity, yParity); … … 731 826 } 732 827 733 psU8 *pixels = sfiles-> warpedPixels->data.U8[yChip];828 psU8 *pixels = sfiles->diffedPixels->data.U8[yChip]; 734 829 735 830 if (xParity == 1) { … … 738 833 if (! *pixels ) { 739 834 excisePixel(sfiles, xCell, yCell, false, newMaskValue); 835 excisedPixels++; 740 836 } 741 837 } … … 747 843 if (!*pixels) { 748 844 excisePixel(sfiles, xCell, yCell, false, newMaskValue); 845 excisedPixels++; 749 846 } 750 847 } 751 848 } 752 849 } 850 return excisedPixels; 753 851 } 754 852 755 853 static bool 756 warpedPixel(streakFiles *sfiles, int x, int y)854 diffedPixel(streakFiles *sfiles, int x, int y) 757 855 { 758 856 PixelPos chipCoord; 759 857 760 858 if (!CHIP_LEVEL_INPUT(sfiles->stage)) { 761 // if we're here on a skycell image by definition this pixel was warped859 // if we're here on a skycell image by definition this pixel was diffed 762 860 return true; 763 861 } … … 772 870 cellToChipInt(&chipCoord.x, &chipCoord.y, sfiles->astrom, x, y); 773 871 774 if (chipCoord.x < 0 || chipCoord.x >= sfiles-> warpedPixels->numCols) {872 if (chipCoord.x < 0 || chipCoord.x >= sfiles->diffedPixels->numCols) { 775 873 return false; 776 874 } 777 if (chipCoord.y < 0 || chipCoord.y >= sfiles-> warpedPixels->numRows) {875 if (chipCoord.y < 0 || chipCoord.y >= sfiles->diffedPixels->numRows) { 778 876 return false; 779 877 } 780 878 781 return psImageGet(sfiles-> warpedPixels, chipCoord.x, chipCoord.y) ? true : false;879 return psImageGet(sfiles->diffedPixels, chipCoord.x, chipCoord.y) ? true : false; 782 880 } 783 881 … … 785 883 // streak mask 786 884 static void 787 censorSources(streakFiles *sfiles, ps U32maskStreak)885 censorSources(streakFiles *sfiles, psImageMaskType maskStreak) 788 886 { 789 887 if ((!sfiles->inSources) || (!sfiles->outMask)) { … … 799 897 sFile *out = sfiles->outSources; 800 898 801 in->header = psFitsReadHeader(NULL, in->fits); 802 if (!in->header) { 803 psError(PS_ERR_IO, false, "failed to read header from %s", in->resolved_name); 899 900 // Primary header, should be "something.hdr" 901 { 902 psMetadata *header = psFitsReadHeader(NULL, in->fits); 903 if (!header) { 904 psError(PS_ERR_IO, false, "failed to read header from %s", in->resolved_name); 905 streaksExit("", PS_EXIT_DATA_ERROR); 906 } 907 908 bool status; 909 psString extname = psMetadataLookupStr(&status, header, "EXTNAME"); 910 if (!extname) { 911 psError(PS_ERR_IO, false, "failed to find extname in header of %s", in->resolved_name); 912 streaksExit("", PS_EXIT_DATA_ERROR); 913 } 914 addDestreakKeyword(header); 915 916 if (!psFitsWriteBlank(out->fits, header, extname)) { 917 psError(PS_ERR_IO, false, "failed to write blank in header of %s", in->resolved_name); 918 streaksExit("", PS_EXIT_DATA_ERROR); 919 } 920 psFree(header); 921 } 922 923 // Extension with PSF fits, should be "something.psf" 924 { 925 if (!psFitsMoveExtNum(in->fits, 1, true)) { 926 psErrorStackPrint(stderr, "failed to read header from %s", in->resolved_name); 927 streaksExit("", PS_EXIT_DATA_ERROR); 928 } 929 930 psMetadata *header = psFitsReadHeader(NULL, in->fits); 931 if (!header) { 932 psErrorStackPrint(stderr, "failed to read header from %s", in->resolved_name); 933 streaksExit("", PS_EXIT_DATA_ERROR); 934 } 935 psString extname = psMetadataLookupStr(NULL, header, "EXTNAME"); 936 if (!extname) { 937 psError(PS_ERR_IO, false, "failed to find extname in header of %s", in->resolved_name); 938 streaksExit("", PS_EXIT_DATA_ERROR); 939 } 940 941 psArray *inTable = psFitsReadTable(in->fits); 942 if (!inTable->n) { 943 psErrorStackPrint(stderr, "table in %s is empty", in->resolved_name); 944 streaksExit("", PS_EXIT_DATA_ERROR); 945 } 946 947 psArray *outTable = psArrayAllocEmpty(inTable->n); 948 int j = 0; 949 int numCensored = 0; 950 for (int i = 0 ; i < inTable->n; i++) { 951 psMetadata *row = inTable->data[i]; 952 953 psF32 x = psMetadataLookupF32(NULL, row, "X_PSF"); 954 psF32 y = psMetadataLookupF32(NULL, row, "Y_PSF"); 955 956 psImageMaskType mask; 957 if ((x >= maskImage->numCols) || (y >= maskImage->numRows) || (x < 0) || (y < 0)) { 958 mask = maskStreak; 959 } else { 960 mask = maskImage->data.PS_TYPE_IMAGE_MASK_DATA[(int)y][(int)x]; 961 } 962 963 // Key the source if the center pixel is not masked with maskStreak 964 if (!(mask & maskStreak) ) { 965 psArraySet(outTable, j++, row); 966 } else { 967 numCensored++; 968 } 969 } 970 971 // get rid of unused elements (don't know if this is necessary) 972 psArrayRealloc(outTable, j); 973 974 addDestreakKeyword(header); 975 if (psArrayLength(outTable) > 0) { 976 printf("Censored %d sources\n", numCensored); 977 if (! psFitsWriteTable(out->fits, header, outTable, extname)) { 978 psErrorStackPrint(stderr, "failed to write table to %s", out->resolved_name); 979 streaksExit("", PS_EXIT_DATA_ERROR); 980 } 981 } else { 982 printf("Censored ALL %d sources\n", numCensored); 983 if (! psFitsWriteTableEmpty(out->fits, header, inTable->data[0], extname)) { 984 psErrorStackPrint(stderr, "failed to write empty table to %s", out->resolved_name); 985 streaksExit("", PS_EXIT_DATA_ERROR); 986 } 987 } 988 psFree(header); 989 psFree(outTable); 990 psFree(inTable); 991 } 992 993 // XXX Will need to update to handle extension with extended sources, etc. 994 995 if (!psFitsClose(out->fits)) { 996 psErrorStackPrint(stderr, "failed to close table %s", out->resolved_name); 804 997 streaksExit("", PS_EXIT_DATA_ERROR); 805 998 } 806 807 bool status; 808 psString extname = psMetadataLookupStr(&status, in->header, "EXTNAME"); 809 if (!extname) { 810 psError(PS_ERR_IO, false, "failed to find extname in header of %s", in->resolved_name); 811 streaksExit("", PS_EXIT_DATA_ERROR); 812 } 813 814 psArray *inTable = psFitsReadTable(in->fits); 815 if (!inTable->n) { 816 psError(PS_ERR_IO, false, "table in %s is empty", in->resolved_name); 817 streaksExit("", PS_EXIT_DATA_ERROR); 818 } 819 820 psArray *outTable = psArrayAllocEmpty(inTable->n); 821 int j = 0; 822 int numCensored = 0; 823 for (int i = 0 ; i < inTable->n; i++) { 824 psMetadata *row = inTable->data[i]; 825 826 psF32 x = psMetadataLookupF32 (&status, row, "X_PSF"); 827 psF32 y = psMetadataLookupF32 (&status, row, "Y_PSF"); 828 829 psU32 mask = psImageGet(maskImage, x, y); 830 831 // Key the source if the center pixel is not masked with maskStreak 832 if (! (mask & maskStreak) ) { 833 psArraySet(outTable, j++, row); 834 } else { 835 numCensored++; 836 } 837 } 838 839 // get rid of unused elements (don't know if this is necessary) 840 psArrayRealloc(outTable, j); 841 842 addDestreakKeyword(in->header); 843 if (psArrayLength(outTable) > 0) { 844 printf("Censored %d sources\n", numCensored); 845 if (! psFitsWriteTable(out->fits, in->header, outTable, extname)) { 846 psError(PS_ERR_IO, false, "failed to write table to %s", out->resolved_name); 847 streaksExit("", PS_EXIT_DATA_ERROR); 848 } 849 } else { 850 printf("Censored ALL %d sources\n", numCensored); 851 if (! psFitsWriteTableEmpty(out->fits, in->header, inTable->data[0], extname)) { 852 psError(PS_ERR_IO, false, "failed to write empty table to %s", out->resolved_name); 853 streaksExit("", PS_EXIT_DATA_ERROR); 854 } 855 } 856 857 if (!psFitsClose(out->fits)) { 858 psError(PS_ERR_IO, false, "failed to close table %s", out->resolved_name); 859 streaksExit("", PS_EXIT_DATA_ERROR); 860 } 861 } 999 }
Note:
See TracChangeset
for help on using the changeset viewer.
