IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 8, 2021, 7:57:10 AM (5 years ago)
Author:
eugene
Message:

merge changes from ppStack.20211015: adding stack-by-percent, some code cleanups (remove commented out blocks), fix thread failure error

Location:
branches/eam_branches/ipp-20211108/ppStack
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20211108/ppStack

  • branches/eam_branches/ipp-20211108/ppStack/src/ppStackReadout.c

    r36886 r41908  
    1919                                         weightings, exposures, addVariance);
    2020    thread->busy = false;
     21
     22    thread->status = job->results ? PPSTACK_THREAD_SUCCESS : PPSTACK_THREAD_FAILURE;
     23
     24    psAssert(job->results, "Stacking failed.");
    2125
    2226    return job->results ? true : false;
     
    4852    thread->busy = false;
    4953
     54    thread->status = status ? PPSTACK_THREAD_SUCCESS : PPSTACK_THREAD_FAILURE;
     55
    5056    psAssert(status, "Stacking failed.");
    5157
     
    5359}
    5460
     61bool 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////////////////////////////////////
    5592
    5693bool ppStackInspect(psThreadJob *job)
     
    145182
    146183    int num = readouts->n;              // Number of inputs
    147     psArray *stack = psArrayAlloc(num); // Array for stacking
     184    psArray *stackData = psArrayAlloc(num); // Array of data to be stacked
    148185
    149186    for (int i = 0; i < num; i++) {
     
    160197        }
    161198
    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],
    163201                                          addVariance->data.F32[i]);
    164202    }
    165203
    166     if (!pmStackCombine(outRO, NULL, stack, maskBad, maskSuspect, maskBlank, kernelSize, iter,
     204    if (!pmStackCombine(outRO, NULL, stackData, maskBad, maskSuspect, maskBlank, kernelSize, iter,
    167205                        combineRej, combineSys, combineDiscard, useVariance, safe, nminpix, false)) {
    168206        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. 
    170214        return false;
    171215    }
     
    175219    psArray *reject = psArrayAlloc(num);  // List of pixels rejected
    176220    for (int i = 0; i < num; i++) {
    177         pmStackData *data = stack->data[i]; // Data for this image
     221        pmStackData *data = stackData->data[i]; // Data for this image
    178222        if (!data) {
    179223            continue;
     
    186230        reject->data[i] = psMemIncrRefCounter(data->reject);
    187231    }
    188     psFree(stack);
     232    psFree(stackData);
    189233
    190234    //MEH change to trace
     
    247291
    248292    int num = readouts->n;              // Number of inputs
    249     psArray *stack = psArrayAlloc(num); // Array for stacking
     293    psArray *stackData = psArrayAlloc(num); // Array of data to be stacked
    250294
    251295    // We have rejection from a previous combination: combine without flagging pixels to inspect
     
    272316                                             addVariance ? addVariance->data.F32[i] : NAN);
    273317        data->reject = rejected ? psMemIncrRefCounter(rejected->data[i]) : NULL;
    274         stack->data[i] = data;
     318        stackData->data[i] = data;
    275319
    276320        //MEH -- apply bscale offset before norm   
     
    288332    }
    289333
    290     if (!pmStackCombine(outRO, expRO, stack, maskBad, maskSuspect, maskBlank, 0, iter, combineRej,
     334    if (!pmStackCombine(outRO, expRO, stackData, maskBad, maskSuspect, maskBlank, 0, iter, combineRej,
    291335                        combineSys, combineDiscard, useVariance, safe, nminpix, rejected)) {
    292336        psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts.");
    293         psFree(stack);
     337        psFree(stackData);
    294338        return false;
    295339    }
     
    307351    expChip->data_exists = true;
    308352
    309     psFree(stack);
     353    psFree(stackData);
    310354
    311355    //MEH change to trace
     
    316360    return true;
    317361}
     362
     363bool 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
Note: See TracChangeset for help on using the changeset viewer.