Changeset 3025 for trunk/psLib/src/fileUtils/psFits.c
- Timestamp:
- Jan 17, 2005, 10:58:22 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/fileUtils/psFits.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fileUtils/psFits.c
r2994 r3025 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.1 0$ $Name: not supported by cvs2svn $10 * @date $Date: 2005-01-1 4 19:40:33$9 * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2005-01-17 20:58:21 $ 11 11 * 12 12 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 165 165 switch (type) { 166 166 case PS_TYPE_BOOL: 167 *fitsType = "1L";167 *fitsType = psStringCopy("1L"); 168 168 break; 169 169 case PS_TYPE_S32: 170 *fitsType = "1J";170 *fitsType = psStringCopy("1J"); 171 171 break; 172 172 case PS_TYPE_F32: 173 *fitsType = "1E";173 *fitsType = psStringCopy("1E"); 174 174 break; 175 175 case PS_TYPE_F64: 176 *fitsType = "1D";176 *fitsType = psStringCopy("1D"); 177 177 break; 178 178 // XXX: Handle other types, e.g., Vectors, etc. … … 1028 1028 1029 1029 // the row parameter in the proper range? 1030 if (row < 1 || row >numRows) {1030 if (row < 0 || row >= numRows) { 1031 1031 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 1032 1032 PS_ERRORTEXT_psFits_ROW_INVALID, … … 1056 1056 if (status == 0) { 1057 1057 1058 #define READ_TABLE_ROW_CASE(FITSTYPE, TYPE) \1058 #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \ 1059 1059 case FITSTYPE: { \ 1060 ps##TYPE value; \1060 NATIVETYPE value; \ 1061 1061 int anynul = 0; \ 1062 1062 fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \ … … 1064 1064 if (anynul == 0) { \ 1065 1065 psMetadataAdd(data,PS_LIST_TAIL, name, \ 1066 PS_TYPE_ S32, PS_META_PRIMITIVE, \1067 "", value); \1066 PS_TYPE_##TYPE, PS_META_PRIMITIVE, \ 1067 "", (ps##TYPE)value); \ 1068 1068 } \ 1069 }\1070 break;1069 break; \ 1070 } 1071 1071 1072 1072 switch (typecode) { 1073 1073 case TBYTE: 1074 1074 case TSHORT: 1075 READ_TABLE_ROW_CASE(TLONG, S32) 1076 READ_TABLE_ROW_CASE(TFLOAT, F32) 1077 READ_TABLE_ROW_CASE(TDOUBLE, F64) 1075 case TLONGLONG: 1076 READ_TABLE_ROW_CASE(TLONG, long, S32) 1077 READ_TABLE_ROW_CASE(TFLOAT, float, F32) 1078 READ_TABLE_ROW_CASE(TDOUBLE, double, F64) 1079 READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL); 1080 case TSTRING: { 1081 char* value; 1082 int anynul = 0; 1083 fits_read_col(fits->p_fd, TSTRING, col,row+1, 1084 1, 1, NULL, &value, &anynul, &status); 1085 if (anynul == 0) { 1086 psMetadataAdd(data,PS_LIST_TAIL, name, 1087 PS_TYPE_PTR, PS_META_STR, 1088 "", value); 1089 } 1090 break; 1091 } 1078 1092 default: 1079 1093 psTrace("psFits.psFitsReadTableRow", 2, … … 1266 1280 // get the size of the FITS table 1267 1281 long numRows = 0; 1268 int numCols = 0;1269 1282 fits_get_num_rows(fits->p_fd, &numRows, &status); 1270 fits_get_num_cols(fits->p_fd, &numCols, &status);1271 1283 if ( status != 0) { 1272 1284 char fitsErr[MAX_STRING_LENGTH]; … … 1278 1290 } 1279 1291 1280 psArray* table = psArrayAlloc(num Cols);1292 psArray* table = psArrayAlloc(numRows); 1281 1293 1282 1294 for (int row = 0; row < numRows; row++) { … … 1293 1305 { 1294 1306 int status = 0; 1307 psMetadataItem* item; 1295 1308 1296 1309 if (fits == NULL) { … … 1307 1320 1308 1321 int rows = table->n; 1322 if (rows < 1) { 1323 // no table data, what can I do? 1324 psError(PS_ERR_BAD_PARAMETER_SIZE, true, 1325 PS_ERRORTEXT_psFits_TABLE_EMPTY); 1326 return false; 1327 } 1309 1328 1310 1329 // find all the columns needed 1311 psArray* columns = psArrayAlloc( 16);1330 psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size); 1312 1331 columns->n=0; 1313 1332 1314 1333 // find the unique items in the array of metadata 'rows' 1315 psMetadataItem* item;1316 1334 for (int row=0; row < rows; row++) { 1317 1335 psMetadata* rowMeta = table->data[row]; … … 1329 1347 } 1330 1348 if (! found) { 1331 psArrayAdd(columns, columns->nalloc, item);1349 psArrayAdd(columns, columns->nalloc, psMemIncrRefCounter(item)); 1332 1350 } 1333 1351 } … … 1347 1365 for (int n=0; n < columns->n; n++) { 1348 1366 char* fitsType; 1349 columnNames->data[n] = ((psMetadataItem*)columns->data[n])->name;1367 columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name); 1350 1368 if ( ! convertPsTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->pType, 1351 1369 &fitsType)) { … … 1366 1384 &status); 1367 1385 1386 psFree(columnNames); 1387 psFree(columnTypes); 1388 1368 1389 // fill in the table elements with data 1369 1390 for (int n = 0; n < columns->n; n++) { 1370 1391 int row; 1371 1392 item = columns->data[n]; 1372 psArray* columnItems = psArrayAlloc(table->n);1373 for (row = 0; row < table->n; row++) {1374 columnItems->data[row] = psMetadataLookup(table->data[row],item->name);1375 }1376 1393 1377 1394 if (item->type == PS_META_PRIMITIVE) { … … 1380 1397 case PS_TYPE_S32: 1381 1398 for (row = 0; row < table->n; row++) { 1382 col->data.S32[row] = item->data.S32; 1399 col->data.S32[row] = psMetadataLookupS32( 1400 table->data[row],item->name,NULL); 1383 1401 } 1384 1402 fits_write_col_int(fits->p_fd, 1385 n , // column number1403 n+1, // column number 1386 1404 1, // firstrow 1387 1405 1, // firstelem … … 1392 1410 case PS_TYPE_F32: 1393 1411 for (row = 0; row < table->n; row++) { 1394 col->data.F32[row] = item->data.F32; 1412 col->data.F32[row] = psMetadataLookupF32( 1413 table->data[row],item->name,NULL); 1395 1414 } 1396 1415 fits_write_col_flt(fits->p_fd, 1397 n , // column number1416 n+1, // column number 1398 1417 1, // firstrow 1399 1418 1, // firstelem … … 1402 1421 &status); 1403 1422 break; 1404 case PS_TYPE_ S64:1423 case PS_TYPE_F64: 1405 1424 for (row = 0; row < table->n; row++) { 1406 col->data.F64[row] = item->data.F64; 1425 col->data.F64[row] = psMetadataLookupF64( 1426 table->data[row],item->name,NULL); 1407 1427 } 1408 1428 fits_write_col_dbl(fits->p_fd, 1409 n , // column number1429 n+1, // column number 1410 1430 1, // firstrow 1411 1431 1, // firstelem … … 1414 1434 &status); 1415 1435 break; 1436 case PS_TYPE_BOOL: 1437 for (row = 0; row < table->n; row++) { 1438 col->data.S8[row] = psMetadataLookupBool( 1439 table->data[row],item->name,NULL); 1440 } 1441 fits_write_col_log(fits->p_fd, 1442 n+1, // column number 1443 1, // firstrow 1444 1, // firstelem 1445 table->n, // nelements 1446 col->data.S8, 1447 &status); 1448 break; 1416 1449 default: 1417 1450 // XXX: error message 1418 psFree(col); 1419 psFree(columnItems); 1420 psFree(columnNames); 1421 psFree(columnTypes); 1422 psFree(columns); 1423 return false; 1451 break; 1424 1452 } 1425 1453 psFree(col); 1426 1454 } else if (item->type == PS_META_STR) { 1427 1455 psArray* col = psArrayAlloc(table->n); … … 1436 1464 (char**)col->data, 1437 1465 &status); 1438 } 1439 } 1466 psFree(col); 1467 } 1468 } 1469 1470 psFree(columns); 1440 1471 1441 1472 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
