Changeset 5164
- Timestamp:
- Sep 27, 2005, 4:38:01 PM (21 years ago)
- Location:
- trunk/psLib
- Files:
-
- 2 edited
-
src/fits/psFits.c (modified) (8 diffs)
-
test/fits/tst_psFits.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFits.c
r5149 r5164 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.4 8$ $Name: not supported by cvs2svn $10 * @date $Date: 2005-09-2 7 19:55:32$9 * @version $Revision: 1.49 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2005-09-28 02:37:58 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 24 24 #include "psLogMsg.h" 25 25 #include "psTrace.h" 26 #include "psVector.h" 26 27 27 28 #define MAX_STRING_LENGTH 256 // maximum length string for FITS routines … … 165 166 } 166 167 167 static bool convertMetadataTypeToBinaryTForm(psDataType type, char** fitsType)168 static char getTForm(int type) 168 169 { 169 170 switch (type) { 170 case PS_DATA_BOOL: 171 *fitsType = psStringCopy("1L"); 172 break; 173 case PS_DATA_S32: 174 *fitsType = psStringCopy("1J"); 175 break; 176 case PS_DATA_F32: 177 *fitsType = psStringCopy("1E"); 178 break; 179 case PS_DATA_F64: 180 *fitsType = psStringCopy("1D"); 181 break; 171 case PS_TYPE_U8: 172 case PS_TYPE_S8: 173 return 'B'; 174 case PS_TYPE_S16: 175 return 'I'; 176 case PS_TYPE_S32: 177 return 'J'; 178 case PS_TYPE_U64: 179 case PS_TYPE_S64: 180 return 'K'; 181 case PS_TYPE_U16: 182 return 'U'; 183 case PS_TYPE_U32: 184 return 'V'; 185 case PS_TYPE_F32: 186 return 'E'; 187 case PS_TYPE_F64: 188 return 'D'; 189 case PS_TYPE_C32: 190 return 'C'; 191 case PS_TYPE_C64: 192 return 'M'; 193 case PS_TYPE_BOOL: 194 return 'L'; 182 195 case PS_DATA_STRING: 183 *fitsType = psStringCopy("A"); 184 break; 185 // XXX: Handle other types, e.g., Vectors, etc. 196 return 'A'; 197 default: 198 return '?'; 199 } 200 } 201 202 203 static bool getMetadataTForm(psMetadataItem* item, char** fitsType, int repeat) 204 { 205 if (item == NULL) { 206 return false; 207 } 208 209 *fitsType = NULL; 210 char tform = getTForm(item->type); 211 212 switch (item->type) { 213 case PS_TYPE_U8: 214 case PS_TYPE_S8: 215 case PS_TYPE_S16: 216 case PS_TYPE_S32: 217 case PS_TYPE_U64: 218 case PS_TYPE_S64: 219 case PS_TYPE_U16: 220 case PS_TYPE_U32: 221 case PS_TYPE_F32: 222 case PS_TYPE_F64: 223 case PS_TYPE_C32: 224 case PS_TYPE_C64: 225 case PS_TYPE_BOOL: 226 psStringAppend(fitsType, "%d%c",repeat,tform); 227 break; 228 229 case PS_DATA_STRING: 230 psStringAppend(fitsType,"%dA", 231 strlen(item->data.V)*repeat); 232 break; 233 234 case PS_DATA_VECTOR: { 235 psVector* vec = item->data.V; 236 tform = getTForm(vec->type.type); 237 psStringAppend(fitsType,"%d%c",repeat*vec->n,tform); 238 } 239 break; 240 186 241 default: 187 242 return false; … … 1503 1558 PS_LIST_HEAD,true); 1504 1559 while ( (item=psListGetAndIncrement(iter)) != NULL) { 1505 if (PS_DATA_IS_PRIMITIVE(item->type) || item->type == PS_DATA_STRING) { 1560 if (PS_DATA_IS_PRIMITIVE(item->type) || 1561 item->type == PS_DATA_STRING || 1562 item->type == PS_DATA_VECTOR) { 1506 1563 bool found = false; 1507 1564 psMetadataItem* fItem = NULL; … … 1522 1579 columns->data[n] = psMemIncrRefCounter(item); 1523 1580 1581 } else if (item->type == PS_DATA_VECTOR && 1582 ((psVector*)(fItem->data.V))->n < ((psVector*)(item->data.V))->n) { 1583 psMemDecrRefCounter(fItem); 1584 columns->data[n] = psMemIncrRefCounter(item); 1524 1585 } 1525 1526 1586 } 1527 1587 } … … 1541 1601 char* fitsType; 1542 1602 columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name); 1543 if ( ! convertMetadataTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->type,1544 &fitsType)) {1603 if ( ! getMetadataTForm((psMetadataItem*)columns->data[n], 1604 &fitsType,1) ) { 1545 1605 // XXX: error message 1546 1606 return false; 1547 }1548 if (fitsType[strlen(fitsType)-1] == 'A') {1549 // string type -- append length to the type.1550 psStringPrepend(&fitsType,"%d",strlen(((psMetadataItem*)columns->data[n])->data.V));1551 1607 } 1552 1608 columnTypes->data[n] = fitsType; … … 1578 1634 int row; 1579 1635 item = columns->data[n]; 1580 psVector* col = NULL;1581 psArray* colArray = NULL;1582 switch (item->type) {1583 case PS_DATA_S32:1584 co l = psVectorAlloc(table->n, PS_TYPE_S32);1636 if (PS_DATA_IS_PRIMITIVE(item->type) ) { 1637 psVector* col = psVectorAlloc(table->n, item->type); 1638 int dataSize = PSELEMTYPE_SIZEOF(item->type); 1639 int dataType; 1640 convertPsTypeToFits(item->type, NULL,NULL,&dataType); 1585 1641 for (row = 0; row < table->n; row++) { 1586 col->data.S32[row] = psMetadataLookupS32(NULL, 1587 table->data[row], 1588 item->name); 1642 psMetadataItem* dataItem = psMetadataLookup( 1643 table->data[row], 1644 item->name); 1645 memcpy(&col->data.U8[row*dataSize],&dataItem->data,dataSize); 1589 1646 } 1590 fits_write_col_int(fits->fd, 1591 n+1, // column number 1592 1, // firstrow 1593 1, // firstelem 1594 table->n, // nelements 1595 col->data.S32, 1596 &status); 1597 break; 1598 1599 case PS_DATA_F32: 1600 col = psVectorAlloc(table->n, PS_TYPE_F32); 1601 for (row = 0; row < table->n; row++) { 1602 col->data.F32[row] = psMetadataLookupF32(NULL, 1603 table->data[row], 1604 item->name); 1605 } 1606 fits_write_col_flt(fits->fd, 1607 n+1, // column number 1608 1, // firstrow 1609 1, // firstelem 1610 table->n, // nelements 1611 col->data.F32, 1612 &status); 1613 break; 1614 1615 case PS_DATA_F64: 1616 col = psVectorAlloc(table->n, PS_TYPE_F64); 1617 for (row = 0; row < table->n; row++) { 1618 col->data.F64[row] = psMetadataLookupF64(NULL, 1619 table->data[row], 1620 item->name); 1621 } 1622 fits_write_col_dbl(fits->fd, 1623 n+1, // column number 1624 1, // firstrow 1625 1, // firstelem 1626 table->n, // nelements 1627 col->data.F64, 1628 &status); 1629 break; 1630 1631 case PS_DATA_BOOL: 1632 col = psVectorAlloc(table->n, PS_TYPE_BOOL); 1633 for (row = 0; row < table->n; row++) { 1634 col->data.S8[row] = psMetadataLookupBool(NULL, 1635 table->data[row], 1636 item->name); 1637 } 1638 fits_write_col_log(fits->fd, 1639 n+1, // column number 1640 1, // firstrow 1641 1, // firstelem 1642 table->n, // nelements 1643 (char*)col->data.S8, 1644 &status); 1645 break; 1646 1647 case PS_DATA_STRING: 1648 colArray = psArrayAlloc(table->n); 1647 fits_write_col(fits->fd, 1648 dataType, 1649 n+1, // column number 1650 1, // firstrow 1651 1, // firstelem 1652 table->n, // nelements 1653 col->data.U8, 1654 &status); 1655 psFree(col); 1656 } else if (item->type == PS_DATA_STRING) { 1657 psArray* colArray = psArrayAlloc(table->n); 1649 1658 for (row = 0; row < table->n; row++) { 1650 1659 colArray->data[row] = psMemIncrRefCounter( … … 1661 1670 &status); 1662 1671 psFree(colArray); 1663 break; 1664 1665 default: 1666 // XXX: error message? 1667 break; 1668 } 1669 psFree(col); 1672 } else if (item->type == PS_DATA_VECTOR) { 1673 psVector* vec = (psVector*)(item->data.V); 1674 psVector* col = psVectorAlloc(table->n*vec->n, vec->type.type); 1675 int dataSize = PSELEMTYPE_SIZEOF(vec->type.type)*vec->n; 1676 int dataType; 1677 convertPsTypeToFits(vec->type.type, NULL,NULL,&dataType); 1678 for (row = 0; row < table->n; row++) { 1679 psMetadataItem* dataItem = psMetadataLookup( 1680 table->data[row], 1681 item->name); 1682 memcpy(&col->data.U8[row*dataSize], 1683 ((psVector*)(dataItem->data.V))->data.U8, 1684 dataSize); 1685 } 1686 fits_write_col(fits->fd, 1687 dataType, 1688 n+1, // column number 1689 1, // firstrow 1690 1, // firstelem 1691 table->n*vec->n, // nelements 1692 col->data.U8, 1693 &status); 1694 psFree(col); 1695 } 1670 1696 if (status != 0) { 1671 1697 char fitsErr[MAX_STRING_LENGTH]; -
trunk/psLib/test/fits/tst_psFits.c
r5147 r5164 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 9$ $Name: not supported by cvs2svn $9 * @date $Date: 2005-09-2 7 19:54:52$8 * @version $Revision: 1.10 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2005-09-28 02:38:01 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 201 201 str); 202 202 psFree(str); 203 204 psVector* vec = psVectorAlloc(5,PS_TYPE_S32); 205 for (int x=0; x < 5; x++) { 206 vec->data.S32[x] = x*2; 207 } 208 psMetadataAdd(header,PS_LIST_TAIL, "MYVEC", 209 PS_DATA_VECTOR, 210 "psVector Item", 211 vec); 212 psFree(vec); 203 213 204 214 table->data[row] = header;
Note:
See TracChangeset
for help on using the changeset viewer.
