IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6767


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

modified API to match current SDRS.

Location:
trunk/psLib
Files:
12 edited

Legend:

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

    r6354 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.52 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-08 01:03:34 $
     9 *  @version $Revision: 1.53 $ $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
     
    166166            psFits* fits = psAlloc(sizeof(psFits));
    167167        fits->fd = fptr;
     168        fits->writable = (iomode == READWRITE);
    168169        psMemSetDeallocator(fits,(psFreeFunc)fitsFree);
    169170
     
    252253            return false;
    253254        }
    254 
    255         return psFitsMoveExtNum(fits,psFitsGetSize(fits),false);
     255        int size = psFitsGetSize(fits);
     256        if (size == 0) { // empty file -- no action needed
     257            return true;
     258        } else {
     259            return psFitsMoveExtNum(fits,size-1,false);
     260        }
    256261    }
    257262
     
    329334        }
    330335
     336        if (! fits->writable) {
     337            psError(PS_ERR_IO, true,
     338                    PS_ERRORTEXT_psFits_NOT_WRITABLE);
     339            return false;
     340        }
     341
    331342        // move to the specified HDU
    332343        if (! psFitsMoveExtNum(fits,extnum,relative) ) {
     
    361372        }
    362373
     374        if (! fits->writable) {
     375            psError(PS_ERR_IO, true,
     376                    PS_ERRORTEXT_psFits_NOT_WRITABLE);
     377            return false;
     378        }
     379
    363380        // move to the specified HDU
    364381        if (! psFitsMoveExtName(fits,extname) ) {
     
    442459            psError(PS_ERR_BAD_PARAMETER_NULL, true,
    443460                    PS_ERRORTEXT_psFits_NULL);
     461            return PS_FITS_TYPE_NONE;
     462        }
     463
     464        if (! fits->writable) {
     465            psError(PS_ERR_IO, true,
     466                    PS_ERRORTEXT_psFits_NOT_WRITABLE);
    444467            return PS_FITS_TYPE_NONE;
    445468        }
  • trunk/psLib/src/fits/psFits.h

    r6354 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-08 01:03:34 $
     9 *  @version $Revision: 1.24 $ $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
     
    4949{
    5050    fitsfile* fd;                      ///< the CFITSIO fits files handle.
     51    bool writable;                     ///< Is the file writable?
    5152}
    5253psFits;
  • trunk/psLib/src/fits/psFitsHeader.c

    r6354 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-08 01:03:34 $
     9 *  @version $Revision: 1.3 $ $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
     
    9090            switch (keyType) {
    9191            case 'X': // bit
     92            case 'B': // byte
     93                success = psMetadataAdd(out,
     94                                        PS_LIST_TAIL,
     95                                        keyName,
     96                                        PS_DATA_S8 | PS_META_DUPLICATE_OK,
     97                                        keyComment,
     98                                        atoi(keyValue));
     99                break;
    92100            case 'I': // short int.
     101                success = psMetadataAdd(out,
     102                                        PS_LIST_TAIL,
     103                                        keyName,
     104                                        PS_DATA_S16 | PS_META_DUPLICATE_OK,
     105                                        keyComment,
     106                                        (psS16)atoi(keyValue));
     107                break;
    93108            case 'J': // int.
    94             case 'B': // byte
    95109                success = psMetadataAdd(out,
    96110                                        PS_LIST_TAIL,
     
    100114                                        atoi(keyValue));
    101115                break;
    102             case 'U': // unsigned int. may not fit in a psS32
    103             case 'K': // long int. can't all fit in a psS32
     116            case 'U': // unsigned int.
     117                success = psMetadataAdd(out,
     118                                        PS_LIST_TAIL,
     119                                        keyName,
     120                                        PS_DATA_U32 | PS_META_DUPLICATE_OK,
     121                                        keyComment,
     122                                        atol(keyValue));
     123                break;
     124
     125            case 'K': // long int. can't all fit in a psS32, put in psF64
    104126            case 'F':
    105127                success = psMetadataAdd(out,
     
    167189}
    168190
    169 psMetadata* psFitsReadHeaderSet(const psFits* fits)
     191psMetadata* psFitsReadHeaderSet(psMetadata* out, const psFits* fits)
    170192{
    171193    if (fits == NULL) {
    172194        psError(PS_ERR_BAD_PARAMETER_NULL, true,
    173195                PS_ERRORTEXT_psFits_NULL);
     196        psFree(out);
    174197        return NULL;
    175198    }
    176199
    177     psMetadata* out = psMetadataAlloc();
     200    if (out == NULL) {
     201        out = psMetadataAlloc();
     202    }
    178203
    179204    int size = psFitsGetSize(fits);
     
    244269                break;
    245270            }
     271        case PS_DATA_S8:
     272            fits_update_key(fits->fd,
     273                            TBYTE,
     274                            item->name,
     275                            &item->data.S8,
     276                            item->comment,
     277                            &status);
     278            break;
     279        case PS_DATA_S16:
     280            fits_update_key(fits->fd,
     281                            TSHORT,
     282                            item->name,
     283                            &item->data.S16,
     284                            item->comment,
     285                            &status);
     286            break;
    246287        case PS_DATA_S32:
    247288            fits_update_key(fits->fd,
     
    249290                            item->name,
    250291                            &item->data.S32,
     292                            item->comment,
     293                            &status);
     294            break;
     295        case PS_DATA_U8: {
     296                unsigned short int temp = item->data.U8;
     297                fits_update_key(fits->fd,
     298                                TUSHORT,
     299                                item->name,
     300                                &temp,
     301                                item->comment,
     302                                &status);
     303            }
     304            break;
     305        case PS_DATA_U16:
     306            fits_update_key(fits->fd,
     307                            TUSHORT,
     308                            item->name,
     309                            &item->data.U16,
     310                            item->comment,
     311                            &status);
     312            break;
     313        case PS_DATA_U32:
     314            fits_update_key(fits->fd,
     315                            TUINT,
     316                            item->name,
     317                            &item->data.U32,
    251318                            item->comment,
    252319                            &status);
     
    290357    }
    291358
     359    psFree(iter);
     360
    292361    return true;
    293362}
    294363
     364bool psFitsHeaderValidate(psMetadata *header)
     365{
     366    bool valid = true;
     367    int status;
     368
     369    if (header == NULL) {
     370        psError(PS_ERR_BAD_PARAMETER_NULL, true,
     371                PS_ERRORTEXT_psFits_METADATA_NULL);
     372        return false;
     373    }
     374
     375    //transverse the metadata list and inspect at each key
     376
     377    psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true);
     378    psMetadataItem* item;
     379    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
     380        psDataType type = item->type;
     381
     382        if (type > PS_DATA_STRING) { // i.e., a non-primitive type
     383            valid = false;
     384        }
     385
     386        if (strlen(item->name) > 8) {
     387            item->name[8] = '\0'; // truncate to 8 characters
     388        }
     389
     390        fits_uppercase(item->name); // make uppercase
     391
     392        // now, let's see if CFITSIO thinks this is a good keyword...
     393        status = 0;
     394        if (fits_test_keyword(item->name,&status) != 0) {
     395            valid = false;
     396        }
     397    }
     398
     399    psFree(iter);
     400
     401    return valid;
     402}
  • trunk/psLib/src/fits/psFitsHeader.h

    r6354 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-02-08 01:03:34 $
     9 *  @version $Revision: 1.3 $ $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
     
    3737 */
    3838psMetadata* psFitsReadHeaderSet(
     39    psMetadata* out,                         ///< output metadata or NULL if new psMetadata is to be created.
    3940    const psFits* fits                       ///< the psFits object
    4041);
     
    4950);
    5051
    51 /** Updates the given header to be compatible with the supplied image, updating
    52  *  BITPIX, NAXIS1, and NAXIS2.  The extension name is (re)set to the given
    53  *  extname.
     52/** psFitsHeaderValidate validates the supplied header so that it is in
     53 *  compliance to the FITS standard for header keyword names and types.
    5454 *
    55  *  @return psMetadata*     updated header.
     55 *  @return bool        TRUE if the resulting header conforms to the FITS
     56 *                      standard, otherwise FALSE
    5657 */
    57 psMetadata* psFitsHeaderFromImage(
    58     psMetadata* header,                ///< the header to update
    59     psImage* image,                    ///< the image to use to determine update values
    60     const char* extname                ///< the extension name
    61 );
    62 
    63 /** Updates the given header to be compatible with the given table, i.e. psArray
    64  *  of psMetadata. The extension name is (re)set to the given extname.
    65  */
    66 psMetadata* psFitsHeaderFromTable(
    67     psMetadata* header,                ///< the header to update
    68     psArray* table,                    ///< the table to use to update header
    69     const char* extname                ///< the extension name
    70 );
     58bool psFitsHeaderValidate(psMetadata *header);
    7159
    7260/// @}
  • trunk/psLib/src/fits/psFitsImage.c

    r5511 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-11-14 22:18:30 $
     9 *  @version $Revision: 1.2 $ $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
     
    1616
    1717#include "psFits.h"
     18#include "psFitsImage.h"
    1819#include "string.h"
    1920#include "psError.h"
     
    292293                      psMetadata* header,
    293294                      const psImage* input,
    294                       int numZPlanes)
     295                      int numZPlanes,
     296                      const char* extname)
     297{
     298    // this is equivalent to insert after the last HDU
     299
     300    psFitsMoveLast(fits);
     301    return psFitsInsertImage(fits,header,input,numZPlanes,extname,true);
     302}
     303
     304bool psFitsInsertImage(psFits* fits,
     305                       psMetadata* header,
     306                       const psImage* input,
     307                       int numZPlanes,
     308                       const char* extname,
     309                       bool after)
    295310{
    296311
     
    330345    }
    331346
    332     fits_create_img(fits->fd, bitPix, naxis, naxes, &status);
     347    int chdu = psFitsGetExtNum(fits);
     348    int hdus = psFitsGetSize(fits);
     349    if (! after) {
     350        if (chdu == 0) {
     351            // set status to signal fits_insert_img to insert a new primary HDU
     352            status = PREPEND_PRIMARY;
     353        } else if (hdus > 0) {
     354            // move back one to perform an insert after the previous HDU
     355            psFitsMoveExtNum(fits, -1, true);
     356        }
     357    }
     358
     359    if (hdus == 0) {
     360        status = 0;
     361        fits_create_img(fits->fd, bitPix, naxis, naxes, &status);
     362
     363    } else {
     364        fits_insert_img(fits->fd, bitPix, naxis, naxes, &status);
     365    }
    333366
    334367    if (bZero != 0) {        // set the bscale/bzero
     
    339372
    340373    // write the header, if any.
     374    if (extname != NULL) {
     375        psFitsSetExtName(fits,extname);
     376    }
     377
    341378    if (header != NULL) {
    342         psFitsWriteHeader(header, (psPtr)fits);
     379        if (extname != NULL) {
     380            psMetadataAddStr(header,PS_LIST_TAIL,"EXTNAME",
     381                             PS_META_REPLACE,
     382                             "Extenion Name",
     383                             extname);
     384        }
     385
     386        psFitsWriteHeader(header, fits);
    343387    }
    344388
     
    378422bool psFitsUpdateImage(psFits* fits,
    379423                       const psImage* input,
    380                        psRegion region,
     424                       int x0,
     425                       int y0,
    381426                       int z)
    382427{
     
    453498    long lastPixel[3];
    454499
    455     firstPixel[0] = region.x0 + 1;
    456     firstPixel[1] = region.y0 + 1;
     500    firstPixel[0] = x0 + 1;
     501    firstPixel[1] = y0 + 1;
    457502    firstPixel[2] = z + 1;
    458503
    459     if (region.x1 > 0) {
    460         lastPixel[0] = region.x1;
    461     } else {
    462         lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0
    463     }
    464     if (region.y1 > 0) {
    465         lastPixel[1] = region.y1;
    466     } else {
    467         lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0
    468     }
     504    lastPixel[0] = x0 + numCols;
     505    lastPixel[1] = y0 + numRows;
    469506    lastPixel[2] = z + 1;
    470507
     
    474511            lastPixel[1] < 1 || lastPixel[1] > nAxes[1]) {
    475512        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    476                 "Specified region [%d:%d,%d:%d], is not valid given the %dx%d FITS image.",
    477                 region.y0,region.y1-1,region.x0,region.x1-1);
    478         return false;
    479 
    480     }
    481 
    482     int dx = lastPixel[0] - firstPixel[0];
    483     int dy = lastPixel[1] - firstPixel[1];
    484     if (dx > numCols ||
    485             dy > numRows) {
    486         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    487                 "The region [%d:%d,%d:%d], is not valid given the input %dx%d image.",
    488                 firstPixel[1]-1,lastPixel[1]-1,
    489                 firstPixel[0]-1,lastPixel[0]-1,
    490                 numCols, numRows);
    491         return false;
    492     }
    493 
    494     psImage* subset;
    495     if (dx != numCols || dy != numRows) {
    496         // the input image needs to be subsetted
    497         subset = psImageSubset((psImage*)input, psRegionSet(0,dx+1,0,dy+1));
    498     } else {
    499         subset = psMemIncrRefCounter((psImage*)input);
    500     }
    501 
    502     fits_write_subset(fits->fd, dataType, firstPixel, lastPixel, subset->data.V[0], &status);
     513                "Input image [size of %ix%i] at position (%i,%i) does not all lay in the %ix%i FITS image.",
     514                numCols, numRows,
     515                x0, y0,
     516                nAxes[0], nAxes[1]);
     517        return false;
     518    }
     519
     520    fits_write_subset(fits->fd, dataType, firstPixel, lastPixel, input->data.V[0], &status);
    503521
    504522    if ( status != 0) {
  • trunk/psLib/src/fits/psFitsImage.h

    r5511 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-11-14 22:18:30 $
     9 *  @version $Revision: 1.2 $ $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
     
    4646    psMetadata* header,                ///< header items for the new HDU.  Can be NULL.
    4747    const psImage* input,              ///< the image to output
    48     int depth                          ///< the number of z-planes of the FITS image data cube
     48    int depth,                         ///< the number of z-planes of the FITS image data cube
     49    const char* extname                ///< FITS extension name
    4950);
    5051
    51 /** Updates the FITS file image, given the desired region and z-plane.
     52/** Writes an image, given the desired region and z-plane.  A new IMAGE HDU is
     53 *  appended to the end of the FITS file.
     54 *
     55 *  @return bool        TRUE is the write was successful, otherwise FALSE.
     56 */
     57bool psFitsInsertImage(
     58    psFits* fits,                      ///< the psFits object
     59    psMetadata* header,                ///< header items for the new HDU.  Can be NULL.
     60    const psImage* input,              ///< the image to output
     61    int depth,                         ///< the number of z-planes of the FITS image data cube
     62    const char* extname,               ///< FITS extension name
     63    bool after                         ///< if TRUE, inserts HDU after current HDU, otherwise before
     64);
     65
     66/** Updates the FITS file image, given the desired region and z-plane. a new
     67 *  IMAGE HDU is inserted before or after, depending on the AFTER parameter,
     68 *  the current HDU.
    5269 *
    5370 *  @return bool        TRUE is the write was successful, otherwise FALSE.
     
    5673    psFits* fits,                      ///< the psFits object
    5774    const psImage* input,              ///< the image to output
    58     psRegion region,                   ///< the region in the FITS image to write
     75    int x0,                            ///< psImage's x-axis origin in FITS image coordinates
     76    int y0,                            ///< psImage's y-axis origin in FITS image coordinates
    5977    int z                              ///< the z-planes of the FITS image data cube to write
    6078);
  • 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,
  • trunk/psLib/src/fits/psFitsTable.h

    r5511 r6767  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-11-14 22:18:30 $
     9 *  @version $Revision: 1.2 $ $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
     
    7272);
    7373
    74 /** Writes a whole FITS table.  The current HDU type must be either
    75  *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
     74/** Writes a whole FITS table. A new HDU of the type BINTABLE is appended
     75 *  to the file.
    7676 *
    7777 *  @return bool        TRUE if the write was successful, otherwise FALSE
    7878 *
    79  *  @see psFitsReadTableRow
     79 *  @see psFitsReadTable
     80 *  @see psFitsInsertTable
    8081 */
    8182bool psFitsWriteTable(
     
    8485    const psArray* table
    8586    ///< Array of psMetadata items, which contains the output data items of each row.
     87);
     88
     89/** Inserts a whole FITS table. A new HDU of the type BINTABLE is inserted either
     90 *  before or after, depending on the AFTER parameter, the current HDU.
     91 *
     92 *  @return bool        TRUE if the insert/write was successful, otherwise FALSE
     93 *
     94 *  @see psFitsWriteTable
     95 */
     96bool psFitsInsertTable(
     97    psFits* fits,                  ///< the psFits object
     98    const psMetadata* header,      ///< header items for the new HDU.  Can be NULL.
     99    const psArray* table,
     100    ///< Array of psMetadata items, which contains the output data items of each row.
     101    bool after
     102    ///< TRUE if insert is done after CHDU, otherwise table is inserted before CHDU
    86103);
    87104
     
    94111 */
    95112bool psFitsUpdateTable(
    96     psFits* fits,                ///< the psFits object
     113    psFits* fits,                      ///< the psFits object
    97114    const psMetadata* data,
    98115    ///< Array of psMetadata items, which contains the output data items of each row.
  • trunk/psLib/test/fits/tst_psFits.c

    r6484 r6767  
    66*  @author Robert DeSonia, MHPCC
    77*
    8 *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
    9 *  @date $Date: 2006-02-24 23:43:15 $
     8*  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
     9*  @date $Date: 2006-04-04 19:52:47 $
    1010*
    1111*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    118118                      extname);
    119119
    120         psMetadataAdd(header,PS_LIST_TAIL, "EXTNAME",
    121                       PS_DATA_STRING,
    122                       "Extension Name",
    123                       extname);
    124 
    125120        // set the pixels in the image
    126121        psBinaryOp(image,image,"=",psScalarAlloc(lcv,PS_TYPE_F32));
    127         if (! psFitsWriteImage(fitsFile,header,image,1) ) {
     122        if (! psFitsWriteImage(fitsFile,header,image,1,extname) ) {
    128123            psError(PS_ERR_UNKNOWN, false,
    129124                    "Could not write image.");
     
    152147    psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
    153148
    154     if (! psFitsWriteImage(fitsFile,NULL,image,1) ) {
     149    if (! psFitsWriteImage(fitsFile,NULL,image,1,NULL) ) {
    155150        psError(PS_ERR_UNKNOWN, false,
    156151                "Could not write PHU image.");
     
    263258    // write something to the file, otherwise CFITSIO will complain on close
    264259    psImage* img = psImageAlloc(16,16,PS_TYPE_F32);
    265     psFitsWriteImage(fitsFile,NULL,img,1);
     260    psFitsWriteImage(fitsFile,NULL,img,1,NULL);
    266261
    267262    psFree(fitsFile); // psFree should be equivalent to psFitsClose
     
    284279
    285280    // write something to the file, otherwise CFITSIO will complain on close
    286     psFitsWriteImage(fitsFile,NULL,img,1);
     281    psFitsWriteImage(fitsFile,NULL,img,1,NULL);
    287282
    288283    psFitsClose(fitsFile);
     
    305300
    306301    // write something to the file, otherwise CFITSIO will complain on close
    307     psFitsWriteImage(fitsFile,NULL,img,1);
     302    psFitsWriteImage(fitsFile,NULL,img,1,NULL);
    308303
    309304    psFitsClose(fitsFile);
     
    821816    psFitsMoveExtNum(fits,numHDUs/2, false);
    822817
    823     psMetadata* headerSet = psFitsReadHeaderSet(fits);
     818    psMetadata* headerSet = psFitsReadHeaderSet(NULL,fits);
    824819
    825820    if (headerSet == NULL) {
     
    862857    }
    863858
    864     psMetadata* set2 = psFitsReadHeaderSet(NULL);
    865     if (set2 != NULL) {
    866         psError(PS_ERR_UNKNOWN, false,
    867                 "psFitsReadHeaderSet returned non-NULL given a NULL psFits.");
    868         return 10;
    869     }
    870 
    871     psMetadata* set3 = psFitsReadHeaderSet(fits);
     859    psMetadata* set3 = psFitsReadHeaderSet(NULL,fits);
    872860    if (set3 == NULL) {
    873861        psError(PS_ERR_UNKNOWN, false,
     
    902890    }
    903891
    904 
     892    set3 = psFitsReadHeaderSet(set3,NULL);
     893    if (set3 != NULL) {
     894        psError(PS_ERR_UNKNOWN, false,
     895                "psFitsReadHeaderSet returned non-NULL given a NULL psFits.");
     896        return 10;
     897    }
    905898
    906899    psFree(headerSet);
    907     psFree(set3);
    908     // set2 should have been freed by psFitsReadHeaderSet upon an error.
    909900
    910901    psFitsClose(fits);
     
    14341425        img4 = psImageCopy(img4,img3,PS_TYPE_##TYP); \
    14351426        psFits* fits = psFitsOpen(filename, "w"); \
    1436         psRegion region = {0,0,0,0}; \
    1437         if (! psFitsWriteImage(fits, NULL, img, 2)) { \
     1427        if (! psFitsWriteImage(fits, NULL, img, 2, NULL)) { \
    14381428            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
    14391429            return 1; \
    14401430        } \
    1441         if (! psFitsUpdateImage(fits,img3, region, 1)) { \
     1431        if (! psFitsUpdateImage(fits,img3, 0,0, 1)) { \
    14421432            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
    14431433            return 2; \
    14441434        } \
    1445         if (! psFitsWriteImage(fits,NULL, img3, 2)) { \
     1435        if (! psFitsWriteImage(fits,NULL, img3, 2, NULL)) { \
    14461436            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
    14471437            return 3; \
    14481438        } \
    1449         if (! psFitsUpdateImage(fits,img,region, 1)) { \
     1439        if (! psFitsUpdateImage(fits,img, 0, 0, 1)) { \
    14501440            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
    14511441            return 4; \
     
    15881578    GENIMAGE(img2,m,n,F32,row+2*col);
    15891579    mkdir("tmpImages",0777);
    1590     psRegion region = {0,0,0,0};
    15911580    psFits* fits = psFitsOpen("tmpImages/writeTest.fits","w");
    15921581
    1593     if (! psFitsWriteImage(fits, NULL, img,1)) {
     1582    if (! psFitsWriteImage(fits, NULL, img,1, NULL)) {
    15941583        psError(PS_ERR_UNKNOWN, true,"Couldn't write writeTest.fits.");
    15951584        return 14;
    15961585    }
    1597     if (! psFitsUpdateImage(fits, img2, region, 0)) {
     1586    if (! psFitsUpdateImage(fits, img2, 0, 0, 0)) {
    15981587        psError(PS_ERR_UNKNOWN, true,"Couldn't update writeTest.fits.");
    15991588        return 15;
     
    16041593    // Did it really overwrite the pixel values?  Let's read it in and see.
    16051594    psFitsClose(fits);
     1595
     1596    psRegion region = {0,0,0,0};
    16061597    fits = psFitsOpen("tmpImages/writeTest.fits","r");
    16071598    img = psFitsReadImage(NULL, fits, region, 0);
     
    16281619    */
    16291620    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message because input image is null.");
    1630     if ( psFitsWriteImage(fits,NULL,NULL, 1) ) {
     1621    if ( psFitsWriteImage(fits,NULL,NULL, 1, NULL) ) {
    16311622        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false when input image is NULL.");
    16321623        return 20;
  • trunk/psLib/test/fits/verified/tst_psFits.stderr

    r5512 r6767  
    201201<DATE><TIME>|<HOST>|I|testImageWrite
    202202    Following should generate an error message because input image is null.
    203 <DATE><TIME>|<HOST>|E|psFitsWriteImage (FILE:LINENO)
     203<DATE><TIME>|<HOST>|E|psFitsInsertImage (FILE:LINENO)
    204204    The input psImage was NULL.  Need a non-NULL psImage for operation to be performed.
    205205
  • trunk/psLib/test/imageops/tst_psImageGeomManip.c

    r5512 r6767  
    66 *  @author Robert DeSonia, MHPCC
    77 *
    8  *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
    9  *  @date $Date: 2005-11-14 22:18:46 $
     8 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
     9 *  @date $Date: 2006-04-04 19:52:54 $
    1010 *
    1111 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    588588        sBiOut = psImageRotate(sBiOut,sImg,radianRot,-1.0,PS_INTERPOLATE_BILINEAR);
    589589
    590         if (! psFitsWriteImage(fOutFile, NULL, fOut, 1) ) {
     590        if (! psFitsWriteImage(fOutFile, NULL, fOut, 1, NULL) ) {
    591591            psError(PS_ERR_UNKNOWN, true,"Can not write fOut.");
    592592            return 20;
    593593        }
    594         if (! psFitsWriteImage(sOutFile, NULL, sOut, 1) ) {
     594        if (! psFitsWriteImage(sOutFile, NULL, sOut, 1, NULL) ) {
    595595            psError(PS_ERR_UNKNOWN, true,"Can not write sOut.");
    596596            return 21;
    597597        }
    598         if (! psFitsWriteImage(fBiOutFile, NULL, fBiOut, 1) ) {
     598        if (! psFitsWriteImage(fBiOutFile, NULL, fBiOut, 1, NULL) ) {
    599599            psError(PS_ERR_UNKNOWN, true,"Can not write fBiOut.fits.");
    600600            return 40;
    601601        }
    602         if (! psFitsWriteImage(sBiOutFile, NULL, sBiOut, 1) ) {
     602        if (! psFitsWriteImage(sBiOutFile, NULL, sBiOut, 1, NULL) ) {
    603603            psError(PS_ERR_UNKNOWN, true,"Can not write sBiOut.fits.");
    604604            return 41;
  • trunk/psLib/test/sys/tst_psMemory.c

    r6204 r6767  
    66*  @author Robert DeSonia, MHPCC
    77*
    8 *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
    9 *  @date $Date: 2006-01-26 21:10:22 $
     8*  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
     9*  @date $Date: 2006-04-04 19:52:55 $
    1010*
    1111*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    583583    fits = psFitsOpen("test.fits","w");
    584584    psImage* img = psImageAlloc(16,16,PS_TYPE_F32);
    585     psFitsWriteImage(fits,NULL,img,1);
     585    psFitsWriteImage(fits,NULL,img,1,NULL);
    586586    psFree(img);
    587587    if ( !psMemCheckType(PS_DATA_FITS, fits) ) {
Note: See TracChangeset for help on using the changeset viewer.