IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3025


Ignore:
Timestamp:
Jan 17, 2005, 10:58:22 AM (22 years ago)
Author:
desonia
Message:

added test for psFitsReadTable.

Location:
trunk/psLib
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/psLib.kdevses

    r2965 r3025  
    44 <DocsAndViews NumberOfDocuments="8" >
    55  <Doc0 NumberOfViews="1" URL="file:/home/desonia/psLib/test/fileUtils/tst_psFits.c" >
    6    <View0 line="22" Type="Source" />
     6   <View0 Type="Source" />
    77  </Doc0>
    88  <Doc1 NumberOfViews="1" URL="file:/home/desonia/psLib/src/fileUtils/psFits.h" >
    9    <View0 line="166" Type="Source" />
     9   <View0 Type="Source" />
    1010  </Doc1>
    1111  <Doc2 NumberOfViews="1" URL="file:/home/desonia/psLib/src/fileUtils/psFits.c" >
    12    <View0 line="257" Type="Source" />
     12   <View0 Type="Source" />
    1313  </Doc2>
    1414  <Doc3 NumberOfViews="1" URL="file:/home/desonia/psLib/src/image/psImage.h" >
    15    <View0 line="0" Type="Source" />
     15   <View0 Type="Source" />
    1616  </Doc3>
    1717  <Doc4 NumberOfViews="1" URL="file:/home/desonia/psLib/src/image/psImageIO.c" >
    18    <View0 line="20" Type="Source" />
     18   <View0 Type="Source" />
    1919  </Doc4>
    2020  <Doc5 NumberOfViews="1" URL="file:/home/desonia/psLib/src/fileUtils/psFileUtilsErrors.dat" >
    21    <View0 line="20" Type="Source" />
     21   <View0 Type="Source" />
    2222  </Doc5>
    2323  <Doc6 NumberOfViews="1" URL="file:/home/desonia/psLib/src/image/psImageErrors.dat" >
    24    <View0 line="57" Type="Source" />
     24   <View0 Type="Source" />
    2525  </Doc6>
    2626  <Doc7 NumberOfViews="1" URL="file:/home/desonia/psLib/src/sysUtils/psLogMsg.h" >
    27    <View0 line="0" Type="Source" />
     27   <View0 line="36" Type="Source" />
    2828  </Doc7>
    2929 </DocsAndViews>
  • trunk/psLib/src/astronomy/psMetadata.c

    r2985 r3025  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.48 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-01-13 23:27:06 $
     14*  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-01-17 20:58:20 $
    1616*
    1717*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    495495psMetadataLookupNumTYPE(F64)
    496496psMetadataLookupNumTYPE(S32)
     497psMetadataLookupNumTYPE(Bool)
    497498
    498499psMetadataItem* psMetadataGet(psMetadata *md, psS32 where)
  • trunk/psLib/src/astronomy/psMetadata.h

    r2975 r3025  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-01-13 21:09:39 $
     13*  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-01-17 20:58:20 $
    1515*
    1616*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    240240);
    241241
     242/** Find an item in the metadata collection based on key name and return its boolean value.
     243 *
     244 *  Items may be found in the metadata by providing a key. If the key is
     245 *  non-unique, the value of the first item is returned. If the item is not found, zero is
     246 *  returned.
     247 *
     248 * @return psBool : Value of metadata item.
     249 */
     250psBool psMetadataLookupBool(
     251    psMetadata *md,            ///< Metadata collection to lookup metadata item.
     252    const char *key,           ///< Name of metadata key.
     253    psBool *status              ///< Status of lookup.
     254);
     255
    242256/** Find an item in the metadata collection based on key name and return its integer value.
    243257 *
  • trunk/psLib/src/collections/psMetadata.c

    r2985 r3025  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.48 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-01-13 23:27:06 $
     14*  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-01-17 20:58:20 $
    1616*
    1717*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    495495psMetadataLookupNumTYPE(F64)
    496496psMetadataLookupNumTYPE(S32)
     497psMetadataLookupNumTYPE(Bool)
    497498
    498499psMetadataItem* psMetadataGet(psMetadata *md, psS32 where)
  • trunk/psLib/src/collections/psMetadata.h

    r2975 r3025  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-01-13 21:09:39 $
     13*  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-01-17 20:58:20 $
    1515*
    1616*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    240240);
    241241
     242/** Find an item in the metadata collection based on key name and return its boolean value.
     243 *
     244 *  Items may be found in the metadata by providing a key. If the key is
     245 *  non-unique, the value of the first item is returned. If the item is not found, zero is
     246 *  returned.
     247 *
     248 * @return psBool : Value of metadata item.
     249 */
     250psBool psMetadataLookupBool(
     251    psMetadata *md,            ///< Metadata collection to lookup metadata item.
     252    const char *key,           ///< Name of metadata key.
     253    psBool *status              ///< Status of lookup.
     254);
     255
    242256/** Find an item in the metadata collection based on key name and return its integer value.
    243257 *
  • trunk/psLib/src/collections/psVector.h

    r2204 r3025  
    1111 *  @author Ross Harman, MHPCC
    1212 *
    13  *  @version $Revision: 1.25 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2004-10-27 00:57:31 $
     13 *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2005-01-17 20:58:21 $
    1515 *
    1616 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    3737
    3838    union {
     39        psBool B;               ///< Boolean data.
    3940        psU8* U8;               ///< Unsigned 8-bit integer data.
    4041        psU16* U16;             ///< Unsigned 16-bit integer data.
     
    6364/** Allocate a vector.
    6465 *
    65  *  Uses psLib memory allocation functions to create a vector collection of 
     66 *  Uses psLib memory allocation functions to create a vector collection of
    6667 *  data as defined by the psType type.
    6768 *
     
    7576/** Reallocate a vector.
    7677 *
    77  *  Uses psLib memory allocation functions to reallocate a vector collection 
    78  *  of data. The vector is reallocated according to the psType type member 
     78 *  Uses psLib memory allocation functions to reallocate a vector collection
     79 *  of data. The vector is reallocated according to the psType type member
    7980 *  contained within the vector.
    8081 *
     
    8990/** Recycle a vector.
    9091 *
    91  *  Uses psLib memory allocation functions to reallocate a vector collection 
    92  *  of data. The vector is reallocated according to the psElemType type 
     92 *  Uses psLib memory allocation functions to reallocate a vector collection
     93 *  of data. The vector is reallocated according to the psElemType type
    9394 *  parameter.
    9495 *
     
    107108/** Copy a vector, converting types.
    108109 *
    109  *  Performs a deep copy of the elements of one psVector to a new psVector, 
     110 *  Performs a deep copy of the elements of one psVector to a new psVector,
    110111 *  converting numeric types to a specified type.
    111112 *
     
    133134/** Creates an array of indices based on sort ordered of array.
    134135 *
    135  *  Sorts a vector and creates an integer array holding indices of 
    136  *  sorted float values based on pre-sort index positions. 
     136 *  Sorts a vector and creates an integer array holding indices of
     137 *  sorted float values based on pre-sort index positions.
    137138 *
    138139 *  @return  psVector*     vector of the indices of sort.
  • trunk/psLib/src/dataIO/psFileUtilsErrors.dat

    r2965 r3025  
    3434psFits_NOT_IMAGE_TYPE                  Current FITS HDU type must be an image.
    3535psFits_NOT_TABLE_TYPE                  Current FITS HDU type must be a table.
    36 psFits_TABLE_FIRSTROW_NULL             Can't create a table without the first row, where table column information is derived.
     36psFits_TABLE_EMPTY                     Can't create a table without any rows.
    3737psFits_CFITSIO_ERROR                   CFITSIO error: %s
    3838psFits_METATYPE_INVALID                Specified FITS metadata type, %c, is not supported.
  • trunk/psLib/src/dataIO/psFileUtilsErrors.h

    r2965 r3025  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-01-13 01:54:25 $
     9 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-01-17 20:58:21 $
    1111 *
    1212 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    5656#define PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE "Current FITS HDU type must be an image."
    5757#define PS_ERRORTEXT_psFits_NOT_TABLE_TYPE "Current FITS HDU type must be a table."
    58 #define PS_ERRORTEXT_psFits_TABLE_FIRSTROW_NULL "Can't create a table without the first row, where table column information is derived."
     58#define PS_ERRORTEXT_psFits_TABLE_EMPTY "Can't create a table without any rows."
    5959#define PS_ERRORTEXT_psFits_CFITSIO_ERROR "CFITSIO error: %s"
    6060#define PS_ERRORTEXT_psFits_METATYPE_INVALID "Specified FITS metadata type, %c, is not supported."
  • trunk/psLib/src/dataIO/psFits.c

    r2994 r3025  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-01-14 19:40:33 $
     9 *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-01-17 20:58:21 $
    1111 *
    1212 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    165165    switch (type) {
    166166    case PS_TYPE_BOOL:
    167         *fitsType = "1L";
     167        *fitsType = psStringCopy("1L");
    168168        break;
    169169    case PS_TYPE_S32:
    170         *fitsType = "1J";
     170        *fitsType = psStringCopy("1J");
    171171        break;
    172172    case PS_TYPE_F32:
    173         *fitsType = "1E";
     173        *fitsType = psStringCopy("1E");
    174174        break;
    175175    case PS_TYPE_F64:
    176         *fitsType = "1D";
     176        *fitsType = psStringCopy("1D");
    177177        break;
    178178        // XXX: Handle other types, e.g., Vectors, etc.
     
    10281028
    10291029    // the row parameter in the proper range?
    1030     if (row < 1 || row > numRows) {
     1030    if (row < 0 || row >= numRows) {
    10311031        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    10321032                PS_ERRORTEXT_psFits_ROW_INVALID,
     
    10561056        if (status == 0) {
    10571057
    1058             #define READ_TABLE_ROW_CASE(FITSTYPE, TYPE) \
     1058            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
    10591059        case FITSTYPE: { \
    1060                 ps##TYPE value; \
     1060                NATIVETYPE value; \
    10611061                int anynul = 0; \
    10621062                fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
     
    10641064                if (anynul == 0) { \
    10651065                    psMetadataAdd(data,PS_LIST_TAIL, name, \
    1066                                   PS_TYPE_S32, PS_META_PRIMITIVE, \
    1067                                   "", value); \
     1066                                  PS_TYPE_##TYPE, PS_META_PRIMITIVE, \
     1067                                  "", (ps##TYPE)value); \
    10681068                } \
    1069             } \
    1070             break;
     1069                break; \
     1070            }
    10711071
    10721072            switch (typecode) {
    10731073            case TBYTE:
    10741074            case TSHORT:
    1075                 READ_TABLE_ROW_CASE(TLONG, S32)
    1076                 READ_TABLE_ROW_CASE(TFLOAT, F32)
    1077                 READ_TABLE_ROW_CASE(TDOUBLE, F64)
     1075            case TLONGLONG:
     1076                READ_TABLE_ROW_CASE(TLONG, long, S32)
     1077                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
     1078                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
     1079                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
     1080            case TSTRING: {
     1081                    char* value;
     1082                    int anynul = 0;
     1083                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
     1084                                  1, 1, NULL, &value, &anynul, &status);
     1085                    if (anynul == 0) {
     1086                        psMetadataAdd(data,PS_LIST_TAIL, name,
     1087                                      PS_TYPE_PTR, PS_META_STR,
     1088                                      "", value);
     1089                    }
     1090                    break;
     1091                }
    10781092            default:
    10791093                psTrace("psFits.psFitsReadTableRow", 2,
     
    12661280    // get the size of the FITS table
    12671281    long numRows = 0;
    1268     int numCols = 0;
    12691282    fits_get_num_rows(fits->p_fd, &numRows, &status);
    1270     fits_get_num_cols(fits->p_fd, &numCols, &status);
    12711283    if ( status != 0) {
    12721284        char fitsErr[MAX_STRING_LENGTH];
     
    12781290    }
    12791291
    1280     psArray* table = psArrayAlloc(numCols);
     1292    psArray* table = psArrayAlloc(numRows);
    12811293
    12821294    for (int row = 0; row < numRows; row++) {
     
    12931305{
    12941306    int status = 0;
     1307    psMetadataItem* item;
    12951308
    12961309    if (fits == NULL) {
     
    13071320
    13081321    int rows = table->n;
     1322    if (rows < 1) {
     1323        // no table data, what can I do?
     1324        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     1325                PS_ERRORTEXT_psFits_TABLE_EMPTY);
     1326        return false;
     1327    }
    13091328
    13101329    // find all the columns needed
    1311     psArray* columns = psArrayAlloc(16);
     1330    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
    13121331    columns->n=0;
    13131332
    13141333    // find the unique items in the array of metadata 'rows'
    1315     psMetadataItem* item;
    13161334    for (int row=0; row < rows; row++) {
    13171335        psMetadata* rowMeta = table->data[row];
     
    13291347                    }
    13301348                    if (! found) {
    1331                         psArrayAdd(columns, columns->nalloc, item);
     1349                        psArrayAdd(columns, columns->nalloc, psMemIncrRefCounter(item));
    13321350                    }
    13331351                }
     
    13471365    for (int n=0; n < columns->n; n++) {
    13481366        char* fitsType;
    1349         columnNames->data[n] = ((psMetadataItem*)columns->data[n])->name;
     1367        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
    13501368        if ( ! convertPsTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->pType,
    13511369                                          &fitsType)) {
     
    13661384                    &status);
    13671385
     1386    psFree(columnNames);
     1387    psFree(columnTypes);
     1388
    13681389    // fill in the table elements with data
    13691390    for (int n = 0; n < columns->n; n++) {
    13701391        int row;
    13711392        item = columns->data[n];
    1372         psArray* columnItems = psArrayAlloc(table->n);
    1373         for (row = 0; row < table->n; row++) {
    1374             columnItems->data[row] = psMetadataLookup(table->data[row],item->name);
    1375         }
    13761393
    13771394        if (item->type == PS_META_PRIMITIVE) {
     
    13801397            case PS_TYPE_S32:
    13811398                for (row = 0; row < table->n; row++) {
    1382                     col->data.S32[row] = item->data.S32;
     1399                    col->data.S32[row] = psMetadataLookupS32(
     1400                                             table->data[row],item->name,NULL);
    13831401                }
    13841402                fits_write_col_int(fits->p_fd,
    1385                                    n, // column number
     1403                                   n+1, // column number
    13861404                                   1, // firstrow
    13871405                                   1, // firstelem
     
    13921410            case PS_TYPE_F32:
    13931411                for (row = 0; row < table->n; row++) {
    1394                     col->data.F32[row] = item->data.F32;
     1412                    col->data.F32[row] = psMetadataLookupF32(
     1413                                             table->data[row],item->name,NULL);
    13951414                }
    13961415                fits_write_col_flt(fits->p_fd,
    1397                                    n, // column number
     1416                                   n+1, // column number
    13981417                                   1, // firstrow
    13991418                                   1, // firstelem
     
    14021421                                   &status);
    14031422                break;
    1404             case PS_TYPE_S64:
     1423            case PS_TYPE_F64:
    14051424                for (row = 0; row < table->n; row++) {
    1406                     col->data.F64[row] = item->data.F64;
     1425                    col->data.F64[row] = psMetadataLookupF64(
     1426                                             table->data[row],item->name,NULL);
    14071427                }
    14081428                fits_write_col_dbl(fits->p_fd,
    1409                                    n, // column number
     1429                                   n+1, // column number
    14101430                                   1, // firstrow
    14111431                                   1, // firstelem
     
    14141434                                   &status);
    14151435                break;
     1436            case PS_TYPE_BOOL:
     1437                for (row = 0; row < table->n; row++) {
     1438                    col->data.S8[row] = psMetadataLookupBool(
     1439                                            table->data[row],item->name,NULL);
     1440                }
     1441                fits_write_col_log(fits->p_fd,
     1442                                   n+1, // column number
     1443                                   1, // firstrow
     1444                                   1, // firstelem
     1445                                   table->n, // nelements
     1446                                   col->data.S8,
     1447                                   &status);
     1448                break;
    14161449            default:
    14171450                // XXX: error message
    1418                 psFree(col);
    1419                 psFree(columnItems);
    1420                 psFree(columnNames);
    1421                 psFree(columnTypes);
    1422                 psFree(columns);
    1423                 return false;
     1451                break;
    14241452            }
    1425 
     1453            psFree(col);
    14261454        } else if (item->type == PS_META_STR) {
    14271455            psArray* col = psArrayAlloc(table->n);
     
    14361464                               (char**)col->data,
    14371465                               &status);
    1438         }
    1439     }
     1466            psFree(col);
     1467        }
     1468    }
     1469
     1470    psFree(columns);
    14401471
    14411472    return true;
  • trunk/psLib/src/fileUtils/psFileUtilsErrors.dat

    r2965 r3025  
    3434psFits_NOT_IMAGE_TYPE                  Current FITS HDU type must be an image.
    3535psFits_NOT_TABLE_TYPE                  Current FITS HDU type must be a table.
    36 psFits_TABLE_FIRSTROW_NULL             Can't create a table without the first row, where table column information is derived.
     36psFits_TABLE_EMPTY                     Can't create a table without any rows.
    3737psFits_CFITSIO_ERROR                   CFITSIO error: %s
    3838psFits_METATYPE_INVALID                Specified FITS metadata type, %c, is not supported.
  • trunk/psLib/src/fileUtils/psFileUtilsErrors.h

    r2965 r3025  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-01-13 01:54:25 $
     9 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-01-17 20:58:21 $
    1111 *
    1212 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    5656#define PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE "Current FITS HDU type must be an image."
    5757#define PS_ERRORTEXT_psFits_NOT_TABLE_TYPE "Current FITS HDU type must be a table."
    58 #define PS_ERRORTEXT_psFits_TABLE_FIRSTROW_NULL "Can't create a table without the first row, where table column information is derived."
     58#define PS_ERRORTEXT_psFits_TABLE_EMPTY "Can't create a table without any rows."
    5959#define PS_ERRORTEXT_psFits_CFITSIO_ERROR "CFITSIO error: %s"
    6060#define PS_ERRORTEXT_psFits_METATYPE_INVALID "Specified FITS metadata type, %c, is not supported."
  • trunk/psLib/src/fileUtils/psFits.c

    r2994 r3025  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-01-14 19:40:33 $
     9 *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-01-17 20:58:21 $
    1111 *
    1212 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    165165    switch (type) {
    166166    case PS_TYPE_BOOL:
    167         *fitsType = "1L";
     167        *fitsType = psStringCopy("1L");
    168168        break;
    169169    case PS_TYPE_S32:
    170         *fitsType = "1J";
     170        *fitsType = psStringCopy("1J");
    171171        break;
    172172    case PS_TYPE_F32:
    173         *fitsType = "1E";
     173        *fitsType = psStringCopy("1E");
    174174        break;
    175175    case PS_TYPE_F64:
    176         *fitsType = "1D";
     176        *fitsType = psStringCopy("1D");
    177177        break;
    178178        // XXX: Handle other types, e.g., Vectors, etc.
     
    10281028
    10291029    // the row parameter in the proper range?
    1030     if (row < 1 || row > numRows) {
     1030    if (row < 0 || row >= numRows) {
    10311031        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    10321032                PS_ERRORTEXT_psFits_ROW_INVALID,
     
    10561056        if (status == 0) {
    10571057
    1058             #define READ_TABLE_ROW_CASE(FITSTYPE, TYPE) \
     1058            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
    10591059        case FITSTYPE: { \
    1060                 ps##TYPE value; \
     1060                NATIVETYPE value; \
    10611061                int anynul = 0; \
    10621062                fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
     
    10641064                if (anynul == 0) { \
    10651065                    psMetadataAdd(data,PS_LIST_TAIL, name, \
    1066                                   PS_TYPE_S32, PS_META_PRIMITIVE, \
    1067                                   "", value); \
     1066                                  PS_TYPE_##TYPE, PS_META_PRIMITIVE, \
     1067                                  "", (ps##TYPE)value); \
    10681068                } \
    1069             } \
    1070             break;
     1069                break; \
     1070            }
    10711071
    10721072            switch (typecode) {
    10731073            case TBYTE:
    10741074            case TSHORT:
    1075                 READ_TABLE_ROW_CASE(TLONG, S32)
    1076                 READ_TABLE_ROW_CASE(TFLOAT, F32)
    1077                 READ_TABLE_ROW_CASE(TDOUBLE, F64)
     1075            case TLONGLONG:
     1076                READ_TABLE_ROW_CASE(TLONG, long, S32)
     1077                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
     1078                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
     1079                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
     1080            case TSTRING: {
     1081                    char* value;
     1082                    int anynul = 0;
     1083                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
     1084                                  1, 1, NULL, &value, &anynul, &status);
     1085                    if (anynul == 0) {
     1086                        psMetadataAdd(data,PS_LIST_TAIL, name,
     1087                                      PS_TYPE_PTR, PS_META_STR,
     1088                                      "", value);
     1089                    }
     1090                    break;
     1091                }
    10781092            default:
    10791093                psTrace("psFits.psFitsReadTableRow", 2,
     
    12661280    // get the size of the FITS table
    12671281    long numRows = 0;
    1268     int numCols = 0;
    12691282    fits_get_num_rows(fits->p_fd, &numRows, &status);
    1270     fits_get_num_cols(fits->p_fd, &numCols, &status);
    12711283    if ( status != 0) {
    12721284        char fitsErr[MAX_STRING_LENGTH];
     
    12781290    }
    12791291
    1280     psArray* table = psArrayAlloc(numCols);
     1292    psArray* table = psArrayAlloc(numRows);
    12811293
    12821294    for (int row = 0; row < numRows; row++) {
     
    12931305{
    12941306    int status = 0;
     1307    psMetadataItem* item;
    12951308
    12961309    if (fits == NULL) {
     
    13071320
    13081321    int rows = table->n;
     1322    if (rows < 1) {
     1323        // no table data, what can I do?
     1324        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     1325                PS_ERRORTEXT_psFits_TABLE_EMPTY);
     1326        return false;
     1327    }
    13091328
    13101329    // find all the columns needed
    1311     psArray* columns = psArrayAlloc(16);
     1330    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
    13121331    columns->n=0;
    13131332
    13141333    // find the unique items in the array of metadata 'rows'
    1315     psMetadataItem* item;
    13161334    for (int row=0; row < rows; row++) {
    13171335        psMetadata* rowMeta = table->data[row];
     
    13291347                    }
    13301348                    if (! found) {
    1331                         psArrayAdd(columns, columns->nalloc, item);
     1349                        psArrayAdd(columns, columns->nalloc, psMemIncrRefCounter(item));
    13321350                    }
    13331351                }
     
    13471365    for (int n=0; n < columns->n; n++) {
    13481366        char* fitsType;
    1349         columnNames->data[n] = ((psMetadataItem*)columns->data[n])->name;
     1367        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
    13501368        if ( ! convertPsTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->pType,
    13511369                                          &fitsType)) {
     
    13661384                    &status);
    13671385
     1386    psFree(columnNames);
     1387    psFree(columnTypes);
     1388
    13681389    // fill in the table elements with data
    13691390    for (int n = 0; n < columns->n; n++) {
    13701391        int row;
    13711392        item = columns->data[n];
    1372         psArray* columnItems = psArrayAlloc(table->n);
    1373         for (row = 0; row < table->n; row++) {
    1374             columnItems->data[row] = psMetadataLookup(table->data[row],item->name);
    1375         }
    13761393
    13771394        if (item->type == PS_META_PRIMITIVE) {
     
    13801397            case PS_TYPE_S32:
    13811398                for (row = 0; row < table->n; row++) {
    1382                     col->data.S32[row] = item->data.S32;
     1399                    col->data.S32[row] = psMetadataLookupS32(
     1400                                             table->data[row],item->name,NULL);
    13831401                }
    13841402                fits_write_col_int(fits->p_fd,
    1385                                    n, // column number
     1403                                   n+1, // column number
    13861404                                   1, // firstrow
    13871405                                   1, // firstelem
     
    13921410            case PS_TYPE_F32:
    13931411                for (row = 0; row < table->n; row++) {
    1394                     col->data.F32[row] = item->data.F32;
     1412                    col->data.F32[row] = psMetadataLookupF32(
     1413                                             table->data[row],item->name,NULL);
    13951414                }
    13961415                fits_write_col_flt(fits->p_fd,
    1397                                    n, // column number
     1416                                   n+1, // column number
    13981417                                   1, // firstrow
    13991418                                   1, // firstelem
     
    14021421                                   &status);
    14031422                break;
    1404             case PS_TYPE_S64:
     1423            case PS_TYPE_F64:
    14051424                for (row = 0; row < table->n; row++) {
    1406                     col->data.F64[row] = item->data.F64;
     1425                    col->data.F64[row] = psMetadataLookupF64(
     1426                                             table->data[row],item->name,NULL);
    14071427                }
    14081428                fits_write_col_dbl(fits->p_fd,
    1409                                    n, // column number
     1429                                   n+1, // column number
    14101430                                   1, // firstrow
    14111431                                   1, // firstelem
     
    14141434                                   &status);
    14151435                break;
     1436            case PS_TYPE_BOOL:
     1437                for (row = 0; row < table->n; row++) {
     1438                    col->data.S8[row] = psMetadataLookupBool(
     1439                                            table->data[row],item->name,NULL);
     1440                }
     1441                fits_write_col_log(fits->p_fd,
     1442                                   n+1, // column number
     1443                                   1, // firstrow
     1444                                   1, // firstelem
     1445                                   table->n, // nelements
     1446                                   col->data.S8,
     1447                                   &status);
     1448                break;
    14161449            default:
    14171450                // XXX: error message
    1418                 psFree(col);
    1419                 psFree(columnItems);
    1420                 psFree(columnNames);
    1421                 psFree(columnTypes);
    1422                 psFree(columns);
    1423                 return false;
     1451                break;
    14241452            }
    1425 
     1453            psFree(col);
    14261454        } else if (item->type == PS_META_STR) {
    14271455            psArray* col = psArrayAlloc(table->n);
     
    14361464                               (char**)col->data,
    14371465                               &status);
    1438         }
    1439     }
     1466            psFree(col);
     1467        }
     1468    }
     1469
     1470    psFree(columns);
    14401471
    14411472    return true;
  • trunk/psLib/src/fits/psFits.c

    r2994 r3025  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-01-14 19:40:33 $
     9 *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-01-17 20:58:21 $
    1111 *
    1212 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    165165    switch (type) {
    166166    case PS_TYPE_BOOL:
    167         *fitsType = "1L";
     167        *fitsType = psStringCopy("1L");
    168168        break;
    169169    case PS_TYPE_S32:
    170         *fitsType = "1J";
     170        *fitsType = psStringCopy("1J");
    171171        break;
    172172    case PS_TYPE_F32:
    173         *fitsType = "1E";
     173        *fitsType = psStringCopy("1E");
    174174        break;
    175175    case PS_TYPE_F64:
    176         *fitsType = "1D";
     176        *fitsType = psStringCopy("1D");
    177177        break;
    178178        // XXX: Handle other types, e.g., Vectors, etc.
     
    10281028
    10291029    // the row parameter in the proper range?
    1030     if (row < 1 || row > numRows) {
     1030    if (row < 0 || row >= numRows) {
    10311031        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    10321032                PS_ERRORTEXT_psFits_ROW_INVALID,
     
    10561056        if (status == 0) {
    10571057
    1058             #define READ_TABLE_ROW_CASE(FITSTYPE, TYPE) \
     1058            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
    10591059        case FITSTYPE: { \
    1060                 ps##TYPE value; \
     1060                NATIVETYPE value; \
    10611061                int anynul = 0; \
    10621062                fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
     
    10641064                if (anynul == 0) { \
    10651065                    psMetadataAdd(data,PS_LIST_TAIL, name, \
    1066                                   PS_TYPE_S32, PS_META_PRIMITIVE, \
    1067                                   "", value); \
     1066                                  PS_TYPE_##TYPE, PS_META_PRIMITIVE, \
     1067                                  "", (ps##TYPE)value); \
    10681068                } \
    1069             } \
    1070             break;
     1069                break; \
     1070            }
    10711071
    10721072            switch (typecode) {
    10731073            case TBYTE:
    10741074            case TSHORT:
    1075                 READ_TABLE_ROW_CASE(TLONG, S32)
    1076                 READ_TABLE_ROW_CASE(TFLOAT, F32)
    1077                 READ_TABLE_ROW_CASE(TDOUBLE, F64)
     1075            case TLONGLONG:
     1076                READ_TABLE_ROW_CASE(TLONG, long, S32)
     1077                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
     1078                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
     1079                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
     1080            case TSTRING: {
     1081                    char* value;
     1082                    int anynul = 0;
     1083                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
     1084                                  1, 1, NULL, &value, &anynul, &status);
     1085                    if (anynul == 0) {
     1086                        psMetadataAdd(data,PS_LIST_TAIL, name,
     1087                                      PS_TYPE_PTR, PS_META_STR,
     1088                                      "", value);
     1089                    }
     1090                    break;
     1091                }
    10781092            default:
    10791093                psTrace("psFits.psFitsReadTableRow", 2,
     
    12661280    // get the size of the FITS table
    12671281    long numRows = 0;
    1268     int numCols = 0;
    12691282    fits_get_num_rows(fits->p_fd, &numRows, &status);
    1270     fits_get_num_cols(fits->p_fd, &numCols, &status);
    12711283    if ( status != 0) {
    12721284        char fitsErr[MAX_STRING_LENGTH];
     
    12781290    }
    12791291
    1280     psArray* table = psArrayAlloc(numCols);
     1292    psArray* table = psArrayAlloc(numRows);
    12811293
    12821294    for (int row = 0; row < numRows; row++) {
     
    12931305{
    12941306    int status = 0;
     1307    psMetadataItem* item;
    12951308
    12961309    if (fits == NULL) {
     
    13071320
    13081321    int rows = table->n;
     1322    if (rows < 1) {
     1323        // no table data, what can I do?
     1324        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     1325                PS_ERRORTEXT_psFits_TABLE_EMPTY);
     1326        return false;
     1327    }
    13091328
    13101329    // find all the columns needed
    1311     psArray* columns = psArrayAlloc(16);
     1330    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
    13121331    columns->n=0;
    13131332
    13141333    // find the unique items in the array of metadata 'rows'
    1315     psMetadataItem* item;
    13161334    for (int row=0; row < rows; row++) {
    13171335        psMetadata* rowMeta = table->data[row];
     
    13291347                    }
    13301348                    if (! found) {
    1331                         psArrayAdd(columns, columns->nalloc, item);
     1349                        psArrayAdd(columns, columns->nalloc, psMemIncrRefCounter(item));
    13321350                    }
    13331351                }
     
    13471365    for (int n=0; n < columns->n; n++) {
    13481366        char* fitsType;
    1349         columnNames->data[n] = ((psMetadataItem*)columns->data[n])->name;
     1367        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
    13501368        if ( ! convertPsTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->pType,
    13511369                                          &fitsType)) {
     
    13661384                    &status);
    13671385
     1386    psFree(columnNames);
     1387    psFree(columnTypes);
     1388
    13681389    // fill in the table elements with data
    13691390    for (int n = 0; n < columns->n; n++) {
    13701391        int row;
    13711392        item = columns->data[n];
    1372         psArray* columnItems = psArrayAlloc(table->n);
    1373         for (row = 0; row < table->n; row++) {
    1374             columnItems->data[row] = psMetadataLookup(table->data[row],item->name);
    1375         }
    13761393
    13771394        if (item->type == PS_META_PRIMITIVE) {
     
    13801397            case PS_TYPE_S32:
    13811398                for (row = 0; row < table->n; row++) {
    1382                     col->data.S32[row] = item->data.S32;
     1399                    col->data.S32[row] = psMetadataLookupS32(
     1400                                             table->data[row],item->name,NULL);
    13831401                }
    13841402                fits_write_col_int(fits->p_fd,
    1385                                    n, // column number
     1403                                   n+1, // column number
    13861404                                   1, // firstrow
    13871405                                   1, // firstelem
     
    13921410            case PS_TYPE_F32:
    13931411                for (row = 0; row < table->n; row++) {
    1394                     col->data.F32[row] = item->data.F32;
     1412                    col->data.F32[row] = psMetadataLookupF32(
     1413                                             table->data[row],item->name,NULL);
    13951414                }
    13961415                fits_write_col_flt(fits->p_fd,
    1397                                    n, // column number
     1416                                   n+1, // column number
    13981417                                   1, // firstrow
    13991418                                   1, // firstelem
     
    14021421                                   &status);
    14031422                break;
    1404             case PS_TYPE_S64:
     1423            case PS_TYPE_F64:
    14051424                for (row = 0; row < table->n; row++) {
    1406                     col->data.F64[row] = item->data.F64;
     1425                    col->data.F64[row] = psMetadataLookupF64(
     1426                                             table->data[row],item->name,NULL);
    14071427                }
    14081428                fits_write_col_dbl(fits->p_fd,
    1409                                    n, // column number
     1429                                   n+1, // column number
    14101430                                   1, // firstrow
    14111431                                   1, // firstelem
     
    14141434                                   &status);
    14151435                break;
     1436            case PS_TYPE_BOOL:
     1437                for (row = 0; row < table->n; row++) {
     1438                    col->data.S8[row] = psMetadataLookupBool(
     1439                                            table->data[row],item->name,NULL);
     1440                }
     1441                fits_write_col_log(fits->p_fd,
     1442                                   n+1, // column number
     1443                                   1, // firstrow
     1444                                   1, // firstelem
     1445                                   table->n, // nelements
     1446                                   col->data.S8,
     1447                                   &status);
     1448                break;
    14161449            default:
    14171450                // XXX: error message
    1418                 psFree(col);
    1419                 psFree(columnItems);
    1420                 psFree(columnNames);
    1421                 psFree(columnTypes);
    1422                 psFree(columns);
    1423                 return false;
     1451                break;
    14241452            }
    1425 
     1453            psFree(col);
    14261454        } else if (item->type == PS_META_STR) {
    14271455            psArray* col = psArrayAlloc(table->n);
     
    14361464                               (char**)col->data,
    14371465                               &status);
    1438         }
    1439     }
     1466            psFree(col);
     1467        }
     1468    }
     1469
     1470    psFree(columns);
    14401471
    14411472    return true;
  • trunk/psLib/src/mathtypes/psVector.h

    r2204 r3025  
    1111 *  @author Ross Harman, MHPCC
    1212 *
    13  *  @version $Revision: 1.25 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2004-10-27 00:57:31 $
     13 *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2005-01-17 20:58:21 $
    1515 *
    1616 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    3737
    3838    union {
     39        psBool B;               ///< Boolean data.
    3940        psU8* U8;               ///< Unsigned 8-bit integer data.
    4041        psU16* U16;             ///< Unsigned 16-bit integer data.
     
    6364/** Allocate a vector.
    6465 *
    65  *  Uses psLib memory allocation functions to create a vector collection of 
     66 *  Uses psLib memory allocation functions to create a vector collection of
    6667 *  data as defined by the psType type.
    6768 *
     
    7576/** Reallocate a vector.
    7677 *
    77  *  Uses psLib memory allocation functions to reallocate a vector collection 
    78  *  of data. The vector is reallocated according to the psType type member 
     78 *  Uses psLib memory allocation functions to reallocate a vector collection
     79 *  of data. The vector is reallocated according to the psType type member
    7980 *  contained within the vector.
    8081 *
     
    8990/** Recycle a vector.
    9091 *
    91  *  Uses psLib memory allocation functions to reallocate a vector collection 
    92  *  of data. The vector is reallocated according to the psElemType type 
     92 *  Uses psLib memory allocation functions to reallocate a vector collection
     93 *  of data. The vector is reallocated according to the psElemType type
    9394 *  parameter.
    9495 *
     
    107108/** Copy a vector, converting types.
    108109 *
    109  *  Performs a deep copy of the elements of one psVector to a new psVector, 
     110 *  Performs a deep copy of the elements of one psVector to a new psVector,
    110111 *  converting numeric types to a specified type.
    111112 *
     
    133134/** Creates an array of indices based on sort ordered of array.
    134135 *
    135  *  Sorts a vector and creates an integer array holding indices of 
    136  *  sorted float values based on pre-sort index positions. 
     136 *  Sorts a vector and creates an integer array holding indices of
     137 *  sorted float values based on pre-sort index positions.
    137138 *
    138139 *  @return  psVector*     vector of the indices of sort.
  • trunk/psLib/src/sys/psType.h

    r2763 r3025  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2004-12-21 00:37:51 $
     13*  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-01-17 20:58:21 $
    1515*
    1616*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    7878
    7979typedef psU8 psMaskType;               ///< the C datatype for a mask image
    80 
     80typedef psBool psBOOL;                 ///< allow psBOOL to be used instead of psBool (for macros)
    8181
    8282#define PS_MIN_S8        INT8_MIN      /**< minimum valid psS8 value */
  • trunk/psLib/src/sysUtils/psType.h

    r2763 r3025  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2004-12-21 00:37:51 $
     13*  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-01-17 20:58:21 $
    1515*
    1616*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    7878
    7979typedef psU8 psMaskType;               ///< the C datatype for a mask image
    80 
     80typedef psBool psBOOL;                 ///< allow psBOOL to be used instead of psBool (for macros)
    8181
    8282#define PS_MIN_S8        INT8_MIN      /**< minimum valid psS8 value */
  • trunk/psLib/src/types/psMetadata.c

    r2985 r3025  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.48 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-01-13 23:27:06 $
     14*  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-01-17 20:58:20 $
    1616*
    1717*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    495495psMetadataLookupNumTYPE(F64)
    496496psMetadataLookupNumTYPE(S32)
     497psMetadataLookupNumTYPE(Bool)
    497498
    498499psMetadataItem* psMetadataGet(psMetadata *md, psS32 where)
  • trunk/psLib/src/types/psMetadata.h

    r2975 r3025  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.33 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-01-13 21:09:39 $
     13*  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-01-17 20:58:20 $
    1515*
    1616*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    240240);
    241241
     242/** Find an item in the metadata collection based on key name and return its boolean value.
     243 *
     244 *  Items may be found in the metadata by providing a key. If the key is
     245 *  non-unique, the value of the first item is returned. If the item is not found, zero is
     246 *  returned.
     247 *
     248 * @return psBool : Value of metadata item.
     249 */
     250psBool psMetadataLookupBool(
     251    psMetadata *md,            ///< Metadata collection to lookup metadata item.
     252    const char *key,           ///< Name of metadata key.
     253    psBool *status              ///< Status of lookup.
     254);
     255
    242256/** Find an item in the metadata collection based on key name and return its integer value.
    243257 *
  • trunk/psLib/test/dataIO/tst_psFits.c

    r2993 r3025  
    66*  @author Robert DeSonia, MHPCC
    77*
    8 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
    9 *  @date $Date: 2005-01-14 19:21:55 $
     8*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
     9*  @date $Date: 2005-01-17 20:58:22 $
    1010*
    1111*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    1919
    2020static bool makeMulti(void);  // implicitly tests psFitsSetExtName
     21static bool makeTable(void);
    2122const char* multiFilename = "multi.fits";
     23const char* tableFilename = "table.fits";
     24const int tableNumRows = 10;
    2225
    2326static psS32 tst_psFitsAlloc( void );
     
    2629static psS32 tst_psFitsReadHeader( void );
    2730static psS32 tst_psFitsReadHeaderSet( void );
     31static psS32 tst_psFitsReadTable( void );
    2832
    2933testDescription tests[] = {
     
    3539                              {tst_psFitsMoveExtNum, 803, "psFitsGetSize", 0, true},
    3640                              {tst_psFitsReadHeader, 804, "psFitsReadHeader", 0, false},
    37                               {tst_psFitsReadHeaderSet, 0, "psFitsReadHeaderSet", 0, false},
     41                              {tst_psFitsReadHeaderSet,805, "psFitsReadHeaderSet", 0, false},
     42                              {tst_psFitsReadTable,809, "psFitsReadTable", 0, false},
    3843                              {NULL}
    3944                          };
     
    110115}
    111116
     117bool makeTable(void)
     118{
     119
     120    if (access(tableFilename, F_OK) != 0) {
     121        psFits* fitsFile = psFitsAlloc(tableFilename);
     122
     123        if (fitsFile == NULL) {
     124            psError(PS_ERR_UNKNOWN, false,
     125                    "Could not create 'table' FITS file.");
     126            return false;
     127        }
     128
     129        // make the PHU an image (per FITS standard, it must be)
     130        psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
     131
     132        if (! psFitsWriteImage(fitsFile,NULL,image,1) ) {
     133            psError(PS_ERR_UNKNOWN, false,
     134                    "Could not write PHU image.");
     135            return false;
     136        }
     137
     138        psFree(image);
     139
     140        // build a table structure
     141        psArray* table = psArrayAlloc(tableNumRows);
     142        table->n = 0;
     143        for (int row = 0; row < tableNumRows; row++) {
     144            psMetadata* header = psMetadataAlloc();
     145
     146            psMetadataAdd(header,PS_LIST_TAIL, "MYINT",
     147                          PS_TYPE_S32, PS_META_PRIMITIVE,
     148                          "psS32 Item", (psS32)row);
     149
     150            psMetadataAdd(header,PS_LIST_TAIL, "MYFLT",
     151                          PS_TYPE_F32, PS_META_PRIMITIVE,
     152                          "psF32 Item", (float)(1.0f/(float)(1+row)));
     153
     154            psMetadataAdd(header,PS_LIST_TAIL, "MYDBL",
     155                          PS_TYPE_F64, PS_META_PRIMITIVE,
     156                          "psF64 Item", (double)(1.0/(double)(1+row)));
     157
     158            psMetadataAdd(header,PS_LIST_TAIL, "MYBOOL",
     159                          PS_TYPE_BOOL, PS_META_PRIMITIVE,
     160                          "psBool Item",
     161                          (row%2 == 0));
     162
     163            psArrayAdd(table,0,header);
     164        }
     165
     166        psFitsWriteTable(fitsFile, NULL, table, "table-1");
     167
     168        psFree(table);
     169        psFree(fitsFile);
     170    }
     171
     172    return true;
     173}
     174
    112175psS32 tst_psFitsAlloc( void )
    113176{
     
    176239    psFits* fits = psFitsAlloc(multiFilename);
    177240
     241    if (fits == NULL) {
     242        psError(PS_ERR_UNKNOWN, false,
     243                "psFitsAlloc returned NULL on existing file.");
     244        return 1;
     245    }
     246
    178247    int numHDUs = psFitsGetSize(fits);
    179248
     
    290359
    291360    psFits* fits = psFitsAlloc(multiFilename);
     361
     362    if (fits == NULL) {
     363        psError(PS_ERR_UNKNOWN, false,
     364                "psFitsAlloc returned NULL on existing file.");
     365        return 1;
     366    }
    292367
    293368    int numHDUs = psFitsGetSize(fits);
     
    489564    psFits* fits = psFitsAlloc(multiFilename);
    490565
     566    if (fits == NULL) {
     567        psError(PS_ERR_UNKNOWN, false,
     568                "psFitsAlloc returned NULL on existing file.");
     569        return 1;
     570    }
     571
    491572    int numHDUs = psFitsGetSize(fits);
    492573
     
    594675    psFits* fits = psFitsAlloc(multiFilename);
    595676
     677    if (fits == NULL) {
     678        psError(PS_ERR_UNKNOWN, false,
     679                "psFitsAlloc returned NULL on existing file.");
     680        return 1;
     681    }
     682
    596683    int numHDUs = psFitsGetSize(fits);
    597684
     
    701788    return 0;
    702789}
     790
     791static psS32 tst_psFitsReadTable( void )
     792{
     793
     794
     795    if (! makeTable() ) {
     796        return 1;
     797    }
     798
     799    psFits* fits = psFitsAlloc(tableFilename);
     800
     801    if (fits == NULL) {
     802        psError(PS_ERR_UNKNOWN, false,
     803                "psFitsAlloc returned NULL on existing file.");
     804        return 1;
     805    }
     806
     807    psFitsMoveExtNum(fits,1,false);
     808
     809    psArray* table = psFitsReadTable(fits);
     810
     811    if (table == NULL) {
     812        psError(PS_ERR_UNKNOWN, false,
     813                "psFitsReadTable returned NULL unexpectedly.");
     814        return 2;
     815    }
     816
     817    if (table->n != tableNumRows) {
     818        psError(PS_ERR_UNKNOWN, false,
     819                "Expected %d rows, but read %d.",
     820                tableNumRows, table->n);
     821        return 3;
     822    }
     823
     824
     825    for (int row = 0; row < table->n; row++) {
     826        psMetadata* rowData = table->data[row];
     827
     828        psS32 intItem = psMetadataLookupS32(rowData, "MYINT",NULL);
     829        psF32 fltItem = psMetadataLookupF32(rowData, "MYFLT",NULL);
     830        psF64 dblItem = psMetadataLookupF64(rowData, "MYDBL",NULL);
     831        psBool boolItem = psMetadataLookupBool(rowData, "MYBOOL",NULL);
     832
     833        if (intItem != row) {
     834            psError(PS_ERR_UNKNOWN, true,
     835                    "Failed to retrieve psS32 metadata item from file.  Got %d vs %d",
     836                    intItem, row);
     837            return 20;
     838        }
     839
     840        if (fabsf(fltItem - 1.0f/(float)(1+row)) > FLT_EPSILON) {
     841            psError(PS_ERR_UNKNOWN, true,
     842                    "Failed to retrieve psF32 metadata item from file.  Got %f vs %f",
     843                    fltItem,1.0f/(float)(1+row));
     844            return 21;
     845        }
     846
     847        if (abs(dblItem - 1.0/(double)(1+row)) > DBL_EPSILON) {
     848            psError(PS_ERR_UNKNOWN, true,
     849                    "Failed to retrieve psF64 metadata item from file.  Got %g vs %g",
     850                    dblItem, 1.0/(double)(1+row));
     851            return 22;
     852        }
     853
     854        if (boolItem != (row%2 == 0)) {
     855            psError(PS_ERR_UNKNOWN, true,
     856                    "Failed to retrieve psBool metadata item from file.");
     857            return 23;
     858        }
     859
     860    }
     861
     862    psFree(table);
     863    psFree(fits);
     864
     865    psArray* nullTest = psFitsReadTable(NULL);
     866
     867    if (nullTest != NULL || psErrorGetStackSize() != 1) {
     868        psError(PS_ERR_UNKNOWN, true,
     869                "psFitsReadTable returned non-NULL when given NULL.");
     870        return 30;
     871    }
     872
     873    return 0;
     874}
  • trunk/psLib/test/dataIO/verified/tst_psFits.stderr

    r2993 r3025  
    9191---> TESTPOINT PASSED (psImage{psFitsReadHeaderSet} | tst_psFits.c)
    9292
     93/***************************** TESTPOINT ******************************************\
     94*             TestFile: tst_psFits.c                                               *
     95*            TestPoint: psImage{psFitsReadTable}                                   *
     96*             TestType: Positive                                                   *
     97\**********************************************************************************/
     98
     99<DATE><TIME>|<HOST>|E|psFitsReadTable (psFits.c:<LINENO>)
     100    The input psFits object can not NULL.
     101
     102---> TESTPOINT PASSED (psImage{psFitsReadTable} | tst_psFits.c)
     103
  • trunk/psLib/test/fileUtils/tst_psFits.c

    r2993 r3025  
    66*  @author Robert DeSonia, MHPCC
    77*
    8 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
    9 *  @date $Date: 2005-01-14 19:21:55 $
     8*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
     9*  @date $Date: 2005-01-17 20:58:22 $
    1010*
    1111*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    1919
    2020static bool makeMulti(void);  // implicitly tests psFitsSetExtName
     21static bool makeTable(void);
    2122const char* multiFilename = "multi.fits";
     23const char* tableFilename = "table.fits";
     24const int tableNumRows = 10;
    2225
    2326static psS32 tst_psFitsAlloc( void );
     
    2629static psS32 tst_psFitsReadHeader( void );
    2730static psS32 tst_psFitsReadHeaderSet( void );
     31static psS32 tst_psFitsReadTable( void );
    2832
    2933testDescription tests[] = {
     
    3539                              {tst_psFitsMoveExtNum, 803, "psFitsGetSize", 0, true},
    3640                              {tst_psFitsReadHeader, 804, "psFitsReadHeader", 0, false},
    37                               {tst_psFitsReadHeaderSet, 0, "psFitsReadHeaderSet", 0, false},
     41                              {tst_psFitsReadHeaderSet,805, "psFitsReadHeaderSet", 0, false},
     42                              {tst_psFitsReadTable,809, "psFitsReadTable", 0, false},
    3843                              {NULL}
    3944                          };
     
    110115}
    111116
     117bool makeTable(void)
     118{
     119
     120    if (access(tableFilename, F_OK) != 0) {
     121        psFits* fitsFile = psFitsAlloc(tableFilename);
     122
     123        if (fitsFile == NULL) {
     124            psError(PS_ERR_UNKNOWN, false,
     125                    "Could not create 'table' FITS file.");
     126            return false;
     127        }
     128
     129        // make the PHU an image (per FITS standard, it must be)
     130        psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
     131
     132        if (! psFitsWriteImage(fitsFile,NULL,image,1) ) {
     133            psError(PS_ERR_UNKNOWN, false,
     134                    "Could not write PHU image.");
     135            return false;
     136        }
     137
     138        psFree(image);
     139
     140        // build a table structure
     141        psArray* table = psArrayAlloc(tableNumRows);
     142        table->n = 0;
     143        for (int row = 0; row < tableNumRows; row++) {
     144            psMetadata* header = psMetadataAlloc();
     145
     146            psMetadataAdd(header,PS_LIST_TAIL, "MYINT",
     147                          PS_TYPE_S32, PS_META_PRIMITIVE,
     148                          "psS32 Item", (psS32)row);
     149
     150            psMetadataAdd(header,PS_LIST_TAIL, "MYFLT",
     151                          PS_TYPE_F32, PS_META_PRIMITIVE,
     152                          "psF32 Item", (float)(1.0f/(float)(1+row)));
     153
     154            psMetadataAdd(header,PS_LIST_TAIL, "MYDBL",
     155                          PS_TYPE_F64, PS_META_PRIMITIVE,
     156                          "psF64 Item", (double)(1.0/(double)(1+row)));
     157
     158            psMetadataAdd(header,PS_LIST_TAIL, "MYBOOL",
     159                          PS_TYPE_BOOL, PS_META_PRIMITIVE,
     160                          "psBool Item",
     161                          (row%2 == 0));
     162
     163            psArrayAdd(table,0,header);
     164        }
     165
     166        psFitsWriteTable(fitsFile, NULL, table, "table-1");
     167
     168        psFree(table);
     169        psFree(fitsFile);
     170    }
     171
     172    return true;
     173}
     174
    112175psS32 tst_psFitsAlloc( void )
    113176{
     
    176239    psFits* fits = psFitsAlloc(multiFilename);
    177240
     241    if (fits == NULL) {
     242        psError(PS_ERR_UNKNOWN, false,
     243                "psFitsAlloc returned NULL on existing file.");
     244        return 1;
     245    }
     246
    178247    int numHDUs = psFitsGetSize(fits);
    179248
     
    290359
    291360    psFits* fits = psFitsAlloc(multiFilename);
     361
     362    if (fits == NULL) {
     363        psError(PS_ERR_UNKNOWN, false,
     364                "psFitsAlloc returned NULL on existing file.");
     365        return 1;
     366    }
    292367
    293368    int numHDUs = psFitsGetSize(fits);
     
    489564    psFits* fits = psFitsAlloc(multiFilename);
    490565
     566    if (fits == NULL) {
     567        psError(PS_ERR_UNKNOWN, false,
     568                "psFitsAlloc returned NULL on existing file.");
     569        return 1;
     570    }
     571
    491572    int numHDUs = psFitsGetSize(fits);
    492573
     
    594675    psFits* fits = psFitsAlloc(multiFilename);
    595676
     677    if (fits == NULL) {
     678        psError(PS_ERR_UNKNOWN, false,
     679                "psFitsAlloc returned NULL on existing file.");
     680        return 1;
     681    }
     682
    596683    int numHDUs = psFitsGetSize(fits);
    597684
     
    701788    return 0;
    702789}
     790
     791static psS32 tst_psFitsReadTable( void )
     792{
     793
     794
     795    if (! makeTable() ) {
     796        return 1;
     797    }
     798
     799    psFits* fits = psFitsAlloc(tableFilename);
     800
     801    if (fits == NULL) {
     802        psError(PS_ERR_UNKNOWN, false,
     803                "psFitsAlloc returned NULL on existing file.");
     804        return 1;
     805    }
     806
     807    psFitsMoveExtNum(fits,1,false);
     808
     809    psArray* table = psFitsReadTable(fits);
     810
     811    if (table == NULL) {
     812        psError(PS_ERR_UNKNOWN, false,
     813                "psFitsReadTable returned NULL unexpectedly.");
     814        return 2;
     815    }
     816
     817    if (table->n != tableNumRows) {
     818        psError(PS_ERR_UNKNOWN, false,
     819                "Expected %d rows, but read %d.",
     820                tableNumRows, table->n);
     821        return 3;
     822    }
     823
     824
     825    for (int row = 0; row < table->n; row++) {
     826        psMetadata* rowData = table->data[row];
     827
     828        psS32 intItem = psMetadataLookupS32(rowData, "MYINT",NULL);
     829        psF32 fltItem = psMetadataLookupF32(rowData, "MYFLT",NULL);
     830        psF64 dblItem = psMetadataLookupF64(rowData, "MYDBL",NULL);
     831        psBool boolItem = psMetadataLookupBool(rowData, "MYBOOL",NULL);
     832
     833        if (intItem != row) {
     834            psError(PS_ERR_UNKNOWN, true,
     835                    "Failed to retrieve psS32 metadata item from file.  Got %d vs %d",
     836                    intItem, row);
     837            return 20;
     838        }
     839
     840        if (fabsf(fltItem - 1.0f/(float)(1+row)) > FLT_EPSILON) {
     841            psError(PS_ERR_UNKNOWN, true,
     842                    "Failed to retrieve psF32 metadata item from file.  Got %f vs %f",
     843                    fltItem,1.0f/(float)(1+row));
     844            return 21;
     845        }
     846
     847        if (abs(dblItem - 1.0/(double)(1+row)) > DBL_EPSILON) {
     848            psError(PS_ERR_UNKNOWN, true,
     849                    "Failed to retrieve psF64 metadata item from file.  Got %g vs %g",
     850                    dblItem, 1.0/(double)(1+row));
     851            return 22;
     852        }
     853
     854        if (boolItem != (row%2 == 0)) {
     855            psError(PS_ERR_UNKNOWN, true,
     856                    "Failed to retrieve psBool metadata item from file.");
     857            return 23;
     858        }
     859
     860    }
     861
     862    psFree(table);
     863    psFree(fits);
     864
     865    psArray* nullTest = psFitsReadTable(NULL);
     866
     867    if (nullTest != NULL || psErrorGetStackSize() != 1) {
     868        psError(PS_ERR_UNKNOWN, true,
     869                "psFitsReadTable returned non-NULL when given NULL.");
     870        return 30;
     871    }
     872
     873    return 0;
     874}
  • trunk/psLib/test/fileUtils/verified/tst_psFits.stderr

    r2993 r3025  
    9191---> TESTPOINT PASSED (psImage{psFitsReadHeaderSet} | tst_psFits.c)
    9292
     93/***************************** TESTPOINT ******************************************\
     94*             TestFile: tst_psFits.c                                               *
     95*            TestPoint: psImage{psFitsReadTable}                                   *
     96*             TestType: Positive                                                   *
     97\**********************************************************************************/
     98
     99<DATE><TIME>|<HOST>|E|psFitsReadTable (psFits.c:<LINENO>)
     100    The input psFits object can not NULL.
     101
     102---> TESTPOINT PASSED (psImage{psFitsReadTable} | tst_psFits.c)
     103
Note: See TracChangeset for help on using the changeset viewer.