27 #include <CCfits/CCfits>
28 #include <boost/lexical_cast.hpp>
29 #include <boost/tokenizer.hpp>
38 for (
int i = 1; i <= table_hdu.numCols(); ++i) {
49 if (format[0] ==
'A') {
51 }
else if (format[0] ==
'I') {
52 return typeid(int64_t);
53 }
else if (format[0] ==
'F') {
54 return typeid(double);
55 }
else if (format[0] ==
'E') {
56 return typeid(double);
57 }
else if (format[0] ==
'D') {
58 return typeid(double);
66 char ft = format.
front();
77 }
else if (ft ==
'I') {
79 }
else if (ft ==
'J') {
81 }
else if (ft ==
'K') {
83 }
else if (ft ==
'E') {
85 }
else if (ft ==
'D') {
93 }
else if (ft ==
'B') {
94 return typeid(int32_t);
95 }
else if (ft ==
'I') {
96 return typeid(int32_t);
97 }
else if (ft ==
'J') {
98 return typeid(int32_t);
99 }
else if (ft ==
'K') {
100 return typeid(int64_t);
101 }
else if (ft ==
'E') {
102 return typeid(float);
103 }
else if (ft ==
'D') {
104 return typeid(double);
111 }
else if (ft ==
'I') {
113 }
else if (ft ==
'J') {
115 }
else if (ft ==
'K') {
117 }
else if (ft ==
'E') {
119 }
else if (ft ==
'D') {
121 }
else if (ft ==
'A') {
132 auto subtdim = tdim.
substr(1, tdim.
size() - 2);
133 boost::char_separator<char> sep{
","};
134 boost::tokenizer<boost::char_separator<char>> tok{subtdim, sep};
135 for (
auto&
s : tok) {
136 result.push_back(boost::lexical_cast<size_t>(
s));
146 for (
int i = 1; i <= table_hdu.numCols(); i++) {
147 auto& column = table_hdu.column(i);
149 if (
typeid(table_hdu) ==
typeid(CCfits::BinTable)) {
161 for (
int i = 1; i <= table_hdu.numCols(); ++i) {
162 units.
push_back(table_hdu.column(i).unit());
169 for (
int i = 1; i <= table_hdu.numCols(); ++i) {
172 if (key != table_hdu.keyWord().end()) {
173 key->second->value(desc);
175 descriptions.push_back(desc);
180 template <
typename T>
183 column.read(data, first, last);
185 for (
auto value : data) {
191 template <
typename T>
194 column.readArrays(data, first, last);
196 for (
auto& valar : data) {
202 template <
typename T>
205 column.readArrays(data, first, last);
209 for (
auto& valar : data) {
220 if (type ==
typeid(
bool)) {
221 return convertScalarColumn<bool>(column, first, last);
222 }
else if (type ==
typeid(int32_t)) {
223 return convertScalarColumn<int32_t>(column, first, last);
224 }
else if (type ==
typeid(int64_t)) {
225 return convertScalarColumn<int64_t>(column, first, last);
226 }
else if (type ==
typeid(
float)) {
227 return convertScalarColumn<float>(column, first, last);
228 }
else if (type ==
typeid(
double)) {
229 return convertScalarColumn<double>(column, first, last);
231 return convertScalarColumn<std::string>(column, first, last);
233 return convertVectorColumn<int32_t>(column, first, last);
235 return convertVectorColumn<int64_t>(column, first, last);
237 return convertVectorColumn<float>(column, first, last);
239 return convertVectorColumn<double>(column, first, last);
241 return convertNdArrayColumn<int32_t>(column, first, last);
243 return convertNdArrayColumn<int64_t>(column, first, last);
245 return convertNdArrayColumn<float>(column, first, last);
247 return convertNdArrayColumn<double>(column, first, last);
NdArray(const std::vector< size_t > &shape_)
std::type_index asciiFormatToType(const std::string &format)
std::vector< size_t > parseTDIM(const std::string &tdim)
std::vector< std::type_index > autoDetectColumnTypes(const CCfits::Table &table_hdu)
Reads the column types of the given table HDU.
std::map< std::string, ColumnDescription > autoDetectColumnDescriptions(std::istream &in, const std::string &comment)
Reads the column descriptions of the given stream.
std::vector< std::string > autoDetectColumnUnits(const CCfits::Table &table_hdu)
Reads the column units based on the TUNITn keyword.
std::vector< std::string > autoDetectColumnNames(std::istream &in, const std::string &comment, size_t columns_number)
Reads the column names of the given stream.
std::type_index binaryFormatToType(const std::string &format, const std::vector< size_t > &shape)
std::vector< Row::cell_type > convertScalarColumn(CCfits::Column &column, long first, long last)
std::vector< Row::cell_type > translateColumn(CCfits::Column &column, std::type_index type)
Returns a vector representing the given FITS table column data, converted to the requested type.
std::vector< Row::cell_type > convertNdArrayColumn(CCfits::Column &column, long first, long last)
std::vector< Row::cell_type > convertVectorColumn(CCfits::Column &column, long first, long last)