Changeset 14626 for trunk/ppStack/src/ppStackReadout.c
- Timestamp:
- Aug 22, 2007, 4:47:19 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/ppStack/src/ppStackReadout.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppStack/src/ppStackReadout.c
r14520 r14626 15 15 { 16 16 // Get the recipe values 17 bool mdok; // Status of MD lookup18 17 int iter = psMetadataLookupS32(NULL, config->arguments, "ITER"); // Rejection iterations 19 18 float combineRej = psMetadataLookupF32(NULL, config->arguments, "COMBINE.REJ"); // Combination threshold 20 float convolveRej = psMetadataLookupF32(NULL, config->arguments, "CONVOLVE.REJ"); // Convolution threshold21 float extent = psMetadataLookupF32(NULL, config->arguments, "EXTENT"); // Extent of convolution22 19 psMaskType maskBad = psMetadataLookupU8(NULL, config->arguments, "MASK.BAD"); // Value to mask 23 20 psMaskType maskBlank = psMetadataLookupU8(NULL, config->arguments, "MASK.BLANK"); // Mask for blank reg. 24 psVector *seeing = psMetadataLookupPtr(&mdok, config->arguments, "SEEING"); // Seeing in each image21 float threshold = psMetadataLookupF32(NULL, config->arguments, "THRESHOLD.MASK"); // Threshold for mask deconvolution 25 22 26 23 // Get the output target … … 41 38 int fileNum = 0; // Number of file 42 39 float totExposure = 0.0; // Total exposure time 43 pmReadout *templateRO = NULL; // Template readout, for copy WCS44 40 psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging 45 41 psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging … … 53 49 54 50 bool mdok; // Status of MD lookup 55 float seeing = psMetadataLookupF32(&mdok, inputFile->fpa->analysis, "PPSTACK.SEEING"); // Seeing FWHM56 if (!mdok || !isfinite(seeing)) {57 psWarning("No SEEING supplied for image %d --- set to unity.", fileNum);58 seeing = 1.0;59 }60 51 float weighting = psMetadataLookupF32(&mdok, inputFile->fpa->analysis, 61 52 "PPSTACK.WEIGHTING"); // Relative weighting … … 69 60 scale = 1.0; 70 61 } 62 63 float exposure = psMetadataLookupF32(NULL, ro->parent->concepts, "CELL.EXPOSURE"); // Exposure time 64 #if 0 65 if (!isfinite(exposure)) { 66 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 67 "CELL.EXPOSURE is not set for input file %ld", stack->n); 68 psFree(stats); 69 psFree(rng); 70 psFree(fileIter); 71 psFree(fpaList); 72 psFree(cellList); 73 psFree(outRO); 74 psFree(stack); 75 return false; 76 } 77 #endif 78 totExposure += exposure; // Total exposure time 79 // Generate convolved version of input 80 pmReadout *convolved = pmReadoutAlloc(NULL); // Convolved version of input readout 81 if (!ppStackMatch(convolved, ro, config)) { 82 psError(PS_ERR_UNKNOWN, false, "Unable to match image %d.", fileNum); 83 psFree(stats); 84 psFree(rng); 85 psFree(fileIter); 86 psFree(fpaList); 87 psFree(cellList); 88 psFree(stack); 89 psFree(outRO); 90 psFree(convolved); 91 return false; 92 } 93 94 #ifdef REJECTION_FILES 95 { 96 psString name = NULL; // Name of image 97 psStringAppend(&name, "convolved%03d.fits", fileNum); 98 psFits *fits = psFitsOpen(name, "w"); 99 psFree(name); 100 psFitsWriteImage(fits, NULL, convolved->image, 0, NULL); 101 psFitsClose(fits); 102 } 103 #endif 104 105 106 #if 0 107 // Background subtraction, scaling and normalisation is performed automatically by the image matching 71 108 72 109 // Brain-dead background subtraction … … 80 117 psFree(stack); 81 118 psFree(outRO); 119 psFree(convolved); 82 120 return false; 83 121 } … … 99 137 psFree(cellList); 100 138 psFree(outRO); 139 psFree(convolved); 101 140 psFree(stack); 102 141 return false; 103 142 } 104 totExposure += exposure; // Total exposure time 143 105 144 (void)psBinaryOp(ro->image, ro->image, "/", psScalarAlloc(exposure, PS_TYPE_F32)); 106 145 if (ro->weight) { 107 146 (void)psBinaryOp(ro->weight, ro->weight, "/", psScalarAlloc(exposure, PS_TYPE_F32)); 108 147 } 109 pmStackData *data = pmStackDataAlloc(ro, seeing, weighting); // Data to stack 148 #endif 149 150 if (fileNum == 0) { 151 // Copy astrometry over 152 pmFPA *fpa = ro->parent->parent->parent; // Template FPA 153 pmHDU *hdu = fpa->hdu; // Template HDU 154 pmHDU *outHDU = outFPA->hdu; // Output HDU 155 if (!outHDU || !hdu) { 156 psWarning("Unable to find HDU at FPA level to copy astrometry."); 157 } else { 158 if (!pmAstromReadWCS(outFPA, outCell->parent, hdu->header, 1.0)) { 159 psError(PS_ERR_UNKNOWN, false, "Unable to read WCS astrometry from input FPA."); 160 psFree(stack); 161 psFree(outRO); 162 return false; 163 } 164 if (!outHDU->header) { 165 outHDU->header = psMetadataAlloc(); 166 } 167 if (!pmAstromWriteWCS(outHDU->header, outFPA, outCell->parent, WCS_TOLERANCE)) { 168 psError(PS_ERR_UNKNOWN, false, "Unable to write WCS astrometry to output FPA."); 169 psFree(stack); 170 psFree(outRO); 171 return false; 172 } 173 } 174 } 175 176 // Don't need the original any more! 177 psFree(ro); 178 179 // Ensure there is a mask, or pmStackCombine will complain 180 if (!convolved->mask) { 181 convolved->mask = psImageAlloc(convolved->image->numCols, convolved->image->numRows, 182 PS_TYPE_MASK); 183 psImageInit(convolved->mask, 0); 184 } 185 186 pmStackData *data = pmStackDataAlloc(convolved, weighting); // Data to stack 187 psFree(convolved); 110 188 psArrayAdd(stack, ARRAY_BUFFER, data); 111 189 psFree(data); // Drop reference 112 113 // Ensure there is a mask, or pmStackCombine will complain114 if (!ro->mask) {115 ro->mask = psImageAlloc(ro->image->numCols, ro->image->numRows, PS_TYPE_MASK);116 psImageInit(ro->mask, 0);117 }118 119 if (fileNum == 0) {120 templateRO = ro;121 }122 190 123 191 fileNum++; … … 159 227 #endif 160 228 161 // Only perform the additional rejection if we have seeing information 162 if (seeing && !pmStackReject(stack, maskBad, extent, convolveRej)) { 163 psError(PS_ERR_UNKNOWN, false, "Unable to reject input pixels."); 164 psFree(fpaList); 165 psFree(cellList); 166 psFree(stack); 167 psFree(outRO); 168 return false; 229 for (int i = 0; i < num; i++) { 230 pmStackData *data = stack->data[i]; // Data for this image 231 pmReadout *readout = data->readout; // Readout for this image 232 233 // Extract the regions and solutions used in the image matching 234 psArray *regions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of regions 235 { 236 psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD, 237 "^SUBTRACTION.REGION$"); // Iterator 238 psMetadataItem *item = NULL;// Item from iteration 239 while ((item = psMetadataGetAndIncrement(iter))) { 240 assert(item->type == PS_DATA_REGION); 241 regions = psArrayAdd(regions, ARRAY_BUFFER, item->data.V); 242 } 243 psFree(iter); 244 } 245 psArray *solutions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of solutions 246 { 247 psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD, 248 "^SUBTRACTION.SOLUTION$"); // Iterator 249 psMetadataItem *item = NULL;// Item from iteration 250 while ((item = psMetadataGetAndIncrement(iter))) { 251 assert(item->type == PS_DATA_VECTOR); 252 solutions = psArrayAdd(solutions, ARRAY_BUFFER, item->data.V); 253 } 254 psFree(iter); 255 } 256 assert(regions->n == solutions->n); 257 258 pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, readout->analysis, 259 "SUBTRACTION.KERNEL"); // Kernels 260 261 psPixels *reject = pmSubtractionDeconvolveMask(data->pixels, threshold, regions, 262 solutions, kernels); // List of pixels to reject 263 psFree(data->pixels); 264 data->pixels = reject; 169 265 } 170 266 … … 195 291 } 196 292 293 #if 0 197 294 // Restore image to counts using the total exposure time 198 295 (void)psBinaryOp(outRO->image, outRO->image, "*", psScalarAlloc(totExposure, PS_TYPE_F32)); … … 200 297 (void)psBinaryOp(outRO->weight, outRO->weight, "*", psScalarAlloc(totExposure, PS_TYPE_F32)); 201 298 } 299 #endif 202 300 psMetadataAddF32(outCell->concepts, PS_LIST_TAIL, "CELL.EXPOSURE", PS_META_REPLACE, 203 301 "Summed exposure time (sec)", totExposure); … … 215 313 psFree(cellList); 216 314 217 // Copy astrometry over218 pmFPA *templateFPA = templateRO->parent->parent->parent; // Template FPA219 pmHDU *templateHDU = templateFPA->hdu; // Template HDU220 pmHDU *outHDU = outFPA->hdu; // Output HDU221 if (!outHDU || !templateHDU) {222 psWarning("Unable to find HDU at FPA level to copy astrometry.");223 } else {224 if (!pmAstromReadWCS(outFPA, outCell->parent, templateHDU->header, 1.0)) {225 psError(PS_ERR_UNKNOWN, false, "Unable to read WCS astrometry from input FPA.");226 psFree(stack);227 psFree(outRO);228 return false;229 }230 if (!outHDU->header) {231 outHDU->header = psMetadataAlloc();232 }233 if (!pmAstromWriteWCS(outHDU->header, outFPA, outCell->parent, WCS_TOLERANCE)) {234 psError(PS_ERR_UNKNOWN, false, "Unable to write WCS astrometry to output FPA.");235 psFree(stack);236 psFree(outRO);237 return false;238 }239 }240 241 315 psFree(stack); 242 316 psFree(outRO); // Drop reference
Note:
See TracChangeset
for help on using the changeset viewer.
