|
Isis 3.0 Object Programmers' Reference |
Home |
00001 #include "ObservationNumber.h" 00002 #include "IException.h" 00003 #include "Pvl.h" 00004 #include "Cube.h" 00005 #include "Process.h" 00006 #include "PvlTranslationManager.h" 00007 #include "FileName.h" 00008 00009 namespace Isis { 00013 ObservationNumber::ObservationNumber() {} 00014 00018 ObservationNumber::~ObservationNumber() {} 00019 00025 QString ObservationNumber::Compose(Pvl &label, bool def2filename) { 00026 QString sn; 00027 try { 00028 PvlGroup snGroup = FindObservationTranslation(label); 00029 sn = CreateSerialNumber(snGroup, (int)snGroup["ObservationKeys"]); 00030 } 00031 catch(IException &e) { 00032 if(def2filename) { 00033 // Try to return the filename if it exists in the label, otherwise use 00034 // "Unknown" as a last resort. 00035 QString snTemp = label.FileName(); 00036 if(!snTemp.isEmpty()) { 00037 sn = FileName(snTemp).name(); 00038 } 00039 else { 00040 sn = "Unknown"; 00041 } 00042 } 00043 else { 00044 sn = "Unknown"; 00045 } 00046 } 00047 00048 return sn; 00049 } 00050 00056 QString ObservationNumber::Compose(Cube &cube, bool def2filename) { 00057 return Compose(*cube.label(), def2filename); 00058 } 00059 00065 QString ObservationNumber::Compose(const QString &filename, bool def2filename) { 00066 Pvl p(filename); 00067 return Compose(p, def2filename); 00068 } 00069 00075 PvlGroup ObservationNumber::FindObservationTranslation(Pvl &label) { 00076 Pvl outLabel; 00077 static PvlGroup dataDir(Preference::Preferences().FindGroup("DataDirectory")); 00078 00079 // Get the mission name 00080 static QString missionTransFile = (QString) dataDir["base"] + "/translations/MissionName2DataDir.trn"; 00081 static PvlTranslationManager missionXlater(missionTransFile); 00082 missionXlater.SetLabel(label); 00083 QString mission = missionXlater.Translate("MissionName"); 00084 00085 // Get the instrument name 00086 static QString instTransFile = (QString) dataDir["base"] + "/translations/Instruments.trn"; 00087 static PvlTranslationManager instrumentXlater(instTransFile); 00088 instrumentXlater.SetLabel(label); 00089 QString instrument = instrumentXlater.Translate("InstrumentName"); 00090 00091 // We want to use this instrument's translation manager. It's much faster for 00092 // ObservationNumberList if we keep the translation manager in memory, so re-reading 00093 // from the disk is not necessary every time. To do this, we'll use a map to store 00094 // the translation managers and observation number keys with a string identifier to find them. 00095 // This identifier needs to have the mission name and the instrument name. 00096 static std::map<QString, std::pair<PvlTranslationManager, PvlKeyword> > missionTranslators; 00097 QString key = mission + "_" + instrument; 00098 std::map<QString, std::pair<PvlTranslationManager, PvlKeyword> >::iterator 00099 translationIterator = missionTranslators.find(key); 00100 00101 if(translationIterator == missionTranslators.end()) { 00102 // Get the file 00103 FileName snFile((QString) dataDir[mission] + "/translations/" + 00104 instrument + "SerialNumber????.trn"); 00105 snFile = snFile.highestVersion(); 00106 00107 // Delets the extra 00108 Pvl translation(snFile.expanded()); 00109 PvlKeyword observationKeys; 00110 if(translation.HasKeyword("ObservationKeys")) { 00111 observationKeys = translation["ObservationKeys"]; 00112 } 00113 00114 // use the translation file to generate keywords 00115 missionTranslators.insert( 00116 std::pair<QString, std::pair<PvlTranslationManager, PvlKeyword> > 00117 (key, std::pair<PvlTranslationManager, PvlKeyword>(PvlTranslationManager(snFile.expanded()), observationKeys)) 00118 ); 00119 00120 translationIterator = missionTranslators.find(key); 00121 } 00122 00123 translationIterator->second.first.SetLabel(label); 00124 translationIterator->second.first.Auto(outLabel); 00125 PvlGroup snGroup = outLabel.FindGroup("SerialNumberKeywords"); 00126 00127 // Delets the extra 00128 if(!translationIterator->second.second.Name().isEmpty()) { 00129 snGroup += translationIterator->second.second; 00130 } 00131 else { 00132 snGroup += PvlKeyword("ObservationKeys", toString(snGroup.Keywords())); 00133 } 00134 00135 return snGroup; 00136 } 00137 00146 std::vector<QString> ObservationNumber::PossibleSerial(const QString &on, SerialNumberList &list) { 00147 std::vector<QString> sn; 00148 for(int i = 0; i < list.Size(); i++) { 00149 if(list.SerialNumber(i).startsWith(on)) { 00150 sn.push_back(list.SerialNumber(i)); 00151 } 00152 } 00153 return sn; 00154 } 00155 00156 00157 00158 }