- Timestamp:
- Mar 4, 2011, 1:28:01 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20110213/ppStack/src/ppStackConvolve.c
r30620 r30801 4 4 5 5 // Update the value of a concept 6 #define UPDATE_CONCEPT(SOURCE, NAME, VALUE) { \7 psMetadataItem *item = psMetadataLookup(SOURCE->concepts, NAME); \8 psAssert(item, "Concept should be present");\9 psAssert(item->type == PS_TYPE_F32, "Concept should be F32");\10 item->data.F32 = VALUE;\11 }6 #define UPDATE_CONCEPT(SOURCE, NAME, VALUE) { \ 7 psMetadataItem *item = psMetadataLookup(SOURCE->concepts, NAME); \ 8 psAssert(item, "Concept should be present"); \ 9 psAssert(item->type == PS_TYPE_F32, "Concept should be F32"); \ 10 item->data.F32 = VALUE; \ 11 } 12 12 13 13 bool ppStackConvolve(ppStackOptions *options, pmConfig *config) … … 45 45 psVectorInit(renorms, NAN); 46 46 47 psVector *satValues = psVectorAllocEmpty(num, PS_TYPE_F32); // Renormalisation values for variances 48 47 49 psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging 48 50 psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging … … 68 70 psFree(cellList); 69 71 psFree(target); 72 psFree(renorms); 73 psFree(satValues); 70 74 return false; 71 75 } … … 85 89 psFree(cellList); 86 90 psFree(target); 91 psFree(renorms); 92 psFree(satValues); 87 93 return false; 88 94 } … … 104 110 psFree(cellList); 105 111 psFree(target); 112 psFree(renorms); 113 psFree(satValues); 106 114 return false; 107 115 // Non-fatal errors … … 118 126 psFree(cellList); 119 127 psFree(target); 128 psFree(renorms); 129 psFree(satValues); 120 130 return false; 121 131 } … … 164 174 psFree(rng); 165 175 psFree(target); 176 psFree(renorms); 177 psFree(satValues); 166 178 return false; 167 179 } … … 175 187 psFree(maskHeader); 176 188 psFree(target); 189 psFree(renorms); 190 psFree(satValues); 177 191 return false; 178 192 } … … 184 198 psFree(rng); 185 199 psFree(target); 200 psFree(renorms); 201 psFree(satValues); 186 202 return false; 187 203 } … … 219 235 if (options->matchZPs) { 220 236 // I think I need to take off the exposure time because we're going to set the new exposure time 237 // Clarification: the zero point (ZP) in the header should be set such that: 238 // M_app = m_inst + ZP + 2.5*log(exptime), where exptime in the output is sumExposure 221 239 psMetadataItem *zpItem = psMetadataLookup(inCell->parent->parent->concepts, "FPA.ZP"); 222 240 zpItem->data.F32 += options->norm->data.F32[i] + 2.5*log10(options->sumExposure); … … 227 245 expItem = psMetadataLookup(inCell->concepts, "CELL.EXPOSURE"); 228 246 expItem->data.F32 = options->sumExposure; 247 248 // flux_out = flux_in * ten(-0.4*norm) -- save the individual saturation values 249 psMetadataItem *satItem = psMetadataLookup(inCell->concepts, "CELL.EXPOSURE"); 250 satItem->data.F32 *= pow(10.0, -0.4*options->norm->data.F32[i]); 251 psVectorAppend (satValues, satItem->data.F32); 229 252 } 230 253 … … 235 258 psFree(rng); 236 259 psFree(target); 260 psFree(renorms); 261 psFree(satValues); 237 262 return false; 238 263 } … … 255 280 psFree(fpaList); 256 281 psFree(cellList); 282 psFree(renorms); 283 psFree(satValues); 257 284 return true; 258 285 } … … 279 306 psFree(fpaList); 280 307 psFree(cellList); 281 308 309 // The best guess for an output saturation value depends on the recipe. If we have 310 // 'safe' on, the we require at least 2 pixels to generate a valid output pixel. In 311 // this case, the best value for CELL.SATURATION is the 2nd highest value in the list. 312 // If not, it should be the higest value in the list 313 bool safe = psMetadataLookupBool(&mdok, recipe, "SAFE"); // Be safe when combining small numbers of pixels 314 psVectorSortInPlace(satValues); 315 float satBest = safe && satValues->n > 1 ? satValues->data.F32[1] : satValues->data.F32[0]; 316 317 // UPDATE CELL.SATURATION here 282 318 UPDATE_CONCEPT(outFPA, "FPA.EXPOSURE", options->sumExposure); 283 319 UPDATE_CONCEPT(outCell, "CELL.EXPOSURE", options->sumExposure); 284 320 UPDATE_CONCEPT(outCell, "CELL.DARKTIME", NAN); 321 UPDATE_CONCEPT(outCell, "CELL.SATURATION", satBest); 285 322 UPDATE_CONCEPT(outFPA, "FPA.ZP", options->zp); 286 323 … … 288 325 UPDATE_CONCEPT(unconvCell, "CELL.EXPOSURE", options->sumExposure); 289 326 UPDATE_CONCEPT(unconvCell, "CELL.DARKTIME", NAN); 327 UPDATE_CONCEPT(unconvCell, "CELL.SATURATION", satBest); 290 328 UPDATE_CONCEPT(unconvFPA, "FPA.ZP", options->zp); 291 329 … … 295 333 double time = psTimeToMJD(fpaTime); 296 334 psMetadataAddF64(options->stats, PS_LIST_TAIL, "MJD_OBS", PS_META_DUPLICATE_OK, 297 "Average MJD_OBS of inputs", time); 298 299 } 300 } 301 335 "Average MJD_OBS of inputs", time); 336 337 } 338 } 339 340 // XXX EAM : this may be overly harsh -- or at least it would be if I (EAM) hadn't changed 341 // the values of matchChi2 I modified pmSubtraction.c to fit a 2nd order polynomial to the 342 // star chisq distribution (because of systematic errors in the model being matched). This 343 // fit forces the mean value to be 0.0. Perhaps we can / should exclude images which have 344 // an excessively high value for the rms? 302 345 303 346 // Reject images out-of-hand on the basis of their match chi^2 … … 314 357 psError(PPSTACK_ERR_PROG, false, "Unable to sort vector."); 315 358 psFree(values); 359 psFree(renorms); 360 psFree(satValues); 316 361 return false; 317 362 } … … 354 399 psErrorClear(); 355 400 psWarning("No good images survived convolution stage."); 401 psFree(renorms); 402 psFree(satValues); 356 403 return true; 357 404 } … … 364 411 } 365 412 psFree(renorms); 413 psFree(satValues); 366 414 367 415 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
