Isis 3 Programmer Reference
ObservationNumber.cpp
1 
6 /* SPDX-License-Identifier: CC0-1.0 */
7 #include "ObservationNumber.h"
8 #include "IException.h"
9 #include "Pvl.h"
10 #include "Cube.h"
11 #include "Process.h"
12 #include "PvlToPvlTranslationManager.h"
13 #include "FileName.h"
14 
15 namespace Isis {
20 
25 
31  QString ObservationNumber::Compose(Pvl &label, bool def2filename) {
32  QString sn;
33  try {
34  PvlGroup snGroup = FindObservationTranslation(label);
35  sn = CreateSerialNumber(snGroup, (int)snGroup["ObservationKeys"]);
36  }
37  catch(IException &e) {
38  if(def2filename) {
39  // Try to return the filename if it exists in the label, otherwise use
40  // "Unknown" as a last resort.
41  QString snTemp = label.fileName();
42  if(!snTemp.isEmpty()) {
43  sn = FileName(snTemp).name();
44  }
45  else {
46  sn = "Unknown";
47  }
48  }
49  else {
50  sn = "Unknown";
51  }
52  }
53 
54  return sn;
55  }
56 
62  QString ObservationNumber::Compose(Cube &cube, bool def2filename) {
63  return Compose(*cube.label(), def2filename);
64  }
65 
71  QString ObservationNumber::Compose(const QString &filename, bool def2filename) {
72  Pvl p(filename);
73  return Compose(p, def2filename);
74  }
75 
82  Pvl outLabel;
83 
84  // Get the mission name
85  static QString missionTransFile = "$ISISROOT/appdata/translations/MissionName2DataDir.trn";
86  static PvlToPvlTranslationManager missionXlater(missionTransFile);
87  missionXlater.SetLabel(label);
88  QString mission = missionXlater.Translate("MissionName");
89 
90  // Get the instrument name
91  static QString instTransFile = "$ISISROOT/appdata/translations/Instruments.trn";
92  static PvlToPvlTranslationManager instrumentXlater(instTransFile);
93  instrumentXlater.SetLabel(label);
94  QString instrument = instrumentXlater.Translate("InstrumentName");
95 
96  // We want to use this instrument's translation manager. It's much faster for
97  // ObservationNumberList if we keep the translation manager in memory, so re-reading
98  // from the disk is not necessary every time. To do this, we'll use a map to store
99  // the translation managers and observation number keys with a string identifier to find them.
100  // This identifier needs to have the mission name and the instrument name.
101  static std::map<QString, std::pair<PvlToPvlTranslationManager, PvlKeyword> > missionTranslators;
102  QString key = mission + "_" + instrument;
103  std::map<QString, std::pair<PvlToPvlTranslationManager, PvlKeyword> >::iterator
104  translationIterator = missionTranslators.find(key);
105 
106  if(translationIterator == missionTranslators.end()) {
107  // Get the file
108  FileName snFile((QString) "$ISISROOT/appdata/translations/" + mission +
109  instrument + "SerialNumber.trn");
110 
111  // Delets the extra
112  Pvl translation(snFile.expanded());
113  PvlKeyword observationKeys;
114  if(translation.hasKeyword("ObservationKeys")) {
115  observationKeys = translation["ObservationKeys"];
116  }
117 
118  // use the translation file to generate keywords
119  missionTranslators.insert(
120  std::pair<QString, std::pair<PvlToPvlTranslationManager, PvlKeyword> >
121  (key, std::pair<PvlToPvlTranslationManager, PvlKeyword>(PvlToPvlTranslationManager(snFile.expanded()), observationKeys))
122  );
123 
124  translationIterator = missionTranslators.find(key);
125  }
126 
127  translationIterator->second.first.SetLabel(label);
128  translationIterator->second.first.Auto(outLabel);
129  PvlGroup snGroup = outLabel.findGroup("SerialNumberKeywords");
130 
131  // Delets the extra
132  if(!translationIterator->second.second.name().isEmpty()) {
133  snGroup += translationIterator->second.second;
134  }
135  else {
136  snGroup += PvlKeyword("ObservationKeys", toString(snGroup.keywords()));
137  }
138 
139  return snGroup;
140  }
141 
150  std::vector<QString> ObservationNumber::PossibleSerial(const QString &on, SerialNumberList &list) {
151  std::vector<QString> sn;
152  for(int i = 0; i < list.size(); i++) {
153  if(list.serialNumber(i).startsWith(on)) {
154  sn.push_back(list.serialNumber(i));
155  }
156  }
157  return sn;
158  }
159 
160 
161 
162 }
Isis::PvlObject::findGroup
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
Definition: PvlObject.h:129
Isis::PvlKeyword
A single keyword-value pair.
Definition: PvlKeyword.h:82
Isis::SerialNumberList::size
int size() const
How many serial number / filename combos are in the list.
Definition: SerialNumberList.cpp:384
Isis::FileName::name
QString name() const
Returns the name of the file excluding the path and the attributes in the file name.
Definition: FileName.cpp:162
Isis::FileName
File name manipulation and expansion.
Definition: FileName.h:100
Isis::PvlToPvlTranslationManager::Translate
virtual QString Translate(QString translationGroupName, int findex=0)
Returns a translated value.
Definition: PvlToPvlTranslationManager.cpp:107
Isis::Pvl
Container for cube-like labels.
Definition: Pvl.h:119
Isis::toString
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition: IString.cpp:211
Isis::SerialNumberList
Serial Number list generator.
Definition: SerialNumberList.h:64
Isis::SerialNumberList::serialNumber
QString serialNumber(const QString &filename)
Return a serial number given a filename.
Definition: SerialNumberList.cpp:426
Isis::ObservationNumber::~ObservationNumber
virtual ~ObservationNumber()
Destroy a SerialNumber object.
Definition: ObservationNumber.cpp:24
Isis::PvlToPvlTranslationManager
Allows applications to translate simple text files.
Definition: PvlToPvlTranslationManager.h:65
Isis::ObservationNumber::PossibleSerial
std::vector< QString > PossibleSerial(const QString &on, SerialNumberList &list)
Creates a vector of plasible SerialNumbers from a string representing the ObservationNumber and a Ser...
Definition: ObservationNumber.cpp:150
Isis::FileName::expanded
QString expanded() const
Returns a QString of the full file name including the file path, excluding the attributes.
Definition: FileName.cpp:196
Isis::PvlGroup
Contains multiple PvlContainers.
Definition: PvlGroup.h:41
Isis::PvlObject::hasKeyword
bool hasKeyword(const QString &kname, FindOptions opts) const
See if a keyword is in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within ...
Definition: PvlObject.cpp:236
Isis::PvlContainer::fileName
QString fileName() const
Returns the filename used to initialise the Pvl object.
Definition: PvlContainer.h:232
Isis::ObservationNumber::Compose
static QString Compose(Pvl &label, bool def2filename=false)
Compose a ObservationNumber from a PVL.
Definition: ObservationNumber.cpp:31
Isis::Cube
IO Handler for Isis Cubes.
Definition: Cube.h:167
Isis::IException
Isis exception class.
Definition: IException.h:91
Isis::Cube::label
Pvl * label() const
Returns a pointer to the IsisLabel object associated with the cube.
Definition: Cube.cpp:1701
Isis::ObservationNumber::FindObservationTranslation
static PvlGroup FindObservationTranslation(Pvl &label)
Get Groups by translating from correct Translation table.
Definition: ObservationNumber.cpp:81
Isis::PvlContainer::keywords
int keywords() const
Returns the number of keywords contained in the PvlContainer.
Definition: PvlContainer.h:86
Isis::SerialNumber::CreateSerialNumber
static QString CreateSerialNumber(PvlGroup &snGroup, int key)
Create the SerialNumber string by concatenating the keywords in the label with '/' in between serialN...
Definition: SerialNumber.cpp:164
Isis::ObservationNumber::ObservationNumber
ObservationNumber()
Create an empty SerialNumber object.
Definition: ObservationNumber.cpp:19
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16