Changeset 24512 for trunk/psLib/src/fits/psFitsTable.c
- Timestamp:
- Jun 19, 2009, 12:38:16 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
psLib/src/fits/psFitsTable.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/pap_mops (added) merged: 24221,24373,24375-24377,24392,24413,24416,24427-24430,24435-24439,24442-24452,24456-24457,24499,24501,24503-24505,24507,24509
- Property svn:mergeinfo changed
-
trunk/psLib/src/fits/psFitsTable.c
r18421 r24512 390 390 391 391 392 bool psFitsInsertTable(psFits* fits, 393 const psMetadata* header, 394 const psArray* table, 395 const char *extname, 396 bool after) 392 static 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 ) 397 399 { 398 400 PS_ASSERT_FITS_NON_NULL(fits, false); … … 403 405 404 406 long numRows = table->n; 405 if ( numRows < 1) {407 if (writeData && numRows < 1) { 406 408 // no table data, what can I do? 407 409 psError(PS_ERR_BAD_PARAMETER_SIZE, true, … … 504 506 fits_create_tbl(fits->fd, 505 507 BINARY_TBL, 506 table->n, // number of rows in table508 writeData ? numRows : 0, // number of rows in table 507 509 numColumns, // number of columns in table 508 510 (char**)columnNames->data, // names of the columns … … 524 526 // Insert the table 525 527 fits_insert_btbl(fits->fd, 526 table->n, // number of rows in table528 writeData ? numRows : 0, // number of rows in table 527 529 numColumns, // number of columns in table 528 530 (char**)columnNames->data, // names of the columns … … 562 564 563 565 // 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 } 576 631 } 577 632 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; 627 639 } 628 }629 630 // Check error status from writing column631 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;636 640 } 637 641 } … … 650 654 return true; 651 655 } 656 657 658 bool 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 666 bool 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 682 bool 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 652 694 653 695 bool psFitsUpdateTable(psFits* fits,
Note:
See TracChangeset
for help on using the changeset viewer.
