IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7235


Ignore:
Timestamp:
May 26, 2006, 4:09:18 PM (20 years ago)
Author:
Paul Price
Message:

psFitsWriteBlank will now preserve NAXISn, etc, having set NAXIS=0.

File:
1 edited

Legend:

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

    r7234 r7235  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2006-05-27 02:01:23 $
     9 *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2006-05-27 02:09:18 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    218218}
    219219
    220 
    221 bool psFitsWriteHeader(psFits *fits,     // The FITS file handle
    222                        psMetadata *output // Metadata that is to be output into the FITS file
    223                       )
     220static bool fitsWriteHeader(psFits *fits, // The FITS file handle
     221                            psMetadata *output, // Metadata that is to be output into the FITS file
     222                            bool keyStarts // Write out the key starts?
     223                           )
    224224{
    225     if (!fits) {
    226         psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
    227         return false;
    228     }
    229 
    230     if (!output) {
    231         psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
    232         return false;
    233     }
    234 
    235225    // Traverse the metadata list and add each key.
    236226    psListIterator* iter = psListIteratorAlloc(output->list, PS_LIST_HEAD, true); // Iterator
     
    249239            }
    250240        }
    251         // Also block out TTYPEn, NAXISn, etc --- keywords that start with a certain sequence
    252         for (int i = 0; noWriteFitsKeyStarts[i] && writeKey; i++) {
    253             if (strncmp(item->name, noWriteFitsKeyStarts[i], strlen(noWriteFitsKeyStarts[i])) == 0) {
    254                 writeKey = false;
    255             }
    256         }
    257         if (!writeKey) {
    258             // Don't write it; skip to the next key
    259             continue;
     241        if (keyStarts) {
     242            // Also block out TTYPEn, NAXISn, etc --- keywords that start with a certain sequence.
     243            // We want to do this when writing an image or table, since it guarantees that the NAXISn etc
     244            // that go in are correct.  However, when we're writing a "blank" HDU (header only), we want to
     245            // preserve NAXISn etc for reference, so we don't do this.
     246            for (int i = 0; noWriteFitsKeyStarts[i] && writeKey; i++) {
     247                if (strncmp(item->name, noWriteFitsKeyStarts[i], strlen(noWriteFitsKeyStarts[i])) == 0) {
     248                    writeKey = false;
     249                }
     250            }
     251            if (!writeKey) {
     252                // Don't write it; skip to the next key
     253                continue;
     254            }
    260255        }
    261256
     
    312307}
    313308
    314 bool psFitsWriteBlank(psFits* fits,
    315                       psMetadata* output
    316                      )
     309bool psFitsWriteHeader(psFits *fits,
     310                       psMetadata *output
     311                      )
    317312{
    318313    if (!fits) {
     
    326321    }
    327322
    328     // Create a dummy image HDU for the primary HDU
    329     int status = 0;                 // Status of cfitsio
    330     fits_create_img(fits->fd, 16, 0, NULL, &status);
    331     if (status) {
    332         char fitsErr[MAX_STRING_LENGTH];
    333         (void)fits_get_errstatus(status, fitsErr);
    334         psError(PS_ERR_IO, true, "Unable to create primary header.\n%s\n", fitsErr);
    335         return false;
    336     }
    337 
    338     return psFitsWriteHeader(fits, output);
    339 }
    340 
    341 bool psFitsHeaderValidate(psMetadata *header)
    342 {
    343     if (header == NULL) {
    344         psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
    345         return false;
    346     }
    347 
    348     // Traverse the metadata list and inspect at each key
    349     psListIterator* iter = psListIteratorAlloc(header->list, PS_LIST_HEAD, true); // Iterator
    350     psMetadataItem* item;               // Item from iteration
    351     bool valid = true;                  // Are all items valid?
    352     while ((item = psListGetAndIncrement(iter))) {
    353         if (item->type > PS_DATA_STRING) { // i.e., a non-primitive type
    354             valid = false;
    355         }
    356 
    357         if (strlen(item->name) > 8) {
    358             item->name[8] = '\0'; // truncate to 8 characters
    359         }
    360 
    361         fits_uppercase(item->name); // make uppercase
    362 
    363         // now, let's see if CFITSIO thinks this is a good keyword...
    364         int status = 0;                 // Status from cfitsio calls
    365         if (fits_test_keyword(item->name,&status) != 0) {
    366             valid = false;
    367         }
    368     }
    369     psFree(iter);
    370 
    371     return valid;
    372 }
     323    return fitsWriteHeader(fits, output, true);
     324
     325
     326    bool psFitsWriteBlank(psFits* fits,
     327                          psMetadata* output
     328                         ) {
     329        if (!fits) {
     330            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
     331            return false;
     332        }
     333
     334        if (!output) {
     335            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
     336            return false;
     337        }
     338
     339        // Create a dummy image HDU for the primary HDU
     340        int status = 0;                 // Status of cfitsio
     341        fits_create_img(fits->fd, 16, 0, NULL, &status);
     342        if (status) {
     343            char fitsErr[MAX_STRING_LENGTH];
     344            (void)fits_get_errstatus(status, fitsErr);
     345            psError(PS_ERR_IO, true, "Unable to create primary header.\n%s\n", fitsErr);
     346            return false;
     347        }
     348
     349        return fitsWriteHeader(fits, output, false);
     350    }
     351
     352    bool psFitsHeaderValidate(psMetadata *header) {
     353        if (header == NULL) {
     354            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
     355            return false;
     356        }
     357
     358        // Traverse the metadata list and inspect at each key
     359        psListIterator* iter = psListIteratorAlloc(header->list, PS_LIST_HEAD, true); // Iterator
     360        psMetadataItem* item;               // Item from iteration
     361        bool valid = true;                  // Are all items valid?
     362        while ((item = psListGetAndIncrement(iter))) {
     363            if (item->type > PS_DATA_STRING) { // i.e., a non-primitive type
     364                valid = false;
     365            }
     366
     367            if (strlen(item->name) > 8) {
     368                item->name[8] = '\0'; // truncate to 8 characters
     369            }
     370
     371            fits_uppercase(item->name); // make uppercase
     372
     373            // now, let's see if CFITSIO thinks this is a good keyword...
     374            int status = 0;                 // Status from cfitsio calls
     375            if (fits_test_keyword(item->name,&status) != 0) {
     376                valid = false;
     377            }
     378        }
     379        psFree(iter);
     380
     381        return valid;
     382    }
Note: See TracChangeset for help on using the changeset viewer.