|
Isis 3.0 Object Programmers' Reference |
Home |
00001 #include "IsisDebug.h" 00002 00003 #include "ControlNetDiff.h" 00004 00005 #include <QMap> 00006 #include <QSet> 00007 #include <QString> 00008 00009 #include "ControlMeasure.h" 00010 #include "ControlNet.h" 00011 #include "ControlNetFile.h" 00012 #include "ControlNetVersioner.h" 00013 #include "ControlPoint.h" 00014 #include "FileName.h" 00015 #include "Pvl.h" 00016 #include "PvlContainer.h" 00017 #include "PvlGroup.h" 00018 #include "PvlKeyword.h" 00019 #include "PvlObject.h" 00020 00021 00022 using std::cerr; 00023 using std::cout; 00024 using std::endl; 00025 00026 namespace Isis { 00027 00031 ControlNetDiff::ControlNetDiff() { 00032 init(); 00033 } 00034 00035 00041 ControlNetDiff::ControlNetDiff(Pvl &diffFile) { 00042 init(); 00043 addTolerances(diffFile); 00044 } 00045 00046 00050 ControlNetDiff::~ControlNetDiff() { 00051 delete m_tolerances; 00052 m_tolerances = NULL; 00053 00054 delete m_ignoreKeys; 00055 m_ignoreKeys = NULL; 00056 } 00057 00058 00066 void ControlNetDiff::addTolerances(Pvl &diffFile) { 00067 if (diffFile.HasGroup("Tolerances")) { 00068 PvlGroup tolerances = diffFile.FindGroup("Tolerances"); 00069 for (int i = 0; i < tolerances.Keywords(); i++) 00070 m_tolerances->insert(tolerances[i].Name(), 00071 toDouble(tolerances[i][0])); 00072 } 00073 00074 if (diffFile.HasGroup("IgnoreKeys")) { 00075 PvlGroup ignoreKeys = diffFile.FindGroup("IgnoreKeys"); 00076 for (int i = 0; i < ignoreKeys.Keywords(); i++) 00077 m_ignoreKeys->insert(ignoreKeys[i].Name()); 00078 } 00079 } 00080 00081 00090 Pvl ControlNetDiff::compare(FileName &net1Name, FileName &net2Name) { 00091 Pvl results; 00092 PvlObject report("Differences"); 00093 00094 LatestControlNetFile *net1 = ControlNetVersioner::Read(net1Name.expanded()); 00095 LatestControlNetFile *net2 = ControlNetVersioner::Read(net2Name.expanded()); 00096 diff("Filename", net1Name.name(), net2Name.name(), report); 00097 00098 Pvl net1Pvl(net1->ToPvl()); 00099 Pvl net2Pvl(net2->ToPvl()); 00100 00101 PvlObject &net1Obj = net1Pvl.FindObject("ControlNetwork"); 00102 PvlObject &net2Obj = net2Pvl.FindObject("ControlNetwork"); 00103 00104 BigInt net1NumPts = net1Obj.Objects(); 00105 BigInt net2NumPts = net2Obj.Objects(); 00106 diff("Points", toString(net1NumPts), toString(net2NumPts), report); 00107 00108 diff("NetworkId", net1Obj, net2Obj, report); 00109 diff("TargetName", net1Obj, net2Obj, report); 00110 00111 QMap< QString, QMap<int, PvlObject> > pointMap; 00112 for (int p = 0; p < net1NumPts; p++) { 00113 PvlObject &point = net1Obj.Object(p); 00114 pointMap[point.FindKeyword("PointId")[0]].insert( 00115 0, point); 00116 } 00117 00118 for (int p = 0; p < net2NumPts; p++) { 00119 PvlObject &point = net2Obj.Object(p); 00120 pointMap[point.FindKeyword("PointId")[0]].insert( 00121 1, point); 00122 } 00123 00124 QList<QString> pointNames = pointMap.keys(); 00125 for (int i = 0; i < pointNames.size(); i++) { 00126 QMap<int, PvlObject> idMap = pointMap[pointNames[i]]; 00127 if (idMap.size() == 2) { 00128 compare(idMap[0], idMap[1], report); 00129 } 00130 else if (idMap.contains(0)) { 00131 addUniquePoint("PointId", idMap[0].FindKeyword("PointId")[0], "N/A", report); 00132 } 00133 else if (idMap.contains(1)) { 00134 addUniquePoint("PointId", "N/A", idMap[1].FindKeyword("PointId")[0], report); 00135 } 00136 } 00137 00138 delete net1; 00139 delete net2; 00140 00141 results.AddObject(report); 00142 return results; 00143 } 00144 00145 00155 void ControlNetDiff::compare(PvlObject &point1Pvl, PvlObject &point2Pvl, PvlObject &report) { 00156 PvlObject pointReport("Point"); 00157 00158 QString id1 = point1Pvl.FindKeyword("PointId")[0]; 00159 QString id2 = point2Pvl.FindKeyword("PointId")[0]; 00160 pointReport.AddKeyword(makeKeyword("PointId", id1, id2)); 00161 00162 int p1Measures = point1Pvl.Groups(); 00163 int p2Measures = point2Pvl.Groups(); 00164 diff("Measures", toString(p1Measures), toString(p2Measures), pointReport); 00165 00166 compareGroups(point1Pvl, point2Pvl, pointReport); 00167 00168 QMap< QString, QMap<int, PvlGroup> > measureMap; 00169 for (int m = 0; m < p1Measures; m++) { 00170 PvlGroup &measure = point1Pvl.Group(m); 00171 measureMap[measure.FindKeyword("SerialNumber")[0]].insert( 00172 0, measure); 00173 } 00174 00175 for (int m = 0; m < p2Measures; m++) { 00176 PvlGroup &measure = point2Pvl.Group(m); 00177 measureMap[measure.FindKeyword("SerialNumber")[0]].insert( 00178 1, measure); 00179 } 00180 00181 QList<QString> measureNames = measureMap.keys(); 00182 for (int i = 0; i < measureNames.size(); i++) { 00183 QMap<int, PvlGroup> idMap = measureMap[measureNames[i]]; 00184 if (idMap.size() == 2) { 00185 compareGroups(idMap[0], idMap[1], pointReport); 00186 } 00187 else if (idMap.contains(0)) { 00188 addUniqueMeasure("SerialNumber", idMap[0].FindKeyword("SerialNumber")[0], "N/A", pointReport); 00189 } 00190 else if (idMap.contains(1)) { 00191 addUniqueMeasure("SerialNumber", "N/A", idMap[1].FindKeyword("SerialNumber")[0], pointReport); 00192 } 00193 } 00194 00195 if (pointReport.Keywords() > 2 || pointReport.Groups() > 0) 00196 report.AddObject(pointReport); 00197 } 00198 00199 00212 void ControlNetDiff::compareGroups(PvlContainer &g1, PvlContainer &g2, PvlObject &report) { 00213 PvlGroup measureReport("Measure"); 00214 if (g1.HasKeyword("SerialNumber")) { 00215 QString sn1 = g1.FindKeyword("SerialNumber")[0]; 00216 QString sn2 = g1.FindKeyword("SerialNumber")[0]; 00217 measureReport.AddKeyword(makeKeyword("SerialNumber", sn1, sn2)); 00218 } 00219 PvlContainer &groupReport = g1.HasKeyword("SerialNumber") ? 00220 (PvlContainer &) measureReport : (PvlContainer &) report; 00221 00222 QMap< QString, QMap<int, PvlKeyword> > keywordMap; 00223 for (int k = 0; k < g1.Keywords(); k++) 00224 keywordMap[g1[k].Name()].insert(0, g1[k]); 00225 for (int k = 0; k < g2.Keywords(); k++) 00226 keywordMap[g2[k].Name()].insert(1, g2[k]); 00227 00228 QList<QString> keywordNames = keywordMap.keys(); 00229 for (int i = 0; i < keywordNames.size(); i++) { 00230 QMap<int, PvlKeyword> idMap = keywordMap[keywordNames[i]]; 00231 if (idMap.size() == 2) { 00232 compare(idMap[0], idMap[1], groupReport); 00233 } 00234 else if (idMap.contains(0)) { 00235 QString name = idMap[0].Name(); 00236 if (!m_ignoreKeys->contains(name)) 00237 diff(name, idMap[0][0], "N/A", groupReport); 00238 } 00239 else if (idMap.contains(1)) { 00240 QString name = idMap[1].Name(); 00241 if (!m_ignoreKeys->contains(name)) 00242 diff(name, "N/A", idMap[1][0], groupReport); 00243 } 00244 } 00245 00246 if (measureReport.Keywords() > 1) report.AddGroup(measureReport); 00247 } 00248 00249 00264 void ControlNetDiff::compare(PvlKeyword &k1, PvlKeyword &k2, PvlContainer &report) { 00265 QString name = k1.Name(); 00266 if (m_tolerances->contains(name)) 00267 diff(name, toDouble(k1[0]), toDouble(k2[0]), (*m_tolerances)[name], report); 00268 else 00269 diff(name, k1[0], k2[0], report); 00270 } 00271 00272 00283 void ControlNetDiff::diff(QString name, PvlObject &o1, PvlObject &o2, PvlContainer &report) { 00284 QString v1 = o1[name][0]; 00285 QString v2 = o2[name][0]; 00286 diff(name, v1, v2, report); 00287 } 00288 00289 00301 void ControlNetDiff::diff(QString name, QString v1, QString v2, PvlContainer &report) { 00302 if (!m_ignoreKeys->contains(name)) { 00303 if (v1 != v2) report.AddKeyword(makeKeyword(name, v1, v2)); 00304 } 00305 } 00306 00307 00317 PvlKeyword ControlNetDiff::makeKeyword(QString name, QString v1, QString v2) { 00318 PvlKeyword keyword(name); 00319 keyword.AddValue(v1); 00320 if (v1 != v2) keyword.AddValue(v2); 00321 return keyword; 00322 } 00323 00324 00338 void ControlNetDiff::diff(QString name, double v1, double v2, double tol, PvlContainer &report) { 00339 if (!m_ignoreKeys->contains(name)) { 00340 if (fabs(v1 - v2) > tol) report.AddKeyword(makeKeyword(name, v1, v2, tol)); 00341 } 00342 } 00343 00344 00356 PvlKeyword ControlNetDiff::makeKeyword(QString name, double v1, double v2, double tol) { 00357 PvlKeyword keyword(name); 00358 keyword.AddValue(toString(v1)); 00359 if (fabs(v1 - v2) > tol) { 00360 keyword.AddValue(toString(v2)); 00361 keyword.AddValue(toString(tol)); 00362 } 00363 return keyword; 00364 } 00365 00366 00376 void ControlNetDiff::addUniquePoint(QString label, QString v1, QString v2, PvlObject &parent) { 00377 PvlObject point("Point"); 00378 00379 PvlKeyword keyword(label); 00380 keyword.AddValue(v1); 00381 keyword.AddValue(v2); 00382 point.AddKeyword(keyword); 00383 00384 parent.AddObject(point); 00385 } 00386 00387 00398 void ControlNetDiff::addUniqueMeasure(QString label, QString v1, QString v2, PvlObject &parent) { 00399 PvlGroup measure("Measure"); 00400 00401 PvlKeyword keyword(label); 00402 keyword.AddValue(v1); 00403 keyword.AddValue(v2); 00404 measure.AddKeyword(keyword); 00405 00406 parent.AddGroup(measure); 00407 } 00408 00409 00415 void ControlNetDiff::init() { 00416 m_tolerances = NULL; 00417 m_ignoreKeys = NULL; 00418 00419 m_tolerances = new QMap<QString, double>; 00420 m_ignoreKeys = new QSet<QString>; 00421 00422 m_ignoreKeys->insert("DateTime"); 00423 } 00424 } 00425