|
Isis 3.0 Object Programmers' Reference |
Home |
00001 #include "SerialNumberList.h" 00002 00003 #include <QString> 00004 00005 #include "IException.h" 00006 #include "FileList.h" 00007 #include "FileName.h" 00008 #include "SerialNumber.h" 00009 #include "ObservationNumber.h" 00010 #include "IString.h" 00011 #include "Pvl.h" 00012 00013 namespace Isis { 00017 SerialNumberList::SerialNumberList(bool checkTarget) { 00018 p_checkTarget = checkTarget; 00019 p_target.clear(); 00020 } 00021 00022 00035 SerialNumberList::SerialNumberList(const QString &listfile, bool checkTarget, Progress *progress) { 00036 p_checkTarget = checkTarget; 00037 p_target.clear(); 00038 try { 00039 FileList flist(listfile); 00040 if(progress != NULL) { 00041 progress->SetText("Creating Isis 3 serial numbers from list file."); 00042 progress->SetMaximumSteps((int) flist.size() + 1); 00043 progress->CheckStatus(); 00044 } 00045 for(int i = 0; i < flist.size(); i++) { 00046 Add(flist[i].toString()); 00047 if(progress != NULL) { 00048 progress->CheckStatus(); 00049 } 00050 } 00051 } 00052 catch(IException &e) { 00053 QString msg = "Can't open or invalid file list [" + listfile + "]"; 00054 throw IException(e, IException::User, msg, _FILEINFO_); 00055 } 00056 } 00057 00061 SerialNumberList::~SerialNumberList() { 00062 } 00063 00064 00072 void SerialNumberList::Delete(const QString &sn) 00073 { 00074 int index = SerialNumberIndex(sn); 00075 QString sFileName = FileName(sn); 00076 00077 // Delete the reference to this serial number in the 00078 // vector and the maps 00079 p_pairs.erase(p_pairs.begin() + index); 00080 p_serialMap.erase(sn); 00081 p_fileMap.erase(sFileName); 00082 } 00083 00084 00085 00104 void SerialNumberList::Add(const QString &filename, bool def2filename) { 00105 00106 Pvl p(Isis::FileName(filename).expanded()); 00107 PvlObject cubeObj = p.FindObject("IsisCube"); 00108 try { 00109 // Test the target name if desired 00110 if (p_checkTarget) { 00111 QString target; 00112 PvlGroup targetGroup; 00113 if (cubeObj.HasGroup("Instrument")) { 00114 targetGroup = cubeObj.FindGroup("Instrument"); 00115 } 00116 else if (def2filename) { 00117 // No instrument, try Mapping 00118 if (cubeObj.HasGroup("Mapping")) { 00119 targetGroup = cubeObj.FindGroup("Mapping"); 00120 } 00121 else { 00122 QString msg = "Unable to find Instrument or Mapping group in "; 00123 msg += filename + " for comparing target"; 00124 throw IException(IException::User, msg, _FILEINFO_); 00125 } 00126 } 00127 else { 00128 // No Instrument group 00129 QString msg = "Unable to find Instrument group in " + filename; 00130 msg += " for comparing target"; 00131 throw IException(IException::User, msg, _FILEINFO_); 00132 } 00133 00134 target = targetGroup["TargetName"][0]; 00135 target = target.toUpper(); 00136 if (p_target.isEmpty()) { 00137 p_target = target; 00138 } 00139 else if (p_target != target) { 00140 QString msg = "Target name of [" + target + "] from file ["; 00141 msg += filename + "] does not match [" + p_target + "]"; 00142 throw IException(IException::User, msg, _FILEINFO_); 00143 } 00144 } 00145 00146 // Create the SN 00147 QString sn = SerialNumber::Compose(p, def2filename); 00148 QString on = ObservationNumber::Compose(p, def2filename); 00149 if(sn == "Unknown") { 00150 QString msg = "Invalid serial number [Unknown] from file ["; 00151 msg += filename + "]"; 00152 throw IException(IException::User, msg, _FILEINFO_); 00153 } 00154 else if(HasSerialNumber(sn)) { 00155 int index = SerialNumberIndex(sn); 00156 QString msg = "Duplicate, serial number [" + sn + "] from files ["; 00157 msg += SerialNumberList::FileName(sn) + "] and [" + FileName(index) + "]."; 00158 throw IException(IException::User, msg, _FILEINFO_); 00159 } 00160 Pair nextpair; 00161 nextpair.filename = Isis::FileName(filename).expanded(); 00162 nextpair.serialNumber = sn; 00163 nextpair.observationNumber = on; 00164 p_pairs.push_back(nextpair); 00165 p_serialMap.insert(std::pair<QString, int>(sn, (int)(p_pairs.size() - 1))); 00166 p_fileMap.insert(std::pair<QString, int>(nextpair.filename, (int)(p_pairs.size() - 1))); 00167 } 00168 catch(IException &e) { 00169 QString msg = "File [" + Isis::FileName(filename).expanded() + 00170 "] can not be added to "; 00171 msg += "serial number list"; 00172 throw IException(e, IException::User, msg, _FILEINFO_); 00173 } 00174 } 00175 00176 00177 void SerialNumberList::Add(const char *serialNumber, const char *filename) { 00178 00179 Add((QString)serialNumber, (QString)filename); 00180 } 00181 00182 00193 void SerialNumberList::Add(const QString &serialNumber, const QString &filename) { 00194 00195 Pvl p(Isis::FileName(filename).expanded()); 00196 PvlObject cubeObj = p.FindObject("IsisCube"); 00197 try { 00198 // Test the target name if desired 00199 if (p_checkTarget) { 00200 QString target; 00201 PvlGroup targetGroup; 00202 if (cubeObj.HasGroup("Instrument")) { 00203 targetGroup = cubeObj.FindGroup("Instrument"); 00204 } 00205 else if (cubeObj.HasGroup("Mapping")) { 00206 // No instrument, try Mapping 00207 if (cubeObj.HasGroup("Mapping")) { 00208 targetGroup = cubeObj.FindGroup("Mapping"); 00209 } 00210 else { 00211 QString msg = "Unable to find Instrument or Mapping group in "; 00212 msg += filename + " for comparing target"; 00213 throw IException(IException::User, msg, _FILEINFO_); 00214 } 00215 } 00216 00217 target = targetGroup["TargetName"][0]; 00218 target = target.toUpper(); 00219 if (p_target.isEmpty()) { 00220 p_target = target; 00221 } 00222 else if (p_target != target) { 00223 QString msg = "Target name of [" + target + "] from file ["; 00224 msg += filename + "] does not match [" + p_target + "]"; 00225 throw IException(IException::User, msg, _FILEINFO_); 00226 } 00227 } 00228 00229 QString observationNumber = "Unknown"; 00230 if (serialNumber == "Unknown") { 00231 QString msg = "Invalid serial number [Unknown] from file ["; 00232 msg += filename + "]"; 00233 throw IException(IException::User, msg, _FILEINFO_); 00234 } 00235 else if (HasSerialNumber(serialNumber)) { 00236 int index = SerialNumberIndex(serialNumber); 00237 QString msg = "Duplicate, serial number [" + serialNumber + "] from files ["; 00238 msg += SerialNumberList::FileName(serialNumber) + "] and [" + FileName(index) + "]."; 00239 throw IException(IException::User, msg, _FILEINFO_); 00240 } 00241 Pair nextpair; 00242 nextpair.filename = Isis::FileName(filename).expanded(); 00243 nextpair.serialNumber = serialNumber; 00244 nextpair.observationNumber = observationNumber; 00245 p_pairs.push_back(nextpair); 00246 p_serialMap.insert(std::pair<QString, int>(serialNumber, (int)(p_pairs.size() - 1))); 00247 p_fileMap.insert(std::pair<QString, int>(nextpair.filename, (int)(p_pairs.size() - 1))); 00248 } 00249 catch(IException &e) { 00250 QString msg = "File [" + Isis::FileName(filename).expanded() + 00251 "] can not be added to "; 00252 msg += "serial number list"; 00253 throw IException(e, IException::User, msg, _FILEINFO_); 00254 } 00255 } 00256 00257 00266 bool SerialNumberList::HasSerialNumber(QString sn) { 00267 if(p_serialMap.find(sn) == p_serialMap.end()) return false; 00268 return true; 00269 } 00270 00271 00277 int SerialNumberList::Size() const { 00278 return p_pairs.size(); 00279 } 00280 00281 00290 QString SerialNumberList::FileName(const QString &sn) { 00291 if(HasSerialNumber(sn)) { 00292 int index = p_serialMap.find(sn)->second; 00293 return p_pairs[index].filename; 00294 } 00295 else { 00296 QString msg = "Requested serial number [" + sn + "] "; 00297 msg += "does not exist in the list"; 00298 throw IException(IException::Programmer, msg, _FILEINFO_); 00299 } 00300 } 00301 00314 QString SerialNumberList::SerialNumber(const QString &filename) { 00315 if(p_fileMap.find(Isis::FileName(filename).expanded()) == p_fileMap.end()) { 00316 QString msg = "Requested filename [" + 00317 Isis::FileName(filename).expanded() + "]"; 00318 msg += "does not exist in the list"; 00319 throw IException(IException::Programmer, msg, _FILEINFO_); 00320 } 00321 int index = FileNameIndex(filename); 00322 return p_pairs[index].serialNumber; 00323 } 00324 00332 QString SerialNumberList::SerialNumber(int index) { 00333 if(index >= 0 && index < (int) p_pairs.size()) { 00334 return p_pairs[index].serialNumber; 00335 } 00336 else { 00337 QString num = QString(index); 00338 QString msg = "Index [" + (QString) num + "] is invalid"; 00339 throw IException(IException::Programmer, msg, _FILEINFO_); 00340 } 00341 } 00342 00350 QString SerialNumberList::ObservationNumber(int index) { 00351 if(index >= 0 && index < (int) p_pairs.size()) { 00352 return p_pairs[index].observationNumber; 00353 } 00354 else { 00355 QString num = QString(index); 00356 QString msg = "Index [" + (QString) num + "] is invalid"; 00357 throw IException(IException::Programmer, msg, _FILEINFO_); 00358 } 00359 } 00360 00368 int SerialNumberList::SerialNumberIndex(const QString &sn) { 00369 if(HasSerialNumber(sn)) { 00370 return p_serialMap.find(sn)->second; 00371 } 00372 else { 00373 QString msg = "Requested serial number [" + sn + "] "; 00374 msg += "does not exist in the list"; 00375 throw IException(IException::Programmer, msg, _FILEINFO_); 00376 } 00377 } 00378 00391 int SerialNumberList::FileNameIndex(const QString &filename) { 00392 00393 std::map<QString, int>::iterator pos; 00394 if((pos = p_fileMap.find(Isis::FileName(filename).expanded())) == p_fileMap.end()) { 00395 QString msg = "Requested filename [" + 00396 Isis::FileName(filename).expanded() + "]"; 00397 msg += "does not exist in the list"; 00398 throw IException(IException::Programmer, msg, _FILEINFO_); 00399 } 00400 return pos->second; 00401 } 00402 00410 QString SerialNumberList::FileName(int index) { 00411 if(index >= 0 && index < (int) p_pairs.size()) { 00412 return p_pairs[index].filename; 00413 } 00414 else { 00415 QString num = toString(index); 00416 QString msg = "Index [" + num + "] is invalid"; 00417 throw IException(IException::Programmer, msg, _FILEINFO_); 00418 } 00419 } 00420 00421 00431 std::vector<QString> SerialNumberList::PossibleSerialNumbers(const QString &on) { 00432 std::vector<QString> numbers; 00433 for(unsigned index = 0; index < p_pairs.size(); index++) { 00434 if(p_pairs[index].observationNumber == on) { 00435 numbers.push_back(p_pairs[index].serialNumber); 00436 } 00437 } 00438 if(numbers.size() > 0) { 00439 return numbers; 00440 } 00441 else { 00442 QString msg = "Requested observation number [" + on + "] "; 00443 msg += "does not exist in the list"; 00444 throw IException(IException::Programmer, msg, _FILEINFO_); 00445 } 00446 } 00447 00448 00449 }