IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 4, 2006, 9:52:55 AM (20 years ago)
Author:
desonia
Message:

modified API to match current SDRS.

File:
1 edited

Legend:

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

    r6484 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-24 23:43:15 $
     9 *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-04-04 19:52:42 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    812812}
    813813
     814bool psFitsInsertTable(psFits* fits,
     815                       const psMetadata* header,
     816                       const psArray* table,
     817                       bool after)
     818{
     819    int status = 0;
     820
     821    if (fits == NULL) {
     822        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     823                PS_ERRORTEXT_psFits_NULL);
     824        return false;
     825    }
     826
     827    if (table == NULL) {
     828        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     829                PS_ERRORTEXT_psFits_IMAGE_NULL);
     830        return false;
     831    }
     832
     833    int rows = table->n;
     834    if (rows < 1) {
     835        // no table data, what can I do?
     836        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     837                PS_ERRORTEXT_psFits_TABLE_EMPTY);
     838        return false;
     839    }
     840
     841    // find all the columns needed
     842    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->n);
     843    columns->n=0;
     844
     845    // find the unique items in the array of metadata 'rows'
     846    psMetadataItem* item;
     847    for (int row=0; row < rows; row++) {
     848        psMetadata* rowMeta = table->data[row];
     849        if (rowMeta != NULL) {
     850            psListIterator* iter = psListIteratorAlloc(rowMeta->list,
     851                                   PS_LIST_HEAD,true);
     852            while ( (item=psListGetAndIncrement(iter)) != NULL) {
     853                if (PS_DATA_IS_PRIMITIVE(item->type) ||
     854                        item->type == PS_DATA_STRING ||
     855                        item->type == PS_DATA_VECTOR) {
     856                    bool found = false;
     857                    psMetadataItem* fItem = NULL;
     858                    int n;
     859                    for (n=0; n < columns->n && ! found; n++) {
     860                        fItem = (psMetadataItem*)(columns->data[n]);
     861                        if (strcmp(item->name, fItem->name) == 0) {
     862                            found = true;
     863                            break;
     864                        }
     865                    }
     866                    if (! found) {
     867                        psArrayAdd(columns, columns->nalloc, item);
     868                    } else if (item->type == PS_DATA_STRING &&
     869                               strlen(fItem->data.V) < strlen(item->data.V)) {
     870                        // got to keep the longest string value as to know what size to create the table column
     871                        psMemDecrRefCounter(fItem);
     872                        columns->data[n] = psMemIncrRefCounter(item);
     873                        columns->n++;
     874
     875                    } else if (item->type == PS_DATA_VECTOR &&
     876                               ((psVector*)(fItem->data.V))->n < ((psVector*)(item->data.V))->n) {
     877                        psMemDecrRefCounter(fItem);
     878                        columns->data[n] = psMemIncrRefCounter(item);
     879                        columns->n++;
     880                    }
     881                } else {
     882                    // unsupported type -- treating as an error
     883                    psError(PS_ERR_BAD_PARAMETER_TYPE, true,
     884                            "Unsupported data type (%d) for Metadata Item '%s' in row %d.",
     885                            item->type, item->name, row);
     886                    psFree(iter);
     887                    psFree(columns);
     888                    return false;
     889                }
     890            }
     891            psFree(iter);
     892        }
     893    }
     894
     895    if (columns->n == 0) { // no table columns found
     896        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     897                "Did not find any column data to write to a table.");
     898        psFree(columns);
     899        return false;
     900    }
     901
     902    //create list of column names and types.
     903    columns->n--;
     904    psArray* columnNames = psArrayAlloc(columns->n);
     905    psArray* columnTypes = psArrayAlloc(columns->n);
     906    for (int n=0; n < columns->n; n++) {
     907        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
     908        columnNames->n++;
     909        columnTypes->n++;
     910        if ( ! getMetadataTForm((psMetadataItem*)columns->data[n],
     911                                (char**)&(columnTypes->data[n]),1) ) {
     912            psError(PS_ERR_UNKNOWN, true,
     913                    "Failed to determine the FITS data type of '%s' (type=%d).",
     914                    columnNames->data[n],
     915                    ((psMetadataItem*)columns->data[n])->type);
     916            psFree(columns);
     917            psFree(columnNames);
     918            psFree(columnTypes);
     919            return false;
     920        }
     921    }
     922
     923    psString extname = NULL;
     924    if (header != NULL) {
     925        extname = psMetadataLookupStr(NULL, header, "EXTNAME");
     926        if ( extname == NULL) {
     927            extname = psMetadataLookupStr(NULL, header, "HDUNAME");
     928        }
     929    }
     930
     931    if (! after) {
     932        if (psFitsGetExtNum(fits) == 0) {
     933            // set status to signal fits_insert_img to insert a new primary HDU
     934            status = PREPEND_PRIMARY;
     935        } else {
     936            // move back one to perform an insert after the previous HDU
     937            psFitsMoveExtNum(fits, -1, true);
     938        }
     939    }
     940
     941    fits_insert_btbl(fits->fd,
     942                     table->n, // number of rows in table
     943                     columns->n, // number of columns in table
     944                     (char**)columnNames->data, // names of the columns
     945                     (char**)columnTypes->data, // format of the columns
     946                     NULL, // physical unit of columns
     947                     extname, // extension name
     948                     0,
     949                     &status);
     950
     951    psFree(columnNames);
     952    psFree(columnTypes);
     953
     954
     955    // fill in the table elements with data
     956    for (int n = 0; n < columns->n; n++) {
     957        int row;
     958        item = columns->data[n];
     959        if (PS_DATA_IS_PRIMITIVE(item->type) ) {
     960            psVector* col = psVectorAlloc(table->n, item->type);
     961            int dataSize = PSELEMTYPE_SIZEOF(item->type);
     962            int dataType;
     963            convertPsTypeToFits(item->type, NULL,NULL,&dataType);
     964            for (row = 0; row < table->n; row++) {
     965                psMetadataItem* dataItem = psMetadataLookup(
     966                                               table->data[row],
     967                                               item->name);
     968                memcpy(&col->data.U8[row*dataSize],&dataItem->data,dataSize);
     969            }
     970            fits_write_col(fits->fd,
     971                           dataType,
     972                           n+1, // column number
     973                           1, // firstrow
     974                           1, // firstelem
     975                           table->n, // nelements
     976                           col->data.U8,
     977                           &status);
     978            psFree(col);
     979        } else if (item->type == PS_DATA_STRING) {
     980            psArray* colArray = psArrayAlloc(table->n);
     981            for (row = 0; row < table->n; row++) {
     982                colArray->data[row] = psStringCopy(psMetadataLookupStr(NULL,
     983                                                   table->data[row],
     984                                                   item->name));
     985                colArray->n++;
     986            }
     987            fits_write_col_str(fits->fd,
     988                               n+1,
     989                               1,
     990                               1,
     991                               table->n,
     992                               (char**)colArray->data,
     993                               &status);
     994            psFree(colArray);
     995        } else if (item->type == PS_DATA_VECTOR) {
     996            psVector* vec = (psVector*)(item->data.V);
     997            psVector* col = psVectorAlloc(table->n*vec->n, vec->type.type);
     998            int dataSize = PSELEMTYPE_SIZEOF(vec->type.type)*vec->n;
     999            int dataType;
     1000            convertPsTypeToFits(vec->type.type, NULL,NULL,&dataType);
     1001            for (row = 0; row < table->n; row++) {
     1002                psMetadataItem* dataItem = psMetadataLookup(
     1003                                               table->data[row],
     1004                                               item->name);
     1005                memcpy(&col->data.U8[row*dataSize],
     1006                       ((psVector*)(dataItem->data.V))->data.U8,
     1007                       dataSize);
     1008            }
     1009            fits_write_col(fits->fd,
     1010                           dataType,
     1011                           n+1, // column number
     1012                           1, // firstrow
     1013                           1, // firstelem
     1014                           table->n*vec->n, // nelements
     1015                           col->data.U8,
     1016                           &status);
     1017            psFree(col);
     1018        }
     1019        if (status != 0) {
     1020            char fitsErr[MAX_STRING_LENGTH];
     1021            (void)fits_get_errstatus(status, fitsErr);
     1022            psError(PS_ERR_IO, true,
     1023                    PS_ERRORTEXT_psFits_WRITE_FAILED,
     1024                    fitsErr);
     1025            psFree(columns);
     1026            return false;
     1027        }
     1028
     1029    }
     1030
     1031    psFree(columns);
     1032
     1033    return true;
     1034}
     1035
    8141036bool psFitsUpdateTable(psFits* fits,
    8151037                       const psMetadata* data,
Note: See TracChangeset for help on using the changeset viewer.