Changeset 41908
- Timestamp:
- Nov 8, 2021, 7:57:10 AM (5 years ago)
- Location:
- branches/eam_branches/ipp-20211108/ppStack
- Files:
-
- 15 edited
- 2 copied
-
. (modified) (1 prop)
-
src/Makefile.am (modified) (1 diff)
-
src/ppStack.h (modified) (1 diff)
-
src/ppStackCombineFinal.c (modified) (1 diff)
-
src/ppStackCombineInitial.c (modified) (1 diff)
-
src/ppStackCombinePercent.c (copied) (copied from branches/eam_branches/ppStack.20211015/src/ppStackCombinePercent.c )
-
src/ppStackCombinePrepare.c (modified) (4 diffs)
-
src/ppStackLoop.c (modified) (5 diffs)
-
src/ppStackLoop.h (modified) (3 diffs)
-
src/ppStackLoopByPercent.c (copied) (copied from branches/eam_branches/ppStack.20211015/src/ppStackLoopByPercent.c )
-
src/ppStackMatch.c (modified) (1 diff)
-
src/ppStackOptions.c (modified) (1 diff)
-
src/ppStackOptions.h (modified) (1 diff)
-
src/ppStackReadout.c (modified) (12 diffs)
-
src/ppStackSetup.c (modified) (1 diff)
-
src/ppStackThread.c (modified) (9 diffs)
-
src/ppStackThread.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20211108/ppStack
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/IPP-308_move_backups_folder/ppStack merged eligible /branches/czw_branch/20160809/ppStack merged eligible /branches/czw_branch/20170908/ppStack merged eligible /branches/eam_branches/ipp-20191011/ppStack merged eligible /branches/eam_branches/ipp-dev-20210817/ppStack merged eligible /branches/eam_branches/ppStack.20211015 merged eligible /tags/ipp-ps1-20210510/ppStack merged eligible /tags/ipp-ps1-20210708/ppStack merged eligible /branches/ipp-259_genericise_backups/ppStack 40910-40966
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/eam_branches/ipp-20211108/ppStack/src/Makefile.am
r38034 r41908 29 29 ppStackPrepare.c \ 30 30 ppStackConvolve.c \ 31 ppStackLoopByPercent.c \ 32 ppStackCombinePercent.c \ 31 33 ppStackCombinePrepare.c \ 32 34 ppStackCombineInitial.c \ -
branches/eam_branches/ipp-20211108/ppStack/src/ppStack.h
r36855 r41908 115 115 bool ppStackReadoutFinalThread(psThreadJob *job // Job to process 116 116 ); 117 118 // Thread entry point for ppStackReadoutPercent 119 bool ppStackReadoutPercentThread(psThreadJob *job); 120 121 bool ppStackReadoutPercent(const pmConfig *config, 122 pmReadout *outRO, 123 const psArray *readouts, 124 const psVector *mask, 125 const psVector *weightings, 126 const psVector *exposures, 127 const psVector *addVariance); 128 117 129 // Perform median stacking for background 118 130 bool ppStackCombineBackground(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config); -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackCombineFinal.c
r36855 r41908 2 2 3 3 // This is the doomsday switch. 4 // # define TESTING // Enable test output4 // # define TESTING // Enable test output 5 5 6 6 //MEH -- adhoc addition to blank mask border of final stack since rejection different/none on order of KERNEL.SIZE with overlap in CombineInitial -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackCombineInitial.c
r33093 r41908 9 9 psAssert(options, "Require options"); 10 10 psAssert(config, "Require configuration"); 11 12 /* if (!options->convolve) { */13 /* // No need to do initial combination when we haven't convolved */14 /* // XXX either allocate inspect and rejected here, or do not require them downstream */15 /* return true; */16 /* } */17 11 18 12 psTimerStart("PPSTACK_INITIAL"); -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackCombinePrepare.c
r34859 r41908 31 31 options->expRO = pmReadoutAlloc(expCell); //Output readout 32 32 } 33 /* else { */ 34 /* options->expRO = NULL; */ 35 /* } */ 33 36 34 int bkg_r0 = 0,bkg_c0 = 0; 37 35 int bkg_nC = 0,bkg_nR = 0; … … 53 51 54 52 options->bkgRO = pmReadoutAlloc(bkgCell); // BKG readout 55 // if (!pmHDUGenerateForFPA(options->bkgRO->parent->parent->parent)) {56 53 options->bkgRO->parent->parent->parent->hdu = pmHDUAlloc(NULL); 54 57 55 if (!options->bkgRO->parent->parent->parent->hdu) { 58 56 fprintf(stderr,"failed to generate a HDU for this thing.\n"); … … 68 66 ro->parent->parent->parent->concepts); 69 67 70 } 71 else { 68 } else { 72 69 options->bkgRO = NULL; 73 70 } … … 97 94 return false; 98 95 } 99 100 101 102 96 } 103 97 -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackLoop.c
r41529 r41908 31 31 ppStackMemDump("prepare"); 32 32 if (options->quality) return true; // Can't do anything else 33 34 // if we want to skip the rejection steps, and instead use a percentile clipping: 35 if (options->clipPercent) { 36 bool result = ppStackLoopByPercent (config, options); 37 return result; 38 } 33 39 34 40 // Convolve inputs … … 88 94 pmCellFreeData(options->cells->data[i]); 89 95 } 90 // MEH -- must uncomment back out -- unclear is should be moved after pixel rejection96 // MEH -- must uncomment back out -- unclear is should be moved after pixel rejection 91 97 psFree(stack); 92 98 … … 126 132 return false; 127 133 } 128 } 129 else { 134 } else { 130 135 // Since we haven't convolved, I believe we do need to normalize here. 131 //MEH -- see below for comment on ppStackCombineFinal and bscaleOffset 132 if (!ppStackCombineFinal(stack, options->convCovars, options, config, false, true, true, true)) { 136 // MEH -- see below for comment on ppStackCombineFinal and bscaleOffset 137 // last 4 parameters are: safe, normalize, grow, bscaleoffset 138 // EAM : looks like we do NOT need to normalize here eithr because ppStackConvolve is still called and 139 // the inputs are normalized 140 if (!ppStackCombineFinal(stack, options->convCovars, options, config, false, false, true, true)) { 133 141 psError(psErrorCodeLast(), false, "Unable to perform final combination."); 134 142 psFree(stack); … … 154 162 return false; 155 163 } 156 ppStackFileActivation(config,PPSTACK_FILES_BKG ,false); 164 ppStackFileActivation(config, PPSTACK_FILES_BKG, false); 165 157 166 // Photometry 158 167 psTrace("ppStack", 1, "Photometering stacked image....\n"); … … 184 193 return false; 185 194 } 186 // MEH -- also must uncomment back out..195 // MEH -- also must uncomment back out.. 187 196 psFree(stack); 188 197 psLogMsg("ppStack", PS_LOG_INFO, "Stage 7: Cleanup, WCS & JPEGS: %f sec", psTimerClear("PPSTACK_STEPS")); -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackLoop.h
r36855 r41908 7 7 ppStackOptions *options // Options for stacking 8 8 ); 9 9 10 // Median only loop. 10 11 bool ppStackMedianLoop( … … 12 13 ppStackOptions *options // Options for stacking 13 14 ); 15 16 // stack by percentile range 17 bool ppStackLoopByPercent( 18 pmConfig *config, 19 ppStackOptions *options 20 ); 14 21 15 22 // Setup … … 92 99 93 100 101 bool ppStackCombinePercent(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config); 102 94 103 bool ppStackUpdateHeader(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config); 95 104 bool ppStackJPEGs(ppStackThreadData *stack, ppStackOptions *options, pmConfig *config); -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackMatch.c
r36364 r41908 524 524 psFree(conv); 525 525 } else { 526 // this branch is done if options->convolve is FALSE 526 527 // Match the normalisation 527 528 float norm = powf(10.0, -0.4 * options->norm->data.F32[index]); // Normalisation -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackOptions.c
r36855 r41908 56 56 options->num = 0; 57 57 options->quality = 0; 58 59 options->clipPercent = false; 60 58 61 options->psf = NULL; 59 62 options->sumExposure = NAN; -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackOptions.h
r36855 r41908 16 16 int num; // Number of inputs 17 17 int quality; // Bad data quality flag 18 19 bool clipPercent; // use percentile range to clip? 20 18 21 // Prepare 19 22 pmPSF *psf; // Target PSF -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackReadout.c
r36886 r41908 19 19 weightings, exposures, addVariance); 20 20 thread->busy = false; 21 22 thread->status = job->results ? PPSTACK_THREAD_SUCCESS : PPSTACK_THREAD_FAILURE; 23 24 psAssert(job->results, "Stacking failed."); 21 25 22 26 return job->results ? true : false; … … 48 52 thread->busy = false; 49 53 54 thread->status = status ? PPSTACK_THREAD_SUCCESS : PPSTACK_THREAD_FAILURE; 55 50 56 psAssert(status, "Stacking failed."); 51 57 … … 53 59 } 54 60 61 bool ppStackReadoutPercentThread(psThreadJob *job) 62 { 63 PS_ASSERT_THREAD_JOB_NON_NULL(job, false); 64 65 psArray *args = job->args; // Arguments 66 ppStackThread *thread = args->data[0]; // Thread 67 ppStackOptions *options = args->data[1]; // Options 68 pmConfig *config = args->data[2]; // Configuration 69 70 pmReadout *outRO = options->outRO; // Output readout 71 psVector *mask = options->inputMask; // Mask for inputs 72 psVector *weightings = options->weightings; // Weightings (1/noise^2) for each image 73 psVector *exposures = options->exposures; // Exposure times for each image 74 psVector *addVariance = options->matchChi2; // Additional variance when rejecting 75 76 // fprintf (stderr, "start thread %d : scan range %d - %d\n", thread->entry, thread->firstScan, thread->lastScan); 77 78 bool status = ppStackReadoutPercent(config, outRO, thread->readouts, mask, weightings, exposures, addVariance); 79 80 thread->busy = false; 81 82 thread->status = status ? PPSTACK_THREAD_SUCCESS : PPSTACK_THREAD_FAILURE; 83 84 // fprintf (stderr, "finished thread %d, status %d : scan range %d - %d\n", thread->entry, thread->status, thread->firstScan, thread->lastScan); 85 86 psAssert(status, "Stacking failed."); 87 88 return status; 89 } 90 91 //////////////////////////////////// 55 92 56 93 bool ppStackInspect(psThreadJob *job) … … 145 182 146 183 int num = readouts->n; // Number of inputs 147 psArray *stack = psArrayAlloc(num); // Array for stacking184 psArray *stackData = psArrayAlloc(num); // Array of data to be stacked 148 185 149 186 for (int i = 0; i < num; i++) { … … 160 197 } 161 198 162 stack->data[i] = pmStackDataAlloc(ro, weightings->data.F32[i], exposures->data.F32[i], 199 // stackData is an array of pmStackData structures 200 stackData->data[i] = pmStackDataAlloc(ro, weightings->data.F32[i], exposures->data.F32[i], 163 201 addVariance->data.F32[i]); 164 202 } 165 203 166 if (!pmStackCombine(outRO, NULL, stack , maskBad, maskSuspect, maskBlank, kernelSize, iter,204 if (!pmStackCombine(outRO, NULL, stackData, maskBad, maskSuspect, maskBlank, kernelSize, iter, 167 205 combineRej, combineSys, combineDiscard, useVariance, safe, nminpix, false)) { 168 206 psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts with rejection."); 169 psFree(stack); 207 psFree(stackData); 208 209 // XXX EAM : if pmStackCombine fails above this return will cause the thread to block. 210 // The failure status results in a psThread.fault. the psThreadLauncher function, which 211 // each background thread runs as a loop, will sleep until the fault is cleared externally 212 // by the handler. psThreadPoolWait() catches, counts, and clears these faults, but 213 // ppStackThreadRead does not. 170 214 return false; 171 215 } … … 175 219 psArray *reject = psArrayAlloc(num); // List of pixels rejected 176 220 for (int i = 0; i < num; i++) { 177 pmStackData *data = stack ->data[i]; // Data for this image221 pmStackData *data = stackData->data[i]; // Data for this image 178 222 if (!data) { 179 223 continue; … … 186 230 reject->data[i] = psMemIncrRefCounter(data->reject); 187 231 } 188 psFree(stack );232 psFree(stackData); 189 233 190 234 //MEH change to trace … … 247 291 248 292 int num = readouts->n; // Number of inputs 249 psArray *stack = psArrayAlloc(num); // Array for stacking293 psArray *stackData = psArrayAlloc(num); // Array of data to be stacked 250 294 251 295 // We have rejection from a previous combination: combine without flagging pixels to inspect … … 272 316 addVariance ? addVariance->data.F32[i] : NAN); 273 317 data->reject = rejected ? psMemIncrRefCounter(rejected->data[i]) : NULL; 274 stack ->data[i] = data;318 stackData->data[i] = data; 275 319 276 320 //MEH -- apply bscale offset before norm … … 288 332 } 289 333 290 if (!pmStackCombine(outRO, expRO, stack , maskBad, maskSuspect, maskBlank, 0, iter, combineRej,334 if (!pmStackCombine(outRO, expRO, stackData, maskBad, maskSuspect, maskBlank, 0, iter, combineRej, 291 335 combineSys, combineDiscard, useVariance, safe, nminpix, rejected)) { 292 336 psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts."); 293 psFree(stack );337 psFree(stackData); 294 338 return false; 295 339 } … … 307 351 expChip->data_exists = true; 308 352 309 psFree(stack );353 psFree(stackData); 310 354 311 355 //MEH change to trace … … 316 360 return true; 317 361 } 362 363 bool ppStackReadoutPercent(const pmConfig *config, pmReadout *outRO, const psArray *readouts, 364 const psVector *mask, const psVector *weightings, const psVector *exposures, 365 const psVector *addVariance) 366 { 367 assert(config); 368 assert(outRO); 369 assert(readouts); 370 assert(mask && mask->n == readouts->n && mask->type.type == PS_TYPE_VECTOR_MASK); 371 assert(weightings && weightings->n == readouts->n && weightings->type.type == PS_TYPE_F32); 372 assert(addVariance && addVariance->n == readouts->n && addVariance->type.type == PS_TYPE_F32); 373 static int sectionNum = 0; // Section number; for debugging outputs 374 375 // fprintf (stderr, "starting ReadoutPercent, %d\n", sectionNum); 376 377 // Get the recipe values 378 psMetadata *recipe = psMetadataLookupMetadata(NULL, config->recipes, PPSTACK_RECIPE); // ppStack recipe 379 psAssert(recipe, "We've thrown an error on this before."); 380 381 bool mdok; // Status of MD lookup 382 psF64 minRange = psMetadataLookupF32(&mdok, recipe, "COMBINE.MIN.RANGE"); // Combination threshold 383 384 char defaultBlankStr[16] = "BLANK"; 385 386 psString maskBadStr = psMetadataLookupStr(&mdok, recipe, "MASK.VAL"); // Name of bits to mask for bad 387 psString maskSuspectStr = psMetadataLookupStr(&mdok, recipe, "MASK.SUSPECT"); // Name of suspect mask bits 388 psString maskBlankStr = psMetadataLookupStr(&mdok, recipe, "MASK.BLANK"); // Name of bits to set for empty pixels 389 if (!maskBlankStr) { 390 maskBlankStr = psMetadataLookupStr(&mdok, recipe, "MASK.BAD"); // Old name for MASK.BLANK 391 } 392 if (!maskBlankStr) { 393 maskBlankStr = defaultBlankStr; // this is statically allocated above 394 } 395 396 psImageMaskType maskBad = pmConfigMaskGet(maskBadStr, config); // Bits to mask for bad pixels 397 psImageMaskType maskSuspect = pmConfigMaskGet(maskSuspectStr, config); // Suspect bits 398 psImageMaskType maskBlank = pmConfigMaskGet(maskBlankStr, config); // Bits to mask for bad pixels 399 400 int num = readouts->n; // Number of inputs 401 psArray *stackData = psArrayAlloc(num); // Array of data to be stacked 402 403 for (int i = 0; i < num; i++) { 404 pmReadout *ro = readouts->data[i]; 405 if (!ro || mask->data.PS_TYPE_VECTOR_MASK_DATA[i]) { 406 // Bad image 407 continue; 408 } 409 410 // Ensure there is a mask, or pmStackCombine will complain 411 if (!ro->mask) { 412 ro->mask = psImageAlloc(ro->image->numCols, ro->image->numRows, PS_TYPE_IMAGE_MASK); 413 psImageInit(ro->mask, 0); 414 } 415 416 stackData->data[i] = pmStackDataAlloc(ro, weightings->data.F32[i], exposures->data.F32[i], 417 addVariance->data.F32[i]); 418 } 419 420 // XXX rename minRange to rejectFraction 421 // XXX add expmaps 422 if (!pmStackCombineByPercentile(outRO, NULL, stackData, minRange, maskBad, maskSuspect, maskBlank)) { 423 psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts with rejection."); 424 psFree(stackData); 425 return false; 426 } 427 428 outRO->data_exists = true; // output readout 429 outRO->parent->data_exists = true; // output cell 430 outRO->parent->parent->data_exists = true; // output chip 431 432 # if 0 433 pmCell *expCell = expRO->parent; // Exposure cell 434 pmChip *expChip = expCell->parent; // Exposure chip 435 expRO->data_exists = true; 436 expCell->data_exists = true; 437 expChip->data_exists = true; 438 # endif 439 440 psFree(stackData); 441 sectionNum++; 442 443 return true; 444 } 445 446 -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackSetup.c
r35167 r41908 18 18 options->convolve = psMetadataLookupBool(NULL, recipe, "CONVOLVE"); // Convolve images? 19 19 options->doBackground = psMetadataLookupBool(NULL, recipe, "BACKGROUND.MODEL"); 20 21 options->clipPercent = psMetadataLookupBool(NULL, recipe, "COMBINE.PERCENT"); // use percentile range to clip? 20 22 21 23 if (!psMetadataLookupBool(NULL, config->arguments, "HAVE.PSF")) { -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackThread.c
r36855 r41908 19 19 thread->firstScan = 0; 20 20 thread->lastScan = 0; 21 thread->entry = -1; // this gets assigned after allocation 22 thread->status = PPSTACK_THREAD_NEW; 21 23 return thread; 22 24 } … … 124 126 readouts->data[j] = ro; 125 127 } 126 threads->data[i] = ppStackThreadAlloc(readouts); 128 ppStackThread *thread = ppStackThreadAlloc(readouts); 129 thread->entry = i; 130 threads->data[i] = thread; 127 131 psFree(readouts); // Drop reference 128 132 } … … 157 161 while (true) { 158 162 // check for any groups which can read data 163 // NOTE: threads->n is set (in ppStackThreadDataSetup) to be 1 more than the argument to -threads 159 164 for (int j = 0; j < threads->n; j++) { 160 165 ppStackThread *thread = threads->data[j]; 166 // fprintf (stderr, "grab thread %d, scan: %d - %d : busy: %d read: %d status: %d\n", thread->entry, thread->firstScan, thread->lastScan, thread->busy, thread->read, thread->status); 161 167 if (thread->read) { 162 168 continue; … … 166 172 thread->lastScan = stack->lastScan + rows; 167 173 stack->lastScan = thread->lastScan; 174 thread->status = PPSTACK_THREAD_READ; 168 175 169 176 psArray *readouts = thread->readouts; … … 172 179 173 180 psTrace("ppStack", 2, "Reading data for chunk %d into group %d....\n", numChunk, j); 181 // fprintf (stderr, "Reading data for chunk %d into group %d (thread %d, scan: %d - %d)....\n", numChunk, j, thread->entry, thread->firstScan, thread->lastScan); 174 182 for (int i = 0; i < readouts->n; i++) { 175 183 pmReadout *ro = readouts->data[i]; // Input readout … … 177 185 continue; 178 186 } 187 188 // fprintf (stderr, "read data for readout %d\n", i); 179 189 180 190 // override the recorded last scan … … 232 242 233 243 thread->read = thread->busy = true; 244 thread->status = PPSTACK_THREAD_RUN; 234 245 return thread; 235 246 } … … 239 250 for (int j = 0; j < threads->n; j++) { 240 251 ppStackThread *thread = threads->data[j]; 252 // fprintf (stderr, "test thread %d, scan: %d - %d : busy: %d, read: %d, status: %d\n", thread->entry, thread->firstScan, thread->lastScan, thread->busy, thread->read, thread->status); 253 241 254 if (thread->busy) { 242 255 continue; 243 256 } 257 thread->status = PPSTACK_THREAD_NEW; 244 258 thread->read = false; 245 259 wait = false; … … 283 297 } 284 298 299 { 300 psThreadTask *task = psThreadTaskAlloc("PPSTACK_PERCENT_COMBINE", 3); 301 task->function = &ppStackReadoutPercentThread; 302 psThreadTaskAdd(task); 303 psFree(task); 304 } 285 305 return; 286 306 } -
branches/eam_branches/ipp-20211108/ppStack/src/ppStackThread.h
r34800 r41908 11 11 int firstScan; // First row of the chunk to be read for this group 12 12 int lastScan; // Last row of the chunk to be read for this group 13 int entry; // thread number for tracking progress 14 int status; // thread number for tracking progress 13 15 } ppStackThread; 14 16 … … 47 49 48 50 51 enum {PPSTACK_THREAD_NEW, PPSTACK_THREAD_READ, PPSTACK_THREAD_RUN, PPSTACK_THREAD_SUCCESS, PPSTACK_THREAD_FAILURE}; 52 53 49 54 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
