Commit 8da6e5978a7f3a4359ec11fcdf5a75c943ca76b8
1 parent
26ff1560
start implementation of file creation and saving
Showing
13 changed files
with
277 additions
and
65 deletions
include/GFits.hpp
| @@ -46,6 +46,7 @@ public: | @@ -46,6 +46,7 @@ public: | ||
| 46 | void close(void); | 46 | void close(void); |
| 47 | GFitsHDU* hdu(const std::string extname); | 47 | GFitsHDU* hdu(const std::string extname); |
| 48 | GFitsHDU* hdu(int extno); | 48 | GFitsHDU* hdu(int extno); |
| 49 | + void append(const GFitsHDU* hdu); | ||
| 49 | 50 | ||
| 50 | private: | 51 | private: |
| 51 | // Private methods | 52 | // Private methods |
include/GFitsCfitsio.hpp
| @@ -31,7 +31,9 @@ | @@ -31,7 +31,9 @@ | ||
| 31 | /* __ Macros _____________________________________________________________ */ | 31 | /* __ Macros _____________________________________________________________ */ |
| 32 | #define __ffgerr(A, B) ffgerr(A, B) | 32 | #define __ffgerr(A, B) ffgerr(A, B) |
| 33 | #define __ffopen(A, B, C, D) ffopen(A, B, C, D) | 33 | #define __ffopen(A, B, C, D) ffopen(A, B, C, D) |
| 34 | +#define __ffinit(A, B, C) ffinit(A, B, C) | ||
| 34 | #define __ffclos(A, B) ffclos(A, B) | 35 | #define __ffclos(A, B) ffclos(A, B) |
| 36 | +#define __ffdelt(A, B) ffdelt(A, B) | ||
| 35 | #define __ffthdu(A, B, C) ffthdu(A, B, C) | 37 | #define __ffthdu(A, B, C) ffthdu(A, B, C) |
| 36 | #define __ffmahd(A, B, C, D) ffmahd(A, B, C, D) | 38 | #define __ffmahd(A, B, C, D) ffmahd(A, B, C, D) |
| 37 | #define __ffghdt(A, B, C) ffghdt(A, B, C) | 39 | #define __ffghdt(A, B, C) ffghdt(A, B, C) |
| @@ -62,7 +64,9 @@ typedef fitsfile __fitsfile; | @@ -62,7 +64,9 @@ typedef fitsfile __fitsfile; | ||
| 62 | /* __ Macros _____________________________________________________________ */ | 64 | /* __ Macros _____________________________________________________________ */ |
| 63 | #define __ffgerr(A, B) __error(A, B) | 65 | #define __ffgerr(A, B) __error(A, B) |
| 64 | #define __ffopen(A, B, C, D) __dummy() | 66 | #define __ffopen(A, B, C, D) __dummy() |
| 67 | +#define __ffinit(A, B, C) __dummy() | ||
| 65 | #define __ffclos(A, B) __dummy() | 68 | #define __ffclos(A, B) __dummy() |
| 69 | +#define __ffdelt(A, B) __dummy() | ||
| 66 | #define __ffthdu(A, B, C) __dummy() | 70 | #define __ffthdu(A, B, C) __dummy() |
| 67 | #define __ffmahd(A, B, C, D) __dummy() | 71 | #define __ffmahd(A, B, C, D) __dummy() |
| 68 | #define __ffghdt(A, B, C) __dummy() | 72 | #define __ffghdt(A, B, C) __dummy() |
include/GFitsHDU.hpp
| @@ -29,6 +29,9 @@ | @@ -29,6 +29,9 @@ | ||
| 29 | ***************************************************************************/ | 29 | ***************************************************************************/ |
| 30 | class GFitsHDU { | 30 | class GFitsHDU { |
| 31 | 31 | ||
| 32 | + // Friend classes | ||
| 33 | + friend class GFits; | ||
| 34 | + | ||
| 32 | // I/O friends | 35 | // I/O friends |
| 33 | friend ostream& operator<< (ostream& os, const GFitsHDU& hdu); | 36 | friend ostream& operator<< (ostream& os, const GFitsHDU& hdu); |
| 34 | 37 | ||
| @@ -50,6 +53,7 @@ public: | @@ -50,6 +53,7 @@ public: | ||
| 50 | GFitsHeader* header(void) const; | 53 | GFitsHeader* header(void) const; |
| 51 | GFitsData* data(void) const; | 54 | GFitsData* data(void) const; |
| 52 | GFitsTableCol* column(const std::string& colname) const; | 55 | GFitsTableCol* column(const std::string& colname) const; |
| 56 | + void primary(void); | ||
| 53 | 57 | ||
| 54 | private: | 58 | private: |
| 55 | // Private methods | 59 | // Private methods |
include/GFitsHeader.hpp
| @@ -41,14 +41,15 @@ public: | @@ -41,14 +41,15 @@ public: | ||
| 41 | // Methods | 41 | // Methods |
| 42 | void open(__fitsfile* fptr); | 42 | void open(__fitsfile* fptr); |
| 43 | void close(void); | 43 | void close(void); |
| 44 | - GFitsHeaderCard* card(const std::string keyname); | ||
| 45 | - GFitsHeaderCard* card(const int cardno); | ||
| 46 | - std::string string(const std::string keyname); | ||
| 47 | - std::string string(const int cardno); | ||
| 48 | - double real(const std::string keyname); | ||
| 49 | - double real(const int cardno); | ||
| 50 | - int integer(const std::string keyname); | ||
| 51 | - int integer(const int cardno); | 44 | + void update(const GFitsHeaderCard& card); |
| 45 | + GFitsHeaderCard* card(const std::string& keyname); | ||
| 46 | + GFitsHeaderCard* card(const int& cardno); | ||
| 47 | + std::string string(const std::string& keyname); | ||
| 48 | + std::string string(const int& cardno); | ||
| 49 | + double real(const std::string& keyname); | ||
| 50 | + double real(const int& cardno); | ||
| 51 | + int integer(const std::string& keyname); | ||
| 52 | + int integer(const int& cardno); | ||
| 52 | GFitsHeader* clone(void) const; | 53 | GFitsHeader* clone(void) const; |
| 53 | 54 | ||
| 54 | private: | 55 | private: |
| @@ -68,12 +69,12 @@ private: | @@ -68,12 +69,12 @@ private: | ||
| 68 | * Inline methods * | 69 | * Inline methods * |
| 69 | ***************************************************************************/ | 70 | ***************************************************************************/ |
| 70 | inline | 71 | inline |
| 71 | -GFitsHeaderCard* GFitsHeader::card(const std::string keyname) | 72 | +GFitsHeaderCard* GFitsHeader::card(const std::string& keyname) |
| 72 | { | 73 | { |
| 73 | return GFitsHeader::card_ptr(keyname); | 74 | return GFitsHeader::card_ptr(keyname); |
| 74 | } | 75 | } |
| 75 | inline | 76 | inline |
| 76 | -GFitsHeaderCard* GFitsHeader::card(const int cardno) | 77 | +GFitsHeaderCard* GFitsHeader::card(const int& cardno) |
| 77 | { | 78 | { |
| 78 | return (cardno >= 0 && cardno < m_num_cards) ? &(m_card[cardno]) : NULL; | 79 | return (cardno >= 0 && cardno < m_num_cards) ? &(m_card[cardno]) : NULL; |
| 79 | } | 80 | } |
include/GFitsHeaderCard.hpp
| @@ -31,6 +31,8 @@ class GFitsHeaderCard { | @@ -31,6 +31,8 @@ class GFitsHeaderCard { | ||
| 31 | public: | 31 | public: |
| 32 | // Constructors & Destructors | 32 | // Constructors & Destructors |
| 33 | GFitsHeaderCard(); | 33 | GFitsHeaderCard(); |
| 34 | + GFitsHeaderCard(const std::string& keyname, const std::string& value, | ||
| 35 | + const std::string& comment); | ||
| 34 | GFitsHeaderCard(const GFitsHeaderCard& card); | 36 | GFitsHeaderCard(const GFitsHeaderCard& card); |
| 35 | ~GFitsHeaderCard(); | 37 | ~GFitsHeaderCard(); |
| 36 | 38 | ||
| @@ -38,18 +40,18 @@ public: | @@ -38,18 +40,18 @@ public: | ||
| 38 | GFitsHeaderCard& operator= (const GFitsHeaderCard& card); | 40 | GFitsHeaderCard& operator= (const GFitsHeaderCard& card); |
| 39 | 41 | ||
| 40 | // Methods | 42 | // Methods |
| 41 | - std::string keyname(void); | ||
| 42 | - std::string value(void); | ||
| 43 | - int value_type(void); | 43 | + std::string keyname(void) const; |
| 44 | + std::string value(void) const; | ||
| 45 | + int value_type(void) const; | ||
| 46 | + std::string unit(void) const; | ||
| 47 | + std::string comment(void) const; | ||
| 44 | std::string string(void); | 48 | std::string string(void); |
| 45 | double real(void); | 49 | double real(void); |
| 46 | int integer(void); | 50 | int integer(void); |
| 47 | - std::string unit(void); | ||
| 48 | - std::string comment(void); | ||
| 49 | - void set_keyname(std::string& keyname); | ||
| 50 | - void set_value(std::string& value); | ||
| 51 | - void set_unit(std::string& unit); | ||
| 52 | - void set_comment(std::string& comment); | 51 | + void set_keyname(const std::string& keyname); |
| 52 | + void set_value(const std::string& value); | ||
| 53 | + void set_unit(const std::string& unit); | ||
| 54 | + void set_comment(const std::string& comment); | ||
| 53 | void read(__fitsfile* fptr, int keynum); | 55 | void read(__fitsfile* fptr, int keynum); |
| 54 | void read(__fitsfile* fptr, std::string keyname); | 56 | void read(__fitsfile* fptr, std::string keyname); |
| 55 | void write(__fitsfile* fptr); | 57 | void write(__fitsfile* fptr); |
| @@ -73,15 +75,15 @@ private: | @@ -73,15 +75,15 @@ private: | ||
| 73 | /*************************************************************************** | 75 | /*************************************************************************** |
| 74 | * Inline methods * | 76 | * Inline methods * |
| 75 | ***************************************************************************/ | 77 | ***************************************************************************/ |
| 76 | -inline std::string GFitsHeaderCard::keyname(void) { return m_keyname; } | ||
| 77 | -inline std::string GFitsHeaderCard::value(void) { return m_value; } | ||
| 78 | -inline int GFitsHeaderCard::value_type(void) { return m_value_type; } | ||
| 79 | -inline std::string GFitsHeaderCard::unit(void) { return m_unit; } | ||
| 80 | -inline std::string GFitsHeaderCard::comment(void) { return m_comment; } | ||
| 81 | -inline void GFitsHeaderCard::set_keyname(std::string& keyname) { m_keyname = keyname; } | ||
| 82 | -inline void GFitsHeaderCard::set_value(std::string& value) { m_value = value; } | ||
| 83 | -inline void GFitsHeaderCard::set_unit(std::string& unit) { m_unit = unit; } | ||
| 84 | -inline void GFitsHeaderCard::set_comment(std::string& comment) { m_comment = comment; } | 78 | +inline std::string GFitsHeaderCard::keyname(void) const { return m_keyname; } |
| 79 | +inline std::string GFitsHeaderCard::value(void) const { return m_value; } | ||
| 80 | +inline int GFitsHeaderCard::value_type(void) const { return m_value_type; } | ||
| 81 | +inline std::string GFitsHeaderCard::unit(void) const { return m_unit; } | ||
| 82 | +inline std::string GFitsHeaderCard::comment(void) const { return m_comment; } | ||
| 83 | +inline void GFitsHeaderCard::set_keyname(const std::string& keyname) { m_keyname = keyname; } | ||
| 84 | +inline void GFitsHeaderCard::set_value(const std::string& value) { m_value = value; } | ||
| 85 | +inline void GFitsHeaderCard::set_unit(const std::string& unit) { m_unit = unit; } | ||
| 86 | +inline void GFitsHeaderCard::set_comment(const std::string& comment) { m_comment = comment; } | ||
| 85 | 87 | ||
| 86 | 88 | ||
| 87 | #endif /* GFITSHEADERCARD_HPP */ | 89 | #endif /* GFITSHEADERCARD_HPP */ |
src/GException.cpp
| @@ -233,7 +233,8 @@ GException::fits_error::fits_error(string origin, int status) | @@ -233,7 +233,8 @@ GException::fits_error::fits_error(string origin, int status) | ||
| 233 | GException::fits_open_error::fits_open_error(string origin, string filename, int status) | 233 | GException::fits_open_error::fits_open_error(string origin, string filename, int status) |
| 234 | { | 234 | { |
| 235 | m_origin = origin; | 235 | m_origin = origin; |
| 236 | - m_message = "Unable to open FITS file '" + filename + "'"; | 236 | + m_message = "Unable to open FITS file '" + filename + "'" |
| 237 | + + " (status: " + str(status) + ")"; | ||
| 237 | } | 238 | } |
| 238 | 239 | ||
| 239 | 240 |
src/fits/GFits.cpp
| @@ -134,7 +134,15 @@ void GFits::open(const std::string filename) | @@ -134,7 +134,15 @@ void GFits::open(const std::string filename) | ||
| 134 | // Open FITS file | 134 | // Open FITS file |
| 135 | int status = 0; | 135 | int status = 0; |
| 136 | status = __ffopen(&m_fitsfile, filename.c_str(), 1, &status); | 136 | status = __ffopen(&m_fitsfile, filename.c_str(), 1, &status); |
| 137 | - if (status != 0) | 137 | + |
| 138 | + // If FITS file does not exist then create it now | ||
| 139 | + if (status == 104) { | ||
| 140 | + status = 0; | ||
| 141 | + status = __ffinit(&m_fitsfile, filename.c_str(), &status); | ||
| 142 | + if (status != 0) | ||
| 143 | + throw GException::fits_open_error(G_OPEN, filename, status); | ||
| 144 | + } | ||
| 145 | + else if (status != 0) | ||
| 138 | throw GException::fits_open_error(G_OPEN, filename, status); | 146 | throw GException::fits_open_error(G_OPEN, filename, status); |
| 139 | 147 | ||
| 140 | // Store FITS file attributes | 148 | // Store FITS file attributes |
| @@ -147,7 +155,7 @@ void GFits::open(const std::string filename) | @@ -147,7 +155,7 @@ void GFits::open(const std::string filename) | ||
| 147 | 155 | ||
| 148 | // Allocate HDUs | 156 | // Allocate HDUs |
| 149 | if (m_hdu != NULL) delete [] m_hdu; | 157 | if (m_hdu != NULL) delete [] m_hdu; |
| 150 | - m_hdu = new GFitsHDU[m_num_hdu]; | 158 | + if (m_num_hdu > 0) m_hdu = new GFitsHDU[m_num_hdu]; |
| 151 | 159 | ||
| 152 | // Open all HDUs | 160 | // Open all HDUs |
| 153 | for (int i = 0; i < m_num_hdu; ++i) | 161 | for (int i = 0; i < m_num_hdu; ++i) |
| @@ -252,6 +260,62 @@ GFitsHDU* GFits::hdu(const std::string extname) | @@ -252,6 +260,62 @@ GFitsHDU* GFits::hdu(const std::string extname) | ||
| 252 | } | 260 | } |
| 253 | 261 | ||
| 254 | 262 | ||
| 263 | +/*************************************************************************** | ||
| 264 | + * Append HDU to FITS file * | ||
| 265 | + * ----------------------------------------------------------------------- * | ||
| 266 | + ***************************************************************************/ | ||
| 267 | +void GFits::append(const GFitsHDU* hdu) | ||
| 268 | +{ | ||
| 269 | + // Determine number of HDUs to add. If there are no HDUs so far and if | ||
| 270 | + // the HDU to append is not an image then we have to add a primary | ||
| 271 | + // image first. In this case we add 2 new HDUs. | ||
| 272 | + int n_add = (m_num_hdu == 0 && hdu->m_type != 0) ? 2 : 1; | ||
| 273 | + | ||
| 274 | + // Create memory to hold HDUs | ||
| 275 | + GFitsHDU* tmp = new GFitsHDU[m_num_hdu+n_add]; | ||
| 276 | + if (tmp != NULL) { | ||
| 277 | + | ||
| 278 | + // Copy over existing HDUs and remove old ones | ||
| 279 | + if (m_hdu != NULL) { | ||
| 280 | + for (int i = 0; i < m_num_hdu; ++i) | ||
| 281 | + tmp[i] = m_hdu[i]; | ||
| 282 | + delete [] m_hdu; | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + // Connect the new memory to the card pointer | ||
| 286 | + m_hdu = tmp; | ||
| 287 | + | ||
| 288 | + // Add primary image if required | ||
| 289 | + if (n_add == 2) { | ||
| 290 | + | ||
| 291 | + // Append empty primary image | ||
| 292 | + //m_hdu[m_num_hdu] = TBD | ||
| 293 | + | ||
| 294 | + // Set FITS file pointer for new HDU | ||
| 295 | + m_hdu[m_num_hdu].m_fitsfile = *m_fitsfile; | ||
| 296 | + m_hdu[m_num_hdu].m_fitsfile.HDUposition = m_num_hdu; | ||
| 297 | + | ||
| 298 | + // Increment number of HDUs | ||
| 299 | + m_num_hdu++; | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + // Append new HDU to list | ||
| 303 | + m_hdu[m_num_hdu] = *hdu; | ||
| 304 | + | ||
| 305 | + // Set FITS file pointer for new HDU | ||
| 306 | + m_hdu[m_num_hdu].m_fitsfile = *m_fitsfile; | ||
| 307 | + m_hdu[m_num_hdu].m_fitsfile.HDUposition = m_num_hdu; | ||
| 308 | + | ||
| 309 | + // Increment number of HDUs | ||
| 310 | + m_num_hdu++; | ||
| 311 | + | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | + // Return | ||
| 315 | + return; | ||
| 316 | +} | ||
| 317 | + | ||
| 318 | + | ||
| 255 | /*========================================================================== | 319 | /*========================================================================== |
| 256 | = = | 320 | = = |
| 257 | = GFits private methods = | 321 | = GFits private methods = |
| @@ -311,10 +375,20 @@ void GFits::free_members(void) | @@ -311,10 +375,20 @@ void GFits::free_members(void) | ||
| 311 | { | 375 | { |
| 312 | // If FITS file has been opened then close it now | 376 | // If FITS file has been opened then close it now |
| 313 | if (m_fitsfile != NULL) { | 377 | if (m_fitsfile != NULL) { |
| 314 | - int status = 0; | ||
| 315 | - status = __ffclos(m_fitsfile, &status); | ||
| 316 | - if (status != 0) | ||
| 317 | - throw GException::fits_error(G_FREE_MEM, status); | 378 | + |
| 379 | + // If there are no HDUs then delete the file (don't worry about error) | ||
| 380 | + if (m_num_hdu == 0) { | ||
| 381 | + int status = 0; | ||
| 382 | + __ffdelt(m_fitsfile, &status); | ||
| 383 | + } | ||
| 384 | + | ||
| 385 | + // ... otherwise close the file | ||
| 386 | + else { | ||
| 387 | + int status = 0; | ||
| 388 | + status = __ffclos(m_fitsfile, &status); | ||
| 389 | + if (status != 0) | ||
| 390 | + throw GException::fits_error(G_FREE_MEM, status); | ||
| 391 | + } | ||
| 318 | } | 392 | } |
| 319 | 393 | ||
| 320 | // Free memory | 394 | // Free memory |
src/fits/GFitsAsciiTable.cpp
| @@ -233,8 +233,10 @@ void GFitsAsciiTable::copy_members(const GFitsAsciiTable& table) | @@ -233,8 +233,10 @@ void GFitsAsciiTable::copy_members(const GFitsAsciiTable& table) | ||
| 233 | // Copy column definition | 233 | // Copy column definition |
| 234 | if (table.m_columns != NULL && m_cols > 0) { | 234 | if (table.m_columns != NULL && m_cols > 0) { |
| 235 | m_columns = new GFitsTableCol*[m_cols]; | 235 | m_columns = new GFitsTableCol*[m_cols]; |
| 236 | - for (int i = 0; i < m_cols; ++i) | ||
| 237 | - m_columns[i] = table.m_columns[i]->clone(); | 236 | + for (int i = 0; i < m_cols; ++i) { |
| 237 | + if (table.m_columns[i] != NULL) | ||
| 238 | + m_columns[i] = table.m_columns[i]->clone(); | ||
| 239 | + } | ||
| 238 | } | 240 | } |
| 239 | 241 | ||
| 240 | // Return | 242 | // Return |
src/fits/GFitsBinTable.cpp
| @@ -308,8 +308,10 @@ void GFitsBinTable::copy_members(const GFitsBinTable& table) | @@ -308,8 +308,10 @@ void GFitsBinTable::copy_members(const GFitsBinTable& table) | ||
| 308 | // Copy column definition | 308 | // Copy column definition |
| 309 | if (table.m_columns != NULL && m_cols > 0) { | 309 | if (table.m_columns != NULL && m_cols > 0) { |
| 310 | m_columns = new GFitsTableCol*[m_cols]; | 310 | m_columns = new GFitsTableCol*[m_cols]; |
| 311 | - for (int i = 0; i < m_cols; ++i) | ||
| 312 | - m_columns[i] = table.m_columns[i]->clone(); | 311 | + for (int i = 0; i < m_cols; ++i) { |
| 312 | + if (table.m_columns[i] != NULL) | ||
| 313 | + m_columns[i] = table.m_columns[i]->clone(); | ||
| 314 | + } | ||
| 313 | } | 315 | } |
| 314 | 316 | ||
| 315 | // Return | 317 | // Return |
src/fits/GFitsHDU.cpp
| @@ -186,11 +186,17 @@ void GFitsHDU::open(__fitsfile* fptr, int hdunum) | @@ -186,11 +186,17 @@ void GFitsHDU::open(__fitsfile* fptr, int hdunum) | ||
| 186 | /// NOT YET IMPLEMENTED !!! | 186 | /// NOT YET IMPLEMENTED !!! |
| 187 | void GFitsHDU::save(void) | 187 | void GFitsHDU::save(void) |
| 188 | { | 188 | { |
| 189 | +cout << "entry" << endl; | ||
| 189 | // Move to HDU | 190 | // Move to HDU |
| 190 | int status = 0; | 191 | int status = 0; |
| 191 | status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, &status); | 192 | status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, &status); |
| 192 | - if (status != 0) | ||
| 193 | - throw GException::fits_error(G_SAVE, status); | 193 | + cout << status << endl; |
| 194 | + | ||
| 195 | + // If HDU does not exist then create it now | ||
| 196 | + | ||
| 197 | + | ||
| 198 | + //if (status != 0) | ||
| 199 | + // throw GException::fits_error(G_SAVE, status); | ||
| 194 | 200 | ||
| 195 | // Save header | 201 | // Save header |
| 196 | //... | 202 | //... |
| @@ -198,6 +204,7 @@ void GFitsHDU::save(void) | @@ -198,6 +204,7 @@ void GFitsHDU::save(void) | ||
| 198 | // Save data | 204 | // Save data |
| 199 | //... | 205 | //... |
| 200 | 206 | ||
| 207 | +cout << "exit" << endl; | ||
| 201 | // Return | 208 | // Return |
| 202 | return; | 209 | return; |
| 203 | } | 210 | } |
| @@ -233,6 +240,31 @@ GFitsTableCol* GFitsHDU::column(const std::string& colname) const | @@ -233,6 +240,31 @@ GFitsTableCol* GFitsHDU::column(const std::string& colname) const | ||
| 233 | } | 240 | } |
| 234 | 241 | ||
| 235 | 242 | ||
| 243 | +/*************************************************************************** | ||
| 244 | + * Setup minimal primary HDU * | ||
| 245 | + * ----------------------------------------------------------------------- * | ||
| 246 | + ***************************************************************************/ | ||
| 247 | +void GFitsHDU::primary(void) | ||
| 248 | +{ | ||
| 249 | + // Free any allocated header and data | ||
| 250 | + free_members(); | ||
| 251 | + | ||
| 252 | + // Allocate header | ||
| 253 | + m_header = new GFitsHeader(); | ||
| 254 | + | ||
| 255 | + // Add cards | ||
| 256 | + m_header->update(GFitsHeaderCard("SIMPLE", "T", "/ file does conform to FITS standard")); | ||
| 257 | + m_header->update(GFitsHeaderCard("BITPIX", "8", "/ number of bits per data pixel")); | ||
| 258 | + m_header->update(GFitsHeaderCard("NAXIS", "0", "/ number of data axes")); | ||
| 259 | + m_header->update(GFitsHeaderCard("EXTEND", "T", "/ FITS dataset may contain extensions")); | ||
| 260 | + m_header->update(GFitsHeaderCard("BZERO", "-128", "/ Make values Signed")); | ||
| 261 | + m_header->update(GFitsHeaderCard("BSCALE", "1", "/ Make values Signed")); | ||
| 262 | + | ||
| 263 | + // Return | ||
| 264 | + return; | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | + | ||
| 236 | /*========================================================================== | 268 | /*========================================================================== |
| 237 | = = | 269 | = = |
| 238 | = GFitsHDU private methods = | 270 | = GFitsHDU private methods = |
| @@ -268,8 +300,8 @@ void GFitsHDU::copy_members(const GFitsHDU& hdu) | @@ -268,8 +300,8 @@ void GFitsHDU::copy_members(const GFitsHDU& hdu) | ||
| 268 | m_fitsfile = hdu.m_fitsfile; | 300 | m_fitsfile = hdu.m_fitsfile; |
| 269 | m_name = hdu.m_name; | 301 | m_name = hdu.m_name; |
| 270 | m_type = hdu.m_type; | 302 | m_type = hdu.m_type; |
| 271 | - m_header = hdu.m_header->clone(); | ||
| 272 | - m_data = hdu.m_data->clone(); | 303 | + if (hdu.m_header != NULL) m_header = hdu.m_header->clone(); |
| 304 | + if (hdu.m_data != NULL) m_data = hdu.m_data->clone(); | ||
| 273 | 305 | ||
| 274 | // Return | 306 | // Return |
| 275 | return; | 307 | return; |
| @@ -326,20 +358,26 @@ ostream& operator<< (ostream& os, const GFitsHDU& hdu) | @@ -326,20 +358,26 @@ ostream& operator<< (ostream& os, const GFitsHDU& hdu) | ||
| 326 | os << "Unknown" << endl; | 358 | os << "Unknown" << endl; |
| 327 | break; | 359 | break; |
| 328 | } | 360 | } |
| 329 | - os << *hdu.m_header; | ||
| 330 | - switch (hdu.m_type) { | ||
| 331 | - case 0: // Image HDU | ||
| 332 | - os << *(GFitsImage*)hdu.m_data; | ||
| 333 | - break; | ||
| 334 | - case 1: // ASCII Table HDU | ||
| 335 | - os << *(GFitsAsciiTable*)hdu.m_data; | ||
| 336 | - break; | ||
| 337 | - case 2: // Binary Table HDU | ||
| 338 | - os << *(GFitsBinTable*)hdu.m_data; | ||
| 339 | - break; | ||
| 340 | - default: | ||
| 341 | - os << "Unknown"; | ||
| 342 | - break; | 361 | + |
| 362 | + // Put FITS header in stream | ||
| 363 | + if (hdu.m_header != NULL) | ||
| 364 | + os << *hdu.m_header; | ||
| 365 | + | ||
| 366 | + // Put FITS data in stream | ||
| 367 | + if (hdu.m_data != NULL) { | ||
| 368 | + switch (hdu.m_type) { | ||
| 369 | + case 0: // Image HDU | ||
| 370 | + os << *(GFitsImage*)hdu.m_data; | ||
| 371 | + break; | ||
| 372 | + case 1: // ASCII Table HDU | ||
| 373 | + os << *(GFitsAsciiTable*)hdu.m_data; | ||
| 374 | + break; | ||
| 375 | + case 2: // Binary Table HDU | ||
| 376 | + os << *(GFitsBinTable*)hdu.m_data; | ||
| 377 | + break; | ||
| 378 | + default: | ||
| 379 | + break; | ||
| 380 | + } | ||
| 343 | } | 381 | } |
| 344 | 382 | ||
| 345 | // Return output stream | 383 | // Return output stream |
src/fits/GFitsHeader.cpp
| @@ -167,11 +167,53 @@ void GFitsHeader::close(void) | @@ -167,11 +167,53 @@ void GFitsHeader::close(void) | ||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | 169 | ||
| 170 | +/***********************************************************************//** | ||
| 171 | + * @brief Update card in header * | ||
| 172 | + * ----------------------------------------------------------------------- * | ||
| 173 | + * This method updates one header card. Updating means replacing any * | ||
| 174 | + * existing card with the specified one or appending a new card to the * | ||
| 175 | + * list of existing cards. * | ||
| 176 | + ***************************************************************************/ | ||
| 177 | +void GFitsHeader::update(const GFitsHeaderCard& card) | ||
| 178 | +{ | ||
| 179 | + // If card exists then update existing values | ||
| 180 | + GFitsHeaderCard* ptr = this->card(card.keyname()); | ||
| 181 | + if (ptr != NULL) | ||
| 182 | + *ptr = card; | ||
| 183 | + | ||
| 184 | + // ... otherwise append a new card | ||
| 185 | + else { | ||
| 186 | + | ||
| 187 | + // Create memory to hold cards | ||
| 188 | + GFitsHeaderCard* tmp = new GFitsHeaderCard[m_num_cards+1]; | ||
| 189 | + if (tmp != NULL) { | ||
| 190 | + | ||
| 191 | + // Copy over existing cards and remove old ones | ||
| 192 | + if (m_card != NULL) { | ||
| 193 | + for (int i = 0; i < m_num_cards; ++i) | ||
| 194 | + tmp[i] = m_card[i]; | ||
| 195 | + delete [] m_card; | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + // Connect the new memory to the card pointer | ||
| 199 | + m_card = tmp; | ||
| 200 | + | ||
| 201 | + // Append new card to list | ||
| 202 | + m_card[m_num_cards] = card; | ||
| 203 | + | ||
| 204 | + } // endif: new memory was valid | ||
| 205 | + } // endif: card appending was required | ||
| 206 | + | ||
| 207 | + // Return | ||
| 208 | + return; | ||
| 209 | +} | ||
| 210 | + | ||
| 211 | + | ||
| 170 | /*************************************************************************** | 212 | /*************************************************************************** |
| 171 | * Get specified header card value as string * | 213 | * Get specified header card value as string * |
| 172 | * ----------------------------------------------------------------------- * | 214 | * ----------------------------------------------------------------------- * |
| 173 | ***************************************************************************/ | 215 | ***************************************************************************/ |
| 174 | -std::string GFitsHeader::string(const std::string keyname) | 216 | +std::string GFitsHeader::string(const std::string& keyname) |
| 175 | { | 217 | { |
| 176 | // Get card pointer | 218 | // Get card pointer |
| 177 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); | 219 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); |
| @@ -188,7 +230,7 @@ std::string GFitsHeader::string(const std::string keyname) | @@ -188,7 +230,7 @@ std::string GFitsHeader::string(const std::string keyname) | ||
| 188 | * Get specified header card value as string * | 230 | * Get specified header card value as string * |
| 189 | * ----------------------------------------------------------------------- * | 231 | * ----------------------------------------------------------------------- * |
| 190 | ***************************************************************************/ | 232 | ***************************************************************************/ |
| 191 | -std::string GFitsHeader::string(const int cardno) | 233 | +std::string GFitsHeader::string(const int& cardno) |
| 192 | { | 234 | { |
| 193 | // Get card pointer | 235 | // Get card pointer |
| 194 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); | 236 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); |
| @@ -205,7 +247,7 @@ std::string GFitsHeader::string(const int cardno) | @@ -205,7 +247,7 @@ std::string GFitsHeader::string(const int cardno) | ||
| 205 | * Get specified header card value as double * | 247 | * Get specified header card value as double * |
| 206 | * ----------------------------------------------------------------------- * | 248 | * ----------------------------------------------------------------------- * |
| 207 | ***************************************************************************/ | 249 | ***************************************************************************/ |
| 208 | -double GFitsHeader::real(const std::string keyname) | 250 | +double GFitsHeader::real(const std::string& keyname) |
| 209 | { | 251 | { |
| 210 | // Get card pointer | 252 | // Get card pointer |
| 211 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); | 253 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); |
| @@ -222,7 +264,7 @@ double GFitsHeader::real(const std::string keyname) | @@ -222,7 +264,7 @@ double GFitsHeader::real(const std::string keyname) | ||
| 222 | * Get specified header card value as double * | 264 | * Get specified header card value as double * |
| 223 | * ----------------------------------------------------------------------- * | 265 | * ----------------------------------------------------------------------- * |
| 224 | ***************************************************************************/ | 266 | ***************************************************************************/ |
| 225 | -double GFitsHeader::real(const int cardno) | 267 | +double GFitsHeader::real(const int& cardno) |
| 226 | { | 268 | { |
| 227 | // Get card pointer | 269 | // Get card pointer |
| 228 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); | 270 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); |
| @@ -239,7 +281,7 @@ double GFitsHeader::real(const int cardno) | @@ -239,7 +281,7 @@ double GFitsHeader::real(const int cardno) | ||
| 239 | * Get specified header card value as int * | 281 | * Get specified header card value as int * |
| 240 | * ----------------------------------------------------------------------- * | 282 | * ----------------------------------------------------------------------- * |
| 241 | ***************************************************************************/ | 283 | ***************************************************************************/ |
| 242 | -int GFitsHeader::integer(const std::string keyname) | 284 | +int GFitsHeader::integer(const std::string& keyname) |
| 243 | { | 285 | { |
| 244 | // Get card pointer | 286 | // Get card pointer |
| 245 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); | 287 | GFitsHeaderCard* ptr = GFitsHeader::card(keyname); |
| @@ -256,7 +298,7 @@ int GFitsHeader::integer(const std::string keyname) | @@ -256,7 +298,7 @@ int GFitsHeader::integer(const std::string keyname) | ||
| 256 | * Get specified header card value as int * | 298 | * Get specified header card value as int * |
| 257 | * ----------------------------------------------------------------------- * | 299 | * ----------------------------------------------------------------------- * |
| 258 | ***************************************************************************/ | 300 | ***************************************************************************/ |
| 259 | -int GFitsHeader::integer(const int cardno) | 301 | +int GFitsHeader::integer(const int& cardno) |
| 260 | { | 302 | { |
| 261 | // Get card pointer | 303 | // Get card pointer |
| 262 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); | 304 | GFitsHeaderCard* ptr = GFitsHeader::card(cardno); |
src/fits/GFitsHeaderCard.cpp
| @@ -60,6 +60,21 @@ GFitsHeaderCard::GFitsHeaderCard() | @@ -60,6 +60,21 @@ GFitsHeaderCard::GFitsHeaderCard() | ||
| 60 | // Return | 60 | // Return |
| 61 | return; | 61 | return; |
| 62 | } | 62 | } |
| 63 | +GFitsHeaderCard::GFitsHeaderCard(const std::string& keyname, | ||
| 64 | + const std::string& value, | ||
| 65 | + const std::string& comment) | ||
| 66 | +{ | ||
| 67 | + // Initialise class members for clean destruction | ||
| 68 | + init_members(); | ||
| 69 | + | ||
| 70 | + // Set members | ||
| 71 | + this->set_keyname(keyname); | ||
| 72 | + this->set_value(value); | ||
| 73 | + this->set_comment(comment); | ||
| 74 | + | ||
| 75 | + // Return | ||
| 76 | + return; | ||
| 77 | +} | ||
| 63 | 78 | ||
| 64 | 79 | ||
| 65 | /*************************************************************************** | 80 | /*************************************************************************** |
test/test_GFits.cpp
| @@ -289,6 +289,31 @@ void test_columns(void) | @@ -289,6 +289,31 @@ void test_columns(void) | ||
| 289 | 289 | ||
| 290 | 290 | ||
| 291 | /*************************************************************************** | 291 | /*************************************************************************** |
| 292 | + * Test: Creation * | ||
| 293 | + ***************************************************************************/ | ||
| 294 | +void test_create(void) | ||
| 295 | +{ | ||
| 296 | + std::cout << "Test GFits: Create FITS file: "; | ||
| 297 | + try { | ||
| 298 | + GFits fits; | ||
| 299 | + fits.open("test.fits"); | ||
| 300 | + cout << endl << fits; | ||
| 301 | + GFitsHDU image; | ||
| 302 | + fits.append(&image); | ||
| 303 | + fits.save(); | ||
| 304 | + } | ||
| 305 | + catch (exception &e) { | ||
| 306 | + std::cout << std::endl << "TEST ERROR: Unable to create FITS file." << std::endl; | ||
| 307 | + std::cout << e.what() << std::endl; | ||
| 308 | + throw; | ||
| 309 | + } | ||
| 310 | + std::cout << ". ok." << std::endl; | ||
| 311 | +} | ||
| 312 | + | ||
| 313 | + | ||
| 314 | + | ||
| 315 | + | ||
| 316 | +/*************************************************************************** | ||
| 292 | * Main test function * | 317 | * Main test function * |
| 293 | ***************************************************************************/ | 318 | ***************************************************************************/ |
| 294 | int main(void) | 319 | int main(void) |
| @@ -300,8 +325,9 @@ int main(void) | @@ -300,8 +325,9 @@ int main(void) | ||
| 300 | std::cout << "***********************" << std::endl; | 325 | std::cout << "***********************" << std::endl; |
| 301 | 326 | ||
| 302 | // Execute the tests | 327 | // Execute the tests |
| 303 | - test_open(); | ||
| 304 | - test_columns(); | 328 | + test_create(); |
| 329 | + //test_open(); | ||
| 330 | + //test_columns(); | ||
| 305 | 331 | ||
| 306 | // Return | 332 | // Return |
| 307 | return 0; | 333 | return 0; |