USGS

Isis 3.0 Object Programmers' Reference

Home

ControlNetDiff.cpp
1 #include "IsisDebug.h"
2 
3 #include "ControlNetDiff.h"
4 
5 #include <QMap>
6 #include <QSet>
7 #include <QString>
8 
9 #include "ControlMeasure.h"
10 #include "ControlNet.h"
11 #include "ControlNetFile.h"
12 #include "ControlNetVersioner.h"
13 #include "ControlPoint.h"
14 #include "FileName.h"
15 #include "Pvl.h"
16 #include "PvlContainer.h"
17 #include "PvlGroup.h"
18 #include "PvlKeyword.h"
19 #include "PvlObject.h"
20 
21 
22 using std::cerr;
23 using std::cout;
24 using std::endl;
25 
26 namespace Isis {
27 
32  init();
33  }
34 
35 
42  init();
43  addTolerances(diffFile);
44  }
45 
46 
51  delete m_tolerances;
52  m_tolerances = NULL;
53 
54  delete m_ignoreKeys;
55  m_ignoreKeys = NULL;
56  }
57 
58 
67  if (diffFile.hasGroup("Tolerances")) {
68  PvlGroup tolerances = diffFile.findGroup("Tolerances");
69  for (int i = 0; i < tolerances.keywords(); i++)
70  m_tolerances->insert(tolerances[i].name(),
71  toDouble(tolerances[i][0]));
72  }
73 
74  if (diffFile.hasGroup("IgnoreKeys")) {
75  PvlGroup ignoreKeys = diffFile.findGroup("IgnoreKeys");
76  for (int i = 0; i < ignoreKeys.keywords(); i++)
77  m_ignoreKeys->insert(ignoreKeys[i].name());
78  }
79  }
80 
81 
90  Pvl ControlNetDiff::compare(FileName &net1Name, FileName &net2Name) {
91  Pvl results;
92  PvlObject report("Differences");
93 
94  LatestControlNetFile *net1 = ControlNetVersioner::Read(net1Name.expanded());
95  LatestControlNetFile *net2 = ControlNetVersioner::Read(net2Name.expanded());
96  diff("Filename", net1Name.name(), net2Name.name(), report);
97 
98  Pvl net1Pvl(net1->toPvl());
99  Pvl net2Pvl(net2->toPvl());
100 
101  PvlObject &net1Obj = net1Pvl.findObject("ControlNetwork");
102  PvlObject &net2Obj = net2Pvl.findObject("ControlNetwork");
103 
104  BigInt net1NumPts = net1Obj.objects();
105  BigInt net2NumPts = net2Obj.objects();
106  diff("Points", toString(net1NumPts), toString(net2NumPts), report);
107 
108  diff("NetworkId", net1Obj, net2Obj, report);
109  diff("TargetName", net1Obj, net2Obj, report);
110 
112  for (int p = 0; p < net1NumPts; p++) {
113  PvlObject &point = net1Obj.object(p);
114  pointMap[point.findKeyword("PointId")[0]].insert(
115  0, point);
116  }
117 
118  for (int p = 0; p < net2NumPts; p++) {
119  PvlObject &point = net2Obj.object(p);
120  pointMap[point.findKeyword("PointId")[0]].insert(
121  1, point);
122  }
123 
124  QList<QString> pointNames = pointMap.keys();
125  for (int i = 0; i < pointNames.size(); i++) {
126  QMap<int, PvlObject> idMap = pointMap[pointNames[i]];
127  if (idMap.size() == 2) {
128  compare(idMap[0], idMap[1], report);
129  }
130  else if (idMap.contains(0)) {
131  addUniquePoint("PointId", idMap[0].findKeyword("PointId")[0], "N/A", report);
132  }
133  else if (idMap.contains(1)) {
134  addUniquePoint("PointId", "N/A", idMap[1].findKeyword("PointId")[0], report);
135  }
136  }
137 
138  delete net1;
139  delete net2;
140 
141  results.addObject(report);
142  return results;
143  }
144 
145 
155  void ControlNetDiff::compare(PvlObject &point1Pvl, PvlObject &point2Pvl, PvlObject &report) {
156  PvlObject pointReport("Point");
157 
158  QString id1 = point1Pvl.findKeyword("PointId")[0];
159  QString id2 = point2Pvl.findKeyword("PointId")[0];
160  pointReport.addKeyword(makeKeyword("PointId", id1, id2));
161 
162  int p1Measures = point1Pvl.groups();
163  int p2Measures = point2Pvl.groups();
164  diff("Measures", toString(p1Measures), toString(p2Measures), pointReport);
165 
166  compareGroups(point1Pvl, point2Pvl, pointReport);
167 
169  for (int m = 0; m < p1Measures; m++) {
170  PvlGroup &measure = point1Pvl.group(m);
171  measureMap[measure.findKeyword("SerialNumber")[0]].insert(
172  0, measure);
173  }
174 
175  for (int m = 0; m < p2Measures; m++) {
176  PvlGroup &measure = point2Pvl.group(m);
177  measureMap[measure.findKeyword("SerialNumber")[0]].insert(
178  1, measure);
179  }
180 
181  QList<QString> measureNames = measureMap.keys();
182  for (int i = 0; i < measureNames.size(); i++) {
183  QMap<int, PvlGroup> idMap = measureMap[measureNames[i]];
184  if (idMap.size() == 2) {
185  compareGroups(idMap[0], idMap[1], pointReport);
186  }
187  else if (idMap.contains(0)) {
188  addUniqueMeasure("SerialNumber", idMap[0].findKeyword("SerialNumber")[0], "N/A", pointReport);
189  }
190  else if (idMap.contains(1)) {
191  addUniqueMeasure("SerialNumber", "N/A", idMap[1].findKeyword("SerialNumber")[0], pointReport);
192  }
193  }
194 
195  if (pointReport.keywords() > 2 || pointReport.groups() > 0)
196  report.addObject(pointReport);
197  }
198 
199 
213  PvlGroup measureReport("Measure");
214  if (g1.hasKeyword("SerialNumber")) {
215  QString sn1 = g1.findKeyword("SerialNumber")[0];
216  QString sn2 = g1.findKeyword("SerialNumber")[0];
217  measureReport.addKeyword(makeKeyword("SerialNumber", sn1, sn2));
218  }
219  PvlContainer &groupReport = g1.hasKeyword("SerialNumber") ?
220  (PvlContainer &) measureReport : (PvlContainer &) report;
221 
223  for (int k = 0; k < g1.keywords(); k++)
224  keywordMap[g1[k].name()].insert(0, g1[k]);
225  for (int k = 0; k < g2.keywords(); k++)
226  keywordMap[g2[k].name()].insert(1, g2[k]);
227 
228  QList<QString> keywordNames = keywordMap.keys();
229  for (int i = 0; i < keywordNames.size(); i++) {
230  QMap<int, PvlKeyword> idMap = keywordMap[keywordNames[i]];
231  if (idMap.size() == 2) {
232  compare(idMap[0], idMap[1], groupReport);
233  }
234  else if (idMap.contains(0)) {
235  QString name = idMap[0].name();
236  if (!m_ignoreKeys->contains(name))
237  diff(name, idMap[0][0], "N/A", groupReport);
238  }
239  else if (idMap.contains(1)) {
240  QString name = idMap[1].name();
241  if (!m_ignoreKeys->contains(name))
242  diff(name, "N/A", idMap[1][0], groupReport);
243  }
244  }
245 
246  if (measureReport.keywords() > 1) report.addGroup(measureReport);
247  }
248 
249 
265  QString name = k1.name();
266  if (m_tolerances->contains(name))
267  diff(name, toDouble(k1[0]), toDouble(k2[0]), (*m_tolerances)[name], report);
268  else
269  diff(name, k1[0], k2[0], report);
270  }
271 
272 
283  void ControlNetDiff::diff(QString name, PvlObject &o1, PvlObject &o2, PvlContainer &report) {
284  QString v1 = o1[name][0];
285  QString v2 = o2[name][0];
286  diff(name, v1, v2, report);
287  }
288 
289 
301  void ControlNetDiff::diff(QString name, QString v1, QString v2, PvlContainer &report) {
302  if (!m_ignoreKeys->contains(name)) {
303  if (v1 != v2) report.addKeyword(makeKeyword(name, v1, v2));
304  }
305  }
306 
307 
317  PvlKeyword ControlNetDiff::makeKeyword(QString name, QString v1, QString v2) {
318  PvlKeyword keyword(name);
319  keyword.addValue(v1);
320  if (v1 != v2) keyword.addValue(v2);
321  return keyword;
322  }
323 
324 
338  void ControlNetDiff::diff(QString name, double v1, double v2, double tol, PvlContainer &report) {
339  if (!m_ignoreKeys->contains(name)) {
340  if (fabs(v1 - v2) > tol) report.addKeyword(makeKeyword(name, v1, v2, tol));
341  }
342  }
343 
344 
356  PvlKeyword ControlNetDiff::makeKeyword(QString name, double v1, double v2, double tol) {
357  PvlKeyword keyword(name);
358  keyword.addValue(toString(v1));
359  if (fabs(v1 - v2) > tol) {
360  keyword.addValue(toString(v2));
361  keyword.addValue(toString(tol));
362  }
363  return keyword;
364  }
365 
366 
376  void ControlNetDiff::addUniquePoint(QString label, QString v1, QString v2, PvlObject &parent) {
377  PvlObject point("Point");
378 
379  PvlKeyword keyword(label);
380  keyword.addValue(v1);
381  keyword.addValue(v2);
382  point.addKeyword(keyword);
383 
384  parent.addObject(point);
385  }
386 
387 
398  void ControlNetDiff::addUniqueMeasure(QString label, QString v1, QString v2, PvlObject &parent) {
399  PvlGroup measure("Measure");
400 
401  PvlKeyword keyword(label);
402  keyword.addValue(v1);
403  keyword.addValue(v2);
404  measure.addKeyword(keyword);
405 
406  parent.addGroup(measure);
407  }
408 
409 
416  m_tolerances = NULL;
417  m_ignoreKeys = NULL;
418 
421 
422  m_ignoreKeys->insert("DateTime");
423  }
424 }
425