9#include "ControlNetDiff.h"
15#include "ControlMeasure.h"
16#include "ControlNet.h"
17#include "ControlNetVersioner.h"
18#include "ControlPoint.h"
21#include "PvlContainer.h"
23#include "PvlKeyword.h"
67 if (diffFile.hasGroup(
"Tolerances")) {
68 PvlGroup tolerances = diffFile.findGroup(
"Tolerances");
69 for (
int i = 0; i < tolerances.keywords(); i++)
74 if (diffFile.hasGroup(
"IgnoreKeys")) {
75 PvlGroup ignoreKeys = diffFile.findGroup(
"IgnoreKeys");
76 for (
int i = 0; i < ignoreKeys.keywords(); i++)
94 diff(
"Filename", net1Name.name(), net2Name.name(), report);
99 BigInt net1NumPts = cnv1.numPoints();
100 BigInt net2NumPts = cnv2.numPoints();
103 diff(
"NetworkId", cnv1.netId(), cnv2.netId(), report);
104 diff(
"TargetName", cnv1.targetName(), cnv2.targetName(), report);
106 Pvl net1Pvl = cnv1.toPvl();
107 Pvl net2Pvl = cnv2.toPvl();
112 QMap< QString, QMap<int, PvlObject> > pointMap;
114 for (
int p = 0; p < net1NumPts; p++) {
120 for (
int p = 0; p < net2NumPts; p++) {
126 QList<QString> pointNames = pointMap.keys();
128 for (
int i = 0; i < pointNames.size(); i++) {
129 QMap<int, PvlObject> idMap = pointMap[pointNames[i]];
130 if (idMap.size() == 2) {
131 compare(idMap[0], idMap[1], report);
133 else if (idMap.contains(0)) {
134 addUniquePoint(
"PointId", idMap[0].findKeyword(
"PointId")[0],
"N/A", report);
136 else if (idMap.contains(1)) {
137 addUniquePoint(
"PointId",
"N/A", idMap[1].findKeyword(
"PointId")[0], report);
141 results.addObject(report);
158 QString id1 = point1Pvl.findKeyword(
"PointId")[0];
159 QString id2 = point2Pvl.findKeyword(
"PointId")[0];
160 pointReport.addKeyword(
makeKeyword(
"PointId", id1, id2));
162 int p1Measures = point1Pvl.groups();
163 int p2Measures = point2Pvl.groups();
168 QMap< QString, QMap<int, PvlGroup> > measureMap;
169 for (
int m = 0; m < p1Measures; m++) {
170 PvlGroup &measure = point1Pvl.group(m);
171 measureMap[measure.findKeyword(
"SerialNumber")[0]].insert(
175 for (
int m = 0; m < p2Measures; m++) {
176 PvlGroup &measure = point2Pvl.group(m);
177 measureMap[measure.findKeyword(
"SerialNumber")[0]].insert(
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) {
187 else if (idMap.contains(0)) {
188 addUniqueMeasure(
"SerialNumber", idMap[0].findKeyword(
"SerialNumber")[0],
"N/A", pointReport);
190 else if (idMap.contains(1)) {
191 addUniqueMeasure(
"SerialNumber",
"N/A", idMap[1].findKeyword(
"SerialNumber")[0], pointReport);
195 if (pointReport.keywords() > 2 || pointReport.groups() > 0)
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));
222 QMap< QString, QMap<int, PvlKeyword> > keywordMap;
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]);
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);
234 else if (idMap.contains(0)) {
235 QString name = idMap[0].name();
237 diff(name, idMap[0][0],
"N/A", groupReport);
239 else if (idMap.contains(1)) {
240 QString name = idMap[1].name();
242 diff(name,
"N/A", idMap[1][0], groupReport);
246 if (measureReport.keywords() > 1) report.
addGroup(measureReport);
265 QString name = k1.
name();
269 diff(name, k1[0], k2[0], report);
284 QString v1 = o1[name][0];
285 QString v2 = o2[name][0];
286 diff(name, v1, v2, report);
359 if (fabs(v1 - v2) > tol) {
404 measure.addKeyword(keyword);
void diff(QString name, PvlObject &o1, PvlObject &o2, PvlContainer &report)
Add a new difference keyword to the given report if the PvlObjects have different values for the keyw...
void addTolerances(Pvl &diffFile)
Add the given ignore keys and tolerances to the persisent collections of such values.
QMap< QString, double > * m_tolerances
The map of tolerances going from keyword name to tolerance value.
void addUniquePoint(QString label, QString v1, QString v2, PvlObject &parent)
Add a new keyword for the given point to the parent object.
ControlNetDiff()
Create a ControlNetDiff without any tolerances.
void init()
Initialize the persistent structures used to maintain the state of this instance: its ignore keys and...
void addUniqueMeasure(QString label, QString v1, QString v2, PvlObject &parent)
Add a new keyword for the given measure to the parent object.
QSet< QString > * m_ignoreKeys
The set of keywords to ignore by name.
PvlKeyword makeKeyword(QString name, QString v1, QString v2)
Create a new keyword with the given label name and the given values.
void compareGroups(PvlContainer &g1, PvlContainer &g2, PvlObject &report)
Compare two collections, or groupings, of PvlKeywords.
virtual ~ControlNetDiff()
Destroy the ControlNetDiff.
Pvl compare(FileName &net1Name, FileName &net2Name)
Compare two Control Networks given their file names, and return their differences.
Handle various control network file format versions.
File name manipulation and expansion.
Contains more than one keyword-value pair.
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
QString name() const
Returns the container name.
void addKeyword(const PvlKeyword &keyword, const InsertMode mode=Append)
Add a keyword to the container.
Contains multiple PvlContainers.
Container for cube-like labels.
A single keyword-value pair.
void addValue(QString value, QString unit="")
Adds a value with units.
Contains Pvl Groups and Pvl Objects.
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
PvlObject & object(const int index)
Return the object at the specified index.
void addObject(const PvlObject &object)
Add a PvlObject.
PvlKeyword & findKeyword(const QString &kname, FindOptions opts)
Finds a keyword in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within this...
void addGroup(const Isis::PvlGroup &group)
Add a group to the object.
This is free and unencumbered software released into the public domain.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
long long int BigInt
Big int.
double toDouble(const QString &string)
Global function to convert from a string to a double.