IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 26, 2008, 1:42:21 PM (18 years ago)
Author:
Paul Price
Message:

Fixing bug 1046 --- cfitsio assigns the values associated with COMMENT
and HISTORY to the "comment", rather than "value" (I guess because
there's no equals sign). Changing this behaviour so that COMMENTS are
put in item->data.str

File:
1 edited

Legend:

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

    r16185 r16665  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2008-01-23 03:08:03 $
     9 *  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2008-02-26 23:42:21 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3232#include "psVector.h"
    3333
    34 #define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
     34#define MAX_STRING_LENGTH 256           // maximum length string for FITS routines
    3535#define NUM_EMPTY_KEYS 8                // Number of keywords before header is considered practically empty
    3636
    3737// list of FITS header keys to ignore; NULL-terminated
    38 static const char* ignoreFitsKeys[] = { "", NULL};
     38static const char* ignoreFitsKeys[] = { "", NULL };
    3939
    4040// List of FITS header keys that may be duplicated; NULL-terminated
    41 static const char *duplicateFitsKeys[] = { "COMMENT", "HIERARCH", "HISTORY", NULL};
     41static const char *duplicateFitsKeys[] = { "COMMENT", "HIERARCH", "HISTORY", NULL };
     42
     43// List of FITS header keys that are put in the comment by cfitsio; but we want them in the value.
     44static const char *commentFitsKeys[] = { "COMMENT", "HISTORY", NULL };
    4245
    4346// List of FITS header keys not to write (handled by cfitsio); NULL-terminated
    4447static const char *noWriteFitsKeys[] = { "SIMPLE", "XTENSION", "BITPIX", "NAXIS", "EXTNAME", "BSCALE",
    4548                                         "BZERO", "TFIELDS", "PCOUNT", "GCOUNT", "ZIMAGE", "ZBITPIX",
    46                                          "ZCMPTYPE", "PSBITPIX", NULL};
     49                                         "ZCMPTYPE", "PSBITPIX", NULL };
    4750
    4851// List of the start of FITS header keys not to write (handled by cfitsio); NULL-terminated
    4952static const char *noWriteFitsKeyStarts[] = { "NAXIS", "TTYPE", "TFORM", "ZNAXIS", "ZTILE", "ZNAME", "ZVAL",
    50                                               NULL};
     53                                              NULL };
    5154
    5255// List of FITS header keys that may be present if the header is considered "empty"; NULL-terminated
    5356static const char *emptyKeys[] = { "SIMPLE", "BITPIX", "NAXIS", "EXTEND", "COMMENT", "CHECKSUM", "DATASUM",
    54                                    NULL };
     57                                   NULL  };
    5558
    5659// How to translate between keywords
     
    253256        }
    254257
    255         char keyType;                   // Type of key; from cfitsio
    256         if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
    257             fits_get_keytype(keyValue, &keyType, &status);
     258        bool success;                   // Was the add to the metadata successful?
     259
     260        // Certain keywords (COMMENT and HISTORY) are put in the comment rather than value by cfitsio.
     261        if (keywordInList(keyName, commentFitsKeys)) {
     262            success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, NULL, keyComment);
    258263        } else {
    259             keyType = 'C';
    260         }
    261         if (status != 0) {
    262             break;
    263         }
    264 
    265         bool success;                 // Was the add to the metadata successful?
    266         switch (keyType) {
    267         case 'X': // bit
    268         case 'B': // byte
    269             success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    270                                       atoi(keyValue));
    271             break;
    272         case 'I': // short int.
    273             // This is the default type that cfitsio reports whenever it doesn't know what it is.
    274             // Trap NAN, INF and -INF, which cfitsio doesn't handle.
    275             if (strncasecmp(keyValue, "NAN", 3) == 0) {
    276                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
    277             } else if (strncasecmp(keyValue, "INF", 3) == 0) {
    278                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    279                                            INFINITY);
    280             } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
    281                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    282                                            -INFINITY);
     264            char keyType;                   // Type of key; from cfitsio
     265            if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
     266                fits_get_keytype(keyValue, &keyType, &status);
    283267            } else {
     268                keyType = 'C';
     269            }
     270            if (status != 0) {
     271                break;
     272            }
     273
     274            switch (keyType) {
     275              case 'X': // bit
     276              case 'B': // byte
     277                success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     278                                          atoi(keyValue));
     279                break;
     280              case 'I': // short int.
     281                // This is the default type that cfitsio reports whenever it doesn't know what it is.
     282                // Trap NAN, INF and -INF, which cfitsio doesn't handle.
     283                if (strncasecmp(keyValue, "NAN", 3) == 0) {
     284                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
     285                } else if (strncasecmp(keyValue, "INF", 3) == 0) {
     286                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     287                                               INFINITY);
     288                } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
     289                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     290                                               -INFINITY);
     291                } else {
     292                    success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     293                                               atoi(keyValue));
     294                }
     295                break;
     296              case 'J': // int.
    284297                success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    285298                                           atoi(keyValue));
    286             }
    287             break;
    288         case 'J': // int.
    289             success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    290                                        atoi(keyValue));
    291             break;
    292         case 'U': // unsigned int.
    293             success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    294                                        atol(keyValue));
    295             break;
    296 
    297         case 'K': // long int. can't all fit in a psS32, put in psF64
    298         case 'F':
    299             success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    300                                        atof(keyValue));
    301             break;
    302         case 'C': {
    303             char *keyValueFixed = p_psFitsHeaderParseString(keyValue); // Fixed version of the string
    304 
    305             // Need to trap NAN, INF and -INF written by psFitsWriteHeader.
    306             // cfitsio won't write these, so we write them as strings, and then have to trap them on read.
    307             if (strcasecmp(keyValueFixed, "NAN") == 0) {
    308                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
    309             } else if (strcasecmp(keyValueFixed, "INF") == 0) {
    310                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    311                                            INFINITY);
    312             } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
    313                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    314                                            -INFINITY);
    315             } else if (compressed && strcmp(keyName, "EXTNAME") == 0 &&
    316                        strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) {
    317                 // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected
    318                 success = true;
    319             } else {
    320                 success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    321                                            keyValueFixed);
    322             }
    323             break;
    324         }
    325         case 'L': {
    326             bool temp = (keyValue[0] == 'T') ? 1 : 0;
    327             success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
    328             break;
    329         }
    330         default:
    331             psError(PS_ERR_IO, true, _("Specified FITS metadata type, %c, is not supported."), keyType);
    332             psFree(header);
    333             return NULL;
     299                break;
     300              case 'U': // unsigned int.
     301                success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     302                                           atol(keyValue));
     303                break;
     304
     305              case 'K': // long int. can't all fit in a psS32, put in psF64
     306              case 'F':
     307                success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     308                                           atof(keyValue));
     309                break;
     310              case 'C': {
     311                  char *keyValueFixed = p_psFitsHeaderParseString(keyValue); // Fixed version of the string
     312
     313                  // Need to trap NAN, INF and -INF written by psFitsWriteHeader: cfitsio won't write these,
     314                  // so we write them as strings, and then have to trap them on read.
     315                  if (strcasecmp(keyValueFixed, "NAN") == 0) {
     316                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     317                                                 NAN);
     318                  } else if (strcasecmp(keyValueFixed, "INF") == 0) {
     319                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     320                                                 INFINITY);
     321                  } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
     322                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     323                                                 -INFINITY);
     324                  } else if (compressed && strcmp(keyName, "EXTNAME") == 0 &&
     325                             strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) {
     326                      // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected
     327                      success = true;
     328                  } else {
     329                      success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     330                                                 keyValueFixed);
     331                  }
     332                  break;
     333              }
     334              case 'L': {
     335                  bool temp = (keyValue[0] == 'T') ? 1 : 0;
     336                  success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
     337                  break;
     338              }
     339              default:
     340                psError(PS_ERR_IO, true, _("Specified FITS metadata type, %c, is not supported."), keyType);
     341                psFree(header);
     342                return NULL;
     343            }
    334344        }
    335345
     
    503513
    504514        if (strcmp(item->name, "COMMENT") == 0) {
    505             fits_write_comment(fits->fd, item->comment, &status);
     515            if (item->type != PS_DATA_STRING) {
     516                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
     517            } else {
     518                fits_write_comment(fits->fd, item->data.str, &status);
     519            }
    506520        } else if (strcmp(item->name,  "HISTORY") == 0) {
    507             fits_write_history(fits->fd, item->comment, &status);
     521            if (item->type != PS_DATA_STRING) {
     522                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
     523            } else {
     524                fits_write_history(fits->fd, item->data.str, &status);
     525            }
    508526        } else {
    509527            // A regular FITS header
Note: See TracChangeset for help on using the changeset viewer.