IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 25087


Ignore:
Timestamp:
Aug 17, 2009, 10:27:28 AM (17 years ago)
Author:
Paul Price
Message:

Add trace statements for debugging.
Fix writing FITS tables: need to ignore TZEROnn and TSCALnn in header.
Fix reading S64 values in header.

File:
1 edited

Legend:

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

    r25002 r25087  
    5050
    5151// List of the start of FITS header keys not to write (handled by cfitsio); NULL-terminated
    52 static const char *noWriteFitsKeyStarts[] = { "NAXIS", "TTYPE", "TFORM", NULL };
     52static const char *noWriteFitsKeyStarts[] = { "NAXIS", "TTYPE", "TFORM", "TZERO", "TSCAL", NULL };
    5353
    5454// List of compressed FITS header keys not to write (handled by cfitsio); NULL-terminated
     
    305305                keyType = 'C';
    306306            }
     307            psTrace("psLib.fits", 3, "Reading keyword %s, type %c\n", keyName, keyType);
    307308            if (status != 0) {
    308309                break;
     
    327328                                               -INFINITY);
    328329                } else {
    329                     success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
    330                                                atoi(keyValue));
     330                    long long value = atoll(keyValue); // Value
     331                    if (value > PS_MIN_S32 && value < PS_MAX_S32) {
     332                        success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     333                                                   value);
     334                    } else {
     335                        success = psMetadataAddS64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
     336                                                   value);
     337                    }
    331338                }
    332339                break;
     
    509516        psMetadataItem *simpleItem = psMetadataLookup(output, "SIMPLE"); // SIMPLE in the header
    510517        if (simpleItem) {
    511             if (simpleItem->type != PS_DATA_BOOL) {
    512                 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "SIMPLE in a FITS header must be of boolean type: "
    513                         "not %x --- assuming FALSE.\n", simpleItem->type);
     518            if (simpleItem->type != PS_DATA_BOOL || !simpleItem->data.B) {
    514519                int value = false;          // Temporary holder for boolean
     520                psWarning("Writing SIMPLE=F to FITS header by request");
    515521                fits_update_key(fits->fd, TLOGICAL, "SIMPLE", &value,
    516522                                "File does not conform to FITS standard", &status);
    517523                simple = false;
    518             } else if (!simpleItem->data.B) {
    519                 simple = false;
    520                 int value = false;      // Temporary holder for boolean
    521                 fits_update_key(fits->fd, TLOGICAL, "SIMPLE", &value,
    522                                 "File does not conform to FITS standard", &status);
    523524            }
    524525            // Uncompressed SIMPLE = T is taken care of by cfitsio.
     
    546547            char comment[FLEN_CARD];    // Comment for ZIMAGE; unused
    547548            int value;                  // Value for ZIMAGE; unused
     549            psTrace("psLib.fits", 3, "Writing header ZSIMPLE to preserve PHU");
    548550            fits_read_key(fits->fd, TLOGICAL, "ZIMAGE", &value, comment, &status);
    549551            fits_insert_key_log(fits->fd, "ZSIMPLE", simple, "Uncompressed file's conforms to FITS", &status);
     
    575577                if (keywordInList(name, noWriteCompressedKeys) ||
    576578                    (keyStarts && keywordStartsWith(name, noWriteCompressedKeyStarts))) {
     579                    psTrace("psLib.fits", 3, "Not writing FITS keyword %s", name);
    577580                    continue;
    578581                }
    579582            } else if (keywordInList(name, noWriteCompressedKeys) ||
    580583                       (keyStarts && keywordStartsWith(name, noWriteCompressedKeyStarts))) {
     584                psTrace("psLib.fits", 3, "Not writing FITS keyword %s", name);
    581585                continue;
    582586            }
     
    584588            if (keywordInList(name, noWriteFitsKeys) ||
    585589                (keyStarts && keywordStartsWith(name, noWriteFitsKeyStarts))) {
     590                psTrace("psLib.fits", 3, "Not writing FITS keyword %s", name);
    586591                continue;
    587592            }
     
    592597                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
    593598            } else {
     599                psTrace("psLib.fits", 5, "Writing header COMMENT: %s", item->data.str);
    594600                fits_write_comment(fits->fd, item->data.str, &status);
    595601            }
     
    598604                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
    599605            } else {
     606                psTrace("psLib.fits", 5, "Writing header HISTORY: %s", item->data.str);
    600607                fits_write_history(fits->fd, item->data.str, &status);
    601608            }
     
    605612              case PS_DATA_BOOL: {
    606613                  int value = item->data.B;
     614                  psTrace("psLib.fits", 5, "Writing BOOL header %s: %d", name, value);
    607615                  fits_update_key(fits->fd, TLOGICAL, name, &value, item->comment, &status);
    608616                  break;
    609617              }
    610618              case PS_DATA_S8:
     619                psTrace("psLib.fits", 5, "Writing S8 header %s: %d", name, (int)item->data.S8);
    611620                fits_update_key(fits->fd, TBYTE, name, &item->data.S8, item->comment, &status);
    612621                break;
    613622              case PS_DATA_S16:
     623                psTrace("psLib.fits", 5, "Writing S16 header %s: %d", name, (int)item->data.S16);
    614624                fits_update_key(fits->fd, TSHORT, name, &item->data.S16, item->comment, &status);
    615625                break;
    616626              case PS_DATA_S32:
     627                psTrace("psLib.fits", 5, "Writing S32 header %s: %d", name, (int)item->data.S32);
    617628                fits_update_key(fits->fd, TINT, name, &item->data.S32, item->comment, &status);
    618629                break;
    619630              case PS_DATA_S64:
     631                psTrace("psLib.fits", 5, "Writing S64 header %s: %" PRId64, name, item->data.S64);
    620632                fits_update_key(fits->fd, TLONGLONG, name, &item->data.S64, item->comment, &status);
    621633                break;
    622634              case PS_DATA_U8: {
    623635                  unsigned short int temp = item->data.U8;
     636                psTrace("psLib.fits", 5, "Writing U8 header %s: %d", name, (int)item->data.U8);
    624637                  fits_update_key(fits->fd, TUSHORT, name, &temp, item->comment, &status);
    625638                  break;
    626639              }
    627640              case PS_DATA_U16:
     641                psTrace("psLib.fits", 5, "Writing U16 header %s: %d", name, (int)item->data.U16);
    628642                fits_update_key(fits->fd, TUSHORT, name, &item->data.U16, item->comment, &status);
    629643                break;
    630644              case PS_DATA_U32:
     645                psTrace("psLib.fits", 5, "Writing U32 header %s: %d", name, (unsigned int)item->data.U32);
    631646                fits_update_key(fits->fd, TUINT, name, &item->data.U32, item->comment, &status);
    632647                break;
     
    639654                }
    640655                psS64 temp = item->data.U64; // Signed version
     656                psTrace("psLib.fits", 5, "Writing U64 header %s: %" PRIu64, name, item->data.U64);
    641657                fits_update_key(fits->fd, TLONGLONG, name, &temp, item->comment, &status);
    642658                break;
    643659              case PS_DATA_F32: {
    644660                  int infCheck = 0;         // Result of isinf()
     661                  psTrace("psLib.fits", 5, "Writing F32 header %s: %f", name, item->data.F32);
    645662                  if (isnan(item->data.F32)) {
    646663                      fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
     
    659676              case PS_DATA_F64: {
    660677                  int infCheck = 0;         // Result of isinf()
     678                  psTrace("psLib.fits", 5, "Writing F32 header %s: %lf", name, item->data.F64);
    661679                  if (isnan(item->data.F64)) {
    662680                      fits_update_key(fits->fd, TSTRING, name, "NaN", item->comment, &status);
     
    674692              }
    675693              case PS_DATA_STRING:
     694                psTrace("psLib.fits", 5, "Writing STR header %s: %s", name, item->data.str);
    676695                fits_update_key(fits->fd, TSTRING, name, item->data.V, item->comment, &status);
    677696                break;
Note: See TracChangeset for help on using the changeset viewer.