|
Isis 3.0 Object Programmers' Reference |
Home |
00001 #include <map> 00002 00003 #include "SerialNumber.h" 00004 #include "ObservationNumber.h" 00005 #include "SerialNumberList.h" 00006 #include "IException.h" 00007 #include "Pvl.h" 00008 #include "Cube.h" 00009 #include "Process.h" 00010 #include "PvlTranslationManager.h" 00011 #include "FileName.h" 00012 00013 namespace Isis { 00017 SerialNumber::SerialNumber() {} 00018 00022 SerialNumber::~SerialNumber() {} 00023 00032 QString SerialNumber::Compose(Pvl &label, bool def2filename) { 00033 00034 QString sn; 00035 try { 00036 PvlGroup snGroup = FindSerialTranslation(label); 00037 sn = CreateSerialNumber(snGroup, (int)snGroup["ObservationKeys"]); 00038 } 00039 catch(IException &) { 00040 if(def2filename) { 00041 // Try to return the filename if it exists in the label, otherwise use 00042 // "Unknown" as a last resort. 00043 QString snTemp = label.FileName(); 00044 if(!snTemp.isEmpty()) { 00045 sn = FileName(snTemp).name(); 00046 } 00047 else { 00048 sn = "Unknown"; 00049 } 00050 } 00051 else { 00052 sn = "Unknown"; 00053 } 00054 } 00055 00056 return sn; 00057 } 00058 00067 QString SerialNumber::Compose(Cube &cube, bool def2filename) { 00068 return Compose(*cube.label(), def2filename); 00069 } 00070 00080 QString SerialNumber::Compose(const QString &filename, bool def2filename) { 00081 Pvl p(filename); 00082 return Compose(p, def2filename); 00083 } 00084 00091 PvlGroup SerialNumber::FindSerialTranslation(Pvl &label) { 00092 Pvl outLabel; 00093 static PvlGroup dataDir(Preference::Preferences().FindGroup("DataDirectory")); 00094 00095 // Get the mission name 00096 static QString missionTransFile = (QString) dataDir["base"] + "/translations/MissionName2DataDir.trn"; 00097 static PvlTranslationManager missionXlater(missionTransFile); 00098 missionXlater.SetLabel(label); 00099 QString mission = missionXlater.Translate("MissionName"); 00100 00101 // Get the instrument name 00102 static QString instTransFile = (QString) dataDir["base"] + "/translations/Instruments.trn"; 00103 static PvlTranslationManager instrumentXlater(instTransFile); 00104 instrumentXlater.SetLabel(label); 00105 QString instrument = instrumentXlater.Translate("InstrumentName"); 00106 00107 // We want to use this instrument's translation manager. It's much faster for 00108 // SerialNumberList if we keep the translation manager in memory, so re-reading 00109 // from the disk is not necessary every time. To do this, we'll use a map to store 00110 // the translation managers with a string identifier to find them. This identifier 00111 // needs to have the mission name and the instrument name. 00112 00113 // Create the static map to keep the translation managers in memory 00114 static std::map<QString, PvlTranslationManager> missionTranslators; 00115 00116 // Determine the key for this translation manager - must have both mission and instrument 00117 QString key = mission + "_" + instrument; 00118 00119 // Try to find an existing translation manager with the key 00120 std::map<QString, PvlTranslationManager>::iterator translationIterator = missionTranslators.find(key); 00121 00122 // If we don't succeed, create one 00123 if(translationIterator == missionTranslators.end()) { 00124 // Get the file 00125 FileName snFile((QString) dataDir[mission] + "/translations/" + 00126 instrument + "SerialNumber????.trn"); 00127 snFile = snFile.highestVersion(); 00128 00129 // use the translation file to generate keywords 00130 missionTranslators.insert( 00131 std::pair<QString, PvlTranslationManager>(key, PvlTranslationManager(snFile.expanded())) 00132 ); 00133 00134 translationIterator = missionTranslators.find(key); 00135 } 00136 00137 translationIterator->second.SetLabel(label); 00138 translationIterator->second.Auto(outLabel); 00139 00140 PvlGroup snGroup = outLabel.FindGroup("SerialNumberKeywords"); 00141 snGroup += PvlKeyword("ObservationKeys", toString(snGroup.Keywords())); 00142 00143 return snGroup; 00144 } 00145 00153 QString SerialNumber::CreateSerialNumber(PvlGroup &snGroup, int keys) { 00154 QString sn = snGroup["Keyword1"][0]; 00155 for(int i = 2; i <= keys; i++) { 00156 QString keyword = QString("Keyword%1").arg(i); 00157 sn += "/" + snGroup[keyword][0]; 00158 } 00159 return sn; 00160 } 00161 00174 QString SerialNumber::ComposeObservation(const QString &sn, SerialNumberList &list, bool def2filename) { 00175 QString filename = list.FileName(sn); 00176 return ObservationNumber::Compose(filename, def2filename); 00177 } 00178 }