IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 19, 2009, 12:38:16 PM (17 years ago)
Author:
Paul Price
Message:

Done with development of mechanism to automatically publish detections: merging branches/pap_mops (r24510) into trunk

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/psLib/src/fits/psFitsTable.c

    r18421 r24512  
    390390
    391391
    392 bool psFitsInsertTable(psFits* fits,
    393                        const psMetadata* header,
    394                        const psArray* table,
    395                        const char *extname,
    396                        bool after)
     392static bool fitsInsertTable(psFits* fits,             // FITS file
     393                            const psMetadata* header, // FITS header to write
     394                            const psArray* table,     // Table to write
     395                            const char *extname,      // Extension name to give table
     396                            bool after,               // Write table after current extension?
     397                            bool writeData            // Write data?
     398                            )
    397399{
    398400    PS_ASSERT_FITS_NON_NULL(fits, false);
     
    403405
    404406    long numRows = table->n;
    405     if (numRows < 1) {
     407    if (writeData && numRows < 1) {
    406408        // no table data, what can I do?
    407409        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
     
    504506        fits_create_tbl(fits->fd,
    505507                        BINARY_TBL,
    506                         table->n, // number of rows in table
     508                        writeData ? numRows : 0, // number of rows in table
    507509                        numColumns, // number of columns in table
    508510                        (char**)columnNames->data, // names of the columns
     
    524526        // Insert the table
    525527        fits_insert_btbl(fits->fd,
    526                          table->n, // number of rows in table
     528                         writeData ? numRows : 0, // number of rows in table
    527529                         numColumns, // number of columns in table
    528530                         (char**)columnNames->data, // names of the columns
     
    562564
    563565    // cfitsio requires that we write the data by columns --- urgh!
    564     psMetadataIteratorSet(colSpecsIter, PS_LIST_HEAD);
    565     for (long colNum = 1; (colSpecItem = psMetadataGetAndIncrement(colSpecsIter)); colNum++) {
    566         // Note: colNum is unit-indexed, because it's for cfitsio
    567         colSpec *spec = colSpecItem->data.V; // The specification
    568         if (PS_DATA_IS_PRIMITIVE(spec->type)) {
    569             size_t dataSize = PSELEMTYPE_SIZEOF(spec->type); // Size (in bytes) of this type
    570             psVector *columnData = psVectorAlloc(table->n, spec->type); // The raw row data, to be written
    571             psVectorInit(columnData, 0);
    572             for (long i = 0; i < table->n; i++) {
    573                 psMetadata *row = table->data[i]; // The row of interest
    574                 psMetadataItem *dataItem = psMetadataLookup(row, colSpecItem->name); // The value of interest
    575                 memcpy(&columnData->data.U8[i * dataSize], &dataItem->data, dataSize);
     566    if (writeData) {
     567        psMetadataIteratorSet(colSpecsIter, PS_LIST_HEAD);
     568        for (long colNum = 1; (colSpecItem = psMetadataGetAndIncrement(colSpecsIter)); colNum++) {
     569            // Note: colNum is unit-indexed, because it's for cfitsio
     570            colSpec *spec = colSpecItem->data.V; // The specification
     571            if (PS_DATA_IS_PRIMITIVE(spec->type)) {
     572                size_t dataSize = PSELEMTYPE_SIZEOF(spec->type); // Size (in bytes) of this type
     573                psVector *columnData = psVectorAlloc(table->n, spec->type); // The raw row data, to be written
     574                psVectorInit(columnData, 0);
     575                for (long i = 0; i < table->n; i++) {
     576                    psMetadata *row = table->data[i]; // The row of interest
     577                    psMetadataItem *dataItem = psMetadataLookup(row, colSpecItem->name); // Value of interest
     578                    memcpy(&columnData->data.U8[i * dataSize], &dataItem->data, dataSize);
     579                }
     580
     581                int fitsDataType;           // Data type for cfitsio
     582                p_psFitsTypeToCfitsio(spec->type, NULL, NULL, &fitsDataType);
     583                fits_write_col(fits->fd,
     584                               fitsDataType,
     585                               colNum, // column number
     586                               1, // first row
     587                               1, // first element
     588                               table->n, // number of rows
     589                               columnData->data.U8, // the data
     590                               &status);
     591                psFree(columnData);
     592            } else {
     593                switch (spec->type) {
     594                  case PS_DATA_STRING: {
     595                      psArray *strings = psArrayAlloc(table->n); // Array of strings
     596                      for (long i = 0; i < table->n; i++) {
     597                          psMetadata *row = table->data[i]; // The row of interest
     598                          strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row,
     599                                                                                     colSpecItem->name));
     600                      }
     601                      fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status);
     602                      psFree(strings);
     603                      break;
     604                  }
     605                  case PS_DATA_VECTOR: {
     606                      size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes
     607                      psVector *columnData = psVectorAlloc(spec->size * table->n * dataSize, PS_TYPE_U8);
     608                      psVectorInit(columnData, 0);
     609                      for (long i = 0; i < table->n; i++) {
     610                          psMetadata *row = table->data[i]; // The row of interest
     611                          psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name);
     612                          if (dataItem->type != PS_DATA_VECTOR) {
     613                              // Just in case --- get a zero instead of some weird result
     614                              continue;
     615                          }
     616                          psVector *vector = dataItem->data.V;
     617                          memcpy(&columnData->data.U8[i * dataSize * spec->size], vector->data.U8,
     618                                 vector->n * dataSize);
     619                      }
     620
     621                      int fitsDataType;           // Data type for cfitsio
     622                      p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType);
     623                      fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size,
     624                                     columnData->data.U8, &status);
     625                      psFree(columnData);
     626                      break;
     627                  }
     628                  default:
     629                    psAbort("Should never get here.\n");
     630                }
    576631            }
    577632
    578             int fitsDataType;           // Data type for cfitsio
    579             p_psFitsTypeToCfitsio(spec->type, NULL, NULL, &fitsDataType);
    580             fits_write_col(fits->fd,
    581                            fitsDataType,
    582                            colNum, // column number
    583                            1, // first row
    584                            1, // first element
    585                            table->n, // number of rows
    586                            columnData->data.U8, // the data
    587                            &status);
    588             psFree(columnData);
    589         } else {
    590             switch (spec->type) {
    591             case PS_DATA_STRING: {
    592                     psArray *strings = psArrayAlloc(table->n); // Array of strings
    593                     for (long i = 0; i < table->n; i++) {
    594                         psMetadata *row = table->data[i]; // The row of interest
    595                         strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row,
    596                                                                colSpecItem->name));
    597                     }
    598                     fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status);
    599                     psFree(strings);
    600                     break;
    601                 }
    602             case PS_DATA_VECTOR: {
    603                     size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes
    604                     psVector *columnData = psVectorAlloc(spec->size * table->n * dataSize, PS_TYPE_U8);
    605                     psVectorInit(columnData, 0);
    606                     for (long i = 0; i < table->n; i++) {
    607                         psMetadata *row = table->data[i]; // The row of interest
    608                         psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name);
    609                         if (dataItem->type != PS_DATA_VECTOR) {
    610                             // Just in case --- get a zero instead of some weird result
    611                             continue;
    612                         }
    613                         psVector *vector = dataItem->data.V;
    614                         memcpy(&columnData->data.U8[i * dataSize * spec->size], vector->data.U8,
    615                                vector->n * dataSize);
    616                     }
    617 
    618                     int fitsDataType;           // Data type for cfitsio
    619                     p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType);
    620                     fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size,
    621                                    columnData->data.U8, &status);
    622                     psFree(columnData);
    623                     break;
    624                 }
    625             default:
    626                 psAbort("Should never get here.\n");
     633            // Check error status from writing column
     634            if (status != 0) {
     635                psFitsError(status, true, "Unable to write column %ld of FITS table", colNum);
     636                psFree(colSpecsIter);
     637                psFree(colSpecs);
     638                return false;
    627639            }
    628         }
    629 
    630         // Check error status from writing column
    631         if (status != 0) {
    632             psFitsError(status, true, "Unable to write column %ld of FITS table", colNum);
    633             psFree(colSpecsIter);
    634             psFree(colSpecs);
    635             return false;
    636640        }
    637641    }
     
    650654    return true;
    651655}
     656
     657
     658bool psFitsInsertTable(psFits* fits, const psMetadata* header, const psArray* table, const char *extname,
     659                       bool after)
     660{
     661    PS_ASSERT_FITS_NON_NULL(fits, false);
     662    PS_ASSERT_FITS_WRITABLE(fits, false);
     663    return fitsInsertTable(fits, header, table, extname, after, true);
     664}
     665
     666bool psFitsWriteTableEmpty(psFits *fits, const psMetadata *header, const psMetadata *columns,
     667                           const char *extname)
     668{
     669    PS_ASSERT_FITS_NON_NULL(fits, false);
     670    PS_ASSERT_FITS_WRITABLE(fits, false);
     671    if (!psFitsMoveLast(fits)) {
     672        psError(PS_ERR_UNKNOWN, false, "Unable to move to last extension to write table");
     673        return false;
     674    }
     675    psArray *table = psArrayAlloc(1);   // Dummy table carrying column definitions
     676    table->data[0] = psMemIncrRefCounter((psPtr)columns); // Casting away const
     677    bool status = fitsInsertTable(fits, header, table, extname, true, false); // Status of insertion
     678    psFree(table);
     679    return status;
     680}
     681
     682bool psFitsInsertTableEmpty(psFits *fits, const psMetadata *header, const psMetadata *columns,
     683                            const char *extname, bool after)
     684{
     685    PS_ASSERT_FITS_NON_NULL(fits, false);
     686    PS_ASSERT_FITS_WRITABLE(fits, false);
     687    psArray *table = psArrayAlloc(1);   // Dummy table carrying column definitions
     688    table->data[0] = psMemIncrRefCounter((psPtr)columns); // Casting away const
     689    bool status = fitsInsertTable(fits, header, table, extname, after, false); // Status of insertion
     690    psFree(table);
     691    return status;
     692}
     693
    652694
    653695bool psFitsUpdateTable(psFits* fits,
Note: See TracChangeset for help on using the changeset viewer.