IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 4, 2008, 3:24:47 PM (18 years ago)
Author:
eugene
Message:

adding threaded and unthreaded versions of the detrend application code; adding pmDetrendThreads functions for management

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/detrend/pmDark.c

    r18859 r18893  
    1111#include "pmFPAWrite.h"
    1212#include "pmReadoutStack.h"
     13#include "pmDetrendThreads.h"
    1314
    1415#include "pmDark.h"
     
    366367}
    367368
    368 bool pmDarkApply(pmReadout *readout, const pmCell *dark, psMaskType bad)
     369bool pmDarkApplyScan_Threaded (psThreadJob *job) {
     370    pmReadout *readout   = job->args->data[0];
     371    pmCell *dark         = job->args->data[1];
     372    psPolynomialMD *poly = job->args->data[2];
     373    psVector *values     = job->args->data[3];
     374
     375    psMaskType bad = PS_SCALAR_VALUE(job->args->data[4],U8);
     376    bool doNorm    = PS_SCALAR_VALUE(job->args->data[5],U8);
     377    float norm     = PS_SCALAR_VALUE(job->args->data[6],F32);
     378    int rowStart   = PS_SCALAR_VALUE(job->args->data[7],S32);
     379    int rowStop    = PS_SCALAR_VALUE(job->args->data[8],S32);
     380    bool status = pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop);
     381    return status;
     382}
     383
     384bool pmDarkApplyScan (pmReadout *readout, const pmCell *dark, psPolynomialMD *poly, psVector *values, psMaskType bad, bool doNorm, float norm, int rowStart, int rowStop) {
     385
     386    int numCols = readout->image->numCols;
     387    int numTerms = dark->readouts->n;   // Number of polynomial terms
     388
     389    // thread here by scan
     390    for (int y = rowStart; y < rowStop; y++) {
     391        for (int x = 0; x < numCols; x++) {
     392            for (int i = 0; i < numTerms; i++) {
     393                pmReadout *ro = dark->readouts->data[i]; // Dark readout
     394                poly->coeff->data.F64[i] = ro->image->data.F32[y][x];
     395            }
     396            float value = psPolynomialMDEval(poly, values); // Value of dark current
     397            if (doNorm) {
     398                value *= norm;
     399            }
     400            readout->image->data.F32[y][x] -= value;
     401            if (readout->mask && !isfinite(value)) {
     402                readout->mask->data.PS_TYPE_MASK_DATA[y][x] = bad;
     403            }
     404        }
     405    }
     406    return true;
     407}
     408
     409bool pmDarkApply(pmReadout *readout, pmCell *dark, psMaskType bad)
    369410{
    370411    PS_ASSERT_PTR_NON_NULL(readout, false);
     
    433474    psFree(orders);
    434475
    435     for (int y = 0; y < numRows; y++) {
    436         for (int x = 0; x < numCols; x++) {
    437             for (int i = 0; i < numTerms; i++) {
    438                 pmReadout *ro = dark->readouts->data[i]; // Dark readout
    439                 poly->coeff->data.F64[i] = ro->image->data.F32[y][x];
    440             }
    441             float value = psPolynomialMDEval(poly, values); // Value of dark current
    442             if (doNorm) {
    443                 value *= norm;
    444             }
    445             readout->image->data.F32[y][x] -= value;
    446             if (readout->mask && !isfinite(value)) {
    447                 readout->mask->data.PS_TYPE_MASK_DATA[y][x] = bad;
    448             }
    449         }
     476    // thread here by scan
     477
     478    bool threaded = true;
     479    int scanRows = pmDetrendGetScanRows();
     480    if (scanRows == 0) {
     481        threaded = false;
     482        scanRows = readout->image->numRows;
     483    }
     484
     485    for (int rowStart = 0; rowStart < readout->image->numRows; rowStart += scanRows) {
     486      int rowStop = PS_MIN (rowStart + scanRows, readout->image->numRows);
     487
     488# define PS_ARRAY_ADD_SCALAR(ARRAY, VALUE, TYPE) { \
     489      psScalar *scalar = psScalarAlloc(VALUE, TYPE); \
     490      psArrayAdd(ARRAY, 1, scalar); \
     491      psFree (scalar); }
     492     
     493      if (threaded) {
     494          // allocate a job, construct the arguments for this job
     495          psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_DARK");
     496          psArrayAdd (job->args, 1, readout);
     497          psArrayAdd (job->args, 1, dark);
     498          psArrayAdd (job->args, 1, poly);
     499          psArrayAdd (job->args, 1, values);
     500          PS_ARRAY_ADD_SCALAR (job->args, bad, PS_TYPE_MASK);
     501          PS_ARRAY_ADD_SCALAR (job->args, doNorm, PS_TYPE_U8);
     502          PS_ARRAY_ADD_SCALAR (job->args, norm, PS_TYPE_F32);
     503          PS_ARRAY_ADD_SCALAR (job->args, rowStart, PS_TYPE_S32);
     504          PS_ARRAY_ADD_SCALAR (job->args, rowStop, PS_TYPE_S32);
     505
     506          // ppImageDetrendReadout(config, options, view)
     507          if (!psThreadJobAddPending (job)) {
     508              return false;
     509          }
     510      } else {
     511          pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop);
     512      }
     513    }
     514
     515    if (threaded) {
     516        // wait here for the threaded jobs to finish
     517        if (!psThreadPoolWait ()) {
     518            psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image.");
     519            return false;
     520        }
     521        fprintf (stderr, "success for threaded jobs\n");
     522
     523        // free the done jobs
     524        psThreadJob *job = NULL;
     525        while ((job = psThreadJobGetDone()) != NULL) {
     526            psFree (job);
     527        }
    450528    }
    451529
Note: See TracChangeset for help on using the changeset viewer.