DataMethodFactory.hxx
Go to the documentation of this file.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 #include "Options.h"
00021 #include "StringOps.h"
00022
00023
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
00076 return StringOps::hasSubstr(name, "Mag") && !isMagnitudeError(name)
00077 && !StringOps::hasSubstr(name, "NoAperCorr");
00078 }
00079
00082 bool isAperMag(const std::string& name)
00083 {
00084
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
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
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
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
00154 else if (name == ExpectNames::ra) {
00155 target[numTargets][0] = ExpectNames::ra;
00156 target[numTargets][1] = ExpectNames::dec;
00157 ++numTargets;
00158 }
00159
00160
00161 else if (name == ExpectNames::l) {
00162 target[numTargets][0] = ExpectNames::l;
00163 target[numTargets][1] = ExpectNames::b;
00164 ++numTargets;
00165 }
00166
00167
00168 else if (name == ExpectNames::lambda) {
00169 target[numTargets][0] = ExpectNames::lambda;
00170 target[numTargets][1] = ExpectNames::eta;
00171 ++numTargets;
00172 }
00173
00174
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
00184 else if (name == ExpectNames::hlCircRadAs) {
00185 target[numTargets][0] = ExpectNames::hlCircRadAs;
00186 target[numTargets][1] = ExpectNames::hlCircRadErrAs;
00187 ++numTargets;
00188 }
00189
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
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
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 }
00228 }
00229
00230 return target;
00231 }
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
00284
00285
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 }
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 }
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
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 }
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 }
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 }
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
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 }
00529 else
00530 {
00531 return new NothingToDo<DataType>();
00532 }
00533 }
00534
00535 #endif
00536
00537
00538
00539
00540
00541
00542
00543