Changeset 13489 for trunk/ppStack/src/ppStackReadout.c
- Timestamp:
- May 23, 2007, 12:41:52 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/ppStack/src/ppStackReadout.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppStack/src/ppStackReadout.c
r13464 r13489 17 17 bool ppStackReadout(pmConfig *config, const pmFPAview *view) 18 18 { 19 // XXX Somehow need to add an HDU in to the output so that we can actually write it out! 19 // Get the recipe values 20 int iter = psMetadataLookupS32(NULL, config->arguments, "ITER"); // Rejection iterations 21 float combineRej = psMetadataLookupF32(NULL, config->arguments, "COMBINE.REJ"); // Combination threshold 22 float convolveRej = psMetadataLookupF32(NULL, config->arguments, "CONVOLVE.REJ"); // Convolution threshold 23 float extent = psMetadataLookupF32(NULL, config->arguments, "EXTENT"); // Extent of convolution 24 psMaskType maskBad = psMetadataLookupU8(NULL, config->arguments, "MASK.BAD"); // Value to mask 25 psMaskType maskBlank = psMetadataLookupU8(NULL, config->arguments, "MASK.BLANK"); // Mask for blank reg. 20 26 21 27 // Get the output target … … 31 37 "^PPSTACK.INPUT$"); // Iterator over input files 32 38 psMetadataItem *item; // Item from iteration 39 psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN); // Statistics 40 psRandom *rng = psRandomAlloc(0, PS_RANDOM_TAUS); // Random number generator 33 41 while ((item = psMetadataGetAndIncrement(inputIter))) { 34 42 assert(item->type == PS_DATA_UNKNOWN); 35 43 pmFPAfile *inputFile = item->data.V; // An input file 36 44 pmReadout *ro = pmFPAviewThisReadout(view, inputFile->fpa); // Corresponding readout 45 46 // Brain-dead background subtraction 47 if (!psImageBackground(stats, ro->image, ro->mask, maskBad, rng)) { 48 psError(PS_ERR_UNKNOWN, false, "Unable to get image background on image %ld", stack->n); 49 psFree(stats); 50 psFree(rng); 51 psFree(inputIter); 52 psFree(stack); 53 psFree(outRO); 54 return false; 55 } 56 (void)psBinaryOp(ro->image, ro->image, "-", psScalarAlloc(stats->robustMedian, PS_TYPE_F32)); 57 58 // Normalise each input by the exposure time 59 float exposure = psMetadataLookupF32(NULL, ro->parent->concepts, "CELL.EXPOSURE"); // Exposure time 60 if (!isfinite(exposure)) { 61 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 62 "CELL.EXPOSURE is not set for input file %ld", stack->n); 63 psFree(stats); 64 psFree(rng); 65 psFree(inputIter); 66 psFree(outRO); 67 psFree(stack); 68 return false; 69 } 70 (void)psBinaryOp(ro->image, ro->image, "/", psScalarAlloc(exposure, PS_TYPE_F32)); 37 71 pmStackData *data = pmStackDataAlloc(ro, SEEING, WEIGHT); // Data to stack 38 72 psArrayAdd(stack, ARRAY_BUFFER, data); 39 73 } 40 74 psFree(inputIter); 75 psFree(stats); 76 psFree(rng); 41 77 42 // Get the recipe values 43 int iter = psMetadataLookupS32(NULL, config->arguments, "ITER"); // Rejection iterations 44 float rej = psMetadataLookupF32(NULL, config->arguments, "REJ"); // Rejection threshold 45 float extent = psMetadataLookupF32(NULL, config->arguments, "EXTENT"); // Extent of convolution 46 psMaskType maskBad = psMetadataLookupU8(NULL, config->arguments, "MASK.BAD"); // Value to mask 47 psMaskType maskBlank = psMetadataLookupU8(NULL, config->arguments, "MASK.BLANK"); // Mask for blank reg. 48 49 if (!pmStackCombine(outRO, stack, maskBad, maskBlank, iter, rej)) { 78 if (!pmStackCombine(outRO, stack, maskBad, maskBlank, iter, combineRej)) { 50 79 psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts with rejection."); 51 80 psFree(stack); … … 54 83 } 55 84 56 if (!pmStackReject(stack, maskBad, extent, rej)) { 85 #if 1 86 { 87 psFits *fits = psFitsOpen("combined.fits", "w"); 88 psFitsWriteImage(fits, NULL, outRO->image, 0, NULL); 89 psFitsClose(fits); 90 } 91 92 for (int i = 0; i < num; i++) { 93 pmStackData *data = stack->data[i]; // Data for this image 94 psImage *inspected = psPixelsToMask(NULL, data->pixels, 95 psRegionSet(0, data->sky->image->numCols, 96 0, data->sky->image->numRows), 97 maskBlank); 98 psString name = NULL; // Name of image 99 psStringAppend(&name, "inspect%03d.fits", i); 100 psFits *fits = psFitsOpen(name, "w"); 101 psFree(name); 102 psFitsWriteImage(fits, NULL, inspected, 0, NULL); 103 psFitsClose(fits); 104 } 105 #endif 106 107 if (!pmStackReject(stack, maskBad, extent, convolveRej)) { 57 108 psError(PS_ERR_UNKNOWN, false, "Unable to reject input pixels."); 58 109 psFree(stack); … … 61 112 } 62 113 63 if (!pmStackCombine(outRO, stack, maskBad, maskBlank, 0, 0.0)) { 114 #if 1 115 for (int i = 0; i < num; i++) { 116 pmStackData *data = stack->data[i]; // Data for this image 117 psImage *rejected = psPixelsToMask(NULL, data->pixels, 118 psRegionSet(0, data->sky->image->numCols, 119 0, data->sky->image->numRows), 120 maskBlank); 121 psString name = NULL; // Name of image 122 psStringAppend(&name, "reject%03d.fits", i); 123 psFits *fits = psFitsOpen(name, "w"); 124 psFree(name); 125 psFitsWriteImage(fits, NULL, rejected, 0, NULL); 126 psFitsClose(fits); 127 } 128 #endif 129 130 if (!pmStackCombine(outRO, stack, maskBad, maskBlank, 0, combineRej)) { 64 131 psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts."); 65 132 psFree(stack); … … 68 135 } 69 136 137 outRO->data_exists = true; 138 outRO->parent->data_exists = true; 139 outRO->parent->parent->data_exists = true; 140 70 141 psFree(stack); 71 142 psFree(outRO); // Drop reference
Note:
See TracChangeset
for help on using the changeset viewer.
