Changeset 18893 for trunk/psModules/src/detrend/pmFlatField.c
- Timestamp:
- Aug 4, 2008, 3:24:47 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/detrend/pmFlatField.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmFlatField.c
r15673 r18893 11 11 #include "pmFPAMaskWeight.h" 12 12 #include "pmFlatField.h" 13 #include "pmDetrendThreads.h" 14 15 bool 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 49 bool 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 } 13 69 14 70 bool pmFlatField(pmReadout *in, const pmReadout *flat, psMaskType badFlat) … … 71 127 } 72 128 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 } 91 135 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 } 107 179 } 108 180
Note:
See TracChangeset
for help on using the changeset viewer.
