ifw-daq  1.0.0
IFW Data Acquisition modules
cfitsio.cpp
Go to the documentation of this file.
1 /**
2  * @file
3  * @ingroup daq_ocm_libfits
4  * @copyright 2021 ESO - European Southern Observatory
5  *
6  * @brief Contains definitions for daq/fits/cfitsio.hpp
7  */
8 #include <daq/fits/cfitsio.hpp>
9 
10 #include <cassert>
11 
12 #include <fmt/format.h>
13 
14 namespace daq::fits {
15 
16 CfitsioError::CfitsioError(int status, char const* message)
17  : std::runtime_error(message), m_status(status) {
18 }
19 CfitsioError::CfitsioError(int status, std::string const& message)
20  : std::runtime_error(message), m_status(status) {
21 }
22 
23 void DefaultClose(fitsfile* ptr) noexcept {
24  if (ptr == nullptr) {
25  return;
26  }
27  int status = 0;
28  fits_close_file(ptr, &status);
29 }
30 
31 int CfitsioError::GetStatus() const noexcept {
32  return m_status;
33 }
34 
35 void InitPrimaryHduNoImage(fitsfile* ptr) {
36  /*
37  SIMPLE = T / file does conform to FITS standard
38  BITPIX = 8 / number of bits per data pixel
39  NAXIS = 0 / number of data axes
40  */
41  assert(ptr);
42  int status = 0;
43  int simple = true;
44  char bitpix = 8;
45  char naxis = 0;
46  int num_hdus = 0;
47  (void)fits_get_num_hdus(ptr, &num_hdus, &status);
48  if (num_hdus != 0) {
49  throw CfitsioError(HEADER_NOT_EMPTY, "Cannot safely initialize an non-empty FITS file");
50  }
51  (void)fits_create_hdu(ptr, &status);
52  (void)fits_write_key(ptr,
53  TLOGICAL,
54  "SIMPLE",
55  &simple,
56  "file does conform to FITS standard",
57  &status);
58  (void)fits_write_key(ptr,
59  TBYTE,
60  "BITPIX",
61  &bitpix,
62  "number of bits per data pixel",
63  &status);
64  (void)fits_write_key(ptr,
65  TBYTE,
66  "NAXIS",
67  &naxis,
68  "file provides primary HDU keywords only",
69  &status);
70  if (status != 0) {
71  char err_text[31]; // returns maximum 30 characters
72  fits_get_errstatus(status, &err_text[0]);
73  err_text[30] = '\0';
74  throw CfitsioError(status, fmt::format("failed to initialize primary HDU: {}",
75  err_text));
76  }
77 }
78 
79 UniqueFitsFile CreateEmpty(char const* filename) {
80  fitsfile* ptr = nullptr;
81  int status = 0;
82  fits_create_file(&ptr, const_cast<char*>(filename), &status);
83  if (status != 0 || ptr == nullptr) {
84  throw CfitsioError(status, fmt::format("failed to create FITS file '{}'",
85  filename));
86  }
87  return UniqueFitsFile(ptr, DefaultClose);
88  /*, +[](fitsfile* p) {
89  int status = 0;
90  fits_close_file(p, &status);
91  }*/
92 }
93 
94 } // namespace daq::fits
daq::fits::CreateEmpty
UniqueFitsFile CreateEmpty(char const *filename)
Creates empty FITS file using fits_create_file and returns a pointer with a deleter that will close t...
Definition: cfitsio.cpp:79
daq::fits::CfitsioError
Represents errors from cfitsio.
Definition: cfitsio.hpp:20
daq::fits
Definition: cfitsio.cpp:14
daq::fits::UniqueFitsFile
std::unique_ptr< fitsfile, void(*)(fitsfile *) noexcept > UniqueFitsFile
Defines unique ownership type to cfitsio fitsfile.
Definition: cfitsio.hpp:46
daq::fits::CfitsioError::GetStatus
int GetStatus() const noexcept
Definition: cfitsio.cpp:31
cfitsio.hpp
Contains functions and data structures related to cfitsio.
daq::fits::InitPrimaryHduNoImage
void InitPrimaryHduNoImage(fitsfile *ptr)
Initializes an empty FITS file with a primary HDU.
Definition: cfitsio.cpp:35
daq::fits::DefaultClose
void DefaultClose(fitsfile *ptr) noexcept
Default close function that is used by UniqueFitsFile as a deleter.
Definition: cfitsio.cpp:23
daq::fits::CfitsioError::CfitsioError
CfitsioError(int status, char const *message)
Definition: cfitsio.cpp:16