IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7246


Ignore:
Timestamp:
May 30, 2006, 12:44:37 PM (20 years ago)
Author:
Paul Price
Message:

Fixing bug 760: cfitsio refuses to write out NaN and Inf (it
explicitly checks for them and produces an error). Therefore, we will
write these as strings, and trap them on the read. This is not the
best solution (the best solution would be to fix or dump cfitsio), but
is the only way to get around the problem.

File:
1 edited

Legend:

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

    r7244 r7246  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-05-30 22:11:51 $
     9 *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-05-30 22:44:37 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    112112            // This is the default type that cfitsio reports whenever it doesn't know what it is.
    113113            // Trap NAN, INF and -INF, which cfitsio doesn't handle.
    114             if (strncasecmp(keyValue, "nan", 3) == 0) {
     114            if (strncasecmp(keyValue, "NAN", 3) == 0) {
    115115                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
    116116                                        (psF32)NAN);
    117             } else if (strncasecmp(keyValue, "inf", 3) == 0) {
     117            } else if (strncasecmp(keyValue, "INF", 3) == 0) {
    118118                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
    119119                                        (psF32)INFINITY);
    120             } else if (strncasecmp(keyValue, "-inf", 4) == 0) {
     120            } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
    121121                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
    122122                                        (psF32)-INFINITY);
     
    156156                }
    157157
    158                 success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_STRING | dupFlag, keyComment,
    159                                         keyValueFixed);
     158                // Need to trap NAN, INF and -INF written by psFitsWriteHeader.
     159                // cfitsio won't write these, so we write them as strings, and then have to trap them on read.
     160                if (strcasecmp(keyValueFixed, "NAN") == 0) {
     161                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
     162                                            (psF32)NAN);
     163                } else if (strcasecmp(keyValueFixed, "INF") == 0) {
     164                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
     165                                            (psF32)INFINITY);
     166                } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
     167                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
     168                                            (psF32)-INFINITY);
     169                } else {
     170                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_STRING | dupFlag, keyComment,
     171                                            keyValueFixed);
     172                }
    160173                break;
    161174            }
     
    295308            fits_update_key(fits->fd, TUINT, item->name, &item->data.U32, item->comment, &status);
    296309            break;
    297         case PS_DATA_F32:
    298             fits_update_key(fits->fd, TFLOAT, item->name, &item->data.F32, item->comment, &status);
    299             break;
    300         case PS_DATA_F64:
    301             fits_update_key(fits->fd, TDOUBLE, item->name, &item->data.F64, item->comment, &status);
    302             break;
     310        case PS_DATA_F32: {
     311                int infCheck = 0;         // Result of isinf()
     312                if (isnan(item->data.F32)) {
     313                    fits_update_key(fits->fd, TSTRING, item->name, "NaN", item->comment, &status);
     314                } else if ((infCheck = isinf(item->data.F32)) != 0) {
     315                    if (infCheck == 1) {
     316                        fits_update_key(fits->fd, TSTRING, item->name, "Inf", item->comment, &status);
     317                    } else {
     318                        fits_update_key(fits->fd, TSTRING, item->name, "-Inf", item->comment, &status);
     319                    }
     320                } else {
     321                    fits_update_key(fits->fd, TFLOAT, item->name, &item->data.F32, item->comment, &status);
     322                }
     323                break;
     324            }
     325        case PS_DATA_F64: {
     326                int infCheck = 0;         // Result of isinf()
     327                if (isnan(item->data.F64)) {
     328                    fits_update_key(fits->fd, TSTRING, item->name, "NaN", item->comment, &status);
     329                } else if ((infCheck = isinf(item->data.F64)) != 0) {
     330                    if (infCheck == 1) {
     331                        fits_update_key(fits->fd, TSTRING, item->name, "Inf", item->comment, &status);
     332                    } else {
     333                        fits_update_key(fits->fd, TSTRING, item->name, "-Inf", item->comment, &status);
     334                    }
     335                } else {
     336                    fits_update_key(fits->fd, TDOUBLE, item->name, &item->data.F64, item->comment, &status);
     337                }
     338                break;
     339            }
    303340        case PS_DATA_STRING:
    304341            fits_update_key(fits->fd, TSTRING, item->name, item->data.V, item->comment, &status);
Note: See TracChangeset for help on using the changeset viewer.