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/pmFlatField.c

    r15673 r18893  
    1111#include "pmFPAMaskWeight.h"
    1212#include "pmFlatField.h"
     13#include "pmDetrendThreads.h"
     14
     15bool pmFlatFieldScan_Threaded (psThreadJob *job) {
     16    psImage *inImage   = job->args->data[0];
     17    psImage *inMask    = job->args->data[1];
     18    psImage *flatImage = job->args->data[2];
     19    psImage *flatMask  = job->args->data[3];
     20
     21    psMaskType badFlat = PS_SCALAR_VALUE(job->args->data[4],U8);
     22    int xOffset        = PS_SCALAR_VALUE(job->args->data[5],S32);
     23    int yOffset        = PS_SCALAR_VALUE(job->args->data[6],S32);
     24    int rowStart       = PS_SCALAR_VALUE(job->args->data[7],S32);
     25    int rowStop        = PS_SCALAR_VALUE(job->args->data[8],S32);
     26    bool status = pmFlatFieldScan (inImage, inMask, flatImage, flatMask, badFlat, xOffset, yOffset, rowStart, rowStop);
     27    return status;
     28}
     29
     30// Macro for all PS types
     31#define FLAT_DIVISION_CASE(TYPE, SPECIAL)       \
     32    case PS_TYPE_##TYPE:                        \
     33    for (int j = rowStart; j < rowStop; j++) { \
     34        for (int i = 0; i < inImage->numCols; i++) { \
     35            ps##TYPE flatValue = flatImage->data.TYPE[j + yOffset][i + xOffset]; \
     36            if (!isfinite(flatValue) || flatValue <= 0.0 || \
     37                (flatMask && flatMask->data.U8[j + yOffset][i + xOffset])) { \
     38                if (inMask) { \
     39                    inMask->data.PS_TYPE_MASK_DATA[j][i] |= badFlat; \
     40                } \
     41                inImage->data.TYPE[j][i] = SPECIAL; \
     42            } else { \
     43                inImage->data.TYPE[j][i] /= flatValue; \
     44            } \
     45        } \
     46    } \
     47    break;
     48
     49bool pmFlatFieldScan (psImage *inImage, psImage *inMask, psImage *flatImage, psImage *flatMask, psMaskType badFlat, int xOffset, int yOffset, int rowStart, int rowStop) {
     50
     51    switch (inImage->type.type) {
     52        FLAT_DIVISION_CASE(U8,  0);
     53        FLAT_DIVISION_CASE(U16, 0);
     54        FLAT_DIVISION_CASE(U32, 0);
     55        FLAT_DIVISION_CASE(U64, 0);
     56        FLAT_DIVISION_CASE(S8,  0);
     57        FLAT_DIVISION_CASE(S16, 0);
     58        FLAT_DIVISION_CASE(S32, 0);
     59        FLAT_DIVISION_CASE(S64, 0);
     60        FLAT_DIVISION_CASE(F32, NAN);
     61        FLAT_DIVISION_CASE(F64, NAN);
     62    default:
     63        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unsupported type for input image: %x\n",
     64                inImage->type.type);
     65        return false;
     66    }
     67    return true;
     68}
    1369
    1470bool pmFlatField(pmReadout *in, const pmReadout *flat, psMaskType badFlat)
     
    71127    }
    72128
    73     // Macro for all PS types
    74     #define FLAT_DIVISION_CASE(TYPE, SPECIAL) \
    75 case PS_TYPE_##TYPE: \
    76     for (int j = 0; j < inImage->numRows; j++) { \
    77         for (int i = 0; i < inImage->numCols; i++) { \
    78             ps##TYPE flatValue = flatImage->data.TYPE[j + yOffset][i + xOffset]; \
    79             if (!isfinite(flatValue) || flatValue <= 0.0 || \
    80                 (flatMask && flatMask->data.U8[j + yOffset][i + xOffset])) { \
    81                 if (inMask) { \
    82                     inMask->data.PS_TYPE_MASK_DATA[j][i] |= badFlat; \
    83                 } \
    84                 inImage->data.TYPE[j][i] = SPECIAL; \
    85             } else { \
    86                 inImage->data.TYPE[j][i] /= flatValue; \
    87             } \
    88         } \
    89     } \
    90     break;
     129    bool threaded = true;
     130    int scanRows = pmDetrendGetScanRows();
     131    if (scanRows == 0) {
     132        threaded = false;
     133        scanRows = inImage->numRows;
     134    }
    91135
    92     switch (inImage->type.type) {
    93         FLAT_DIVISION_CASE(U8,  0);
    94         FLAT_DIVISION_CASE(U16, 0);
    95         FLAT_DIVISION_CASE(U32, 0);
    96         FLAT_DIVISION_CASE(U64, 0);
    97         FLAT_DIVISION_CASE(S8,  0);
    98         FLAT_DIVISION_CASE(S16, 0);
    99         FLAT_DIVISION_CASE(S32, 0);
    100         FLAT_DIVISION_CASE(S64, 0);
    101         FLAT_DIVISION_CASE(F32, NAN);
    102         FLAT_DIVISION_CASE(F64, NAN);
    103     default:
    104         psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unsupported type for input image: %x\n",
    105                 inImage->type.type);
    106         return false;
     136    for (int rowStart = 0; rowStart < inImage->numRows; rowStart += scanRows) {
     137      int rowStop = PS_MIN (rowStart + scanRows, inImage->numRows);
     138
     139# define PS_ARRAY_ADD_SCALAR(ARRAY, VALUE, TYPE) { \
     140      psScalar *scalar = psScalarAlloc(VALUE, TYPE); \
     141      psArrayAdd(ARRAY, 1, scalar); \
     142      psFree (scalar); }
     143     
     144      if (threaded) {
     145          // allocate a job, construct the arguments for this job
     146          psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_FLAT");
     147          psArrayAdd (job->args, 1, inImage);
     148          psArrayAdd (job->args, 1, inMask);
     149          psArrayAdd (job->args, 1, flatImage);
     150          psArrayAdd (job->args, 1, flatMask);
     151          PS_ARRAY_ADD_SCALAR (job->args, badFlat, PS_TYPE_U8);
     152          PS_ARRAY_ADD_SCALAR (job->args, xOffset, PS_TYPE_S32);
     153          PS_ARRAY_ADD_SCALAR (job->args, yOffset, PS_TYPE_S32);
     154          PS_ARRAY_ADD_SCALAR (job->args, rowStart, PS_TYPE_S32);
     155          PS_ARRAY_ADD_SCALAR (job->args, rowStop, PS_TYPE_S32);
     156
     157          // ppImageDetrendReadout(config, options, view)
     158          if (!psThreadJobAddPending (job)) {
     159              return false;
     160          }
     161      } else {
     162          pmFlatFieldScan (inImage, inMask, flatImage, flatMask, badFlat, xOffset, yOffset, rowStart, rowStop);
     163      }
     164    }
     165
     166    if (threaded) {
     167        // wait here for the threaded jobs to finish
     168        if (!psThreadPoolWait ()) {
     169            psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image.");
     170            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);
     178        }
    107179    }
    108180
Note: See TracChangeset for help on using the changeset viewer.