USGS

Isis 3.0 Object Programmers' Reference

Home

SerialNumberList.cpp

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 }