Commit 1fff8b907ae230b360d833ae0e09cbccfd1662f4
1 parent
a235d9c7
evening save
Showing
14 changed files
with
609 additions
and
421 deletions
include/GFitsDblImage.hpp
| @@ -50,9 +50,12 @@ public: | @@ -50,9 +50,12 @@ public: | ||
| 50 | double& operator() (const int& ix, const int& iy); | 50 | double& operator() (const int& ix, const int& iy); |
| 51 | const double& operator() (const int& ix, const int& iy) const; | 51 | const double& operator() (const int& ix, const int& iy) const; |
| 52 | double& operator() (const int& ix, const int& iy, const int& iz); | 52 | double& operator() (const int& ix, const int& iy, const int& iz); |
| 53 | - const double& operator() (const int& ix, const int& iy, const int& iz) const; | ||
| 54 | - double& operator() (const int& ix, const int& iy, const int& iz, const int& it); | ||
| 55 | - const double& operator() (const int& ix, const int& iy, const int& iz, const int& it) const; | 53 | + const double& operator() (const int& ix, const int& iy, const int& iz) |
| 54 | + const; | ||
| 55 | + double& operator() (const int& ix, const int& iy, const int& iz, | ||
| 56 | + const int& it); | ||
| 57 | + const double& operator() (const int& ix, const int& iy, const int& iz, | ||
| 58 | + const int& it) const; | ||
| 56 | 59 | ||
| 57 | 60 | ||
| 58 | // Methods | 61 | // Methods |
include/GFitsTableCol.hpp
| @@ -30,7 +30,7 @@ | @@ -30,7 +30,7 @@ | ||
| 30 | * | 30 | * |
| 31 | * @brief Abstract interface for FITS table column | 31 | * @brief Abstract interface for FITS table column |
| 32 | * | 32 | * |
| 33 | - * This class implements a FITS table column. | 33 | + * This class implements a FITS table column. Vector columns are supported. |
| 34 | ***************************************************************************/ | 34 | ***************************************************************************/ |
| 35 | class GFitsTableCol { | 35 | class GFitsTableCol { |
| 36 | 36 | ||
| @@ -43,6 +43,7 @@ class GFitsTableCol { | @@ -43,6 +43,7 @@ class GFitsTableCol { | ||
| 43 | public: | 43 | public: |
| 44 | // Constructors and destructors | 44 | // Constructors and destructors |
| 45 | GFitsTableCol(); | 45 | GFitsTableCol(); |
| 46 | + GFitsTableCol(const int& length, const int& size = 1); | ||
| 46 | GFitsTableCol(const GFitsTableCol& column); | 47 | GFitsTableCol(const GFitsTableCol& column); |
| 47 | virtual ~GFitsTableCol(); | 48 | virtual ~GFitsTableCol(); |
| 48 | 49 | ||
| @@ -50,23 +51,13 @@ public: | @@ -50,23 +51,13 @@ public: | ||
| 50 | GFitsTableCol& operator= (const GFitsTableCol& column); | 51 | GFitsTableCol& operator= (const GFitsTableCol& column); |
| 51 | 52 | ||
| 52 | // Virtual Methods | 53 | // Virtual Methods |
| 53 | - virtual std::string string(const int& row, const int& col = 0) = 0; | ||
| 54 | - virtual double real(const int& row, const int& col = 0) = 0; | ||
| 55 | - virtual int integer(const int& row, const int& col = 0) = 0; | 54 | + virtual std::string string(const int& row, const int& inx = 0) = 0; |
| 55 | + virtual double real(const int& row, const int& inx = 0) = 0; | ||
| 56 | + virtual int integer(const int& row, const int& inx = 0) = 0; | ||
| 56 | virtual GFitsTableCol* clone(void) const = 0; | 57 | virtual GFitsTableCol* clone(void) const = 0; |
| 57 | - virtual double* ptr_double(void) = 0; | ||
| 58 | - virtual float* ptr_float(void) = 0; | ||
| 59 | - virtual short* ptr_short(void) = 0; | ||
| 60 | - virtual long* ptr_long(void) = 0; | ||
| 61 | - virtual int* ptr_int(void) = 0; | ||
| 62 | 58 | ||
| 63 | // Base class Methods | 59 | // Base class Methods |
| 64 | void name(const std::string& name); | 60 | void name(const std::string& name); |
| 65 | - //void colnum(const int& colnum); //!< DO WE REALLY NEED THIS??? | ||
| 66 | - //void type(const int& type); //!< DO WE REALLY NEED THIS??? | ||
| 67 | - //void repeat(const int repeat); //!< DO WE REALLY NEED THIS??? | ||
| 68 | - //void width(const int width); //!< DO WE REALLY NEED THIS??? | ||
| 69 | - //void length(const int& length); //!< DO WE REALLY NEED THIS??? | ||
| 70 | std::string name(void); | 61 | std::string name(void); |
| 71 | int colnum(void); | 62 | int colnum(void); |
| 72 | int type(void); | 63 | int type(void); |
| @@ -94,9 +85,4 @@ private: | @@ -94,9 +85,4 @@ private: | ||
| 94 | void connect(__fitsfile* fptr); | 85 | void connect(__fitsfile* fptr); |
| 95 | }; | 86 | }; |
| 96 | 87 | ||
| 97 | - | ||
| 98 | -/*************************************************************************** | ||
| 99 | - * Inline methods * | ||
| 100 | - ***************************************************************************/ | ||
| 101 | - | ||
| 102 | #endif /* GFITSTABLECOL_HPP */ | 88 | #endif /* GFITSTABLECOL_HPP */ |
include/GFitsTableDblCol.hpp
| @@ -10,6 +10,11 @@ | @@ -10,6 +10,11 @@ | ||
| 10 | * (at your option) any later version. * | 10 | * (at your option) any later version. * |
| 11 | * * | 11 | * * |
| 12 | ***************************************************************************/ | 12 | ***************************************************************************/ |
| 13 | +/** | ||
| 14 | + * @file GFitsTableDblCol.hpp | ||
| 15 | + * @brief GFitsTableDblCol class definition. | ||
| 16 | + * @author J. Knodlseder | ||
| 17 | + */ | ||
| 13 | 18 | ||
| 14 | #ifndef GFITSTABLEDBLCOL_HPP | 19 | #ifndef GFITSTABLEDBLCOL_HPP |
| 15 | #define GFITSTABLEDBLCOL_HPP | 20 | #define GFITSTABLEDBLCOL_HPP |
| @@ -24,30 +29,33 @@ | @@ -24,30 +29,33 @@ | ||
| 24 | /* __ Structures _________________________________________________________ */ | 29 | /* __ Structures _________________________________________________________ */ |
| 25 | 30 | ||
| 26 | 31 | ||
| 27 | -/*************************************************************************** | ||
| 28 | - * GFitsTableDblCol class definition * | 32 | +/***********************************************************************//** |
| 33 | + * @class GFitsTableDblCol | ||
| 34 | + * | ||
| 35 | + * @brief Interface for FITS table double precision column | ||
| 36 | + * | ||
| 37 | + * This class implements a FITS table double precision column. | ||
| 29 | ***************************************************************************/ | 38 | ***************************************************************************/ |
| 30 | class GFitsTableDblCol : public GFitsTableCol { | 39 | class GFitsTableDblCol : public GFitsTableCol { |
| 31 | 40 | ||
| 32 | public: | 41 | public: |
| 33 | // Constructors and destructors | 42 | // Constructors and destructors |
| 34 | GFitsTableDblCol(); | 43 | GFitsTableDblCol(); |
| 44 | + GFitsTableDblCol(const int& length, const int& size = 1); | ||
| 35 | GFitsTableDblCol(const GFitsTableDblCol& column); | 45 | GFitsTableDblCol(const GFitsTableDblCol& column); |
| 36 | virtual ~GFitsTableDblCol(); | 46 | virtual ~GFitsTableDblCol(); |
| 37 | 47 | ||
| 38 | // Operators | 48 | // Operators |
| 39 | GFitsTableDblCol& operator= (const GFitsTableDblCol& column); | 49 | GFitsTableDblCol& operator= (const GFitsTableDblCol& column); |
| 50 | + double& operator() (const int& row, const int& inx = 0); | ||
| 51 | + const double& operator() (const int& row, const int& inx = 0) const; | ||
| 40 | 52 | ||
| 41 | // Methods | 53 | // Methods |
| 42 | - std::string string(const int& row, const int& col = 0); | ||
| 43 | - double real(const int& row, const int& col = 0); | ||
| 44 | - int integer(const int& row, const int& col = 0); | 54 | + std::string string(const int& row, const int& inx = 0); |
| 55 | + double real(const int& row, const int& inx = 0); | ||
| 56 | + int integer(const int& row, const int& inx = 0); | ||
| 45 | GFitsTableDblCol* clone(void) const; | 57 | GFitsTableDblCol* clone(void) const; |
| 46 | - double* ptr_double(void); | ||
| 47 | - float* ptr_float(void); | ||
| 48 | - short* ptr_short(void); | ||
| 49 | - long* ptr_long(void); | ||
| 50 | - int* ptr_int(void); | 58 | + double* data(void); |
| 51 | void set_nullval(const double* value); | 59 | void set_nullval(const double* value); |
| 52 | 60 | ||
| 53 | private: | 61 | private: |
| @@ -55,24 +63,13 @@ private: | @@ -55,24 +63,13 @@ private: | ||
| 55 | void init_members(void); | 63 | void init_members(void); |
| 56 | void copy_members(const GFitsTableDblCol& column); | 64 | void copy_members(const GFitsTableDblCol& column); |
| 57 | void free_members(void); | 65 | void free_members(void); |
| 58 | - void load(void); | 66 | + void fetch_data(void); |
| 59 | 67 | ||
| 60 | // Private data area | 68 | // Private data area |
| 61 | - int m_size; // Size of data area | ||
| 62 | - double* m_data; // Data area | ||
| 63 | - double* m_nulval; // NULL value | ||
| 64 | - int m_anynul; // Number of NULLs encountered | 69 | + int m_size; //!< Size of data area |
| 70 | + double* m_data; //!< Data area | ||
| 71 | + double* m_nulval; //!< NULL value | ||
| 72 | + int m_anynul; //!< Number of NULLs encountered | ||
| 65 | }; | 73 | }; |
| 66 | 74 | ||
| 67 | - | ||
| 68 | -/*************************************************************************** | ||
| 69 | - * Inline methods * | ||
| 70 | - ***************************************************************************/ | ||
| 71 | -inline double* GFitsTableDblCol::ptr_double(void) { return m_data; } | ||
| 72 | -inline | ||
| 73 | -GFitsTableDblCol* GFitsTableDblCol::clone(void) const | ||
| 74 | -{ | ||
| 75 | - return new GFitsTableDblCol(*this); | ||
| 76 | -} | ||
| 77 | - | ||
| 78 | #endif /* GFITSTABLEDBLCOL_HPP */ | 75 | #endif /* GFITSTABLEDBLCOL_HPP */ |
include/GFitsTableFltCol.hpp
| @@ -10,6 +10,11 @@ | @@ -10,6 +10,11 @@ | ||
| 10 | * (at your option) any later version. * | 10 | * (at your option) any later version. * |
| 11 | * * | 11 | * * |
| 12 | ***************************************************************************/ | 12 | ***************************************************************************/ |
| 13 | +/** | ||
| 14 | + * @file GFitsTableFltCol.hpp | ||
| 15 | + * @brief GFitsTableFltCol class definition. | ||
| 16 | + * @author J. Knodlseder | ||
| 17 | + */ | ||
| 13 | 18 | ||
| 14 | #ifndef GFITSTABLEFLTCOL_HPP | 19 | #ifndef GFITSTABLEFLTCOL_HPP |
| 15 | #define GFITSTABLEFLTCOL_HPP | 20 | #define GFITSTABLEFLTCOL_HPP |
| @@ -24,8 +29,12 @@ | @@ -24,8 +29,12 @@ | ||
| 24 | /* __ Structures _________________________________________________________ */ | 29 | /* __ Structures _________________________________________________________ */ |
| 25 | 30 | ||
| 26 | 31 | ||
| 27 | -/*************************************************************************** | ||
| 28 | - * GFitsTableFltCol class definition * | 32 | +/***********************************************************************//** |
| 33 | + * @class GFitsTableFltCol | ||
| 34 | + * | ||
| 35 | + * @brief Interface for FITS table floating point column | ||
| 36 | + * | ||
| 37 | + * This class implements a FITS table floating point column. | ||
| 29 | ***************************************************************************/ | 38 | ***************************************************************************/ |
| 30 | class GFitsTableFltCol : public GFitsTableCol { | 39 | class GFitsTableFltCol : public GFitsTableCol { |
| 31 | 40 | ||
| @@ -43,11 +52,7 @@ public: | @@ -43,11 +52,7 @@ public: | ||
| 43 | double real(const int& row, const int& col = 0); | 52 | double real(const int& row, const int& col = 0); |
| 44 | int integer(const int& row, const int& col = 0); | 53 | int integer(const int& row, const int& col = 0); |
| 45 | GFitsTableFltCol* clone(void) const; | 54 | GFitsTableFltCol* clone(void) const; |
| 46 | - double* ptr_double(void); | ||
| 47 | - float* ptr_float(void); | ||
| 48 | - short* ptr_short(void); | ||
| 49 | - long* ptr_long(void); | ||
| 50 | - int* ptr_int(void); | 55 | + float* data(void); |
| 51 | void set_nullval(const float* value); | 56 | void set_nullval(const float* value); |
| 52 | 57 | ||
| 53 | private: | 58 | private: |
| @@ -58,21 +63,15 @@ private: | @@ -58,21 +63,15 @@ private: | ||
| 58 | void load(void); | 63 | void load(void); |
| 59 | 64 | ||
| 60 | // Private data area | 65 | // Private data area |
| 61 | - int m_size; // Size of data area | ||
| 62 | - float* m_data; // Data area | ||
| 63 | - float* m_nulval; // NULL value | ||
| 64 | - int m_anynul; // Number of NULLs encountered | 66 | + int m_size; //!< Size of data area |
| 67 | + float* m_data; //!< Data area | ||
| 68 | + float* m_nulval; //!< NULL value | ||
| 69 | + int m_anynul; //!< Number of NULLs encountered | ||
| 65 | }; | 70 | }; |
| 66 | 71 | ||
| 67 | 72 | ||
| 68 | /*************************************************************************** | 73 | /*************************************************************************** |
| 69 | * Inline methods * | 74 | * Inline methods * |
| 70 | ***************************************************************************/ | 75 | ***************************************************************************/ |
| 71 | -inline float* GFitsTableFltCol::ptr_float(void) { return m_data; } | ||
| 72 | -inline | ||
| 73 | -GFitsTableFltCol* GFitsTableFltCol::clone(void) const | ||
| 74 | -{ | ||
| 75 | - return new GFitsTableFltCol(*this); | ||
| 76 | -} | ||
| 77 | 76 | ||
| 78 | #endif /* GFITSTABLEFLTCOL_HPP */ | 77 | #endif /* GFITSTABLEFLTCOL_HPP */ |
include/GFitsTableLngCol.hpp
| @@ -10,6 +10,11 @@ | @@ -10,6 +10,11 @@ | ||
| 10 | * (at your option) any later version. * | 10 | * (at your option) any later version. * |
| 11 | * * | 11 | * * |
| 12 | ***************************************************************************/ | 12 | ***************************************************************************/ |
| 13 | +/** | ||
| 14 | + * @file GFitsTableLngCol.hpp | ||
| 15 | + * @brief GFitsTableLngCol class definition. | ||
| 16 | + * @author J. Knodlseder | ||
| 17 | + */ | ||
| 13 | 18 | ||
| 14 | #ifndef GFITSTABLELNGCOL_HPP | 19 | #ifndef GFITSTABLELNGCOL_HPP |
| 15 | #define GFITSTABLELNGCOL_HPP | 20 | #define GFITSTABLELNGCOL_HPP |
| @@ -24,8 +29,12 @@ | @@ -24,8 +29,12 @@ | ||
| 24 | /* __ Structures _________________________________________________________ */ | 29 | /* __ Structures _________________________________________________________ */ |
| 25 | 30 | ||
| 26 | 31 | ||
| 27 | -/*************************************************************************** | ||
| 28 | - * GFitsTableLngCol class definition * | 32 | +/***********************************************************************//** |
| 33 | + * @class GFitsTableLngCol | ||
| 34 | + * | ||
| 35 | + * @brief Interface for FITS table long integer column | ||
| 36 | + * | ||
| 37 | + * This class implements a FITS table long integer column. | ||
| 29 | ***************************************************************************/ | 38 | ***************************************************************************/ |
| 30 | class GFitsTableLngCol : public GFitsTableCol { | 39 | class GFitsTableLngCol : public GFitsTableCol { |
| 31 | 40 | ||
| @@ -37,17 +46,15 @@ public: | @@ -37,17 +46,15 @@ public: | ||
| 37 | 46 | ||
| 38 | // Operators | 47 | // Operators |
| 39 | GFitsTableLngCol& operator= (const GFitsTableLngCol& column); | 48 | GFitsTableLngCol& operator= (const GFitsTableLngCol& column); |
| 49 | + long& operator() (const int& row, const int& inx = 0); | ||
| 50 | + const long& operator() (const int& row, const int& inx = 0) const; | ||
| 40 | 51 | ||
| 41 | // Methods | 52 | // Methods |
| 42 | std::string string(const int& row, const int& col = 0); | 53 | std::string string(const int& row, const int& col = 0); |
| 43 | double real(const int& row, const int& col = 0); | 54 | double real(const int& row, const int& col = 0); |
| 44 | int integer(const int& row, const int& col = 0); | 55 | int integer(const int& row, const int& col = 0); |
| 45 | GFitsTableLngCol* clone(void) const; | 56 | GFitsTableLngCol* clone(void) const; |
| 46 | - double* ptr_double(void); | ||
| 47 | - float* ptr_float(void); | ||
| 48 | - short* ptr_short(void); | ||
| 49 | - long* ptr_long(void); | ||
| 50 | - int* ptr_int(void); | 57 | + long* data(void); |
| 51 | void set_nullval(const long* value); | 58 | void set_nullval(const long* value); |
| 52 | 59 | ||
| 53 | private: | 60 | private: |
| @@ -55,24 +62,13 @@ private: | @@ -55,24 +62,13 @@ private: | ||
| 55 | void init_members(void); | 62 | void init_members(void); |
| 56 | void copy_members(const GFitsTableLngCol& column); | 63 | void copy_members(const GFitsTableLngCol& column); |
| 57 | void free_members(void); | 64 | void free_members(void); |
| 58 | - void load(void); | 65 | + void fetch_data(void); |
| 59 | 66 | ||
| 60 | // Private data area | 67 | // Private data area |
| 61 | - int m_size; // Size of data area | ||
| 62 | - long* m_data; // Data area | ||
| 63 | - long* m_nulval; // NULL value | ||
| 64 | - int m_anynul; // Number of NULLs encountered | 68 | + int m_size; //!< Size of data area |
| 69 | + long* m_data; //!< Data area | ||
| 70 | + long* m_nulval; //!< NULL value | ||
| 71 | + int m_anynul; //!< Number of NULLs encountered | ||
| 65 | }; | 72 | }; |
| 66 | 73 | ||
| 67 | - | ||
| 68 | -/*************************************************************************** | ||
| 69 | - * Inline methods * | ||
| 70 | - ***************************************************************************/ | ||
| 71 | -inline long* GFitsTableLngCol::ptr_long(void) { return m_data; } | ||
| 72 | -inline | ||
| 73 | -GFitsTableLngCol* GFitsTableLngCol::clone(void) const | ||
| 74 | -{ | ||
| 75 | - return new GFitsTableLngCol(*this); | ||
| 76 | -} | ||
| 77 | - | ||
| 78 | #endif /* GFITSTABLELNGCOL_HPP */ | 74 | #endif /* GFITSTABLELNGCOL_HPP */ |
src/fits/GFitsHDU.cpp
| @@ -337,41 +337,7 @@ void GFitsHDU::open(__fitsfile* fptr, int hdunum) | @@ -337,41 +337,7 @@ void GFitsHDU::open(__fitsfile* fptr, int hdunum) | ||
| 337 | ***************************************************************************/ | 337 | ***************************************************************************/ |
| 338 | void GFitsHDU::save(void) | 338 | void GFitsHDU::save(void) |
| 339 | { | 339 | { |
| 340 | -//cout << "GFitsHDU::save " << m_fitsfile.Fptr << " " << m_hdunum << endl; | ||
| 341 | - // Move to HDU | ||
| 342 | -// int status = 0; | ||
| 343 | -// status = __ffmahd(&m_fitsfile, m_hdunum, NULL, &status); | ||
| 344 | - | ||
| 345 | - // If HDU does not yet exist in file then create it now. This works even | ||
| 346 | - // in the case that the actual HDU has no associated header and/or data | ||
| 347 | - // (these will be created automatically). However, to make this work we have | ||
| 348 | - // to set the fitsfile HDU position to the position we want to go. In that | ||
| 349 | - // was the save members will know that they have to create the HDU ... | ||
| 350 | -/* | ||
| 351 | - if (status == 107) { | ||
| 352 | - m_fitsfile.HDUposition = m_hdunum-1; | ||
| 353 | - status = 0; | ||
| 354 | - if (m_data != NULL) { | ||
| 355 | - switch (m_type) { | ||
| 356 | - case HT_IMAGE: // Image HDU | ||
| 357 | - m_data->connect(&m_fitsfile); | ||
| 358 | - //m_data->save(); | ||
| 359 | - break; | ||
| 360 | - case HT_ASCII_TABLE: // ASCII Table HDU | ||
| 361 | - m_data->connect(&m_fitsfile); | ||
| 362 | - //m_data->save(); | ||
| 363 | - break; | ||
| 364 | - case HT_BIN_TABLE: // Binary Table HDU | ||
| 365 | - m_data->connect(&m_fitsfile); | ||
| 366 | - //m_data->save(); | ||
| 367 | - break; | ||
| 368 | - default: | ||
| 369 | - throw GException::fits_unknown_HDU_type(G_SAVE, m_type); | ||
| 370 | - break; | ||
| 371 | - } | ||
| 372 | - } | ||
| 373 | - } | ||
| 374 | -*/ | 340 | +//cout << "GFitsHDU::save entry" << endl; |
| 375 | 341 | ||
| 376 | // Save data and header if they exist | 342 | // Save data and header if they exist |
| 377 | if (m_data != NULL) { | 343 | if (m_data != NULL) { |
| @@ -398,6 +364,7 @@ void GFitsHDU::save(void) | @@ -398,6 +364,7 @@ void GFitsHDU::save(void) | ||
| 398 | 364 | ||
| 399 | } // endelse: no data were available | 365 | } // endelse: no data were available |
| 400 | 366 | ||
| 367 | +//cout << "GFitsHDU::save exit" << endl; | ||
| 401 | // Return | 368 | // Return |
| 402 | return; | 369 | return; |
| 403 | } | 370 | } |
src/fits/GFitsHeader.cpp
| @@ -174,6 +174,7 @@ void GFitsHeader::open(__fitsfile* fptr) | @@ -174,6 +174,7 @@ void GFitsHeader::open(__fitsfile* fptr) | ||
| 174 | ***************************************************************************/ | 174 | ***************************************************************************/ |
| 175 | void GFitsHeader::save(__fitsfile* fptr) | 175 | void GFitsHeader::save(__fitsfile* fptr) |
| 176 | { | 176 | { |
| 177 | +//cout << "GFitsHeader::save entry" << endl; | ||
| 177 | // Move to HDU | 178 | // Move to HDU |
| 178 | int status = 0; | 179 | int status = 0; |
| 179 | status = __ffmahd(fptr, (fptr->HDUposition)+1, NULL, &status); | 180 | status = __ffmahd(fptr, (fptr->HDUposition)+1, NULL, &status); |
| @@ -193,6 +194,7 @@ void GFitsHeader::save(__fitsfile* fptr) | @@ -193,6 +194,7 @@ void GFitsHeader::save(__fitsfile* fptr) | ||
| 193 | } | 194 | } |
| 194 | } | 195 | } |
| 195 | 196 | ||
| 197 | +//cout << "GFitsHeader::save exit" << endl; | ||
| 196 | // Return | 198 | // Return |
| 197 | return; | 199 | return; |
| 198 | } | 200 | } |
src/fits/GFitsTable.cpp
| @@ -301,7 +301,7 @@ void GFitsTable::save(void) | @@ -301,7 +301,7 @@ void GFitsTable::save(void) | ||
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | // Create FITS table | 303 | // Create FITS table |
| 304 | - status = __ffcrtb(&m_fitsfile, m_type, m_rows, tfields, ttype, tform, | 304 | + status = __ffcrtb(&m_fitsfile, m_type, m_rows, tfields, ttype, tform, |
| 305 | tunit, NULL, &status); | 305 | tunit, NULL, &status); |
| 306 | if (status != 0) | 306 | if (status != 0) |
| 307 | throw GException::fits_error(G_SAVE, status); | 307 | throw GException::fits_error(G_SAVE, status); |
| @@ -322,6 +322,7 @@ void GFitsTable::save(void) | @@ -322,6 +322,7 @@ void GFitsTable::save(void) | ||
| 322 | else if (status != 0) | 322 | else if (status != 0) |
| 323 | throw GException::fits_error(G_SAVE, status); | 323 | throw GException::fits_error(G_SAVE, status); |
| 324 | 324 | ||
| 325 | +//cout << "GFitsTable::save exit" << endl; | ||
| 325 | // Return | 326 | // Return |
| 326 | return; | 327 | return; |
| 327 | } | 328 | } |
| @@ -370,6 +371,7 @@ void GFitsTable::append_column(GFitsTableCol* column) | @@ -370,6 +371,7 @@ void GFitsTable::append_column(GFitsTableCol* column) | ||
| 370 | return; | 371 | return; |
| 371 | } | 372 | } |
| 372 | 373 | ||
| 374 | + | ||
| 373 | /***********************************************************************//** | 375 | /***********************************************************************//** |
| 374 | * @brief Insert column into the table | 376 | * @brief Insert column into the table |
| 375 | * | 377 | * |
| @@ -455,11 +457,17 @@ void GFitsTable::insert_column(int colnum, GFitsTableCol* column) | @@ -455,11 +457,17 @@ void GFitsTable::insert_column(int colnum, GFitsTableCol* column) | ||
| 455 | // Connect new memory | 457 | // Connect new memory |
| 456 | m_columns = tmp; | 458 | m_columns = tmp; |
| 457 | 459 | ||
| 460 | + // Increment column counter | ||
| 461 | + m_cols++; | ||
| 462 | + | ||
| 458 | } // endelse: we made space to insert a column | 463 | } // endelse: we made space to insert a column |
| 459 | 464 | ||
| 460 | // Insert column pointer | 465 | // Insert column pointer |
| 461 | m_columns[colnum] = column; | 466 | m_columns[colnum] = column; |
| 462 | 467 | ||
| 468 | + // Set column attributes | ||
| 469 | + m_columns[colnum]->m_colnum = colnum + 1; // IS THIS REALLY NEEDED??? | ||
| 470 | + | ||
| 463 | // Return | 471 | // Return |
| 464 | return; | 472 | return; |
| 465 | } | 473 | } |
| @@ -613,10 +621,7 @@ void GFitsTable::copy_members(const GFitsTable& table) | @@ -613,10 +621,7 @@ void GFitsTable::copy_members(const GFitsTable& table) | ||
| 613 | ***************************************************************************/ | 621 | ***************************************************************************/ |
| 614 | void GFitsTable::free_members(void) | 622 | void GFitsTable::free_members(void) |
| 615 | { | 623 | { |
| 616 | - // Free memory | ||
| 617 | - for (int i = 0; i < m_cols; ++i) { | ||
| 618 | - if (m_columns[i] != NULL) delete m_columns[i]; | ||
| 619 | - } | 624 | + // Free memory (don't free associated column pointers explicitely!!!) |
| 620 | if (m_columns != NULL) delete [] m_columns; | 625 | if (m_columns != NULL) delete [] m_columns; |
| 621 | 626 | ||
| 622 | // Mark memory as freed | 627 | // Mark memory as freed |
| @@ -664,15 +669,16 @@ char* GFitsTable::get_ttype(const int& colnum) const | @@ -664,15 +669,16 @@ char* GFitsTable::get_ttype(const int& colnum) const | ||
| 664 | { | 669 | { |
| 665 | // Initialise result with NULL pointer | 670 | // Initialise result with NULL pointer |
| 666 | char* ptr = NULL; | 671 | char* ptr = NULL; |
| 667 | - | 672 | + |
| 668 | // Get type only if column exists | 673 | // Get type only if column exists |
| 669 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && | 674 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && |
| 670 | m_columns[colnum] != NULL) { | 675 | m_columns[colnum] != NULL) { |
| 671 | - int size = m_columns[colnum]->m_name.length() + 1; | ||
| 672 | - ptr = new char[size]; | ||
| 673 | - strncpy(ptr, m_columns[colnum]->m_name.c_str(), size-1); | ||
| 674 | - } | ||
| 675 | - | 676 | + int size = m_columns[colnum]->m_name.length(); |
| 677 | + ptr = new char[size+1]; | ||
| 678 | + strncpy(ptr, m_columns[colnum]->m_name.c_str(), size); | ||
| 679 | + ptr[size] = '\0'; | ||
| 680 | + } | ||
| 681 | + | ||
| 676 | // Return result | 682 | // Return result |
| 677 | return ptr; | 683 | return ptr; |
| 678 | } | 684 | } |
| @@ -691,15 +697,16 @@ char* GFitsTable::get_tform(const int& colnum) const | @@ -691,15 +697,16 @@ char* GFitsTable::get_tform(const int& colnum) const | ||
| 691 | { | 697 | { |
| 692 | // Initialise result with NULL pointer | 698 | // Initialise result with NULL pointer |
| 693 | char* ptr = NULL; | 699 | char* ptr = NULL; |
| 694 | - | 700 | + |
| 695 | // Get type only if column exists | 701 | // Get type only if column exists |
| 696 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && | 702 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && |
| 697 | m_columns[colnum] != NULL) { | 703 | m_columns[colnum] != NULL) { |
| 698 | - int size = m_columns[colnum]->m_format.length() + 1; | ||
| 699 | - ptr = new char[size]; | ||
| 700 | - strncpy(ptr, m_columns[colnum]->m_format.c_str(), size-1); | 704 | + int size = m_columns[colnum]->m_format.length(); |
| 705 | + ptr = new char[size+1]; | ||
| 706 | + strncpy(ptr, m_columns[colnum]->m_format.c_str(), size); | ||
| 707 | + ptr[size] = '\0'; | ||
| 701 | } | 708 | } |
| 702 | - | 709 | + |
| 703 | // Return result | 710 | // Return result |
| 704 | return ptr; | 711 | return ptr; |
| 705 | } | 712 | } |
| @@ -718,15 +725,16 @@ char* GFitsTable::get_tunit(const int& colnum) const | @@ -718,15 +725,16 @@ char* GFitsTable::get_tunit(const int& colnum) const | ||
| 718 | { | 725 | { |
| 719 | // Initialise result with NULL pointer | 726 | // Initialise result with NULL pointer |
| 720 | char* ptr = NULL; | 727 | char* ptr = NULL; |
| 721 | - | 728 | + |
| 722 | // Get type only if column exists | 729 | // Get type only if column exists |
| 723 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && | 730 | if (m_columns != NULL && colnum >=0 && colnum < m_cols && |
| 724 | m_columns[colnum] != NULL) { | 731 | m_columns[colnum] != NULL) { |
| 725 | - int size = m_columns[colnum]->m_unit.length() + 1; | ||
| 726 | - ptr = new char[size]; | ||
| 727 | - strncpy(ptr, m_columns[colnum]->m_unit.c_str(), size-1); | 732 | + int size = m_columns[colnum]->m_unit.length(); |
| 733 | + ptr = new char[size+1]; | ||
| 734 | + strncpy(ptr, m_columns[colnum]->m_unit.c_str(), size); | ||
| 735 | + ptr[size] = '\0'; | ||
| 728 | } | 736 | } |
| 729 | - | 737 | + |
| 730 | // Return result | 738 | // Return result |
| 731 | return ptr; | 739 | return ptr; |
| 732 | } | 740 | } |
src/fits/GFitsTableCol.cpp
| @@ -48,6 +48,26 @@ GFitsTableCol::GFitsTableCol() | @@ -48,6 +48,26 @@ GFitsTableCol::GFitsTableCol() | ||
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | /***********************************************************************//** | 50 | /***********************************************************************//** |
| 51 | + * @brief Constructor | ||
| 52 | + * | ||
| 53 | + * @param[in] length Length of column. | ||
| 54 | + * @param[in] size Vector size of column. | ||
| 55 | + ***************************************************************************/ | ||
| 56 | +GFitsTableCol::GFitsTableCol(const int& length, const int& size) | ||
| 57 | +{ | ||
| 58 | + // Initialise class members for clean destruction | ||
| 59 | + init_members(); | ||
| 60 | + | ||
| 61 | + // Set column length and vector size | ||
| 62 | + m_length = length; | ||
| 63 | + m_repeat = size; | ||
| 64 | + | ||
| 65 | + // Return | ||
| 66 | + return; | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | + | ||
| 70 | +/***********************************************************************//** | ||
| 51 | * @brief Copy constructor | 71 | * @brief Copy constructor |
| 52 | * | 72 | * |
| 53 | * @param[in] column Column from which the class instance should be built | 73 | * @param[in] column Column from which the class instance should be built |
src/fits/GFitsTableDblCol.cpp
| @@ -23,12 +23,7 @@ | @@ -23,12 +23,7 @@ | ||
| 23 | #define G_STRING "GFitsTableDblCol::string(const int&, const int&)" | 23 | #define G_STRING "GFitsTableDblCol::string(const int&, const int&)" |
| 24 | #define G_REAL "GFitsTableDblCol::real(const int&, const int&)" | 24 | #define G_REAL "GFitsTableDblCol::real(const int&, const int&)" |
| 25 | #define G_INTEGER "GFitsTableDblCol::integer(const int&, const int&)" | 25 | #define G_INTEGER "GFitsTableDblCol::integer(const int&, const int&)" |
| 26 | -#define G_PTR_FLOAT "GFitsTableDblCol::ptr_float()" | ||
| 27 | -#define G_PTR_DOUBLE "GFitsTableDblCol::ptr_double()" | ||
| 28 | -#define G_PTR_SHORT "GFitsTableDblCol::ptr_short()" | ||
| 29 | -#define G_PTR_LONG "GFitsTableDblCol::ptr_long()" | ||
| 30 | -#define G_PTR_INT "GFitsTableDblCol::ptr_int()" | ||
| 31 | -#define G_LOAD "GFitsTableDblCol::load()" | 26 | +#define G_FETCH_DATA "GFitsTableDblCol::fetch_data()" |
| 32 | 27 | ||
| 33 | /* __ Macros _____________________________________________________________ */ | 28 | /* __ Macros _____________________________________________________________ */ |
| 34 | 29 | ||
| @@ -43,9 +38,8 @@ | @@ -43,9 +38,8 @@ | ||
| 43 | = = | 38 | = = |
| 44 | ==========================================================================*/ | 39 | ==========================================================================*/ |
| 45 | 40 | ||
| 46 | -/*************************************************************************** | ||
| 47 | - * Constructor * | ||
| 48 | - * ----------------------------------------------------------------------- * | 41 | +/***********************************************************************//** |
| 42 | + * @brief Constructor | ||
| 49 | ***************************************************************************/ | 43 | ***************************************************************************/ |
| 50 | GFitsTableDblCol::GFitsTableDblCol() : GFitsTableCol() | 44 | GFitsTableDblCol::GFitsTableDblCol() : GFitsTableCol() |
| 51 | { | 45 | { |
| @@ -57,11 +51,35 @@ GFitsTableDblCol::GFitsTableDblCol() : GFitsTableCol() | @@ -57,11 +51,35 @@ GFitsTableDblCol::GFitsTableDblCol() : GFitsTableCol() | ||
| 57 | } | 51 | } |
| 58 | 52 | ||
| 59 | 53 | ||
| 60 | -/*************************************************************************** | ||
| 61 | - * Copy constructor * | ||
| 62 | - * ----------------------------------------------------------------------- * | 54 | +/***********************************************************************//** |
| 55 | + * @brief Constructor | ||
| 56 | + * | ||
| 57 | + * @param[in] length Length of column. | ||
| 58 | + * @param[in] size Vector size of column. | ||
| 63 | ***************************************************************************/ | 59 | ***************************************************************************/ |
| 64 | -GFitsTableDblCol::GFitsTableDblCol(const GFitsTableDblCol& column) : GFitsTableCol(column) | 60 | +GFitsTableDblCol::GFitsTableDblCol(const int& length, const int& size) |
| 61 | + : GFitsTableCol(length, size) | ||
| 62 | +{ | ||
| 63 | + // Initialise class members for clean destruction | ||
| 64 | + init_members(); | ||
| 65 | + | ||
| 66 | + // Setup format | ||
| 67 | + //m_name = "Test"; | ||
| 68 | + m_format = "1D"; | ||
| 69 | + //m_unit = "deg"; | ||
| 70 | + | ||
| 71 | + // Return | ||
| 72 | + return; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | + | ||
| 76 | +/***********************************************************************//** | ||
| 77 | + * @brief Copy constructor | ||
| 78 | + * | ||
| 79 | + * @param[in] column Column from which class instance should be built. | ||
| 80 | + ***************************************************************************/ | ||
| 81 | +GFitsTableDblCol::GFitsTableDblCol(const GFitsTableDblCol& column) : | ||
| 82 | + GFitsTableCol(column) | ||
| 65 | { | 83 | { |
| 66 | // Initialise class members for clean destruction | 84 | // Initialise class members for clean destruction |
| 67 | init_members(); | 85 | init_members(); |
| @@ -74,9 +92,8 @@ GFitsTableDblCol::GFitsTableDblCol(const GFitsTableDblCol& column) : GFitsTableC | @@ -74,9 +92,8 @@ GFitsTableDblCol::GFitsTableDblCol(const GFitsTableDblCol& column) : GFitsTableC | ||
| 74 | } | 92 | } |
| 75 | 93 | ||
| 76 | 94 | ||
| 77 | -/*************************************************************************** | ||
| 78 | - * Destructor * | ||
| 79 | - * ----------------------------------------------------------------------- * | 95 | +/***********************************************************************//** |
| 96 | + * @brief Destructor | ||
| 80 | ***************************************************************************/ | 97 | ***************************************************************************/ |
| 81 | GFitsTableDblCol::~GFitsTableDblCol() | 98 | GFitsTableDblCol::~GFitsTableDblCol() |
| 82 | { | 99 | { |
| @@ -94,9 +111,10 @@ GFitsTableDblCol::~GFitsTableDblCol() | @@ -94,9 +111,10 @@ GFitsTableDblCol::~GFitsTableDblCol() | ||
| 94 | = = | 111 | = = |
| 95 | ==========================================================================*/ | 112 | ==========================================================================*/ |
| 96 | 113 | ||
| 97 | -/*************************************************************************** | ||
| 98 | - * Assignment operator * | ||
| 99 | - * ----------------------------------------------------------------------- * | 114 | +/***********************************************************************//** |
| 115 | + * @brief Assignment operator | ||
| 116 | + * | ||
| 117 | + * @param[in] column Column which should be assigned | ||
| 100 | ***************************************************************************/ | 118 | ***************************************************************************/ |
| 101 | GFitsTableDblCol& GFitsTableDblCol::operator= (const GFitsTableDblCol& column) | 119 | GFitsTableDblCol& GFitsTableDblCol::operator= (const GFitsTableDblCol& column) |
| 102 | { | 120 | { |
| @@ -122,126 +140,193 @@ GFitsTableDblCol& GFitsTableDblCol::operator= (const GFitsTableDblCol& column) | @@ -122,126 +140,193 @@ GFitsTableDblCol& GFitsTableDblCol::operator= (const GFitsTableDblCol& column) | ||
| 122 | } | 140 | } |
| 123 | 141 | ||
| 124 | 142 | ||
| 143 | +/***********************************************************************//** | ||
| 144 | + * @brief Column data access operator | ||
| 145 | + * | ||
| 146 | + * @param[in] row Row of column to access. | ||
| 147 | + * @param[in] inx Vector index in column row to access | ||
| 148 | + * | ||
| 149 | + * Provides access to data in a column. No range checking is performed. | ||
| 150 | + * Use one of | ||
| 151 | + * GFitsTableDblCol::string(ix,iy), | ||
| 152 | + * GFitsTableDblCol::real(ix;iy) or | ||
| 153 | + * GFitsTableDblCol::integer(ix;iy) | ||
| 154 | + * if range checking is required. | ||
| 155 | + ***************************************************************************/ | ||
| 156 | +double& GFitsTableDblCol::operator() (const int& row, const int& inx) | ||
| 157 | +{ | ||
| 158 | + // If data are not available then load them now | ||
| 159 | + if (m_data == NULL) fetch_data(); | ||
| 160 | + | ||
| 161 | + // Calculate pixel offset | ||
| 162 | + int offset = row * m_repeat + inx; | ||
| 163 | + | ||
| 164 | + // Return image pixel | ||
| 165 | + return m_data[offset]; | ||
| 166 | +} | ||
| 167 | + | ||
| 168 | + | ||
| 169 | +/***********************************************************************//** | ||
| 170 | + * @brief Column data access operator (const variant) | ||
| 171 | + * | ||
| 172 | + * @param[in] row Row of column to access. | ||
| 173 | + * @param[in] inx Vector index in column row to access | ||
| 174 | + * | ||
| 175 | + * Provides access to data in a column. No range checking is performed. | ||
| 176 | + * Use one of | ||
| 177 | + * GFitsTableDblCol::string(ix,iy), | ||
| 178 | + * GFitsTableDblCol::real(ix;iy) or | ||
| 179 | + * GFitsTableDblCol::integer(ix;iy) | ||
| 180 | + * if range checking is required. | ||
| 181 | + ***************************************************************************/ | ||
| 182 | +const double& GFitsTableDblCol::operator() (const int& row, const int& inx) | ||
| 183 | + const | ||
| 184 | +{ | ||
| 185 | + // If data are not available then load them now | ||
| 186 | + if (m_data == NULL) ((GFitsTableDblCol*)this)->fetch_data(); | ||
| 187 | + | ||
| 188 | + // Calculate pixel offset | ||
| 189 | + int offset = row * m_repeat + inx; | ||
| 190 | + | ||
| 191 | + // Return image pixel | ||
| 192 | + return m_data[offset]; | ||
| 193 | +} | ||
| 194 | + | ||
| 195 | + | ||
| 125 | /*========================================================================== | 196 | /*========================================================================== |
| 126 | = = | 197 | = = |
| 127 | = GFitsTableDblCol public methods = | 198 | = GFitsTableDblCol public methods = |
| 128 | = = | 199 | = = |
| 129 | ==========================================================================*/ | 200 | ==========================================================================*/ |
| 130 | 201 | ||
| 131 | -/*************************************************************************** | ||
| 132 | - * Get string value * | ||
| 133 | - * ----------------------------------------------------------------------- * | 202 | +/***********************************************************************//** |
| 203 | + * @brief Get string value | ||
| 204 | + * | ||
| 205 | + * @param[in] row Table row. | ||
| 206 | + * @param[in] inx Table column vector index. | ||
| 207 | + * | ||
| 208 | + * @exception GException::out_of_range | ||
| 209 | + * Table row or vector index are out of valid range. | ||
| 210 | + * | ||
| 211 | + * Returns value of specified row and vector index as string. | ||
| 134 | ***************************************************************************/ | 212 | ***************************************************************************/ |
| 135 | -std::string GFitsTableDblCol::string(const int& row, const int& col) | 213 | +std::string GFitsTableDblCol::string(const int& row, const int& inx) |
| 136 | { | 214 | { |
| 137 | - // Make sure that data are loaded | ||
| 138 | - if (m_data == NULL) | ||
| 139 | - load(); | 215 | + // If data are not available then load them now |
| 216 | + if (m_data == NULL) fetch_data(); | ||
| 140 | 217 | ||
| 141 | // Check row value | 218 | // Check row value |
| 142 | if (row < 0 || row >= m_length) | 219 | if (row < 0 || row >= m_length) |
| 143 | throw GException::out_of_range(G_STRING, row, 0, m_length-1); | 220 | throw GException::out_of_range(G_STRING, row, 0, m_length-1); |
| 144 | 221 | ||
| 145 | - // Check col value | ||
| 146 | - if (col < 0 || col >= m_repeat) | ||
| 147 | - throw GException::out_of_range(G_STRING, col, 0, m_repeat-1); | 222 | + // Check inx value |
| 223 | + if (inx < 0 || inx >= m_repeat) | ||
| 224 | + throw GException::out_of_range(G_STRING, inx, 0, m_repeat-1); | ||
| 148 | 225 | ||
| 149 | // Get index | 226 | // Get index |
| 150 | - int inx = row * m_repeat + col; | 227 | + int offset = row * m_repeat + inx; |
| 151 | 228 | ||
| 152 | // Convert double into string | 229 | // Convert double into string |
| 153 | ostringstream s_value; | 230 | ostringstream s_value; |
| 154 | - s_value << scientific << m_data[inx]; | 231 | + s_value << scientific << m_data[offset]; |
| 155 | 232 | ||
| 156 | // Return value | 233 | // Return value |
| 157 | return s_value.str(); | 234 | return s_value.str(); |
| 158 | } | 235 | } |
| 159 | 236 | ||
| 160 | 237 | ||
| 161 | -/*************************************************************************** | ||
| 162 | - * Get real value * | ||
| 163 | - * ----------------------------------------------------------------------- * | 238 | +/***********************************************************************//** |
| 239 | + * @brief Get double precision value | ||
| 240 | + * | ||
| 241 | + * @param[in] row Table row. | ||
| 242 | + * @param[in] inx Table column vector index. | ||
| 243 | + * | ||
| 244 | + * @exception GException::out_of_range | ||
| 245 | + * Table row or vector index are out of valid range. | ||
| 246 | + * | ||
| 247 | + * Returns value of specified row and vector index as double precision. | ||
| 164 | ***************************************************************************/ | 248 | ***************************************************************************/ |
| 165 | -double GFitsTableDblCol::real(const int& row, const int& col) | 249 | +double GFitsTableDblCol::real(const int& row, const int& inx) |
| 166 | { | 250 | { |
| 167 | - // Make sure that data are loaded | ||
| 168 | - if (m_data == NULL) | ||
| 169 | - load(); | 251 | + // If data are not available then load them now |
| 252 | + if (m_data == NULL) fetch_data(); | ||
| 170 | 253 | ||
| 171 | // Check row value | 254 | // Check row value |
| 172 | if (row < 0 || row >= m_length) | 255 | if (row < 0 || row >= m_length) |
| 173 | throw GException::out_of_range(G_REAL, row, 0, m_length-1); | 256 | throw GException::out_of_range(G_REAL, row, 0, m_length-1); |
| 174 | 257 | ||
| 175 | - // Check col value | ||
| 176 | - if (col < 0 || col >= m_repeat) | ||
| 177 | - throw GException::out_of_range(G_REAL, col, 0, m_repeat-1); | 258 | + // Check inx value |
| 259 | + if (inx < 0 || inx >= m_repeat) | ||
| 260 | + throw GException::out_of_range(G_REAL, inx, 0, m_repeat-1); | ||
| 178 | 261 | ||
| 179 | // Get index | 262 | // Get index |
| 180 | - int inx = row * m_repeat + col; | 263 | + int offset = row * m_repeat + inx; |
| 181 | 264 | ||
| 182 | // Return value | 265 | // Return value |
| 183 | - return m_data[inx]; | 266 | + return m_data[offset]; |
| 184 | } | 267 | } |
| 185 | 268 | ||
| 186 | 269 | ||
| 187 | -/*************************************************************************** | ||
| 188 | - * Get int value * | ||
| 189 | - * ----------------------------------------------------------------------- * | 270 | +/***********************************************************************//** |
| 271 | + * @brief Get integer value | ||
| 272 | + * | ||
| 273 | + * @param[in] row Table row. | ||
| 274 | + * @param[in] inx Table column vector index. | ||
| 275 | + * | ||
| 276 | + * @exception GException::out_of_range | ||
| 277 | + * Table row or vector index are out of valid range. | ||
| 278 | + * | ||
| 279 | + * Returns value of specified row and vector index as integer. | ||
| 190 | ***************************************************************************/ | 280 | ***************************************************************************/ |
| 191 | -int GFitsTableDblCol::integer(const int& row, const int& col) | 281 | +int GFitsTableDblCol::integer(const int& row, const int& inx) |
| 192 | { | 282 | { |
| 193 | - // Make sure that data are loaded | ||
| 194 | - if (m_data == NULL) | ||
| 195 | - load(); | 283 | + // If data are not available then load them now |
| 284 | + if (m_data == NULL) fetch_data(); | ||
| 196 | 285 | ||
| 197 | // Check row value | 286 | // Check row value |
| 198 | if (row < 0 || row >= m_length) | 287 | if (row < 0 || row >= m_length) |
| 199 | throw GException::out_of_range(G_INTEGER, row, 0, m_length-1); | 288 | throw GException::out_of_range(G_INTEGER, row, 0, m_length-1); |
| 200 | 289 | ||
| 201 | // Check col value | 290 | // Check col value |
| 202 | - if (col < 0 || col >= m_repeat) | ||
| 203 | - throw GException::out_of_range(G_INTEGER, col, 0, m_repeat-1); | 291 | + if (inx < 0 || inx >= m_repeat) |
| 292 | + throw GException::out_of_range(G_INTEGER, inx, 0, m_repeat-1); | ||
| 204 | 293 | ||
| 205 | // Get index | 294 | // Get index |
| 206 | - int inx = row * m_repeat + col; | 295 | + int offset = row * m_repeat + inx; |
| 207 | 296 | ||
| 208 | // Convert double into int | 297 | // Convert double into int |
| 209 | - int value = (int)m_data[inx]; | 298 | + int value = (int)m_data[offset]; |
| 210 | 299 | ||
| 211 | // Return value | 300 | // Return value |
| 212 | return value; | 301 | return value; |
| 213 | } | 302 | } |
| 214 | 303 | ||
| 215 | 304 | ||
| 216 | -/*************************************************************************** | ||
| 217 | - * Access to invalid data pointers * | ||
| 218 | - * ----------------------------------------------------------------------- * | 305 | +/***********************************************************************//** |
| 306 | + * @brief Clone column | ||
| 219 | ***************************************************************************/ | 307 | ***************************************************************************/ |
| 220 | -float* GFitsTableDblCol::ptr_float(void) | ||
| 221 | -{ | ||
| 222 | - throw GException::fits_invalid_type(G_PTR_FLOAT, | ||
| 223 | - "No <float> pointer allowed to <double> array"); | ||
| 224 | -} | ||
| 225 | -short* GFitsTableDblCol::ptr_short(void) | ||
| 226 | -{ | ||
| 227 | - throw GException::fits_invalid_type(G_PTR_SHORT, | ||
| 228 | - "No <short> pointer allowed to <double> array"); | ||
| 229 | -} | ||
| 230 | -long* GFitsTableDblCol::ptr_long(void) | 308 | +GFitsTableDblCol* GFitsTableDblCol::clone(void) const |
| 231 | { | 309 | { |
| 232 | - throw GException::fits_invalid_type(G_PTR_LONG, | ||
| 233 | - "No <long> pointer allowed to <double> array"); | 310 | + return new GFitsTableDblCol(*this); |
| 234 | } | 311 | } |
| 235 | -int* GFitsTableDblCol::ptr_int(void) | 312 | + |
| 313 | + | ||
| 314 | +/***********************************************************************//** | ||
| 315 | + * @brief Return pointer to double precision column | ||
| 316 | + ***************************************************************************/ | ||
| 317 | +double* GFitsTableDblCol::data(void) | ||
| 236 | { | 318 | { |
| 237 | - throw GException::fits_invalid_type(G_PTR_INT, | ||
| 238 | - "No <int> pointer allowed to <double> array"); | 319 | + return m_data; |
| 239 | } | 320 | } |
| 240 | 321 | ||
| 241 | 322 | ||
| 242 | -/*************************************************************************** | ||
| 243 | - * Set NULL value * | ||
| 244 | - * ----------------------------------------------------------------------- * | 323 | +/***********************************************************************//** |
| 324 | + * @brief Set NULL value | ||
| 325 | + * | ||
| 326 | + * @param[in] value Pointer on NULL value | ||
| 327 | + * | ||
| 328 | + * Allows the specification of the FITS table NULL value. If value=NULL the | ||
| 329 | + * data will not be screened for NULL values. | ||
| 245 | ***************************************************************************/ | 330 | ***************************************************************************/ |
| 246 | void GFitsTableDblCol::set_nullval(const double* value) | 331 | void GFitsTableDblCol::set_nullval(const double* value) |
| 247 | { | 332 | { |
| @@ -258,13 +343,13 @@ void GFitsTableDblCol::set_nullval(const double* value) | @@ -258,13 +343,13 @@ void GFitsTableDblCol::set_nullval(const double* value) | ||
| 258 | *m_nulval = *value; | 343 | *m_nulval = *value; |
| 259 | } | 344 | } |
| 260 | 345 | ||
| 261 | - // Re-load column | ||
| 262 | - // NOTE: THIS WILL LEAD TO A LOSS OF MODIFICATIONS; ISSUE SAVE BEFORE !!! | 346 | + // Re-load column |
| 347 | +/* | ||
| 263 | if (m_data != NULL) { | 348 | if (m_data != NULL) { |
| 264 | - //save(); | 349 | + save(); |
| 265 | load(); | 350 | load(); |
| 266 | } | 351 | } |
| 267 | - | 352 | +*/ |
| 268 | // Return | 353 | // Return |
| 269 | return; | 354 | return; |
| 270 | } | 355 | } |
| @@ -276,9 +361,8 @@ void GFitsTableDblCol::set_nullval(const double* value) | @@ -276,9 +361,8 @@ void GFitsTableDblCol::set_nullval(const double* value) | ||
| 276 | = = | 361 | = = |
| 277 | ==========================================================================*/ | 362 | ==========================================================================*/ |
| 278 | 363 | ||
| 279 | -/*************************************************************************** | ||
| 280 | - * Initialise class members * | ||
| 281 | - * ----------------------------------------------------------------------- * | 364 | +/***********************************************************************//** |
| 365 | + * @brief Initialise class members | ||
| 282 | ***************************************************************************/ | 366 | ***************************************************************************/ |
| 283 | void GFitsTableDblCol::init_members(void) | 367 | void GFitsTableDblCol::init_members(void) |
| 284 | { | 368 | { |
| @@ -293,9 +377,10 @@ void GFitsTableDblCol::init_members(void) | @@ -293,9 +377,10 @@ void GFitsTableDblCol::init_members(void) | ||
| 293 | } | 377 | } |
| 294 | 378 | ||
| 295 | 379 | ||
| 296 | -/*************************************************************************** | ||
| 297 | - * Copy class members * | ||
| 298 | - * ----------------------------------------------------------------------- * | 380 | +/***********************************************************************//** |
| 381 | + * @brief Copy class members | ||
| 382 | + * | ||
| 383 | + * @param[in] column Column for which members should be copied. | ||
| 299 | ***************************************************************************/ | 384 | ***************************************************************************/ |
| 300 | void GFitsTableDblCol::copy_members(const GFitsTableDblCol& column) | 385 | void GFitsTableDblCol::copy_members(const GFitsTableDblCol& column) |
| 301 | { | 386 | { |
| @@ -322,9 +407,8 @@ void GFitsTableDblCol::copy_members(const GFitsTableDblCol& column) | @@ -322,9 +407,8 @@ void GFitsTableDblCol::copy_members(const GFitsTableDblCol& column) | ||
| 322 | } | 407 | } |
| 323 | 408 | ||
| 324 | 409 | ||
| 325 | -/*************************************************************************** | ||
| 326 | - * Delete class members * | ||
| 327 | - * ----------------------------------------------------------------------- * | 410 | +/***********************************************************************//** |
| 411 | + * @brief Delete class members | ||
| 328 | ***************************************************************************/ | 412 | ***************************************************************************/ |
| 329 | void GFitsTableDblCol::free_members(void) | 413 | void GFitsTableDblCol::free_members(void) |
| 330 | { | 414 | { |
| @@ -341,26 +425,47 @@ void GFitsTableDblCol::free_members(void) | @@ -341,26 +425,47 @@ void GFitsTableDblCol::free_members(void) | ||
| 341 | } | 425 | } |
| 342 | 426 | ||
| 343 | 427 | ||
| 344 | -/*************************************************************************** | ||
| 345 | - * Load column data * | ||
| 346 | - * ----------------------------------------------------------------------- * | 428 | +/***********************************************************************//** |
| 429 | + * @brief Fetch column data | ||
| 430 | + * | ||
| 431 | + * @exception GException::fits_error | ||
| 432 | + * An error occured while loading column data from FITS file. | ||
| 433 | + * | ||
| 434 | + * If a FITS file is attached to the column the data are loaded into memory | ||
| 435 | + * from the FITS file. If no FITS file is attached, memory is allocated | ||
| 436 | + * to hold the column data and all cells are set to 0. | ||
| 347 | ***************************************************************************/ | 437 | ***************************************************************************/ |
| 348 | -void GFitsTableDblCol::load(void) | 438 | +void GFitsTableDblCol::fetch_data(void) |
| 349 | { | 439 | { |
| 350 | // Calculate size of memory | 440 | // Calculate size of memory |
| 351 | m_size = m_repeat * m_length; | 441 | m_size = m_repeat * m_length; |
| 352 | 442 | ||
| 353 | - // Allocate memory | ||
| 354 | - if (m_data != NULL) delete [] m_data; | ||
| 355 | - m_data = new double[m_size]; | ||
| 356 | - | ||
| 357 | - // Load column data | ||
| 358 | - int status = 0; | ||
| 359 | - status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, &status); | ||
| 360 | - status = __ffgcv(&m_fitsfile, __TDOUBLE, m_colnum, 1, 1, m_size, | ||
| 361 | - m_nulval, m_data, &m_anynul, &status); | ||
| 362 | - if (status != 0) | ||
| 363 | - throw GException::fits_error(G_LOAD, status); | 443 | + // Load only if the column has a positive size |
| 444 | + if (m_size > 0) { | ||
| 445 | + | ||
| 446 | + // Allocate fresh memory | ||
| 447 | + if (m_data != NULL) delete [] m_data; | ||
| 448 | + m_data = new double[m_size]; | ||
| 449 | + | ||
| 450 | + // If a FITS file is attached then load column data from the FITS | ||
| 451 | + // file | ||
| 452 | + if (m_fitsfile.Fptr != NULL) { | ||
| 453 | + int status = 0; | ||
| 454 | + status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, | ||
| 455 | + &status); | ||
| 456 | + status = __ffgcv(&m_fitsfile, __TDOUBLE, m_colnum, 1, 1, m_size, | ||
| 457 | + m_nulval, m_data, &m_anynul, &status); | ||
| 458 | + if (status != 0) | ||
| 459 | + throw GException::fits_error(G_FETCH_DATA, status); | ||
| 460 | + } | ||
| 461 | + | ||
| 462 | + // ... otherwise initialise all column values to 0 | ||
| 463 | + else { | ||
| 464 | + for (int i = 0; i < m_size; ++i) | ||
| 465 | + m_data[i] = 0.0; | ||
| 466 | + } | ||
| 467 | + | ||
| 468 | + } // endif: column has a positive size | ||
| 364 | 469 | ||
| 365 | // Return | 470 | // Return |
| 366 | return; | 471 | return; |
src/fits/GFitsTableFltCol.cpp
| @@ -43,9 +43,8 @@ | @@ -43,9 +43,8 @@ | ||
| 43 | = = | 43 | = = |
| 44 | ==========================================================================*/ | 44 | ==========================================================================*/ |
| 45 | 45 | ||
| 46 | -/*************************************************************************** | ||
| 47 | - * Constructor * | ||
| 48 | - * ----------------------------------------------------------------------- * | 46 | +/***********************************************************************//** |
| 47 | + * @brief Constructor | ||
| 49 | ***************************************************************************/ | 48 | ***************************************************************************/ |
| 50 | GFitsTableFltCol::GFitsTableFltCol() : GFitsTableCol() | 49 | GFitsTableFltCol::GFitsTableFltCol() : GFitsTableCol() |
| 51 | { | 50 | { |
| @@ -57,11 +56,13 @@ GFitsTableFltCol::GFitsTableFltCol() : GFitsTableCol() | @@ -57,11 +56,13 @@ GFitsTableFltCol::GFitsTableFltCol() : GFitsTableCol() | ||
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | 58 | ||
| 60 | -/*************************************************************************** | ||
| 61 | - * Copy constructor * | ||
| 62 | - * ----------------------------------------------------------------------- * | 59 | +/***********************************************************************//** |
| 60 | + * @brief Copy constructor | ||
| 61 | + * | ||
| 62 | + * @param[in] column Column from which class instance should be built. | ||
| 63 | ***************************************************************************/ | 63 | ***************************************************************************/ |
| 64 | -GFitsTableFltCol::GFitsTableFltCol(const GFitsTableFltCol& column) : GFitsTableCol(column) | 64 | +GFitsTableFltCol::GFitsTableFltCol(const GFitsTableFltCol& column) : |
| 65 | + GFitsTableCol(column) | ||
| 65 | { | 66 | { |
| 66 | // Initialise class members for clean destruction | 67 | // Initialise class members for clean destruction |
| 67 | init_members(); | 68 | init_members(); |
| @@ -74,9 +75,8 @@ GFitsTableFltCol::GFitsTableFltCol(const GFitsTableFltCol& column) : GFitsTableC | @@ -74,9 +75,8 @@ GFitsTableFltCol::GFitsTableFltCol(const GFitsTableFltCol& column) : GFitsTableC | ||
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | 77 | ||
| 77 | -/*************************************************************************** | ||
| 78 | - * Destructor * | ||
| 79 | - * ----------------------------------------------------------------------- * | 78 | +/***********************************************************************//** |
| 79 | + * @brief Destructor | ||
| 80 | ***************************************************************************/ | 80 | ***************************************************************************/ |
| 81 | GFitsTableFltCol::~GFitsTableFltCol() | 81 | GFitsTableFltCol::~GFitsTableFltCol() |
| 82 | { | 82 | { |
| @@ -94,9 +94,10 @@ GFitsTableFltCol::~GFitsTableFltCol() | @@ -94,9 +94,10 @@ GFitsTableFltCol::~GFitsTableFltCol() | ||
| 94 | = = | 94 | = = |
| 95 | ==========================================================================*/ | 95 | ==========================================================================*/ |
| 96 | 96 | ||
| 97 | -/*************************************************************************** | ||
| 98 | - * Assignment operator * | ||
| 99 | - * ----------------------------------------------------------------------- * | 97 | +/***********************************************************************//** |
| 98 | + * @brief Assignment operator | ||
| 99 | + * | ||
| 100 | + * @param[in] column Column which should be assigned | ||
| 100 | ***************************************************************************/ | 101 | ***************************************************************************/ |
| 101 | GFitsTableFltCol& GFitsTableFltCol::operator= (const GFitsTableFltCol& column) | 102 | GFitsTableFltCol& GFitsTableFltCol::operator= (const GFitsTableFltCol& column) |
| 102 | { | 103 | { |
| @@ -128,9 +129,13 @@ GFitsTableFltCol& GFitsTableFltCol::operator= (const GFitsTableFltCol& column) | @@ -128,9 +129,13 @@ GFitsTableFltCol& GFitsTableFltCol::operator= (const GFitsTableFltCol& column) | ||
| 128 | = = | 129 | = = |
| 129 | ==========================================================================*/ | 130 | ==========================================================================*/ |
| 130 | 131 | ||
| 131 | -/*************************************************************************** | ||
| 132 | - * Get string value * | ||
| 133 | - * ----------------------------------------------------------------------- * | 132 | +/***********************************************************************//** |
| 133 | + * @brief Get string value | ||
| 134 | + * | ||
| 135 | + * @param[in] row Table row. | ||
| 136 | + * @param[in] col Table column vector index. | ||
| 137 | + * | ||
| 138 | + * Returns value of specified row and vector index as string. | ||
| 134 | ***************************************************************************/ | 139 | ***************************************************************************/ |
| 135 | std::string GFitsTableFltCol::string(const int& row, const int& col) | 140 | std::string GFitsTableFltCol::string(const int& row, const int& col) |
| 136 | { | 141 | { |
| @@ -158,9 +163,13 @@ std::string GFitsTableFltCol::string(const int& row, const int& col) | @@ -158,9 +163,13 @@ std::string GFitsTableFltCol::string(const int& row, const int& col) | ||
| 158 | } | 163 | } |
| 159 | 164 | ||
| 160 | 165 | ||
| 161 | -/*************************************************************************** | ||
| 162 | - * Get real value * | ||
| 163 | - * ----------------------------------------------------------------------- * | 166 | +/***********************************************************************//** |
| 167 | + * @brief Get double precision value | ||
| 168 | + * | ||
| 169 | + * @param[in] row Table row. | ||
| 170 | + * @param[in] col Table column vector index. | ||
| 171 | + * | ||
| 172 | + * Returns value of specified row and vector index as double precision. | ||
| 164 | ***************************************************************************/ | 173 | ***************************************************************************/ |
| 165 | double GFitsTableFltCol::real(const int& row, const int& col) | 174 | double GFitsTableFltCol::real(const int& row, const int& col) |
| 166 | { | 175 | { |
| @@ -187,9 +196,13 @@ double GFitsTableFltCol::real(const int& row, const int& col) | @@ -187,9 +196,13 @@ double GFitsTableFltCol::real(const int& row, const int& col) | ||
| 187 | } | 196 | } |
| 188 | 197 | ||
| 189 | 198 | ||
| 190 | -/*************************************************************************** | ||
| 191 | - * Get int value * | ||
| 192 | - * ----------------------------------------------------------------------- * | 199 | +/***********************************************************************//** |
| 200 | + * @brief Get integer value | ||
| 201 | + * | ||
| 202 | + * @param[in] row Table row. | ||
| 203 | + * @param[in] col Table column vector index. | ||
| 204 | + * | ||
| 205 | + * Returns value of specified row and vector index as integer. | ||
| 193 | ***************************************************************************/ | 206 | ***************************************************************************/ |
| 194 | int GFitsTableFltCol::integer(const int& row, const int& col) | 207 | int GFitsTableFltCol::integer(const int& row, const int& col) |
| 195 | { | 208 | { |
| @@ -216,35 +229,31 @@ int GFitsTableFltCol::integer(const int& row, const int& col) | @@ -216,35 +229,31 @@ int GFitsTableFltCol::integer(const int& row, const int& col) | ||
| 216 | } | 229 | } |
| 217 | 230 | ||
| 218 | 231 | ||
| 219 | -/*************************************************************************** | ||
| 220 | - * Access to invalid data pointers * | ||
| 221 | - * ----------------------------------------------------------------------- * | 232 | +/***********************************************************************//** |
| 233 | + * @brief Clone column | ||
| 222 | ***************************************************************************/ | 234 | ***************************************************************************/ |
| 223 | -double* GFitsTableFltCol::ptr_double(void) | 235 | +GFitsTableFltCol* GFitsTableFltCol::clone(void) const |
| 224 | { | 236 | { |
| 225 | - throw GException::fits_invalid_type(G_PTR_DOUBLE, | ||
| 226 | - "No <double> pointer allowed to <float> array"); | 237 | + return new GFitsTableFltCol(*this); |
| 227 | } | 238 | } |
| 228 | -short* GFitsTableFltCol::ptr_short(void) | ||
| 229 | -{ | ||
| 230 | - throw GException::fits_invalid_type(G_PTR_SHORT, | ||
| 231 | - "No <short> pointer allowed to <float> array"); | ||
| 232 | -} | ||
| 233 | -long* GFitsTableFltCol::ptr_long(void) | ||
| 234 | -{ | ||
| 235 | - throw GException::fits_invalid_type(G_PTR_LONG, | ||
| 236 | - "No <long> pointer allowed to <float> array"); | ||
| 237 | -} | ||
| 238 | -int* GFitsTableFltCol::ptr_int(void) | 239 | + |
| 240 | + | ||
| 241 | +/***********************************************************************//** | ||
| 242 | + * @brief Return pointer to floating point column | ||
| 243 | + ***************************************************************************/ | ||
| 244 | +float* GFitsTableFltCol::data(void) | ||
| 239 | { | 245 | { |
| 240 | - throw GException::fits_invalid_type(G_PTR_INT, | ||
| 241 | - "No <int> pointer allowed to <float> array"); | 246 | + return m_data; |
| 242 | } | 247 | } |
| 243 | 248 | ||
| 244 | 249 | ||
| 245 | -/*************************************************************************** | ||
| 246 | - * Set NULL string * | ||
| 247 | - * ----------------------------------------------------------------------- * | 250 | +/***********************************************************************//** |
| 251 | + * @brief Set NULL value | ||
| 252 | + * | ||
| 253 | + * @param[in] value Pointer on NULL value | ||
| 254 | + * | ||
| 255 | + * Allows the specification of the FITS table NULL value. If value=NULL the | ||
| 256 | + * data will not be screened for NULL values. | ||
| 248 | ***************************************************************************/ | 257 | ***************************************************************************/ |
| 249 | void GFitsTableFltCol::set_nullval(const float* value) | 258 | void GFitsTableFltCol::set_nullval(const float* value) |
| 250 | { | 259 | { |
| @@ -261,12 +270,13 @@ void GFitsTableFltCol::set_nullval(const float* value) | @@ -261,12 +270,13 @@ void GFitsTableFltCol::set_nullval(const float* value) | ||
| 261 | *m_nulval = *value; | 270 | *m_nulval = *value; |
| 262 | } | 271 | } |
| 263 | 272 | ||
| 264 | - // Re-load column | ||
| 265 | - // NOTE: THIS WILL LEAD TO A LOSS OF MODIFICATIONS; ISSUE SAVE BEFORE !!! | 273 | + // Re-load column |
| 274 | +/* | ||
| 266 | if (m_data != NULL) { | 275 | if (m_data != NULL) { |
| 267 | - //save(); | 276 | + save(); |
| 268 | load(); | 277 | load(); |
| 269 | } | 278 | } |
| 279 | +*/ | ||
| 270 | 280 | ||
| 271 | // Return | 281 | // Return |
| 272 | return; | 282 | return; |
| @@ -279,9 +289,8 @@ void GFitsTableFltCol::set_nullval(const float* value) | @@ -279,9 +289,8 @@ void GFitsTableFltCol::set_nullval(const float* value) | ||
| 279 | = = | 289 | = = |
| 280 | ==========================================================================*/ | 290 | ==========================================================================*/ |
| 281 | 291 | ||
| 282 | -/*************************************************************************** | ||
| 283 | - * Initialise class members * | ||
| 284 | - * ----------------------------------------------------------------------- * | 292 | +/***********************************************************************//** |
| 293 | + * @brief Initialise class members | ||
| 285 | ***************************************************************************/ | 294 | ***************************************************************************/ |
| 286 | void GFitsTableFltCol::init_members(void) | 295 | void GFitsTableFltCol::init_members(void) |
| 287 | { | 296 | { |
| @@ -296,9 +305,10 @@ void GFitsTableFltCol::init_members(void) | @@ -296,9 +305,10 @@ void GFitsTableFltCol::init_members(void) | ||
| 296 | } | 305 | } |
| 297 | 306 | ||
| 298 | 307 | ||
| 299 | -/*************************************************************************** | ||
| 300 | - * Copy class members * | ||
| 301 | - * ----------------------------------------------------------------------- * | 308 | +/***********************************************************************//** |
| 309 | + * @brief Copy class members | ||
| 310 | + * | ||
| 311 | + * @param[in] column Column for which members should be copied. | ||
| 302 | ***************************************************************************/ | 312 | ***************************************************************************/ |
| 303 | void GFitsTableFltCol::copy_members(const GFitsTableFltCol& column) | 313 | void GFitsTableFltCol::copy_members(const GFitsTableFltCol& column) |
| 304 | { | 314 | { |
| @@ -325,9 +335,8 @@ void GFitsTableFltCol::copy_members(const GFitsTableFltCol& column) | @@ -325,9 +335,8 @@ void GFitsTableFltCol::copy_members(const GFitsTableFltCol& column) | ||
| 325 | } | 335 | } |
| 326 | 336 | ||
| 327 | 337 | ||
| 328 | -/*************************************************************************** | ||
| 329 | - * Delete class members * | ||
| 330 | - * ----------------------------------------------------------------------- * | 338 | +/***********************************************************************//** |
| 339 | + * @brief Delete class members | ||
| 331 | ***************************************************************************/ | 340 | ***************************************************************************/ |
| 332 | void GFitsTableFltCol::free_members(void) | 341 | void GFitsTableFltCol::free_members(void) |
| 333 | { | 342 | { |
| @@ -344,9 +353,8 @@ void GFitsTableFltCol::free_members(void) | @@ -344,9 +353,8 @@ void GFitsTableFltCol::free_members(void) | ||
| 344 | } | 353 | } |
| 345 | 354 | ||
| 346 | 355 | ||
| 347 | -/*************************************************************************** | ||
| 348 | - * Load column data * | ||
| 349 | - * ----------------------------------------------------------------------- * | 356 | +/***********************************************************************//** |
| 357 | + * @brief Load column data | ||
| 350 | ***************************************************************************/ | 358 | ***************************************************************************/ |
| 351 | void GFitsTableFltCol::load(void) | 359 | void GFitsTableFltCol::load(void) |
| 352 | { | 360 | { |
src/fits/GFitsTableLngCol.cpp
| @@ -23,12 +23,7 @@ | @@ -23,12 +23,7 @@ | ||
| 23 | #define G_STRING "GFitsTableLngCol::string(const int&, const int&)" | 23 | #define G_STRING "GFitsTableLngCol::string(const int&, const int&)" |
| 24 | #define G_REAL "GFitsTableLngCol::real(const int&, const int&)" | 24 | #define G_REAL "GFitsTableLngCol::real(const int&, const int&)" |
| 25 | #define G_INTEGER "GFitsTableLngCol::integer(const int&, const int&)" | 25 | #define G_INTEGER "GFitsTableLngCol::integer(const int&, const int&)" |
| 26 | -#define G_PTR_FLOAT "GFitsTableLngCol::ptr_float()" | ||
| 27 | -#define G_PTR_DOUBLE "GFitsTableLngCol::ptr_double()" | ||
| 28 | -#define G_PTR_SHORT "GFitsTableLngCol::ptr_short()" | ||
| 29 | -#define G_PTR_LONG "GFitsTableLngCol::ptr_long()" | ||
| 30 | -#define G_PTR_INT "GFitsTableLngCol::ptr_int()" | ||
| 31 | -#define G_LOAD "GFitsTableLngCol::load()" | 26 | +#define G_FETCH_DATA "GFitsTableLngCol::fetch_data()" |
| 32 | 27 | ||
| 33 | /* __ Macros _____________________________________________________________ */ | 28 | /* __ Macros _____________________________________________________________ */ |
| 34 | 29 | ||
| @@ -43,9 +38,8 @@ | @@ -43,9 +38,8 @@ | ||
| 43 | = = | 38 | = = |
| 44 | ==========================================================================*/ | 39 | ==========================================================================*/ |
| 45 | 40 | ||
| 46 | -/*************************************************************************** | ||
| 47 | - * Constructor * | ||
| 48 | - * ----------------------------------------------------------------------- * | 41 | +/***********************************************************************//** |
| 42 | + * @brief Constructor | ||
| 49 | ***************************************************************************/ | 43 | ***************************************************************************/ |
| 50 | GFitsTableLngCol::GFitsTableLngCol() : GFitsTableCol() | 44 | GFitsTableLngCol::GFitsTableLngCol() : GFitsTableCol() |
| 51 | { | 45 | { |
| @@ -57,11 +51,13 @@ GFitsTableLngCol::GFitsTableLngCol() : GFitsTableCol() | @@ -57,11 +51,13 @@ GFitsTableLngCol::GFitsTableLngCol() : GFitsTableCol() | ||
| 57 | } | 51 | } |
| 58 | 52 | ||
| 59 | 53 | ||
| 60 | -/*************************************************************************** | ||
| 61 | - * Copy constructor * | ||
| 62 | - * ----------------------------------------------------------------------- * | 54 | +/***********************************************************************//** |
| 55 | + * @brief Copy constructor | ||
| 56 | + * | ||
| 57 | + * @param[in] column Column from which class instance should be built. | ||
| 63 | ***************************************************************************/ | 58 | ***************************************************************************/ |
| 64 | -GFitsTableLngCol::GFitsTableLngCol(const GFitsTableLngCol& column) : GFitsTableCol(column) | 59 | +GFitsTableLngCol::GFitsTableLngCol(const GFitsTableLngCol& column) : |
| 60 | + GFitsTableCol(column) | ||
| 65 | { | 61 | { |
| 66 | // Initialise class members for clean destruction | 62 | // Initialise class members for clean destruction |
| 67 | init_members(); | 63 | init_members(); |
| @@ -74,9 +70,8 @@ GFitsTableLngCol::GFitsTableLngCol(const GFitsTableLngCol& column) : GFitsTableC | @@ -74,9 +70,8 @@ GFitsTableLngCol::GFitsTableLngCol(const GFitsTableLngCol& column) : GFitsTableC | ||
| 74 | } | 70 | } |
| 75 | 71 | ||
| 76 | 72 | ||
| 77 | -/*************************************************************************** | ||
| 78 | - * Destructor * | ||
| 79 | - * ----------------------------------------------------------------------- * | 73 | +/***********************************************************************//** |
| 74 | + * @brief Destructor | ||
| 80 | ***************************************************************************/ | 75 | ***************************************************************************/ |
| 81 | GFitsTableLngCol::~GFitsTableLngCol() | 76 | GFitsTableLngCol::~GFitsTableLngCol() |
| 82 | { | 77 | { |
| @@ -94,9 +89,10 @@ GFitsTableLngCol::~GFitsTableLngCol() | @@ -94,9 +89,10 @@ GFitsTableLngCol::~GFitsTableLngCol() | ||
| 94 | = = | 89 | = = |
| 95 | ==========================================================================*/ | 90 | ==========================================================================*/ |
| 96 | 91 | ||
| 97 | -/*************************************************************************** | ||
| 98 | - * Assignment operator * | ||
| 99 | - * ----------------------------------------------------------------------- * | 92 | +/***********************************************************************//** |
| 93 | + * @brief Assignment operator | ||
| 94 | + * | ||
| 95 | + * @param[in] column Column which should be assigned | ||
| 100 | ***************************************************************************/ | 96 | ***************************************************************************/ |
| 101 | GFitsTableLngCol& GFitsTableLngCol::operator= (const GFitsTableLngCol& column) | 97 | GFitsTableLngCol& GFitsTableLngCol::operator= (const GFitsTableLngCol& column) |
| 102 | { | 98 | { |
| @@ -122,129 +118,196 @@ GFitsTableLngCol& GFitsTableLngCol::operator= (const GFitsTableLngCol& column) | @@ -122,129 +118,196 @@ GFitsTableLngCol& GFitsTableLngCol::operator= (const GFitsTableLngCol& column) | ||
| 122 | } | 118 | } |
| 123 | 119 | ||
| 124 | 120 | ||
| 121 | +/***********************************************************************//** | ||
| 122 | + * @brief Column data access operator | ||
| 123 | + * | ||
| 124 | + * @param[in] row Row of column to access. | ||
| 125 | + * @param[in] inx Vector index in column row to access | ||
| 126 | + * | ||
| 127 | + * Provides access to data in a column. No range checking is performed. | ||
| 128 | + * Use one of | ||
| 129 | + * GFitsTableLngCol::string(ix,iy), | ||
| 130 | + * GFitsTableLngCol::real(ix;iy) or | ||
| 131 | + * GFitsTableLngCol::integer(ix;iy) | ||
| 132 | + * if range checking is required. | ||
| 133 | + ***************************************************************************/ | ||
| 134 | +long& GFitsTableLngCol::operator() (const int& row, const int& inx) | ||
| 135 | +{ | ||
| 136 | + // If data are not available then load them now | ||
| 137 | + if (m_data == NULL) fetch_data(); | ||
| 138 | + | ||
| 139 | + // Calculate pixel offset | ||
| 140 | + int offset = row * m_repeat + inx; | ||
| 141 | + | ||
| 142 | + // Return image pixel | ||
| 143 | + return m_data[offset]; | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | + | ||
| 147 | +/***********************************************************************//** | ||
| 148 | + * @brief Column data access operator (const variant) | ||
| 149 | + * | ||
| 150 | + * @param[in] row Row of column to access. | ||
| 151 | + * @param[in] inx Vector index in column row to access | ||
| 152 | + * | ||
| 153 | + * Provides access to data in a column. No range checking is performed. | ||
| 154 | + * Use one of | ||
| 155 | + * GFitsTableLngCol::string(ix,iy), | ||
| 156 | + * GFitsTableLngCol::real(ix;iy) or | ||
| 157 | + * GFitsTableLngCol::integer(ix;iy) | ||
| 158 | + * if range checking is required. | ||
| 159 | + ***************************************************************************/ | ||
| 160 | +const long& GFitsTableLngCol::operator() (const int& row, const int& inx) | ||
| 161 | + const | ||
| 162 | +{ | ||
| 163 | + // If data are not available then load them now | ||
| 164 | + if (m_data == NULL) ((GFitsTableLngCol*)this)->fetch_data(); | ||
| 165 | + | ||
| 166 | + // Calculate pixel offset | ||
| 167 | + int offset = row * m_repeat + inx; | ||
| 168 | + | ||
| 169 | + // Return image pixel | ||
| 170 | + return m_data[offset]; | ||
| 171 | +} | ||
| 172 | + | ||
| 173 | + | ||
| 125 | /*========================================================================== | 174 | /*========================================================================== |
| 126 | = = | 175 | = = |
| 127 | = GFitsTableLngCol public methods = | 176 | = GFitsTableLngCol public methods = |
| 128 | = = | 177 | = = |
| 129 | ==========================================================================*/ | 178 | ==========================================================================*/ |
| 130 | 179 | ||
| 131 | -/*************************************************************************** | ||
| 132 | - * Get string value * | ||
| 133 | - * ----------------------------------------------------------------------- * | 180 | +/***********************************************************************//** |
| 181 | + * @brief Get string value | ||
| 182 | + * | ||
| 183 | + * @param[in] row Table row. | ||
| 184 | + * @param[in] inx Table column vector index. | ||
| 185 | + * | ||
| 186 | + * @exception GException::out_of_range | ||
| 187 | + * Table row or vector index are out of valid range. | ||
| 188 | + * | ||
| 189 | + * Returns value of specified row and vector index as string. | ||
| 134 | ***************************************************************************/ | 190 | ***************************************************************************/ |
| 135 | -std::string GFitsTableLngCol::string(const int& row, const int& col) | 191 | +std::string GFitsTableLngCol::string(const int& row, const int& inx) |
| 136 | { | 192 | { |
| 137 | - // Make sure that data are loaded | ||
| 138 | - if (m_data == NULL) | ||
| 139 | - load(); | 193 | + // If data are not available then load them now |
| 194 | + if (m_data == NULL) fetch_data(); | ||
| 140 | 195 | ||
| 141 | // Check row value | 196 | // Check row value |
| 142 | if (row < 0 || row >= m_length) | 197 | if (row < 0 || row >= m_length) |
| 143 | throw GException::out_of_range(G_STRING, row, 0, m_length-1); | 198 | throw GException::out_of_range(G_STRING, row, 0, m_length-1); |
| 144 | 199 | ||
| 145 | - // Check col value | ||
| 146 | - if (col < 0 || col >= m_repeat) | ||
| 147 | - throw GException::out_of_range(G_STRING, col, 0, m_repeat-1); | 200 | + // Check inx value |
| 201 | + if (inx < 0 || inx >= m_repeat) | ||
| 202 | + throw GException::out_of_range(G_STRING, inx, 0, m_repeat-1); | ||
| 148 | 203 | ||
| 149 | // Get index | 204 | // Get index |
| 150 | - int inx = row * m_repeat + col; | 205 | + int offset = row * m_repeat + inx; |
| 151 | 206 | ||
| 152 | // Convert long into string | 207 | // Convert long into string |
| 153 | ostringstream s_value; | 208 | ostringstream s_value; |
| 154 | - s_value << m_data[inx]; | 209 | + s_value << m_data[offset]; |
| 155 | 210 | ||
| 156 | // Return value | 211 | // Return value |
| 157 | return s_value.str(); | 212 | return s_value.str(); |
| 158 | } | 213 | } |
| 159 | 214 | ||
| 160 | 215 | ||
| 161 | -/*************************************************************************** | ||
| 162 | - * Get real value * | ||
| 163 | - * ----------------------------------------------------------------------- * | 216 | +/***********************************************************************//** |
| 217 | + * @brief Get double precision value | ||
| 218 | + * | ||
| 219 | + * @param[in] row Table row. | ||
| 220 | + * @param[in] inx Table column vector index. | ||
| 221 | + * | ||
| 222 | + * @exception GException::out_of_range | ||
| 223 | + * Table row or vector index are out of valid range. | ||
| 224 | + * | ||
| 225 | + * Returns value of specified row and vector index as double precision. | ||
| 164 | ***************************************************************************/ | 226 | ***************************************************************************/ |
| 165 | -double GFitsTableLngCol::real(const int& row, const int& col) | 227 | +double GFitsTableLngCol::real(const int& row, const int& inx) |
| 166 | { | 228 | { |
| 167 | - // Make sure that data are loaded | ||
| 168 | - if (m_data == NULL) | ||
| 169 | - load(); | 229 | + // If data are not available then load them now |
| 230 | + if (m_data == NULL) fetch_data(); | ||
| 170 | 231 | ||
| 171 | // Check row value | 232 | // Check row value |
| 172 | if (row < 0 || row >= m_length) | 233 | if (row < 0 || row >= m_length) |
| 173 | throw GException::out_of_range(G_REAL, row, 0, m_length-1); | 234 | throw GException::out_of_range(G_REAL, row, 0, m_length-1); |
| 174 | 235 | ||
| 175 | - // Check col value | ||
| 176 | - if (col < 0 || col >= m_repeat) | ||
| 177 | - throw GException::out_of_range(G_REAL, col, 0, m_repeat-1); | 236 | + // Check inx value |
| 237 | + if (inx < 0 || inx >= m_repeat) | ||
| 238 | + throw GException::out_of_range(G_REAL, inx, 0, m_repeat-1); | ||
| 178 | 239 | ||
| 179 | // Get index | 240 | // Get index |
| 180 | - int inx = row * m_repeat + col; | 241 | + int offset = row * m_repeat + inx; |
| 181 | 242 | ||
| 182 | // Convert long into double | 243 | // Convert long into double |
| 183 | - double value = (double)m_data[inx]; | 244 | + double value = (double)m_data[offset]; |
| 184 | 245 | ||
| 185 | // Return value | 246 | // Return value |
| 186 | return value; | 247 | return value; |
| 187 | } | 248 | } |
| 188 | 249 | ||
| 189 | 250 | ||
| 190 | -/*************************************************************************** | ||
| 191 | - * Get int value * | ||
| 192 | - * ----------------------------------------------------------------------- * | 251 | +/***********************************************************************//** |
| 252 | + * @brief Get integer value | ||
| 253 | + * | ||
| 254 | + * @param[in] row Table row. | ||
| 255 | + * @param[in] inx Table column vector index. | ||
| 256 | + * | ||
| 257 | + * @exception GException::out_of_range | ||
| 258 | + * Table row or vector index are out of valid range. | ||
| 259 | + * | ||
| 260 | + * Returns value of specified row and vector index as integer. | ||
| 193 | ***************************************************************************/ | 261 | ***************************************************************************/ |
| 194 | -int GFitsTableLngCol::integer(const int& row, const int& col) | 262 | +int GFitsTableLngCol::integer(const int& row, const int& inx) |
| 195 | { | 263 | { |
| 196 | - // Make sure that data are loaded | ||
| 197 | - if (m_data == NULL) | ||
| 198 | - load(); | 264 | + // If data are not available then load them now |
| 265 | + if (m_data == NULL) fetch_data(); | ||
| 199 | 266 | ||
| 200 | // Check row value | 267 | // Check row value |
| 201 | if (row < 0 || row >= m_length) | 268 | if (row < 0 || row >= m_length) |
| 202 | throw GException::out_of_range(G_INTEGER, row, 0, m_length-1); | 269 | throw GException::out_of_range(G_INTEGER, row, 0, m_length-1); |
| 203 | 270 | ||
| 204 | - // Check col value | ||
| 205 | - if (col < 0 || col >= m_repeat) | ||
| 206 | - throw GException::out_of_range(G_INTEGER, col, 0, m_repeat-1); | 271 | + // Check inx value |
| 272 | + if (inx < 0 || inx >= m_repeat) | ||
| 273 | + throw GException::out_of_range(G_INTEGER, inx, 0, m_repeat-1); | ||
| 207 | 274 | ||
| 208 | // Get index | 275 | // Get index |
| 209 | - int inx = row * m_repeat + col; | 276 | + int offset = row * m_repeat + inx; |
| 210 | 277 | ||
| 211 | // Convert long into int | 278 | // Convert long into int |
| 212 | - int value = (int)m_data[inx]; | 279 | + int value = (int)m_data[offset]; |
| 213 | 280 | ||
| 214 | // Return value | 281 | // Return value |
| 215 | return value; | 282 | return value; |
| 216 | } | 283 | } |
| 217 | 284 | ||
| 218 | 285 | ||
| 219 | -/*************************************************************************** | ||
| 220 | - * Access to invalid data pointers * | ||
| 221 | - * ----------------------------------------------------------------------- * | 286 | +/***********************************************************************//** |
| 287 | + * @brief Clone column | ||
| 222 | ***************************************************************************/ | 288 | ***************************************************************************/ |
| 223 | -float* GFitsTableLngCol::ptr_float(void) | 289 | +GFitsTableLngCol* GFitsTableLngCol::clone(void) const |
| 224 | { | 290 | { |
| 225 | - throw GException::fits_invalid_type(G_PTR_FLOAT, | ||
| 226 | - "No <float> pointer allowed to <long> array"); | 291 | + return new GFitsTableLngCol(*this); |
| 227 | } | 292 | } |
| 228 | -double* GFitsTableLngCol::ptr_double(void) | ||
| 229 | -{ | ||
| 230 | - throw GException::fits_invalid_type(G_PTR_DOUBLE, | ||
| 231 | - "No <double> pointer allowed to <long> array"); | ||
| 232 | -} | ||
| 233 | -short* GFitsTableLngCol::ptr_short(void) | ||
| 234 | -{ | ||
| 235 | - throw GException::fits_invalid_type(G_PTR_SHORT, | ||
| 236 | - "No <short> pointer allowed to <long> array"); | ||
| 237 | -} | ||
| 238 | -int* GFitsTableLngCol::ptr_int(void) | 293 | + |
| 294 | + | ||
| 295 | +/***********************************************************************//** | ||
| 296 | + * @brief Return pointer to long integer column | ||
| 297 | + ***************************************************************************/ | ||
| 298 | +long* GFitsTableLngCol::data(void) | ||
| 239 | { | 299 | { |
| 240 | - throw GException::fits_invalid_type(G_PTR_INT, | ||
| 241 | - "No <int> pointer allowed to <long> array"); | 300 | + return m_data; |
| 242 | } | 301 | } |
| 243 | 302 | ||
| 244 | 303 | ||
| 245 | -/*************************************************************************** | ||
| 246 | - * Set NULL string * | ||
| 247 | - * ----------------------------------------------------------------------- * | 304 | +/***********************************************************************//** |
| 305 | + * @brief Set NULL value | ||
| 306 | + * | ||
| 307 | + * @param[in] value Pointer on NULL value | ||
| 308 | + * | ||
| 309 | + * Allows the specification of the FITS table NULL value. If value=NULL the | ||
| 310 | + * data will not be screened for NULL values. | ||
| 248 | ***************************************************************************/ | 311 | ***************************************************************************/ |
| 249 | void GFitsTableLngCol::set_nullval(const long* value) | 312 | void GFitsTableLngCol::set_nullval(const long* value) |
| 250 | { | 313 | { |
| @@ -261,12 +324,13 @@ void GFitsTableLngCol::set_nullval(const long* value) | @@ -261,12 +324,13 @@ void GFitsTableLngCol::set_nullval(const long* value) | ||
| 261 | *m_nulval = *value; | 324 | *m_nulval = *value; |
| 262 | } | 325 | } |
| 263 | 326 | ||
| 264 | - // Re-load column | ||
| 265 | - // NOTE: THIS WILL LEAD TO A LOSS OF MODIFICATIONS; ISSUE SAVE BEFORE !!! | 327 | + // Re-load column |
| 328 | +/* | ||
| 266 | if (m_data != NULL) { | 329 | if (m_data != NULL) { |
| 267 | - //save(); | 330 | + save(); |
| 268 | load(); | 331 | load(); |
| 269 | } | 332 | } |
| 333 | +*/ | ||
| 270 | 334 | ||
| 271 | // Return | 335 | // Return |
| 272 | return; | 336 | return; |
| @@ -279,9 +343,8 @@ void GFitsTableLngCol::set_nullval(const long* value) | @@ -279,9 +343,8 @@ void GFitsTableLngCol::set_nullval(const long* value) | ||
| 279 | = = | 343 | = = |
| 280 | ==========================================================================*/ | 344 | ==========================================================================*/ |
| 281 | 345 | ||
| 282 | -/*************************************************************************** | ||
| 283 | - * Initialise class members * | ||
| 284 | - * ----------------------------------------------------------------------- * | 346 | +/***********************************************************************//** |
| 347 | + * @brief Initialise class members | ||
| 285 | ***************************************************************************/ | 348 | ***************************************************************************/ |
| 286 | void GFitsTableLngCol::init_members(void) | 349 | void GFitsTableLngCol::init_members(void) |
| 287 | { | 350 | { |
| @@ -296,9 +359,10 @@ void GFitsTableLngCol::init_members(void) | @@ -296,9 +359,10 @@ void GFitsTableLngCol::init_members(void) | ||
| 296 | } | 359 | } |
| 297 | 360 | ||
| 298 | 361 | ||
| 299 | -/*************************************************************************** | ||
| 300 | - * Copy class members * | ||
| 301 | - * ----------------------------------------------------------------------- * | 362 | +/***********************************************************************//** |
| 363 | + * @brief Copy class members | ||
| 364 | + * | ||
| 365 | + * @param[in] column Column for which members should be copied. | ||
| 302 | ***************************************************************************/ | 366 | ***************************************************************************/ |
| 303 | void GFitsTableLngCol::copy_members(const GFitsTableLngCol& column) | 367 | void GFitsTableLngCol::copy_members(const GFitsTableLngCol& column) |
| 304 | { | 368 | { |
| @@ -325,9 +389,8 @@ void GFitsTableLngCol::copy_members(const GFitsTableLngCol& column) | @@ -325,9 +389,8 @@ void GFitsTableLngCol::copy_members(const GFitsTableLngCol& column) | ||
| 325 | } | 389 | } |
| 326 | 390 | ||
| 327 | 391 | ||
| 328 | -/*************************************************************************** | ||
| 329 | - * Delete class members * | ||
| 330 | - * ----------------------------------------------------------------------- * | 392 | +/***********************************************************************//** |
| 393 | + * @brief Delete class members | ||
| 331 | ***************************************************************************/ | 394 | ***************************************************************************/ |
| 332 | void GFitsTableLngCol::free_members(void) | 395 | void GFitsTableLngCol::free_members(void) |
| 333 | { | 396 | { |
| @@ -344,26 +407,47 @@ void GFitsTableLngCol::free_members(void) | @@ -344,26 +407,47 @@ void GFitsTableLngCol::free_members(void) | ||
| 344 | } | 407 | } |
| 345 | 408 | ||
| 346 | 409 | ||
| 347 | -/*************************************************************************** | ||
| 348 | - * Load column data * | ||
| 349 | - * ----------------------------------------------------------------------- * | 410 | +/***********************************************************************//** |
| 411 | + * @brief Fetch column data | ||
| 412 | + * | ||
| 413 | + * @exception GException::fits_error | ||
| 414 | + * An error occured while loading column data from FITS file. | ||
| 415 | + * | ||
| 416 | + * If a FITS file is attached to the column the data are loaded into memory | ||
| 417 | + * from the FITS file. If no FITS file is attached, memory is allocated | ||
| 418 | + * to hold the column data and all cells are set to 0. | ||
| 350 | ***************************************************************************/ | 419 | ***************************************************************************/ |
| 351 | -void GFitsTableLngCol::load(void) | 420 | +void GFitsTableLngCol::fetch_data(void) |
| 352 | { | 421 | { |
| 353 | // Calculate size of memory | 422 | // Calculate size of memory |
| 354 | m_size = m_repeat * m_length; | 423 | m_size = m_repeat * m_length; |
| 355 | 424 | ||
| 356 | - // Allocate memory | ||
| 357 | - if (m_data != NULL) delete [] m_data; | ||
| 358 | - m_data = new long[m_size]; | 425 | + // Load only if the column has a positive size |
| 426 | + if (m_size > 0) { | ||
| 427 | + | ||
| 428 | + // Allocate fresh memory | ||
| 429 | + if (m_data != NULL) delete [] m_data; | ||
| 430 | + m_data = new long[m_size]; | ||
| 359 | 431 | ||
| 360 | - // Load column data | ||
| 361 | - int status = 0; | ||
| 362 | - status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, &status); | ||
| 363 | - status = __ffgcv(&m_fitsfile, __TLONG, m_colnum, 1, 1, m_size, | ||
| 364 | - m_nulval, m_data, &m_anynul, &status); | ||
| 365 | - if (status != 0) | ||
| 366 | - throw GException::fits_error(G_LOAD, status); | 432 | + // If a FITS file is attached then load column data from the FITS |
| 433 | + // file | ||
| 434 | + if (m_fitsfile.Fptr != NULL) { | ||
| 435 | + int status = 0; | ||
| 436 | + status = __ffmahd(&m_fitsfile, (m_fitsfile.HDUposition)+1, NULL, | ||
| 437 | + &status); | ||
| 438 | + status = __ffgcv(&m_fitsfile, __TLONG, m_colnum, 1, 1, m_size, | ||
| 439 | + m_nulval, m_data, &m_anynul, &status); | ||
| 440 | + if (status != 0) | ||
| 441 | + throw GException::fits_error(G_FETCH_DATA, status); | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | + // ... otherwise initialise all column values to 0 | ||
| 445 | + else { | ||
| 446 | + for (int i = 0; i < m_size; ++i) | ||
| 447 | + m_data[i] = 0; | ||
| 448 | + } | ||
| 449 | + | ||
| 450 | + } // endif: column has a positive size | ||
| 367 | 451 | ||
| 368 | // Return | 452 | // Return |
| 369 | return; | 453 | return; |
| @@ -372,13 +456,13 @@ void GFitsTableLngCol::load(void) | @@ -372,13 +456,13 @@ void GFitsTableLngCol::load(void) | ||
| 372 | 456 | ||
| 373 | /*========================================================================== | 457 | /*========================================================================== |
| 374 | = = | 458 | = = |
| 375 | - = GFitsTableShtCol friends = | 459 | + = GFitsTableLngCol friends = |
| 376 | = = | 460 | = = |
| 377 | ==========================================================================*/ | 461 | ==========================================================================*/ |
| 378 | 462 | ||
| 379 | 463 | ||
| 380 | /*========================================================================== | 464 | /*========================================================================== |
| 381 | = = | 465 | = = |
| 382 | - = Other functions used by GFitsTableShtCol = | 466 | + = Other functions used by GFitsTableLngCol = |
| 383 | = = | 467 | = = |
| 384 | ==========================================================================*/ | 468 | ==========================================================================*/ |
src/rsp/GLATResponse.cpp
| @@ -425,10 +425,12 @@ void GLATResponse::psf_init(void) | @@ -425,10 +425,12 @@ void GLATResponse::psf_init(void) | ||
| 425 | 425 | ||
| 426 | // Evaluate ntail | 426 | // Evaluate ntail |
| 427 | double denom = psf_base_value(10.0, gtail); | 427 | double denom = psf_base_value(10.0, gtail); |
| 428 | - double ntail = (denom != 0.0) ? ncore * psf_base_value(10.0, gcore) / denom : 0.0; | 428 | + double ntail = (denom != 0.0) |
| 429 | + ? ncore * psf_base_value(10.0, gcore) / denom : 0.0; | ||
| 429 | 430 | ||
| 430 | // Calculate PSF dependence | 431 | // Calculate PSF dependence |
| 431 | - GVector psf = ncore * psf_base_vector(u, gcore) + ntail * psf_base_vector(u, gtail); | 432 | + GVector psf = ncore * psf_base_vector(u, gcore) + |
| 433 | + ntail * psf_base_vector(u, gtail); | ||
| 432 | 434 | ||
| 433 | // Normalize PSF vector to identical amplitudes at smallest angular | 435 | // Normalize PSF vector to identical amplitudes at smallest angular |
| 434 | // distance. This allows for accurate interpolation afterwards | 436 | // distance. This allows for accurate interpolation afterwards |
| @@ -555,7 +557,7 @@ double GLATResponse::psf_base_value(const double& u, const double& gamma) | @@ -555,7 +557,7 @@ double GLATResponse::psf_base_value(const double& u, const double& gamma) | ||
| 555 | double c0 = 1.0 - invgamma; | 557 | double c0 = 1.0 - invgamma; |
| 556 | double c1 = 1.0 + u * invgamma; | 558 | double c1 = 1.0 + u * invgamma; |
| 557 | double result = c0 * pow(c1,-gamma); | 559 | double result = c0 * pow(c1,-gamma); |
| 558 | - | 560 | + |
| 559 | // Return result | 561 | // Return result |
| 560 | return result; | 562 | return result; |
| 561 | } | 563 | } |
| @@ -567,7 +569,7 @@ GVector GLATResponse::psf_base_vector(const GVector& u, const double& gamma) | @@ -567,7 +569,7 @@ GVector GLATResponse::psf_base_vector(const GVector& u, const double& gamma) | ||
| 567 | double c0 = 1.0 - invgamma; | 569 | double c0 = 1.0 - invgamma; |
| 568 | GVector c1 = 1.0 + u * invgamma; | 570 | GVector c1 = 1.0 + u * invgamma; |
| 569 | GVector result = c0 * pow(c1,-gamma); | 571 | GVector result = c0 * pow(c1,-gamma); |
| 570 | - | 572 | + |
| 571 | // Return result | 573 | // Return result |
| 572 | return result; | 574 | return result; |
| 573 | } | 575 | } |
| @@ -631,7 +633,7 @@ void GLATResponse::init_members(void) | @@ -631,7 +633,7 @@ void GLATResponse::init_members(void) | ||
| 631 | //m_aeff_name.clear(); | 633 | //m_aeff_name.clear(); |
| 632 | //m_psf_name.clear(); | 634 | //m_psf_name.clear(); |
| 633 | //m_edisp_name.clear(); | 635 | //m_edisp_name.clear(); |
| 634 | - | 636 | + |
| 635 | // Initialise PSF members | 637 | // Initialise PSF members |
| 636 | m_psf_angle_num = 0; | 638 | m_psf_angle_num = 0; |
| 637 | m_psf_angle_min = 0.0; | 639 | m_psf_angle_min = 0.0; |
| @@ -703,7 +705,7 @@ GVector GLATResponse::get_fits_vector(const GFitsHDU* hdu, const std::string& co | @@ -703,7 +705,7 @@ GVector GLATResponse::get_fits_vector(const GFitsHDU* hdu, const std::string& co | ||
| 703 | GFitsTableCol* ptr = hdu->column(colname); | 705 | GFitsTableCol* ptr = hdu->column(colname); |
| 704 | if (ptr == NULL) | 706 | if (ptr == NULL) |
| 705 | throw GException::fits_column_not_found(G_GET_FITS_VECTOR, colname); | 707 | throw GException::fits_column_not_found(G_GET_FITS_VECTOR, colname); |
| 706 | - | 708 | + |
| 707 | // Determine number of entries | 709 | // Determine number of entries |
| 708 | int num = ptr->repeat(); | 710 | int num = ptr->repeat(); |
| 709 | 711 |
test/test_GFits.cpp
| @@ -373,14 +373,25 @@ void test_create(void) | @@ -373,14 +373,25 @@ void test_create(void) | ||
| 373 | 373 | ||
| 374 | // Attach binary table | 374 | // Attach binary table |
| 375 | try { | 375 | try { |
| 376 | + // Re-open FITS file | ||
| 376 | GFits fits; | 377 | GFits fits; |
| 377 | fits.open("test.fits"); | 378 | fits.open("test.fits"); |
| 379 | + | ||
| 380 | + // Create binary Table with 10 rows | ||
| 378 | int nrows = 10; | 381 | int nrows = 10; |
| 379 | - int ncols = 5; | ||
| 380 | - GFitsBinTable table(nrows); | 382 | + GFitsBinTable table = GFitsBinTable(nrows); |
| 383 | + GFitsTableDblCol first = GFitsTableDblCol(nrows); | ||
| 384 | + GFitsTableDblCol second = GFitsTableDblCol(nrows); | ||
| 385 | + table.append_column(&first); | ||
| 386 | + table.append_column(&second); | ||
| 387 | + cout << table; | ||
| 388 | + | ||
| 389 | + // Create HDU and append to FILE file | ||
| 381 | GFitsHDU hdu(table); | 390 | GFitsHDU hdu(table); |
| 382 | fits.append(&hdu); | 391 | fits.append(&hdu); |
| 383 | - cout << fits; | 392 | +// cout << fits; |
| 393 | + | ||
| 394 | + // Save FITS file | ||
| 384 | fits.save(); | 395 | fits.save(); |
| 385 | } | 396 | } |
| 386 | catch (exception &e) { | 397 | catch (exception &e) { |