USGS

Isis 3.0 Object Programmers' Reference

Home

ControlNetDiff.cpp

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