25 #include <CCfits/CCfits> 26 #include <boost/lexical_cast.hpp> 27 #include <boost/tokenizer.hpp> 37 std::vector<std::string> names {};
38 for (
int i=1; i<=table_hdu.numCols(); ++i) {
39 std::string name = table_hdu.column(i).name();
41 name =
"Col" + std::to_string(i);
43 names.push_back(std::move(name));
49 if (format[0] ==
'A') {
50 return typeid(std::string);
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);
64 std::type_index
binaryFormatToType(
const std::string& format,
const std::vector<size_t>& shape) {
66 char ft = format.front();
68 if (std::isdigit(format.front())) {
69 size = std::stoi(format.substr(0, format.size() - 1));
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') {
95 return typeid(int32_t);
98 return typeid(int32_t);
100 else if (ft ==
'J') {
101 return typeid(int32_t);
103 else if (ft ==
'K') {
104 return typeid(int64_t);
106 else if (ft ==
'E') {
107 return typeid(float);
109 else if (ft ==
'D') {
110 return typeid(double);
116 return typeid(std::vector<int32_t>);
117 }
else if (ft ==
'I') {
118 return typeid(std::vector<int32_t>);
119 }
else if (ft ==
'J') {
120 return typeid(std::vector<int32_t>);
121 }
else if (ft ==
'K') {
122 return typeid(std::vector<int64_t>);
123 }
else if (ft ==
'E') {
124 return typeid(std::vector<float>);
125 }
else if (ft ==
'D') {
126 return typeid(std::vector<double>);
127 }
else if (ft ==
'A') {
128 return typeid(std::string);
135 std::vector<size_t>
parseTDIM(
const std::string &tdim) {
136 std::vector<size_t> result {};
137 if (!tdim.empty() && tdim.front() ==
'(' && tdim.back() ==
')') {
138 auto subtdim = tdim.substr(1, tdim.size() - 2);
139 boost::char_separator<char> sep{
","};
140 boost::tokenizer<boost::char_separator<char>> tok{subtdim, sep};
141 for (
auto&
s : tok) {
142 result.push_back(boost::lexical_cast<size_t>(
s));
145 std::reverse(result.begin(), result.end());
151 std::vector<std::type_index> types {};
152 for (
int i=1; i<=table_hdu.numCols(); i++) {
153 auto& column = table_hdu.column(i);
155 if (
typeid(table_hdu) ==
typeid(CCfits::BinTable)) {
166 std::vector<std::string> units {};
167 for (
int i=1; i<=table_hdu.numCols(); ++i) {
168 units.push_back(table_hdu.column(i).unit());
174 std::vector<std::string> descriptions {};
175 for (
int i=1; i<=table_hdu.numCols(); ++i) {
177 auto key = table_hdu.keyWord().find(
"TDESC" + std::to_string(i));
178 if (key != table_hdu.keyWord().end()) {
179 key->second->value(desc);
181 descriptions.push_back(desc);
189 column.read(data, first, last);
190 std::vector<Row::cell_type> result;
191 for (
auto value : data) {
192 result.push_back(value);
199 std::vector<std::valarray<T>> data;
200 column.readArrays(data, first, last);
201 std::vector<Row::cell_type> result;
202 for (
auto& valar : data) {
203 result.push_back(std::vector<T>(std::begin(valar),std::end(valar)));
210 std::vector<std::valarray<T>> data;
211 column.readArrays(data, first, last);
212 std::vector<size_t> shape =
parseTDIM(column.dimen());
214 std::vector<Row::cell_type> result;
215 for (
auto& valar : data) {
216 result.push_back(
NdArray<T>(shape, std::move(std::vector<T>(std::begin(valar), std::end(valar)))));
221 std::vector<Row::cell_type>
translateColumn(CCfits::Column& column, std::type_index type) {
225 std::vector<Row::cell_type>
translateColumn(CCfits::Column& column, std::type_index type,
long first,
long last) {
226 if (type ==
typeid(
bool)) {
227 return convertScalarColumn<bool>(column, first, last);
228 }
else if (type ==
typeid(int32_t)) {
229 return convertScalarColumn<int32_t>(column, first, last);
230 }
else if (type ==
typeid(int64_t)) {
231 return convertScalarColumn<int64_t>(column, first, last);
232 }
else if (type ==
typeid(
float)) {
233 return convertScalarColumn<float>(column, first, last);
234 }
else if (type ==
typeid(
double)) {
235 return convertScalarColumn<double>(column, first, last);
236 }
else if (type ==
typeid(std::string)) {
237 return convertScalarColumn<std::string>(column, first, last);
238 }
else if (type ==
typeid(std::vector<int32_t>)) {
239 return convertVectorColumn<int32_t>(column, first, last);
240 }
else if (type ==
typeid(std::vector<int64_t>)) {
241 return convertVectorColumn<int64_t>(column, first, last);
242 }
else if (type ==
typeid(std::vector<float>)) {
243 return convertVectorColumn<float>(column, first, last);
244 }
else if (type ==
typeid(std::vector<double>)) {
245 return convertVectorColumn<double>(column, first, last);
247 return convertNdArrayColumn<int32_t>(column, first, last);
249 return convertNdArrayColumn<int64_t>(column, first, last);
251 return convertNdArrayColumn<float>(column, first, last);
253 return convertNdArrayColumn<double>(column, first, last);
std::vector< Row::cell_type > convertVectorColumn(CCfits::Column &column, long first, long last)
std::type_index binaryFormatToType(const std::string &format, const std::vector< size_t > &shape)
NdArray(const std::vector< size_t > &shape)
std::type_index asciiFormatToType(const std::string &format)
std::map< std::string, ColumnDescription > autoDetectColumnDescriptions(std::istream &in, const std::string &comment)
Reads the column descriptions of the given stream.
std::vector< size_t > parseTDIM(const std::string &tdim)
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 > convertScalarColumn(CCfits::Column &column, long first, long last)
std::vector< Row::cell_type > convertNdArrayColumn(CCfits::Column &column, long first, long last)
std::vector< std::string > autoDetectColumnUnits(const CCfits::Table &table_hdu)
Reads the column units based on the TUNITn keyword.
std::vector< std::type_index > autoDetectColumnTypes(const CCfits::Table &table_hdu)
Reads the column types of the given table HDU.
std::vector< std::string > autoDetectColumnNames(std::istream &in, const std::string &comment, size_t columns_number)
Reads the column names of the given stream.