IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7562


Ignore:
Timestamp:
Jun 14, 2006, 12:04:40 PM (20 years ago)
Author:
Paul Price
Message:

Adding fringe I/O functions: pmFringeStatsReadFits, pmFringeStatsWriteFits

Location:
trunk/psModules/src/detrend
Files:
2 edited

Legend:

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

    r7278 r7562  
    33 *  @author Eugene Magnier, IfA
    44 *
    5  *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
    6  *  @date $Date: 2006-06-02 00:55:23 $
     5 *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
     6 *  @date $Date: 2006-06-14 22:04:40 $
    77 *
    88 *  Copyright 2004 IfA
     
    192192}
    193193
     194
     195bool pmFringeStatsWriteFits(psFits *fits, const pmFringeStats *fringe, const char *extname)
     196{
     197    // Make sure the input is well-behaved
     198    PS_ASSERT_PTR_NON_NULL(fits, false);
     199    PS_ASSERT_PTR_NON_NULL(fringe, false);
     200    pmFringeRegions *regions = fringe->regions; // The fringe regions
     201    PS_ASSERT_PTR_NON_NULL(regions, false);
     202    psVector *x = regions->x;           // The x positions
     203    psVector *y = regions->y;           // The y positions
     204    psVector *mask = regions->mask;     // The region mask
     205    int numRows = x->n;                 // Number of rows in the table
     206    PS_ASSERT_INT_POSITIVE(regions->nRequested, false);
     207    PS_ASSERT_VECTOR_NON_NULL(x, false);
     208    PS_ASSERT_VECTOR_NON_NULL(y, false);
     209    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false);
     210    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false);
     211    PS_ASSERT_VECTOR_SIZE(y, numRows, false);
     212    if (mask) {
     213        PS_ASSERT_VECTOR_NON_NULL(mask, false);
     214        PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false);
     215        PS_ASSERT_VECTOR_SIZE(mask, numRows, false);
     216    }
     217    psVector *f = fringe->f;            // The fringe measurements
     218    psVector *df = fringe->df;      // The fringe standard deviatiations
     219    PS_ASSERT_VECTOR_NON_NULL(f, false);
     220    PS_ASSERT_VECTOR_NON_NULL(df, false);
     221    PS_ASSERT_VECTOR_TYPE(f, PS_TYPE_F32, false);
     222    PS_ASSERT_VECTOR_TYPE(df, PS_TYPE_F32, false);
     223    PS_ASSERT_VECTOR_SIZE(f, numRows, false);
     224    PS_ASSERT_VECTOR_SIZE(df, numRows, false);
     225
     226    if (extname && strlen(extname) > 0) {
     227        if (!psFitsMoveExtName(fits, extname)) {
     228            psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname);
     229            return false;
     230        }
     231    } else if (!psFitsMoveExtNum(fits, 0, false)) {
     232        psError(PS_ERR_IO, false, "Unable to move to PHU\n");
     233        return false;
     234    }
     235
     236    // We need to write:
     237    // Scalars: dX, dY, nX, nY
     238    // Vectors: x, y, mask, f, df
     239
     240    psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header
     241    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width",
     242                     regions->dX);
     243    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height",
     244                     regions->dY);
     245    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x",
     246                     regions->nX);
     247    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y",
     248                     regions->nY);
     249
     250    psArray *table = psArrayAlloc(numRows); // The table
     251    // Translate the vectors into the required format for psFitsWriteTable()
     252    for (long i = 0; i < numRows; i++) {
     253        psMetadata *row = psMetadataAlloc();
     254        psArraySet(table, i, row);
     255        psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]);
     256        psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]);
     257        if (mask) {
     258            psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", mask->data.F32[i]);
     259        } else {
     260            psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", 0);
     261        }
     262        psMetadataAddF32(row, PS_LIST_TAIL, "f", PS_META_REPLACE, "Fringe measurement", f->data.F32[i]);
     263        psMetadataAddF32(row, PS_LIST_TAIL, "df", PS_META_REPLACE, "Fringe stdev", df->data.F32[i]);
     264        psFree(row);                    // Drop reference
     265    }
     266
     267    bool success;                       // Success of operation
     268    if (!(success = psFitsWriteTable(fits, scalars, table, extname))) {
     269        psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname);
     270    }
     271    psFree(scalars);
     272    psFree(table);
     273
     274    return success;
     275}
     276
     277pmFringeStats *pmFringeStatsReadFits(const psFits *fits, const char *extname)
     278{
     279    PS_ASSERT_PTR_NON_NULL(fits, NULL);
     280
     281    if (extname && strlen(extname) > 0) {
     282        if (!psFitsMoveExtName(fits, extname)) {
     283            psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname);
     284            return NULL;
     285        }
     286    } else if (!psFitsMoveExtNum(fits, 0, false)) {
     287        psError(PS_ERR_IO, false, "Unable to move to PHU\n");
     288        return NULL;
     289    }
     290
     291    psMetadata *header = psFitsReadHeader(NULL, fits); // The FITS header
     292
     293    // Need to retrieve the scalars: dX, dY, nX, nY
     294    bool mdok = true;                   // Status of MD lookup
     295    int dX = psMetadataLookupS32(&mdok, header, "PSFRNGDX");
     296    if (!mdok || dX <= 0) {
     297        psError(PS_ERR_IO, true, "Unable to find PSFRNGDX in header of extension %s.\n");
     298        return NULL;
     299    }
     300    int dY = psMetadataLookupS32(&mdok, header, "PSFRNGDY");
     301    if (!mdok || dY <= 0) {
     302        psError(PS_ERR_IO, true, "Unable to find PSFRNGDY in header of extension %s.\n");
     303        return NULL;
     304    }
     305    int nX = psMetadataLookupS32(&mdok, header, "PSFRNGNX");
     306    if (!mdok || nX <= 0) {
     307        psError(PS_ERR_IO, true, "Unable to find PSFRNGNX in header of extension %s.\n");
     308        return NULL;
     309    }
     310    int nY = psMetadataLookupS32(&mdok, header, "PSFRNGNY");
     311    if (!mdok || nY <= 0) {
     312        psError(PS_ERR_IO, true, "Unable to find PSFRNGNY in header of extension %s.\n");
     313        return NULL;
     314    }
     315
     316    // Now the vectors: x, y, mask, f, df
     317    psArray *table = psFitsReadTable(fits); // The table
     318    long numRows = table->n;            // Number of rows
     319
     320    pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions
     321    if (regions->x) {
     322        psFree(regions->x);
     323    }
     324    if (regions->y) {
     325        psFree(regions->y);
     326    }
     327    if (regions->mask) {
     328        psFree(regions->mask);
     329    }
     330
     331    psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position
     332    psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position
     333    psVector *mask = psVectorAlloc(numRows, PS_TYPE_U8); // mask
     334    x->n = y->n = mask->n = numRows;
     335    regions->x = x;
     336    regions->y = y;
     337    regions->mask = mask;
     338    pmFringeStats *fringes = pmFringeStatsAlloc(regions); // The fringe measurements
     339    psFree(regions);                    // Drop reference
     340    psVector *f = fringes->f;           // fringe measurement
     341    psVector *df = fringes->df;     // fringe stdev
     342
     343    // Translate the table into vectors
     344    for (long i = 0; i < numRows; i++) {
     345        psMetadata *row = table->data[i]; // Table row
     346        x->data.F32[i] = psMetadataLookupF32(&mdok, row, "x");
     347        if (!mdok) {
     348            psError(PS_ERR_IO, true, "Unable to find x position.\n");
     349            psFree(fringes);
     350            return NULL;
     351        }
     352        y->data.F32[i] = psMetadataLookupF32(&mdok, row, "y");
     353        if (!mdok) {
     354            psError(PS_ERR_IO, true, "Unable to find y position.\n");
     355            psFree(fringes);
     356            return NULL;
     357        }
     358        mask->data.U8[i] = psMetadataLookupF32(&mdok, row, "mask");
     359        if (!mdok) {
     360            psError(PS_ERR_IO, true, "Unable to find mask value.\n");
     361            psFree(fringes);
     362            return NULL;
     363        }
     364        f->data.F32[i] = psMetadataLookupF32(&mdok, row, "f");
     365        if (!mdok) {
     366            psError(PS_ERR_IO, true, "Unable to find fringe measurement.\n");
     367            psFree(fringes);
     368            return NULL;
     369        }
     370        df->data.F32[i] = psMetadataLookupF32(&mdok, row, "df");
     371        if (!mdok) {
     372            psError(PS_ERR_IO, true, "Unable to find fringe stdev.\n");
     373            psFree(fringes);
     374            return NULL;
     375        }
     376    }
     377
     378    return fringes;
     379}
     380
     381
    194382//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    195383// pmFringeScale
  • trunk/psModules/src/detrend/pmFringeStats.h

    r6957 r7562  
    55 *  @author Eugene Magnier, IfA
    66 *
    7  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2006-04-22 03:21:00 $
     7 *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2006-06-14 22:04:40 $
    99 *
    1010 *  Copyright 2004 IfA, University of Hawaii
     
    8282);
    8383
     84// Write the fringe stats for an image to a FITS table
     85bool pmFringeStatsWriteFits(psFits *fits, // FITS file to which to write
     86                            const pmFringeStats *fringe, // Fringe statistics to be written
     87                            const char *extname // Extension name for table
     88                           );
     89
     90// Read the fringe stats for an image from a FITS table
     91pmFringeStats *pmFringeStatsReadFits(const psFits *fits, // FITS file from which to read
     92                                     const char *extname // Extension name to read
     93                                    );
    8494
    8595//////////////////////////////////////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.