USGS

Isis 3.0 Object Programmers' Reference

Home

SerialNumberList.cpp
1 #include "SerialNumberList.h"
2 
3 #include <QString>
4 
5 #include "IException.h"
6 #include "FileList.h"
7 #include "FileName.h"
8 #include "SerialNumber.h"
9 #include "ObservationNumber.h"
10 #include "IString.h"
11 #include "Pvl.h"
12 
13 namespace Isis {
18  p_checkTarget = checkTarget;
19  p_target.clear();
20  }
21 
22 
35  SerialNumberList::SerialNumberList(const QString &listfile, bool checkTarget, Progress *progress) {
36  p_checkTarget = checkTarget;
37  p_target.clear();
38  try {
39  FileList flist(listfile);
40  if(progress != NULL) {
41  progress->SetText("Creating Isis 3 serial numbers from list file.");
42  progress->SetMaximumSteps((int) flist.size() + 1);
43  progress->CheckStatus();
44  }
45  for(int i = 0; i < flist.size(); i++) {
46  Add(flist[i].toString());
47  if(progress != NULL) {
48  progress->CheckStatus();
49  }
50  }
51  }
52  catch(IException &e) {
53  QString msg = "Can't open or invalid file list [" + listfile + "]";
54  throw IException(e, IException::User, msg, _FILEINFO_);
55  }
56  }
57 
62  }
63 
64 
72  void SerialNumberList::Delete(const QString &sn)
73  {
74  int index = SerialNumberIndex(sn);
75  QString sFileName = FileName(sn);
76 
77  // Delete the reference to this serial number in the
78  // vector and the maps
79  p_pairs.erase(p_pairs.begin() + index);
80  p_serialMap.erase(sn);
81  p_fileMap.erase(sFileName);
82  }
83 
84 
85 
104  void SerialNumberList::Add(const QString &filename, bool def2filename) {
105 
106  Pvl p(Isis::FileName(filename).expanded());
107  PvlObject cubeObj = p.findObject("IsisCube");
108  try {
109  // Test the target name if desired
110  if (p_checkTarget) {
111  QString target;
112  PvlGroup targetGroup;
113  if (cubeObj.hasGroup("Instrument")) {
114  targetGroup = cubeObj.findGroup("Instrument");
115  }
116  else if (def2filename) {
117  // No instrument, try Mapping
118  if (cubeObj.hasGroup("Mapping")) {
119  targetGroup = cubeObj.findGroup("Mapping");
120  }
121  else {
122  QString msg = "Unable to find Instrument or Mapping group in ";
123  msg += filename + " for comparing target";
125  }
126  }
127  else {
128  // No Instrument group
129  QString msg = "Unable to find Instrument group in " + filename;
130  msg += " for comparing target";
132  }
133 
134  target = targetGroup["TargetName"][0];
135  target = target.toUpper();
136  if (p_target.isEmpty()) {
137  p_target = target;
138  }
139  else if (p_target != target) {
140  QString msg = "Target name of [" + target + "] from file [";
141  msg += filename + "] does not match [" + p_target + "]";
143  }
144  }
145 
146  // Create the SN
147  QString sn = SerialNumber::Compose(p, def2filename);
148  QString on = ObservationNumber::Compose(p, def2filename);
149  if(sn == "Unknown") {
150  QString msg = "Invalid serial number [Unknown] from file [";
151  msg += filename + "]";
153  }
154  else if(HasSerialNumber(sn)) {
155  int index = SerialNumberIndex(sn);
156  QString msg = "Duplicate, serial number [" + sn + "] from files [";
157  msg += SerialNumberList::FileName(sn) + "] and [" + FileName(index) + "].";
159  }
160  Pair nextpair;
161  nextpair.filename = Isis::FileName(filename).expanded();
162  nextpair.serialNumber = sn;
163  nextpair.observationNumber = on;
164  p_pairs.push_back(nextpair);
165  p_serialMap.insert(std::pair<QString, int>(sn, (int)(p_pairs.size() - 1)));
166  p_fileMap.insert(std::pair<QString, int>(nextpair.filename, (int)(p_pairs.size() - 1)));
167  }
168  catch(IException &e) {
169  QString msg = "File [" + Isis::FileName(filename).expanded() +
170  "] can not be added to ";
171  msg += "serial number list";
172  throw IException(e, IException::User, msg, _FILEINFO_);
173  }
174  }
175 
176 
177  void SerialNumberList::Add(const char *serialNumber, const char *filename) {
178 
179  Add((QString)serialNumber, (QString)filename);
180  }
181 
182 
193  void SerialNumberList::Add(const QString &serialNumber, const QString &filename) {
194 
195  Pvl p(Isis::FileName(filename).expanded());
196  PvlObject cubeObj = p.findObject("IsisCube");
197  try {
198  // Test the target name if desired
199  if (p_checkTarget) {
200  QString target;
201  PvlGroup targetGroup;
202  if (cubeObj.hasGroup("Instrument")) {
203  targetGroup = cubeObj.findGroup("Instrument");
204  }
205  else if (cubeObj.hasGroup("Mapping")) {
206  // No instrument, try Mapping
207  if (cubeObj.hasGroup("Mapping")) {
208  targetGroup = cubeObj.findGroup("Mapping");
209  }
210  else {
211  QString msg = "Unable to find Instrument or Mapping group in ";
212  msg += filename + " for comparing target";
214  }
215  }
216 
217  target = targetGroup["TargetName"][0];
218  target = target.toUpper();
219  if (p_target.isEmpty()) {
220  p_target = target;
221  }
222  else if (p_target != target) {
223  QString msg = "Target name of [" + target + "] from file [";
224  msg += filename + "] does not match [" + p_target + "]";
226  }
227  }
228 
229  QString observationNumber = "Unknown";
230  if (serialNumber == "Unknown") {
231  QString msg = "Invalid serial number [Unknown] from file [";
232  msg += filename + "]";
234  }
235  else if (HasSerialNumber(serialNumber)) {
236  int index = SerialNumberIndex(serialNumber);
237  QString msg = "Duplicate, serial number [" + serialNumber + "] from files [";
238  msg += SerialNumberList::FileName(serialNumber) + "] and [" + FileName(index) + "].";
240  }
241  Pair nextpair;
242  nextpair.filename = Isis::FileName(filename).expanded();
243  nextpair.serialNumber = serialNumber;
244  nextpair.observationNumber = observationNumber;
245  p_pairs.push_back(nextpair);
246  p_serialMap.insert(std::pair<QString, int>(serialNumber, (int)(p_pairs.size() - 1)));
247  p_fileMap.insert(std::pair<QString, int>(nextpair.filename, (int)(p_pairs.size() - 1)));
248  }
249  catch(IException &e) {
250  QString msg = "File [" + Isis::FileName(filename).expanded() +
251  "] can not be added to ";
252  msg += "serial number list";
253  throw IException(e, IException::User, msg, _FILEINFO_);
254  }
255  }
256 
257 
267  if(p_serialMap.find(sn) == p_serialMap.end()) return false;
268  return true;
269  }
270 
271 
278  return p_pairs.size();
279  }
280 
281 
290  QString SerialNumberList::FileName(const QString &sn) {
291  if(HasSerialNumber(sn)) {
292  int index = p_serialMap.find(sn)->second;
293  return p_pairs[index].filename;
294  }
295  else {
296  QString msg = "Requested serial number [" + sn + "] ";
297  msg += "does not exist in the list";
299  }
300  }
301 
314  QString SerialNumberList::SerialNumber(const QString &filename) {
315  if(p_fileMap.find(Isis::FileName(filename).expanded()) == p_fileMap.end()) {
316  QString msg = "Requested filename [" +
317  Isis::FileName(filename).expanded() + "]";
318  msg += "does not exist in the list";
320  }
321  int index = FileNameIndex(filename);
322  return p_pairs[index].serialNumber;
323  }
324 
332  QString SerialNumberList::SerialNumber(int index) {
333  if(index >= 0 && index < (int) p_pairs.size()) {
334  return p_pairs[index].serialNumber;
335  }
336  else {
337  QString num = QString(index);
338  QString msg = "Index [" + (QString) num + "] is invalid";
340  }
341  }
342 
351  if(index >= 0 && index < (int) p_pairs.size()) {
352  return p_pairs[index].observationNumber;
353  }
354  else {
355  QString num = QString(index);
356  QString msg = "Index [" + (QString) num + "] is invalid";
358  }
359  }
360 
368  int SerialNumberList::SerialNumberIndex(const QString &sn) {
369  if(HasSerialNumber(sn)) {
370  return p_serialMap.find(sn)->second;
371  }
372  else {
373  QString msg = "Requested serial number [" + sn + "] ";
374  msg += "does not exist in the list";
376  }
377  }
378 
391  int SerialNumberList::FileNameIndex(const QString &filename) {
392 
393  std::map<QString, int>::iterator pos;
394  if((pos = p_fileMap.find(Isis::FileName(filename).expanded())) == p_fileMap.end()) {
395  QString msg = "Requested filename [" +
396  Isis::FileName(filename).expanded() + "]";
397  msg += "does not exist in the list";
399  }
400  return pos->second;
401  }
402 
410  QString SerialNumberList::FileName(int index) {
411  if(index >= 0 && index < (int) p_pairs.size()) {
412  return p_pairs[index].filename;
413  }
414  else {
415  QString num = toString(index);
416  QString msg = "Index [" + num + "] is invalid";
418  }
419  }
420 
421 
431  std::vector<QString> SerialNumberList::PossibleSerialNumbers(const QString &on) {
432  std::vector<QString> numbers;
433  for(unsigned index = 0; index < p_pairs.size(); index++) {
434  if(p_pairs[index].observationNumber == on) {
435  numbers.push_back(p_pairs[index].serialNumber);
436  }
437  }
438  if(numbers.size() > 0) {
439  return numbers;
440  }
441  else {
442  QString msg = "Requested observation number [" + on + "] ";
443  msg += "does not exist in the list";
445  }
446  }
447 
448 
449 }