Changeset 7981 for trunk/psLib/src
- Timestamp:
- Jul 25, 2006, 4:59:58 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFitsTable.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsTable.c
r7980 r7981 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.1 6$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-07-26 02: 19:47$9 * @version $Revision: 1.17 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2006-07-26 02:59:58 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 456 456 return 'A'; 457 457 default: 458 psError(PS_ERR_UNKNOWN, true, "Unknown type: %x\n", type); 458 459 return '?'; 459 460 } … … 571 572 columnNames->data[i] = psMemIncrRefCounter(colSpecItem->name); 572 573 psString colType = NULL; // The column type 573 psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->type)); 574 if (spec->type == PS_DATA_VECTOR) { 575 psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->vectorType)); 576 } else { 577 psStringAppend(&colType, "%d%c", spec->size, getTForm(spec->type)); 578 } 574 579 columnTypes->data[i] = colType; 575 580 } … … 612 617 psFree(columnTypes); 613 618 619 if (status != 0) { 620 char fitsErr[MAX_STRING_LENGTH]; 621 fits_get_errstatus(status, fitsErr); 622 psError(PS_ERR_LOCATION_INVALID, true, "Unable to create FITS table with %d columns and %d rows:", 623 numColumns, table->n, fitsErr); 624 psFree(colSpecsIter); 625 psFree(colSpecs); 626 return false; 627 } 628 614 629 // Write header 615 630 if (header && !psFitsWriteHeader(fits, header)) { 616 631 psError(PS_ERR_IO, false, "Unable to write FITS header.\n"); 632 psFree(colSpecsIter); 633 psFree(colSpecs); 617 634 return false; 618 635 } … … 646 663 &status); 647 664 psFree(columnData); 648 continue; 649 } 650 651 switch (spec->type) { 652 case PS_DATA_STRING: { 653 psArray *strings = psArrayAlloc(table->n); // Array of strings 654 strings->n = table->n; 655 for (long i = 0; i < table->n; i++) { 656 psMetadata *row = table->data[i]; // The row of interest 657 strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row, colSpecItem->name)); 665 } else { 666 switch (spec->type) { 667 case PS_DATA_STRING: { 668 psArray *strings = psArrayAlloc(table->n); // Array of strings 669 strings->n = table->n; 670 for (long i = 0; i < table->n; i++) { 671 psMetadata *row = table->data[i]; // The row of interest 672 strings->data[i] = psMemIncrRefCounter(psMetadataLookupStr(NULL, row, 673 colSpecItem->name)); 674 } 675 fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status); 676 psFree(strings); 677 break; 658 678 } 659 fits_write_col_str(fits->fd, colNum, 1, 1, table->n, (char**)strings->data, &status); 660 psFree(strings); 661 break; 679 case PS_DATA_VECTOR: { 680 psVector *columnData = psVectorAlloc(spec->size * table->n, spec->vectorType); 681 psVectorInit(columnData, 0); 682 size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes 683 for (long i = 0; i < table->n; i++) { 684 psMetadata *row = table->data[i]; // The row of interest 685 psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name); 686 if (dataItem->type != PS_DATA_VECTOR) { 687 // Just in case --- get a zero instead of some weird result 688 continue; 689 } 690 psVector *vector = dataItem->data.V; 691 memcpy(&columnData->data.U8[i * dataSize], vector->data.U8, dataSize); 692 } 693 694 int fitsDataType; // Data type for cfitsio 695 p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType); 696 fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size, 697 columnData->data.U8, &status); 698 psFree(columnData); 699 break; 700 } 701 default: 702 psAbort(__func__, "Should never get here.\n"); 662 703 } 663 case PS_DATA_VECTOR: { 664 psVector *columnData = psVectorAlloc(spec->size * table->n, spec->vectorType); 665 psVectorInit(columnData, 0); 666 size_t dataSize = PSELEMTYPE_SIZEOF(spec->vectorType); // Size of data, in bytes 667 for (long i = 0; i < table->n; i++) { 668 psMetadata *row = table->data[i]; // The row of interest 669 psMetadataItem* dataItem = psMetadataLookup(row, colSpecItem->name); 670 if (dataItem->type != PS_DATA_VECTOR) { 671 // Just in case --- get a zero instead of some weird result 672 continue; 673 } 674 psVector *vector = dataItem->data.V; 675 memcpy(&columnData->data.U8[i * dataSize], vector->data.U8, dataSize); 676 } 677 678 int fitsDataType; // Data type for cfitsio 679 p_psFitsTypeToCfitsio(spec->vectorType, NULL, NULL, &fitsDataType); 680 fits_write_col(fits->fd, fitsDataType, colNum, 1, 1, table->n * spec->size, columnData->data.U8, 681 &status); 682 psFree(columnData); 683 break; 684 } 685 default: 686 psAbort(__func__, "Should never get here.\n"); 704 } 705 706 // Check error status from writing column 707 if (status != 0) { 708 char fitsErr[MAX_STRING_LENGTH]; 709 fits_get_errstatus(status, fitsErr); 710 psError(PS_ERR_LOCATION_INVALID, true, "Unable to write column %d of FITS table:", 711 colNum, fitsErr); 712 psFree(colSpecsIter); 713 psFree(colSpecs); 714 return false; 687 715 } 688 716 }
Note:
See TracChangeset
for help on using the changeset viewer.
