Changeset 18893 for trunk/psModules/src/detrend/pmDark.c
- Timestamp:
- Aug 4, 2008, 3:24:47 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/detrend/pmDark.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmDark.c
r18859 r18893 11 11 #include "pmFPAWrite.h" 12 12 #include "pmReadoutStack.h" 13 #include "pmDetrendThreads.h" 13 14 14 15 #include "pmDark.h" … … 366 367 } 367 368 368 bool pmDarkApply(pmReadout *readout, const pmCell *dark, psMaskType bad) 369 bool 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 384 bool 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 409 bool pmDarkApply(pmReadout *readout, pmCell *dark, psMaskType bad) 369 410 { 370 411 PS_ASSERT_PTR_NON_NULL(readout, false); … … 433 474 psFree(orders); 434 475 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 } 450 528 } 451 529
Note:
See TracChangeset
for help on using the changeset viewer.
