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