Changeset 34800 for trunk/psModules/src/detrend/pmDark.c
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
trunk/psModules
- Property svn:mergeinfo changed
/branches/czw_branch/20120906/psModules (added) merged: 34442,34516,34623,34625-34626,34667,34772
- Property svn:mergeinfo changed
-
trunk/psModules/src/detrend/pmDark.c
r33089 r34800 353 353 354 354 // retrieve the required parameter vectors 355 psArray * values = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES");356 psAssert( values, "values not supplied");355 psArray *in_values = psMetadataLookupPtr(&mdok, output->analysis, "DARK.VALUES"); 356 psAssert(in_values, "values not supplied"); 357 357 psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK"); 358 358 psAssert(roMask, "roMask not supplied"); 359 psVector *orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS"); 360 psAssert(orders, "orders not supplied"); 361 362 psPolynomialMD *poly = psPolynomialMDAlloc(orders); // Polynomial for fitting 359 psVector *max_orders = psMetadataLookupPtr(&mdok, output->analysis, "DARK.ORDERS"); 360 psAssert(max_orders, "orders not supplied"); 361 362 psArray *values_set = psArrayAlloc(max_orders->n); 363 psArray *poly_set = psArrayAlloc(max_orders->n); 364 psVector *logL = psVectorAlloc(max_orders->n,PS_TYPE_F64); 365 366 for (int i = 0; i < max_orders->n; i++) { 367 psVector *orders = psVectorAlloc(i+1,PS_TYPE_U8); 368 for (int j = 0; j < orders->n; j++) { 369 orders->data.U8[j] = max_orders->data.U8[j]; 370 } 371 poly_set->data[i] = psPolynomialMDAlloc(orders); // Polynomial for fitting 372 373 psArray *values = psArrayAlloc(in_values->n); 374 375 for (int j = 0; j < values->n; j++) { 376 psVector *these_values = psVectorAlloc(i+1,PS_TYPE_F32); 377 psVector *input_values = in_values->data[j]; 378 379 for (int k = 0; k < orders->n; k++) { 380 these_values->data.F32[k] = input_values->data.F32[k]; 381 } 382 values->data[j] = these_values; 383 } 384 values_set->data[i] = values; 385 } 363 386 364 387 // retrieve the norm vector, if supplied … … 383 406 } 384 407 385 pmDarkVisualInit(values );408 pmDarkVisualInit(values_set->data[max_orders->n - 1]); 386 409 387 410 pmReadout *outReadout = output->readouts->data[0]; … … 423 446 } 424 447 425 if (!psPolynomialMDClipFit(poly, pixels, NULL, mask, 0xff, values, iter, rej)) { 448 int k_best = 0; 449 for (int k = 0; k < max_orders->n; k++) { 450 psPolynomialMD *poly = poly_set->data[k]; 451 psArray *values = values_set->data[k]; 452 453 if (!psPolynomialMDClipFit(poly, pixels, NULL, mask, 0xff, values, iter, rej)) { 426 454 psErrorClear(); // Nothing we can do about it 427 455 psVectorInit(poly->coeff, NAN); 428 } 429 430 pmDarkVisualPixelFit(pixels, mask); 431 pmDarkVisualPixelModel(poly, values); 432 433 for (int k = 0; k < poly->coeff->n; k++) { 456 } 457 458 pmDarkVisualPixelFit(pixels, mask); 459 pmDarkVisualPixelModel(poly, values); 460 461 // Insert math here to choose optimum model. 462 logL->data.F64[k] = 0.0; 463 psPolynomialMD *polySig = poly_set->data[0]; 464 for (int m = 0; m < poly->deviations->n; m++) { 465 logL->data.F64[k] += pow(poly->deviations->data.F32[m] / polySig->stdevFit,2); 466 /* if ((xOut == 20) && (yOut == 256)) { */ 467 /* psTrace("psModules.detrend",3,"pmDarkCombine DEV: %d %d: input %d models: Norders: %d logL: %g value: %g\n", */ 468 /* xOut,yOut,m,k,logL->data.F64[k],poly->deviations->data.F32[m]); */ 469 /* } */ 470 } 471 if (k > 0) { 472 if ( ( logL->data.F64[k - 1] - logL->data.F64[k] ) > 1) { // Hard coded criterion for a ~5% limit with one degree of freedom 473 k_best = k; 474 } 475 } 476 if ((xOut <= 600) && (yOut <= 600)) { 477 psTrace("psModules.detrend",3,"pmDarkCombine: %d %d: models: Norders: %d logL: %g BestOrders: %d\n", 478 xOut,yOut,k,logL->data.F64[k],k_best); 479 } 480 } 481 if (k_best > 1) { 482 k_best = 1; 483 } 484 /* k_best = 1; */ 485 // Select the polynomial that seems best. 486 psPolynomialMD *poly = poly_set->data[k_best]; 487 488 // for (int k = 0; k < poly->coeff->n; k++) { 489 for (int k = 0; k < max_orders->n + 1; k++) { // There is one more coefficient than is stored here. 434 490 pmReadout *ro = output->readouts->data[k]; // Readout of interest 435 ro->image->data.F32[yOut][xOut] = poly->coeff->data.F64[k]; 491 if (k < poly->coeff->n) { 492 ro->image->data.F32[yOut][xOut] = poly->coeff->data.F64[k]; 493 } 494 else { 495 ro->image->data.F32[yOut][xOut] = 0.0; 496 } 436 497 } 437 498 counts->data.U16[yOut][xOut] = poly->numFit;
Note:
See TracChangeset
for help on using the changeset viewer.
