IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 13, 2008, 3:25:30 PM (18 years ago)
Author:
eugene
Message:

do not invalidate out-of-range values when applying the dark

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/detrend/pmDark.c

    r17228 r18132  
    2525// Look up the value of an ordinate in a readout
    2626static bool ordinateLookup(float *value, // Value of ordinate, to return
     27                           bool *inRange, // is value within min : max range?
    2728                           const char *name, // Name of ordinate (concept name)
    2829                           bool scale,  // Scale the value?
     
    3536    assert(ro);
    3637
     38    *inRange = true;
     39
    3740    pmCell *cell = ro->parent; // Parent cell
    3841    if (!cell) {
     
    6770        if (*value < min || *value > max) {
    6871            psWarning("Value of concept %s (%f) outside range (%f:%f)", name, *value, min, max);
    69             return false;
     72            *inRange = false;
    7073        }
    7174        *value = 2.0 * (*value - min) / (max - min) - 1.0;
     
    104107    PS_ASSERT_INT_NONNEGATIVE(iter, false);
    105108    PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false);
     109
     110    bool inRange = true;
    106111
    107112    // Extract fitting orders
     
    118123            pmReadout *ro = inputs->data[i]; // Readout of interest
    119124            float normValue;            // Normalisation value
    120             if (!ordinateLookup(&normValue, normConcept, false, NAN, NAN, ro)) {
     125            if (!ordinateLookup(&normValue, &inRange, normConcept, false, NAN, NAN, ro)) {
    121126                psWarning("Unable to find value of %s for readout %d", normConcept, i);
    122127                roMask->data.U8[i] = 0xff;
     
    164169            pmReadout *ro = inputs->data[j]; // Readout of interest
    165170            float value = NAN;          // Value of ordinate
    166             if (!ordinateLookup(&value, ord->name, ord->scale, ord->min, ord->max, ro)) {
     171            if (!ordinateLookup(&value, &inRange, ord->name, ord->scale, ord->min, ord->max, ro)) {
     172                roMask->data.U8[j] = 0xff;
     173                val->data.F32[i] = NAN;
     174                numBadInputs++;
     175                continue;
     176            }
     177            if (!inRange) {
    167178                roMask->data.U8[j] = 0xff;
    168179                val->data.F32[i] = NAN;
     
    271282                    mask->data.PS_TYPE_MASK_DATA[r] = readout->mask->data.PS_TYPE_MASK_DATA[yIn][xIn];
    272283                }
    273             }
     284           
     285            }
     286
     287            // XXX test
     288            if (0 && (i == 377) && (j == 80)) {
     289                FILE *f = fopen ("test.dat", "w");     
     290                for (int r = 0; r < inputs->n; r++) {
     291                    fprintf (f, "%d %d  %d  ", i, j, mask->data.U8[r]);
     292                    psVector *value = values->data[r];
     293                    for (int tmpj = 0; tmpj < value->n; tmpj++) {
     294                        fprintf (f, "%f ", value->data.F32[tmpj]);
     295                    }
     296                    fprintf (f, "%f\n", pixels->data.F32[r]);
     297                }
     298                fclose (f);
     299            }
    274300
    275301            if (!psPolynomialMDClipFit(poly, pixels, NULL, mask, maskVal, values, iter, rej)) {
     
    337363    bool mdok;                          // Status of MD lookup
    338364    psString normConcept = psMetadataLookupStr(&mdok, dark->analysis, PM_DARK_ANALYSIS_NORM); // Normalisation
     365    bool inRange = false;
    339366
    340367    int numOrdinates = ordinates->n;    // Number of ordinates
     
    343370        pmDarkOrdinate *ord = ordinates->data[i]; // Ordinate of interest
    344371        float value = NAN;              // Value for ordinate
    345         if (!ordinateLookup(&value, ord->name, ord->scale, ord->min, ord->max, readout)) {
     372        if (!ordinateLookup(&value, &inRange, ord->name, ord->scale, ord->min, ord->max, readout)) {
    346373            psError(PS_ERR_UNKNOWN, true, "Unable to find value for %s", ord->name);
    347374            psFree(values);
     
    353380    bool doNorm = false;                // Do normalisation?
    354381    if (normConcept && strlen(normConcept) > 0) {
    355         if (!ordinateLookup(&norm, normConcept, false, NAN, NAN, readout)) {
     382        if (!ordinateLookup(&norm, &inRange, normConcept, false, NAN, NAN, readout)) {
    356383            psError(PS_ERR_UNKNOWN, true, "Unable to find value for %s", normConcept);
    357384            psFree(values);
Note: See TracChangeset for help on using the changeset viewer.