IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 14, 2012, 6:10:32 PM (14 years ago)
Author:
watersc1
Message:

Still doesn't work correctly. I've simplified and corrected the problems I was having before, but I still have residuals of ~50 pixels in the warped background model relative to the science warp. I'm beginning to think that there's some issue with the interpolated background model, and that it's not quite the correct size? That's pretty much all I can think of at this point.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/czw_branch/20120906/psModules/src/detrend/pmDark.c

    r33089 r34442  
    353353
    354354    // 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");
    357357    psVector *roMask = psMetadataLookupPtr(&mdok, output->analysis, "DARK.RO.MASK");
    358358    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    }
    363386
    364387    // retrieve the norm vector, if supplied
     
    383406    }
    384407
    385     pmDarkVisualInit(values);
     408    pmDarkVisualInit(values_set->data[max_orders->n - 1]);
    386409
    387410    pmReadout *outReadout = output->readouts->data[0];
     
    423446            }
    424447
    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)) {
    426454                psErrorClear();         // Nothing we can do about it
    427455                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.
    434490                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                }
    436497            }
    437498            counts->data.U16[yOut][xOut] = poly->numFit;
Note: See TracChangeset for help on using the changeset viewer.