IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

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

added test for psFitsReadTable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.