IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 8, 2008, 6:10:14 PM (18 years ago)
Author:
Paul Price
Message:

Discovered a problem with threaded implementation of pmDarkApply --- the polynomial is altered within pmDarkApplyScan, so it should not be global across threads. Checked and cleaned up the other threaded detrending functions.

File:
1 edited

Legend:

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

    r19299 r19432  
    1717    PS_ASSERT_THREAD_JOB_NON_NULL(job, false);
    1818
    19     psImage *inImage   = job->args->data[0];
    20     psImage *inMask    = job->args->data[1];
    21     psImage *flatImage = job->args->data[2];
    22     psImage *flatMask  = job->args->data[3];
     19    psImage *inImage   = job->args->data[0]; // Input image
     20    psImage *inMask    = job->args->data[1]; // Input mask
     21    const psImage *flatImage = job->args->data[2]; // Flat-field image
     22    const psImage *flatMask  = job->args->data[3]; // Flat-field mask
    2323
    2424    psMaskType badFlat = PS_SCALAR_VALUE(job->args->data[4],U8);
     
    2727    int rowStart       = PS_SCALAR_VALUE(job->args->data[7],S32);
    2828    int rowStop        = PS_SCALAR_VALUE(job->args->data[8],S32);
    29     bool status = pmFlatFieldScan (inImage, inMask, flatImage, flatMask, badFlat, xOffset, yOffset, rowStart, rowStop);
    30     return status;
     29    return pmFlatFieldScan(inImage, inMask, flatImage, flatMask, badFlat,
     30                           xOffset, yOffset, rowStart, rowStop);
    3131}
    3232
     
    5050    break;
    5151
    52 bool pmFlatFieldScan (psImage *inImage, psImage *inMask, psImage *flatImage, psImage *flatMask, psMaskType badFlat, int xOffset, int yOffset, int rowStart, int rowStop) {
    53 
     52bool pmFlatFieldScan(psImage *inImage, psImage *inMask, const psImage *flatImage, const psImage *flatMask,
     53                     psMaskType badFlat, int xOffset, int yOffset, int rowStart, int rowStop)
     54{
    5455    switch (inImage->type.type) {
    5556        FLAT_DIVISION_CASE(U8,  0);
     
    138139
    139140    for (int rowStart = 0; rowStart < inImage->numRows; rowStart += scanRows) {
    140       int rowStop = PS_MIN (rowStart + scanRows, inImage->numRows);
     141      int rowStop = PS_MIN(rowStart + scanRows, inImage->numRows);
    141142
    142143      if (threaded) {
    143144          // allocate a job, construct the arguments for this job
    144           psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_FLAT");
    145           psArrayAdd (job->args, 1, inImage);
    146           psArrayAdd (job->args, 1, inMask);
    147           psArrayAdd (job->args, 1, flatImage);
    148           psArrayAdd (job->args, 1, flatMask);
    149           PS_ARRAY_ADD_SCALAR (job->args, badFlat, PS_TYPE_U8);
    150           PS_ARRAY_ADD_SCALAR (job->args, xOffset, PS_TYPE_S32);
    151           PS_ARRAY_ADD_SCALAR (job->args, yOffset, PS_TYPE_S32);
    152           PS_ARRAY_ADD_SCALAR (job->args, rowStart, PS_TYPE_S32);
    153           PS_ARRAY_ADD_SCALAR (job->args, rowStop, PS_TYPE_S32);
     145          psThreadJob *job = psThreadJobAlloc("PSMODULES_DETREND_FLAT");
     146          psArrayAdd(job->args, 1, inImage);
     147          psArrayAdd(job->args, 1, inMask);
     148          psArrayAdd(job->args, 1, flatImage);
     149          psArrayAdd(job->args, 1, flatMask);
     150          PS_ARRAY_ADD_SCALAR(job->args, badFlat, PS_TYPE_U8);
     151          PS_ARRAY_ADD_SCALAR(job->args, xOffset, PS_TYPE_S32);
     152          PS_ARRAY_ADD_SCALAR(job->args, yOffset, PS_TYPE_S32);
     153          PS_ARRAY_ADD_SCALAR(job->args, rowStart, PS_TYPE_S32);
     154          PS_ARRAY_ADD_SCALAR(job->args, rowStop, PS_TYPE_S32);
    154155
    155           // ppImageDetrendReadout(config, options, view)
    156           if (!psThreadJobAddPending (job)) {
     156          if (!psThreadJobAddPending(job)) {
    157157              psFree(job);
    158158              return false;
    159159          }
    160160          psFree(job);
    161       } else {
    162           pmFlatFieldScan (inImage, inMask, flatImage, flatMask, badFlat, xOffset, yOffset, rowStart, rowStop);
     161      } else if (!pmFlatFieldScan(inImage, inMask, flatImage, flatMask, badFlat,
     162                                  xOffset, yOffset, rowStart, rowStop)) {
     163          psError(PS_ERR_UNKNOWN, false, "Unable to flat-field image.");
     164          return false;
    163165      }
    164166    }
     
    166168    if (threaded) {
    167169        // wait here for the threaded jobs to finish
    168         if (!psThreadPoolWait(false)) {
    169             psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image.");
     170        if (!psThreadPoolWait(true)) {
     171            psError(PS_ERR_UNKNOWN, false, "Unable to flat-field image.");
    170172            return false;
    171         }
    172         fprintf (stderr, "success for threaded jobs\n");
    173 
    174         // free done jobs
    175         psThreadJob *job = NULL;
    176         while ((job = psThreadJobGetDone()) != NULL) {
    177             psFree (job);
    178173        }
    179174    }
     
    187182    psFree(timeString);
    188183
    189 
    190184    return true;
    191185}
Note: See TracChangeset for help on using the changeset viewer.