Changeset 27838 for branches/tap_branches/magic/remove/src/streaksremove.c
- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_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/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/magic
- Property svn:ignore
-
old new 1 1 magic 2 2 ssa-core-cpp 3 Makefile4 3 Makefile.bak
-
- Property svn:ignore
-
branches/tap_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/tap_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/tap_branches/magic/remove/src/streaksremove.c
r25434 r27838 12 12 static pmConfig *parseArguments(int argc, char **argv); 13 13 static bool readAndCopyToOutput(streakFiles *sf, bool exciseAll); 14 static void exciseNonWarpedPixels(streakFiles *sfiles, psImageMaskType newMaskValue);15 static bool warpedPixel(streakFiles *sfiles, int x, int y);14 static long exciseNonDiffedPixels(streakFiles *sfiles, psImageMaskType newMaskValue); 15 static bool diffedPixel(streakFiles *sfiles, int x, int y); 16 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 19 static void censorSources(streakFiles *sfiles, psImageMaskType maskStreak); 20 static long censorPixels(streakFiles *sfiles, psImage * pixels, bool checkNonWarpedPixels, psU16 maskStreak); 21 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. 22 28 int 23 29 main(int argc, char *argv[]) … … 26 32 27 33 psLibInit(NULL); 28 psTimerStart(" STREAKSREMOVE");34 psTimerStart("TOTAL_TIME"); 29 35 30 36 pmConfig *config = parseArguments(argc, argv); … … 33 39 streaksExit("", PS_EXIT_CONFIG_ERROR); 34 40 } 35 36 // Values to set for masked pixels37 psU32 maskStreak = 0; // for the image and weight (usually NAN, MAXINT for integer images)38 psU32 maskMask = 0; // value looked up for MASK.STREAK39 41 40 42 psString streaksFileName = psMetadataLookupStr(NULL, config->arguments, "STREAKS"); … … 50 52 streakFiles *sfiles = openFiles(config, true, argv[0]); 51 53 setupAstrometry(sfiles); 54 sfiles->stats = psMetadataAlloc(); 52 55 53 56 // Optionally we can set pixels that are masked to NAN since they couldn't have been … … 61 64 62 65 bool exciseAll = false; 63 // --keepnon warped is a test and debug mode64 bool keepNon WarpedPixels = psMetadataLookupBool(&status, config->arguments, "KEEP_NON_WARPED");65 66 // we need to check for non warped pixels unless we've been asked not to or the stage is diff67 // (By definition pixels in diff images were included in a diff)68 bool checkNon WarpedPixels = ! (keepNonWarpedPixels || (sfiles->stage == IPP_STAGE_DIFF) );69 70 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 ) { 71 74 // From magic ICD: 72 75 // In the raw and detrended images, the pixels which were not … … 76 79 // if no skycells are provided sfiles->exciseAll is set to true 77 80 78 psTimerStart("COMPUTE_ WARPED_PIXELS");79 if (! compute WarpedPixels(sfiles) ) {81 psTimerStart("COMPUTE_DIFFED_PIXELS"); 82 if (! computeDiffedPixels(sfiles) ) { 80 83 // we have no choice to excise all pixels 81 84 exciseAll = true; 82 85 } 83 psF64 cwp_t = psTimerClear("COMPUTE_WARPED_PIXELS"); 84 psLogMsg("streaksremove", PS_LOG_INFO, "time to compute warped pixels: %f\n", cwp_t); 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); 85 89 } 86 90 … … 100 104 long totalPixels = 0; 101 105 long totalStreakPixels = 0; 102 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; 103 115 // Iterate through each component of the input (except for raw images there is only one) 104 116 do { … … 118 130 119 131 // now that we've read the input files, lookup the mask values 120 if (maskStreak == 0) { 121 strkGetMaskValues(sfiles, &maskStreak, &maskMask); 122 } 132 strkGetMaskValues(sfiles); 123 133 124 134 totalPixels += sfiles->inImage->numRows * sfiles->inImage->numCols; … … 132 142 StreakPixels *pixels = streak_on_component(streaks, sfiles->astrom, sfiles->inImage->numCols, 133 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); 134 146 psLogMsg("streaksremove", PS_LOG_INFO, "time to get streak pixels: %f\n", psTimerClear("GET_STREAK_PIXELS")); 135 147 … … 137 149 // otherwise it contained an image cube (video cell) which is handled in the if block 138 150 if (sfiles->inImage->image) { 139 if (checkNon WarpedPixels) {140 psTimerStart("EXCISE_NON_ WARPED");141 142 // 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 143 155 // is excised as part of the destreaking process) 144 exciseNonWarpedPixels(sfiles, maskStreak); 145 146 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); 147 161 } 148 162 149 163 psTimerStart("REMOVE_STREAKS"); 150 164 151 totalStreakPixels += censorPixels(sfiles, pixels, checkNonWarpedPixels, maskStreak); 152 153 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); 154 170 155 171 if (nanForRelease) { 156 172 // set any pixels that were masked, to NAN (unless they are already NAN) 157 setMaskedToNAN(sfiles, maskMask, true);173 setMaskedToNAN(sfiles, sfiles->maskMask, true); 158 174 } 159 175 … … 170 186 // chip processed files with the data calcuated by psastro at the camera stage 171 187 // (actually we use a linear approximation) 188 psTimerStart("UPDATE_ASTROMETRY"); 172 189 updateAstrometry(sfiles); 173 } 174 175 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); 176 199 177 200 // write the destreaked "temporary" images and the recovery images 201 psTimerStart("WRITE_IMAGES"); 178 202 writeImages(sfiles, exciseImageCube); 179 203 wi_t += psTimerClear("WRITE_IMAGES"); 204 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "WRITE_IMAGES", PS_META_REPLACE, "", wi_t); 180 205 181 206 psLogMsg("streaksremove", PS_LOG_INFO, "time to process component %d: %f\n", sfiles->extnum, psTimerClear("PROCESS_COMPONENT")); 207 182 208 } while (streakFilesNextExtension(sfiles)); 183 209 … … 185 211 psFree(streaks); 186 212 187 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); 188 225 189 226 // check the weight and mask files for extra extensions that might be in files … … 194 231 195 232 psTimerStart("CLOSE_IMAGES"); 196 197 233 closeImages(sfiles); 198 199 psLogMsg("streaksremove", PS_LOG_INFO, "time to close images: %f\n", psTimerClear("CLOSE_IMAGES")); 200 201 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"); 202 241 if (!replicateOutputs(sfiles)) { 203 242 psErrorStackPrint(stderr, "failed to replicate output files"); … … 205 244 exit(PS_EXIT_UNKNOWN_ERROR); 206 245 } 246 psF64 ro_t = psTimerClear("REPLICATE_OUTPUTS"); 247 psMetadataAddF32(sfiles->stats, PS_LIST_TAIL, "REPLICATE_OUTPUTS", PS_META_REPLACE, "", ro_t); 248 #endif 207 249 208 250 // NOTE: from here on we can't just quit if something goes wrong. … … 214 256 // swap the instances for the input and output 215 257 // Note this is a nebulous database operation. No file I/O is performed 258 psTimerStart("SWAP_INSTANCES"); 216 259 if (!swapOutputsToInputs(sfiles)) { 217 // XXX: Now what?218 260 // It is up to the program that reverts failed destreak runs to insure that 219 // any input files that have been swapped are restored and that the de-streaked220 // 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. 221 263 222 264 psErrorStackPrint(stderr, "failed to swap files"); … … 224 266 // XXX: pick a specific error code for this failure 225 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; 226 288 } 227 289 } … … 234 296 streaksNebulousCleanup(); 235 297 pmConfigDone(); 236 psLogMsg("streaksremove", PS_LOG_INFO, "time to run streaksremove: %f\n", psTimerClear("STREAKSREMOVE"));237 298 psLibFinalize(); 238 299 … … 243 304 244 305 static long 245 censorPixels(streakFiles *sfiles, psImage *pixels, bool checkNon WarpedPixels, psU16 maskStreak)306 censorPixels(streakFiles *sfiles, psImage *pixels, bool checkNonDiffedPixels, psU16 maskStreak) 246 307 { 247 308 long streakPixels = 0; … … 250 311 for (int x = 0; x < sfiles->inImage->numCols; x++) { 251 312 if (psImageGet(pixels, x, y)) { 252 ++streakPixels;253 if (!checkNonWarpedPixels || warpedPixel(sfiles, x, y)) {313 if (!checkNonDiffedPixels || diffedPixel(sfiles, x, y)) { 314 ++streakPixels; 254 315 255 316 excisePixel(sfiles, x, y, true, maskStreak); … … 257 318 } else { 258 319 // This pixel was not included in any warp and has thus already excised 259 // by exciseNon WarpedPixels320 // by exciseNonDiffedPixels 260 321 } 261 322 } … … 274 335 fprintf(stderr, "\t-weight WEIGHT.fits: weight file to de-streak\n"); 275 336 fprintf(stderr, "\t-replace: replace the input images with the output\n"); 276 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"); 277 338 fprintf(stderr, "\t-transparent val: instead of setting excicsed pixel to NAN add val\n"); 278 339 fprintf(stderr, "\t-chip_mask MASK.fits: name of mask for chip stage (camera stage mask is passed tih -mask)\n"); … … 365 426 } 366 427 367 if ((argnum = psArgumentGet(argc, argv, "-keepnon warped"))) {368 psArgumentRemove(argnum, &argc, argv); 369 psMetadataAddBool(config->arguments, PS_LIST_TAIL, "KEEP_NON_ WARPED", 0,370 "skip excising of non warped pixels", true);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); 371 432 } 372 433 … … 378 439 psArgumentRemove(argnum, &argc, argv); 379 440 double transparentStreaks = atof(argv[argnum]); 380 psMetadataAddF 64(config->arguments, PS_LIST_TAIL, "TRANSPARENT_STREAKS", 0,441 psMetadataAddF32(config->arguments, PS_LIST_TAIL, "TRANSPARENT_STREAKS", 0, 381 442 "value to adjust excised pixels", transparentStreaks); 382 443 psArgumentRemove(argnum, &argc, argv); 383 444 } 384 445 385 // if skycells are not provided then we have to execise all pixels unless -keepnon warped446 // if skycells are not provided then we have to execise all pixels unless -keepnondiffed 386 447 pmConfigFileSetsMD(config->arguments, &argc, argv, "SKYCELLS", "-skycell", "-skycelllist"); 387 448 … … 449 510 } 450 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 451 519 if ((argnum = psArgumentGet(argc, argv, "-tmproot"))) { 452 520 psArgumentRemove(argnum, &argc, argv); … … 491 559 updateAstrometry(streakFiles *sf) 492 560 { 493 // XXX: why do I check this here? Shouldn't it be just around the call to linearizeTransforms?494 561 if (sf->bilevelAstrometry) { 495 496 562 if (!linearizeTransforms(sf->astrom)) { 497 // fit failed, leave the astrometryunchanged563 // fit failed, leave the transform in the file unchanged 498 564 return; 499 565 } 500 501 if (!pmAstromWriteWCS(sf->outImage->header, sf->inAstrom->fpa, sf->chip, 0.001)) { 502 psError(PS_ERR_UNKNOWN, false, "failed to update astrometry for extension %d", sf->extnum); 503 streaksExit("", PS_EXIT_UNKNOWN_ERROR); 504 } 505 if (sf->outMask) { 506 pmAstromWriteWCS(sf->outMask->header, sf->inAstrom->fpa, sf->chip, 0.001); 507 } 508 if (sf->outWeight) { 509 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; 510 585 } 511 586 } … … 516 591 readAndCopyToOutput(streakFiles *sf, bool exciseAll) 517 592 { 518 bool updateAstrometry = false;519 593 if (sf->inImage->pmfile) { 520 594 // image data from pmFPAfile (diff or warp file) … … 534 608 streaksExit("", PS_EXIT_UNKNOWN_ERROR); 535 609 } 536 // For the chip level files, copy the WCS from the astrometry file to the header537 // XXX: do we want to do this for raw images as well?538 if (sf->stage == IPP_STAGE_CHIP) {539 if (!sf->bilevelAstrometry) {540 updateAstrometry = true;541 if (!pmAstromWriteWCS(sf->inImage->header, sf->inAstrom->fpa, sf->chip, 0.001)) {542 psError(PS_ERR_UNKNOWN, false, "failed to update astrometry for extension %d", sf->extnum);543 streaksExit("", PS_EXIT_UNKNOWN_ERROR);544 }545 }546 }547 610 sf->outImage->header = psMemIncrRefCounter(sf->inImage->header); 548 611 if (sf->recImage) { … … 577 640 } 578 641 addDestreakKeyword(sf->outMask->header); 579 if (updateAstrometry) { 580 pmAstromWriteWCS(sf->outMask->header, sf->inAstrom->fpa, sf->chip, 0.001); 581 } 582 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 } 583 650 if (sf->outChMask) { 584 651 sf->outChMask->header = (psMetadata *) psMemIncrRefCounter(sf->outMask->header); … … 605 672 } 606 673 addDestreakKeyword(sf->outWeight->header); 607 if (updateAstrometry) {608 pmAstromWriteWCS(sf->inWeight->header, sf->inAstrom->fpa, sf->chip, 0.001);609 }610 674 setupImageRefs(sf->outWeight, sf->recWeight, sf->inWeight, sf->extnum, exciseAll); 611 675 … … 630 694 } else { 631 695 // we have an image cube 632 double initValue;633 696 if (exciseImageCube) { 634 697 // copy the entire input image to the recovery image 635 698 writeImageCube(sf->recImage, sf->inImage->imagecube, extname, sf->extnum); 636 initValue = NAN;637 699 } else { 638 700 // otherwise write it to the output 639 701 writeImageCube(sf->outImage, sf->inImage->imagecube, extname, sf->extnum); 640 initValue = 0; 641 } 642 643 // borrow one of the images from the imagecube and set it to init value 644 psImage *image = psArrayGet (sf->inImage->imagecube, 0); 645 psMemIncrRefCounter(image); 646 psImageInit(image, initValue); 702 } 703 704 // Now deal with the other output image 647 705 if (exciseImageCube) { 648 sf->outImage->image = image; 649 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); 650 714 } else { 651 // write zero valued image to reccovery652 715 if (sf->recImage) { 653 sf->recImage->image = image; 654 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); 655 723 } 656 724 } … … 683 751 } 684 752 685 float imageValue = sfiles->inImage->image->data.F32[y][x]; 686 if (sfiles->recImage && !isExciseValue(imageValue, sfiles->inImage->exciseValue) ) { 687 sfiles->recImage->image->data.F32[y][x] = imageValue; 688 } 689 690 if (sfiles->transparentStreaks == 0) { 691 sfiles->outImage->image->data.F32[y][x] = 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 } 692 769 } else { 693 if (streak) { 694 // as a visualization aid don't mask the pixel, just change the intensity 695 sfiles->outImage->image->data.F32[y][x] = 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; 696 777 } else { 697 sfiles->outImage->image->data.F32[y][x] = 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 } 698 784 } 699 785 } … … 711 797 sfiles->inMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 712 798 } 713 sfiles->outMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 714 sfiles->inMask->image->data.PS_TYPE_IMAGE_MASK_DATA[y][x] | newMaskValue; 715 } 716 } 717 718 static void 719 exciseNonWarpedPixels(streakFiles *sfiles, psImageMaskType newMaskValue) 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) 720 805 { 721 806 int cell_x0 = sfiles->astrom->cell_x0; … … 725 810 int numCols = sfiles->inImage->numCols; // for raw images this was calculated from the width of datasec 726 811 int numRows = sfiles->inImage->numRows; // for raw images this was calculated from the height of datasec 812 813 long excisedPixels = 0; 727 814 728 815 // printf("%2d x0: %4d y0: %4d xpar: %d ypar: %d\n", sfiles->extnum, cell_x0, cell_y0, xParity, yParity); … … 739 826 } 740 827 741 psU8 *pixels = sfiles-> warpedPixels->data.U8[yChip];828 psU8 *pixels = sfiles->diffedPixels->data.U8[yChip]; 742 829 743 830 if (xParity == 1) { … … 746 833 if (! *pixels ) { 747 834 excisePixel(sfiles, xCell, yCell, false, newMaskValue); 835 excisedPixels++; 748 836 } 749 837 } … … 755 843 if (!*pixels) { 756 844 excisePixel(sfiles, xCell, yCell, false, newMaskValue); 845 excisedPixels++; 757 846 } 758 847 } 759 848 } 760 849 } 850 return excisedPixels; 761 851 } 762 852 763 853 static bool 764 warpedPixel(streakFiles *sfiles, int x, int y)854 diffedPixel(streakFiles *sfiles, int x, int y) 765 855 { 766 856 PixelPos chipCoord; 767 857 768 858 if (!CHIP_LEVEL_INPUT(sfiles->stage)) { 769 // 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 770 860 return true; 771 861 } … … 780 870 cellToChipInt(&chipCoord.x, &chipCoord.y, sfiles->astrom, x, y); 781 871 782 if (chipCoord.x < 0 || chipCoord.x >= sfiles-> warpedPixels->numCols) {872 if (chipCoord.x < 0 || chipCoord.x >= sfiles->diffedPixels->numCols) { 783 873 return false; 784 874 } 785 if (chipCoord.y < 0 || chipCoord.y >= sfiles-> warpedPixels->numRows) {875 if (chipCoord.y < 0 || chipCoord.y >= sfiles->diffedPixels->numRows) { 786 876 return false; 787 877 } 788 878 789 return psImageGet(sfiles-> warpedPixels, chipCoord.x, chipCoord.y) ? true : false;879 return psImageGet(sfiles->diffedPixels, chipCoord.x, chipCoord.y) ? true : false; 790 880 } 791 881
Note:
See TracChangeset
for help on using the changeset viewer.
