Changeset 31158 for trunk/ppStack/src/ppStackConvolve.c
- Timestamp:
- Apr 4, 2011, 1:16:41 PM (15 years ago)
- Location:
- trunk/ppStack
- Files:
-
- 2 edited
-
. (modified) (2 props)
-
src/ppStackConvolve.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppStack
- Property svn:ignore
-
old new 17 17 autom4te.cache 18 18 Doxyfile 19 a.out.dSYM
-
- Property svn:mergeinfo deleted
- Property svn:ignore
-
trunk/ppStack/src/ppStackConvolve.c
r31054 r31158 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) … … 47 47 psVectorInit(renorms, NAN); 48 48 49 psVector *satValues = psVectorAllocEmpty(num, PS_TYPE_F32); // Renormalisation values for variances 50 49 51 psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging 50 52 psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging … … 70 72 psFree(cellList); 71 73 psFree(target); 74 psFree(renorms); 75 psFree(satValues); 72 76 return false; 73 77 } … … 87 91 psFree(cellList); 88 92 psFree(target); 93 psFree(renorms); 94 psFree(satValues); 89 95 return false; 90 96 } … … 106 112 psFree(cellList); 107 113 psFree(target); 114 psFree(renorms); 115 psFree(satValues); 108 116 return false; 109 117 // Non-fatal errors … … 120 128 psFree(cellList); 121 129 psFree(target); 130 psFree(renorms); 131 psFree(satValues); 122 132 return false; 123 133 } … … 166 176 psFree(rng); 167 177 psFree(target); 178 psFree(renorms); 179 psFree(satValues); 168 180 return false; 169 181 } … … 177 189 psFree(maskHeader); 178 190 psFree(target); 191 psFree(renorms); 192 psFree(satValues); 179 193 return false; 180 194 } … … 186 200 psFree(rng); 187 201 psFree(target); 202 psFree(renorms); 203 psFree(satValues); 188 204 return false; 189 205 } … … 221 237 if (options->matchZPs) { 222 238 // I think I need to take off the exposure time because we're going to set the new exposure time 239 // Clarification: the zero point (ZP) in the header should be set such that: 240 // M_app = m_inst + ZP + 2.5*log(exptime), where exptime in the output is sumExposure 223 241 psMetadataItem *zpItem = psMetadataLookup(inCell->parent->parent->concepts, "FPA.ZP"); 242 float inZP = zpItem->data.F32; 224 243 zpItem->data.F32 += options->norm->data.F32[i] + 2.5*log10(options->sumExposure); 225 244 … … 228 247 229 248 expItem = psMetadataLookup(inCell->concepts, "CELL.EXPOSURE"); 249 float inExptime = expItem->data.F32; 230 250 expItem->data.F32 = options->sumExposure; 251 252 // flux_out = flux_in * ten(-0.4*norm) -- save the individual saturation values 253 psMetadataItem *satItem = psMetadataLookup(inCell->concepts, "CELL.SATURATION"); 254 float inSat = satItem->data.F32; 255 satItem->data.F32 *= pow(10.0, -0.4*options->norm->data.F32[i]); 256 psVectorAppend (satValues, satItem->data.F32); 257 258 psLogMsg("ppStack", PS_LOG_INFO, "image %d mods : zp %f -> %f, exptime %f -> %f, sat %f -> %f", 259 i, inZP, zpItem->data.F32, inExptime, expItem->data.F32, inSat, satItem->data.F32); 231 260 } 232 261 … … 237 266 psFree(rng); 238 267 psFree(target); 268 psFree(renorms); 269 psFree(satValues); 239 270 return false; 240 271 } … … 257 288 psFree(fpaList); 258 289 psFree(cellList); 290 psFree(renorms); 291 psFree(satValues); 259 292 return true; 260 293 } … … 281 314 psFree(fpaList); 282 315 psFree(cellList); 283 284 UPDATE_CONCEPT(outFPA, "FPA.EXPOSURE", options->sumExposure); 285 UPDATE_CONCEPT(outCell, "CELL.EXPOSURE", options->sumExposure); 286 UPDATE_CONCEPT(outCell, "CELL.DARKTIME", NAN); 287 UPDATE_CONCEPT(outFPA, "FPA.ZP", options->zp); 288 289 UPDATE_CONCEPT(unconvFPA, "FPA.EXPOSURE", options->sumExposure); 290 UPDATE_CONCEPT(unconvCell, "CELL.EXPOSURE", options->sumExposure); 291 UPDATE_CONCEPT(unconvCell, "CELL.DARKTIME", NAN); 292 UPDATE_CONCEPT(unconvFPA, "FPA.ZP", options->zp); 316 317 // The best guess for an output saturation value depends on the recipe. If we have 318 // 'safe' on, the we require at least 2 pixels to generate a valid output pixel. In 319 // this case, the best value for CELL.SATURATION is the 2nd highest value in the list. 320 // If not, it should be the higest value in the list 321 bool mdok = false; 322 bool safe = psMetadataLookupBool(&mdok, recipe, "SAFE"); // Be safe when combining small numbers of pixels 323 psVectorSortInPlace(satValues); 324 float satBest = safe && satValues->n > 1 ? satValues->data.F32[1] : satValues->data.F32[0]; 325 326 // UPDATE CELL.SATURATION here 327 UPDATE_CONCEPT(outFPA, "FPA.EXPOSURE", options->sumExposure); 328 UPDATE_CONCEPT(outCell, "CELL.EXPOSURE", options->sumExposure); 329 UPDATE_CONCEPT(outCell, "CELL.DARKTIME", NAN); 330 UPDATE_CONCEPT(outCell, "CELL.SATURATION", satBest); 331 UPDATE_CONCEPT(outFPA, "FPA.ZP", options->zp); 332 UPDATE_CONCEPT(outFPA, "FPA.AIRMASS", options->airmass); 333 334 UPDATE_CONCEPT(unconvFPA, "FPA.EXPOSURE", options->sumExposure); 335 UPDATE_CONCEPT(unconvCell, "CELL.EXPOSURE", options->sumExposure); 336 UPDATE_CONCEPT(unconvCell, "CELL.DARKTIME", NAN); 337 UPDATE_CONCEPT(unconvCell, "CELL.SATURATION", satBest); 338 UPDATE_CONCEPT(unconvFPA, "FPA.ZP", options->zp); 339 UPDATE_CONCEPT(unconvFPA, "FPA.AIRMASS", options->airmass); 340 341 psLogMsg("ppStack", PS_LOG_INFO, "stack adjust metadata values : zp %f, exptime %f, sat %f", options->zp, options->sumExposure, satBest); 293 342 294 343 if (options->stats) { … … 297 346 double time = psTimeToMJD(fpaTime); 298 347 psMetadataAddF64(options->stats, PS_LIST_TAIL, "MJD_OBS", PS_META_DUPLICATE_OK, 299 "Average MJD_OBS of inputs", time); 300 301 } 302 } 303 348 "Average MJD_OBS of inputs", time); 349 350 } 351 } 352 353 // XXX EAM : this may be overly harsh -- or at least it would be if I (EAM) hadn't changed 354 // the values of matchChi2 I modified pmSubtraction.c to fit a 2nd order polynomial to the 355 // star chisq distribution (because of systematic errors in the model being matched). This 356 // fit forces the mean value to be 0.0. Perhaps we can / should exclude images which have 357 // an excessively high value for the rms? 304 358 305 359 // Reject images out-of-hand on the basis of their match chi^2 … … 316 370 psError(PPSTACK_ERR_PROG, false, "Unable to sort vector."); 317 371 psFree(values); 372 psFree(renorms); 373 psFree(satValues); 318 374 return false; 319 375 } … … 356 412 psErrorClear(); 357 413 psWarning("No good images survived convolution stage."); 414 psFree(renorms); 415 psFree(satValues); 358 416 return true; 359 417 } … … 366 424 } 367 425 psFree(renorms); 426 psFree(satValues); 368 427 369 428 if (options->stats) {
Note:
See TracChangeset
for help on using the changeset viewer.
