USGS

Isis 3.0 Object Programmers' Reference

Home

SerialNumber.cpp

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 }