Commit 4f8446be6953fc461de3545b2cf77364a380b9d7
1 parent
1fff8b90
replace pointers by values in HDU and column appending
Showing
13 changed files
with
124 additions
and
105 deletions
include/GFits.hpp
| ... | ... | @@ -20,7 +20,6 @@ |
| 20 | 20 | #define GFITS_HPP |
| 21 | 21 | |
| 22 | 22 | /* __ Includes ___________________________________________________________ */ |
| 23 | -#include <vector> | |
| 24 | 23 | #include "GFitsCfitsio.hpp" |
| 25 | 24 | #include "GFitsHDU.hpp" |
| 26 | 25 | |
| ... | ... | @@ -52,7 +51,7 @@ public: |
| 52 | 51 | |
| 53 | 52 | // Methods |
| 54 | 53 | void open(const std::string& filename); |
| 55 | - void append(const GFitsHDU* hdu); | |
| 54 | + void append_hdu(const GFitsHDU& hdu); | |
| 56 | 55 | void save(void); |
| 57 | 56 | void saveto(const std::string& filename, int clobber); |
| 58 | 57 | void close(void); | ... | ... |
include/GFitsTable.hpp
| ... | ... | @@ -58,8 +58,8 @@ public: |
| 58 | 58 | void save(void); |
| 59 | 59 | void close(void); |
| 60 | 60 | GFitsTable* clone(void) const = 0; |
| 61 | - void append_column(GFitsTableCol* column); | |
| 62 | - void insert_column(int colnum, GFitsTableCol* column); | |
| 61 | + void append_column(GFitsTableCol& column); | |
| 62 | + void insert_column(int colnum, GFitsTableCol& column); | |
| 63 | 63 | void append_rows(const int& nrows); |
| 64 | 64 | void insert_rows(const int& rownum, const int& nrows); |
| 65 | 65 | GFitsTableCol* column(const std::string& colname); |
| ... | ... | @@ -81,7 +81,7 @@ protected: |
| 81 | 81 | int m_type; //!< Table type (1=ASCII, 2=Binary) |
| 82 | 82 | int m_rows; //!< Number of rows in table |
| 83 | 83 | int m_cols; //!< Number of columns in table |
| 84 | - GFitsTableCol** m_columns; //!< Array of column pointers | |
| 84 | + GFitsTableCol** m_columns; //!< Array of table columns | |
| 85 | 85 | }; |
| 86 | 86 | |
| 87 | 87 | ... | ... |
include/GFitsTableCol.hpp
| ... | ... | @@ -70,7 +70,7 @@ protected: |
| 70 | 70 | std::string m_name; //!< Column name |
| 71 | 71 | std::string m_format; //!< Column format |
| 72 | 72 | std::string m_unit; //!< Column unit |
| 73 | - int m_colnum; //!< Column number (starting from 1) | |
| 73 | + int m_colnum; //!< Column number in FITS file (starting from 1) | |
| 74 | 74 | int m_type; //!< Column type |
| 75 | 75 | int m_repeat; //!< Repeat value of column |
| 76 | 76 | int m_width; //!< Width of column | ... | ... |
src/fits/GFits.cpp
| ... | ... | @@ -189,19 +189,19 @@ void GFits::open(const std::string& filename) |
| 189 | 189 | /***********************************************************************//** |
| 190 | 190 | * @brief Append HDU to FITS file |
| 191 | 191 | * |
| 192 | - * @param[in] hdu Pointer to FITS HDU that should be appended | |
| 192 | + * @param[in] hdu FITS HDU that should be appended | |
| 193 | 193 | * |
| 194 | 194 | * Append HDU to the next free position in a FITS file. In case that no HDU |
| 195 | 195 | * exists so far in the FITS file and if the HDU to append is NOT an image, |
| 196 | 196 | * an empty primary image will be inserted as first HDU in the FITS file. |
| 197 | 197 | * This guarantees the compatibility with the FITS standard. |
| 198 | 198 | ***************************************************************************/ |
| 199 | -void GFits::append(const GFitsHDU* hdu) | |
| 199 | +void GFits::append_hdu(const GFitsHDU& hdu) | |
| 200 | 200 | { |
| 201 | 201 | // Determine number of HDUs to add. If there are no HDUs so far and if |
| 202 | 202 | // the HDU to append is not an image then we have to add a primary |
| 203 | 203 | // image first. In this case we add 2 new HDUs. |
| 204 | - int n_add = (m_num_hdu == 0 && hdu->m_type != 0) ? 2 : 1; | |
| 204 | + int n_add = (m_num_hdu == 0 && hdu.m_type != 0) ? 2 : 1; | |
| 205 | 205 | |
| 206 | 206 | // Create memory to hold HDUs |
| 207 | 207 | GFitsHDU* tmp = new GFitsHDU[m_num_hdu+n_add]; |
| ... | ... | @@ -233,7 +233,7 @@ void GFits::append(const GFitsHDU* hdu) |
| 233 | 233 | } |
| 234 | 234 | |
| 235 | 235 | // Append new HDU to list |
| 236 | - m_hdu[m_num_hdu] = *hdu; | |
| 236 | + m_hdu[m_num_hdu] = hdu; | |
| 237 | 237 | |
| 238 | 238 | // Set FITS file pointer for new HDU |
| 239 | 239 | __fitsfile fptr = *m_fitsfile; | ... | ... |
src/fits/GFitsTable.cpp
| ... | ... | @@ -347,23 +347,14 @@ void GFitsTable::close(void) |
| 347 | 347 | /***********************************************************************//** |
| 348 | 348 | * @brief Append column to the table |
| 349 | 349 | * |
| 350 | - * @param[in] column Pointer to column which should be appended | |
| 351 | - * | |
| 352 | - * @exception GException::fits_no_data | |
| 353 | - * A NULL column pointer was passed to the method. | |
| 354 | - * This method requires a valid column pointer. | |
| 350 | + * @param[in] column Column which should be appended to table | |
| 355 | 351 | * |
| 356 | 352 | * A column will be appended at the end of the table. See |
| 357 | 353 | * GFitsTable::insert_column |
| 358 | 354 | * for more details on the method. |
| 359 | 355 | ***************************************************************************/ |
| 360 | -void GFitsTable::append_column(GFitsTableCol* column) | |
| 356 | +void GFitsTable::append_column(GFitsTableCol& column) | |
| 361 | 357 | { |
| 362 | - // Throw exception if column pointer is empty | |
| 363 | - if (column == NULL) | |
| 364 | - throw GException::fits_no_data(G_APPEND_COLUMN, | |
| 365 | - "Column pointer was NULL"); | |
| 366 | - | |
| 367 | 358 | // Inserting at the end correspond to appending |
| 368 | 359 | insert_column(m_cols, column); |
| 369 | 360 | |
| ... | ... | @@ -376,14 +367,13 @@ void GFitsTable::append_column(GFitsTableCol* column) |
| 376 | 367 | * @brief Insert column into the table |
| 377 | 368 | * |
| 378 | 369 | * @param[in] colnum Column number to be inserted |
| 379 | - * @param[in] column Pointer to column which should be inserted | |
| 370 | + * @param[in] columnColumn which should be inserted into the table | |
| 380 | 371 | * |
| 381 | - * @exception GException::fits_no_data | |
| 382 | - * A NULL column pointer was passed to the method. | |
| 383 | - * This method requires a valid column pointer. | |
| 384 | 372 | * @exception GException::fits_bad_col_length |
| 385 | 373 | * The length of the column is incompatible with the number of |
| 386 | 374 | * rows in the table. |
| 375 | + * @exception GException::fits_unknown_coltype | |
| 376 | + * FITS column is of unknown type. | |
| 387 | 377 | * |
| 388 | 378 | * A column will be inserted at position 'colnum' of the table. If the |
| 389 | 379 | * position is beyond the end of the table the column will be appended. |
| ... | ... | @@ -395,13 +385,8 @@ void GFitsTable::append_column(GFitsTableCol* column) |
| 395 | 385 | * The length of the column to be inserted has to be identical to the number |
| 396 | 386 | * of rows in the table. |
| 397 | 387 | ***************************************************************************/ |
| 398 | -void GFitsTable::insert_column(int colnum, GFitsTableCol* column) | |
| 388 | +void GFitsTable::insert_column(int colnum, GFitsTableCol& column) | |
| 399 | 389 | { |
| 400 | - // Throw exception if column pointer is empty | |
| 401 | - if (column == NULL) | |
| 402 | - throw GException::fits_no_data(G_INSERT_COLUMN, | |
| 403 | - "Column pointer was NULL"); | |
| 404 | - | |
| 405 | 390 | // Make sure that 'colnum' is valid. Since we add one column the total |
| 406 | 391 | // number of columns at return will be m_cols+1, hence the column |
| 407 | 392 | // index is comprised between [0,m_cols] |
| ... | ... | @@ -411,18 +396,13 @@ void GFitsTable::insert_column(int colnum, GFitsTableCol* column) |
| 411 | 396 | // If the table is empty and has 0 rows then set the number of rows in |
| 412 | 397 | // the table to the length of the column |
| 413 | 398 | if (m_columns == NULL && m_rows == 0) |
| 414 | - m_rows = column->length(); | |
| 399 | + m_rows = column.length(); | |
| 415 | 400 | |
| 416 | 401 | // Throw exception if the column length is incompatible with number of |
| 417 | 402 | // rows in the table |
| 418 | - if (m_rows != column->length()) | |
| 403 | + if (m_rows != column.length()) | |
| 419 | 404 | throw GException::fits_bad_col_length(G_INSERT_COLUMN, |
| 420 | - column->length(), m_rows); | |
| 421 | - | |
| 422 | - // If there are no rows in the table then set the number of rows to | |
| 423 | - // the length of the column | |
| 424 | - if (m_rows == 0 && column->length() > 0) | |
| 425 | - m_rows = column->length(); | |
| 405 | + column.length(), m_rows); | |
| 426 | 406 | |
| 427 | 407 | // If no column data exist then allocate them now |
| 428 | 408 | if (m_columns == NULL) { |
| ... | ... | @@ -462,11 +442,35 @@ void GFitsTable::insert_column(int colnum, GFitsTableCol* column) |
| 462 | 442 | |
| 463 | 443 | } // endelse: we made space to insert a column |
| 464 | 444 | |
| 465 | - // Insert column pointer | |
| 466 | - m_columns[colnum] = column; | |
| 445 | + // Type dependent copy of column | |
| 446 | + switch (column.m_type) { | |
| 447 | + case __TSTRING: | |
| 448 | + m_columns[colnum] = new GFitsTableStrCol; | |
| 449 | + *m_columns[colnum] = column; | |
| 450 | + break; | |
| 451 | + case __TSHORT: | |
| 452 | + m_columns[colnum] = new GFitsTableShtCol; | |
| 453 | + *m_columns[colnum] = column; | |
| 454 | + break; | |
| 455 | + case __TLONG: | |
| 456 | + m_columns[colnum] = new GFitsTableLngCol; | |
| 457 | + *m_columns[colnum] = column; | |
| 458 | + break; | |
| 459 | + case __TFLOAT: | |
| 460 | + m_columns[colnum] = new GFitsTableFltCol; | |
| 461 | + *m_columns[colnum] = column; | |
| 462 | + break; | |
| 463 | + case __TDOUBLE: | |
| 464 | + m_columns[colnum] = new GFitsTableDblCol; | |
| 465 | + *m_columns[colnum] = column; | |
| 466 | + break; | |
| 467 | + default: | |
| 468 | + throw GException::fits_unknown_coltype(G_INSERT_COLUMN, column.m_type); | |
| 469 | + break; | |
| 470 | + } | |
| 467 | 471 | |
| 468 | 472 | // Set column attributes |
| 469 | - m_columns[colnum]->m_colnum = colnum + 1; // IS THIS REALLY NEEDED??? | |
| 473 | + //m_columns[colnum]->m_colnum = colnum + 1; // IS THIS REALLY NEEDED??? | |
| 470 | 474 | |
| 471 | 475 | // Return |
| 472 | 476 | return; |
| ... | ... | @@ -618,11 +622,18 @@ void GFitsTable::copy_members(const GFitsTable& table) |
| 618 | 622 | |
| 619 | 623 | /***********************************************************************//** |
| 620 | 624 | * @brief Delete class members |
| 625 | + * | |
| 626 | + * De-allocates all column pointers | |
| 621 | 627 | ***************************************************************************/ |
| 622 | 628 | void GFitsTable::free_members(void) |
| 623 | 629 | { |
| 624 | - // Free memory (don't free associated column pointers explicitely!!!) | |
| 625 | - if (m_columns != NULL) delete [] m_columns; | |
| 630 | + // Free memory | |
| 631 | + if (m_columns != NULL) { | |
| 632 | + for (int i = 0; i < m_cols; ++i) { | |
| 633 | + if (m_columns[i] != NULL) delete m_columns[i]; | |
| 634 | + } | |
| 635 | + delete [] m_columns; | |
| 636 | + } | |
| 626 | 637 | |
| 627 | 638 | // Mark memory as freed |
| 628 | 639 | m_columns = NULL; | ... | ... |
src/fits/GFitsTableCol.cpp
| ... | ... | @@ -152,54 +152,6 @@ void GFitsTableCol::name(const std::string& name) |
| 152 | 152 | |
| 153 | 153 | |
| 154 | 154 | /***********************************************************************//** |
| 155 | - * @brief Set column number | |
| 156 | - * | |
| 157 | - * @param[in] colnum Number of column. | |
| 158 | - ***************************************************************************/ | |
| 159 | -/* | |
| 160 | -void GFitsTableCol::colnum(const int& colnum) | |
| 161 | -{ | |
| 162 | - // Set column number | |
| 163 | - m_colnum = colnum; | |
| 164 | - | |
| 165 | - // Return | |
| 166 | - return; | |
| 167 | -} | |
| 168 | -*/ | |
| 169 | - | |
| 170 | -/***********************************************************************//** | |
| 171 | - * @brief Set column type | |
| 172 | - * | |
| 173 | - * @param[in] type Type of column. | |
| 174 | - ***************************************************************************/ | |
| 175 | -/* | |
| 176 | -void GFitsTableCol::type(const int& type) | |
| 177 | -{ | |
| 178 | - // Set column type | |
| 179 | - m_type = type; | |
| 180 | - | |
| 181 | - // Return | |
| 182 | - return; | |
| 183 | -} | |
| 184 | -*/ | |
| 185 | - | |
| 186 | -/***********************************************************************//** | |
| 187 | - * @brief Set column length | |
| 188 | - * | |
| 189 | - * @param[in] length Length of column. | |
| 190 | - ***************************************************************************/ | |
| 191 | -/* | |
| 192 | -void GFitsTableCol::length(const int& length) | |
| 193 | -{ | |
| 194 | - // Set column length | |
| 195 | - m_length = length; | |
| 196 | - | |
| 197 | - // Return | |
| 198 | - return; | |
| 199 | -} | |
| 200 | -*/ | |
| 201 | - | |
| 202 | -/***********************************************************************//** | |
| 203 | 155 | * @brief Get column name |
| 204 | 156 | ***************************************************************************/ |
| 205 | 157 | std::string GFitsTableCol::name(void) |
| ... | ... | @@ -371,10 +323,58 @@ ostream& operator<< (ostream& os, const GFitsTableCol& column) |
| 371 | 323 | // Put header in stream |
| 372 | 324 | os << "'" << column.m_name << "'"; |
| 373 | 325 | os << " [" << column.m_colnum << "] "; |
| 374 | - os << column.m_type << " repeat="; | |
| 375 | - os << column.m_repeat << " width="; | |
| 376 | - os << column.m_width << " length="; | |
| 377 | - os << column.m_length << endl; | |
| 326 | + | |
| 327 | + // Set column type | |
| 328 | + switch (column.m_type) { | |
| 329 | + case 1: | |
| 330 | + os << "TBIT"; | |
| 331 | + break; | |
| 332 | + case 11: | |
| 333 | + os << "TBYTE"; | |
| 334 | + break; | |
| 335 | + case 14: | |
| 336 | + os << "TLOGICAL"; | |
| 337 | + break; | |
| 338 | + case 16: | |
| 339 | + os << "TSTRING"; | |
| 340 | + break; | |
| 341 | + case 21: | |
| 342 | + os << "TSHORT"; | |
| 343 | + break; | |
| 344 | + case 31: | |
| 345 | + os << "TINT"; | |
| 346 | + break; | |
| 347 | + case 41: | |
| 348 | + os << "TLONG"; | |
| 349 | + break; | |
| 350 | + case 42: | |
| 351 | + os << "TFLOAT"; | |
| 352 | + break; | |
| 353 | + case 81: | |
| 354 | + os << "TLONGLONG"; | |
| 355 | + break; | |
| 356 | + case 82: | |
| 357 | + os << "TDOUBLE"; | |
| 358 | + break; | |
| 359 | + case 83: | |
| 360 | + os << "TCOMPLEX"; | |
| 361 | + break; | |
| 362 | + case 163: | |
| 363 | + os << "TDBLCOMPLEX"; | |
| 364 | + break; | |
| 365 | + default: | |
| 366 | + os << "<unknown type>"; | |
| 367 | + break; | |
| 368 | + } | |
| 369 | + | |
| 370 | + // Set vector length | |
| 371 | + os << " repeat=" << column.m_repeat; | |
| 372 | + | |
| 373 | + // Set width | |
| 374 | + os << " width=" << column.m_width; | |
| 375 | + | |
| 376 | + // Set length | |
| 377 | + os << " length=" << column.m_length << endl; | |
| 378 | 378 | |
| 379 | 379 | // Return output stream |
| 380 | 380 | return os; | ... | ... |
src/fits/GFitsTableDblCol.cpp
src/fits/GFitsTableFltCol.cpp
src/fits/GFitsTableLngCol.cpp
src/fits/GFitsTableShtCol.cpp
src/fits/GFitsTableStrCol.cpp
src/rsp/GLATResponse.cpp
| ... | ... | @@ -284,10 +284,10 @@ void GLATResponse::save(const std::string& rspname) const |
| 284 | 284 | hdu_psf_sigma.extname("SIGMA"); |
| 285 | 285 | |
| 286 | 286 | // Append HDUs to FITS file |
| 287 | - fits.append(&hdu_psf_bounds); | |
| 288 | - fits.append(&hdu_psf_psf); | |
| 289 | - fits.append(&hdu_psf_norm); | |
| 290 | - fits.append(&hdu_psf_sigma); | |
| 287 | + fits.append_hdu(hdu_psf_bounds); | |
| 288 | + fits.append_hdu(hdu_psf_psf); | |
| 289 | + fits.append_hdu(hdu_psf_norm); | |
| 290 | + fits.append_hdu(hdu_psf_sigma); | |
| 291 | 291 | |
| 292 | 292 | // Save FITS file |
| 293 | 293 | fits.save(); | ... | ... |
test/test_GFits.cpp
| ... | ... | @@ -306,7 +306,7 @@ void test_create(void) |
| 306 | 306 | fits.open("test.fits"); |
| 307 | 307 | GFitsDblImage image; |
| 308 | 308 | GFitsHDU hdu(image); |
| 309 | - fits.append(&hdu); | |
| 309 | + fits.append_hdu(hdu); | |
| 310 | 310 | //cout << fits; |
| 311 | 311 | fits.save(); |
| 312 | 312 | } |
| ... | ... | @@ -334,7 +334,7 @@ void test_create(void) |
| 334 | 334 | } |
| 335 | 335 | } |
| 336 | 336 | GFitsHDU hdu(image); |
| 337 | - fits.append(&hdu); | |
| 337 | + fits.append_hdu(hdu); | |
| 338 | 338 | //cout << fits; |
| 339 | 339 | fits.save(); |
| 340 | 340 | } |
| ... | ... | @@ -372,23 +372,27 @@ void test_create(void) |
| 372 | 372 | cout << "."; |
| 373 | 373 | |
| 374 | 374 | // Attach binary table |
| 375 | +cout << "start" << endl; | |
| 375 | 376 | try { |
| 376 | 377 | // Re-open FITS file |
| 377 | 378 | GFits fits; |
| 378 | 379 | fits.open("test.fits"); |
| 380 | +cout << "1" << endl; | |
| 379 | 381 | |
| 380 | 382 | // Create binary Table with 10 rows |
| 381 | 383 | int nrows = 10; |
| 382 | 384 | GFitsBinTable table = GFitsBinTable(nrows); |
| 383 | 385 | GFitsTableDblCol first = GFitsTableDblCol(nrows); |
| 384 | 386 | GFitsTableDblCol second = GFitsTableDblCol(nrows); |
| 385 | - table.append_column(&first); | |
| 386 | - table.append_column(&second); | |
| 387 | +cout << "2" << endl; | |
| 388 | + table.append_column(first); | |
| 389 | +cout << "3" << endl; | |
| 390 | + table.append_column(second); | |
| 387 | 391 | cout << table; |
| 388 | 392 | |
| 389 | 393 | // Create HDU and append to FILE file |
| 390 | 394 | GFitsHDU hdu(table); |
| 391 | - fits.append(&hdu); | |
| 395 | + fits.append_hdu(hdu); | |
| 392 | 396 | // cout << fits; |
| 393 | 397 | |
| 394 | 398 | // Save FITS file | ... | ... |