USGS

Isis 3.0 Object Programmers' Reference

Home

ObservationNumber.cpp

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 }