00001
00002
00003
00004
00005
00006
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
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
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
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
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
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
00139 if (name == ExpectNames::ra) {
00140 target[numTargets][0] = ExpectNames::ra;
00141 target[numTargets][1] = ExpectNames::dec;
00142 ++numTargets;
00143 }
00144
00145
00146 if (name == ExpectNames::l) {
00147 target[numTargets][0] = ExpectNames::l;
00148 target[numTargets][1] = ExpectNames::b;
00149 ++numTargets;
00150 }
00151
00152
00153 if (name == ExpectNames::lambda) {
00154 target[numTargets][0] = ExpectNames::lambda;
00155 target[numTargets][1] = ExpectNames::eta;
00156 ++numTargets;
00157 }
00158
00159
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
00170 else {
00171 target[numTargets][0] = name;
00172 ++numTargets;
00173 }
00174 }
00175 }
00176
00177 return target;
00178 }
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
00230
00231
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 }
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 }
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
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
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
00426
00427
00428
00429
00430
00431