Changeset 6767 for trunk/psLib/src/fits/psFitsTable.c
- Timestamp:
- Apr 4, 2006, 9:52:55 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fits/psFitsTable.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsTable.c
r6484 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 2-24 23:43:15$9 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2006-04-04 19:52:42 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 812 812 } 813 813 814 bool psFitsInsertTable(psFits* fits, 815 const psMetadata* header, 816 const psArray* table, 817 bool after) 818 { 819 int status = 0; 820 821 if (fits == NULL) { 822 psError(PS_ERR_BAD_PARAMETER_NULL, true, 823 PS_ERRORTEXT_psFits_NULL); 824 return false; 825 } 826 827 if (table == NULL) { 828 psError(PS_ERR_BAD_PARAMETER_NULL, true, 829 PS_ERRORTEXT_psFits_IMAGE_NULL); 830 return false; 831 } 832 833 int rows = table->n; 834 if (rows < 1) { 835 // no table data, what can I do? 836 psError(PS_ERR_BAD_PARAMETER_SIZE, true, 837 PS_ERRORTEXT_psFits_TABLE_EMPTY); 838 return false; 839 } 840 841 // find all the columns needed 842 psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->n); 843 columns->n=0; 844 845 // find the unique items in the array of metadata 'rows' 846 psMetadataItem* item; 847 for (int row=0; row < rows; row++) { 848 psMetadata* rowMeta = table->data[row]; 849 if (rowMeta != NULL) { 850 psListIterator* iter = psListIteratorAlloc(rowMeta->list, 851 PS_LIST_HEAD,true); 852 while ( (item=psListGetAndIncrement(iter)) != NULL) { 853 if (PS_DATA_IS_PRIMITIVE(item->type) || 854 item->type == PS_DATA_STRING || 855 item->type == PS_DATA_VECTOR) { 856 bool found = false; 857 psMetadataItem* fItem = NULL; 858 int n; 859 for (n=0; n < columns->n && ! found; n++) { 860 fItem = (psMetadataItem*)(columns->data[n]); 861 if (strcmp(item->name, fItem->name) == 0) { 862 found = true; 863 break; 864 } 865 } 866 if (! found) { 867 psArrayAdd(columns, columns->nalloc, item); 868 } else if (item->type == PS_DATA_STRING && 869 strlen(fItem->data.V) < strlen(item->data.V)) { 870 // got to keep the longest string value as to know what size to create the table column 871 psMemDecrRefCounter(fItem); 872 columns->data[n] = psMemIncrRefCounter(item); 873 columns->n++; 874 875 } else if (item->type == PS_DATA_VECTOR && 876 ((psVector*)(fItem->data.V))->n < ((psVector*)(item->data.V))->n) { 877 psMemDecrRefCounter(fItem); 878 columns->data[n] = psMemIncrRefCounter(item); 879 columns->n++; 880 } 881 } else { 882 // unsupported type -- treating as an error 883 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 884 "Unsupported data type (%d) for Metadata Item '%s' in row %d.", 885 item->type, item->name, row); 886 psFree(iter); 887 psFree(columns); 888 return false; 889 } 890 } 891 psFree(iter); 892 } 893 } 894 895 if (columns->n == 0) { // no table columns found 896 psError(PS_ERR_BAD_PARAMETER_SIZE, true, 897 "Did not find any column data to write to a table."); 898 psFree(columns); 899 return false; 900 } 901 902 //create list of column names and types. 903 columns->n--; 904 psArray* columnNames = psArrayAlloc(columns->n); 905 psArray* columnTypes = psArrayAlloc(columns->n); 906 for (int n=0; n < columns->n; n++) { 907 columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name); 908 columnNames->n++; 909 columnTypes->n++; 910 if ( ! getMetadataTForm((psMetadataItem*)columns->data[n], 911 (char**)&(columnTypes->data[n]),1) ) { 912 psError(PS_ERR_UNKNOWN, true, 913 "Failed to determine the FITS data type of '%s' (type=%d).", 914 columnNames->data[n], 915 ((psMetadataItem*)columns->data[n])->type); 916 psFree(columns); 917 psFree(columnNames); 918 psFree(columnTypes); 919 return false; 920 } 921 } 922 923 psString extname = NULL; 924 if (header != NULL) { 925 extname = psMetadataLookupStr(NULL, header, "EXTNAME"); 926 if ( extname == NULL) { 927 extname = psMetadataLookupStr(NULL, header, "HDUNAME"); 928 } 929 } 930 931 if (! after) { 932 if (psFitsGetExtNum(fits) == 0) { 933 // set status to signal fits_insert_img to insert a new primary HDU 934 status = PREPEND_PRIMARY; 935 } else { 936 // move back one to perform an insert after the previous HDU 937 psFitsMoveExtNum(fits, -1, true); 938 } 939 } 940 941 fits_insert_btbl(fits->fd, 942 table->n, // number of rows in table 943 columns->n, // number of columns in table 944 (char**)columnNames->data, // names of the columns 945 (char**)columnTypes->data, // format of the columns 946 NULL, // physical unit of columns 947 extname, // extension name 948 0, 949 &status); 950 951 psFree(columnNames); 952 psFree(columnTypes); 953 954 955 // fill in the table elements with data 956 for (int n = 0; n < columns->n; n++) { 957 int row; 958 item = columns->data[n]; 959 if (PS_DATA_IS_PRIMITIVE(item->type) ) { 960 psVector* col = psVectorAlloc(table->n, item->type); 961 int dataSize = PSELEMTYPE_SIZEOF(item->type); 962 int dataType; 963 convertPsTypeToFits(item->type, NULL,NULL,&dataType); 964 for (row = 0; row < table->n; row++) { 965 psMetadataItem* dataItem = psMetadataLookup( 966 table->data[row], 967 item->name); 968 memcpy(&col->data.U8[row*dataSize],&dataItem->data,dataSize); 969 } 970 fits_write_col(fits->fd, 971 dataType, 972 n+1, // column number 973 1, // firstrow 974 1, // firstelem 975 table->n, // nelements 976 col->data.U8, 977 &status); 978 psFree(col); 979 } else if (item->type == PS_DATA_STRING) { 980 psArray* colArray = psArrayAlloc(table->n); 981 for (row = 0; row < table->n; row++) { 982 colArray->data[row] = psStringCopy(psMetadataLookupStr(NULL, 983 table->data[row], 984 item->name)); 985 colArray->n++; 986 } 987 fits_write_col_str(fits->fd, 988 n+1, 989 1, 990 1, 991 table->n, 992 (char**)colArray->data, 993 &status); 994 psFree(colArray); 995 } else if (item->type == PS_DATA_VECTOR) { 996 psVector* vec = (psVector*)(item->data.V); 997 psVector* col = psVectorAlloc(table->n*vec->n, vec->type.type); 998 int dataSize = PSELEMTYPE_SIZEOF(vec->type.type)*vec->n; 999 int dataType; 1000 convertPsTypeToFits(vec->type.type, NULL,NULL,&dataType); 1001 for (row = 0; row < table->n; row++) { 1002 psMetadataItem* dataItem = psMetadataLookup( 1003 table->data[row], 1004 item->name); 1005 memcpy(&col->data.U8[row*dataSize], 1006 ((psVector*)(dataItem->data.V))->data.U8, 1007 dataSize); 1008 } 1009 fits_write_col(fits->fd, 1010 dataType, 1011 n+1, // column number 1012 1, // firstrow 1013 1, // firstelem 1014 table->n*vec->n, // nelements 1015 col->data.U8, 1016 &status); 1017 psFree(col); 1018 } 1019 if (status != 0) { 1020 char fitsErr[MAX_STRING_LENGTH]; 1021 (void)fits_get_errstatus(status, fitsErr); 1022 psError(PS_ERR_IO, true, 1023 PS_ERRORTEXT_psFits_WRITE_FAILED, 1024 fitsErr); 1025 psFree(columns); 1026 return false; 1027 } 1028 1029 } 1030 1031 psFree(columns); 1032 1033 return true; 1034 } 1035 814 1036 bool psFitsUpdateTable(psFits* fits, 815 1037 const psMetadata* data,
Note:
See TracChangeset
for help on using the changeset viewer.
