DataMethodFactory.hxx

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 //-----------------------------------------------------------------------------
00006 // CVS: $Revision: 7472 $, $Date: 2010-09-01 11:37:02 +0100 (Wed, 01 Sep 2010) $, $Author: NicholasCross $
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 #include "Options.h"
00021 #include "StringOps.h"
00022 
00023 // Data Methods
00024 #include "AxesLength.hxx"
00025 #include "Cartesian.hxx"
00026 #include "CurationTaskID.hxx"
00027 #include "DegToH.hxx"
00028 #include "FileName.hxx"
00029 #include "FileTimeStamp.hxx"
00030 #include "FilterID.hxx"
00031 #include "FrameID.hxx"
00032 #include "FrameType.hxx"
00033 #include "GalacticCoords.hxx"
00034 #include "HtmIndex.hxx"
00035 #include "JulianDayNum.hxx"
00036 #include "Magnitudes.hxx"
00037 #include "Moon.hxx"
00038 #include "NumDetectors.hxx"
00039 #include "ObjectID.hxx"
00040 #include "ProgrammeID.hxx"
00041 #include "QuantitiesByAst.hxx"
00042 #include "RaDecByAst.hxx"
00043 #include "HlRadCirc.hxx"
00044 #include "HlRadii.hxx"
00045 #include "SloanCoords.hxx"
00046 #include "SkySubScale.hxx"
00047 #include "TotalExpTime.hxx"
00048 #include "TelRunNum.hxx"
00049 #include "UtDate.hxx"
00050 #include "VersionNum.hxx"
00051 #include "VSAMagnitudes.hxx"
00052 #include "VSAProject.hxx"
00053 //-----------------------------------------------------------------------------
00055 class DataMethodFactoryException : public MyException
00056 {
00057 public:
00058   DataMethodFactoryException(const std::string& aMsg)
00059     : MyException("DataMethodFactoryException: ", aMsg) { }
00060 };
00061 //-----------------------------------------------------------------------------
00064 bool isMagnitudeError(const std::string& name)
00065 {
00066   return StringOps::hasSubstr(name, "Mag") &&
00067         (StringOps::hasSubstr(name, "Err") ||
00068          StringOps::hasSubstr(name, "err"));
00069 }
00070 //-----------------------------------------------------------------------------
00073 bool isMagnitude(const std::string& name)
00074 {
00075   // If name has substring "Mag" but not "Err"
00076   return StringOps::hasSubstr(name, "Mag") && !isMagnitudeError(name) 
00077     && !StringOps::hasSubstr(name, "NoAperCorr");
00078 }
00079 //-----------------------------------------------------------------------------
00082 bool isAperMag(const std::string& name)
00083 {
00084   // If name has substring "Aper" but not "NoAperCorr"
00085   return StringOps::hasSubstr(name, "aperMag") && !isMagnitudeError(name)
00086     && !StringOps::hasSubstr(name, "NoAperCorr");
00087 }
00088 //-----------------------------------------------------------------------------
00090 bool isWcsQuantity(const std::string& name)
00091 {
00092   return
00093     name == ExpectNames::centralRa ||
00094     name == ExpectNames::centralDec ||
00095     name == ExpectNames::minRa ||
00096     name == ExpectNames::minDec ||
00097     name == ExpectNames::maxRa ||
00098     name == ExpectNames::maxDec ||
00099     name == ExpectNames::imageExtent;
00100 }
00101 //-----------------------------------------------------------------------------
00102 //-----------------------------------------------------------------------------
00105 std::map<int, StringMap> makeTargetList(TableInfo& info)
00106 {
00107   using std::map;
00108   Options options;
00109 
00110   int numTargets = 0;
00111   map<int, StringMap> target;
00112 
00113   for (unsigned n = 0; n < info.getNumAttributes(); ++n)
00114   {
00115     std::string name = info.getName(n);
00116 
00117     bool hasFits = !info.getFitsKeywordName(n).empty() ||
00118                    !info.getFitsColumnName(n).empty();
00119 
00120     if (!info.getUsingValue(n).empty() || !hasFits)
00121     {
00122       // Special case for axis length
00123       if (name == ExpectNames::numAxes) {
00124           target[numTargets][0] = ExpectNames::numAxes;
00125           target[numTargets][1] = ExpectNames::axis1Length;
00126           target[numTargets][2] = ExpectNames::axis2Length;
00127           ++numTargets;
00128       }
00129 
00130       // Special case for Cartesian vectors
00131       else if (name == ExpectNames::cx) {
00132         target[numTargets][0] = ExpectNames::cx;
00133         target[numTargets][1] = ExpectNames::cy;
00134         target[numTargets][2] = ExpectNames::cz;
00135         ++numTargets;
00136       }
00137 
00138       // Special case for WCS quantities
00139       else if (name == ExpectNames::centralRa) {
00140         target[numTargets][0] = ExpectNames::centralRa;
00141         target[numTargets][1] = ExpectNames::centralDec;
00142         target[numTargets][2] = ExpectNames::posAngle;
00143         target[numTargets][3] = ExpectNames::imageExtent;
00144         target[numTargets][4] = ExpectNames::xPixSize;
00145         target[numTargets][5] = ExpectNames::yPixSize;
00146         target[numTargets][6] = ExpectNames::minRa;
00147         target[numTargets][7] = ExpectNames::minDec;
00148         target[numTargets][8] = ExpectNames::maxRa;
00149         target[numTargets][9] = ExpectNames::maxDec;
00150         ++numTargets;
00151       }
00152 
00153       // Special case for (ra, dec) from WCS
00154       else if (name == ExpectNames::ra) {
00155         target[numTargets][0] = ExpectNames::ra;
00156         target[numTargets][1] = ExpectNames::dec;
00157         ++numTargets;
00158       }
00159 
00160       // Special case for galactic (l, b)
00161       else if (name == ExpectNames::l) {
00162         target[numTargets][0] = ExpectNames::l;
00163         target[numTargets][1] = ExpectNames::b;
00164         ++numTargets;
00165       }
00166 
00167       // Special case for Sloan (lambda, theta)
00168       else if (name == ExpectNames::lambda) {
00169         target[numTargets][0] = ExpectNames::lambda;
00170         target[numTargets][1] = ExpectNames::eta;
00171         ++numTargets;
00172       }
00173 
00174       // Special case for the Moon
00175       else if (name == ExpectNames::raMoon) {
00176         target[numTargets][0] = ExpectNames::raMoon;
00177         target[numTargets][1] = ExpectNames::decMoon;
00178         target[numTargets][2] = ExpectNames::illumMoon;
00179         target[numTargets][3] = ExpectNames::raMoonTopo;
00180         target[numTargets][4] = ExpectNames::decMoonTopo;
00181         ++numTargets;
00182       }
00183       // Special case for the circular half-light radius
00184       else if (name == ExpectNames::hlCircRadAs) {
00185         target[numTargets][0] = ExpectNames::hlCircRadAs;
00186         target[numTargets][1] = ExpectNames::hlCircRadErrAs;
00187         ++numTargets;
00188       }
00189       // Special case for the half-light radii
00190       else if (name == ExpectNames::hlGeoRadAs) {
00191         target[numTargets][0] = ExpectNames::hlGeoRadAs;
00192         target[numTargets][1] = ExpectNames::hlSMnRadAs;
00193         target[numTargets][2] = ExpectNames::hlSMjRadAs;
00194         target[numTargets][3] = ExpectNames::hlCorSMnRadAs;
00195         target[numTargets][4] = ExpectNames::hlCorSMjRadAs;
00196         ++numTargets;
00197       }
00198       // Special case for VSA Magnitudes and deltaMags
00199       else if (StringOps::ToLower(options.getArchive()) == "vsa" && 
00200                isMagnitude(name)) {
00201         target[numTargets][0] = name;
00202         target[numTargets][1] = ExpectNames::deltaMag;
00203         target[numTargets][2] = ExpectNames::illumCorr;
00204         target[numTargets][3] = ExpectNames::distortCorr;
00205         target[numTargets][4] = ExpectNames::saturatCorr;
00206         if (isAperMag(name) && 
00207             atoi(name.substr(name.rfind("Mag")+3).c_str()) < 8)
00208         {
00209           target[numTargets][5] = name.insert(name.rfind("Mag")+3,"NoAperCorr");
00210         } else {
00211           target[numTargets][5] = name;
00212         }
00213         ++numTargets;
00214       }
00215 
00216       // All other single value targets
00217       else {
00218         if (name != ExpectNames::illumCorr 
00219             && name != ExpectNames::distortCorr
00220             && name != ExpectNames::saturatCorr
00221             && !StringOps::hasSubstr(name, "NoAperCorr"))
00222         {
00223           target[numTargets][0] = name;
00224           ++numTargets;
00225         }
00226       }
00227     } // end if hasQ
00228   } // end loop through each attribute
00229 
00230   return target;
00231 } // makeTargetList
00232 //-----------------------------------------------------------------------------
00235 bool isFrameID(const std::string& name)
00236 {
00237   return (name == ExpectNames::multiframeID ||
00238           name == ExpectNames::combiframeID ||
00239           name == ExpectNames::darkID ||
00240           name == ExpectNames::flatID ||
00241           name == ExpectNames::confID ||
00242           name == ExpectNames::frinID ||
00243           name == ExpectNames::skyID ||
00244           name == ExpectNames::maskID ||
00245           name == ExpectNames::diffimID ||
00246           name == ExpectNames::stackID ||
00247           name == ExpectNames::mosaicID);
00248 }
00249 //-----------------------------------------------------------------------------
00252 template<typename DataType>
00253 DataMethod<DataType>* getFrameIDMethod(const std::string& name,
00254                                        TableInfo& info,
00255                                        FitsFile& ff)
00256 {
00257   if (!info.getUsingValue(info.getAttNo(name)).empty())
00258   {
00259     std::string filename = ff.getFileName();
00260     std::string filePath = filename.substr(0,filename.rfind("/")+1);
00261     return new IndirectFrameID<DataType>(filePath);
00262   }
00263   else
00264   {
00265     return new DirectFrameID<DataType>(ff);
00266   }
00267 }
00268 //-----------------------------------------------------------------------------
00271 template<typename DataType>
00272 DataMethod<DataType>* getMethod(StringMap& target, TableInfo& info,
00273                                 IllumTable& illum, 
00274                                 FitsFile& fpix, FitsFile& fcat)
00275 {
00276   Options options;
00277   int numArgs = target.size();
00278 
00279   if (numArgs == 1)
00280   {
00281     std::string name = target[0];
00282 
00283     // Select method to calculate the frame ID. This needs some
00284     // special consideration as to how the method is selected, so
00285     // delegate this to separately implemented function
00286     
00287     if (isFrameID(name))
00288     {
00289       return getFrameIDMethod<DataType>(name, info, fpix);
00290     }
00291     else if (name == ExpectNames::skySubScale)
00292     {
00293       return new SkySubScale<DataType>();
00294     }
00295     else if (name == ExpectNames::cuEventID)
00296     {
00297       return new CurationTaskID<DataType>();
00298     }
00299     else if (name == ExpectNames::ukirtRunNo)
00300     {
00301       return new TelRunNum<DataType>(fpix);
00302     }
00303     else if (name == ExpectNames::vistaRunNo)
00304     {
00305       return new TelRunNum<DataType>(fpix);
00306     }
00307     else if (name == ExpectNames::fileTimeStamp)
00308     {
00309       return new FileTimeStamp<DataType>(fpix);
00310     }
00311     else if (name == ExpectNames::programmeID)
00312     {
00313       return new ProgrammeID<DataType>();
00314     }
00315     else if (name == ExpectNames::numDetectors)
00316     {
00317       return new NumDetectors<DataType>(fpix);
00318     }
00319     else if (name == ExpectNames::fileName)
00320     {
00321       return new FileName<DataType>(fpix);
00322     }
00323     else if (name == ExpectNames::catName)
00324     {
00325       return new FileName<DataType>(fcat);
00326     }
00327     else if (name == ExpectNames::versionNum)
00328     {
00329       return new VersionNum<DataType>(fpix);
00330     }
00331     else if (name == ExpectNames::filterID)
00332     {
00333       if (info.isTableNumeric())
00334         return new FilterIDByFits<DataType>(fpix);
00335       else
00336         return new FilterID<DataType>();
00337     }
00338     else if (name == ExpectNames::project && 
00339              StringOps::ToLower(options.getArchive()) == "vsa")
00340     {
00341       return new VSAProject<DataType>(fpix);
00342     }
00343     else if (name == ExpectNames::utDate && 
00344              StringOps::ToLower(options.getArchive()) == "vsa")
00345     {
00346       return new UtDate<DataType>();
00347     }
00348     else if (name == ExpectNames::raBase && 
00349              StringOps::ToLower(options.getArchive()) == "vsa")
00350     {
00351       return new DegToH<DataType>();
00352     }
00353     else if (name == ExpectNames::julianDayNum)
00354     {
00355       return new JulianDayNum<DataType>();
00356     }
00357     else if (name == ExpectNames::frameType)
00358     {
00359       return new FrameType<DataType>(fpix);
00360     }
00361     else if (StringOps::ToLower(options.getArchive()) == "wsa" &&
00362              isMagnitude(name))
00363     {
00364       return new CalibratedMagnitude<DataType>(fcat, illum);
00365     }
00366     else if (isMagnitudeError(name))
00367     {
00368       return new MagnitudeError<DataType>();
00369     }
00370     else if (name == ExpectNames::totalExpTime)
00371     {
00372       return new TotalExpTime<DataType>(fpix);
00373     }
00374     else if (name == ExpectNames::htmID)
00375     {
00376       return new HtmIndex<DataType>
00377                  (
00378                    atoi(info.readTag(info.getAttNo(name),
00379                                      TagNames::HTMLEVEL).c_str()
00380                        )
00381                  );
00382     }
00383     else if (name == ExpectNames::objectId)
00384     {
00385       return new ObjectID<DataType>();
00386     }
00387     else
00388     {
00389       return new NothingToDo<DataType>();
00390     }
00391   } // end if numArgs == 1
00392   else if (numArgs == 2)
00393   {
00394     std::string name1 = target[0];
00395     std::string name2 = target[1];
00396 
00397     if (name1 == ExpectNames::l && name2 == ExpectNames::b)
00398     {
00399       return new GalacticCoords<DataType>();
00400     }
00401     else if (name1 == ExpectNames::lambda && name2 == ExpectNames::eta)
00402     {
00403       return new SloanCoords<DataType>();
00404     }
00405     else if (name1 == ExpectNames::ra  &&
00406              name2 == ExpectNames::dec &&
00407              !info.getUsingValue(info.getAttNo(name1)).empty())
00408     {
00409       return new RaDecByAst<DataType>(fcat);
00410     }
00411     else if (name1 == ExpectNames::hlCircRadAs && 
00412              name2 == ExpectNames::hlCircRadErrAs)
00413     {
00414       return new HlRadCirc<DataType>(fcat,fpix);
00415     }
00416     else
00417     {
00418       return new NothingToDo<DataType>();
00419     }
00420   } // end if numArgs == 2
00421   else if (numArgs == 3)
00422   {
00423     std::string name1 = target[0];
00424     std::string name2 = target[1];
00425     std::string name3 = target[2];
00426 
00427     // Case where cartesian calculation is required
00428     if (name1 == ExpectNames::cx &&
00429         name2 == ExpectNames::cy &&
00430         name3 == ExpectNames::cz)
00431     {
00432       return new Cartesian<DataType>();
00433     }
00434     else if (name1 == ExpectNames::numAxes     &&
00435              name2 == ExpectNames::axis1Length &&
00436              name3 == ExpectNames::axis2Length)
00437     {
00438       return new AxesLength<DataType>(fpix);
00439     }
00440     else
00441     {
00442       return new NothingToDo<DataType>();
00443     }
00444   } // end if numArgs == 3
00445   else if (numArgs == 5)
00446   {
00447     std::string name1 = target[0];
00448     std::string name2 = target[1];
00449     std::string name3 = target[2];
00450     std::string name4 = target[3];
00451     std::string name5 = target[4];
00452     
00453     if (name1 == ExpectNames::raMoon  &&
00454         name2 == ExpectNames::decMoon &&
00455         name3 == ExpectNames::illumMoon &&
00456         name4 == ExpectNames::raMoonTopo &&
00457         name5 == ExpectNames::decMoonTopo)
00458     {
00459       return new Moon<DataType>();
00460     }
00461     else if (name1 == ExpectNames::hlGeoRadAs &&
00462              name2 == ExpectNames::hlSMnRadAs &&
00463              name3 == ExpectNames::hlSMjRadAs &&
00464              name4 == ExpectNames::hlCorSMnRadAs &&
00465              name5 == ExpectNames::hlCorSMjRadAs)
00466     {
00467       return new HlRadii<DataType>(fcat,fpix);
00468     }
00469     else
00470     {
00471       return new NothingToDo<DataType>();
00472     }
00473   } // end if numArgs == 5
00474   else if (numArgs == 6)
00475   {
00476     std::string name1 = target[0];
00477     std::string name2 = target[1];
00478     std::string name3 = target[2];
00479     std::string name4 = target[3];
00480     std::string name5 = target[4];
00481     std::string name6 = target[5];
00482 
00483     if (StringOps::ToLower(options.getArchive()) == "vsa" &&
00484         name1 != ExpectNames::deltaMag && isMagnitude(name1) && 
00485         name2 == ExpectNames::deltaMag &&
00486         name3 == ExpectNames::illumCorr &&
00487         name4 == ExpectNames::distortCorr &&
00488         name5 == ExpectNames::saturatCorr)
00489     {
00490       return new CalibratedVSAMagnitude<DataType>(fcat, illum, name1);
00491     }
00492     else
00493     {
00494       return new NothingToDo<DataType>();
00495     }
00496   } // end if numArgs == 6
00497   else if (numArgs == 10)
00498   {
00499     std::string name1 = target[0];
00500     std::string name2 = target[1];
00501     std::string name3 = target[2];
00502     std::string name4 = target[3];
00503     std::string name5 = target[4];
00504     std::string name6 = target[5];
00505     std::string name7 = target[6];
00506     std::string name8 = target[7];
00507     std::string name9 = target[8];
00508     std::string name10 = target[9];
00509 
00510     // WCS quantities
00511     if (name1 == ExpectNames::centralRa &&
00512         name2 == ExpectNames::centralDec &&
00513         name3 == ExpectNames::posAngle &&
00514         name4 == ExpectNames::imageExtent &&
00515         name5 == ExpectNames::xPixSize &&
00516         name6 == ExpectNames::yPixSize &&
00517         name7 == ExpectNames::minRa &&
00518         name8 == ExpectNames::minDec &&
00519         name9 == ExpectNames::maxRa &&
00520         name10 == ExpectNames::maxDec)
00521     {
00522       return new QuantitiesByAst<DataType>(fpix);
00523     }
00524     else
00525     {
00526       return new NothingToDo<DataType>();
00527     }
00528   } // end if numArgs == 10
00529   else
00530   {
00531     return new NothingToDo<DataType>();
00532   }
00533 }
00534 //-----------------------------------------------------------------------------
00535 #endif
00536 //-----------------------------------------------------------------------------
00537 // Change log:
00538 //
00539 // 27-May-2004,  IAB: Original version.
00540 // 16-Mar-2006,  RSC: Made function checkArguments() in DataMethodFactory.hxx a
00541 //                    method of DataMethod called determineSourceAndTarget()
00542 //  7-Apr-2008, ETWS: Upgraded to use new detection table layout.
00543 // 17-Apr-2008, ETWS: Included illumination correction.
Generated on Mon Oct 4 10:38:34 2010 for WfcamSrc by  doxygen 1.6.3