IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 25, 2006, 4:59:58 PM (20 years ago)
Author:
Paul Price
Message:

Fixing TFORM for vectors.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/fits/psFitsTable.c

    r7980 r7981  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-07-26 02:19:47 $
     9 *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-07-26 02:59:58 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    456456        return 'A';
    457457    default:
     458        psError(PS_ERR_UNKNOWN, true, "Unknown type: %x\n", type);
    458459        return '?';
    459460    }
     
    571572        columnNames->data[i] = psMemIncrRefCounter(colSpecItem->name);
    572573        psString colType = NULL;        // The column type
    573         psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->type));
     574        if (spec->type == PS_DATA_VECTOR) {
     575            psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->vectorType));
     576        } else {
     577            psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->type));
     578        }
    574579        columnTypes->data[i] = colType;
    575580    }
     
    612617    psFree(columnTypes);
    613618
     619    if (status != 0) {
     620        char fitsErr[MAX_STRING_LENGTH];
     621        fits_get_errstatus(status, fitsErr);
     622        psError(PS_ERR_LOCATION_INVALID, true, "Unable to create FITS table with %d columns and %d rows:",
     623                numColumns, table->n, fitsErr);
     624        psFree(colSpecsIter);
     625        psFree(colSpecs);
     626        return false;
     627    }
     628
    614629    // Write header
    615630    if (header && !psFitsWriteHeader(fits, header)) {
    616631        psError(PS_ERR_IO, false, "Unable to write FITS header.\n");
     632        psFree(colSpecsIter);
     633        psFree(colSpecs);
    617634        return false;
    618635    }
     
    646663                           &status);
    647664            psFree(columnData);
    648             continue;
    649         }
    650 
    651         switch (spec->type) {
    652         case PS_DATA_STRING: {
    653                 psArray *strings = psArrayAlloc(table->n); // Array of strings
    654                 strings->n = table->n;
    655                 for (long i = 0; i < table->n; i++) {
    656                     psMetadata *row = table->data[i]; // The row of interest
    657                     strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row, colSpecItem->name));
     665        } else {
     666            switch (spec->type) {
     667            case PS_DATA_STRING: {
     668                    psArray *strings = psArrayAlloc(table->n); // Array of strings
     669                    strings->n = table->n;
     670                    for (long i = 0; i < table->n; i++) {
     671                        psMetadata *row = table->data[i]; // The row of interest
     672                        strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row,
     673                                                               colSpecItem->name));
     674                    }
     675                    fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status);
     676                    psFree(strings);
     677                    break;
    658678                }
    659                 fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status);
    660                 psFree(strings);
    661                 break;
     679            case PS_DATA_VECTOR: {
     680                    psVector *columnData = psVectorAlloc(spec->size * table->n, spec->vectorType);
     681                    psVectorInit(columnData, 0);
     682                    size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes
     683                    for (long i = 0; i < table->n; i++) {
     684                        psMetadata *row = table->data[i]; // The row of interest
     685                        psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name);
     686                        if (dataItem->type != PS_DATA_VECTOR) {
     687                            // Just in case --- get a zero instead of some weird result
     688                            continue;
     689                        }
     690                        psVector *vector = dataItem->data.V;
     691                        memcpy(&columnData->data.U8[i * dataSize], vector->data.U8, dataSize);
     692                    }
     693
     694                    int fitsDataType;           // Data type for cfitsio
     695                    p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType);
     696                    fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size,
     697                                   columnData->data.U8, &status);
     698                    psFree(columnData);
     699                    break;
     700                }
     701            default:
     702                psAbort(__func__, "Should never get here.\n");
    662703            }
    663         case PS_DATA_VECTOR: {
    664                 psVector *columnData = psVectorAlloc(spec->size * table->n, spec->vectorType);
    665                 psVectorInit(columnData, 0);
    666                 size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes
    667                 for (long i = 0; i < table->n; i++) {
    668                     psMetadata *row = table->data[i]; // The row of interest
    669                     psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name);
    670                     if (dataItem->type != PS_DATA_VECTOR) {
    671                         // Just in case --- get a zero instead of some weird result
    672                         continue;
    673                     }
    674                     psVector *vector = dataItem->data.V;
    675                     memcpy(&columnData->data.U8[i * dataSize], vector->data.U8, dataSize);
    676                 }
    677 
    678                 int fitsDataType;           // Data type for cfitsio
    679                 p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType);
    680                 fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size, columnData->data.U8,
    681                                &status);
    682                 psFree(columnData);
    683                 break;
    684             }
    685         default:
    686             psAbort(__func__, "Should never get here.\n");
     704        }
     705
     706        // Check error status from writing column
     707        if (status != 0) {
     708            char fitsErr[MAX_STRING_LENGTH];
     709            fits_get_errstatus(status, fitsErr);
     710            psError(PS_ERR_LOCATION_INVALID, true, "Unable to write column %d of FITS table:",
     711                    colNum, fitsErr);
     712            psFree(colSpecsIter);
     713            psFree(colSpecs);
     714            return false;
    687715        }
    688716    }
Note: See TracChangeset for help on using the changeset viewer.