IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 3, 2006, 4:36:25 PM (20 years ago)
Author:
Paul Price
Message:

Bug fixes in reading from FITS file (wasn't allocating memory, need to read an array of vectors), plugging memory leaks. Now works with ppImage.

File:
1 edited

Legend:

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

    r9822 r9856  
    250250    (void)psMemSetDeallocator(stats, (psFreeFunc)fringeStatsFree);
    251251
    252     int numRegions = regions->x->n;    // Number of regions
     252    int numRegions = regions->nRequested; // Number of regions
    253253    stats->regions = psMemIncrRefCounter(regions);
    254254    stats->f = psVectorAlloc(numRegions, PS_TYPE_F32);
     
    475475            return NULL;
    476476        }
    477         unsigned int num = regions->nRequested;  // Number of fringe points
     477        int num = regions->nRequested;  // Number of fringe points
    478478        if (regions->x->n != num || regions->y->n != num || regions->mask->n != num ||
    479479                fringe->f->n != num || fringe->df->n != num) {
     
    487487
    488488    pmFringeRegions *newRegions = pmFringeRegionsAlloc(numPoints, dX, dY, nX, nY); // The new list of regions
     489    newRegions->x = psVectorAlloc(numPoints, PS_TYPE_F32);
     490    newRegions->y = psVectorAlloc(numPoints, PS_TYPE_F32);
     491    newRegions->mask = psVectorAlloc(numPoints, PS_TYPE_U8);
    489492    pmFringeStats *newStats = pmFringeStatsAlloc(newRegions); // The new list of statistics
    490493
     
    499502        memcpy(&newStats->f->data.F32[offset], fringe->f->data.F32, fringe->f->n * sizeof(psF32));
    500503        memcpy(&newStats->df->data.F32[offset], fringe->f->data.F32, fringe->df->n * sizeof(psF32));
     504        if (x0 && y0) {
     505            for (long j = offset; j < offset + regions->x->n; j++) {
     506                newRegions->x->data.F32[j] += x0->data.S32[i];
     507                newRegions->y->data.F32[j] += y0->data.S32[i];
     508            }
     509        }
    501510        offset += regions->nRequested;
    502511    }
     
    652661
    653662    #define READ_FRINGES_VECTOR_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
    654     VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
    655     if (!mdok) { \
    656         psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
    657         goto READ_FRINGES_DONE; \
    658     }
    659 
    660     #define READ_FRINGES_ARRAY_ROW(ARRAY, NAME, DESCRIPTION) \
    661     ARRAY->data[i] = psMetadataLookupPtr(&mdok, row, NAME); \
    662     if (!ARRAY->data[i] || !mdok) { \
    663         psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
    664         goto READ_FRINGES_DONE; \
    665     }
     663    { \
     664        VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
     665        if (!mdok) { \
     666            psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
     667            goto READ_FRINGES_DONE; \
     668        } \
     669    }
     670
     671    // Some values may be either a vector or a value --- need to check
     672    #define READ_FRINGES_ARRAY_ROW(ARRAY, TYPE, NAME, DESCRIPTION) \
     673    { \
     674        psMetadataItem *item = psMetadataLookup(row, NAME); \
     675        if (!item) { \
     676            psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
     677            goto READ_FRINGES_DONE; \
     678        } \
     679        if (item->type == PS_DATA_VECTOR) { \
     680            ARRAY->data[i] = psMemIncrRefCounter(item->data.V); \
     681        } else if (item->type == PS_TYPE_##TYPE) { \
     682            psVector *vector = psVectorAlloc(1, PS_TYPE_##TYPE); \
     683            vector->data.TYPE[0] = item->data.TYPE; \
     684            ARRAY->data[i] = vector; \
     685        } else { \
     686            psError(PS_ERR_IO, true, "Found " #DESCRIPTION ", but it's of an unsupported type (%x).\n", \
     687                    item->type); \
     688            goto READ_FRINGES_DONE; \
     689        } \
     690    }
     691
    666692
    667693    // Translate the table into vectors
     
    671697        READ_FRINGES_VECTOR_ROW(y, F32, "y", "y position");
    672698        READ_FRINGES_VECTOR_ROW(mask, U8, "mask", "mask");
    673         READ_FRINGES_ARRAY_ROW(f, "f", "fringe measurement");
    674         READ_FRINGES_ARRAY_ROW(df, "df", "fringe error");
     699        READ_FRINGES_ARRAY_ROW(f, F32, "f", "fringe measurement");
     700        READ_FRINGES_ARRAY_ROW(df, F32, "df", "fringe error");
    675701    }
    676702
     
    695721    psFree(table);
    696722    psFree(regions);
    697     psFree(x);
    698     psFree(y);
    699     psFree(mask);
    700723    psFree(f);
    701724    psFree(df);
     
    813836        scale->coeffErr->data.F32[i] = sqrt(A->data.F64[i][i]);
    814837    }
     838
     839    psFree(A);
     840    psFree(B);
    815841
    816842    return true;
Note: See TracChangeset for help on using the changeset viewer.