IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 3, 2007, 3:16:33 PM (19 years ago)
Author:
Paul Price
Message:

Translate the compressed image FITS headers to the proper header names when reading.

File:
1 edited

Legend:

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

    r15179 r15191  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2007-10-03 21:27:21 $
     9 *  @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2007-10-04 01:16:33 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    5454                                   NULL };
    5555
     56// How to translate between keywords
     57typedef struct {
     58    const char *from;                   // Translate from this keyword
     59    const char *to;                     // Translate to this keyword
     60} keywordTranslation;
     61
     62// Translation for compressed image headers           FROM        TO
     63static keywordTranslation compressTranslation[] = { { "ZSIMPLE",  "SIMPLE" },
     64                                                    { "ZTENSION", "XTENSION" },
     65                                                    { "ZBITPIX",  "BITPIX" },
     66                                                    { "ZNAXIS",   "NAXIS"  },
     67                                                    { "ZNAXIS1",  "NAXIS1" },
     68                                                    { "ZNAXIS2",  "NAXIS2" },
     69                                                    { "ZNAXIS3",  "NAXIS3" },
     70                                                    { "ZEXTEND",  "EXTEND" },
     71                                                    { "ZBLOCKED", "BLOCKED"},
     72                                                    { "ZPCOUNT",  "PCOUNT" },
     73                                                    { "ZGCOUNT",  "GCOUNT" },
     74                                                    { "ZHECKSUM", "CHECKSUM"},
     75                                                    { "ZDATASUM", "DATASUM" },
     76                                                    { NULL,       NULL } };
     77
     78
    5679// Compare a keyword with a list of keywords; return true if it's in the list
    5780static bool keywordInList(const char *keyword, // Keyword to check
    58                           const char **list // List of keywords
     81                          const char *list[] // List of keywords
    5982    )
    6083{
     
    6588    }
    6689    return false;
     90}
     91
     92static const char *keywordTranslate(const char *keyword, // Keyword to check
     93                                    keywordTranslation translation[] // Translation list
     94                                    )
     95{
     96    for (keywordTranslation *trans = translation; (*trans).from; ++trans) {
     97        if (strcmp(keyword, (*trans).from) == 0) {
     98            // Translate it
     99            return (*trans).to;
     100        } else if (strcmp(keyword, (*trans).to) == 0) {
     101            // Ignore it completely --- something else will translate to it
     102            return NULL;
     103        }
     104    }
     105    // It translates to itself
     106    return keyword;
    67107}
    68108
     
    179219    fits_get_hdrpos(fits->fd, &numKeys, &keyNum, &status);
    180220
     221    bool compressed = false;            // Is this a compressed image?
     222    if (fits->conventions.compression && fits_is_compressed_image(fits->fd, &status)) {
     223        compressed = true;
     224    }
     225
    181226    // Get each key name. Keywords start at one.
    182227    for (int i = 1; i <= numKeys; i++) {
     
    192237        }
    193238
     239        const char *keyNameTrans = keyName;   // Translated name of keyword
     240        if (compressed) {
     241            keyNameTrans = keywordTranslate(keyName, compressTranslation);
     242            if (!keyNameTrans) {
     243                // It's to be ignored (it will be replaced by something else)
     244                continue;
     245            }
     246        }
     247
    194248        // Check to see if the keyword should be duplicated
    195249        int dupFlag = 0;                // Duplicate flag
     
    212266        case 'X': // bit
    213267        case 'B': // byte
    214             success = psMetadataAddS8(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue));
     268            success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     269                                      atoi(keyValue));
    215270            break;
    216271        case 'I': // short int.
     
    218273            // Trap NAN, INF and -INF, which cfitsio doesn't handle.
    219274            if (strncasecmp(keyValue, "NAN", 3) == 0) {
    220                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, NAN);
     275                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
    221276            } else if (strncasecmp(keyValue, "INF", 3) == 0) {
    222                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY);
     277                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     278                                           INFINITY);
    223279            } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
    224                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY);
     280                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     281                                           -INFINITY);
    225282            } else {
    226                 success = psMetadataAddS32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment,
     283                success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    227284                                           atoi(keyValue));
    228285            }
    229286            break;
    230287        case 'J': // int.
    231             success = psMetadataAddS32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue));
     288            success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     289                                       atoi(keyValue));
    232290            break;
    233291        case 'U': // unsigned int.
    234             success = psMetadataAddU32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atol(keyValue));
     292            success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     293                                       atol(keyValue));
    235294            break;
    236295
    237296        case 'K': // long int. can't all fit in a psS32, put in psF64
    238297        case 'F':
    239             success = psMetadataAddF64(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atof(keyValue));
     298            success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     299                                       atof(keyValue));
    240300            break;
    241301        case 'C': {
     
    245305            // cfitsio won't write these, so we write them as strings, and then have to trap them on read.
    246306            if (strcasecmp(keyValueFixed, "NAN") == 0) {
    247                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, NAN);
     307                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
    248308            } else if (strcasecmp(keyValueFixed, "INF") == 0) {
    249                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY);
     309                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     310                                           INFINITY);
    250311            } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
    251                 success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY);
    252             } else if (!fits->conventions.compression ||
    253                        (strcmp(keyName, "EXTNAME") != 0 || strcmp(keyValueFixed, "COMPRESSED_IMAGE") != 0)) {
     312                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     313                                           -INFINITY);
     314            } else if (compressed && strcmp(keyName, "EXTNAME") == 0 &&
     315                       strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) {
    254316                // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected
    255                 success = psMetadataAddStr(header, PS_LIST_TAIL, keyName, dupFlag, keyComment,
     317                success = true;
     318            } else {
     319                success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    256320                                           keyValueFixed);
    257321            }
     
    260324        case 'L': {
    261325            bool temp = (keyValue[0] == 'T') ? 1 : 0;
    262             success = psMetadataAddBool(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, temp);
     326            success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
    263327            break;
    264328        }
     
    270334
    271335        if (!success) {
    272             psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s."), keyName);
     336            psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s --> %s."),
     337                    keyName, keyNameTrans);
    273338            psFree(header);
    274339            return NULL;
     
    278343
    279344    if (status != 0) {
    280         char fitsErr[MAX_STRING_LENGTH];
    281         (void)fits_get_errstatus(status, fitsErr);
    282         psError(PS_ERR_IO, true, _("Failed to add metadata item, %s."), fitsErr);
     345        psFitsError(status, true, _("Failed to add metadata item."));
    283346        psFree(header);
    284347        return false;
Note: See TracChangeset for help on using the changeset viewer.