Changeset 16665 for trunk/psLib/src/fits/psFitsHeader.c
- Timestamp:
- Feb 26, 2008, 1:42:21 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFitsHeader.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsHeader.c
r16185 r16665 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 39$ $Name: not supported by cvs2svn $10 * @date $Date: 2008-0 1-23 03:08:03$9 * @version $Revision: 1.40 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2008-02-26 23:42:21 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 32 32 #include "psVector.h" 33 33 34 #define MAX_STRING_LENGTH 256 // maximum length string for FITS routines34 #define MAX_STRING_LENGTH 256 // maximum length string for FITS routines 35 35 #define NUM_EMPTY_KEYS 8 // Number of keywords before header is considered practically empty 36 36 37 37 // list of FITS header keys to ignore; NULL-terminated 38 static const char* ignoreFitsKeys[] = { "", NULL };38 static const char* ignoreFitsKeys[] = { "", NULL }; 39 39 40 40 // List of FITS header keys that may be duplicated; NULL-terminated 41 static const char *duplicateFitsKeys[] = { "COMMENT", "HIERARCH", "HISTORY", NULL}; 41 static 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. 44 static const char *commentFitsKeys[] = { "COMMENT", "HISTORY", NULL }; 42 45 43 46 // List of FITS header keys not to write (handled by cfitsio); NULL-terminated 44 47 static const char *noWriteFitsKeys[] = { "SIMPLE", "XTENSION", "BITPIX", "NAXIS", "EXTNAME", "BSCALE", 45 48 "BZERO", "TFIELDS", "PCOUNT", "GCOUNT", "ZIMAGE", "ZBITPIX", 46 "ZCMPTYPE", "PSBITPIX", NULL };49 "ZCMPTYPE", "PSBITPIX", NULL }; 47 50 48 51 // List of the start of FITS header keys not to write (handled by cfitsio); NULL-terminated 49 52 static const char *noWriteFitsKeyStarts[] = { "NAXIS", "TTYPE", "TFORM", "ZNAXIS", "ZTILE", "ZNAME", "ZVAL", 50 NULL };53 NULL }; 51 54 52 55 // List of FITS header keys that may be present if the header is considered "empty"; NULL-terminated 53 56 static const char *emptyKeys[] = { "SIMPLE", "BITPIX", "NAXIS", "EXTEND", "COMMENT", "CHECKSUM", "DATASUM", 54 NULL };57 NULL }; 55 58 56 59 // How to translate between keywords … … 253 256 } 254 257 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); 258 263 } 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); 283 267 } 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. 284 297 success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, 285 298 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 } 334 344 } 335 345 … … 503 513 504 514 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 } 506 520 } 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 } 508 526 } else { 509 527 // A regular FITS header
Note:
See TracChangeset
for help on using the changeset viewer.
