Developer Application Interface (ARC API) v3.6.2
ARC, Inc. GenII/III Application Interface
CArcFitsFile.h
Go to the documentation of this file.
1
2// +------------------------------------------------------------------------------------------------------------------+
3// | FILE: CArcFitsFile.h ( Gen3 ) |
4// +------------------------------------------------------------------------------------------------------------------+
5// | PURPOSE: This file defines the standard ARC FITS interface. |
6// | |
7// | AUTHOR: Scott Streit DATE: March 25, 2020 |
8// | |
9// | Copyright 2013 Astronomical Research Cameras, Inc. All rights reserved. |
10// +------------------------------------------------------------------------------------------------------------------+
11
12#pragma once
13
14#ifdef _WINDOWS
15#pragma warning( disable: 4251 )
16#endif
17
18#include <filesystem>
19#include <version>
20#include <stdexcept>
21#include <cstdint>
22#include <utility>
23#include <memory>
24#include <string>
25
26#ifdef __cpp_lib_variant
27 #include <variant>
28#else
29 #include <tuple>
30#endif
31
32#include <CArcFitsFileDllMain.h>
33#include <CArcStringList.h>
34#include <CArcBase.h>
35
36#include <fitsio.h> // This header MUST be last to prevent winnt.h constant error!
37
38
39namespace arc
40{
41 namespace gen3
42 {
43
44 namespace fits
45 {
46
48 using BPP_16 = std::uint16_t;
49
51 using BPP_32 = std::uint32_t;
52
53
55 #ifdef __cpp_lib_variant
56 using keywordValue_t = std::variant<std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string>;
57 #else
58 using keywordValue_t = std::tuple<std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string>;
59 #endif
60
61
69 enum class e_ReadMode : std::int32_t
70 {
71 READMODE = READONLY,
72 READWRITEMODE = READWRITE
73 };
74
75
95 enum class e_Type : std::int32_t
96 {
97 FITS_INVALID_KEY = -1,
98 FITS_STRING_KEY = 0,
99 FITS_INT_KEY,
100 FITS_UINT_KEY,
101 FITS_SHORT_KEY,
102 FITS_USHORT_KEY,
103 FITS_FLOAT_KEY,
104 FITS_DOUBLE_KEY,
105 FITS_BYTE_KEY,
106 FITS_LONG_KEY,
107 FITS_ULONG_KEY,
108 FITS_LONGLONG_KEY,
109 FITS_LOGICAL_KEY,
110 FITS_COMMENT_KEY,
111 FITS_HISTORY_KEY,
112 FITS_DATE_KEY
113 };
114
115
117 class GEN3_CARCFITSFILE_API CParam
118 {
119 public:
120
124 std::uint32_t getCols( void ) noexcept;
125
129 std::uint32_t getRows( void ) noexcept;
130
134 std::uint32_t getFrames( void ) noexcept;
135
139 std::uint32_t getNAxis( void ) noexcept;
140
144 std::uint32_t getBpp( void ) noexcept;
145
147 CParam( void );
148
150 ~CParam( void );
151
152 // Data members. Although public, intended for interal use only.
153 // +----------------------------------------------------------------+
154
156 long m_lNAxes[ 3 ];
157
159 long* m_plCols;
160
162 long* m_plRows;
163
166
169
172
173 // +----------------------------------------------------------------+
174 };
175
176
180 template <typename T>
181 struct GEN3_CARCFITSFILE_API ArrayDeleter
182 {
183 void operator()( T* p ) const
184 {
185 if ( p != nullptr )
186 {
187 delete[] p;
188 }
189 }
190 };
191
192
193 // +----------------------------------------------------------------------------------------------------------+
194 // | Definitions for Point data type |
195 // +----------------------------------------------------------------------------------------------------------+
196
199 using Point = std::pair<long, long>;
200
201
206 constexpr auto MAKE_POINT( std::uint32_t uiColumn, std::uint32_t uiRow ) { return std::make_pair( uiColumn, uiRow ); }
207
208 } // end fits namespace
209
210
215 template <typename T = arc::gen3::fits::BPP_16>
216 class GEN3_CARCFITSFILE_API CArcFitsFile : public arc::gen3::CArcBase
217 {
218 public:
219
223 CArcFitsFile( void );
224
227 virtual ~CArcFitsFile( void );
228
232 static const std::string version( void ) noexcept;
233
237 static const std::string cfitsioVersion( void ) noexcept;
238
242 std::string getType( void ) noexcept;
243
251 void create( const std::filesystem::path& tFileName, const std::uint32_t uiCols, const std::uint32_t uiRows );
252
260 void create3D( const std::filesystem::path& tFileName, const std::uint32_t uiCols, const std::uint32_t uiRows );
261
269 void open( const std::filesystem::path& tFileName, arc::gen3::fits::e_ReadMode eMode = arc::gen3::fits::e_ReadMode::READMODE );
270
273 void close( void ) noexcept;
274
281 std::unique_ptr<arc::gen3::CArcStringList> getHeader( void );
282
287 const std::string getFileName( void );
288
295 arc::gen3::fits::keywordValue_t readKeyword( const std::string& sKey, arc::gen3::fits::e_Type eType );
296
313 void writeKeyword( const std::string& sKey, void* pValue, arc::gen3::fits::e_Type eType, const std::string& sComment = "" );
314
330 void updateKeyword( const std::string& sKey, void* pValue, arc::gen3::fits::e_Type eType, const std::string& sComment = "" );
331
336 std::unique_ptr<arc::gen3::fits::CParam> getParameters( void );
337
342 std::uint32_t getNumberOfFrames( void );
343
348 std::uint32_t getRows( void );
349
354 std::uint32_t getCols( void );
355
360 std::uint32_t getNAxis( void );
361
366 std::uint32_t getBitsPerPixel( void );
367
372 void generateTestData( void );
373
377 void reOpen( void );
378
382 void flush( void );
383
387 void compare( CArcFitsFile<T>& cFitsFile );
388
395 void reSize( const std::uint32_t uiCols, const std::uint32_t uiRows );
396
402 void write( T* pBuf );
403
412 void write( T* pBuf, const std::int64_t i64Bytes, const std::int64_t i64Pixel = 1 );
413
421 void writeSubImage( T* pBuf, const arc::gen3::fits::Point& lowerLeftPoint, const arc::gen3::fits::Point& upperRightPoint );
422
430 std::unique_ptr<T[], arc::gen3::fits::ArrayDeleter<T>> readSubImage( arc::gen3::fits::Point lowerLeftPoint, arc::gen3::fits::Point upperRightPoint );
431
437 std::unique_ptr<T[], arc::gen3::fits::ArrayDeleter<T>> read( void );
438
447 void read( T* pBuf, const std::uint32_t uiCols, const std::uint32_t uiRows );
448
454 void write3D( T* pBuf );
455
463 void reWrite3D( T* pBuf, const std::uint32_t uiImageNumber );
464
471 std::unique_ptr<T[], arc::gen3::fits::ArrayDeleter<T>> read3D( const std::uint32_t uiImageNumber );
472
476 fitsfile* getBaseFile( void );
477
481 std::uint32_t maxTVal( void );
482
483 private:
484
488 constexpr void verifyFileHandle( void );
489
493 void throwFitsError( const std::int32_t iStatus );
494
496 static const std::string m_sVersion;
497
499 std::int64_t m_i64Pixel;
500
502 std::int32_t m_iFrame;
503
505 fitsfile* m_pFits;
506 };
507
508
509 } // end gen3 namespace
510} // end arc namespace
511
512
513
514namespace std
515{
520 template<>
521 class GEN3_CARCFITSFILE_API default_delete< arc::gen3::fits::CParam >
522 {
523 public:
524
528 void operator()( arc::gen3::fits::CParam* pObj );
529 };
530}
std::uint16_t BPP_16
Definition: CArcFitsFile.h:48
std::uint32_t BPP_32
Definition: CArcFitsFile.h:51
std::pair< long, long > Point
Definition: CArcFitsFile.h:199
constexpr auto MAKE_POINT(std::uint32_t uiColumn, std::uint32_t uiRow)
Definition: CArcFitsFile.h:206
std::tuple< std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string > keywordValue_t
Definition: CArcFitsFile.h:58
Definition: CArcBase.h:67
Definition: CArcFitsFile.h:217
Definition: CArcFitsFile.h:118
long * m_plRows
Definition: CArcFitsFile.h:162
int m_iBpp
Definition: CArcFitsFile.h:171
long * m_plFrames
Definition: CArcFitsFile.h:165
int m_iNAxis
Definition: CArcFitsFile.h:168
long * m_plCols
Definition: CArcFitsFile.h:159
Definition: CArcFitsFile.h:182
Definition: fitsio.h:453