Developer Application Interface (ARC API) v4.5.8
ARC, Inc. GenIV Application Interface
CArcFitsFile.h
1// +------------------------------------------------------------------------------------------------------------------+
2// | FILE: CArcFitsFile.h ( GenIV ) |
3// +------------------------------------------------------------------------------------------------------------------+
4// | PURPOSE: This file defines the standard ARC FITS interface. |
5// | |
6// | AUTHOR: Scott Streit DATE: October 03, 2014 |
7// | |
8// | Copyright 2013 Astronomical Research Cameras, Inc. All rights reserved. |
9// +------------------------------------------------------------------------------------------------------------------+
12#pragma once
13
14#ifdef _WINDOWS
15 #pragma warning( disable: 4251 )
16#endif
17
18
19#include <version>
20#include <filesystem>
21#include <stdexcept>
22#include <cstdint>
23#include <utility>
24#include <memory>
25#include <string>
26
27#if __cpp_lib_variant
28 #include <variant>
29#else
30 #include <tuple>
31#endif
32
33#include <CArcFitsFileDllMain.h>
34#include <CArcStringList.h>
35#include <CArcBase.h>
36
37#include <fitsio.h> // This header MUST be last to prevent winnt.h constant error!
38
39using namespace std::string_literals;
40
41
42
43namespace arc
44{
45 namespace gen4
46 {
47
48 namespace fits
49 {
50
52 using BPP_16 = std::uint16_t;
53
55 using BPP_32 = std::uint32_t;
56
57
60 #if __cpp_lib_variant
61 using keywordValue_t = std::variant<std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string>;
62 #else
63 using keywordValue_t = std::tuple<std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string>;
64 #endif
65
66
74 enum class fitsMode_e : std::int32_t
75 {
76 READMODE = READONLY,
77 READWRITEMODE = READWRITE
78 };
79
80
84 enum class fitsKeyType_e : std::int32_t
85 {
86 FITS_INVALID_KEY = -1,
87 FITS_STRING_KEY = 0,
102 };
103
104
106 struct GEN4_CARCFITSFILE_API fitsParameter_t final
107 {
109 long m_lNAxes[ 3 ];
110
113
116 };
117
118
122 const std::string toString( const fitsParameter_t& tParam );
123
124
128 template <typename T>
129 struct GEN4_CARCFITSFILE_API ArrayDeleter
130 {
134 void operator()( T* p ) const
135 {
136 if ( p != nullptr )
137 {
138 delete [] p;
139 }
140 }
141 };
142
143
144 // +----------------------------------------------------------------------------------------------------------+
145 // | Definitions for Point data type |
146 // +----------------------------------------------------------------------------------------------------------+
147
152 using point_t = std::pair<long, long>;
153
154
159 constexpr auto MAKE_POINT( std::uint32_t uiColumn, std::uint32_t uiRow ) { return std::make_pair( uiColumn, uiRow ); }
160
161 } // end fits namespace
162
163
168 template <typename T = arc::gen4::fits::BPP_16>
169 class GEN4_CARCFITSFILE_API CArcFitsFile : public arc::gen4::CArcBase
170 {
171 public:
172
177
180 virtual ~CArcFitsFile( void );
181
185 static const std::string version( void ) noexcept;
186
190 static const std::string cfitsioVersion( void ) noexcept;
191
195 const std::string getType( void ) const noexcept;
196
205 void create( const std::filesystem::path& tFileName, std::uint32_t uiCols, std::uint32_t uiRows );
206
215 void create3D( const std::filesystem::path& tFileName, std::uint32_t uiCols, std::uint32_t uiRows );
216
224 void open( const std::filesystem::path& tFileName, arc::gen4::fits::fitsMode_e eMode = arc::gen4::fits::fitsMode_e::READMODE );
225
228 void close( void ) noexcept;
229
236 std::unique_ptr<arc::gen4::CArcStringList> getHeader( void ) const;
237
243 const std::filesystem::path getFileName( void ) const;
244
252
269 void writeKeyword( const std::string& sKey, void* pValue, arc::gen4::fits::fitsKeyType_e eType, const std::string& sComment = ""s ) const;
270
286 void updateKeyword( const std::string& sKey, void* pValue, arc::gen4::fits::fitsKeyType_e eType, const std::string& sComment = ""s ) const;
287
292 std::unique_ptr<arc::gen4::fits::fitsParameter_t> getParameters( void ) const;
293
298 std::uint32_t getNumberOfFrames( void ) const;
299
304 std::uint32_t getRows( void ) const;
305
310 std::uint32_t getCols( void ) const;
311
316 std::uint32_t getNAxis( void ) const;
317
322 std::uint32_t getBitsPerPixel( void ) const;
323
328 void generateTestData( void ) const;
329
333 void reOpen( void );
334
338 void flush( void ) const;
339
345 bool compare( CArcFitsFile<T>& cFitsFile ) const;
346
353 void reSize( const std::uint32_t uiCols, const std::uint32_t uiRows );
354
360 void write( const T* pBuf ) const;
361
370 void write( const T* pBuf, const std::int64_t i64Bytes, const std::int64_t i64Pixel = 1 ) const;
371
379 void writeSubImage( const T* pBuf, const arc::gen4::fits::point_t lowerLeftPoint, const arc::gen4::fits::point_t upperRightPoint ) const;
380
388 std::unique_ptr<T[], arc::gen4::fits::ArrayDeleter<T>> readSubImage( arc::gen4::fits::point_t lowerLeftPoint, arc::gen4::fits::point_t upperRightPoint ) const;
389
395 std::unique_ptr<T[], arc::gen4::fits::ArrayDeleter<T>> read( void ) const;
396
405 void read( T* pBuf, const std::uint32_t uiCols, const std::uint32_t uiRows ) const;
406
412 void write3D( const T* pBuf ) const;
413
421 void reWrite3D( const T* pBuf, const std::uint32_t uiImageNumber ) const;
422
429 std::unique_ptr<T[], arc::gen4::fits::ArrayDeleter<T>> read3D( std::uint32_t uiImageNumber ) const;
430
434 fitsfile* getBaseFile( void ) const;
435
439 std::uint32_t maxTVal( void ) const;
440
441 private:
442
446 inline void verifyFileHandle( void ) const;
447
451 void throwFitsError( throwFormat_t<> tFormat, const std::int32_t iStatus ) const
452 {
453 char szFitsMsg[ 100 ];
454
455 fits_get_errstatus( iStatus, szFitsMsg );
456
457 #ifdef __cpp_lib_format
458
459 throwArcGen4Error( tFormat, std::string( szFitsMsg ) );
460
461 #else
462
463 tFormat.m_format = "%s";
464
465 throwArcGen4Error( tFormat, szFitsMsg );
466
467 #endif
468 }
469
471 static const std::string m_sVersion;
472
474 mutable std::int64_t m_i64Pixel;
475
477 mutable std::int32_t m_iFrame;
478
480 fitsfile* m_pFits;
481 };
482
483
484 } // end gen4 namespace
485} // end arc namespace
486
487
488
489#ifndef DOXYGEN_SHOULD_SKIP_THIS
490
491namespace std
492{
497 template<>
498 class GEN4_CARCFITSFILE_API default_delete< arc::gen4::fits::fitsParameter_t >
499 {
500 public:
501
505 void operator()( arc::gen4::fits::fitsParameter_t* pObj );
506 };
507}
508
509#endif // DOXYGEN_SHOULD_SKIP_THIS
std::uint32_t maxTVal(void) const
static const std::string version(void) noexcept
bool compare(CArcFitsFile< T > &cFitsFile) const
void open(const std::filesystem::path &tFileName, arc::gen4::fits::fitsMode_e eMode=arc::gen4::fits::fitsMode_e::READMODE)
fitsfile * getBaseFile(void) const
void write(const T *pBuf) const
std::unique_ptr< T[], arc::gen4::fits::ArrayDeleter< T > > read(void) const
void flush(void) const
std::uint32_t getBitsPerPixel(void) const
void write(const T *pBuf, const std::int64_t i64Bytes, const std::int64_t i64Pixel=1) const
void reWrite3D(const T *pBuf, const std::uint32_t uiImageNumber) const
void write3D(const T *pBuf) const
static const std::string cfitsioVersion(void) noexcept
arc::gen4::fits::keywordValue_t readKeyword(const std::string &sKey, arc::gen4::fits::fitsKeyType_e eType) const
std::unique_ptr< T[], arc::gen4::fits::ArrayDeleter< T > > readSubImage(arc::gen4::fits::point_t lowerLeftPoint, arc::gen4::fits::point_t upperRightPoint) const
void create(const std::filesystem::path &tFileName, std::uint32_t uiCols, std::uint32_t uiRows)
void close(void) noexcept
std::unique_ptr< arc::gen4::fits::fitsParameter_t > getParameters(void) const
std::uint32_t getRows(void) const
void create3D(const std::filesystem::path &tFileName, std::uint32_t uiCols, std::uint32_t uiRows)
void writeSubImage(const T *pBuf, const arc::gen4::fits::point_t lowerLeftPoint, const arc::gen4::fits::point_t upperRightPoint) const
virtual ~CArcFitsFile(void)
const std::filesystem::path getFileName(void) const
void reSize(const std::uint32_t uiCols, const std::uint32_t uiRows)
std::uint32_t getNAxis(void) const
void generateTestData(void) const
std::uint32_t getNumberOfFrames(void) const
const std::string getType(void) const noexcept
void read(T *pBuf, const std::uint32_t uiCols, const std::uint32_t uiRows) const
std::unique_ptr< T[], arc::gen4::fits::ArrayDeleter< T > > read3D(std::uint32_t uiImageNumber) const
void updateKeyword(const std::string &sKey, void *pValue, arc::gen4::fits::fitsKeyType_e eType, const std::string &sComment=""s) const
std::uint32_t getCols(void) const
void writeKeyword(const std::string &sKey, void *pValue, arc::gen4::fits::fitsKeyType_e eType, const std::string &sComment=""s) const
std::unique_ptr< arc::gen4::CArcStringList > getHeader(void) const
std::uint16_t BPP_16
Definition: CArcFitsFile.h:52
const std::string toString(const fitsParameter_t &tParam)
std::pair< long, long > point_t
Definition: CArcFitsFile.h:152
std::tuple< std::uint32_t, std::int32_t, std::uint64_t, std::int64_t, double, std::string > keywordValue_t
Definition: CArcFitsFile.h:63
constexpr auto MAKE_POINT(std::uint32_t uiColumn, std::uint32_t uiRow)
Definition: CArcFitsFile.h:159
std::uint32_t BPP_32
Definition: CArcFitsFile.h:55
void throwArcGen4Error(const throwFormat_t<> tFormat, Args &&... args)
Definition: CArcBase.h:106
Definition: CArcBase.h:50
std::string m_format
Definition: CArcBase.h:94