ifw  0.0.1-dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
fits.hpp
Go to the documentation of this file.
1 
6 #ifndef IFW_DIT_FITS_HPP_
7 #define IFW_DIT_FITS_HPP_
8 
9 #include <string>
10 
11 #include <fitsio.h>
12 #include <CCfits/CCfits.h>
13 #include <CCfits/FITS.h>
14 #include <CCfits/PHDU.h>
15 
16 #include "ctd/defines/defines.hpp"
17 
18 #include "dit/did/Did.hpp"
19 
20 
21 namespace dit {
22 namespace fits {
23 
24 using CfitsioType = int32_t;
25 
26 const std::string FITS_KEY_ESO_HIERARCH = "HIERARCH ESO";
27 const int16_t ALL_HEADERS = SHRT_MAX;
28 
35 
36 
40 void HandleCfitsioError(const std::string& operation,
41  const int cfitsio_status);
42 
43 
53 std::string GenerateKey(const std::string& key,
54  const std::string& hierarch_prefix = FITS_KEY_ESO_HIERARCH);
55 
56 
69 void CreateFile(CCfits::FITS** fits_handle,
70  const std::string& filename,
71  const dit::did::Did& dictionary,
72  const int32_t bitpix,
73  const std::list<int32_t>& naxes,
74  std::string& target_filename,
75  const bool remove_if_exists = false,
76  const uint16_t nb_of_hdr_blocks = 1);
77 
85 void OpenFitsFile(CCfits::FITS** fits_handle,
86  const std::string& filename,
87  std::string& target_filename,
88  CCfits::RWmode mode = CCfits::Read);
89 
97 bool KeyInHdu(CCfits::FITS& fits_handle,
98  const int16_t hdu_nb,
99  const std::string& key);
100 
106 void MoveToHdu(CCfits::FITS& fits_handle,
107  const int16_t hdu_nb);
108 
123 void PrepForAddingKey(CCfits::FITS& fits_handle,
124  const dit::did::Did& dictionary,
125  const std::string& key,
126  const int16_t hdu_nb,
127  dit::did::Record& did_record,
128  std::string& target_key,
129  bool& key_in_hdu,
130  CfitsioType& cfitsio_type,
131  dit::did::FormatSpecifier& format_specifier);
132 
143 template <class TYPE> void AddKey(CCfits::FITS& fits_handle,
144  const dit::did::Did& dictionary,
145  const std::string& key,
146  const TYPE& value,
147  const int16_t hdu_nb) {
148  RAD_LOG_TRACE();
149 
150  RAD_LOG_DEBUG1() << "Keyword to add: \"" << key << "\". Type: " << typeid(value).name();
151 
152  if ((typeid(TYPE) == typeid(double)) || (typeid(TYPE) == typeid(float))) {
154  throw rad::Exception("Use dit::fits::AddDoubleKey() for floating point "
155  "type keyword cards");
156  }
157 
158  dit::did::Record did_record;
159  std::string target_key;
160  bool key_in_hdu;
161  CfitsioType cfitsio_type;
162  dit::did::FormatSpecifier format_spec;
163  PrepForAddingKey(fits_handle, dictionary, key, hdu_nb, did_record, target_key, key_in_hdu,
164  cfitsio_type, format_spec);
165 
166  try {
167  if (hdu_nb == 1) {
168  fits_handle.pHDU().addKey(target_key, value, did_record.GetComment());
169  } else {
170  fits_handle.extension(hdu_nb).addKey(target_key, value, did_record.GetComment());
171  }
172  } catch (CCfits::FitsException& ex) {
173  throw rad::Exception(ifw::Print("Error adding key: \"%s\". Diagnostics: %s.",
174  key.c_str(), ex.message().c_str()));
175  }
176 }
177 
178 
187 void AddDoubleKey(CCfits::FITS& fits_handle,
188  const dit::did::Did& dictionary,
189  const std::string& key,
190  const double value,
191  const uint16_t hdu_nb);
192 
193 
195 class FitsReport {
196 public:
199 private:
200 };
201 
202 
213 void Verify(const std::string& filename,
214  std::string& target_filename,
215  dit::fits::FitsReport& report);
216 
224 void Verify(const std::string& filename,
225  std::string& target_filename,
226  const dit::did::Did& dictionary,
227  dit::fits::FitsReport& report);
228 
237 void ExtractHeaders(const std::string& filename,
238  std::string& target_filename,
239  std::string& hdr_buf,
240  const int16_t hdr_ref = ALL_HEADERS);
241 
248 void ExtractHeaders(CCfits::FITS& fits_handle,
249  std::string& hdr_buf,
250  const int16_t hdr_ref = ALL_HEADERS);
251 
252 } // namespace fits
253 } // namespace ctd
254 
255 #endif // IFW_DIT_FITS_HPP_
double value
Definition: easylogging++.h:814
void OpenFitsFile(CCfits::FITS **fits_handle, const std::string &filename, std::string &target_filename, CCfits::RWmode mode)
Open an existing FITS file.
Definition: fits.cpp:334
void PrepForAddingKey(CCfits::FITS &fits_handle, const dit::did::Did &dictionary, const std::string &key, const int16_t hdu_nb, dit::did::Record &did_record, std::string &target_key, bool &key_in_hdu, CfitsioType &cfitsio_type, dit::did::FormatSpecifier &format_specifier)
Used to prepare for adding a keyword card in a FITS file (mostly internal usage). ...
Definition: fits.cpp:245
class to handle the format specifier of a DID record.
Definition: Record.hpp:69
const std::string & GetComment() const
Get the comment defined.
Definition: Record.cpp:339
void AddDoubleKey(CCfits::FITS &fits_handle, const dit::did::Did &dictionary, const std::string &key, const double value, const uint16_t hdu_nb)
Add a double type key in an existing FITS file.
Definition: fits.cpp:193
DataType
Data types numeric representations.
Definition: defines.hpp:33
bool KeyInHdu(CCfits::FITS &fits_handle, const int16_t hdu_nb, const std::string &key)
Check if a given key is contained in the referenced HDU (primary HDU = 1).
Definition: fits.cpp:155
void Verify(const std::string &filename, std::string &target_filename, dit::fits::FitsReport &report)
Function to carry out a verification check on a FITS file.
Definition: fits.cpp:74
CfitsioType DidToCfitsioType(ctd::defines::DataType did_type)
Convert an ELT ICS data type to the corresponding cfitsio data type.
Definition: fits.cpp:16
std::string GenerateKey(const std::string &key, const std::string &hierarch_prefix)
Generates an ESO hierarchical keyword.
Definition: fits.cpp:60
const std::string FITS_KEY_ESO_HIERARCH
Definition: fits.hpp:26
~FitsReport()
Definition: fits.hpp:198
FitsReport()
Definition: fits.hpp:197
void CreateFile(CCfits::FITS **fits_handle, const std::string &filename, const dit::did::Did &dictionary, const int32_t bitpix, const std::list< int32_t > &naxes, std::string &target_filename, const bool remove_if_exists, const uint16_t nb_of_hdr_blocks)
Create a new FITS file.
Definition: fits.cpp:93
#define RAD_LOG_DEBUG1()
Definition: Logger.hpp:291
void HandleCfitsioError(const std::string &operation, const int cfitsio_status)
Throw an exception, extracting the relevant info from cfitsio, if status != 0.
Definition: fits.cpp:35
Data Interface Dictionary keyword record class.
Definition: Record.hpp:96
Definition: Exceptions.hpp:44
int32_t CfitsioType
Definition: fits.hpp:24
void AddKey(CCfits::FITS &fits_handle, const dit::did::Did &dictionary, const std::string &key, const TYPE &value, const int16_t hdu_nb)
Template function to add a keyword card in an existing FITS file.
Definition: fits.hpp:143
std::string Print(const char *format,...)
Create formatted string, return formatted string (C formatting convention).
Definition: defines.cpp:71
#define RAD_LOG_TRACE()
Definition: Logger.hpp:319
const int16_t ALL_HEADERS
Definition: fits.hpp:27
Class to handle information for one FITS file check run.
Definition: fits.hpp:195
void MoveToHdu(CCfits::FITS &fits_handle, const int16_t hdu_nb)
Move to the given HDU.
Definition: fits.cpp:141
Data Interface Dictionary class.
Definition: Did.hpp:25
void ExtractHeaders(CCfits::FITS &fits_handle, std::string &hdr_buf, const int16_t hdr_ref)
Extract the keyword cards in one or more HDU&#39;s in an ASCII format (newline terminated).
Definition: fits.cpp:273
optional string name
Definition: topics.proto:50