DataMethodFactory.hxx

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 //-----------------------------------------------------------------------------
00006 // CVS: $Revision: 4708 $, $Date: 2008-04-17 19:45:30 +0100 (Thu, 17 Apr 2008) $, $Author: EckhardSutorius $
00007 //-----------------------------------------------------------------------------
00008 #ifndef DMFACTORY_H
00009 #define DMFACTORY_H
00010 
00011 #include <cstdlib>
00012 #include <map>
00013 #include <string>
00014 
00015 #include "Constants.h"
00016 #include "FitsFile.h"
00017 #include "MyException.h"
00018 #include "TableInfo.h"
00019 #include "IllumTable.hxx"
00020 
00021 // Data Methods
00022 #include "AxesLength.hxx"
00023 #include "Cartesian.hxx"
00024 #include "CurationTaskID.hxx"
00025 #include "FileName.hxx"
00026 #include "FileTimeStamp.hxx"
00027 #include "FilterID.hxx"
00028 #include "FrameID.hxx"
00029 #include "FrameType.hxx"
00030 #include "GalacticCoords.hxx"
00031 #include "HtmIndex.hxx"
00032 #include "JulianDayNum.hxx"
00033 #include "Magnitudes.hxx"
00034 #include "Moon.hxx"
00035 #include "NumDetectors.hxx"
00036 #include "ObjectID.hxx"
00037 #include "ProgrammeID.hxx"
00038 #include "QuantitiesByAst.hxx"
00039 #include "RaDecByAst.hxx"
00040 #include "SloanCoords.hxx"
00041 #include "SkySubScale.hxx"
00042 #include "TotalExpTime.hxx"
00043 #include "UkirtRunNum.hxx"
00044 #include "VersionNum.hxx"
00045 //-----------------------------------------------------------------------------
00047 class DataMethodFactoryException : public MyException
00048 {
00049 public:
00050   DataMethodFactoryException(const std::string& aMsg)
00051     : MyException("DataMethodFactoryException: ", aMsg) { }
00052 };
00053 //-----------------------------------------------------------------------------
00055 bool hasSubstr(const std::string& name, const std::string& substr)
00056 {
00057   return name.find(substr, 0) != std::string::npos;
00058 }
00059 //-----------------------------------------------------------------------------
00062 bool isMagnitudeError(const std::string& name)
00063 {
00064   return hasSubstr(name, "Mag") &&
00065         (hasSubstr(name, "Err") || hasSubstr(name, "err"));
00066 }
00067 //-----------------------------------------------------------------------------
00070 bool isMagnitude(const std::string& name)
00071 {
00072   // If name has substring "Mag" but not "Err"
00073   return hasSubstr(name, "Mag") && !isMagnitudeError(name);
00074 }
00075 //-----------------------------------------------------------------------------
00077 bool isWcsQuantity(const std::string& name)
00078 {
00079   return
00080     name == ExpectNames::centralRa ||
00081     name == ExpectNames::centralDec ||
00082     name == ExpectNames::minRa ||
00083     name == ExpectNames::minDec ||
00084     name == ExpectNames::maxRa ||
00085     name == ExpectNames::maxDec ||
00086     name == ExpectNames::imageExtent;
00087 }
00088 //-----------------------------------------------------------------------------
00091 std::map<int, StringMap> makeTargetList(TableInfo& info)
00092 {
00093   using std::map;
00094 
00095   int numTargets = 0;
00096   map<int, StringMap> target;
00097 
00098   for (unsigned n = 0; n < info.getNumAttributes(); ++n)
00099   {
00100     std::string name = info.getName(n);
00101 
00102     bool hasFits = !info.getFitsKeywordName(n).empty() ||
00103                    !info.getFitsColumnName(n).empty();
00104 
00105     if (!info.getUsingValue(n).empty() || !hasFits)
00106     {
00107       // Special case for axis length
00108       if (name == ExpectNames::numAxes) {
00109           target[numTargets][0] = ExpectNames::numAxes;
00110           target[numTargets][1] = ExpectNames::axis1Length;
00111           target[numTargets][2] = ExpectNames::axis2Length;
00112           ++numTargets;
00113       }
00114 
00115       // Special case for Cartesian vectors
00116       if (name == ExpectNames::cx) {
00117         target[numTargets][0] = ExpectNames::cx;
00118         target[numTargets][1] = ExpectNames::cy;
00119         target[numTargets][2] = ExpectNames::cz;
00120         ++numTargets;
00121       }
00122 
00123       // Special case for WCS quantities
00124       else if (name == ExpectNames::centralRa) {
00125         target[numTargets][0] = ExpectNames::centralRa;
00126         target[numTargets][1] = ExpectNames::centralDec;
00127         target[numTargets][2] = ExpectNames::posAngle;
00128         target[numTargets][3] = ExpectNames::imageExtent;
00129         target[numTargets][4] = ExpectNames::xPixSize;
00130         target[numTargets][5] = ExpectNames::yPixSize;
00131         target[numTargets][6] = ExpectNames::minRa;
00132         target[numTargets][7] = ExpectNames::minDec;
00133         target[numTargets][8] = ExpectNames::maxRa;
00134         target[numTargets][9] = ExpectNames::maxDec;
00135         ++numTargets;
00136       }
00137 
00138       // Special case for (ra, dec) from WCS
00139       if (name == ExpectNames::ra) {
00140         target[numTargets][0] = ExpectNames::ra;
00141         target[numTargets][1] = ExpectNames::dec;
00142         ++numTargets;
00143       }
00144 
00145       // Special case for galactic (l, b)
00146       if (name == ExpectNames::l) {
00147         target[numTargets][0] = ExpectNames::l;
00148         target[numTargets][1] = ExpectNames::b;
00149         ++numTargets;
00150       }
00151 
00152       // Special case for Sloan (lambda, theta)
00153       if (name == ExpectNames::lambda) {
00154         target[numTargets][0] = ExpectNames::lambda;
00155         target[numTargets][1] = ExpectNames::eta;
00156         ++numTargets;
00157       }
00158 
00159       // Special case for the Moon
00160       if (name == ExpectNames::raMoon) {
00161         target[numTargets][0] = ExpectNames::raMoon;
00162         target[numTargets][1] = ExpectNames::decMoon;
00163         target[numTargets][2] = ExpectNames::illumMoon;
00164         target[numTargets][3] = ExpectNames::raMoonTopo;
00165         target[numTargets][4] = ExpectNames::decMoonTopo;
00166         ++numTargets;
00167       }
00168 
00169       // All other single value targets
00170       else {
00171         target[numTargets][0] = name;
00172         ++numTargets;
00173       }
00174     } // end if hasQ
00175   } // end loop through each attribute
00176 
00177   return target;
00178 } // makeTargetList
00179 //-----------------------------------------------------------------------------
00182 bool isFrameID(const std::string& name)
00183 {
00184   return (name == ExpectNames::multiframeID ||
00185           name == ExpectNames::combiframeID ||
00186           name == ExpectNames::darkID ||
00187           name == ExpectNames::flatID ||
00188           name == ExpectNames::confID ||
00189           name == ExpectNames::frinID ||
00190           name == ExpectNames::skyID ||
00191           name == ExpectNames::maskID ||
00192           name == ExpectNames::diffimID ||
00193           name == ExpectNames::stackID ||
00194           name == ExpectNames::mosaicID);
00195 }
00196 //-----------------------------------------------------------------------------
00199 template<typename DataType>
00200 DataMethod<DataType>* getFrameIDMethod(const std::string& name,
00201                                        TableInfo& info,
00202                                        FitsFile& ff)
00203 {
00204   if (!info.getUsingValue(info.getAttNo(name)).empty())
00205   {
00206     std::string filename = ff.getFileName();
00207     std::string filePath = filename.substr(0,filename.rfind("/")+1);
00208     return new IndirectFrameID<DataType>(filePath);
00209   }
00210   else
00211   {
00212     return new DirectFrameID<DataType>(ff);
00213   }
00214 }
00215 //-----------------------------------------------------------------------------
00218 template<typename DataType>
00219 DataMethod<DataType>* getMethod(StringMap& target, TableInfo& info,
00220                                 IllumTable& illum, 
00221                                 FitsFile& fpix, FitsFile& fcat)
00222 {
00223   int numArgs = target.size();
00224 
00225   if (numArgs == 1)
00226   {
00227     std::string name = target[0];
00228 
00229     // Select method to calculate the frame ID. This needs some
00230     // special consideration as to how the method is selected, so
00231     // delegate this to separately implemented function
00232     if (isFrameID(name))
00233     {
00234       return getFrameIDMethod<DataType>(name, info, fpix);
00235     }
00236     else if (name == ExpectNames::skySubScale)
00237     {
00238       return new SkySubScale<DataType>();
00239     }
00240     else if (name == ExpectNames::cuEventID)
00241     {
00242       return new CurationTaskID<DataType>();
00243     }
00244     else if (name == ExpectNames::ukirtRunNo)
00245     {
00246       return new UkirtRunNum<DataType>(fpix);
00247     }
00248     else if (name == ExpectNames::fileTimeStamp)
00249     {
00250       return new FileTimeStamp<DataType>(fpix);
00251     }
00252     else if (name == ExpectNames::programmeID)
00253     {
00254       return new ProgrammeID<DataType>();
00255     }
00256     else if (name == ExpectNames::numDetectors)
00257     {
00258       return new NumDetectors<DataType>(fpix);
00259     }
00260     else if (name == ExpectNames::fileName)
00261     {
00262       return new FileName<DataType>(fpix);
00263     }
00264     else if (name == ExpectNames::catName)
00265     {
00266       return new FileName<DataType>(fcat);
00267     }
00268     else if (name == ExpectNames::versionNum)
00269     {
00270       return new VersionNum<DataType>(fpix);
00271     }
00272     else if (name == ExpectNames::filterID)
00273     {
00274       if (info.isTableNumeric())
00275         return new FilterIDByFits<DataType>(fpix);
00276       else
00277         return new FilterID<DataType>();
00278     }
00279     else if (name == ExpectNames::julianDayNum)
00280     {
00281       return new JulianDayNum<DataType>();
00282     }
00283     else if (name == ExpectNames::frameType)
00284     {
00285       return new FrameType<DataType>(fpix);
00286     }
00287     else if (isMagnitude(name))
00288     {
00289       return new CalibratedMagnitude<DataType>(fcat, illum);
00290     }
00291     else if (isMagnitudeError(name))
00292     {
00293       return new MagnitudeError<DataType>();
00294     }
00295     else if (name == ExpectNames::totalExpTime)
00296     {
00297       return new TotalExpTime<DataType>(fpix);
00298     }
00299     else if (name == ExpectNames::htmID)
00300     {
00301       return new HtmIndex<DataType>
00302                  (
00303                    atoi(info.readTag(info.getAttNo(name),
00304                                      TagNames::HTMLEVEL).c_str()
00305                        )
00306                  );
00307     }
00308     else if (name == ExpectNames::objectId)
00309     {
00310       return new ObjectID<DataType>();
00311     }
00312     else
00313     {
00314       return new NothingToDo<DataType>();
00315     }
00316   } // end if numArgs == 1
00317   else if (numArgs == 2)
00318   {
00319     std::string name1 = target[0];
00320     std::string name2 = target[1];
00321 
00322     if (name1 == ExpectNames::l && name2 == ExpectNames::b)
00323     {
00324       return new GalacticCoords<DataType>();
00325     }
00326     else if (name1 == ExpectNames::lambda && name2 == ExpectNames::eta)
00327     {
00328       return new SloanCoords<DataType>();
00329     }
00330     else if (name1 == ExpectNames::ra  &&
00331              name2 == ExpectNames::dec &&
00332              !info.getUsingValue(info.getAttNo(name1)).empty())
00333     {
00334       return new RaDecByAst<DataType>(fcat);
00335     }
00336     else
00337     {
00338       return new NothingToDo<DataType>();
00339     }
00340   } // end if numArgs == 2
00341   else if (numArgs == 3)
00342   {
00343     std::string name1 = target[0];
00344     std::string name2 = target[1];
00345     std::string name3 = target[2];
00346 
00347     // Case where cartesian calculation is required
00348     if (name1 == ExpectNames::cx &&
00349         name2 == ExpectNames::cy &&
00350         name3 == ExpectNames::cz)
00351     {
00352       return new Cartesian<DataType>();
00353     }
00354     else if (name1 == ExpectNames::numAxes     &&
00355              name2 == ExpectNames::axis1Length &&
00356              name3 == ExpectNames::axis2Length)
00357     {
00358       return new AxesLength<DataType>(fpix);
00359     }
00360     else
00361     {
00362       return new NothingToDo<DataType>();
00363     }
00364   }
00365   else if (numArgs == 5)
00366   {
00367     std::string name1 = target[0];
00368     std::string name2 = target[1];
00369     std::string name3 = target[2];
00370     std::string name4 = target[3];
00371     std::string name5 = target[4];
00372     if (name1 == ExpectNames::raMoon  &&
00373         name2 == ExpectNames::decMoon &&
00374         name3 == ExpectNames::illumMoon &&
00375         name4 == ExpectNames::raMoonTopo &&
00376         name5 == ExpectNames::decMoonTopo)
00377     {
00378       return new Moon<DataType>();
00379     }
00380     else
00381     {
00382       return new NothingToDo<DataType>();
00383     }
00384   }
00385   else if (numArgs == 10)
00386   {
00387     std::string name1 = target[0];
00388     std::string name2 = target[1];
00389     std::string name3 = target[2];
00390     std::string name4 = target[3];
00391     std::string name5 = target[4];
00392     std::string name6 = target[5];
00393     std::string name7 = target[6];
00394     std::string name8 = target[7];
00395     std::string name9 = target[8];
00396     std::string name10 = target[9];
00397 
00398     // WCS quantities
00399     if (name1 == ExpectNames::centralRa &&
00400         name2 == ExpectNames::centralDec &&
00401         name3 == ExpectNames::posAngle &&
00402         name4 == ExpectNames::imageExtent &&
00403         name5 == ExpectNames::xPixSize &&
00404         name6 == ExpectNames::yPixSize &&
00405         name7 == ExpectNames::minRa &&
00406         name8 == ExpectNames::minDec &&
00407         name9 == ExpectNames::maxRa &&
00408         name10 == ExpectNames::maxDec)
00409     {
00410       return new QuantitiesByAst<DataType>(fpix);
00411     }
00412     else
00413     {
00414       return new NothingToDo<DataType>();
00415     }
00416   }
00417   else
00418   {
00419     return new NothingToDo<DataType>();
00420   }
00421 }
00422 //-----------------------------------------------------------------------------
00423 #endif
00424 //-----------------------------------------------------------------------------
00425 // Change log:
00426 //
00427 // 27-May-2004,  IAB: Original version.
00428 // 16-Mar-2006,  RSC: Made function checkArguments() in DataMethodFactory.hxx a
00429 //                    method of DataMethod called determineSourceAndTarget()
00430 //  7-Apr-2008, ETWS: Upgraded to use new detection table layout.
00431 // 17-Apr-2008, ETWS: Included illumination correction.

Generated on Thu Apr 2 21:52:16 2009 for WfcamSrc by  doxygen 1.5.2