Changeset 6767
- Timestamp:
- Apr 4, 2006, 9:52:55 AM (20 years ago)
- Location:
- trunk/psLib
- Files:
-
- 12 edited
-
src/fits/psFits.c (modified) (6 diffs)
-
src/fits/psFits.h (modified) (2 diffs)
-
src/fits/psFitsHeader.c (modified) (7 diffs)
-
src/fits/psFitsHeader.h (modified) (3 diffs)
-
src/fits/psFitsImage.c (modified) (8 diffs)
-
src/fits/psFitsImage.h (modified) (3 diffs)
-
src/fits/psFitsTable.c (modified) (2 diffs)
-
src/fits/psFitsTable.h (modified) (4 diffs)
-
test/fits/tst_psFits.c (modified) (13 diffs)
-
test/fits/verified/tst_psFits.stderr (modified) (1 diff)
-
test/imageops/tst_psImageGeomManip.c (modified) (2 diffs)
-
test/sys/tst_psMemory.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFits.c
r6354 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.5 2$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 2-08 01:03:34$9 * @version $Revision: 1.53 $ $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 … … 166 166 psFits* fits = psAlloc(sizeof(psFits)); 167 167 fits->fd = fptr; 168 fits->writable = (iomode == READWRITE); 168 169 psMemSetDeallocator(fits,(psFreeFunc)fitsFree); 169 170 … … 252 253 return false; 253 254 } 254 255 return psFitsMoveExtNum(fits,psFitsGetSize(fits),false); 255 int size = psFitsGetSize(fits); 256 if (size == 0) { // empty file -- no action needed 257 return true; 258 } else { 259 return psFitsMoveExtNum(fits,size-1,false); 260 } 256 261 } 257 262 … … 329 334 } 330 335 336 if (! fits->writable) { 337 psError(PS_ERR_IO, true, 338 PS_ERRORTEXT_psFits_NOT_WRITABLE); 339 return false; 340 } 341 331 342 // move to the specified HDU 332 343 if (! psFitsMoveExtNum(fits,extnum,relative) ) { … … 361 372 } 362 373 374 if (! fits->writable) { 375 psError(PS_ERR_IO, true, 376 PS_ERRORTEXT_psFits_NOT_WRITABLE); 377 return false; 378 } 379 363 380 // move to the specified HDU 364 381 if (! psFitsMoveExtName(fits,extname) ) { … … 442 459 psError(PS_ERR_BAD_PARAMETER_NULL, true, 443 460 PS_ERRORTEXT_psFits_NULL); 461 return PS_FITS_TYPE_NONE; 462 } 463 464 if (! fits->writable) { 465 psError(PS_ERR_IO, true, 466 PS_ERRORTEXT_psFits_NOT_WRITABLE); 444 467 return PS_FITS_TYPE_NONE; 445 468 } -
trunk/psLib/src/fits/psFits.h
r6354 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.2 3$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 2-08 01:03:34$9 * @version $Revision: 1.24 $ $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 … … 49 49 { 50 50 fitsfile* fd; ///< the CFITSIO fits files handle. 51 bool writable; ///< Is the file writable? 51 52 } 52 53 psFits; -
trunk/psLib/src/fits/psFitsHeader.c
r6354 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 2$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 2-08 01:03:34$9 * @version $Revision: 1.3 $ $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 … … 90 90 switch (keyType) { 91 91 case 'X': // bit 92 case 'B': // byte 93 success = psMetadataAdd(out, 94 PS_LIST_TAIL, 95 keyName, 96 PS_DATA_S8 | PS_META_DUPLICATE_OK, 97 keyComment, 98 atoi(keyValue)); 99 break; 92 100 case 'I': // short int. 101 success = psMetadataAdd(out, 102 PS_LIST_TAIL, 103 keyName, 104 PS_DATA_S16 | PS_META_DUPLICATE_OK, 105 keyComment, 106 (psS16)atoi(keyValue)); 107 break; 93 108 case 'J': // int. 94 case 'B': // byte95 109 success = psMetadataAdd(out, 96 110 PS_LIST_TAIL, … … 100 114 atoi(keyValue)); 101 115 break; 102 case 'U': // unsigned int. may not fit in a psS32 103 case 'K': // long int. can't all fit in a psS32 116 case 'U': // unsigned int. 117 success = psMetadataAdd(out, 118 PS_LIST_TAIL, 119 keyName, 120 PS_DATA_U32 | PS_META_DUPLICATE_OK, 121 keyComment, 122 atol(keyValue)); 123 break; 124 125 case 'K': // long int. can't all fit in a psS32, put in psF64 104 126 case 'F': 105 127 success = psMetadataAdd(out, … … 167 189 } 168 190 169 psMetadata* psFitsReadHeaderSet( const psFits* fits)191 psMetadata* psFitsReadHeaderSet(psMetadata* out, const psFits* fits) 170 192 { 171 193 if (fits == NULL) { 172 194 psError(PS_ERR_BAD_PARAMETER_NULL, true, 173 195 PS_ERRORTEXT_psFits_NULL); 196 psFree(out); 174 197 return NULL; 175 198 } 176 199 177 psMetadata* out = psMetadataAlloc(); 200 if (out == NULL) { 201 out = psMetadataAlloc(); 202 } 178 203 179 204 int size = psFitsGetSize(fits); … … 244 269 break; 245 270 } 271 case PS_DATA_S8: 272 fits_update_key(fits->fd, 273 TBYTE, 274 item->name, 275 &item->data.S8, 276 item->comment, 277 &status); 278 break; 279 case PS_DATA_S16: 280 fits_update_key(fits->fd, 281 TSHORT, 282 item->name, 283 &item->data.S16, 284 item->comment, 285 &status); 286 break; 246 287 case PS_DATA_S32: 247 288 fits_update_key(fits->fd, … … 249 290 item->name, 250 291 &item->data.S32, 292 item->comment, 293 &status); 294 break; 295 case PS_DATA_U8: { 296 unsigned short int temp = item->data.U8; 297 fits_update_key(fits->fd, 298 TUSHORT, 299 item->name, 300 &temp, 301 item->comment, 302 &status); 303 } 304 break; 305 case PS_DATA_U16: 306 fits_update_key(fits->fd, 307 TUSHORT, 308 item->name, 309 &item->data.U16, 310 item->comment, 311 &status); 312 break; 313 case PS_DATA_U32: 314 fits_update_key(fits->fd, 315 TUINT, 316 item->name, 317 &item->data.U32, 251 318 item->comment, 252 319 &status); … … 290 357 } 291 358 359 psFree(iter); 360 292 361 return true; 293 362 } 294 363 364 bool psFitsHeaderValidate(psMetadata *header) 365 { 366 bool valid = true; 367 int status; 368 369 if (header == NULL) { 370 psError(PS_ERR_BAD_PARAMETER_NULL, true, 371 PS_ERRORTEXT_psFits_METADATA_NULL); 372 return false; 373 } 374 375 //transverse the metadata list and inspect at each key 376 377 psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true); 378 psMetadataItem* item; 379 while ( (item=psListGetAndIncrement(iter)) != NULL ) { 380 psDataType type = item->type; 381 382 if (type > PS_DATA_STRING) { // i.e., a non-primitive type 383 valid = false; 384 } 385 386 if (strlen(item->name) > 8) { 387 item->name[8] = '\0'; // truncate to 8 characters 388 } 389 390 fits_uppercase(item->name); // make uppercase 391 392 // now, let's see if CFITSIO thinks this is a good keyword... 393 status = 0; 394 if (fits_test_keyword(item->name,&status) != 0) { 395 valid = false; 396 } 397 } 398 399 psFree(iter); 400 401 return valid; 402 } -
trunk/psLib/src/fits/psFitsHeader.h
r6354 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 2$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-0 2-08 01:03:34$9 * @version $Revision: 1.3 $ $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 … … 37 37 */ 38 38 psMetadata* psFitsReadHeaderSet( 39 psMetadata* out, ///< output metadata or NULL if new psMetadata is to be created. 39 40 const psFits* fits ///< the psFits object 40 41 ); … … 49 50 ); 50 51 51 /** Updates the given header to be compatible with the supplied image, updating 52 * BITPIX, NAXIS1, and NAXIS2. The extension name is (re)set to the given 53 * extname. 52 /** psFitsHeaderValidate validates the supplied header so that it is in 53 * compliance to the FITS standard for header keyword names and types. 54 54 * 55 * @return psMetadata* updated header. 55 * @return bool TRUE if the resulting header conforms to the FITS 56 * standard, otherwise FALSE 56 57 */ 57 psMetadata* psFitsHeaderFromImage( 58 psMetadata* header, ///< the header to update 59 psImage* image, ///< the image to use to determine update values 60 const char* extname ///< the extension name 61 ); 62 63 /** Updates the given header to be compatible with the given table, i.e. psArray 64 * of psMetadata. The extension name is (re)set to the given extname. 65 */ 66 psMetadata* psFitsHeaderFromTable( 67 psMetadata* header, ///< the header to update 68 psArray* table, ///< the table to use to update header 69 const char* extname ///< the extension name 70 ); 58 bool psFitsHeaderValidate(psMetadata *header); 71 59 72 60 /// @} -
trunk/psLib/src/fits/psFitsImage.c
r5511 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $10 * @date $Date: 200 5-11-14 22:18:30$9 * @version $Revision: 1.2 $ $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 … … 16 16 17 17 #include "psFits.h" 18 #include "psFitsImage.h" 18 19 #include "string.h" 19 20 #include "psError.h" … … 292 293 psMetadata* header, 293 294 const psImage* input, 294 int numZPlanes) 295 int numZPlanes, 296 const char* extname) 297 { 298 // this is equivalent to insert after the last HDU 299 300 psFitsMoveLast(fits); 301 return psFitsInsertImage(fits,header,input,numZPlanes,extname,true); 302 } 303 304 bool psFitsInsertImage(psFits* fits, 305 psMetadata* header, 306 const psImage* input, 307 int numZPlanes, 308 const char* extname, 309 bool after) 295 310 { 296 311 … … 330 345 } 331 346 332 fits_create_img(fits->fd, bitPix, naxis, naxes, &status); 347 int chdu = psFitsGetExtNum(fits); 348 int hdus = psFitsGetSize(fits); 349 if (! after) { 350 if (chdu == 0) { 351 // set status to signal fits_insert_img to insert a new primary HDU 352 status = PREPEND_PRIMARY; 353 } else if (hdus > 0) { 354 // move back one to perform an insert after the previous HDU 355 psFitsMoveExtNum(fits, -1, true); 356 } 357 } 358 359 if (hdus == 0) { 360 status = 0; 361 fits_create_img(fits->fd, bitPix, naxis, naxes, &status); 362 363 } else { 364 fits_insert_img(fits->fd, bitPix, naxis, naxes, &status); 365 } 333 366 334 367 if (bZero != 0) { // set the bscale/bzero … … 339 372 340 373 // write the header, if any. 374 if (extname != NULL) { 375 psFitsSetExtName(fits,extname); 376 } 377 341 378 if (header != NULL) { 342 psFitsWriteHeader(header, (psPtr)fits); 379 if (extname != NULL) { 380 psMetadataAddStr(header,PS_LIST_TAIL,"EXTNAME", 381 PS_META_REPLACE, 382 "Extenion Name", 383 extname); 384 } 385 386 psFitsWriteHeader(header, fits); 343 387 } 344 388 … … 378 422 bool psFitsUpdateImage(psFits* fits, 379 423 const psImage* input, 380 psRegion region, 424 int x0, 425 int y0, 381 426 int z) 382 427 { … … 453 498 long lastPixel[3]; 454 499 455 firstPixel[0] = region.x0 + 1;456 firstPixel[1] = region.y0 + 1;500 firstPixel[0] = x0 + 1; 501 firstPixel[1] = y0 + 1; 457 502 firstPixel[2] = z + 1; 458 503 459 if (region.x1 > 0) { 460 lastPixel[0] = region.x1; 461 } else { 462 lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0 463 } 464 if (region.y1 > 0) { 465 lastPixel[1] = region.y1; 466 } else { 467 lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0 468 } 504 lastPixel[0] = x0 + numCols; 505 lastPixel[1] = y0 + numRows; 469 506 lastPixel[2] = z + 1; 470 507 … … 474 511 lastPixel[1] < 1 || lastPixel[1] > nAxes[1]) { 475 512 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 476 "Specified region [%d:%d,%d:%d], is not valid given the %dx%d FITS image.", 477 region.y0,region.y1-1,region.x0,region.x1-1); 478 return false; 479 480 } 481 482 int dx = lastPixel[0] - firstPixel[0]; 483 int dy = lastPixel[1] - firstPixel[1]; 484 if (dx > numCols || 485 dy > numRows) { 486 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 487 "The region [%d:%d,%d:%d], is not valid given the input %dx%d image.", 488 firstPixel[1]-1,lastPixel[1]-1, 489 firstPixel[0]-1,lastPixel[0]-1, 490 numCols, numRows); 491 return false; 492 } 493 494 psImage* subset; 495 if (dx != numCols || dy != numRows) { 496 // the input image needs to be subsetted 497 subset = psImageSubset((psImage*)input, psRegionSet(0,dx+1,0,dy+1)); 498 } else { 499 subset = psMemIncrRefCounter((psImage*)input); 500 } 501 502 fits_write_subset(fits->fd, dataType, firstPixel, lastPixel, subset->data.V[0], &status); 513 "Input image [size of %ix%i] at position (%i,%i) does not all lay in the %ix%i FITS image.", 514 numCols, numRows, 515 x0, y0, 516 nAxes[0], nAxes[1]); 517 return false; 518 } 519 520 fits_write_subset(fits->fd, dataType, firstPixel, lastPixel, input->data.V[0], &status); 503 521 504 522 if ( status != 0) { -
trunk/psLib/src/fits/psFitsImage.h
r5511 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $10 * @date $Date: 200 5-11-14 22:18:30$9 * @version $Revision: 1.2 $ $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 … … 46 46 psMetadata* header, ///< header items for the new HDU. Can be NULL. 47 47 const psImage* input, ///< the image to output 48 int depth ///< the number of z-planes of the FITS image data cube 48 int depth, ///< the number of z-planes of the FITS image data cube 49 const char* extname ///< FITS extension name 49 50 ); 50 51 51 /** Updates the FITS file image, given the desired region and z-plane. 52 /** Writes an image, given the desired region and z-plane. A new IMAGE HDU is 53 * appended to the end of the FITS file. 54 * 55 * @return bool TRUE is the write was successful, otherwise FALSE. 56 */ 57 bool psFitsInsertImage( 58 psFits* fits, ///< the psFits object 59 psMetadata* header, ///< header items for the new HDU. Can be NULL. 60 const psImage* input, ///< the image to output 61 int depth, ///< the number of z-planes of the FITS image data cube 62 const char* extname, ///< FITS extension name 63 bool after ///< if TRUE, inserts HDU after current HDU, otherwise before 64 ); 65 66 /** Updates the FITS file image, given the desired region and z-plane. a new 67 * IMAGE HDU is inserted before or after, depending on the AFTER parameter, 68 * the current HDU. 52 69 * 53 70 * @return bool TRUE is the write was successful, otherwise FALSE. … … 56 73 psFits* fits, ///< the psFits object 57 74 const psImage* input, ///< the image to output 58 psRegion region, ///< the region in the FITS image to write 75 int x0, ///< psImage's x-axis origin in FITS image coordinates 76 int y0, ///< psImage's y-axis origin in FITS image coordinates 59 77 int z ///< the z-planes of the FITS image data cube to write 60 78 ); -
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, -
trunk/psLib/src/fits/psFitsTable.h
r5511 r6767 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $10 * @date $Date: 200 5-11-14 22:18:30$9 * @version $Revision: 1.2 $ $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 … … 72 72 ); 73 73 74 /** Writes a whole FITS table. The current HDU type must be either75 * PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.74 /** Writes a whole FITS table. A new HDU of the type BINTABLE is appended 75 * to the file. 76 76 * 77 77 * @return bool TRUE if the write was successful, otherwise FALSE 78 78 * 79 * @see psFitsReadTableRow 79 * @see psFitsReadTable 80 * @see psFitsInsertTable 80 81 */ 81 82 bool psFitsWriteTable( … … 84 85 const psArray* table 85 86 ///< Array of psMetadata items, which contains the output data items of each row. 87 ); 88 89 /** Inserts a whole FITS table. A new HDU of the type BINTABLE is inserted either 90 * before or after, depending on the AFTER parameter, the current HDU. 91 * 92 * @return bool TRUE if the insert/write was successful, otherwise FALSE 93 * 94 * @see psFitsWriteTable 95 */ 96 bool psFitsInsertTable( 97 psFits* fits, ///< the psFits object 98 const psMetadata* header, ///< header items for the new HDU. Can be NULL. 99 const psArray* table, 100 ///< Array of psMetadata items, which contains the output data items of each row. 101 bool after 102 ///< TRUE if insert is done after CHDU, otherwise table is inserted before CHDU 86 103 ); 87 104 … … 94 111 */ 95 112 bool psFitsUpdateTable( 96 psFits* fits, ///< the psFits object113 psFits* fits, ///< the psFits object 97 114 const psMetadata* data, 98 115 ///< Array of psMetadata items, which contains the output data items of each row. -
trunk/psLib/test/fits/tst_psFits.c
r6484 r6767 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1.1 8$ $Name: not supported by cvs2svn $9 * @date $Date: 2006-0 2-24 23:43:15$8 * @version $Revision: 1.19 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2006-04-04 19:52:47 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 118 118 extname); 119 119 120 psMetadataAdd(header,PS_LIST_TAIL, "EXTNAME",121 PS_DATA_STRING,122 "Extension Name",123 extname);124 125 120 // set the pixels in the image 126 121 psBinaryOp(image,image,"=",psScalarAlloc(lcv,PS_TYPE_F32)); 127 if (! psFitsWriteImage(fitsFile,header,image,1 ) ) {122 if (! psFitsWriteImage(fitsFile,header,image,1,extname) ) { 128 123 psError(PS_ERR_UNKNOWN, false, 129 124 "Could not write image."); … … 152 147 psImage* image = psImageAlloc(16,16,PS_TYPE_F32); 153 148 154 if (! psFitsWriteImage(fitsFile,NULL,image,1 ) ) {149 if (! psFitsWriteImage(fitsFile,NULL,image,1,NULL) ) { 155 150 psError(PS_ERR_UNKNOWN, false, 156 151 "Could not write PHU image."); … … 263 258 // write something to the file, otherwise CFITSIO will complain on close 264 259 psImage* img = psImageAlloc(16,16,PS_TYPE_F32); 265 psFitsWriteImage(fitsFile,NULL,img,1 );260 psFitsWriteImage(fitsFile,NULL,img,1,NULL); 266 261 267 262 psFree(fitsFile); // psFree should be equivalent to psFitsClose … … 284 279 285 280 // write something to the file, otherwise CFITSIO will complain on close 286 psFitsWriteImage(fitsFile,NULL,img,1 );281 psFitsWriteImage(fitsFile,NULL,img,1,NULL); 287 282 288 283 psFitsClose(fitsFile); … … 305 300 306 301 // write something to the file, otherwise CFITSIO will complain on close 307 psFitsWriteImage(fitsFile,NULL,img,1 );302 psFitsWriteImage(fitsFile,NULL,img,1,NULL); 308 303 309 304 psFitsClose(fitsFile); … … 821 816 psFitsMoveExtNum(fits,numHDUs/2, false); 822 817 823 psMetadata* headerSet = psFitsReadHeaderSet( fits);818 psMetadata* headerSet = psFitsReadHeaderSet(NULL,fits); 824 819 825 820 if (headerSet == NULL) { … … 862 857 } 863 858 864 psMetadata* set2 = psFitsReadHeaderSet(NULL); 865 if (set2 != NULL) { 866 psError(PS_ERR_UNKNOWN, false, 867 "psFitsReadHeaderSet returned non-NULL given a NULL psFits."); 868 return 10; 869 } 870 871 psMetadata* set3 = psFitsReadHeaderSet(fits); 859 psMetadata* set3 = psFitsReadHeaderSet(NULL,fits); 872 860 if (set3 == NULL) { 873 861 psError(PS_ERR_UNKNOWN, false, … … 902 890 } 903 891 904 892 set3 = psFitsReadHeaderSet(set3,NULL); 893 if (set3 != NULL) { 894 psError(PS_ERR_UNKNOWN, false, 895 "psFitsReadHeaderSet returned non-NULL given a NULL psFits."); 896 return 10; 897 } 905 898 906 899 psFree(headerSet); 907 psFree(set3);908 // set2 should have been freed by psFitsReadHeaderSet upon an error.909 900 910 901 psFitsClose(fits); … … 1434 1425 img4 = psImageCopy(img4,img3,PS_TYPE_##TYP); \ 1435 1426 psFits* fits = psFitsOpen(filename, "w"); \ 1436 psRegion region = {0,0,0,0}; \ 1437 if (! psFitsWriteImage(fits, NULL, img, 2)) { \ 1427 if (! psFitsWriteImage(fits, NULL, img, 2, NULL)) { \ 1438 1428 psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \ 1439 1429 return 1; \ 1440 1430 } \ 1441 if (! psFitsUpdateImage(fits,img3, region, 1)) { \1431 if (! psFitsUpdateImage(fits,img3, 0,0, 1)) { \ 1442 1432 psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \ 1443 1433 return 2; \ 1444 1434 } \ 1445 if (! psFitsWriteImage(fits,NULL, img3, 2 )) { \1435 if (! psFitsWriteImage(fits,NULL, img3, 2, NULL)) { \ 1446 1436 psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \ 1447 1437 return 3; \ 1448 1438 } \ 1449 if (! psFitsUpdateImage(fits,img, region, 1)) { \1439 if (! psFitsUpdateImage(fits,img, 0, 0, 1)) { \ 1450 1440 psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \ 1451 1441 return 4; \ … … 1588 1578 GENIMAGE(img2,m,n,F32,row+2*col); 1589 1579 mkdir("tmpImages",0777); 1590 psRegion region = {0,0,0,0};1591 1580 psFits* fits = psFitsOpen("tmpImages/writeTest.fits","w"); 1592 1581 1593 if (! psFitsWriteImage(fits, NULL, img,1 )) {1582 if (! psFitsWriteImage(fits, NULL, img,1, NULL)) { 1594 1583 psError(PS_ERR_UNKNOWN, true,"Couldn't write writeTest.fits."); 1595 1584 return 14; 1596 1585 } 1597 if (! psFitsUpdateImage(fits, img2, region, 0)) {1586 if (! psFitsUpdateImage(fits, img2, 0, 0, 0)) { 1598 1587 psError(PS_ERR_UNKNOWN, true,"Couldn't update writeTest.fits."); 1599 1588 return 15; … … 1604 1593 // Did it really overwrite the pixel values? Let's read it in and see. 1605 1594 psFitsClose(fits); 1595 1596 psRegion region = {0,0,0,0}; 1606 1597 fits = psFitsOpen("tmpImages/writeTest.fits","r"); 1607 1598 img = psFitsReadImage(NULL, fits, region, 0); … … 1628 1619 */ 1629 1620 psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message because input image is null."); 1630 if ( psFitsWriteImage(fits,NULL,NULL, 1 ) ) {1621 if ( psFitsWriteImage(fits,NULL,NULL, 1, NULL) ) { 1631 1622 psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false when input image is NULL."); 1632 1623 return 20; -
trunk/psLib/test/fits/verified/tst_psFits.stderr
r5512 r6767 201 201 <DATE><TIME>|<HOST>|I|testImageWrite 202 202 Following should generate an error message because input image is null. 203 <DATE><TIME>|<HOST>|E|psFits WriteImage (FILE:LINENO)203 <DATE><TIME>|<HOST>|E|psFitsInsertImage (FILE:LINENO) 204 204 The input psImage was NULL. Need a non-NULL psImage for operation to be performed. 205 205 -
trunk/psLib/test/imageops/tst_psImageGeomManip.c
r5512 r6767 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 5$ $Name: not supported by cvs2svn $9 * @date $Date: 200 5-11-14 22:18:46$8 * @version $Revision: 1.6 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2006-04-04 19:52:54 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 588 588 sBiOut = psImageRotate(sBiOut,sImg,radianRot,-1.0,PS_INTERPOLATE_BILINEAR); 589 589 590 if (! psFitsWriteImage(fOutFile, NULL, fOut, 1 ) ) {590 if (! psFitsWriteImage(fOutFile, NULL, fOut, 1, NULL) ) { 591 591 psError(PS_ERR_UNKNOWN, true,"Can not write fOut."); 592 592 return 20; 593 593 } 594 if (! psFitsWriteImage(sOutFile, NULL, sOut, 1 ) ) {594 if (! psFitsWriteImage(sOutFile, NULL, sOut, 1, NULL) ) { 595 595 psError(PS_ERR_UNKNOWN, true,"Can not write sOut."); 596 596 return 21; 597 597 } 598 if (! psFitsWriteImage(fBiOutFile, NULL, fBiOut, 1 ) ) {598 if (! psFitsWriteImage(fBiOutFile, NULL, fBiOut, 1, NULL) ) { 599 599 psError(PS_ERR_UNKNOWN, true,"Can not write fBiOut.fits."); 600 600 return 40; 601 601 } 602 if (! psFitsWriteImage(sBiOutFile, NULL, sBiOut, 1 ) ) {602 if (! psFitsWriteImage(sBiOutFile, NULL, sBiOut, 1, NULL) ) { 603 603 psError(PS_ERR_UNKNOWN, true,"Can not write sBiOut.fits."); 604 604 return 41; -
trunk/psLib/test/sys/tst_psMemory.c
r6204 r6767 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 7$ $Name: not supported by cvs2svn $9 * @date $Date: 2006-0 1-26 21:10:22$8 * @version $Revision: 1.8 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2006-04-04 19:52:55 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 583 583 fits = psFitsOpen("test.fits","w"); 584 584 psImage* img = psImageAlloc(16,16,PS_TYPE_F32); 585 psFitsWriteImage(fits,NULL,img,1 );585 psFitsWriteImage(fits,NULL,img,1,NULL); 586 586 psFree(img); 587 587 if ( !psMemCheckType(PS_DATA_FITS, fits) ) {
Note:
See TracChangeset
for help on using the changeset viewer.
