IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 13, 2005, 11:09:18 AM (22 years ago)
Author:
desonia
Message:

added psFitsReadHeader test.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/test/fileUtils/tst_psFits.c

    r2968 r2974  
    66*  @author Robert DeSonia, MHPCC
    77*
    8 *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    9 *  @date $Date: 2005-01-13 02:20:44 $
     8*  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     9*  @date $Date: 2005-01-13 21:09:18 $
    1010*
    1111*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2323static psS32 tst_psFitsAlloc( void );
    2424static psS32 tst_psFitsMoveExtName( void ); // also tests psFitsGetExtName
    25 static psS32 tst_psFitsMoveExtNum( void );  // also tests psFitsGetExtNum
     25static psS32 tst_psFitsMoveExtNum( void );  // also tests psFitsGetExtNum, psFitsGetSize
     26static psS32 tst_psFitsReadHeader( void );
    2627
    2728testDescription tests[] = {
    2829                              {tst_psFitsAlloc, 801, "psFitsAlloc", 0, false},
    2930                              {tst_psFitsMoveExtName, 802, "psFitsMoveExtName", 0, false},
     31                              {tst_psFitsMoveExtName, 802, "psFitsGetExtName", 0, true},
    3032                              {tst_psFitsMoveExtNum, 803, "psFitsMoveExtNum", 0, false},
     33                              {tst_psFitsMoveExtNum, 803, "psFitsGetExtNum", 0, true},
     34                              {tst_psFitsMoveExtNum, 803, "psFitsGetSize", 0, true},
     35                              {tst_psFitsReadHeader, 0, "psFitsReadHeader", 0, false},
    3136                              {NULL}
    3237                          };
     
    3742
    3843    return ( ! runTestSuite( stderr, "psImage", tests, argc, argv ) );
     44}
     45
     46bool makeMulti(void)
     47{
     48
     49    if (access(multiFilename, F_OK) != 0) {
     50        psFits* fitsFile = psFitsAlloc(multiFilename);
     51
     52        if (fitsFile == NULL) {
     53            psError(PS_ERR_UNKNOWN, false,
     54                    "Could not create 'multi' FITS file.");
     55            return false;
     56        }
     57
     58        psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
     59
     60        char extname[80];
     61        for (int lcv = 0; lcv < 8; lcv++) {
     62            snprintf(extname,80,"ext-%d", lcv);
     63
     64            psMetadata* header = psMetadataAlloc();
     65
     66            psMetadataAdd(header,PS_LIST_TAIL, "MYINT",
     67                          PS_TYPE_S32, PS_META_PRIMITIVE,
     68                          "psS32 Item", (psS32)lcv);
     69
     70            psMetadataAdd(header,PS_LIST_TAIL, "MYFLT",
     71                          PS_TYPE_F32, PS_META_PRIMITIVE,
     72                          "psF32 Item", (float)(1.0f/(float)(1+lcv)));
     73
     74            psMetadataAdd(header,PS_LIST_TAIL, "MYDBL",
     75                          PS_TYPE_F64, PS_META_PRIMITIVE,
     76                          "psF64 Item", (double)(1.0/(double)(1+lcv)));
     77
     78            psMetadataAdd(header,PS_LIST_TAIL, "MYBOOL",
     79                          PS_TYPE_BOOL, PS_META_PRIMITIVE,
     80                          "psBool Item",
     81                          (lcv%2 == 0));
     82
     83            psMetadataAdd(header,PS_LIST_TAIL, "MYSTR",
     84                          PS_TYPE_PTR, PS_META_STR,
     85                          "String Item",
     86                          extname);
     87
     88            // set the pixels in the image
     89            psBinaryOp(image,image,"=",psScalarAlloc(lcv,PS_TYPE_F32));
     90            if (! psFitsWriteImage(fitsFile,header,image,1) ) {
     91                psError(PS_ERR_UNKNOWN, false,
     92                        "Could not write image.");
     93                return false;
     94            }
     95            if (! psFitsSetExtName(fitsFile,extname) ) {
     96                psError(PS_ERR_UNKNOWN, false,
     97                        "Could not write extension name.");
     98                return false;
     99            }
     100
     101            psFree(header);
     102        }
     103        psFree(image);
     104        psFree(fitsFile);
     105    }
     106
     107    return true;
    39108}
    40109
     
    409478
    410479
    411 bool makeMulti(void)
     480
     481static psS32 tst_psFitsReadHeader( void )
    412482{
    413 
    414     if (access(multiFilename, F_OK) != 0) {
    415         psFits* fitsFile = psFitsAlloc(multiFilename);
    416 
    417         if (fitsFile == NULL) {
    418             psError(PS_ERR_UNKNOWN, false,
    419                     "Could not create 'multi' FITS file.");
    420             return false;
    421         }
    422 
    423         psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
    424 
    425         char extname[80];
    426         for (int lcv = 0; lcv < 8; lcv++) {
    427             // set the pixels in the image
    428             psBinaryOp(image,image,"=",psScalarAlloc(lcv,PS_TYPE_F32));
    429             if (! psFitsWriteImage(fitsFile,NULL,image,1) ) {
    430                 psError(PS_ERR_UNKNOWN, false,
    431                         "Could not write image.");
    432                 return false;
    433             }
    434             snprintf(extname,80,"ext-%d", lcv);
    435             if (! psFitsSetExtName(fitsFile,extname) ) {
    436                 psError(PS_ERR_UNKNOWN, false,
    437                         "Could not write extension name.");
    438                 return false;
    439             }
    440         }
    441         psFree(image);
    442         psFree(fitsFile);
    443     }
    444 
    445     return true;
     483    if (! makeMulti() ) {
     484        return 1;
     485    }
     486
     487    psFits* fits = psFitsAlloc(multiFilename);
     488
     489    int numHDUs = psFitsGetSize(fits);
     490
     491    if (numHDUs < 8) {
     492        psError(PS_ERR_UNKNOWN,true,
     493                "The 'multi' FITS file does not have multiple HDUs.");
     494        return 2;
     495    }
     496
     497    char extname[80];
     498    for (int hdunum = 0; hdunum < numHDUs; hdunum++) {
     499        snprintf(extname,80,"ext-%d",hdunum);
     500
     501        psFitsMoveExtNum(fits,hdunum,false);
     502
     503        psMetadata* header = psFitsReadHeader(NULL,fits);
     504        if (header == NULL) {
     505            psError(PS_ERR_UNKNOWN, false,
     506                    "Failed to read header");
     507            return 3;
     508        }
     509
     510        psMetadata* header2 = psMetadataAlloc();
     511        header2 = psFitsReadHeader(header2,fits);
     512        if (header2 == NULL) {
     513            psError(PS_ERR_UNKNOWN, false,
     514                    "Failed to read header");
     515            return 11;
     516        }
     517
     518        if (header->list->size < 1 || header->list->size != header2->list->size) {
     519            psError(PS_ERR_UNKNOWN, true,
     520                    "Reading the header given a NULL input psMetadata differed "
     521                    "from giving an existing psMetadata.");
     522            return 12;
     523        }
     524
     525        // check for the extra metadata items
     526        psS32 intItem = psMetadataLookupS32(header, "MYINT",NULL);
     527        psF32 fltItem = psMetadataLookupF32(header, "MYFLT",NULL);
     528        psF64 dblItem = psMetadataLookupF64(header, "MYDBL",NULL);
     529        psMetadataItem* boolItem = psMetadataLookup(header, "MYBOOL");
     530        char* strItem = psMetadataLookupPtr(header, "MYSTR",NULL);
     531
     532        if (intItem != hdunum) {
     533            psError(PS_ERR_UNKNOWN, true,
     534                    "Failed to retrieve psS32 metadata item from file.");
     535            return 20;
     536        }
     537
     538        if (fabsf(fltItem - 1.0f/(float)(1+hdunum)) > FLT_EPSILON) {
     539            psError(PS_ERR_UNKNOWN, true,
     540                    "Failed to retrieve psF32 metadata item from file.  Got %f vs %f",
     541                    fltItem,1.0f/(float)(1+hdunum));
     542            return 21;
     543        }
     544
     545        if (abs(dblItem - 1.0/(double)(1+hdunum)) > DBL_EPSILON) {
     546            psError(PS_ERR_UNKNOWN, true,
     547                    "Failed to retrieve psF64 metadata item from file.  Got %g vs %g",
     548                    dblItem, 1.0/(double)(1+hdunum));
     549            return 22;
     550        }
     551
     552        if (boolItem == NULL ||
     553                boolItem->type != PS_META_PRIMITIVE ||
     554                boolItem->pType != PS_TYPE_BOOL) {
     555            psError(PS_ERR_UNKNOWN, true,
     556                    "Failed to retrieve psBool metadata item from file.");
     557            return 23;
     558        }
     559
     560        if (strItem == NULL || strncmp(strItem,extname,strlen(extname)) != 0) {
     561            psError(PS_ERR_UNKNOWN, true,
     562                    "Failed to retrieve string metadata item from file.  Got '%s' vs '%s' (%d)",
     563                    strItem,extname,strlen(extname));
     564            return 24;
     565        }
     566
     567        psFree(header);
     568        psFree(header2);
     569    }
     570
     571    psLogMsg(__func__,PS_LOG_INFO,"following should be an error (input psFits = NULL)");
     572    psMetadata* header = psFitsReadHeader(NULL,NULL);
     573
     574    if (header != NULL || psErrorGetStackSize() != 1) {
     575        psError(PS_ERR_UNKNOWN, true,
     576                "psFitsReadHeader didn't error on a NULL psFits.");
     577        return 30;
     578    }
     579
     580
     581    psFree(fits);
     582
     583    return 0;
    446584}
    447 
Note: See TracChangeset for help on using the changeset viewer.