Changeset 19432 for trunk/psModules/src/detrend/pmDark.c
- Timestamp:
- Sep 8, 2008, 6:10:14 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/detrend/pmDark.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmDark.c
r19299 r19432 222 222 223 223 // these calls allocate and save the requested images on the output analysis metadata 224 psImage *counts = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_COUNT, numCols, numRows, PS_TYPE_U16, 0); 224 psImage *counts = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_COUNT, 225 numCols, numRows, PS_TYPE_U16, 0); 225 226 if (!counts) { 226 227 return false; 227 228 } 228 psImage *sigma = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_SIGMA, numCols, numRows, PS_TYPE_F32, NAN); 229 psImage *sigma = pmReadoutSetAnalysisImage(output->readouts->data[0], PM_READOUT_STACK_ANALYSIS_SIGMA, 230 numCols, numRows, PS_TYPE_F32, NAN); 229 231 if (!sigma) { 230 232 return false; 231 233 } 232 234 233 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_ORDINATES, PS_DATA_ARRAY | PS_META_REPLACE, "Dark ordinates", ordinates); 234 psMetadataAddStr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_NORM, PS_META_REPLACE, "Dark normalisation", normConcept); 235 236 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.VALUES", PS_DATA_ARRAY | PS_META_REPLACE, "Dark values", values); 237 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.RO.MASK", PS_DATA_VECTOR | PS_META_REPLACE, "Dark Readout Mask", roMask); 238 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.NORM", PS_DATA_VECTOR | PS_META_REPLACE, "Dark norm", norm); 239 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.ORDERS", PS_DATA_VECTOR | PS_META_REPLACE, "Dark orders", orders); 235 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_ORDINATES, 236 PS_DATA_ARRAY | PS_META_REPLACE, "Dark ordinates", ordinates); 237 psMetadataAddStr(output->analysis, PS_LIST_TAIL, PM_DARK_ANALYSIS_NORM, PS_META_REPLACE, 238 "Dark normalisation", normConcept); 239 240 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.VALUES", PS_DATA_ARRAY | PS_META_REPLACE, 241 "Dark values", values); 242 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.RO.MASK", PS_DATA_VECTOR | PS_META_REPLACE, 243 "Dark Readout Mask", roMask); 244 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.NORM", PS_DATA_VECTOR | PS_META_REPLACE, 245 "Dark norm", norm); 246 psMetadataAddPtr(output->analysis, PS_LIST_TAIL, "DARK.ORDERS", PS_DATA_VECTOR | PS_META_REPLACE, 247 "Dark orders", orders); 240 248 241 249 for (int i = 0; i < numTerms; i++) { … … 272 280 273 281 // retrieve the required parameter vectors 274 psArray *values = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES"); psAssert (values, "values not supplied"); 275 psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK"); psAssert (roMask, "roMask not supplied"); 276 psVector *orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS"); psAssert (orders, "orders not supplied"); 282 psArray *values = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES"); 283 psAssert(values, "values not supplied"); 284 psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK"); 285 psAssert(roMask, "roMask not supplied"); 286 psVector *orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS"); 287 psAssert(orders, "orders not supplied"); 277 288 278 289 psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial for fitting … … 307 318 int yOut = i - outReadout->row0; // y position on output readout 308 319 309 # ifdef SHOW_BUSY320 #ifdef SHOW_BUSY 310 321 if (psTraceGetLevel("psModules.detrend") > 9) { 311 322 printf("Processing row %d\r", i); 312 323 fflush(stdout); 313 324 } 314 # endif325 #endif 315 326 316 327 for (int j = minInputCols; j < maxInputCols; j++) { … … 337 348 } 338 349 339 // XXX test340 if (0 && (i == 377) && (j == 80)) {341 FILE *f = fopen ("test.dat", "w");342 for (int r = 0; r < inputs->n; r++) {343 fprintf (f, "%d %d %d ", i, j, mask->data.U8[r]);344 psVector *value = values->data[r];345 for (int tmpj = 0; tmpj < value->n; tmpj++) {346 fprintf (f, "%f ", value->data.F32[tmpj]);347 }348 fprintf (f, "%f\n", pixels->data.F32[r]);349 }350 fclose (f);351 }352 353 350 if (!psPolynomialMDClipFit(poly, pixels, NULL, mask, maskVal, values, iter, rej)) { 354 351 psErrorClear(); // Nothing we can do about it … … 367 364 psFree(mask); 368 365 369 fprintf (stderr, "done with combine %x : %f sec\n", (unsigned int) id, psTimerMark (name));370 366 return true; 371 367 } … … 375 371 PS_ASSERT_THREAD_JOB_NON_NULL(job, false); 376 372 377 pmReadout *readout = job->args->data[0]; 378 pmCell *dark = job->args->data[1]; 379 psPolynomialMD *poly = job->args->data[2]; 380 psVector *values = job->args->data[3]; 381 382 psMaskType bad = PS_SCALAR_VALUE(job->args->data[4],U8); 383 bool doNorm = PS_SCALAR_VALUE(job->args->data[5],U8); 384 float norm = PS_SCALAR_VALUE(job->args->data[6],F32); 385 int rowStart = PS_SCALAR_VALUE(job->args->data[7],S32); 386 int rowStop = PS_SCALAR_VALUE(job->args->data[8],S32); 387 bool status = pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop); 388 return status; 389 } 390 391 bool pmDarkApplyScan (pmReadout *readout, const pmCell *dark, psPolynomialMD *poly, psVector *values, psMaskType bad, bool doNorm, float norm, int rowStart, int rowStop) { 392 373 pmReadout *readout = job->args->data[0]; // Readout to correct 374 pmCell *dark = job->args->data[1]; // Dark to apply 375 const psVector *orders = job->args->data[2]; // Polynomial orders for each ordinate 376 const psVector *values = job->args->data[3]; // Values for each ordinate 377 378 psMaskType bad = PS_SCALAR_VALUE(job->args->data[4], U8); // Mask value to give bad pixels 379 bool doNorm = PS_SCALAR_VALUE(job->args->data[5], U8); // Normalise values? 380 float norm = PS_SCALAR_VALUE(job->args->data[6], F32); // Value by which to normalise 381 int rowStart = PS_SCALAR_VALUE(job->args->data[7], S32); // Starting row for scan 382 int rowStop = PS_SCALAR_VALUE(job->args->data[8], S32); // Stopping row for scan 383 384 return pmDarkApplyScan(readout, dark, orders, values, bad, doNorm, norm, rowStart, rowStop); 385 } 386 387 bool pmDarkApplyScan(pmReadout *readout, const pmCell *dark, const psVector *orders, const psVector *values, 388 psMaskType bad, bool doNorm, float norm, int rowStart, int rowStop) 389 { 393 390 int numCols = readout->image->numCols; 394 391 int numTerms = dark->readouts->n; // Number of polynomial terms 395 392 396 // thread here by scan 393 psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial to apply 394 397 395 for (int y = rowStart; y < rowStop; y++) { 398 396 for (int x = 0; x < numCols; x++) { … … 411 409 } 412 410 } 411 psFree(poly); 412 413 413 return true; 414 414 } … … 478 478 } 479 479 480 psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial to apply481 psFree(orders);482 483 480 // thread here by scan 484 481 … … 491 488 492 489 for (int rowStart = 0; rowStart < readout->image->numRows; rowStart += scanRows) { 493 int rowStop = PS_MIN (rowStart + scanRows, readout->image->numRows); 494 495 if (threaded) { 496 // allocate a job, construct the arguments for this job 497 psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_DARK"); 498 psArrayAdd (job->args, 1, readout); 499 psArrayAdd (job->args, 1, dark); 500 psArrayAdd (job->args, 1, poly); 501 psArrayAdd (job->args, 1, values); 502 PS_ARRAY_ADD_SCALAR (job->args, bad, PS_TYPE_MASK); 503 PS_ARRAY_ADD_SCALAR (job->args, doNorm, PS_TYPE_U8); 504 PS_ARRAY_ADD_SCALAR (job->args, norm, PS_TYPE_F32); 505 PS_ARRAY_ADD_SCALAR (job->args, rowStart, PS_TYPE_S32); 506 PS_ARRAY_ADD_SCALAR (job->args, rowStop, PS_TYPE_S32); 507 508 // ppImageDetrendReadout(config, options, view) 509 if (!psThreadJobAddPending (job)) { 510 psFree(job); 511 return false; 512 } 513 psFree(job); 514 } else { 515 pmDarkApplyScan (readout, dark, poly, values, bad, doNorm, norm, rowStart, rowStop); 516 } 490 int rowStop = PS_MIN(rowStart + scanRows, readout->image->numRows); 491 492 if (threaded) { 493 psThreadJob *job = psThreadJobAlloc("PSMODULES_DETREND_DARK"); 494 psArrayAdd(job->args, 1, readout); 495 psArrayAdd(job->args, 1, dark); 496 psArrayAdd(job->args, 1, orders); 497 psArrayAdd(job->args, 1, values); 498 PS_ARRAY_ADD_SCALAR(job->args, bad, PS_TYPE_MASK); 499 PS_ARRAY_ADD_SCALAR(job->args, doNorm, PS_TYPE_U8); 500 PS_ARRAY_ADD_SCALAR(job->args, norm, PS_TYPE_F32); 501 PS_ARRAY_ADD_SCALAR(job->args, rowStart, PS_TYPE_S32); 502 PS_ARRAY_ADD_SCALAR(job->args, rowStop, PS_TYPE_S32); 503 504 if (!psThreadJobAddPending (job)) { 505 psFree(job); 506 psFree(orders); 507 psFree(values); 508 return false; 509 } 510 psFree(job); 511 } else if (!pmDarkApplyScan(readout, dark, orders, values, bad, doNorm, norm, rowStart, rowStop)) { 512 psError(PS_ERR_UNKNOWN, false, "Unable to apply dark."); 513 psFree(orders); 514 psFree(values); 515 return false; 516 } 517 517 } 518 518 519 519 if (threaded) { 520 520 // wait here for the threaded jobs to finish 521 if (!psThreadPoolWait(false)) { 522 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); 521 if (!psThreadPoolWait(true)) { 522 psError(PS_ERR_UNKNOWN, false, "Unable to apply dark."); 523 psFree(orders); 524 psFree(values); 523 525 return false; 524 526 } 525 fprintf (stderr, "success for threaded jobs\n"); 526 527 // free the done jobs 528 psThreadJob *job = NULL; 529 while ((job = psThreadJobGetDone()) != NULL) { 530 psFree (job); 531 } 532 } 533 534 psFree(poly); 527 } 528 529 psFree(orders); 535 530 psFree(values); 536 531
Note:
See TracChangeset
for help on using the changeset viewer.
