00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef INSERTDATA_H
00016 #define INSERTDATA_H
00017
00018 #include <string>
00019
00020 #include "Constants.h"
00021 #include "Converter.h"
00022 #include "FitsFile.h"
00023 #include "Logger.h"
00024 #include "MyException.h"
00025 #include "StringOps.h"
00026 #include "TableData.hxx"
00027 #include "TableInfo.h"
00028
00031 class InsertDataException : public MyException
00032 {
00033 public:
00034 InsertDataException(const std::string& aMsg)
00035 : MyException("InsertDataException: ", aMsg) { }
00036 };
00037
00043
00044 template<typename DataType>
00045 void insertExtNum(FitsFile& ff, TableInfo& info, TableData<DataType>& data)
00046 {
00047
00048 int colNo = info.getAttNo(ExpectNames::extNum);
00049
00050
00051
00052 if (colNo == TableInfo::ColNotFound) return;
00053
00054
00055 int row1 = 0;
00056
00057
00058 for (int hduNo = 2; hduNo <= ff.getNumHdus(); ++hduNo) {
00059
00060
00061 ff.movabsHdu(hduNo);
00062
00063 int row2 = 0;
00064
00065
00066
00067 if (ff.isImageHdu()) {
00068 row2 = row1 + 1;
00069 }
00070
00071
00072
00073 else if (ff.isBinaryTable()) {
00074 row2 = row1 + ff.getNumRows();
00075 }
00076
00077
00078
00079 else {
00080 row2 = 0;
00081 }
00082
00083
00084 for (int rowNo = row1; rowNo < row2; ++rowNo) {
00085 data.assign(colNo, rowNo, hduNo);
00086 }
00087
00088
00089 row1 = row2;
00090 }
00091 }
00092
00094 template<typename DataType>
00095 void insertKeywordValue(int colNo, int rowNo, FitsFile& ff,
00096 std::string keyword, TableData<DataType>& data)
00097 {
00098
00099 try
00100 {
00101 std::string keyValue;
00102 std::string filename = ff.getFileName();
00103 try
00104 {
00105 ff.readKey(keyword, keyValue);
00106 }
00107 catch (FitsKeyNotExist& e)
00108 {
00109 if (filename.find(PreSuffixNames::tileSuffix) != string::npos)
00110 {
00111 ff.movabsHdu(2);
00112 ff.readKey(keyword, keyValue);
00113 }
00114 }
00115
00116 if (keyValue.empty() || keyValue == "UNDEF")
00117 {
00118 data.setundef(colNo, rowNo);
00119 }
00120 else
00121 {
00122 data.assign(colNo, rowNo, keyValue);
00123 }
00124 }
00125 catch (FitsKeyNotExist& e)
00126 {
00127
00128
00129 Logger log;
00130 log.addWarning("FITS keyword missing: " + keyword +
00131 ". In HDU no. " + StringOps::NumToString(ff.getHduNum()));
00132 }
00133 }
00134
00137 template<typename DataType>
00138 void insertFitsPrimaryHeader(int rowNo, FitsFile& ff, TableInfo& info,
00139 TableData<DataType>& data)
00140 {
00141 ff.movabsHdu(1);
00142
00143
00144
00145 int numCols = info.getNumAttributes();
00146 for (int colNo = 0; colNo < numCols; ++colNo)
00147 {
00148
00149 std::string fullname = info.getFitsKeywordName(colNo);
00150 if (!fullname.empty())
00151 {
00152
00153 std::string reqHduType, keyword;
00154 StringOps::splitDoublet(fullname, reqHduType, keyword);
00155
00156
00157 if (reqHduType.length() == 0) {
00158 insertKeywordValue(colNo, rowNo, ff, keyword, data);
00159 }
00160 }
00161 }
00162 }
00163
00166 template<typename DataType>
00167 void insertFitsExtensionHeader(int rowNo, FitsFile& ff, TableInfo& info,
00168 TableData<DataType>& data)
00169 {
00170
00171 std::string hduType;
00172 if (ff.isImageHdu())
00173 hduType = "IMAGE";
00174 else if (ff.isBinaryTable())
00175 hduType = "BINTABLE";
00176 else
00177 throw InsertDataException("Was expecting IMAGE or BINARY extension");
00178
00179
00180
00181
00182 int numCols = info.getNumAttributes();
00183 for (int colNo = 0; colNo < numCols; ++colNo)
00184 {
00185
00186 std::string fullname = info.getFitsKeywordName(colNo);
00187 if (!fullname.empty())
00188 {
00189
00190 std::string reqHduType, keyword;
00191 StringOps::splitDoublet(fullname, reqHduType, keyword);
00192
00193 if (hduType == reqHduType) {
00194 insertKeywordValue(colNo, rowNo, ff, keyword, data);
00195 }
00196 }
00197 }
00198 }
00199
00202 template<typename DataType>
00203 void insertFitsColumns(int firstRow, FitsFile& ff, TableInfo& info,
00204 TableData<DataType>& data)
00205 {
00206 Logger log;
00207
00208
00209 int numSources = ff.getNumRows();
00210
00211
00212
00213 int numCols = info.getNumAttributes();
00214 for (int colNo = 0; colNo < numCols; ++colNo)
00215 {
00216
00217 std::string fcolName = info.getFitsColumnName(colNo);
00218 if (!fcolName.empty())
00219 {
00220
00221 try
00222 {
00223
00224 data.loadFitsColumn(ff, fcolName, colNo, firstRow);
00225
00226
00227 std::string givenUnits = ff.readColumnUnit(fcolName);
00228
00229
00230 std::string reqUnits = info.getUnits(colNo);
00231
00232
00233 Converter converter;
00234 double convFactor = converter.getFactor(givenUnits, reqUnits);
00235
00236
00237
00238
00239
00240 for (int rowNo = firstRow; rowNo < firstRow + numSources; ++rowNo)
00241 {
00242 Numeric val;
00243 data.value(colNo, rowNo, val);
00244
00245 val *= convFactor;
00246 data.assign(colNo, rowNo, val);
00247 }
00248 }
00249
00250 catch (FitsColNotFound& e)
00251 {
00252 for (int rowNo = firstRow; rowNo < firstRow + numSources; ++rowNo)
00253 {
00254 data.setundef(colNo, rowNo);
00255 }
00256 log.addWarning("Fits column: " + fcolName + " not found");
00257 }
00258 }
00259 }
00260 }
00261
00262 #endif
00263
00264
00265
00266