diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0d7d7e1b87..03a89fc83b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,7 +36,8 @@ release.
## [Unreleased]
### Changed
-- Cnetedit has been refactored to be callable; old Makefile tests have been removed and replaced by gtests. Issue: [#5322](https://github.com/USGS-Astrogeology/ISIS3/issues/5322),
+- Cnetedit has been refactored to be callable; old Makefile tests have been removed and replaced by gtests. Issue: [#5346](https://github.com/USGS-Astrogeology/ISIS3/issues/5346),
+- Cnetdiff has been refactored to be callable; old Makefile tests have been removed and replaced by gtests. Issue: [#5322](https://github.com/USGS-Astrogeology/ISIS3/issues/5322),
- Removed the `.py` extention from the _isisdataeval_ tool `isisdata_mockup` for consistency and install it in $ISISROOT/bin; added the `--tojson` and `--hasher` option to _isisdata_mockup_ tool improve utility; updated the tool `README.md` documentation to reflect this change, removed help output and trimmed example results; fixed paths to test data in `make_isisdata_mockup.sh`. [#5163](https://github.com/DOI-USGS/ISIS3/pull/5163)
- Significantly refactored FASTGEOM processing in findfeatures to accommodate stability and functionality. The scope of the algorithm was taken out of the ImageSource class and isolated to support this feature. [#4772](https://github.com/DOI-USGS/ISIS3/issues/4772)
- Report better information regarding the behavior of findfeatures, FASTGEOM algorithms, and creation of the output network. [#4772](https://github.com/DOI-USGS/ISIS3/issues/4772)
diff --git a/isis/src/control/apps/cnetedit/cnetedit.cpp b/isis/src/control/apps/cnetedit/cnetedit.cpp
new file mode 100644
index 0000000000..2e290ddafd
--- /dev/null
+++ b/isis/src/control/apps/cnetedit/cnetedit.cpp
@@ -0,0 +1,1127 @@
+/** This is free and unencumbered software released into the public domain.
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include "cnetedit.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "ControlMeasure.h"
+#include "ControlNet.h"
+#include "ControlNetValidMeasure.h"
+#include "ControlPoint.h"
+#include "ControlPointList.h"
+#include "Cube.h"
+#include "FileName.h"
+#include "MeasureValidationResults.h"
+#include "Progress.h"
+#include "Pvl.h"
+#include "PvlGroup.h"
+#include "PvlKeyword.h"
+#include "PvlObject.h"
+#include "SerialNumber.h"
+#include "SerialNumberList.h"
+#include "IException.h"
+
+using namespace std;
+
+namespace Isis {
+
+ // Deletion test
+ bool shouldDelete(ControlPoint *point);
+
+ // Mutator methods
+ void ignorePoint(ControlNet &cnet, ControlPoint *point, QString cause);
+ void ignoreMeasure(ControlNet &cnet, ControlPoint *point,
+ ControlMeasure *measure, QString cause);
+ void deletePoint(ControlNet &cnet, int cp);
+ void deleteMeasure(ControlPoint *point, int cm);
+
+ // Edit passes
+ void populateLog(ControlNet &cnet, bool ignore);
+
+ void unlockPoints(ControlNet &cnet, ControlPointList &cpList);
+ void ignorePoints(ControlNet &cnet, ControlPointList &cpList);
+ void lockPoints(ControlNet &cnet, ControlPointList &cpList);
+
+ void unlockCubes(ControlNet &cnet, SerialNumberList &snl);
+ void ignoreCubes(ControlNet &cnet, SerialNumberList &snl);
+ void lockCubes(ControlNet &cnet, SerialNumberList &snl);
+
+ void unlockMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures);
+ void ignoreMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures);
+ void lockMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures);
+
+ void checkAllMeasureValidity(ControlNet &cnet, SerialNumberList *serialNumbers);
+
+ // Validity test
+ MeasureValidationResults validateMeasure(const ControlMeasure *measure,
+ Cube *cube, Camera *camera);
+
+ // Logging helpers
+ void logResult(QMap *pointsLog, QString pointId, QString cause);
+ void logResult(QMap *measuresLog,
+ QString pointId, QString serial, QString cause);
+ PvlObject createLog(QString label, QMap *pointsMap);
+ PvlObject createLog(QString label,
+ QMap *pointsMap, QMap *measuresMap);
+
+ // Global variables
+ static int numPointsDeleted;
+ static int numMeasuresDeleted;
+
+ static bool deleteIgnored;
+ static bool preservePoints;
+ static bool retainRef;
+ static bool keepLog;
+ static bool ignoreAll;
+
+ static QMap *ignoredPoints;
+ static QMap *ignoredMeasures;
+ static QMap *retainedReferences;
+ static QMap *editLockedPoints;
+ static QMap *editLockedMeasures;
+
+ static ControlNetValidMeasure *cneteditValidator;
+
+ /**
+ * Edit a control network
+ *
+ * @param ui UserInterface object containing parameters
+ * @return Pvl results log file
+ *
+ * @throws IException::User "Unable to open MEASURELIST [FILENAME]"
+ * @throws IException::User "Line ___ in the MEASURELIST does not contain a Point ID and a cube filename separated by a comma"
+ */
+ Pvl cnetedit(UserInterface &ui) {
+
+ // Construct control net
+ ControlNet cnet(ui.GetFileName("CNET"));
+
+ // List of IDs mapping to points to be edited
+ ControlPointList *cpList = nullptr;
+ if (ui.WasEntered("POINTLIST") && cnet.GetNumPoints() > 0) {
+ cpList = new ControlPointList(ui.GetFileName("POINTLIST"));
+ }
+
+ // Serial number list of cubes to be edited
+ SerialNumberList *cubeSnList = nullptr;
+ if (ui.WasEntered("CUBELIST") && cnet.GetNumPoints() > 0) {
+ cubeSnList = new SerialNumberList(ui.GetFileName("CUBELIST"));
+ }
+
+ // List of paired Point IDs and cube filenames
+ QMap< QString, QSet * > *editMeasuresList = nullptr;
+ if (ui.WasEntered("MEASURELIST") && cnet.GetNumPoints() > 0) {
+
+ QFile file(ui.GetFileName("MEASURELIST"));
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QString msg = "Unable to open MEASURELIST [" +
+ file.fileName() + "]";
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+
+ editMeasuresList = new QMap< QString, QSet * >;
+
+ QTextStream in(&file);
+ int lineNumber = 1;
+ while (!in.atEnd()) {
+ QString line = in.readLine();
+ QStringList results = line.split(",");
+ if (results.size() < 2) {
+ QString msg = "Line " + QString::number(lineNumber) + " in the MEASURELIST does "
+ "not contain a Point ID and a cube filename separated by a comma";
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+
+ if (!editMeasuresList->contains(results[0]))
+ editMeasuresList->insert(results[0], new QSet);
+
+ FileName cubeName(results[1]);
+ QString sn = SerialNumber::Compose(cubeName.expanded());
+ (*editMeasuresList)[results[0]]->insert(sn);
+
+ lineNumber++;
+ }
+ }
+
+ // DefFile and cube serial number list for Validity check
+ Pvl *defFile = nullptr;
+ SerialNumberList *snValidationList = nullptr;
+ if (ui.GetBoolean("CHECKVALID") && cnet.GetNumPoints() > 0) {
+ cneteditValidator = nullptr;
+
+ // Open DefFile and validate its' keywords and value type
+ defFile = new Pvl(ui.GetFileName("DEFFILE"));
+
+ // create cube serial number validation list
+ snValidationList = new SerialNumberList(ui.GetFileName("FROMLIST"));
+ }
+
+
+ // call cnetedit with ControlNet plus list files and/or definition files (if any)
+ Pvl results = cnetedit(cnet, ui, cpList, cubeSnList, editMeasuresList, defFile, snValidationList);
+
+ // clean up
+ delete cpList;
+ cpList = nullptr;
+
+ delete cubeSnList;
+ cubeSnList = nullptr;
+
+ if (editMeasuresList != nullptr) {
+ QList points = editMeasuresList->keys();
+ for (int i = 0; i < points.size(); i++) delete (*editMeasuresList)[points[i]];
+ delete editMeasuresList;
+ editMeasuresList = nullptr;
+ }
+
+ delete defFile;
+ defFile = nullptr;
+
+ delete snValidationList;
+ snValidationList = nullptr;
+
+ return results;
+ }
+
+
+ /**
+ * Edit a control network
+ *
+ * @param ControlNet cnet
+ * @param UserInterface ui
+ * @param ControlPointList cpList
+ * @param SerialNumberList cubeSnl
+ * @param QMap< QString, QSet * > editMeasuresList
+ * @param Pvl defFile
+ * @param SerialNumberList snValidationList
+ *
+ * @return Pvl results log file
+ *
+ * @throws IException::User "Invalid Deffile"
+ */
+ Pvl cnetedit(ControlNet &cnet, UserInterface &ui,
+ ControlPointList *cpList,
+ SerialNumberList *cubeSnl,
+ QMap< QString, QSet * > *editMeasuresList,
+ Pvl *defFile,
+ SerialNumberList *snValidationList) {
+
+ Pvl results;
+
+ // 2016-12-08 Ian Humphrey - Set the QHash seed, otherwise output is ALWAYS slightly
+ // different. Note that in Qt4, the seed was constant, but in Qt5, the seed is
+ // created differently for each process. Fixes #4206.
+ qSetGlobalQHashSeed(0);
+
+ // Reset the counts of points and measures deleted
+ numPointsDeleted = 0;
+ numMeasuresDeleted = 0;
+
+ // Get global user parameters
+ bool ignore = ui.GetBoolean("IGNORE");
+ deleteIgnored = ui.GetBoolean("DELETE");
+ preservePoints = ui.GetBoolean("PRESERVE");
+ retainRef = ui.GetBoolean("RETAIN_REFERENCE");
+ ignoreAll = ui.GetBoolean("IGNOREALL");
+
+ // Data needed to keep track of ignored/deleted points and measures
+ keepLog = ui.WasEntered("LOG");
+ ignoredPoints = NULL;
+ ignoredMeasures = NULL;
+ retainedReferences = NULL;
+ editLockedPoints = NULL;
+ editLockedMeasures = NULL;
+
+ // If the user wants to keep a log, go ahead and populate it with all the
+ // existing ignored points and measures
+ if (keepLog && cnet.GetNumPoints() > 0)
+ populateLog(cnet, ignore);
+
+ // List has Points Ids
+ bool processPoints = false;
+ if (cpList != nullptr) {
+ processPoints = true;
+ }
+
+ // List has Cube file names
+ bool processCubes = false;
+ if (cubeSnl != nullptr) {
+ processCubes = true;
+ }
+
+ // List has measurelist file names
+ bool processMeasures = false;
+ if (editMeasuresList != nullptr) {
+ processMeasures = true;
+ }
+
+ if (ui.GetBoolean("UNLOCK")) {
+ if (processPoints) unlockPoints(cnet, *cpList);
+ if (processCubes) unlockCubes(cnet, *cubeSnl);
+ if (processMeasures) unlockMeasures(cnet, *editMeasuresList);
+ }
+
+ /*
+ * As a first pass, just try and delete anything that's already ignored
+ * in the Control Network, if the user wants to delete ignored points and
+ * measures. Originally, this check was performed last, only if the user
+ * didn't specify any other deletion methods. However, performing this
+ * check first will actually improve the running time in cases where there
+ * are already ignored points and measures in the input network. The added
+ * cost of doing this check here actually doesn't add to the running time at
+ * all, because these same checks would need to have been done later
+ * regardless.
+ */
+ if (deleteIgnored && cnet.GetNumPoints() > 0) {
+ Progress progress;
+ progress.SetText("Deleting Ignored in Input");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+ if (point->IsIgnored()) {
+ deletePoint(cnet, cp);
+ }
+ else {
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ if (point->GetMeasure(cm)->IsIgnored()) {
+ if (cm == point->IndexOfRefMeasure() && ignoreAll) {
+ // If the reference is ignored and IgnoreAll is set, the point must ignored too
+ ignorePoint(cnet, point, "Reference measure ignored");
+ }
+ else {
+ deleteMeasure(point, cm);
+ }
+ }
+ }
+
+ // Check if the number of measures in the point is zero or there are too
+ // few measures in the point and we don't want to preserve them.
+ if (shouldDelete(point)) {
+ deletePoint(cnet, cp);
+ }
+ }
+
+ progress.CheckStatus();
+ }
+ }
+
+ if (ignore) {
+ if (processPoints) ignorePoints(cnet, *cpList);
+ if (processCubes) ignoreCubes(cnet, *cubeSnl);
+ if (processMeasures) ignoreMeasures(cnet, *editMeasuresList);
+
+ // Perform validity check
+ if (ui.GetBoolean("CHECKVALID") && cnet.GetNumPoints() > 0) {
+ cneteditValidator = NULL;
+
+ // First validate DefFile's keywords and value type
+ Pvl defFile(ui.GetFileName("DEFFILE"));
+ Pvl pvlTemplate("$ISISROOT/appdata/templates/cnet_validmeasure/validmeasure.def");
+ Pvl pvlResults;
+ pvlTemplate.validatePvl(defFile, pvlResults);
+ if (pvlResults.groups() > 0 || pvlResults.keywords() > 0) {
+ results.addLogGroup(pvlResults.group(0));
+
+ QString sErrMsg = "Invalid Deffile\n";
+ throw IException(IException::User, sErrMsg, _FILEINFO_);
+ }
+
+ // Construct the validator from the user-specified definition file
+ cneteditValidator = new ControlNetValidMeasure(defFile);
+
+ // User also provided a list of all serial numbers corresponding to every
+ // cube in the control network
+ checkAllMeasureValidity(cnet, snValidationList);
+
+ // Delete the validator
+ if (cneteditValidator != NULL) {
+ delete cneteditValidator;
+ cneteditValidator = NULL;
+ }
+
+ // Log the DEFFILE to the print file
+ results.addLogGroup(defFile.findGroup("ValidMeasure", Pvl::Traverse));
+ }
+ }
+
+ if (ui.GetBoolean("LOCK")) {
+ if (processPoints) lockPoints(cnet, *cpList);
+ if (processCubes) lockCubes(cnet, *cubeSnl);
+ if (processMeasures) lockMeasures(cnet, *editMeasuresList);
+ }
+
+ // Log statistics
+ if (keepLog) {
+ Pvl outputLog;
+
+ outputLog.addKeyword(PvlKeyword("PointsDeleted", toString(numPointsDeleted)));
+ outputLog.addKeyword(PvlKeyword("MeasuresDeleted", toString(numMeasuresDeleted)));
+
+ PvlObject lockedLog = createLog(
+ "EditLocked", editLockedPoints, editLockedMeasures);
+ outputLog.addObject(lockedLog);
+
+ outputLog.addObject(createLog("RetainedReferences", retainedReferences));
+
+ // Depending on whether the user chose to delete ignored points and
+ // measures, the log will either contain reasons for being ignored, or
+ // reasons for being deleted
+ PvlObject ignoredLog = createLog(
+ deleteIgnored ? "Deleted" : "Ignored", ignoredPoints, ignoredMeasures);
+ outputLog.addObject(ignoredLog);
+
+ // Write the log
+ QString logFileName = ui.GetFileName("LOG");
+ outputLog.write(logFileName);
+
+ // Delete the structures keeping track of the ignored points and measures
+ delete ignoredPoints;
+ ignoredPoints = NULL;
+
+ delete ignoredMeasures;
+ ignoredMeasures = NULL;
+
+ delete retainedReferences;
+ retainedReferences = NULL;
+
+ delete editLockedPoints;
+ editLockedPoints = NULL;
+
+ delete editLockedMeasures;
+ editLockedMeasures = NULL;
+ }
+
+ // Write the network
+ cnet.Write(ui.GetFileName("ONET"));
+
+ return results;
+ }
+
+
+ /**
+ * After any modification to a point's measures or ignored status, this check
+ * should be performed to determine if the changes should result in the point's
+ * deletion.
+ *
+ * @param point The Control Point recently modified
+ *
+ * @return Whether or not the point should be deleted
+ */
+ bool shouldDelete(ControlPoint *point){
+
+ if(!deleteIgnored)
+ return false;
+
+ else{
+
+ if ( point->GetNumMeasures() == 0 && !preservePoints)
+ return true;
+
+
+ if (point->GetType() != ControlPoint::Fixed && point->GetNumMeasures()< 2 ){
+
+ if(preservePoints && point->GetNumMeasures() == 1)
+ return false;
+
+ return true; //deleteIgnore = TRUE or else we would not be here
+ }
+
+
+ if( point->IsIgnored() )
+ return true;
+
+ return false;
+ }
+ }
+
+
+ /**
+ * Set the point at the given index in the control network to ignored, and add
+ * a new keyword to the list of ignored points with a cause for the ignoring,
+ * if the user wished to keep a log.
+ *
+ * @param cnet The Control Network being modified
+ * @param point The Control Point we wish to ignore
+ * @param cause A prose description of why the point was ignored (for logging)
+ */
+ void ignorePoint(ControlNet &cnet, ControlPoint *point, QString cause) {
+ ControlPoint::Status result = point->SetIgnored(true);
+
+ logResult(result == ControlPoint::Success ? ignoredPoints : editLockedPoints,
+ point->GetId(), cause);
+ }
+
+
+ /**
+ * Set the measure to be ignored, and add a new keyword to the list of ignored
+ * measures if the user wished to keep a log.
+ *
+ * @param cnet The Control Network being modified
+ * @param point The Control Point of the Control Measure we wish to ignore
+ * @param measure The Control Measure we wish to ignore
+ * @param cause A prose description of why the measure was ignored (for
+ * logging)
+ */
+ void ignoreMeasure(ControlNet &cnet, ControlPoint *point,
+ ControlMeasure *measure, QString cause) {
+ ControlMeasure::Status result = measure->SetIgnored(true);
+
+ logResult(
+ result == ControlMeasure::Success ? ignoredMeasures : editLockedMeasures,
+ point->GetId(), measure->GetCubeSerialNumber(), cause);
+
+ if (ignoreAll && measure->Parent()->GetRefMeasure() == measure) {
+ foreach (ControlMeasure *cm, measure->Parent()->getMeasures()) {
+ if (!cm->IsIgnored())
+ ignoreMeasure(cnet, measure->Parent(), cm, "Reference ignored");
+ }
+ }
+ }
+
+
+ /**
+ * Delete the point, record how many points and measures have been deleted.
+ *
+ * @param cnet The Control Network being modified
+ * @param cp Index into the Control Network for the point we wish to delete
+ */
+ void deletePoint(ControlNet &cnet, int cp) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ // Do the edit lock check up front so we don't accidentally log that a point
+ // was deleted when in fact it was not
+ if (!point->IsEditLocked()) {
+ numMeasuresDeleted += point->GetNumMeasures();
+ numPointsDeleted++;
+
+ if (keepLog) {
+ // If the point's being deleted but it wasn't set to ignore, it can only
+ // be because the point has two few measures remaining
+ if (!point->IsIgnored())
+ ignorePoint(cnet, point, "Too few measures");
+
+ // For any measures not ignored, mark their cause for deletion as being
+ // caused by the point's deletion
+ for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+ if (!measure->IsIgnored())
+ ignoreMeasure(cnet, point, measure, "Point deleted");
+ }
+ }
+
+ cnet.DeletePoint(cp);
+ }
+ else {
+ for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
+ if (point->GetMeasure(cm)->IsEditLocked()) {
+ ignorePoint(cnet, point, "EditLocked point skipped");
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Delete the measure, increment the count of measures deleted.
+ *
+ * @param point The Control Point of the Control Measure we wish to delete
+ * @param cm Index into the Control Network for the measure we wish to delete
+ */
+ void deleteMeasure(ControlPoint *point, int cm) {
+ if (point->Delete(cm) == ControlMeasure::Success) numMeasuresDeleted++;
+ }
+
+
+ /**
+ * Seed the log with points and measures already ignored.
+ *
+ * @param cnet The Control Network being modified
+ */
+ void populateLog(ControlNet &cnet, bool ignore) {
+ ignoredPoints = new QMap;
+ ignoredMeasures = new QMap;
+
+ retainedReferences = new QMap;
+
+ editLockedPoints = new QMap;
+ editLockedMeasures = new QMap;
+
+ Progress progress;
+ progress.SetText("Initializing Log File");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = 0; cp < cnet.GetNumPoints(); cp++) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ if (point->IsIgnored()) {
+ ignorePoint(cnet, point, "Ignored from input");
+ }
+
+ for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ if (measure->IsIgnored()) {
+ if (cm == point->IndexOfRefMeasure() && ignoreAll) {
+ if (ignore && !point->IsIgnored()) {
+ ignorePoint(cnet, point, "Reference measure ignored");
+ }
+ }
+
+ ignoreMeasure(cnet, point, measure, "Ignored from input");
+ }
+ }
+
+ progress.CheckStatus();
+ }
+ }
+
+
+ void unlockPoints(ControlNet &cnet, ControlPointList &cpList) {
+ Progress progress;
+ progress.SetText("Unlocking Points");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+ if (point->IsEditLocked() && cpList.HasControlPoint(point->GetId())) {
+ point->SetEditLock(false);
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Iterates over the points in the Control Network looking for a match in the
+ * list of Control Points to be ignored. If a match is found, ignore the
+ * point, and if the DELETE option was selected, the point will then be deleted
+ * from the network.
+ *
+ * @param cnet The Control Network being modified
+ * @param cpList List of Control Points
+ */
+ void ignorePoints(ControlNet &cnet, ControlPointList &cpList) {
+ Progress progress;
+ progress.SetText("Comparing Points to POINTLIST");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ // Compare each Point Id listed with the Point in the
+ // Control Network for according exclusion
+ if (!point->IsIgnored() && cpList.HasControlPoint(point->GetId())) {
+ ignorePoint(cnet, point, "Point ID in POINTLIST");
+ }
+
+ if (deleteIgnored) {
+ //look for previously ignored control points
+ if (point->IsIgnored()) {
+ deletePoint(cnet, cp);
+ }
+ else {
+ //look for previously ignored control measures
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ if (point->GetMeasure(cm)->IsIgnored() && deleteIgnored) {
+ deleteMeasure(point, cm);
+ }
+ }
+ // Check if there are too few measures in the point or the point was
+ // previously ignored
+ if (shouldDelete(point)) {
+ deletePoint(cnet, cp);
+ }
+ }
+ }
+
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Lock points.
+ *
+ * @param ControlNet Input ControlNet
+ * @param ControlPointList List of points to lock
+ */
+ void lockPoints(ControlNet &cnet, ControlPointList &cpList) {
+ Progress progress;
+ progress.SetText("Locking Points");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+ if (!point->IsEditLocked() && cpList.HasControlPoint(point->GetId())) {
+ point->SetEditLock(true);
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Unlock cubes.
+ *
+ * @param ControlNet Input ControlNet
+ * @param SerialNumberList List of cubes to unlock
+ */
+ void unlockCubes(ControlNet &cnet, SerialNumberList &snl) {
+ Progress progress;
+ progress.SetText("Unlocking Cubes");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+ if (measure->IsEditLocked() && snl.hasSerialNumber(serialNumber)) {
+ measure->SetEditLock(false);
+ }
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Iterates over the list of Control Measures in the Control Network and
+ * compares measure serial numbers with those in the input list of serial
+ * numbers to be ignored. If a match is found, ignore the measure. If the
+ * DELETE option was selected, the measure will then be deleted from the
+ * network.
+ *
+ * @param cnet The Control Network being modified
+ * @param snl List of Serial Numbers to be ignored
+ */
+ void ignoreCubes(ControlNet &cnet, SerialNumberList &snl) {
+ Progress progress;
+ progress.SetText("Comparing Measures to CUBELIST");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ // Compare each Serial Number listed with the serial number in the
+ // Control Measure for according exclusion
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ if (!point->IsIgnored() && point->GetMeasure(cm)->IsEditLocked()) {
+ ignoreMeasure(cnet, point, measure, "EditLocked measure skipped");
+ }
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+
+ if (snl.hasSerialNumber(serialNumber)) {
+ QString cause = "Serial Number in CUBELIST";
+ if (cm == point->IndexOfRefMeasure() && retainRef) {
+ logResult(retainedReferences, point->GetId(), cause);
+ }
+ else if (!measure->IsIgnored() || cm == point->IndexOfRefMeasure()) {
+ ignoreMeasure(cnet, point, measure, cause);
+
+ if (cm == point->IndexOfRefMeasure() && !point->IsIgnored() && ignoreAll) {
+ ignorePoint(cnet, point, "Reference measure ignored");
+ }
+ }
+ }
+
+ // also look for previously ignored control measures
+ if (deleteIgnored && measure->IsIgnored()) {
+ deleteMeasure(point, cm);
+ }
+ }
+ // Check if there are too few measures in the point or the point was
+ // previously ignored
+ if (shouldDelete(point)) {
+ deletePoint(cnet, cp);
+ }
+
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Lock cubes.
+ *
+ * @param ControlNet Input ControlNet
+ * @param SerialNumberList List of cubes to Lock
+ */
+ void lockCubes(ControlNet &cnet, SerialNumberList &snl) {
+ Progress progress;
+ progress.SetText("Locking Cubes");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+ if (!measure->IsEditLocked() && snl.hasSerialNumber(serialNumber)) {
+ measure->SetEditLock(true);
+ }
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Unlock measures.
+ *
+ * @param ControlNet Input ControlNet
+ * @param QMap< QString, QSet * > Measures to unlock
+ */
+ void unlockMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures) {
+
+ Progress progress;
+ progress.SetText("Unlocking Measures");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ QString id = point->GetId();
+ if (editMeasures.contains(id)) {
+ QSet *measureSet = editMeasures[id];
+
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+ if (measure->IsEditLocked() && measureSet->contains(serialNumber)) {
+ measure->SetEditLock(false);
+ }
+ }
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Ignore measures.
+ *
+ * @param ControlNet Input ControlNet
+ * @param QMap< QString, QSet * > Measures to ignore
+ */
+ void ignoreMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures) {
+
+ Progress progress;
+ progress.SetText("Ignoring Measures");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ QString id = point->GetId();
+ if (editMeasures.contains(id)) {
+ QSet *measureSet = editMeasures[id];
+
+ // Compare each Serial Number listed with the serial number in the
+ // Control Measure for according exclusion
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ if (!point->IsIgnored() && point->GetMeasure(cm)->IsEditLocked()) {
+ ignoreMeasure(cnet, point, measure, "EditLocked measure skipped");
+ }
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+ if (measureSet->contains(serialNumber)) {
+ QString cause = "Measure in MEASURELIST";
+ if (cm == point->IndexOfRefMeasure() && retainRef) {
+ logResult(retainedReferences, point->GetId(), cause);
+ }
+ else if (!measure->IsIgnored() || cm == point->IndexOfRefMeasure()) {
+ ignoreMeasure(cnet, point, measure, cause);
+
+ if (cm == point->IndexOfRefMeasure() && !point->IsIgnored() && ignoreAll) {
+ ignorePoint(cnet, point, "Reference measure ignored");
+ }
+ }
+ }
+
+ // also look for previously ignored control measures
+ if (deleteIgnored && measure->IsIgnored()) {
+ deleteMeasure(point, cm);
+ }
+ }
+ // Check if there are too few measures in the point or the point was
+ // previously ignored
+ if (shouldDelete(point)) {
+ deletePoint(cnet, cp);
+ }
+ }
+
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Lock measures.
+ *
+ * @param ControlNet Input ControlNet
+ * @param QMap< QString, QSet * > Measures to lock
+ */
+ void lockMeasures(ControlNet &cnet,
+ QMap< QString, QSet * > &editMeasures) {
+
+ Progress progress;
+ progress.SetText("Locking Measures");
+ progress.SetMaximumSteps(cnet.GetNumPoints());
+ progress.CheckStatus();
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ QString id = point->GetId();
+ if (editMeasures.contains(id)) {
+ QSet *measureSet = editMeasures[id];
+
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ QString serialNumber = measure->GetCubeSerialNumber();
+ if (!measure->IsEditLocked() && measureSet->contains(serialNumber)) {
+ measure->SetEditLock(true);
+ }
+ }
+ }
+ progress.CheckStatus();
+ }
+ }
+
+
+ /**
+ * Compare each measure in the Control Network against tolerances specified in
+ * the input DEFFILE. Ignore any measure whose values fall outside the valid
+ * tolerances, and delete it if the user specified to do so.
+ *
+ * @param cnet The Control Network being modified
+ * @param serialNumbers List of all Serial Numbers in the network
+ */
+ void checkAllMeasureValidity(ControlNet &cnet, SerialNumberList *serialNumbers) {
+
+ QList cnetSerials = cnet.GetCubeSerials();
+ Progress progress;
+ progress.SetText("Checking Measure Validity");
+ progress.SetMaximumSteps(cnetSerials.size());
+ progress.CheckStatus();
+
+ foreach (QString serialNumber, cnetSerials) {
+
+ Cube *cube = NULL;
+ Camera *camera = NULL;
+ if (cneteditValidator->IsCubeRequired()) {
+ if (!serialNumbers->hasSerialNumber(serialNumber)) {
+ QString msg = "Serial Number [" + serialNumber + "] contains no ";
+ msg += "matching cube in FROMLIST";
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+
+ cube = new Cube;
+ cube->open(serialNumbers->fileName(serialNumber));
+
+ if (cneteditValidator->IsCameraRequired()) {
+ try {
+ camera = cube->camera();
+ }
+ catch (IException &e) {
+ QString msg = "Cannot Create Camera for Image:" + cube->fileName();
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+ }
+ }
+
+ QList measures = cnet.GetMeasuresInCube(serialNumber);
+ for (int cm = 0; cm < measures.size(); cm++) {
+ ControlMeasure *measure = measures[cm];
+ ControlPoint *point = measure->Parent();
+
+ if (!measure->IsIgnored()) {
+ MeasureValidationResults results =
+ validateMeasure(measure, cube, camera);
+
+ if (!results.isValid()) {
+ QString failure = results.toString();
+ QString cause = "Validity Check " + failure;
+
+ if (measure == point->GetRefMeasure() && retainRef) {
+ logResult(retainedReferences, point->GetId(), cause);
+ }
+ else {
+ ignoreMeasure(cnet, point, measure, cause);
+
+ if (measure == point->GetRefMeasure() && ignoreAll) {
+ ignorePoint(cnet, point, "Reference measure ignored");
+ }
+ }
+ }
+ }
+ }
+
+ delete cube;
+ progress.CheckStatus();
+ }
+
+ for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
+ ControlPoint *point = cnet.GetPoint(cp);
+
+ for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
+ ControlMeasure *measure = point->GetMeasure(cm);
+
+ // Also look for previously ignored control measures
+ if (deleteIgnored && measure->IsIgnored()) {
+ deleteMeasure(point, cm);
+ }
+ }
+
+ // Check if there are too few measures in the point or the point was
+ // previously ignored
+ if (shouldDelete(point))
+ deletePoint(cnet, cp);
+ }
+ }
+
+
+ /**
+ * Test an individual measure against the user-specified tolerances and return
+ * the result.
+ *
+ * @param measure Measure to be tested
+ * @param cube Cube with serial number matching that of the current measure
+ * @param camera Camera associated with cube
+ *
+ * @return The results of validating the measure as an object containing the
+ * validity and a formatted error (or success) message
+ */
+ MeasureValidationResults validateMeasure(const ControlMeasure *measure,
+ Cube *cube, Camera *camera) {
+
+ MeasureValidationResults results =
+ cneteditValidator->ValidStandardOptions(measure, cube, camera);
+
+ return results;
+ }
+
+
+ void logResult(QMap *pointsLog, QString pointId, QString cause) {
+ if (keepLog) {
+ // Label the keyword as the Point ID, and make the cause into the value
+ (*pointsLog)[pointId] = cause;
+ }
+ }
+
+
+ void logResult(QMap *measuresLog,
+ QString pointId, QString serial, QString cause) {
+
+ if (keepLog) {
+ // Make the keyword label the measure Serial Number, and the cause into the
+ // value
+ PvlKeyword measureMessage(PvlKeyword(serial, cause));
+
+ // Using a map to make accessing by Point ID a O(1) to O(lg n) operation
+ if (measuresLog->contains(pointId)) {
+ // If the map already has a group for the given Point ID, simply add the
+ // new measure to it
+ PvlGroup &pointGroup = (*measuresLog)[pointId];
+ pointGroup.addKeyword(measureMessage);
+ }
+ else {
+ // Else there is no group for the Point ID of the measure being ignored,
+ // so make a new group, add the measure, and insert it into the map
+ PvlGroup pointGroup(pointId);
+ pointGroup.addKeyword(measureMessage);
+ (*measuresLog)[pointId] = pointGroup;
+ }
+ }
+ }
+
+
+ /**
+ * Create points log.
+ *
+ * @param QString Label for points log
+ * @param QMap Points map
+ *
+ * @return PvlObject Points log
+ */
+ PvlObject createLog(QString label, QMap *pointsMap) {
+ PvlObject pointsLog(label);
+
+ QList pointIds = pointsMap->keys();
+ for (int i = 0; i < pointIds.size(); i++) {
+ QString pointId = pointIds.at(i);
+ pointsLog.addKeyword(PvlKeyword(pointId, (*pointsMap)[pointId]));
+ }
+
+ return pointsLog;
+ }
+
+
+ /**
+ * Create measures log.
+ *
+ * @param QString Label for measures log
+ * @param QMap Points map
+ * @param QMap Measures map
+ *
+ * @return PvlObject Measures log
+ */
+ PvlObject createLog(QString label,
+ QMap *pointsMap, QMap *measuresMap) {
+
+ PvlObject editLog(label);
+
+ PvlObject pointsLog = createLog("Points", pointsMap);
+ editLog.addObject(pointsLog);
+
+ // Get all the groups of measures from the map
+ PvlObject measuresLog("Measures");
+ QList measureGroups = measuresMap->values();
+
+ for (int i = 0; i < measureGroups.size(); i++)
+ measuresLog.addGroup(measureGroups.at(i));
+
+ editLog.addObject(measuresLog);
+ return editLog;
+ }
+}
+
+
diff --git a/isis/src/control/apps/cnetedit/cnetedit.h b/isis/src/control/apps/cnetedit/cnetedit.h
new file mode 100644
index 0000000000..d8d054b974
--- /dev/null
+++ b/isis/src/control/apps/cnetedit/cnetedit.h
@@ -0,0 +1,27 @@
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+#ifndef cnetedit_h
+#define cnetedit_h
+
+#include "UserInterface.h"
+
+namespace Isis{
+ class ControlNet;
+ class ControlPointList;
+ class SerialNumberList;
+
+ extern Pvl cnetedit(UserInterface &ui);
+ extern Pvl cnetedit(ControlNet &cnet, UserInterface &ui,
+ ControlPointList *cpList=nullptr,
+ SerialNumberList *cubeSnl=nullptr,
+ QMap< QString, QSet * > *editMeasuresList=nullptr,
+ Pvl *defFile=nullptr,
+ SerialNumberList *validationSnl=nullptr);
+}
+
+#endif
diff --git a/isis/src/control/apps/cnetedit/main.cpp b/isis/src/control/apps/cnetedit/main.cpp
index efb4e3aec2..0eab06ab54 100644
--- a/isis/src/control/apps/cnetedit/main.cpp
+++ b/isis/src/control/apps/cnetedit/main.cpp
@@ -5,1059 +5,40 @@ For more details about the LICENSE terms and the AUTHORS, you will
find files of those names at the top level of this repository. **/
/* SPDX-License-Identifier: CC0-1.0 */
-
#define GUIHELPERS
#include "Isis.h"
-#include
-#include
-#include
-#include
-#include
-
-#include "ControlMeasure.h"
-#include "ControlNet.h"
-#include "ControlNetValidMeasure.h"
-#include "ControlPoint.h"
-#include "ControlPointList.h"
-#include "Cube.h"
-#include "FileName.h"
-#include "MeasureValidationResults.h"
-#include "Progress.h"
+#include "Application.h"
#include "Pvl.h"
-#include "PvlGroup.h"
-#include "PvlKeyword.h"
-#include "PvlObject.h"
-#include "SerialNumber.h"
-#include "SerialNumberList.h"
-#include "IException.h"
+#include "UserInterface.h"
+#include "cnetedit.h"
#include "GuiEditFile.h"
+
using namespace std;
using namespace Isis;
-// Deletion test
-bool shouldDelete(ControlPoint *point);
-
-// Mutator methods
-void ignorePoint(ControlNet &cnet, ControlPoint *point, QString cause);
-void ignoreMeasure(ControlNet &cnet, ControlPoint *point,
- ControlMeasure *measure, QString cause);
-void deletePoint(ControlNet &cnet, int cp);
-void deleteMeasure(ControlPoint *point, int cm);
-
-// Edit passes
-void populateLog(ControlNet &cnet, bool ignore);
-
-void unlockPoints(ControlNet &cnet, ControlPointList &cpList);
-void ignorePoints(ControlNet &cnet, ControlPointList &cpList);
-void lockPoints(ControlNet &cnet, ControlPointList &cpList);
-
-void unlockCubes(ControlNet &cnet, SerialNumberList &snl);
-void ignoreCubes(ControlNet &cnet, SerialNumberList &snl);
-void lockCubes(ControlNet &cnet, SerialNumberList &snl);
-
-void unlockMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures);
-void ignoreMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures);
-void lockMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures);
-
-void checkAllMeasureValidity(ControlNet &cnet, QString cubeList);
-
-// Validity test
-MeasureValidationResults validateMeasure(const ControlMeasure *measure,
- Cube *cube, Camera *camera);
-
-// Logging helpers
-void logResult(QMap *pointsLog, QString pointId, QString cause);
-void logResult(QMap *measuresLog,
- QString pointId, QString serial, QString cause);
-PvlObject createLog(QString label, QMap *pointsMap);
-PvlObject createLog(QString label,
- QMap *pointsMap, QMap *measuresMap);
-
void PrintTemp();
void EditDefFile();
map GuiHelpers() {
- map helper;
- helper["PrintTemp"] = (void *) PrintTemp;
- helper["EditDefFile"] = (void *) EditDefFile;
- return helper;
+ map helper;
+ helper["PrintTemp"] = (void *) PrintTemp;
+ helper["EditDefFile"] = (void *) EditDefFile;
+ return helper;
}
-// Global variables
-int numPointsDeleted;
-int numMeasuresDeleted;
-
-bool deleteIgnored;
-bool preservePoints;
-bool retainRef;
-bool keepLog;
-bool ignoreAll;
-
-QMap *ignoredPoints;
-QMap *ignoredMeasures;
-QMap *retainedReferences;
-QMap *editLockedPoints;
-QMap *editLockedMeasures;
-
-ControlNetValidMeasure *validator;
-
-// Main program
void IsisMain() {
- // 2016-12-08 Ian Humphrey - Set the QHash seed, otherwise output is ALWAYS slightly
- // different. Note that in Qt4, the seed was constant, but in Qt5, the seed is
- // created differently for each process. Fixes #4206.
- qSetGlobalQHashSeed(0);
-
- // Reset the counts of points and measures deleted
- numPointsDeleted = 0;
- numMeasuresDeleted = 0;
-
- // Interface for getting user parameters
UserInterface &ui = Application::GetUserInterface();
-
- // Get global user parameters
- bool ignore = ui.GetBoolean("IGNORE");
- deleteIgnored = ui.GetBoolean("DELETE");
- preservePoints = ui.GetBoolean("PRESERVE");
- retainRef = ui.GetBoolean("RETAIN_REFERENCE");
- ignoreAll = ui.GetBoolean("IGNOREALL");
-
- // Data needed to keep track of ignored/deleted points and measures
- keepLog = ui.WasEntered("LOG");
- ignoredPoints = NULL;
- ignoredMeasures = NULL;
- retainedReferences = NULL;
- editLockedPoints = NULL;
- editLockedMeasures = NULL;
-
- // Test if file exists, throw exception if it does not, continue otherwise.
- FileName cnetInput(ui.GetFileName("CNET"));
- if (!cnetInput.fileExists()) {
- QString msg = "The control network [" + cnetInput.expanded() + "] entered for CNET does not exist.";
- throw IException(IException::User, msg, _FILEINFO_);
- }
-
- // If the user wants to keep a log, go ahead and populate it with all the
- // existing ignored points and measures
- ControlNet cnet(ui.GetFileName("CNET"));
- if (keepLog && cnet.GetNumPoints() > 0)
- populateLog(cnet, ignore);
-
- // List has Points Ids
- bool processPoints = false;
- ControlPointList *cpList = NULL;
- if (ui.WasEntered("POINTLIST") && cnet.GetNumPoints() > 0) {
- processPoints = true;
- QString pointlistFileName = ui.GetFileName("POINTLIST");
- cpList = new ControlPointList((FileName) pointlistFileName);
- }
-
- // List has Cube file names
- bool processCubes = false;
- SerialNumberList *cubeSnl = NULL;
- if (ui.WasEntered("CUBELIST") && cnet.GetNumPoints() > 0) {
- processCubes = true;
- QString ignorelistFileName = ui.GetFileName("CUBELIST");
- cubeSnl = new SerialNumberList(ignorelistFileName);
- }
-
- // List has measurelist file names
- bool processMeasures = false;
- QMap< QString, QSet * > *editMeasures = NULL;
- if (ui.WasEntered("MEASURELIST") && cnet.GetNumPoints() > 0) {
- processMeasures = true;
- editMeasures = new QMap< QString, QSet * >;
-
- QFile file(ui.GetFileName("MEASURELIST"));
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString msg = "Unable to open MEASURELIST [" +
- file.fileName() + "]";
- throw IException(IException::User, msg, _FILEINFO_);
- }
-
- QTextStream in(&file);
- int lineNumber = 1;
- while (!in.atEnd()) {
- QString line = in.readLine();
- QStringList results = line.split(",");
- if (results.size() < 2) {
- QString msg = "Line " + QString::number(lineNumber) + " in the MEASURELIST does "
- "not contain a Point ID and a cube filename separated by a comma";
- throw IException(IException::User, msg, _FILEINFO_);
- }
-
- if (!editMeasures->contains(results[0]))
- editMeasures->insert(results[0], new QSet);
-
- FileName cubeName(results[1]);
- QString sn = SerialNumber::Compose(cubeName.expanded());
- (*editMeasures)[results[0]]->insert(sn);
-
- lineNumber++;
- }
- }
-
- if (ui.GetBoolean("UNLOCK")) {
- if (processPoints) unlockPoints(cnet, *cpList);
- if (processCubes) unlockCubes(cnet, *cubeSnl);
- if (processMeasures) unlockMeasures(cnet, *editMeasures);
- }
-
- /*
- * As a first pass, just try and delete anything that's already ignored
- * in the Control Network, if the user wants to delete ignored points and
- * measures. Originally, this check was performed last, only if the user
- * didn't specify any other deletion methods. However, performing this
- * check first will actually improve the running time in cases where there
- * are already ignored points and measures in the input network. The added
- * cost of doing this check here actually doesn't add to the running time at
- * all, because these same checks would need to have been done later
- * regardless.
- */
- if (deleteIgnored && cnet.GetNumPoints() > 0) {
- Progress progress;
- progress.SetText("Deleting Ignored in Input");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
- if (point->IsIgnored()) {
- deletePoint(cnet, cp);
- }
- else {
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- if (point->GetMeasure(cm)->IsIgnored()) {
- if (cm == point->IndexOfRefMeasure() && ignoreAll) {
- // If the reference is ignored and IgnoreAll is set, the point must ignored too
- ignorePoint(cnet, point, "Reference measure ignored");
- }
- else {
- deleteMeasure(point, cm);
- }
- }
- }
-
- // Check if the number of measures in the point is zero or there are too
- // few measures in the point and we don't want to preserve them.
- if (shouldDelete(point)) {
- deletePoint(cnet, cp);
- }
- }
-
- progress.CheckStatus();
- }
- }
-
- if (ignore) {
- if (processPoints) ignorePoints(cnet, *cpList);
- if (processCubes) ignoreCubes(cnet, *cubeSnl);
- if (processMeasures) ignoreMeasures(cnet, *editMeasures);
-
- // Perform validity check
- if (ui.GetBoolean("CHECKVALID") && cnet.GetNumPoints() > 0) {
- validator = NULL;
-
- // First validate DefFile's keywords and value type
- Pvl defFile(ui.GetFileName("DEFFILE"));
- Pvl pvlTemplate("$ISISROOT/appdata/templates/cnet_validmeasure/validmeasure.def");
- Pvl pvlResults;
- pvlTemplate.validatePvl(defFile, pvlResults);
- if (pvlResults.groups() > 0 || pvlResults.keywords() > 0) {
- Application::Log(pvlResults.group(0));
- QString sErrMsg = "Invalid Deffile\n";
- throw IException(IException::User, sErrMsg, _FILEINFO_);
- }
-
- // Construct the validator from the user-specified definition file
- validator = new ControlNetValidMeasure(&defFile);
-
- // User also provided a list of all serial numbers corresponding to every
- // cube in the control network
- QString cubeList = ui.GetFileName("FROMLIST");
- checkAllMeasureValidity(cnet, cubeList);
-
- // Delete the validator
- if (validator != NULL) {
- delete validator;
- validator = NULL;
- }
-
- // Log the DEFFILE to the print file
- Application::Log(defFile.findGroup("ValidMeasure", Pvl::Traverse));
- }
- }
-
- if (ui.GetBoolean("LOCK")) {
- if (processPoints) lockPoints(cnet, *cpList);
- if (processCubes) lockCubes(cnet, *cubeSnl);
- if (processMeasures) lockMeasures(cnet, *editMeasures);
- }
-
- // Log statistics
- if (keepLog) {
- Pvl outputLog;
-
- outputLog.addKeyword(PvlKeyword("PointsDeleted", toString(numPointsDeleted)));
- outputLog.addKeyword(PvlKeyword("MeasuresDeleted", toString(numMeasuresDeleted)));
-
- PvlObject lockedLog = createLog(
- "EditLocked", editLockedPoints, editLockedMeasures);
- outputLog.addObject(lockedLog);
-
- outputLog.addObject(createLog("RetainedReferences", retainedReferences));
-
- // Depending on whether the user chose to delete ignored points and
- // measures, the log will either contain reasons for being ignored, or
- // reasons for being deleted
- PvlObject ignoredLog = createLog(
- deleteIgnored ? "Deleted" : "Ignored", ignoredPoints, ignoredMeasures);
- outputLog.addObject(ignoredLog);
-
- // Write the log
- QString logFileName = ui.GetFileName("LOG");
- outputLog.write(logFileName);
-
- // Delete the structures keeping track of the ignored points and measures
- delete ignoredPoints;
- ignoredPoints = NULL;
-
- delete ignoredMeasures;
- ignoredMeasures = NULL;
-
- delete retainedReferences;
- retainedReferences = NULL;
-
- delete editLockedPoints;
- editLockedPoints = NULL;
-
- delete editLockedMeasures;
- editLockedMeasures = NULL;
- }
-
- delete cpList;
- cpList = NULL;
-
- delete cubeSnl;
- cubeSnl = NULL;
-
- if (editMeasures != NULL) {
- QList points = editMeasures->keys();
- for (int i = 0; i < points.size(); i++) delete (*editMeasures)[points[i]];
- delete editMeasures;
- editMeasures = NULL;
- }
-
- // Write the network
- cnet.Write(ui.GetFileName("ONET"));
-}
-
-
-/**
- * After any modification to a point's measures or ignored status, this check
- * should be performed to determine if the changes should result in the point's
- * deletion.
- *
- * @param point The Control Point recently modified
- *
- * @return Whether or not the point should be deleted
- */
-
-bool shouldDelete(ControlPoint *point){
-
- if(!deleteIgnored)
- return false;
-
-
- else{
-
- if ( point->GetNumMeasures() == 0 && !preservePoints)
- return true;
-
-
- if (point->GetType() != ControlPoint::Fixed && point->GetNumMeasures()< 2 ){
-
- if(preservePoints && point->GetNumMeasures() == 1)
- return false;
-
- return true; //deleteIgnore = TRUE or else we would not be here
- }
-
-
- if( point->IsIgnored() )
- return true;
-
- return false;
-
- }
-
-
-}
-
-
-
-
-
-/*
-bool shouldDelete(ControlPoint *point) {
- // If the point only has one measure, then unless it's a fixed point or the
- // user wishes to preserve such points, it should be deleted. As a side
- // effect, this check will also delete empty points that satisfy this
- // condition without having to do the next check
- if ((point->GetNumMeasures() < 2 && !preservePoints) &&
- point->GetType() != ControlPoint::Fixed)
- return true;
-
- // A point without any measures should always be deleted
- if (point->GetNumMeasures() == 0)
- return true;
-
- // If the user wants to delete ignored points, and this point is ignored,
- // then it follows that it should be deleted
- if (point->IsIgnored() && deleteIgnored)
- return true;
-
- // Otherwise, the point looks good
- return false;
-}
-*/
-
-/**
- * Set the point at the given index in the control network to ignored, and add
- * a new keyword to the list of ignored points with a cause for the ignoring,
- * if the user wished to keep a log.
- *
- * @param cnet The Control Network being modified
- * @param point The Control Point we wish to ignore
- * @param cause A prose description of why the point was ignored (for logging)
- */
-void ignorePoint(ControlNet &cnet, ControlPoint *point, QString cause) {
- ControlPoint::Status result = point->SetIgnored(true);
-
- logResult(result == ControlPoint::Success ? ignoredPoints : editLockedPoints,
- point->GetId(), cause);
-}
-
-
-/**
- * Set the measure to be ignored, and add a new keyword to the list of ignored
- * measures if the user wished to keep a log.
- *
- * @param cnet The Control Network being modified
- * @param point The Control Point of the Control Measure we wish to ignore
- * @param measure The Control Measure we wish to ignore
- * @param cause A prose description of why the measure was ignored (for
- * logging)
- */
-void ignoreMeasure(ControlNet &cnet, ControlPoint *point,
- ControlMeasure *measure, QString cause) {
- ControlMeasure::Status result = measure->SetIgnored(true);
-
- logResult(
- result == ControlMeasure::Success ? ignoredMeasures : editLockedMeasures,
- point->GetId(), measure->GetCubeSerialNumber(), cause);
-
- if (ignoreAll && measure->Parent()->GetRefMeasure() == measure) {
- foreach (ControlMeasure *cm, measure->Parent()->getMeasures()) {
- if (!cm->IsIgnored())
- ignoreMeasure(cnet, measure->Parent(), cm, "Reference ignored");
- }
- }
-}
-
-
-/**
- * Delete the point, record how many points and measures have been deleted.
- *
- * @param cnet The Control Network being modified
- * @param cp Index into the Control Network for the point we wish to delete
- */
-void deletePoint(ControlNet &cnet, int cp) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- // Do the edit lock check up front so we don't accidentally log that a point
- // was deleted when in fact it was not
- if (!point->IsEditLocked()) {
- numMeasuresDeleted += point->GetNumMeasures();
- numPointsDeleted++;
-
- if (keepLog) {
- // If the point's being deleted but it wasn't set to ignore, it can only
- // be because the point has two few measures remaining
- if (!point->IsIgnored())
- ignorePoint(cnet, point, "Too few measures");
-
- // For any measures not ignored, mark their cause for deletion as being
- // caused by the point's deletion
- for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
- ControlMeasure *measure = point->GetMeasure(cm);
- if (!measure->IsIgnored())
- ignoreMeasure(cnet, point, measure, "Point deleted");
- }
- }
-
- cnet.DeletePoint(cp);
- }
- else {
- for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
- if (point->GetMeasure(cm)->IsEditLocked()) {
- ignorePoint(cnet, point, "EditLocked point skipped");
- }
- }
- }
-}
-
-
-/**
- * Delete the measure, increment the count of measures deleted.
- *
- * @param cnet The Control Network being modified
- * @param point The Control Point of the Control Measure we wish to delete
- * @param cm Index into the Control Network for the measure we wish to delete
- */
-void deleteMeasure(ControlPoint *point, int cm) {
- if (point->Delete(cm) == ControlMeasure::Success) numMeasuresDeleted++;
-}
-
-
-/**
- * Seed the log with points and measures already ignored.
- *
- * @param cnet The Control Network being modified
- */
-void populateLog(ControlNet &cnet, bool ignore) {
- ignoredPoints = new QMap;
- ignoredMeasures = new QMap;
-
- retainedReferences = new QMap;
-
- editLockedPoints = new QMap;
- editLockedMeasures = new QMap;
-
- Progress progress;
- progress.SetText("Initializing Log File");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = 0; cp < cnet.GetNumPoints(); cp++) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- if (point->IsIgnored()) {
- ignorePoint(cnet, point, "Ignored from input");
- }
-
- for (int cm = 0; cm < point->GetNumMeasures(); cm++) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- if (measure->IsIgnored()) {
- if (cm == point->IndexOfRefMeasure() && ignoreAll) {
- if (ignore && !point->IsIgnored()) {
- ignorePoint(cnet, point, "Reference measure ignored");
- }
- }
-
- ignoreMeasure(cnet, point, measure, "Ignored from input");
- }
- }
-
- progress.CheckStatus();
- }
-}
-
-
-void unlockPoints(ControlNet &cnet, ControlPointList &cpList) {
- Progress progress;
- progress.SetText("Unlocking Points");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
- if (point->IsEditLocked() && cpList.HasControlPoint(point->GetId())) {
- point->SetEditLock(false);
- }
- progress.CheckStatus();
- }
-}
-
-
-/**
- * Iterates over the points in the Control Network looking for a match in the
- * list of Control Points to be ignored. If a match is found, ignore the
- * point, and if the DELETE option was selected, the point will then be deleted
- * from the network.
- *
- * @param fileName Name of the file containing the list of Control Points
- * @param cnet The Control Network being modified
- */
-void ignorePoints(ControlNet &cnet, ControlPointList &cpList) {
- Progress progress;
- progress.SetText("Comparing Points to POINTLIST");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- // Compare each Point Id listed with the Point in the
- // Control Network for according exclusion
- if (!point->IsIgnored() && cpList.HasControlPoint(point->GetId())) {
- ignorePoint(cnet, point, "Point ID in POINTLIST");
- }
-
- if (deleteIgnored) {
- //look for previously ignored control points
- if (point->IsIgnored()) {
- deletePoint(cnet, cp);
- }
- else {
- //look for previously ignored control measures
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- if (point->GetMeasure(cm)->IsIgnored() && deleteIgnored) {
- deleteMeasure(point, cm);
- }
- }
- // Check if there are too few measures in the point or the point was
- // previously ignored
- if (shouldDelete(point)) {
- deletePoint(cnet, cp);
- }
- }
- }
-
- progress.CheckStatus();
- }
-}
-
-
-void lockPoints(ControlNet &cnet, ControlPointList &cpList) {
- Progress progress;
- progress.SetText("Locking Points");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
- if (!point->IsEditLocked() && cpList.HasControlPoint(point->GetId())) {
- point->SetEditLock(true);
- }
- progress.CheckStatus();
- }
-}
-
-
-void unlockCubes(ControlNet &cnet, SerialNumberList &snl) {
- Progress progress;
- progress.SetText("Unlocking Cubes");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- QString serialNumber = measure->GetCubeSerialNumber();
- if (measure->IsEditLocked() && snl.hasSerialNumber(serialNumber)) {
- measure->SetEditLock(false);
- }
- }
- progress.CheckStatus();
- }
-}
-
-
-/**
- * Iterates over the list of Control Measures in the Control Network and
- * compares measure serial numbers with those in the input list of serial
- * numbers to be ignored. If a match is found, ignore the measure. If the
- * DELETE option was selected, the measure will then be deleted from the
- * network.
- *
- * @param fileName Name of the file containing the list of Serial Numbers to be
- * ignored
- * @param cnet The Control Network being modified
- */
-void ignoreCubes(ControlNet &cnet, SerialNumberList &snl) {
- Progress progress;
- progress.SetText("Comparing Measures to CUBELIST");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- // Compare each Serial Number listed with the serial number in the
- // Control Measure for according exclusion
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- if (!point->IsIgnored() && point->GetMeasure(cm)->IsEditLocked()) {
- ignoreMeasure(cnet, point, measure, "EditLocked measure skipped");
- }
-
- QString serialNumber = measure->GetCubeSerialNumber();
-
- if (snl.hasSerialNumber(serialNumber)) {
- QString cause = "Serial Number in CUBELIST";
- if (cm == point->IndexOfRefMeasure() && retainRef) {
- logResult(retainedReferences, point->GetId(), cause);
- }
- else if (!measure->IsIgnored() || cm == point->IndexOfRefMeasure()) {
- ignoreMeasure(cnet, point, measure, cause);
-
- if (cm == point->IndexOfRefMeasure() && !point->IsIgnored() && ignoreAll) {
- ignorePoint(cnet, point, "Reference measure ignored");
- }
- }
- }
-
- //also look for previously ignored control measures
- if (deleteIgnored && measure->IsIgnored()) {
- deleteMeasure(point, cm);
- }
- }
- // Check if there are too few measures in the point or the point was
- // previously ignored
- if (shouldDelete(point)) {
- deletePoint(cnet, cp);
- }
-
- progress.CheckStatus();
- }
-}
-
-
-void lockCubes(ControlNet &cnet, SerialNumberList &snl) {
- Progress progress;
- progress.SetText("Locking Cubes");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- QString serialNumber = measure->GetCubeSerialNumber();
- if (!measure->IsEditLocked() && snl.hasSerialNumber(serialNumber)) {
- measure->SetEditLock(true);
- }
- }
- progress.CheckStatus();
- }
-}
-
-
-void unlockMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures) {
-
- Progress progress;
- progress.SetText("Unlocking Measures");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- QString id = point->GetId();
- if (editMeasures.contains(id)) {
- QSet *measureSet = editMeasures[id];
-
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- QString serialNumber = measure->GetCubeSerialNumber();
- if (measure->IsEditLocked() && measureSet->contains(serialNumber)) {
- measure->SetEditLock(false);
- }
- }
- }
- progress.CheckStatus();
- }
-}
-
-
-void ignoreMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures) {
-
- Progress progress;
- progress.SetText("Ignoring Measures");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- QString id = point->GetId();
- if (editMeasures.contains(id)) {
- QSet *measureSet = editMeasures[id];
-
- // Compare each Serial Number listed with the serial number in the
- // Control Measure for according exclusion
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- if (!point->IsIgnored() && point->GetMeasure(cm)->IsEditLocked()) {
- ignoreMeasure(cnet, point, measure, "EditLocked measure skipped");
- }
-
- QString serialNumber = measure->GetCubeSerialNumber();
- if (measureSet->contains(serialNumber)) {
- QString cause = "Measure in MEASURELIST";
- if (cm == point->IndexOfRefMeasure() && retainRef) {
- logResult(retainedReferences, point->GetId(), cause);
- }
- else if (!measure->IsIgnored() || cm == point->IndexOfRefMeasure()) {
- ignoreMeasure(cnet, point, measure, cause);
-
- if (cm == point->IndexOfRefMeasure() && !point->IsIgnored() && ignoreAll) {
- ignorePoint(cnet, point, "Reference measure ignored");
- }
- }
- }
-
- //also look for previously ignored control measures
- if (deleteIgnored && measure->IsIgnored()) {
- deleteMeasure(point, cm);
- }
- }
- // Check if there are too few measures in the point or the point was
- // previously ignored
- if (shouldDelete(point)) {
- deletePoint(cnet, cp);
- }
- }
-
- progress.CheckStatus();
- }
-}
-
-
-void lockMeasures(ControlNet &cnet,
- QMap< QString, QSet * > &editMeasures) {
-
- Progress progress;
- progress.SetText("Locking Measures");
- progress.SetMaximumSteps(cnet.GetNumPoints());
- progress.CheckStatus();
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- QString id = point->GetId();
- if (editMeasures.contains(id)) {
- QSet *measureSet = editMeasures[id];
-
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- QString serialNumber = measure->GetCubeSerialNumber();
- if (!measure->IsEditLocked() && measureSet->contains(serialNumber)) {
- measure->SetEditLock(true);
- }
- }
- }
- progress.CheckStatus();
- }
-}
-
-
-/**
- * Compare each measure in the Control Network against tolerances specified in
- * the input DEFFILE. Ignore any measure whose values fall outside the valid
- * tolerances, and delete it if the user specified to do so.
- *
- * @param cnet The Control Network being modified
- * @param cubeList Name of the file containing the list of all Serial Numbers
- * in the network
- */
-void checkAllMeasureValidity(ControlNet &cnet, QString cubeList) {
- SerialNumberList serialNumbers(cubeList);
-
- QList cnetSerials = cnet.GetCubeSerials();
- Progress progress;
- progress.SetText("Checking Measure Validity");
- progress.SetMaximumSteps(cnetSerials.size());
- progress.CheckStatus();
-
- foreach (QString serialNumber, cnetSerials) {
-
- Cube *cube = NULL;
- Camera *camera = NULL;
- if (validator->IsCubeRequired()) {
- if (!serialNumbers.hasSerialNumber(serialNumber)) {
- QString msg = "Serial Number [" + serialNumber + "] contains no ";
- msg += "matching cube in FROMLIST";
- throw IException(IException::User, msg, _FILEINFO_);
- }
-
- cube = new Cube;
- cube->open(serialNumbers.fileName(serialNumber));
-
- if (validator->IsCameraRequired()) {
- try {
- camera = cube->camera();
- }
- catch (IException &e) {
- QString msg = "Cannot Create Camera for Image:" + cube->fileName();
- throw IException(e, IException::User, msg, _FILEINFO_);
- }
- }
- }
-
- QList measures = cnet.GetMeasuresInCube(serialNumber);
- for (int cm = 0; cm < measures.size(); cm++) {
- ControlMeasure *measure = measures[cm];
- ControlPoint *point = measure->Parent();
-
- if (!measure->IsIgnored()) {
- MeasureValidationResults results =
- validateMeasure(measure, cube, camera);
-
- if (!results.isValid()) {
- QString failure = results.toString();
- QString cause = "Validity Check " + failure;
-
- if (measure == point->GetRefMeasure() && retainRef) {
- logResult(retainedReferences, point->GetId(), cause);
- }
- else {
- ignoreMeasure(cnet, point, measure, cause);
-
- if (measure == point->GetRefMeasure() && ignoreAll) {
- ignorePoint(cnet, point, "Reference measure ignored");
- }
- }
- }
- }
- }
-
- delete cube;
- progress.CheckStatus();
- }
-
- for (int cp = cnet.GetNumPoints() - 1; cp >= 0; cp--) {
- ControlPoint *point = cnet.GetPoint(cp);
-
- for (int cm = point->GetNumMeasures() - 1; cm >= 0; cm--) {
- ControlMeasure *measure = point->GetMeasure(cm);
-
- // Also look for previously ignored control measures
- if (deleteIgnored && measure->IsIgnored()) {
- deleteMeasure(point, cm);
- }
- }
-
- // Check if there are too few measures in the point or the point was
- // previously ignored
- if (shouldDelete(point))
- deletePoint(cnet, cp);
- }
-}
-
-
-/**
- * Test an individual measure against the user-specified tolerances and return
- * the result.
- *
- * @param curMeasure The measure currently being tested
- * @param cubeName Name of the cube whose serial number matches that of the
- * current measure
- *
- * @return The results of validating the measure as an object containing the
- * validity and a formatted error (or success) message
- */
-MeasureValidationResults validateMeasure(const ControlMeasure *measure,
- Cube *cube, Camera *camera) {
-
- MeasureValidationResults results =
- validator->ValidStandardOptions(measure, cube, camera);
-
- return results;
-}
-
-
-void logResult(QMap *pointsLog, QString pointId, QString cause) {
- if (keepLog) {
- // Label the keyword as the Point ID, and make the cause into the value
- (*pointsLog)[pointId] = cause;
- }
-}
-
-
-void logResult(QMap *measuresLog,
- QString pointId, QString serial, QString cause) {
-
- if (keepLog) {
- // Make the keyword label the measure Serial Number, and the cause into the
- // value
- PvlKeyword measureMessage(PvlKeyword(serial, cause));
-
- // Using a map to make accessing by Point ID a O(1) to O(lg n) operation
- if (measuresLog->contains(pointId)) {
- // If the map already has a group for the given Point ID, simply add the
- // new measure to it
- PvlGroup &pointGroup = (*measuresLog)[pointId];
- pointGroup.addKeyword(measureMessage);
- }
- else {
- // Else there is no group for the Point ID of the measure being ignored,
- // so make a new group, add the measure, and insert it into the map
- PvlGroup pointGroup(pointId);
- pointGroup.addKeyword(measureMessage);
- (*measuresLog)[pointId] = pointGroup;
- }
- }
-}
-
-
-PvlObject createLog(QString label, QMap *pointsMap) {
- PvlObject pointsLog(label);
-
- QList pointIds = pointsMap->keys();
- for (int i = 0; i < pointIds.size(); i++) {
- QString pointId = pointIds.at(i);
- pointsLog.addKeyword(PvlKeyword(pointId, (*pointsMap)[pointId]));
- }
-
- return pointsLog;
+ Pvl results = cnetedit(ui);
}
-
-PvlObject createLog(QString label,
- QMap *pointsMap, QMap *measuresMap) {
-
- PvlObject editLog(label);
-
- PvlObject pointsLog = createLog("Points", pointsMap);
- editLog.addObject(pointsLog);
-
- // Get all the groups of measures from the map
- PvlObject measuresLog("Measures");
- QList measureGroups = measuresMap->values();
-
- for (int i = 0; i < measureGroups.size(); i++)
- measuresLog.addGroup(measureGroups.at(i));
-
- editLog.addObject(measuresLog);
- return editLog;
-}
-
-
/**
- * Helper function to print out template to session log.
- */
+ * Helper function to print out template to session log.
+ */
void PrintTemp() {
UserInterface &ui = Application::GetUserInterface();
@@ -1069,12 +50,13 @@ void PrintTemp() {
Isis::Application::GuiLog(userTemp);
}
+
/**
- * Helper function to be able to edit the Deffile.
- * Opens an editor to edit the file.
- *
- * @author Sharmila Prasad (5/23/2011)
- */
+ * Helper function to be able to edit the Deffile.
+ * Opens an editor to edit the file.
+ *
+ * @author Sharmila Prasad (5/23/2011)
+ */
void EditDefFile(void) {
UserInterface &ui = Application::GetUserInterface();
QString sDefFile = ui.GetAsString("DEFFILE");
diff --git a/isis/src/control/apps/cnetedit/tsts/Makefile b/isis/src/control/apps/cnetedit/tsts/Makefile
deleted file mode 100644
index 322a6262d1..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-BLANKS = "%-6s"
-LENGTH = "%-40s"
-
-include $(ISISROOT)/make/isismake.tststree
-
diff --git a/isis/src/control/apps/cnetedit/tsts/checkValid/Makefile b/isis/src/control/apps/cnetedit/tsts/checkValid/Makefile
deleted file mode 100644
index 72ee5aa8c8..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/checkValid/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-# normal test
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- ONET=$(OUTPUT)/cnet.net \
- LOG=$(OUTPUT)/log.txt \
- CHECKVALID=yes \
- FROMLIST=$(OUTPUT)/list.lis \
- DEFFILE=$(INPUT)/deffile.def \
- RETAIN_REFERENCE=yes > /dev/null;
-
-# test with IGNOREALL=true
-# $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- ONET=$(OUTPUT)/cnet2.net \
- LOG=$(OUTPUT)/log2.txt \
- CHECKVALID=yes \
- IGNOREALL=true \
- FROMLIST=$(OUTPUT)/list.lis \
- DEFFILE=$(INPUT)/deffile.def > /dev/null;
-
-# Cleanup
- $(RM) $(OUTPUT)/list.lis;
diff --git a/isis/src/control/apps/cnetedit/tsts/default/Makefile b/isis/src/control/apps/cnetedit/tsts/default/Makefile
deleted file mode 100644
index 39b4d39908..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/default/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(APPNAME) CNET=$(INPUT)/cnet.net ONET=$(OUTPUT)/cnet.net > /dev/null;
diff --git a/isis/src/control/apps/cnetedit/tsts/editLock/Makefile b/isis/src/control/apps/cnetedit/tsts/editLock/Makefile
deleted file mode 100644
index eb0e6f149c..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/editLock/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
-
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/locked.txt \
- CUBELIST=$(OUTPUT)/list.lis \
- POINTLIST=$(INPUT)/points.lis \
- IGNORE=no DELETE=no LOCK=yes \
- ONET=$(OUTPUT)/locked.net > /dev/null;
-
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/unlocked.txt \
- CUBELIST=$(OUTPUT)/list.lis \
- POINTLIST=$(INPUT)/points.lis \
- UNLOCK=yes IGNORE=no DELETE=no \
- ONET=$(OUTPUT)/unlocked.net > /dev/null;
-
- $(RM) $(OUTPUT)/list.lis;
diff --git a/isis/src/control/apps/cnetedit/tsts/errors/Makefile b/isis/src/control/apps/cnetedit/tsts/errors/Makefile
deleted file mode 100644
index a2630fbc54..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/errors/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-# Test with a non-existant file
- echo -e "Error Test: Non-existant file" > $(OUTPUT)/error_temp.txt;
- if [[ `$(APPNAME) CNET=$(INPUT)/cnet.net \
- ONET=$(OUTPUT)/cnet.net \
- 2>> $(OUTPUT)/error_temp.txt \
- > /dev/null` ]]; \
- then \
- true; \
- fi;
-
- $(SED) 's+\[/.*/input/+\[input/+' $(OUTPUT)/error_temp.txt > $(OUTPUT)/error.txt;
-
-# Cleanup
- $(RM) $(OUTPUT)/error_temp.txt;
diff --git a/isis/src/control/apps/cnetedit/tsts/ignore/Makefile b/isis/src/control/apps/cnetedit/tsts/ignore/Makefile
deleted file mode 100644
index c7f763dc8f..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/ignore/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(CAT) $(INPUT)/measurelist.txt | sed 's#X#$(INPUT)#' \
- > $(OUTPUT)/measurelist.txt;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- CUBELIST=$(OUTPUT)/list.lis \
- MEASURELIST=$(OUTPUT)/measurelist.txt \
- ONET=$(OUTPUT)/cnet.net DELETE=no \
- IGNOREALL=yes \
- log=$(OUTPUT)/log.txt > /dev/null;
- $(RM) $(OUTPUT)/list.lis $(OUTPUT)/measurelist.txt;
diff --git a/isis/src/control/apps/cnetedit/tsts/ignoreMeasuresPoints/Makefile b/isis/src/control/apps/cnetedit/tsts/ignoreMeasuresPoints/Makefile
deleted file mode 100644
index d8fd565c07..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/ignoreMeasuresPoints/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log.txt \
- CUBELIST=$(OUTPUT)/list.lis \
- POINTLIST=$(INPUT)/points.lis \
- ONET=$(OUTPUT)/cnet.net > /dev/null;
- $(RM) $(OUTPUT)/list.lis;
diff --git a/isis/src/control/apps/cnetedit/tsts/ignorePoints/Makefile b/isis/src/control/apps/cnetedit/tsts/ignorePoints/Makefile
deleted file mode 100644
index 77cc4386f2..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/ignorePoints/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-# original test
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- POINTLIST=$(INPUT)/points.lis \
- ONET=$(OUTPUT)/cnet.net > /dev/null;
-
-# test IGNOREALL=true with ignored input measures / points
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- POINTLIST=$(INPUT)/points.lis \
- IGNOREALL = true \
- ONET=$(OUTPUT)/cnet2.net > /dev/null;
diff --git a/isis/src/control/apps/cnetedit/tsts/measurelist/Makefile b/isis/src/control/apps/cnetedit/tsts/measurelist/Makefile
deleted file mode 100644
index 8dc1357221..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/measurelist/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-
-# general test
- $(CAT) $(INPUT)/bad_measures.lis | $(SED) "s#,#,$(INPUT)/#" \
- > $(OUTPUT)/list.lis;
-
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log.txt \
- MEASURELIST=$(OUTPUT)/list.lis \
- DELETE=no \
- ONET=$(OUTPUT)/cnet.net > /dev/null;
-
-# test with IGNOREALL = true, DELETE=no measure that is a reference for a non-ignored point
- $(CAT) $(INPUT)/bad_measures2.lis | $(SED) "s#,#,$(INPUT)/#" \
- > $(OUTPUT)/list2.lis;
-
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log2.txt \
- MEASURELIST=$(OUTPUT)/list2.lis \
- IGNOREALL=true \
- DELETE=no \
- ONET=$(OUTPUT)/cnet2.net > /dev/null;
-
-# test with DELETE=yes
- $(CAT) $(INPUT)/bad_measures.lis | $(SED) "s#,#,$(INPUT)/#" \
- > $(OUTPUT)/list.lis;
-
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log3.txt \
- MEASURELIST=$(OUTPUT)/list.lis \
- ONET=$(OUTPUT)/cnet3.net > /dev/null;
-
-# Cleanup
- $(RM) $(OUTPUT)/list.lis;
- $(RM) $(OUTPUT)/list2.lis;
diff --git a/isis/src/control/apps/cnetedit/tsts/noDelete/Makefile b/isis/src/control/apps/cnetedit/tsts/noDelete/Makefile
deleted file mode 100644
index 93096a1e09..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/noDelete/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log.txt \
- CUBELIST=$(OUTPUT)/list.lis \
- POINTLIST=$(INPUT)/points.lis \
- DELETE = false \
- ONET=$(OUTPUT)/cnet2.net > /dev/null;
- $(RM) $(OUTPUT)/list.lis;
diff --git a/isis/src/control/apps/cnetedit/tsts/preservePoints/Makefile b/isis/src/control/apps/cnetedit/tsts/preservePoints/Makefile
deleted file mode 100644
index 779e410259..0000000000
--- a/isis/src/control/apps/cnetedit/tsts/preservePoints/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-APPNAME = cnetedit
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
- $(LS) $(INPUT)/*.cub > $(OUTPUT)/list.lis;
- $(APPNAME) CNET=$(INPUT)/cnet.net \
- LOG=$(OUTPUT)/log.txt \
- CUBELIST=$(OUTPUT)/list.lis \
- POINTLIST=$(INPUT)/points.lis \
- DELETE = true \
- PRESERVE = true \
- ONET=$(OUTPUT)/cnet2.net > /dev/null;
- $(RM) $(OUTPUT)/list.lis;
diff --git a/isis/tests/FunctionalTestsCnetedit.cpp b/isis/tests/FunctionalTestsCnetedit.cpp
new file mode 100644
index 0000000000..a7cca587e7
--- /dev/null
+++ b/isis/tests/FunctionalTestsCnetedit.cpp
@@ -0,0 +1,2943 @@
+#include
+#include
+#include
+
+#include "cnetedit.h"
+#include "ControlMeasure.h"
+#include "ControlNet.h"
+#include "ControlPoint.h"
+#include "FileList.h"
+#include "Progress.h"
+#include "Pvl.h"
+#include "PvlGroup.h"
+#include "PvlObject.h"
+#include "LineManager.h"
+#include "spiceinit.h"
+#include "TempFixtures.h"
+#include "TestUtilities.h"
+
+#include "gtest/gtest.h"
+
+using namespace Isis;
+
+static QString APP_XML = FileName("$ISISROOT/bin/xml/cnetedit.xml").expanded();
+
+class CneteditCheckValid : public TempTestingFiles {
+ protected:
+ QString cnet11File;
+ QString chkValidCubeListFile;
+ QString defFile;
+
+ void SetUp() override {
+ TempTestingFiles::SetUp();
+
+ chkValidCubeListFile = tempDir.path() + "/chkValidCubeList.lis";
+ cnet11File = "data/cnetedit/cnet_11pts.pvl";
+ defFile = tempDir.path() + "/defFile.def";
+
+ std::ifstream label1Strm("data/cnetedit/PSP_002733_1880_RED4.crop.pvl");
+ std::ifstream label2Strm("data/cnetedit/PSP_002733_1880_RED5.crop.pvl");
+
+ Pvl label1;
+ Pvl label2;
+
+ label1Strm >> label1;
+ label2Strm >> label2;
+
+ Cube cube1;
+ Cube cube2;
+
+ cube1.fromLabel(tempDir.path() + "/PSP_002733_1880_RED4.crop.cub",
+ label1, "rw");
+ cube2.fromLabel(tempDir.path() + "/PSP_002733_1880_RED5.crop.cub",
+ label2, "rw");
+
+ LineManager line(cube1);
+ LineManager line2(cube2);
+
+ for(line.begin(); !line.end(); line++) {
+ for(int i = 0; i < line.size(); i++) {
+ line[i] = (double)(i+1);
+ }
+ cube1.write(line);
+ }
+ for(line2.begin(); !line2.end(); line2++) {
+ for(int i = 0; i < line2.size(); i++) {
+ line2[i] = (double)(i+1);
+ }
+ cube2.write(line2);
+ }
+ cube1.reopen("rw");
+ cube2.reopen("rw");
+
+ // set up cube list for checkValid tests
+ FileList chkValidCubeList;
+ chkValidCubeList.append(cube1.fileName());
+ chkValidCubeList.append(cube2.fileName());
+ chkValidCubeList.write(chkValidCubeListFile);
+
+ // set up pvl def file
+ PvlGroup validMeasureGroup("ValidMeasure");
+ validMeasureGroup.addKeyword(PvlKeyword("MinDN", "-1000000"));
+ validMeasureGroup.addKeyword(PvlKeyword("MaxDN", "1000000"));
+ validMeasureGroup.addKeyword(PvlKeyword("MinEmission", "0"));
+ validMeasureGroup.addKeyword(PvlKeyword("MaxEmission", "135"));
+ validMeasureGroup.addKeyword(PvlKeyword("MinIncidence", "0"));
+ validMeasureGroup.addKeyword(PvlKeyword("MaxIncidence", "135"));
+ validMeasureGroup.addKeyword(PvlKeyword("MinResolution", "0"));
+ validMeasureGroup.addKeyword(PvlKeyword("MaxResolution", "1000"));
+ validMeasureGroup.addKeyword(PvlKeyword("PixelsFromEdge", "5"));
+ validMeasureGroup.addKeyword(PvlKeyword("SampleResidual", "5"));
+ validMeasureGroup.addKeyword(PvlKeyword("LineResidual", "5"));
+ validMeasureGroup.addKeyword(PvlKeyword("SampleShift", "3"));
+ validMeasureGroup.addKeyword(PvlKeyword("LineShift", "5"));
+ Pvl p;
+ p.addGroup(validMeasureGroup);
+ p.write(defFile);
+ }
+};
+
+class CneteditMeasureList : public TempTestingFiles {
+ protected:
+ QString cnet35File;
+ QString badMeasureListFile1;
+ QString badMeasureListFile2;
+
+ void SetUp() override {
+ TempTestingFiles::SetUp();
+
+ cnet35File = "data/cnetedit/cnet_35pts.pvl";
+ badMeasureListFile1 = tempDir.path() + "badMeasureList1.lis";
+ badMeasureListFile2 = tempDir.path() + "badMeasureList2.lis";
+
+ // setup badMeasureLists with pvl label files
+ FileList badMeasureList1;
+ badMeasureList1.append("I24827003RDR_bndry_32,data/cnetedit/I10101002RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_32,data/cnetedit/I10413004RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_35,data/cnetedit/I07873009RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_35,data/cnetedit/I23604003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_35,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_36,data/cnetedit/I07873009RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_36,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_50,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_53,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_56,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList1.append("I24827003RDR_bndry_8,data/cnetedit/I07873009RDR.dstr.cub.label.pvl");
+ badMeasureList1.write(badMeasureListFile1);
+
+ FileList badMeasureList2(badMeasureList1);
+ badMeasureList2.append("I24827003RDR_bndry_11,data/cnetedit/I24827003RDR.dstr.cub.label.pvl");
+ badMeasureList2.write(badMeasureListFile2);
+ }
+};
+
+
+class Cnetedit : public TempTestingFiles {
+ protected:
+ QString cnet108File;
+ QString pointListFile;
+ QString cubeListFile;
+ QString measureListFile;
+
+ void SetUp() override {
+ TempTestingFiles::SetUp();
+
+ cnet108File = "data/cnetedit/cnet_108pts.pvl";
+ pointListFile = tempDir.path() + "/pointList.lis";
+ cubeListFile = tempDir.path() + "/cubeList.lis";
+ measureListFile = tempDir.path() + "measureList.lis";
+
+ // set up cube list
+ FileList cubeList;
+ cubeList.append("data/cnetedit/e0902065.cal.sub.cub");
+ cubeList.write(cubeListFile);
+
+ // set up measureList
+ FileList measureList;
+ measureList.append("new0001,data/cnetedit/e0902065.cal.sub.cub");
+ measureList.write(measureListFile);
+
+ // set up point list
+ FileList pointList;
+ pointList.append("new0007");
+ pointList.append("new0050");
+ pointList.append("new0001");
+ pointList.append("new0036");
+ pointList.append("new0020");
+ pointList.append("new0008");
+ pointList.write(pointListFile);
+ }
+};
+
+
+/**
+ * FunctionalTestCneteditCheckValid
+ *
+ * Cnetedit test of check valid functionality.
+ * Input ...
+ * 1) ControlNet with 11 points (data/cnetedit/cnet_11pts.pvl)
+ * 2) two image cube list file (data/cnetedit/PSP_002733_1880_RED4.crop.cub;
+ * data/cnetedit/PSP_002733_1880_RED5.crop.cub)
+ * 3) def file
+ * 4) CHECKVALID = yes
+ * 5) RETAIN_REFERENCE=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(CneteditCheckValid, FunctionalTestCneteditCheckValid) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet11File,
+ "log=" + tempDir.path() + "/log.txt",
+ "checkvalid=yes",
+ "fromlist=" + chkValidCubeListFile,
+ "retain_reference=yes",
+ "deffile=" + defFile,
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditLog;
+
+ try {
+ cneteditLog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 4);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 8);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // check retained references
+ PvlObject retainedRefs = log.findObject("RetainedReferences");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, retainedRefs.findKeyword("pointregTest0001"),
+ "Validity Check failed: Sample Residual is greater than"
+ " tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, retainedRefs.findKeyword("pointregTest0007"),
+ "Validity Check failed: Sample Residual is greater than"
+ " tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, retainedRefs.findKeyword("pointregTest0008"),
+ "Validity Check failed: Pixels From Edge is less than"
+ " tolerance 5");
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0002"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0003"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0004"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0011"),
+ "Too few measures");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup pointregTest0002 = deletedMeasures.findGroup("pointregTest0002");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0002.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0002.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Point deleted");
+ PvlGroup pointregTest0003 = deletedMeasures.findGroup("pointregTest0003");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0003.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Validity Check failed: Pixels From Edge is less than"
+ " tolerance 5 Line Residual is greater than tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0003.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ PvlGroup pointregTest0004 = deletedMeasures.findGroup("pointregTest0004");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0004.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0004.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Point deleted");
+ PvlGroup pointregTest0011 = deletedMeasures.findGroup("pointregTest0011");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0011.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Validity Check failed: Pixels From Edge is less than"
+ " tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0011.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 7);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 7);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 14);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * FunctionalTestCneteditCheckValidIgnoreAll
+ *
+ * Cnetedit test of check valid functionality with IGNOREALL=YES.
+ * Input ...
+ * 1) ControlNet with 11 points (data/cnetedit/cnet_11pts.pvl)
+ * 2) two image cube list file (data/cnetedit/PSP_002733_1880_RED4.crop.cub;
+ * data/cnetedit/PSP_002733_1880_RED5.crop.cub)
+ * 3) def file
+ * 4) CHECKVALID = yes
+ * 5) IGNOREALL=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(CneteditCheckValid, FunctionalTestCneteditCheckValidIgnoreAll) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet11File,
+ "log=" + tempDir.path() + "/log.txt",
+ "checkvalid=yes",
+ "ignoreall=yes",
+ "fromlist=" + chkValidCubeListFile,
+ "deffile=" + defFile,
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditLog;
+
+ try {
+ cneteditLog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 7);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 14);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0001"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0002"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0003"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0004"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0007"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0008"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("pointregTest0011"),
+ "Too few measures");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup pointregTest0001 = deletedMeasures.findGroup("pointregTest0001");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0001.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Validity Check failed: Sample Residual is greater than "
+ "tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0001.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Reference ignored");
+ PvlGroup pointregTest0002 = deletedMeasures.findGroup("pointregTest0002");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0002.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0002.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Reference ignored");
+ PvlGroup pointregTest0003 = deletedMeasures.findGroup("pointregTest0003");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0003.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Validity Check failed: Pixels From Edge is less than"
+ " tolerance 5 Line Residual is greater than tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0003.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ PvlGroup pointregTest0004 = deletedMeasures.findGroup("pointregTest0004");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0004.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0004.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Reference ignored");
+ PvlGroup pointregTest0007 = deletedMeasures.findGroup("pointregTest0007");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0007.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Validity Check failed: Sample Residual is greater than "
+ "tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0007.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Reference ignored");
+ PvlGroup pointregTest0008 = deletedMeasures.findGroup("pointregTest0008");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0008.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Validity Check failed: Pixels From Edge is less than "
+ "tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0008.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Reference ignored");
+ PvlGroup pointregTest0011 = deletedMeasures.findGroup("pointregTest0011");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0011.
+ findKeyword("MRO/HIRISE/856864216:41044/RED5/2"),
+ "Validity Check failed: Pixels From Edge is less than"
+ " tolerance 5");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, pointregTest0011.
+ findKeyword("MRO/HIRISE/856864216:41044/RED4/2"),
+ "Point deleted");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 4);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 4);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 8);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditDefault
+ *
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, FunctionalTestCneteditDefault) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "log=" + tempDir.path() + "/log.txt",
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditLog;
+
+ try {
+ cneteditLog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 8);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 21);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0038"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0039"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0067"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup new0031 = deletedMeasures.findGroup("new0031");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0031.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0031.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0032 = deletedMeasures.findGroup("new0032");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0032.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0032.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0038 = deletedMeasures.findGroup("new0038");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0038.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0038.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0039 = deletedMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0064 = deletedMeasures.findGroup("new0064");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0064.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0064.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0064.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0065 = deletedMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0065.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0065.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0065.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0066").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0067 = deletedMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0068 = deletedMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 100);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 100);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 240);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditEditlock
+ *
+ * Cnetedit test of edit lock functionality.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) points list file
+ * 4) ignore=no
+ * 5) delete=no
+ * 6) lock=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, FunctionalTestCneteditEditlock) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "log=" + tempDir.path() + "/log.txt",
+ "cubelist=" + cubeListFile,
+ "pointlist=" + pointListFile,
+ "ignore=no",
+ "delete=no",
+ "lock=yes",
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditLog;
+
+ try {
+ cneteditLog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").groups(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject ignoredPoints = log.findObject("Ignored").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0038").
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0039 = ignoredMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0065").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0066").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0067 = ignoredMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0068 = ignoredMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 108);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 103);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 6); //should be 6
+ EXPECT_EQ(outNet.GetNumMeasures(), 261);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 10);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 52);
+}
+
+
+/**
+ * CneteditEditUnlock
+ *
+ * Cnetedit test of edit lock functionality with unlock=yes.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) points list file
+ * 4) ignore=no
+ * 5) delete=no
+ * 6) unlock=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, FunctionalTestCneteditEditUnlock) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "log=" + tempDir.path() + "/log.txt",
+ "cubelist=" + cubeListFile,
+ "pointlist=" + pointListFile,
+ "ignore=no",
+ "delete=no",
+ "unlock=yes",
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditLog;
+
+ try {
+ cneteditLog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject ignoredPoints = log.findObject("Ignored").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0038").
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0039 = ignoredMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0039.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0065").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0066").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0067 = ignoredMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0067.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0068 = ignoredMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, new0068.
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 108);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 103);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 261);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 10);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditError
+ *
+ * Cnetedit test given a nonexistant input ControlNet.
+ */
+TEST_F(Cnetedit, FunctionalTestCneteditError) {
+
+ QVector args = {"cnet=cnet.net",
+ "onet=cnet.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl log;
+
+ try {
+ log = cnetedit(ui);
+ FAIL() << "Expected Exception for an invalid control network";
+ }
+ catch(IException &e) {
+ EXPECT_TRUE(e.toString().toLatin1().contains("Invalid control network"))
+ << e.toString().toStdString();
+ }
+}
+
+
+/**
+ * CneteditIgnore
+ *
+ * Cnetedit test with IGNOREALL=YES
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) measure list file (new0001,data/cnetedit/e0902065.cal.sub.cub)
+ * 4) delete=no
+ * 5) ignoreall=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditIgnore) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "cubelist=" + cubeListFile,
+ "measurelist=" + measureListFile,
+ "onet=" + tempDir.path() + "/out.net",
+// "onet=/Users/kledmundson/ISISDev/cnetedit/Oct242023cne/ISIS3/isis/tests/data/cnetedit/ignore/truth/gtestCnet1.net",
+ "delete=no",
+ "ignoreall=yes",
+ "log=" + tempDir.path() + "/log.txt"
+// "log=/Users/kledmundson/ISISDev/cnetedit/Oct242023cne/ISIS3/isis/tests/data/cnetedit/ignore/truth/gtestLog1.txt",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check ignored points
+ PvlObject ignoredPoints = log.findObject("Ignored").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0001"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0002"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0038"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0039"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0067"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ PvlGroup new0001 = ignoredMeasures.findGroup("new0001");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0001.deleteKeyword("MGS/688540926:0/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Measure in MEASURELIST");
+
+ PvlGroup new0002 = ignoredMeasures.findGroup("new0002");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0002.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0002.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0038 = ignoredMeasures.findGroup("new0038");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0038.deleteKeyword("MGS/718369703:160/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+
+ PvlGroup new0039 = ignoredMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0064").
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0065 = ignoredMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0065.deleteKeyword("MGS/688540926:0/MOC-WA/RED");
+ new0065.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ PvlGroup new0066 = ignoredMeasures.findGroup("new0066");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0066.deleteKeyword("MGS/688540926:0/MOC-WA/RED");
+ new0066.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ PvlGroup new0067 = ignoredMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+
+ new0067.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ PvlGroup new0068 = ignoredMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0069").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0070").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0071").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0072").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0073").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0074").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0075").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0076").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0077").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0078").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0079").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0080").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0081").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0082").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0083").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0084").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0085").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0086").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0087").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0088").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0089").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0090").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0091").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0092").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0093").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0094").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0095").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0096").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0097").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0098").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0099").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0100").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0101").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0102").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0103").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0104").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0105").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0106").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0107").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0108").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 108);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 97);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 261);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 61);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditIgnoreMeasuresPoints
+ *
+ * Cnetedit test with ignore measures and points lists.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) point list file
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditIgnoreMeasuresPoints) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "cubelist=" + cubeListFile,
+ "log=" + tempDir.path() + "/log.txt",
+ "pointlist=" + pointListFile,
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 16);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 77);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0001"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0002"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0007"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0008"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0020"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0036"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0038"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0039"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0050"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0066"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0067"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup new0001 = deletedMeasures.findGroup("new0001");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0002 = deletedMeasures.findGroup("new0002");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0002.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0002.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0007 = deletedMeasures.findGroup("new0007");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0008 = deletedMeasures.findGroup("new0008");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0020 = deletedMeasures.findGroup("new0020");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0031 = deletedMeasures.findGroup("new0031");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0032 = deletedMeasures.findGroup("new0032");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0036 = deletedMeasures.findGroup("new0036");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0038 = deletedMeasures.findGroup("new0038");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0039 = deletedMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0050 = deletedMeasures.findGroup("new0050");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0064 = deletedMeasures.findGroup("new0064");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0065 = deletedMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0066 = deletedMeasures.findGroup("new0066");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0067 = deletedMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0068 = deletedMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0069").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0070").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0071").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0072").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0073").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0074").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0075").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0076").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0077").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0078").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0079").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0080").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0081").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0082").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0083").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0084").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0085").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0086").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0087").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0088").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0089").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0090").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0091").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0092").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0093").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0094").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0095").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0096").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0097").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0098").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0099").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0100").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0101").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0102").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0103").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0104").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0105").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0106").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0107").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0108").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 92);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 92);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 184);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditIgnorePoints
+ *
+ * Cnetedit test with ignore points list.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) point list file
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditIgnorePoints) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "log=" + tempDir.path() + "/log.txt",
+ "pointlist=" + pointListFile,
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 14);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 33);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0001"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0007"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0008"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0020"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0036"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0038"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0039"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0050"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0067"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup new0001 = deletedMeasures.findGroup("new0001");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0007 = deletedMeasures.findGroup("new0007");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0008 = deletedMeasures.findGroup("new0008");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0020 = deletedMeasures.findGroup("new0020");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0031 = deletedMeasures.findGroup("new0031");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0032 = deletedMeasures.findGroup("new0032");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0036 = deletedMeasures.findGroup("new0036");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0038 = deletedMeasures.findGroup("new0038");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0039 = deletedMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0050 = deletedMeasures.findGroup("new0050");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0064 = deletedMeasures.findGroup("new0064");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0064").
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0065 = deletedMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0066").
+ findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0067 = deletedMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0068 = deletedMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 94);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 94);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 228);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditIgnoreAllPoints
+ *
+ * Cnetedit test with ignore points list and IGNOREALL=YES.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) point list file
+ * 3) ignoreall=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditIgnoreAllPoints) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "log=" + tempDir.path() + "/log.txt",
+ "pointlist=" + pointListFile,
+ "ignoreall=yes",
+ "onet=" + tempDir.path() + "/out.net"
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 15);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 35);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0001"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0007"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0008"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0020"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0036"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0038"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0039"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0050"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0066"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0067"),
+ "Reference measure ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup new0001 = deletedMeasures.findGroup("new0001");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0007 = deletedMeasures.findGroup("new0007");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0008 = deletedMeasures.findGroup("new0008");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0020 = deletedMeasures.findGroup("new0020");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0031 = deletedMeasures.findGroup("new0031");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0032 = deletedMeasures.findGroup("new0032");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0036 = deletedMeasures.findGroup("new0036");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/691204200:96/MOC-WA/RED "),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0038 = deletedMeasures.findGroup("new0038");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0038.deleteKeyword("MGS/718369703:160/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0038.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0039 = deletedMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0050 = deletedMeasures.findGroup("new0050");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0064 = deletedMeasures.findGroup("new0064");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+ PvlGroup new0065 = deletedMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0065.deleteKeyword("MGS/688540926:0/MOC-WA/RED");
+ new0065.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0066 = deletedMeasures.findGroup("new0066");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+
+ new0066.deleteKeyword("MGS/688540926:0/MOC-WA/RED");
+ new0066.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0067 = deletedMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Reference ignored");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+
+ new0067.deleteKeyword("MGS/691204200:96/MOC-WA/RED");
+
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0068 = deletedMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 93);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 93);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 226);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+/**
+ * CneteditNoDelete
+ *
+ * Cnetedit test with DELETE=NO.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) point list file
+ * 4) delete=no
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditNoDelete) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "cubelist=" + cubeListFile,
+ "log=" + tempDir.path() + "/log.txt",
+ "pointlist=" + pointListFile,
+ "delete=no",
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check ignored points
+ PvlObject ignoredPoints = log.findObject("Ignored").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0001"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0007"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0008"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0020"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0036"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0050"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0001").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0002").
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0038").
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0039 = ignoredMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0064").
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0065 = ignoredMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0066 = ignoredMeasures.findGroup("new0066");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0067 = ignoredMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0068 = ignoredMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0069").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0070").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0071").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0072").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0073").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0074").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0075").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0076").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0077").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0078").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0079").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0080").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0081").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0082").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0083").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0084").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0085").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0086").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0087").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0088").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0089").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0090").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0091").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0092").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0093").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0094").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0095").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0096").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0097").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0098").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0099").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0100").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0101").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0102").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0103").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0104").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0105").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0106").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0107").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("new0108").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 108);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 97);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 261);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 55);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+/**
+ * CneteditPreservePoints
+ *
+ * Cnetedit test with PRESERVE=YES.
+ * Input ...
+ * 1) ControlNet with 108 points (data/cnetedit/cnet_108pts.pvl)
+ * 2) one image cube list file (data/cnetedit/e0902065.cal.sub.cub)
+ * 3) point list file
+ * 4) preserve=yes
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(Cnetedit, CneteditPreservePoints) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet108File,
+ "cubelist=" + cubeListFile,
+ "log=" + tempDir.path() + "/log.txt",
+ "pointlist=" + pointListFile,
+ "preserve=yes",
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 12);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 73);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0001"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0007"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0008"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0020"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0031"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0032"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0036"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0039"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0050"),
+ "Point ID in POINTLIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0064"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0065"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("new0068"),
+ "Ignored from input");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup new0001 = deletedMeasures.findGroup("new0001");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0001.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0002").
+ findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0007 = deletedMeasures.findGroup("new0007");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0007.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0008 = deletedMeasures.findGroup("new0008");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0008.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0020 = deletedMeasures.findGroup("new0020");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0020.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0031 = deletedMeasures.findGroup("new0031");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0031.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0032 = deletedMeasures.findGroup("new0032");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0032.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0036 = deletedMeasures.findGroup("new0036");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0036.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0038").
+ findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0039 = deletedMeasures.findGroup("new0039");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0039.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0050 = deletedMeasures.findGroup("new0050");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0050.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0064 = deletedMeasures.findGroup("new0064");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0064.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0065 = deletedMeasures.findGroup("new0065");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Point deleted");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0065.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Point deleted");
+ PvlGroup new0066 = deletedMeasures.findGroup("new0066");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0066.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Serial Number in CUBELIST");
+ PvlGroup new0067 = deletedMeasures.findGroup("new0067");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0067.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ PvlGroup new0068 = deletedMeasures.findGroup("new0068");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/718369703:160/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/688540926:0/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ new0068.findKeyword("MGS/691204200:96/MOC-WA/RED"),
+ "Ignored from input");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0069").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0070").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0071").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0072").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0073").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0074").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0075").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0076").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0077").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0078").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0079").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0080").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0081").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0082").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0083").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0084").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0085").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0086").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0087").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0088").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0089").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0090").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0091").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0092").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0093").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0094").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0095").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0096").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0097").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0098").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0099").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0100").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0101").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0102").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0103").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0104").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0105").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0106").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0107").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedMeasures.findGroup("new0108").
+ findKeyword("MGS/688540926:0/MOC-WA/RED "),
+ "Serial Number in CUBELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 96);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 96);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 188);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditMeasureListGeneral
+ * General cnetedit test with bad measures list.
+ * Input ...
+ * 1) ControlNet with 35 points (data/cnetedit/cnet_35pts.pvl)
+ * 2) list file of bad measures
+ * 3) delete=no
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(CneteditMeasureList, CneteditMeasureListGeneral) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet35File,
+ "log=" + tempDir.path() + "/log.txt",
+ "measurelist=" + badMeasureListFile1,
+ "delete=no",
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // no ignored points
+ EXPECT_EQ(log.findObject("Ignored").findObject("Points").keywords(), 0);
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ PvlGroup bndry_32 = ignoredMeasures.findGroup("I24827003RDR_bndry_32");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/766864399.204"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/764644820.000"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_35 = ignoredMeasures.findGroup("I24827003RDR_bndry_35");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/860700556.051"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_36 = ignoredMeasures.findGroup("I24827003RDR_bndry_36");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_50").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_53").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_56").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_8").
+ findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 35);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 35);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 91);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 11);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+/**
+ * CneteditMeasureListIgnoreAll
+ *
+ * Cnetedit test with bad measures list and IGNOREALL=YES; DELETE=NO.
+ * Input ...
+ * 1) ControlNet with 35 points (data/cnetedit/cnet_35pts.pvl)
+ * 2) bad measure list
+ * 3) ignoreall=yes
+ * 4) delete=no
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(CneteditMeasureList, CneteditMeasureListIgnoreAll) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet35File,
+ "log=" + tempDir.path() + "/log.txt",
+ "measurelist=" + badMeasureListFile2,
+ "ignoreall=yes",
+ "delete=no",
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 0);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"), 0);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // no ignored points
+ EXPECT_EQ(log.findObject("Ignored").findObject("Points").keywords(), 1);
+
+ // check ignored measures
+ PvlObject ignoredMeasures = log.findObject("Ignored").findObject("Measures");
+ PvlGroup bndry_32 = ignoredMeasures.findGroup("I24827003RDR_bndry_32");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/766864399.204"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/764644820.000"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_35 = ignoredMeasures.findGroup("I24827003RDR_bndry_35");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/860700556.051"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_36 = ignoredMeasures.findGroup("I24827003RDR_bndry_36");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_50").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_53").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_56").
+ findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, ignoredMeasures.findGroup("I24827003RDR_bndry_8").
+ findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 35);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 34);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 91);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 13);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
+
+
+/**
+ * CneteditMeasureListDelete
+ *
+ * Cnetedit test with bad measures list and delete=yes.
+ * Input ...
+ * 1) ControlNet with 35 points (data/cnetedit/cnet_35pts.pvl)
+ * 2) bad measure list
+ * 4) delete=yes (default)
+ *
+ * Output ...
+ * 1) edited ControlNet
+ * 2) Pvl log file.
+ */
+TEST_F(CneteditMeasureList, CneteditMeasureListDelete) {
+ QTemporaryDir tempDir;
+
+ QVector args = {"cnet=" + cnet35File,
+ "log=" + tempDir.path() + "/log.txt",
+ "measurelist=" + badMeasureListFile1,
+ "onet=" + tempDir.path() + "/out.net",
+ };
+
+ UserInterface ui(APP_XML, args);
+
+ Pvl cneteditlog;
+
+ try {
+ cneteditlog = cnetedit(ui);
+ }
+ catch(IException &e) {
+ FAIL() << e.toString().toStdString().c_str() << std::endl;
+ }
+
+ // read back log file
+ Pvl log;
+ try {
+ log.read(tempDir.path()+ "/log.txt");
+ }
+ catch (IException &e) {
+ FAIL() << "Unable to open log file: " << e.what() << std::endl;
+ }
+
+ // check number of deleted points and measures
+ EXPECT_EQ((int)log.findKeyword("PointsDeleted"), 5);
+ EXPECT_EQ((int)log.findKeyword("MeasuresDeleted"),16);
+
+ // no edit locked points or measures
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Points").keywords(), 0);
+ EXPECT_EQ(log.findObject("EditLocked").findObject("Measures").keywords(), 0);
+
+ // no retained references
+ EXPECT_EQ(log.findObject("RetainedReferences").keywords(), 0);
+
+ // check deleted points
+ PvlObject deletedPoints = log.findObject("Deleted").findObject("Points");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("I24827003RDR_bndry_32"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("I24827003RDR_bndry_50"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("I24827003RDR_bndry_53"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("I24827003RDR_bndry_56"),
+ "Too few measures");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual, deletedPoints.findKeyword("I24827003RDR_bndry_8"),
+ "Too few measures");
+
+ // check deleted measures
+ PvlObject deletedMeasures = log.findObject("Deleted").findObject("Measures");
+ PvlGroup bndry_32 = deletedMeasures.findGroup("I24827003RDR_bndry_32");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/766864399.204"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/764644820.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_32.findKeyword("Odyssey/THEMIS_IR/860700556.051"),
+ "Point deleted");
+ PvlGroup bndry_35 = deletedMeasures.findGroup("I24827003RDR_bndry_35");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/860700556.051"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_35.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_36 = deletedMeasures.findGroup("I24827003RDR_bndry_36");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_36.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ PvlGroup bndry_50 = deletedMeasures.findGroup("I24827003RDR_bndry_50");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_50.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_50.findKeyword("Odyssey/THEMIS_IR/823680993.230"),
+ "Point deleted");
+ PvlGroup bndry_53 = deletedMeasures.findGroup("I24827003RDR_bndry_53");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_53.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_53.findKeyword("Odyssey/THEMIS_IR/823680993.230"),
+ "Point deleted");
+ PvlGroup bndry_56 = deletedMeasures.findGroup("I24827003RDR_bndry_56");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_56.findKeyword("Odyssey/THEMIS_IR/869400711.102"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_56.findKeyword("Odyssey/THEMIS_IR/823680993.230"),
+ "Point deleted");
+ PvlGroup bndry_8 = deletedMeasures.findGroup("I24827003RDR_bndry_8");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_8.findKeyword("Odyssey/THEMIS_IR/748799078.000"),
+ "Measure in MEASURELIST");
+ EXPECT_PRED_FORMAT2(AssertQStringsEqual,
+ bndry_8.findKeyword("Odyssey/THEMIS_IR/760206015.230"),
+ "Point deleted");
+
+ // check output ControlNetwork
+ ControlNet outNet(tempDir.path() + "/out.net");
+ EXPECT_EQ(outNet.GetNumPoints(), 30);
+ EXPECT_EQ(outNet.GetNumValidPoints(), 30);
+ EXPECT_EQ(outNet.GetNumEditLockPoints(), 0);
+ EXPECT_EQ(outNet.GetNumMeasures(), 75);
+ EXPECT_EQ(outNet.GetNumIgnoredMeasures(), 0);
+ EXPECT_EQ(outNet.GetNumEditLockMeasures(), 0);
+}
\ No newline at end of file
diff --git a/isis/tests/data/cnetedit/I07873009RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I07873009RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..bea220d69b
--- /dev/null
+++ b/isis/tests/data/cnetedit/I07873009RDR.dstr.cub.label.pvl
@@ -0,0 +1,387 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 472
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 17936
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = MAPPING
+ StartTime = 2003-09-23T15:42:25.400
+ StopTime = 2003-09-23T15:52:23.262
+ SpacecraftClockCount = 748799078.000
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I07873009RDR
+ ProductCreationTime = 2004-10-14T00:21:58
+ ProductVersionId = 1.1
+ OrbitNumber = 07873
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 7873
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 2
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_map7.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_map7.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 23023617
+ Bytes = 8960
+ Records = 140
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 117603812.11191
+ CkTableEndTime = 117604414.30884
+ CkTableOriginalSize = 17937
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_map7.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 23032577
+ Bytes = 4200
+ Records = 75
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 117603812.11191
+ SpkTableEndTime = 117604414.30884
+ SpkTableOriginalSize = 17937.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_map7.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 23036777
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 117603812.11191
+ CkTableEndTime = 117604414.30884
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 266.33576028989
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 23036905
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 117603812.11191
+ SpkTableEndTime = 117604414.30884
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 23037017
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 23073798
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_748799078.000_COMPUTED = b4105486f7099c41
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 23037641
+ Bytes = 31880
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 23069521
+ Bytes = 4277
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I09477002RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I09477002RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..84d977c639
--- /dev/null
+++ b/isis/tests/data/cnetedit/I09477002RDR.dstr.cub.label.pvl
@@ -0,0 +1,387 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 10768
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = MAPPING
+ StartTime = 2004-02-02T16:17:44.937
+ StopTime = 2004-02-02T16:23:43.874
+ SpacecraftClockCount = 760206015.230
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I09477002RDR
+ ProductCreationTime = 2004-10-14T18:27:41
+ ProductVersionId = 1.1
+ OrbitNumber = 09477
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 9477
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 9
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_map9.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_map9.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 13991937
+ Bytes = 5504
+ Records = 86
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 129010729.38783
+ CkTableEndTime = 129011095.24634
+ CkTableOriginalSize = 10769
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_map9.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 13997441
+ Bytes = 1736
+ Records = 31
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 129010729.38783
+ SpkTableEndTime = 129011095.24634
+ SpkTableOriginalSize = 10769.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_map9.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 13999177
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 129010729.38783
+ CkTableEndTime = 129011095.24634
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 343.59609359065
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 13999305
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 129010729.38783
+ SpkTableEndTime = 129011095.24634
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 13999417
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 14024477
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_760206015.230_COMPUTED = e2727ca430c29e41
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 14000041
+ Bytes = 19582
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 14019623
+ Bytes = 4854
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I10101002RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I10101002RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..3801944460
--- /dev/null
+++ b/isis/tests/data/cnetedit/I10101002RDR.dstr.cub.label.pvl
@@ -0,0 +1,387 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 10768
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = MAPPING
+ StartTime = 2004-03-25T01:17:41.845
+ StopTime = 2004-03-25T01:23:40.774
+ SpacecraftClockCount = 764644820.000
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I10101002RDR
+ ProductCreationTime = 2004-10-15T00:32:17
+ ProductVersionId = 1.1
+ OrbitNumber = 10101
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 10101
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 9
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_map9.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_map9.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 13991937
+ Bytes = 5504
+ Records = 86
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 133449526.29696
+ CkTableEndTime = 133449892.15548
+ CkTableOriginalSize = 10769
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_map9.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 13997441
+ Bytes = 1568
+ Records = 28
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 133449526.29696
+ SpkTableEndTime = 133449892.15548
+ SpkTableOriginalSize = 10769.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_map9.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 13999009
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 133449526.29696
+ CkTableEndTime = 133449892.15548
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 9.5252197504187
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 13999137
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 133449526.29696
+ SpkTableEndTime = 133449892.15548
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 13999249
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 14024342
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_764644820.000_COMPUTED = 05661fd81cd19f41
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 13999873
+ Bytes = 19582
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 14019455
+ Bytes = 4887
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I10413004RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I10413004RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..fa1d80b26f
--- /dev/null
+++ b/isis/tests/data/cnetedit/I10413004RDR.dstr.cub.label.pvl
@@ -0,0 +1,387 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 450
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 3600
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = MAPPING
+ StartTime = 2004-04-19T17:50:38.067
+ StopTime = 2004-04-19T17:52:38.067
+ SpacecraftClockCount = 766864399.204
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I10413004RDR
+ ProductCreationTime = 2004-09-28T13:50:33
+ ProductVersionId = 1.0
+ OrbitNumber = 10413
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 10413
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 9
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_map10.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_map10.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 4673537
+ Bytes = 2048
+ Records = 32
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 135669102.51927
+ CkTableEndTime = 135669229.77585
+ CkTableOriginalSize = 3601
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_map10.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 4675585
+ Bytes = 336
+ Records = 6
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 135669102.51927
+ SpkTableEndTime = 135669229.77585
+ SpkTableOriginalSize = 3601.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_map10.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 4675921
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 135669102.51927
+ CkTableEndTime = 135669229.77585
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 21.755944220554
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 4676049
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 135669102.51927
+ SpkTableEndTime = 135669229.77585
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 4676161
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 4688865
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_766864399.204_COMPUTED = a08581dc4a2ca041
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 4676785
+ Bytes = 7198
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 4683983
+ Bytes = 4882
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I18400005RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I18400005RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..3c7096ad62
--- /dev/null
+++ b/isis/tests/data/cnetedit/I18400005RDR.dstr.cub.label.pvl
@@ -0,0 +1,388 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 10768
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = EXTENDED-1
+ StartTime = 2006-02-06T08:12:21.766
+ StopTime = 2006-02-06T08:18:20.703
+ SpacecraftClockCount = 823680993.230
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpatialSumming = 1
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I18400005RDR
+ ProductCreationTime = 2008-06-04T16:19:13
+ ProductVersionId = 1.1
+ OrbitNumber = 18400
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 18400
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 9
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_ext6.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_ext6.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 13991937
+ Bytes = 9024
+ Records = 141
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 192485606.20742
+ CkTableEndTime = 192485972.06594
+ CkTableOriginalSize = 10769
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_ext6.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 14000961
+ Bytes = 1736
+ Records = 31
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 192485606.20742
+ SpkTableEndTime = 192485972.06594
+ SpkTableOriginalSize = 10769.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_ext6.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 14002697
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 192485606.20742
+ CkTableEndTime = 192485972.06594
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 7.7251945911519
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 14002825
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 192485606.20742
+ SpkTableEndTime = 192485972.06594
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 14002937
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 14028182
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_823680993.230_COMPUTED = 68dbe1cb31f2a641
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 14003561
+ Bytes = 19582
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 14023143
+ Bytes = 5039
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I23604003RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I23604003RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..b71f721e2f
--- /dev/null
+++ b/isis/tests/data/cnetedit/I23604003RDR.dstr.cub.label.pvl
@@ -0,0 +1,388 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 320
+ TileLines = 449
+
+ Group = Dimensions
+ Samples = 320
+ Lines = 7184
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = EXTENDED-1
+ StartTime = 2007-04-10T19:24:04.439
+ StopTime = 2007-04-10T19:28:03.903
+ SpacecraftClockCount = 860700556.051
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpatialSumming = 1
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I23604003RDR
+ ProductCreationTime = 2007-04-13T15:26:13
+ ProductVersionId = 1.0
+ OrbitNumber = 23604
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 23604
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 9
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_ext11.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_ext11.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 9261057
+ Bytes = 3584
+ Records = 56
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 229505108.63108
+ CkTableEndTime = 229505355.18863
+ CkTableOriginalSize = 7185
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_ext11.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 9264641
+ Bytes = 896
+ Records = 16
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 229505108.63108
+ SpkTableEndTime = 229505355.18863
+ SpkTableOriginalSize = 7185.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_ext11.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 9265537
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 229505108.63108
+ CkTableEndTime = 229505355.18863
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 216.68369485425
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 9265665
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 229505108.63108
+ SpkTableEndTime = 229505355.18863
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 9265777
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 9284827
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_860700556.051_COMPUTED = 56c4baa8f05bab41
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 9266401
+ Bytes = 13390
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 9279791
+ Bytes = 5036
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/I24827003RDR.dstr.cub.label.pvl b/isis/tests/data/cnetedit/I24827003RDR.dstr.cub.label.pvl
new file mode 100644
index 0000000000..82e2439cc6
--- /dev/null
+++ b/isis/tests/data/cnetedit/I24827003RDR.dstr.cub.label.pvl
@@ -0,0 +1,388 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 160
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 160
+ Lines = 5384
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = MARS_ODYSSEY
+ InstrumentId = THEMIS_IR
+ TargetName = MARS
+ MissionPhaseName = EXTENDED-1
+ StartTime = 2007-07-20T12:06:24.995
+ StopTime = 2007-07-20T12:12:23.932
+ SpacecraftClockCount = 869400711.102
+ GainNumber = 16
+ OffsetNumber = 2
+ MissingScanLines = 0
+ TimeDelayIntegration = ENABLED
+ SpatialSumming = 2
+ SpacecraftClockOffset = 0.0
+ End_Group
+
+ Group = Archive
+ DataSetId = ODY-M-THM-3-IRRDR-V1.0
+ ProducerId = ODY_THM_TEAM
+ ProductId = I24827003RDR
+ ProductCreationTime = 2008-01-04T17:31:37
+ ProductVersionId = 1.0
+ OrbitNumber = 24827
+ FlightSoftwareVersionId = 1.00
+ CommandSequenceNumber = 24827
+ Description = "No Description Given"
+ End_Group
+
+ Group = BandBin
+ OriginalBand = 7
+ Center = 12.57
+ Width = 0.81
+ FilterNumber = 9
+ End_Group
+
+ Group = Kernels
+ NaifFrameCode = -53031
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table, $odyssey/kernels/ck/m01_sc_ext12.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+ Instrument = Null
+ SpacecraftClock = $odyssey/kernels/sclk/ORB1_SCLKSCET.00184.tsc
+ InstrumentPosition = (Table, $odyssey/kernels/spk/m01_ext12.bsp)
+ InstrumentAddendum = $odyssey/kernels/iak/themisAddendum003.ti
+ ShapeModel = $base/dems/molaMarsPlanetaryRadius0005.cub
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 2
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 3588097
+ Bytes = 5504
+ Records = 86
+ ByteOrder = Lsb
+ TimeDependentFrames = (-53000, 16, 1)
+ ConstantFrames = (-53031, -53030, -53000)
+ ConstantRotation = (0.0013835021734055, 0.011529976186854,
+ 0.99993257051207, 0.28811330695433, 0.95752799265849,
+ -0.011439651709814, -0.95759532594806,
+ 0.28810970640458, -0.0019971975093594)
+ CkTableStartTime = 238205250.8296
+ CkTableEndTime = 238205615.29006
+ CkTableOriginalSize = 5385
+ Description = "Created by spiceinit"
+ Kernels = ($odyssey/kernels/ck/m01_sc_ext12.bc,
+ $odyssey/kernels/fk/m01_v29.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 3593601
+ Bytes = 728
+ Records = 13
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ SpkTableStartTime = 238205250.8296
+ SpkTableEndTime = 238205615.29006
+ SpkTableOriginalSize = 5385.0
+ Description = "Created by spiceinit"
+ Kernels = $odyssey/kernels/spk/m01_ext12.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 3594329
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 238205250.8296
+ CkTableEndTime = 238205615.29006
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 280.0343296642
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 3594457
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ SpkTableStartTime = 238205250.8296
+ SpkTableEndTime = 238205615.29006
+ SpkTableOriginalSize = 2.0
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = CameraStatistics
+ StartByte = 3594569
+ Bytes = 624
+ Records = 12
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Name
+ Type = Text
+ Size = 20
+ End_Group
+
+ Group = Field
+ Name = Minimum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Maximum
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = Average
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = StandardDeviation
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 3609866
+ Bytes = 4311
+End_Object
+
+Object = NaifKeywords
+ BODY499_RADII = (3396.19, 3396.19, 3376.2)
+ BODY_FRAME_CODE = 10014
+ CLOCK_ET_-53_869400711.102_COMPUTED = b79a54827265ac41
+ INS-53031_TRANSX = (0.0, 0.05, 0.0)
+ INS-53031_TRANSY = (0.0, 0.0, 0.05)
+ INS-53031_ITRANSS = (0.0, 20.0, 0.0)
+ INS-53031_ITRANSL = (0.0, 0.0, 20.0)
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 3595193
+ Bytes = 9864
+End_Object
+
+Object = OriginalLabel
+ Name = IsisCube
+ StartByte = 3605057
+ Bytes = 4809
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/PSP_002733_1880_RED4.crop.pvl b/isis/tests/data/cnetedit/PSP_002733_1880_RED4.crop.pvl
new file mode 100644
index 0000000000..945a054912
--- /dev/null
+++ b/isis/tests/data/cnetedit/PSP_002733_1880_RED4.crop.pvl
@@ -0,0 +1,518 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 128
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 2048
+ Lines = 2000
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = "MARS RECONNAISSANCE ORBITER"
+ InstrumentId = HIRISE
+ TargetName = Mars
+ StartTime = 2007-02-25T09:49:57.917
+ StopTime = 2007-02-25T09:50:04.917
+ ObservationStartCount = 856864216:41044
+ SpacecraftClockStartCount = 856864216:53351
+ SpacecraftClockStopCount = 856864223:53351
+ ReadoutStartCount = 856864468:00780
+ CalibrationStartTime = 2007-02-25T09:49:57.902
+ CalibrationStartCount = 856864216:52387
+ MissionPhaseName = "PRIMARY SCIENCE PHASE"
+ LineExposureDuration = 87.5000
+ ScanExposureDuration = 87.5000
+ DeltaLineTimerCount = 216
+ Summing = 1
+ Tdi = 128
+ FocusPositionCount = 2023
+ PoweredCpmmFlag = (On, On, On, On, On, On, On, On, On, On, On,
+ On, On, On)
+ CpmmNumber = 5
+ CcdId = RED4
+ ChannelNumber = 2
+ LookupTableType = Stored
+ LookupTableNumber = 10
+ LookupTableMinimum = -9998
+ LookupTableMaximum = -9998
+ LookupTableMedian = -9998
+ LookupTableKValue = -9998
+ StimulationLampFlag = (Off, Off, Off)
+ HeaterControlFlag = (On, On, On, On, On, On, On, On, On, On, On,
+ On, On, On)
+ OptBnchFlexureTemperature = 20.0215
+ OptBnchMirrorTemperature = 20.1082
+ OptBnchFoldFlatTemperature = 20.3683
+ OptBnchFpaTemperature = 19.7615
+ OptBnchFpeTemperature = 19.5881
+ OptBnchLivingRmTemperature = 20.0215
+ OptBnchBoxBeamTemperature = 20.1949
+ OptBnchCoverTemperature = 19.9348
+ FieldStopTemperature = 18.4616
+ FpaPositiveYTemperature = 19.5881
+ FpaNegativeYTemperature = 19.5881
+ FpeTemperature = 17.7686
+ PrimaryMirrorMntTemperature = 20.1082
+ PrimaryMirrorTemperature = 20.455
+ PrimaryMirrorBafTemperature = 3.34153
+ MsTrussLeg0ATemperature = 19.8482
+ MsTrussLeg0BTemperature = 19.9348
+ MsTrussLeg120ATemperature = 19.4148
+ MsTrussLeg120BTemperature = 20.1949
+ MsTrussLeg240ATemperature = 20.5417
+ MsTrussLeg240BTemperature = 20.6284
+ BarrelBaffleTemperature = -12.4606
+ SunShadeTemperature = -14.001
+ SpiderLeg30Temperature = 16.1233
+ SpiderLeg120Temperature = -9999
+ SpiderLeg240Temperature = -9999
+ SecMirrorMtrRngTemperature = 19.7615
+ SecMirrorTemperature = 20.8885
+ SecMirrorBaffleTemperature = -9.71965
+ IeaTemperature = 25.9221
+ FocusMotorTemperature = 21.3221
+ IePwsBoardTemperature = 17.8502
+ CpmmPwsBoardTemperature = 21.4948
+ MechTlmBoardTemperature = 35.1464
+ InstContBoardTemperature = 34.6875
+ DllLockedFlag = (YES, YES)
+ DllResetCount = 0
+ DllLockedOnceFlag = (YES, YES)
+ DllFrequenceCorrectCount = 4
+ ADCTimingSetting = -9999
+ Unlutted = TRUE
+ StitchedChannels = (0, 1)
+ StitchedProductIds = (PSP_002733_1880_RED4_0,
+ PSP_002733_1880_RED4_1)
+ End_Group
+
+ Group = Archive
+ DataSetId = MRO-M-HIRISE-2-EDR-V1.0
+ ProducerId = UA
+ ObservationId = PSP_002733_1880
+ ProductId = PSP_002733_1880_RED4_0
+ ProductVersionId = 1.0
+ EdrProductCreationTime = 2007-02-25T22:21:23
+ RationaleDescription = Null
+ OrbitNumber = 2733
+ SoftwareName = "HiRISE_Observation v2.9.1 (2.43 2006/10/0
+ 05:41:12)"
+ ObservationStartTime = 2007-02-25T09:49:57.729
+ ReadoutStartTime = 2007-02-25T09:54:09.115
+ TrimLines = 1797
+ FelicsCompressionFlag = YES
+ IdFlightSoftwareName = IE_FSW_V4
+ End_Group
+
+ Group = BandBin
+ Name = Red
+ Center = 700
+ Width = 300
+ End_Group
+
+ Group = Kernels
+ NaifIkCode = -74699
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table,
+ $mro/kernels/ck/mro_sc_psp_070220_070226.bc,
+ $mro/kernels/fk/mro_v14.tf)
+ Instrument = $mro/kernels/ik/mro_hirise_v11.ti
+ SpacecraftClock = $mro/kernels/sclk/MRO_SCLKSCET.00038.65536.tsc
+ InstrumentPosition = (Table, $mro/kernels/spk/mro_psp2.bsp)
+ InstrumentAddendum = $mro/kernels/iak/hiriseAddendum006.ti
+ ShapeModel = Null
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 1
+ End_Group
+
+ Group = Radiometry
+ CalibrationParameters = (OFFSET:/HiRISE/Data/HiCalCoefficients/Matrices/B-
+ _TDI128_BIN1_0001.cub,
+ GAIN:/HiRISE/Data/HiCalCoefficients/Matrices/A_TD-
+ I128_BIN1_0001.cub,
+ GAIN:/HiRISE/Data/HiCalCoefficients/Matrices/G_TD-
+ I128_BIN1_0001.cub)
+ End_Group
+
+ Group = AlphaCube
+ AlphaSamples = 2048
+ AlphaLines = 80000
+ AlphaStartingSample = 0.5
+ AlphaStartingLine = 0.5
+ AlphaEndingSample = 2048.5
+ AlphaEndingLine = 2000.5
+ BetaSamples = 2048
+ BetaLines = 2000
+ End_Group
+
+ Group = RadiometricCalibration
+ Name = hiclean
+ Version = 1.4.1
+ Compatability = "Alan D. clean.pro, version 2/29 sep 2006"
+ Revision = "$Revision: 1.3 $"
+ MaskStartingRow = 21
+ MaskEndingRow = 38
+ BadMaskPixels = 0
+ MaskInducedNulls = 0
+ DarkStartingColumn = 4
+ DarkEndingColumn = 11
+ BadDarkPixels = 0
+ DarkInducedNulls = 0
+ LastGoodLine = 80000
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = "HiRISE Calibration Ancillary"
+ StartByte = 8454145
+ Bytes = 20160
+ Records = 168
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = GapFlag
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = LineNumber
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = BufferPixels
+ Type = Integer
+ Size = 12
+ End_Group
+
+ Group = Field
+ Name = DarkPixels
+ Type = Integer
+ Size = 16
+ End_Group
+End_Object
+
+Object = Table
+ Name = "HiRISE Calibration Image"
+ StartByte = 8474305
+ Bytes = 688128
+ Records = 168
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Calibration
+ Type = Integer
+ Size = 1024
+ End_Group
+End_Object
+
+Object = Table
+ Name = "HiRISE Ancillary"
+ StartByte = 9162433
+ Bytes = 9600000
+ Records = 80000
+ ByteOrder = Lsb
+ Association = Lines
+
+ Group = Field
+ Name = GapFlag
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = LineNumber
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = BufferPixels
+ Type = Integer
+ Size = 12
+ End_Group
+
+ Group = Field
+ Name = DarkPixels
+ Type = Integer
+ Size = 16
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 18762433
+ Bytes = 256
+ Records = 4
+ ByteOrder = Lsb
+ TimeDependentFrames = (-74000, -74900, 1)
+ ConstantFrames = (-74690, -74000)
+ ConstantRotation = (0.9999703083413, 0.0, -0.0077059999872177,
+ 8.81584889031119e-06, 0.99999934560434,
+ 0.0011439900269605, 0.0077059949444447,
+ -0.0011440239949305, 0.99996965396507)
+ CkTableStartTime = 225669063.07843
+ CkTableEndTime = 225669063.25343
+ CkTableOriginalSize = 2001
+ Description = "Created by spiceinit"
+ Kernels = ($mro/kernels/ck/mro_sc_psp_070220_070226.bc,
+ $mro/kernels/fk/mro_v14.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 21962473
+ Bytes = 168
+ Records = 3
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ Description = "Created by spiceinit"
+ Kernels = $mro/kernels/spk/mro_psp2.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 24522505
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 225669063.07843
+ CkTableEndTime = 225669063.25343
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 190.08669942814
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 27722545
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 30373328
+ Bytes = 14212
+End_Object
+
+Object = OriginalLabel
+ Name = OriginalLabel
+ StartByte = 30282577
+ Bytes = 30940
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 30369908
+ Bytes = 3420
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/PSP_002733_1880_RED5.crop.pvl b/isis/tests/data/cnetedit/PSP_002733_1880_RED5.crop.pvl
new file mode 100644
index 0000000000..683e0d6085
--- /dev/null
+++ b/isis/tests/data/cnetedit/PSP_002733_1880_RED5.crop.pvl
@@ -0,0 +1,518 @@
+Object = IsisCube
+ Object = Core
+ StartByte = 65537
+ Format = Tile
+ TileSamples = 128
+ TileLines = 128
+
+ Group = Dimensions
+ Samples = 2048
+ Lines = 2000
+ Bands = 1
+ End_Group
+
+ Group = Pixels
+ Type = Real
+ ByteOrder = Lsb
+ Base = 0.0
+ Multiplier = 1.0
+ End_Group
+ End_Object
+
+ Group = Instrument
+ SpacecraftName = "MARS RECONNAISSANCE ORBITER"
+ InstrumentId = HIRISE
+ TargetName = Mars
+ StartTime = 2007-02-25T09:49:57.866
+ StopTime = 2007-02-25T09:50:04.866
+ ObservationStartCount = 856864216:41044
+ SpacecraftClockStartCount = 856864216:50008
+ SpacecraftClockStopCount = 856864223:50008
+ ReadoutStartCount = 856864554:12778
+ CalibrationStartTime = 2007-02-25T09:49:57.851
+ CalibrationStartCount = 856864216:49044
+ MissionPhaseName = "PRIMARY SCIENCE PHASE"
+ LineExposureDuration = 87.5000
+ ScanExposureDuration = 87.5000
+ DeltaLineTimerCount = 216
+ Summing = 1
+ Tdi = 128
+ FocusPositionCount = 2023
+ PoweredCpmmFlag = (On, On, On, On, On, On, On, On, On, On, On,
+ On, On, On)
+ CpmmNumber = 8
+ CcdId = RED5
+ ChannelNumber = 2
+ LookupTableType = Stored
+ LookupTableNumber = 17
+ LookupTableMinimum = -9998
+ LookupTableMaximum = -9998
+ LookupTableMedian = -9998
+ LookupTableKValue = -9998
+ StimulationLampFlag = (Off, Off, Off)
+ HeaterControlFlag = (On, On, On, On, On, On, On, On, On, On, On,
+ On, On, On)
+ OptBnchFlexureTemperature = 20.0215
+ OptBnchMirrorTemperature = 20.1082
+ OptBnchFoldFlatTemperature = 20.3683
+ OptBnchFpaTemperature = 19.7615
+ OptBnchFpeTemperature = 19.5881
+ OptBnchLivingRmTemperature = 20.0215
+ OptBnchBoxBeamTemperature = 20.1949
+ OptBnchCoverTemperature = 19.9348
+ FieldStopTemperature = 18.4616
+ FpaPositiveYTemperature = 19.5881
+ FpaNegativeYTemperature = 19.5881
+ FpeTemperature = 17.7686
+ PrimaryMirrorMntTemperature = 20.1082
+ PrimaryMirrorTemperature = 20.455
+ PrimaryMirrorBafTemperature = 3.34153
+ MsTrussLeg0ATemperature = 19.8482
+ MsTrussLeg0BTemperature = 19.9348
+ MsTrussLeg120ATemperature = 19.4148
+ MsTrussLeg120BTemperature = 20.1949
+ MsTrussLeg240ATemperature = 20.5417
+ MsTrussLeg240BTemperature = 20.6284
+ BarrelBaffleTemperature = -12.4606
+ SunShadeTemperature = -14.001
+ SpiderLeg30Temperature = 16.1233
+ SpiderLeg120Temperature = -9999
+ SpiderLeg240Temperature = -9999
+ SecMirrorMtrRngTemperature = 19.7615
+ SecMirrorTemperature = 20.8885
+ SecMirrorBaffleTemperature = -9.71965
+ IeaTemperature = 25.9221
+ FocusMotorTemperature = 21.3221
+ IePwsBoardTemperature = 17.8502
+ CpmmPwsBoardTemperature = 21.4948
+ MechTlmBoardTemperature = 35.1464
+ InstContBoardTemperature = 34.6875
+ DllLockedFlag = (YES, YES)
+ DllResetCount = 0
+ DllLockedOnceFlag = (YES, YES)
+ DllFrequenceCorrectCount = 4
+ ADCTimingSetting = -9999
+ Unlutted = TRUE
+ StitchedChannels = (0, 1)
+ StitchedProductIds = (PSP_002733_1880_RED5_0,
+ PSP_002733_1880_RED5_1)
+ End_Group
+
+ Group = Archive
+ DataSetId = MRO-M-HIRISE-2-EDR-V1.0
+ ProducerId = UA
+ ObservationId = PSP_002733_1880
+ ProductId = PSP_002733_1880_RED5_0
+ ProductVersionId = 1.0
+ EdrProductCreationTime = 2007-02-25T22:27:25
+ RationaleDescription = Null
+ OrbitNumber = 2733
+ SoftwareName = "HiRISE_Observation v2.9.1 (2.43 2006/10/0
+ 05:41:12)"
+ ObservationStartTime = 2007-02-25T09:49:57.729
+ ReadoutStartTime = 2007-02-25T09:55:35.298
+ TrimLines = 1214
+ FelicsCompressionFlag = YES
+ IdFlightSoftwareName = IE_FSW_V4
+ End_Group
+
+ Group = BandBin
+ Name = Red
+ Center = 700
+ Width = 300
+ End_Group
+
+ Group = Kernels
+ NaifIkCode = -74699
+ LeapSecond = $base/kernels/lsk/naif0009.tls
+ TargetAttitudeShape = $base/kernels/pck/pck00009.tpc
+ TargetPosition = (Table, $base/kernels/spk/de405.bsp)
+ InstrumentPointing = (Table,
+ $mro/kernels/ck/mro_sc_psp_070220_070226.bc,
+ $mro/kernels/fk/mro_v14.tf)
+ Instrument = $mro/kernels/ik/mro_hirise_v11.ti
+ SpacecraftClock = $mro/kernels/sclk/MRO_SCLKSCET.00038.65536.tsc
+ InstrumentPosition = (Table, $mro/kernels/spk/mro_psp2.bsp)
+ InstrumentAddendum = $mro/kernels/iak/hiriseAddendum006.ti
+ ShapeModel = Null
+ InstrumentPositionQuality = Reconstructed
+ InstrumentPointingQuality = Reconstructed
+ CameraVersion = 1
+ End_Group
+
+ Group = Radiometry
+ CalibrationParameters = (OFFSET:/HiRISE/Data/HiCalCoefficients/Matrices/B-
+ _TDI128_BIN1_0001.cub,
+ GAIN:/HiRISE/Data/HiCalCoefficients/Matrices/A_TD-
+ I128_BIN1_0001.cub,
+ GAIN:/HiRISE/Data/HiCalCoefficients/Matrices/G_TD-
+ I128_BIN1_0001.cub)
+ End_Group
+
+ Group = AlphaCube
+ AlphaSamples = 2048
+ AlphaLines = 80000
+ AlphaStartingSample = 0.5
+ AlphaStartingLine = 0.5
+ AlphaEndingSample = 2048.5
+ AlphaEndingLine = 2000.5
+ BetaSamples = 2048
+ BetaLines = 2000
+ End_Group
+
+ Group = RadiometricCalibration
+ Name = hiclean
+ Version = 1.4.1
+ Compatability = "Alan D. clean.pro, version 2/29 sep 2006"
+ Revision = "$Revision: 1.3 $"
+ MaskStartingRow = 21
+ MaskEndingRow = 38
+ BadMaskPixels = 0
+ MaskInducedNulls = 0
+ DarkStartingColumn = 4
+ DarkEndingColumn = 11
+ BadDarkPixels = 0
+ DarkInducedNulls = 0
+ LastGoodLine = 80000
+ End_Group
+End_Object
+
+Object = Label
+ Bytes = 65536
+End_Object
+
+Object = Table
+ Name = "HiRISE Calibration Ancillary"
+ StartByte = 8454145
+ Bytes = 20160
+ Records = 168
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = GapFlag
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = LineNumber
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = BufferPixels
+ Type = Integer
+ Size = 12
+ End_Group
+
+ Group = Field
+ Name = DarkPixels
+ Type = Integer
+ Size = 16
+ End_Group
+End_Object
+
+Object = Table
+ Name = "HiRISE Calibration Image"
+ StartByte = 8474305
+ Bytes = 688128
+ Records = 168
+ ByteOrder = Lsb
+
+ Group = Field
+ Name = Calibration
+ Type = Integer
+ Size = 1024
+ End_Group
+End_Object
+
+Object = Table
+ Name = "HiRISE Ancillary"
+ StartByte = 9162433
+ Bytes = 9600000
+ Records = 80000
+ ByteOrder = Lsb
+ Association = Lines
+
+ Group = Field
+ Name = GapFlag
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = LineNumber
+ Type = Integer
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = BufferPixels
+ Type = Integer
+ Size = 12
+ End_Group
+
+ Group = Field
+ Name = DarkPixels
+ Type = Integer
+ Size = 16
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPointing
+ StartByte = 18762433
+ Bytes = 256
+ Records = 4
+ ByteOrder = Lsb
+ TimeDependentFrames = (-74000, -74900, 1)
+ ConstantFrames = (-74690, -74000)
+ ConstantRotation = (0.9999703083413, 0.0, -0.0077059999872177,
+ 8.81584889031119e-06, 0.99999934560434,
+ 0.0011439900269605, 0.0077059949444447,
+ -0.0011440239949305, 0.99996965396507)
+ CkTableStartTime = 225669063.02742
+ CkTableEndTime = 225669063.20242
+ CkTableOriginalSize = 2001
+ Description = "Created by spiceinit"
+ Kernels = ($mro/kernels/ck/mro_sc_psp_070220_070226.bc,
+ $mro/kernels/fk/mro_v14.tf)
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = InstrumentPosition
+ StartByte = 21962473
+ Bytes = 168
+ Records = 3
+ ByteOrder = Lsb
+ CacheType = HermiteSpline
+ Description = "Created by spiceinit"
+ Kernels = $mro/kernels/spk/mro_psp2.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = BodyRotation
+ StartByte = 24522505
+ Bytes = 128
+ Records = 2
+ ByteOrder = Lsb
+ TimeDependentFrames = (10014, 1)
+ CkTableStartTime = 225669063.02742
+ CkTableEndTime = 225669063.20242
+ CkTableOriginalSize = 2
+ Description = "Created by spiceinit"
+ Kernels = ($base/kernels/spk/de405.bsp,
+ $base/kernels/pck/pck00009.tpc)
+ SolarLongitude = 190.08669908562
+
+ Group = Field
+ Name = J2000Q0
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Q3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV1
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV2
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = AV3
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = Table
+ Name = SunPosition
+ StartByte = 27722545
+ Bytes = 112
+ Records = 2
+ ByteOrder = Lsb
+ CacheType = Linear
+ Description = "Created by spiceinit"
+ Kernels = $base/kernels/spk/de405.bsp
+
+ Group = Field
+ Name = J2000X
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Y
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000Z
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000XV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000YV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = J2000ZV
+ Type = Double
+ Size = 1
+ End_Group
+
+ Group = Field
+ Name = ET
+ Type = Double
+ Size = 1
+ End_Group
+End_Object
+
+Object = History
+ Name = IsisCube
+ StartByte = 30373330
+ Bytes = 14212
+End_Object
+
+Object = OriginalLabel
+ Name = OriginalLabel
+ StartByte = 30282577
+ Bytes = 30942
+End_Object
+
+Object = Polygon
+ Name = Footprint
+ StartByte = 30369910
+ Bytes = 3420
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/cnet_108pts.pvl b/isis/tests/data/cnetedit/cnet_108pts.pvl
new file mode 100644
index 0000000000..a9dfed4a99
--- /dev/null
+++ b/isis/tests/data/cnetedit/cnet_108pts.pvl
@@ -0,0 +1,3238 @@
+Object = ControlNetwork
+ NetworkId = NewNetwork
+ TargetName = Mars
+ UserName = caustin
+ Created = Null
+ LastModified = Null
+ Description = NewNetwork
+ Version = 5
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0001
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:31
+ Sample = 11.002362806422
+ Line = 422.04915727097
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:31
+ Sample = 1.6628550989635
+ Line = 328.45336149322
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0002
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:31
+ Sample = 18.215874334214
+ Line = 442.29284754422
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:31
+ Sample = 8.9231888331417
+ Line = 348.63944344774
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0003
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 472.66293186489
+ Line = 286.5028408727
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 462.63180582145
+ Line = 180.62363048896
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0004
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 475.15468487065
+ Line = 306.89233376838
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 465.1316930521
+ Line = 200.92276750532
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0005
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 477.53757440886
+ Line = 327.46214256434
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 467.5550525596
+ Line = 221.38613187076
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0006
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 480.23040562098
+ Line = 347.48594461527
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 470.2565958944
+ Line = 241.37444692109
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0007
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 215.83286033802
+ Line = 386.11449945343
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 205.84205510189
+ Line = 280.15987230805
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0008
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 27.52772891931
+ Line = 399.43869629082
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 18.020527100954
+ Line = 293.55619563515
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0009
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 66.029356641932
+ Line = 396.51994976475
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 56.3928897278
+ Line = 290.62638349716
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0010
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 104.71454341575
+ Line = 393.57978828151
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 94.960468344733
+ Line = 287.67316516766
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0011
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 143.55456618838
+ Line = 390.80933654525
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 133.69928982239
+ Line = 284.88669857134
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0012
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 182.45221586379
+ Line = 388.25314334373
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 172.51638102427
+ Line = 282.3135842755
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0013
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 218.33345803397
+ Line = 406.43165385853
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 208.3637100796
+ Line = 300.45509221498
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0014
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 257.10788297379
+ Line = 403.92827127584
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 247.09425026747
+ Line = 297.93934590851
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0015
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 295.81013351473
+ Line = 401.07147464254
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 285.76108663093
+ Line = 295.07114770209
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0016
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 334.2409901193
+ Line = 398.61327555411
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 324.1817366712
+ Line = 292.60034187579
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0017
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 372.38481470749
+ Line = 396.21013151637
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 362.33270246833
+ Line = 290.18438687577
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0018
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 410.2841487475
+ Line = 393.63779838354
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 400.24906215823
+ Line = 287.59640437607
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0019
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 447.11346910145
+ Line = 392.3965595217
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 437.1398375913
+ Line = 286.3359479599
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0020
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 35.314504786338
+ Line = 419.37682721863
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 25.789877685118
+ Line = 313.45441568757
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0021
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 73.879724569268
+ Line = 416.510362235
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 64.230148841699
+ Line = 310.5769812793
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0022
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 112.59354536983
+ Line = 413.53082913619
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 102.83112890233
+ Line = 307.58674074819
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0023
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 151.47688688712
+ Line = 410.97993475279
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 141.6258655717
+ Line = 305.02378286756
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0024
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 190.36508552431
+ Line = 408.17893239589
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 180.43582455199
+ Line = 302.21139421271
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0025
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 220.81867088281
+ Line = 426.99739584839
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 210.86181154898
+ Line = 320.98301723143
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0026
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 259.62261193082
+ Line = 424.18225627403
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 249.6163909158
+ Line = 318.15668410401
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0027
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 298.30899741076
+ Line = 421.42519521595
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 288.27100255896
+ Line = 315.38818888577
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0028
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 336.67502325167
+ Line = 419.15164091881
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 326.63233739384
+ Line = 313.10171234904
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0029
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 374.8088274976
+ Line = 416.71043920798
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 364.77378781645
+ Line = 310.64804045112
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0030
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 412.7433497737
+ Line = 414.01320951525
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 402.72610762286
+ Line = 307.93903526759
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0031
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 449.39753091028
+ Line = 413.04779127673
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 439.45072383102
+ Line = 306.9568034164
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0032
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 43.464883969992
+ Line = 439.2597477519
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 33.785100683671
+ Line = 333.44372186509
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0033
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 82.031381315359
+ Line = 436.43090829286
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 72.267021555104
+ Line = 330.56192690454
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0034
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 120.7671638813
+ Line = 433.67673785268
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 110.93424436092
+ Line = 327.75725841392
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0035
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 159.61329195052
+ Line = 431.1786289072
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 149.72990151882
+ Line = 325.21286995747
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0036
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 198.45415035333
+ Line = 428.54785222778
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 188.53108510233
+ Line = 322.54050296699
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0037
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 223.56671055391
+ Line = 447.23228271631
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 213.3680193192
+ Line = 341.41565776505
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0038
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Ignore = True
+ Sample = 262.29151761831
+ Line = 444.69748447539
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 252.07974106094
+ Line = 338.82993376889
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0039
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Ignore = True
+ Sample = 300.89010791282
+ Line = 442.0620807151
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Ignore = True
+ Sample = 290.68547871004
+ Line = 336.1462253802
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0040
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 339.25760065483
+ Line = 439.57228386989
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 329.07862766947
+ Line = 333.61118699507
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0041
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 377.34966143085
+ Line = 437.1164701152
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 367.21318088003
+ Line = 331.11187899492
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0042
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 415.17157257786
+ Line = 434.56008250241
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 405.09296772439
+ Line = 328.51259675658
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0043
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 451.89397453419
+ Line = 433.37769193293
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 441.8988274385
+ Line = 327.29998051101
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0044
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 13.541454340573
+ Line = 461.87473795926
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 3.7137561540906
+ Line = 356.38113613293
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0045
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 51.938895574767
+ Line = 459.03122322641
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 42.006442017098
+ Line = 353.47159461034
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0046
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 90.558527581699
+ Line = 456.27310299719
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 80.537235545132
+ Line = 350.65073017945
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0047
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 129.35190059662
+ Line = 453.78121391638
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 119.26018439067
+ Line = 348.10145811183
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0048
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 168.16802368972
+ Line = 451.12751290768
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 158.02073803666
+ Line = 345.39039327971
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0049
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 206.99014030732
+ Line = 448.4386990938
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 196.80364235828
+ Line = 342.64586897144
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0050
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 226.33117866633
+ Line = 467.58759283332
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 215.89971074881
+ Line = 362.00972482935
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0051
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 265.04255741077
+ Line = 465.02110268501
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 254.59646415154
+ Line = 359.3840500572
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0052
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 303.6479954802
+ Line = 462.28151086847
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 293.20268982868
+ Line = 356.58540905665
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0053
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 341.99675884552
+ Line = 459.81323396253
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 331.57208539356
+ Line = 354.0629701884
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0054
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 380.03388251292
+ Line = 457.45503614473
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 369.64769313335
+ Line = 351.65357406926
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0055
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 417.92282628311
+ Line = 454.70389565052
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 407.58769130151
+ Line = 348.84939882781
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0056
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 454.63786374006
+ Line = 453.49883330126
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 444.38378805588
+ Line = 347.60710671977
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0057
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 60.62584221893
+ Line = 478.85864591418
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 50.446464870616
+ Line = 373.56602044442
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0058
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 99.30081884234
+ Line = 476.2538782229
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 89.038905243482
+ Line = 370.88698959096
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0059
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 138.07605197639
+ Line = 473.63373806196
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 127.74358623113
+ Line = 368.2004283557
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0060
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 176.8933393194
+ Line = 470.97641350486
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 166.50656130793
+ Line = 365.47824912369
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0061
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 382.75999557669
+ Line = 477.68493710411
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 372.13679566215
+ Line = 372.08901208852
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0062
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 420.52829813638
+ Line = 475.15133662178
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 409.95804420569
+ Line = 369.49666811078
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0063
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 457.72885192594
+ Line = 472.99638403268
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:33
+ Sample = 447.23100437209
+ Line = 367.28844933244
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0064
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 457.6304846974
+ Line = 75.398182723679
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 474.83447903502
+ Line = 275.12751002867
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 467.5225551724
+ Line = 180.99580115403
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0065
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 460.01225255037
+ Line = 95.876800782756
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 477.187963359
+ Line = 295.70367014835
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 469.89397574436
+ Line = 201.56542498155
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0066
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+ Sample = 462.35208428959
+ Line = 116.36800076912
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 479.53352230593
+ Line = 316.30088843423
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 472.25532228181
+ Line = 222.14816684858
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0067
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 33.04943477971
+ Line = 207.64538731051
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 51.932170047058
+ Line = 407.05378039341
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 42.658880082357
+ Line = 313.39222000341
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0068
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 205.19224208483
+ Line = 215.86245786587
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 223.96005623139
+ Line = 415.65437180684
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Ignore = True
+ Sample = 215.20985155685
+ Line = 321.75094064898
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0069
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 243.95950172752
+ Line = 213.20782099833
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 262.61831136631
+ Line = 413.06490335698
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 254.02897765876
+ Line = 319.10606841165
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0070
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 282.60854604844
+ Line = 210.59602015523
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 301.12588456368
+ Line = 410.51802995416
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 292.71249261284
+ Line = 316.50416245431
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0071
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 321.08280074311
+ Line = 207.99772219339
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 339.42576541018
+ Line = 407.98462619752
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 331.20451888514
+ Line = 313.91571346014
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0072
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 1.9318287545343
+ Line = 230.65251394295
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 20.71510390822
+ Line = 430.09779971251
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 11.405115857796
+ Line = 336.47098191308
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0073
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 40.197992724746
+ Line = 227.68227481392
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 59.052790658398
+ Line = 427.19368883739
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 49.80843138117
+ Line = 333.51818027174
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0074
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 78.757251487916
+ Line = 224.96602512573
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 97.641116971002
+ Line = 424.54430570307
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 88.485503730667
+ Line = 330.82014340192
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0075
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 117.41224012231
+ Line = 222.00785504853
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 136.30405378312
+ Line = 421.65134801753
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 127.24974189508
+ Line = 327.87463218332
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0076
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 156.19715775607
+ Line = 219.1575052782
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 175.06015908186
+ Line = 418.86624970626
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 166.1273508863
+ Line = 325.03317358112
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0077
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 207.75060818821
+ Line = 236.31923835468
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 226.46286346465
+ Line = 436.21338827757
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 217.7516603177
+ Line = 342.26911316279
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0078
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 246.50250756643
+ Line = 233.71853580313
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 265.10091571913
+ Line = 433.67996341343
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 256.55019021969
+ Line = 339.68698873763
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0079
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 285.14809915517
+ Line = 231.03857862623
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 303.6055342191
+ Line = 431.06639750112
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 295.22768092533
+ Line = 337.02545730574
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0080
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 323.60491818759
+ Line = 228.4488703099
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 341.88795040063
+ Line = 428.54310007565
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 333.69790889885
+ Line = 334.45447746053
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0081
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 361.7423801317
+ Line = 226.10177726401
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 379.8128437515
+ Line = 426.26329064209
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 371.82708581589
+ Line = 332.1268065637
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0082
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 399.61875568541
+ Line = 223.62261082721
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 417.45549129239
+ Line = 423.8502381098
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 409.68217002062
+ Line = 329.66676251229
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0083
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 437.07471263846
+ Line = 221.28466899767
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 454.64731647662
+ Line = 421.57876031021
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 447.10042792123
+ Line = 327.34107303664
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0084
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 9.2728348419828
+ Line = 250.86120472502
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 28.03228422598
+ Line = 450.39562482308
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 18.772164358801
+ Line = 356.70695331817
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0085
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 47.576831614772
+ Line = 247.88912683565
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 66.398015039437
+ Line = 447.49348074201
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 57.206855272589
+ Line = 353.7544538475
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0086
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 86.128736340207
+ Line = 245.03816050386
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 104.97511458817
+ Line = 444.71338361445
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 95.872873826211
+ Line = 350.92399901593
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0087
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 124.81458927671
+ Line = 242.09895644984
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 143.65810104625
+ Line = 441.84489934573
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 134.65961115059
+ Line = 348.00592061661
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0088
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 163.61149616781
+ Line = 239.22804352143
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 182.41742908741
+ Line = 439.04475026917
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 173.54075885534
+ Line = 345.15658826528
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0089
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 210.28240398663
+ Line = 256.95948365094
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 228.95190144135
+ Line = 456.92687292921
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 220.28981014413
+ Line = 362.91588956689
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0090
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 249.02711018549
+ Line = 254.2567648022
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 267.58172263012
+ Line = 454.2957319601
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 259.07897306573
+ Line = 360.23418990954
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0091
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 287.66706609449
+ Line = 251.53246833885
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 306.07706817476
+ Line = 451.64271851927
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 297.74734956111
+ Line = 357.53157974596
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0092
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 326.10405196827
+ Line = 248.95666709406
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 344.33374949004
+ Line = 449.13920021898
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 336.19312649703
+ Line = 354.97824670457
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0093
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 364.22874451962
+ Line = 246.58401748283
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 382.24191641484
+ Line = 446.83967090939
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 374.30603198036
+ Line = 352.6288151688
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0094
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 402.08034166792
+ Line = 244.1081340044
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 419.85454454593
+ Line = 444.43667258752
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 412.13205666513
+ Line = 350.17670485629
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0095
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 439.64155090357
+ Line = 241.51723607622
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 457.15598607744
+ Line = 441.91838180779
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 449.65450271612
+ Line = 347.61016925278
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0096
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 16.706313553447
+ Line = 270.85785446436
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 35.495469601723
+ Line = 470.48373747509
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 26.244980889334
+ Line = 376.71994832416
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0097
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 55.096100211402
+ Line = 268.00710272558
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 73.926983952242
+ Line = 467.69892383747
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 64.760076105261
+ Line = 373.88649650395
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0098
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 93.653900937427
+ Line = 265.0532822766
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 112.49920617427
+ Line = 464.81148761724
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 103.43078817918
+ Line = 370.95055781871
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0099
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 132.37019878824
+ Line = 262.13677620159
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 151.19663836386
+ Line = 461.96248715372
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 142.24425262511
+ Line = 368.05273651857
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0100
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 171.19785333443
+ Line = 259.63363163384
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 189.95691061088
+ Line = 459.5295415342
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 181.14492956916
+ Line = 365.56950123898
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0101
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 212.81424378753
+ Line = 277.47574436131
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 231.50551171771
+ Line = 477.51787903431
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 222.82226310755
+ Line = 383.43333766726
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0102
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 251.55729692049
+ Line = 274.70165880063
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 270.1263973688
+ Line = 474.8112660352
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 261.61752210309
+ Line = 380.67741048979
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0103
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 290.17957584383
+ Line = 272.02267182857
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 308.59231734557
+ Line = 472.20099900447
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 300.27020286304
+ Line = 378.01742249825
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0104
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 328.58063576356
+ Line = 269.51561607631
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 346.80111690207
+ Line = 469.76413220215
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 338.67746829452
+ Line = 375.53030167793
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0105
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 366.70525962922
+ Line = 267.07668425596
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 384.70306691995
+ Line = 467.39641276823
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 376.79063695802
+ Line = 373.11196939834
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0106
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 404.61798154484
+ Line = 264.41868722101
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 422.37441658546
+ Line = 464.80965274513
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 414.68055033674
+ Line = 370.47509653686
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0107
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 441.66228137884
+ Line = 262.78248139854
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 459.11784379988
+ Line = 463.24871167321
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 451.66575491637
+ Line = 368.86094398859
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = new0108
+ ChooserName = Unknown
+ DateTime = 2012-05-03T12:58:49
+
+ Group = ControlMeasure
+ SerialNumber = MGS/718369703:160/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 178.94746933022
+ Line = 279.83515345393
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/688540926:0/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 197.72240205749
+ Line = 479.81896983674
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MGS/691204200:96/MOC-WA/RED
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-12-22T09:24:34
+ Sample = 188.89803974946
+ Line = 385.7773340193
+ End_Group
+ End_Object
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/cnet_11pts.pvl b/isis/tests/data/cnetedit/cnet_11pts.pvl
new file mode 100644
index 0000000000..da6e3473b1
--- /dev/null
+++ b/isis/tests/data/cnetedit/cnet_11pts.pvl
@@ -0,0 +1,344 @@
+Object = ControlNetwork
+ NetworkId = pointregTest
+ TargetName = Mars
+ UserName = jwalldren
+ Created = Null
+ LastModified = Null
+ Description = pointregAppTest
+ Version = 5
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0001
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2024.9426496396
+ Line = 1002.2851420811
+ SampleResidual = 10.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 24.231028472272
+ Line = 1003.4315948486
+ AprioriSample = 25.0
+ AprioriLine = 1000.0
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0002
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2037.6533300862
+ Line = 1184.6426576887
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 36.997759287231
+ Line = 1185.8466715131
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0003
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2003.8286760498
+ Line = 1361.3694076538
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 3.217924722872
+ Line = 1362.6534620013
+ SampleResidual = 0.0
+ LineResidual = 6.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0004
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+ Ignore = True
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2016.6480691753
+ Line = 1543.6421143668
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 16.046408804032
+ Line = 1545.0106370108
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0005
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2029.5446002794
+ Line = 1725.8194536482
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 28.925844700071
+ Line = 1727.3395423889
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0006
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2042.5256884771
+ Line = 1907.9279921395
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 41.865298408191
+ Line = 1909.6773033142
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0007
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2012.201404177
+ Line = 819.94669995989
+ SampleResidual = 11.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 11.40926078542
+ Line = 821.0601147243
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0008
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2045.9696349664
+ Line = 643.09835651943
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 45.063543577348
+ Line = 644.22982297625
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0009
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2033.1477595262
+ Line = 460.74015971592
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 32.112688695736
+ Line = 461.86277062552
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0010
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2020.272346886
+ Line = 278.31520571027
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 19.083908218492
+ Line = 279.54408318656
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = pointregTest0011
+ ChooserName = cnetbin2pvl
+ DateTime = 2023-11-15T08:30:46
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED4/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 2007.3360059905
+ Line = 95.954965318952
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = MRO/HIRISE/856864216:41044/RED5/2
+ MeasureType = Candidate
+ ChooserName = "Application autoseed"
+ DateTime = 2008-02-19T14:31:39
+ Sample = 5.9696691241626
+ Line = 97.276485443115
+ SampleResidual = 0.0
+ LineResidual = 0.0
+ End_Group
+ End_Object
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/cnet_35pts.pvl b/isis/tests/data/cnetedit/cnet_35pts.pvl
new file mode 100644
index 0000000000..c0556f3564
--- /dev/null
+++ b/isis/tests/data/cnetedit/cnet_35pts.pvl
@@ -0,0 +1,1623 @@
+Object = ControlNetwork
+ NetworkId = I24827003RDR_BOUNDARY_NET
+ TargetName = Mars
+ UserName = lweller
+ Created = 2011-12-15T23:19:37
+ LastModified = 2011-12-15T23:19:37
+ Description = "I24827003RDR IMAGE BOUNDARY NETWORK"
+ Version = 5
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_UL
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 27.607059317834
+ Line = 18.295111585227
+ AprioriSample = 27.592145368644
+ AprioriLine = 18.277370871022
+ MinimumPixelZScore = -9.1101292766656
+ MaximumPixelZScore = 7.1550838917398
+ GoodnessOfFit = 0.42491860555961
+ SubPixelCorrelation = 0.42491860555961
+ Obsolete_Eccentricity = 0.82500889401041
+ WholePixelCorrelation = 0.48094671315067
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 142.0
+ Line = 5710.0
+ AprioriSample = 137.85157104559
+ AprioriLine = 5723.5583837946
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 224.84594511441
+ Line = 1114.556157076
+ AprioriSample = 224.86109569625
+ AprioriLine = 1114.5366784126
+ MinimumPixelZScore = -9.1101292766656
+ MaximumPixelZScore = 7.1550838917398
+ GoodnessOfFit = 0.6301057592872
+ SubPixelCorrelation = 0.6301057592872
+ Obsolete_Eccentricity = 0.85464446637656
+ WholePixelCorrelation = 0.91990818731499
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 241.70373879742
+ Line = 4170.1757137588
+ AprioriSample = 241.66704417356
+ AprioriLine = 4170.1768448015
+ MinimumPixelZScore = -9.1101292766656
+ MaximumPixelZScore = 7.1550838917398
+ GoodnessOfFit = 0.52130053192069
+ SubPixelCorrelation = 0.52130053192069
+ Obsolete_Eccentricity = 0.87083916894004
+ WholePixelCorrelation = 0.68332380944365
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_UR
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 126.11723415114
+ Line = 14.624031718257
+ AprioriSample = 126.13262109331
+ AprioriLine = 14.60864867694
+ MinimumPixelZScore = -7.7826442877901
+ MaximumPixelZScore = 6.4531771874365
+ GoodnessOfFit = 0.54141035408281
+ SubPixelCorrelation = 0.54141035408281
+ Obsolete_Eccentricity = 0.80166834482906
+ WholePixelCorrelation = 0.59126689617359
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 167.0
+ Line = 4129.0
+ AprioriSample = 185.89330945024
+ AprioriLine = 4149.8781759925
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_LL
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 15.994142166447
+ Line = 5351.59876634
+ AprioriSample = 15.988352444663
+ AprioriLine = 5351.6271443448
+ MinimumPixelZScore = -1.3323758785145
+ MaximumPixelZScore = 1.7088719658458
+ GoodnessOfFit = 0.97152986956068
+ SubPixelCorrelation = 0.97152986956068
+ Obsolete_Eccentricity = 0.84992032708551
+ WholePixelCorrelation = 0.97231368866292
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/823680993.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 276.0
+ Line = 10691.0
+ AprioriSample = 294.45457233458
+ AprioriLine = 10704.104037218
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_CTR
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 72.351376549012
+ Line = 2683.7835945571
+ AprioriSample = 72.31156993241
+ AprioriLine = 2683.7871073413
+ MinimumPixelZScore = -10.556951321328
+ MaximumPixelZScore = 7.6843165392047
+ GoodnessOfFit = 0.42694248853572
+ SubPixelCorrelation = 0.42694248853572
+ Obsolete_Eccentricity = 0.86764337082849
+ WholePixelCorrelation = 0.47513217291136
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 62.0
+ Line = 9450.0
+ AprioriSample = 78.035822649479
+ AprioriLine = 9466.8664683336
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_1
+ ChooserName = cnetadd
+ DateTime = 2012-01-13T13:06:19
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 48.760708608846
+ Line = 34.687788591
+ AprioriSample = 48.783779645185
+ AprioriLine = 34.690686342128
+ MinimumPixelZScore = -10.336933423527
+ MaximumPixelZScore = 8.3466298590249
+ GoodnessOfFit = 0.42219888501096
+ SubPixelCorrelation = 0.42219888501096
+ Obsolete_Eccentricity = 0.81654602547138
+ WholePixelCorrelation = 0.4842514894252
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 185.0
+ Line = 5743.0
+ AprioriSample = 192.35430957356
+ AprioriLine = 5723.6616154452
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 268.02675159169
+ Line = 1147.6104906502
+ AprioriSample = 268.09033141866
+ AprioriLine = 1147.56287184
+ MinimumPixelZScore = -10.336933423527
+ MaximumPixelZScore = 8.3466298590249
+ GoodnessOfFit = 0.59150804215855
+ SubPixelCorrelation = 0.59150804215855
+ Obsolete_Eccentricity = 0.87243685463714
+ WholePixelCorrelation = 0.90247447994431
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 284.81369462788
+ Line = 4203.1792327291
+ AprioriSample = 284.85045436259
+ AprioriLine = 4203.2511600821
+ MinimumPixelZScore = -10.336933423527
+ MaximumPixelZScore = 8.3466298590249
+ GoodnessOfFit = 0.47601397505042
+ SubPixelCorrelation = 0.47601397505042
+ Obsolete_Eccentricity = 0.89216340544699
+ WholePixelCorrelation = 0.67632719937417
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_2
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 64.553532057187
+ Line = 16.16468261595
+ AprioriSample = 64.572486285992
+ AprioriLine = 16.159319580388
+ MinimumPixelZScore = -10.851025717118
+ MaximumPixelZScore = 9.0681589770554
+ GoodnessOfFit = 0.36725373651513
+ SubPixelCorrelation = 0.36725373651513
+ Obsolete_Eccentricity = 0.82699300047967
+ WholePixelCorrelation = 0.42843510599361
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 42.01598881521
+ Line = 4131.262421516
+ AprioriSample = 42.019306132363
+ AprioriLine = 4131.2821435604
+ MinimumPixelZScore = -10.851025717118
+ MaximumPixelZScore = 9.0681589770554
+ GoodnessOfFit = 0.58620780317928
+ SubPixelCorrelation = 0.58620780317928
+ Obsolete_Eccentricity = 0.85025939150097
+ WholePixelCorrelation = 0.85996682715537
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 217.0
+ Line = 5706.0
+ AprioriSample = 246.84321887463
+ AprioriLine = 5723.765018548
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_3
+ ChooserName = cnetadd
+ DateTime = 2012-01-13T13:06:19
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 121.11506062968
+ Line = 31.572854327236
+ AprioriSample = 121.14548884404
+ AprioriLine = 31.572969450255
+ MinimumPixelZScore = -8.5291500072502
+ MaximumPixelZScore = 7.7800103958966
+ GoodnessOfFit = 0.50147560129106
+ SubPixelCorrelation = 0.50147560129106
+ Obsolete_Eccentricity = 0.82257001244825
+ WholePixelCorrelation = 0.54888811579928
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 157.0
+ Line = 4163.0
+ AprioriSample = 126.98178618374
+ AprioriLine = 4149.931145305
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_4
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 138.20448769735
+ Line = 228.14972149796
+ AprioriSample = 138.2463996157
+ AprioriLine = 228.15056835088
+ MinimumPixelZScore = -8.3439788918745
+ MaximumPixelZScore = 6.8503359515919
+ GoodnessOfFit = 0.58524107005789
+ SubPixelCorrelation = 0.58524107005789
+ Obsolete_Eccentricity = 0.79963813984092
+ WholePixelCorrelation = 0.61793743687586
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 192.0
+ Line = 4555.0
+ AprioriSample = 186.03957998842
+ AprioriLine = 4558.6289790526
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_5
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 149.20509521588
+ Line = 423.93494885646
+ AprioriSample = 149.18783166409
+ AprioriLine = 423.90617198328
+ MinimumPixelZScore = -6.9567313793804
+ MaximumPixelZScore = 7.116669122997
+ GoodnessOfFit = 0.58378259591105
+ SubPixelCorrelation = 0.58378259591105
+ Obsolete_Eccentricity = 0.81140407536592
+ WholePixelCorrelation = 0.62604756787944
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 214.0
+ Line = 4945.0
+ AprioriSample = 186.32462775985
+ AprioriLine = 4967.2377534825
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_6
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 128.28737710591
+ Line = 651.23659834539
+ AprioriSample = 128.29832945259
+ AprioriLine = 651.26409956921
+ MinimumPixelZScore = -6.0616802552658
+ MaximumPixelZScore = 5.8974339078448
+ GoodnessOfFit = 0.46624774328617
+ SubPixelCorrelation = 0.46624774328617
+ Obsolete_Eccentricity = 0.66978571811643
+ WholePixelCorrelation = 0.50483735035139
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 173.0
+ Line = 5399.0
+ AprioriSample = 186.47612972153
+ AprioriLine = 5375.9772827805
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_8
+ ChooserName = cnetadd
+ DateTime = 2012-01-13T13:25:48
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/748799078.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 28.513330924664
+ Line = 15802.82320805
+ AprioriSample = 28.577348166348
+ AprioriLine = 15802.74722498
+ MinimumPixelZScore = -3.3013168477769
+ MaximumPixelZScore = 2.2949036325521
+ GoodnessOfFit = 0.71147478712267
+ SubPixelCorrelation = 0.71147478712267
+ Obsolete_Eccentricity = 0.93900106979889
+ WholePixelCorrelation = 0.71074079991412
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 197.0
+ Line = 6217.0
+ AprioriSample = 187.20197125496
+ AprioriLine = 6193.3583087996
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_9
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 132.43324628739
+ Line = 1244.9963043389
+ AprioriSample = 132.41230089305
+ AprioriLine = 1244.9968964388
+ MinimumPixelZScore = -4.3267682575543
+ MaximumPixelZScore = 3.3036547408159
+ GoodnessOfFit = 0.64094554586329
+ SubPixelCorrelation = 0.64094554586329
+ Obsolete_Eccentricity = 0.69326613917787
+ WholePixelCorrelation = 0.70413968240039
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/748799078.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 139.20929458768
+ Line = 15461.410830143
+ AprioriSample = 139.07279851894
+ AprioriLine = 15461.411736985
+ MinimumPixelZScore = -4.3267682575543
+ MaximumPixelZScore = 3.3036547408159
+ GoodnessOfFit = 0.57147470389177
+ SubPixelCorrelation = 0.57147470389177
+ Obsolete_Eccentricity = 0.46252692121887
+ WholePixelCorrelation = 0.63489389099904
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 182.0
+ Line = 6582.0
+ AprioriSample = 187.43332157572
+ AprioriLine = 6601.9213229651
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_10
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 119.0
+ Line = 1437.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/748799078.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 273.65933086114
+ Line = 15088.126010294
+ AprioriSample = 273.79775945033
+ AprioriLine = 15088.279072135
+ MinimumPixelZScore = -4.5982076153028
+ MaximumPixelZScore = 5.1547250339538
+ GoodnessOfFit = 0.46437443646356
+ SubPixelCorrelation = 0.46437443646356
+ Obsolete_Eccentricity = 0.5755806348777
+ WholePixelCorrelation = 0.47471560826242
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 155.87633505028
+ Line = 6965.8249656384
+ AprioriSample = 155.75079341732
+ AprioriLine = 6965.8015269146
+ MinimumPixelZScore = -4.5982076153028
+ MaximumPixelZScore = 5.1547250339538
+ GoodnessOfFit = 0.6221840844042
+ SubPixelCorrelation = 0.6221840844042
+ Obsolete_Eccentricity = 0.78095310139119
+ WholePixelCorrelation = 0.67240071516507
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_11
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 118.0
+ Line = 1634.0
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 153.15891256983
+ Line = 7357.6539686369
+ AprioriSample = 153.22494967358
+ AprioriLine = 7357.6402737744
+ MinimumPixelZScore = -8.8742551139388
+ MaximumPixelZScore = 4.4648645875177
+ GoodnessOfFit = 0.43246786725171
+ SubPixelCorrelation = 0.43246786725171
+ Obsolete_Eccentricity = 0.84442625710954
+ WholePixelCorrelation = 0.57817462187924
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_12
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 121.49478999227
+ Line = 1856.731446573
+ AprioriSample = 121.50516007892
+ AprioriLine = 1856.7635557292
+ MinimumPixelZScore = -6.8138683213418
+ MaximumPixelZScore = 2.9308636161718
+ GoodnessOfFit = 0.64478667558312
+ SubPixelCorrelation = 0.64478667558312
+ Obsolete_Eccentricity = 0.72771562095133
+ WholePixelCorrelation = 0.66352150232528
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 161.0
+ Line = 7802.0
+ AprioriSample = 188.35852324024
+ AprioriLine = 7828.0151912856
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_13
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 137.57913021604
+ Line = 2075.8951198701
+ AprioriSample = 137.58325445598
+ AprioriLine = 2075.9164372763
+ MinimumPixelZScore = -5.1298466964338
+ MaximumPixelZScore = 3.768980062869
+ GoodnessOfFit = 0.63467767714999
+ SubPixelCorrelation = 0.63467767714999
+ Obsolete_Eccentricity = 0.74702153978772
+ WholePixelCorrelation = 0.66651958106393
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 194.0
+ Line = 8239.0
+ AprioriSample = 188.7116242464
+ AprioriLine = 8236.611878563
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_14
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 143.29125188489
+ Line = 2295.6657077538
+ AprioriSample = 143.27818713457
+ AprioriLine = 2295.7018251456
+ MinimumPixelZScore = -2.8495963378738
+ MaximumPixelZScore = 4.2726177946745
+ GoodnessOfFit = 0.50555393181678
+ SubPixelCorrelation = 0.50555393181678
+ Obsolete_Eccentricity = 0.84376716040979
+ WholePixelCorrelation = 0.52159173578701
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 207.0
+ Line = 8675.0
+ AprioriSample = 189.16494375722
+ AprioriLine = 8645.4100113685
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_15
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 145.30808018025
+ Line = 2477.1515954142
+ AprioriSample = 145.33233846913
+ AprioriLine = 2477.1921753136
+ MinimumPixelZScore = -3.5474697309863
+ MaximumPixelZScore = 2.6587565865915
+ GoodnessOfFit = 0.74011087203503
+ SubPixelCorrelation = 0.74011087203503
+ Obsolete_Eccentricity = 0.64299738534369
+ WholePixelCorrelation = 0.74945020462948
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 211.0
+ Line = 9039.0
+ AprioriSample = 189.75749469492
+ AprioriLine = 9054.1180252552
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_16
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 140.38785971346
+ Line = 2681.7415355665
+ AprioriSample = 140.40848396701
+ AprioriLine = 2681.7274129245
+ MinimumPixelZScore = -3.1758333116921
+ MaximumPixelZScore = 9.0338725240029
+ GoodnessOfFit = 0.64015829348973
+ SubPixelCorrelation = 0.64015829348973
+ Obsolete_Eccentricity = 0.83201034936892
+ WholePixelCorrelation = 0.66279412202517
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 200.0
+ Line = 9446.0
+ AprioriSample = 189.74898445243
+ AprioriLine = 9462.737163363
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_17
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 124.74745142602
+ Line = 2886.7706306145
+ AprioriSample = 124.71763854068
+ AprioriLine = 2886.7534192259
+ MinimumPixelZScore = -5.0257793273488
+ MaximumPixelZScore = 4.5136102504828
+ GoodnessOfFit = 0.64224423008729
+ SubPixelCorrelation = 0.64224423008729
+ Obsolete_Eccentricity = 0.88553794865542
+ WholePixelCorrelation = 0.6693638769383
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 169.0
+ Line = 9855.0
+ AprioriSample = 190.17574850163
+ AprioriLine = 9871.5220697322
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_19
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 133.32938592698
+ Line = 3304.5102172403
+ AprioriSample = 133.33076800753
+ AprioriLine = 3304.5111192353
+ MinimumPixelZScore = -3.5877838148283
+ MaximumPixelZScore = 5.9675648071378
+ GoodnessOfFit = 0.57259590692606
+ SubPixelCorrelation = 0.57259590692606
+ Obsolete_Eccentricity = 0.61612921400087
+ WholePixelCorrelation = 0.59797982339977
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/760206015.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 188.0
+ Line = 10688.0
+ AprioriSample = 191.38234151276
+ AprioriLine = 10688.903800361
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_32
+ ChooserName = cnetadd
+ DateTime = 2012-01-13T13:25:48
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 131.10154251818
+ Line = 6114.7427251932
+ AprioriSample = 131.08464580002
+ AprioriLine = 6114.72255253
+ MinimumPixelZScore = -6.7883347305594
+ MaximumPixelZScore = 3.0268974724574
+ GoodnessOfFit = 0.46612674246283
+ SubPixelCorrelation = 0.46612674246283
+ Obsolete_Eccentricity = 0.92407264183803
+ WholePixelCorrelation = 0.55739606549034
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 213.1699011323
+ Line = 1518.9151968876
+ AprioriSample = 213.26905955464
+ AprioriLine = 1518.9193152579
+ MinimumPixelZScore = -6.7883347305594
+ MaximumPixelZScore = 3.0268974724574
+ GoodnessOfFit = 0.41028456857734
+ SubPixelCorrelation = 0.41028456857734
+ Obsolete_Eccentricity = 0.91737961021451
+ WholePixelCorrelation = 0.49561038667554
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 231.0
+ Line = 4574.0
+ AprioriSample = 235.04493503215
+ AprioriLine = 4589.2309851386
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_33
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 32.243849071197
+ Line = 443.99293787456
+ AprioriSample = 32.267286312846
+ AprioriLine = 443.93790066253
+ MinimumPixelZScore = -9.4814064508761
+ MaximumPixelZScore = 7.613279128717
+ GoodnessOfFit = 0.35909430591995
+ SubPixelCorrelation = 0.35909430591995
+ Obsolete_Eccentricity = 0.86088783993688
+ WholePixelCorrelation = 0.42439889849862
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 150.0
+ Line = 6561.0
+ AprioriSample = 136.08250364324
+ AprioriLine = 6542.0592380917
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 231.61495841089
+ Line = 1964.6495319857
+ AprioriSample = 231.58016101587
+ AprioriLine = 1964.5656483556
+ MinimumPixelZScore = -9.4814064508761
+ MaximumPixelZScore = 7.613279128717
+ GoodnessOfFit = 0.63763367292373
+ SubPixelCorrelation = 0.63763367292373
+ Obsolete_Eccentricity = 0.88928007456266
+ WholePixelCorrelation = 0.9083985074489
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 248.64525826167
+ Line = 5019.6082778839
+ AprioriSample = 248.66537068953
+ AprioriLine = 5019.6509310444
+ MinimumPixelZScore = -9.4814064508761
+ MaximumPixelZScore = 7.613279128717
+ GoodnessOfFit = 0.47134697831144
+ SubPixelCorrelation = 0.47134697831144
+ Obsolete_Eccentricity = 0.90697269892977
+ WholePixelCorrelation = 0.67790447057524
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_34
+ ChooserName = cnetadd
+ DateTime = 2012-01-13T13:06:19
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 39.377323532456
+ Line = 644.45059392332
+ AprioriSample = 39.422550221501
+ AprioriLine = 644.48255376688
+ MinimumPixelZScore = -3.6303773877818
+ MaximumPixelZScore = 3.9449657352508
+ GoodnessOfFit = 0.68219867118992
+ SubPixelCorrelation = 0.68219867118992
+ Obsolete_Eccentricity = 0.6687629032313
+ WholePixelCorrelation = 0.69541576692436
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 165.0
+ Line = 6962.0
+ AprioriSample = 135.40596122852
+ AprioriLine = 6951.3519736314
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 245.82294568014
+ Line = 2365.749168986
+ AprioriSample = 245.80677488643
+ AprioriLine = 2365.659647922
+ MinimumPixelZScore = -3.6303773877818
+ MaximumPixelZScore = 3.9449657352508
+ GoodnessOfFit = 0.88500611615228
+ SubPixelCorrelation = 0.88500611615228
+ Obsolete_Eccentricity = 0.79641849988017
+ WholePixelCorrelation = 0.93879938608019
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 262.99285894944
+ Line = 5419.5752950317
+ AprioriSample = 262.93741513321
+ AprioriLine = 5419.5000790279
+ MinimumPixelZScore = -3.6303773877818
+ MaximumPixelZScore = 3.9449657352508
+ GoodnessOfFit = 0.8384872040154
+ SubPixelCorrelation = 0.8384872040154
+ Obsolete_Eccentricity = 0.80938385565388
+ WholePixelCorrelation = 0.88811262489038
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_35
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 38.84105669372
+ Line = 832.10752901602
+ AprioriSample = 38.80553051742
+ AprioriLine = 832.12557774503
+ MinimumPixelZScore = -3.8007083634248
+ MaximumPixelZScore = 4.4757735324342
+ GoodnessOfFit = 0.42116724718091
+ SubPixelCorrelation = 0.42116724718091
+ Obsolete_Eccentricity = 0.73339213911551
+ WholePixelCorrelation = 0.4230891360784
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/748799078.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 122.65301115881
+ Line = 16293.50679139
+ AprioriSample = 122.78458208301
+ AprioriLine = 16293.419624892
+ MinimumPixelZScore = -3.8007083634248
+ MaximumPixelZScore = 4.4757735324342
+ GoodnessOfFit = 0.44965842923952
+ SubPixelCorrelation = 0.44965842923952
+ Obsolete_Eccentricity = 0.84701026248297
+ WholePixelCorrelation = 0.45019255138853
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 150.0
+ Line = 7353.0
+ AprioriSample = 134.63818771615
+ AprioriLine = 7360.5513465387
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 230.33072524429
+ Line = 2756.0791608266
+ AprioriSample = 230.33084176063
+ AprioriLine = 2756.1290924305
+ MinimumPixelZScore = -3.8007083634248
+ MaximumPixelZScore = 4.4757735324342
+ GoodnessOfFit = 0.90144944908857
+ SubPixelCorrelation = 0.90144944908857
+ Obsolete_Eccentricity = 0.82298722113186
+ WholePixelCorrelation = 0.96435572021431
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 248.02226348435
+ Line = 5809.3611366058
+ AprioriSample = 248.02655270592
+ AprioriLine = 5809.4447753716
+ MinimumPixelZScore = -3.8007083634248
+ MaximumPixelZScore = 4.4757735324342
+ GoodnessOfFit = 0.71300187736795
+ SubPixelCorrelation = 0.71300187736795
+ Obsolete_Eccentricity = 0.8291423602584
+ WholePixelCorrelation = 0.76584458449782
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_36
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 19.767099267132
+ Line = 1053.224776834
+ AprioriSample = 19.768653236342
+ AprioriLine = 1053.2080015315
+ MinimumPixelZScore = -2.0483817202699
+ MaximumPixelZScore = 2.8640554045295
+ GoodnessOfFit = 0.58115488237753
+ SubPixelCorrelation = 0.58115488237753
+ Obsolete_Eccentricity = 0.85917790473711
+ WholePixelCorrelation = 0.5848321471167
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/748799078.000
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 291.4370894032
+ Line = 15864.748037614
+ AprioriSample = 291.36469422798
+ AprioriLine = 15864.232672573
+ MinimumPixelZScore = -2.0483817202699
+ MaximumPixelZScore = 2.8640554045295
+ GoodnessOfFit = 0.58326123746324
+ SubPixelCorrelation = 0.58326123746324
+ Obsolete_Eccentricity = 0.90296752695405
+ WholePixelCorrelation = 0.58348490860222
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 124.0
+ Line = 7777.0
+ AprioriSample = 133.54370444799
+ AprioriLine = 7769.8770322264
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 203.98302895363
+ Line = 3179.4605858777
+ AprioriSample = 203.85450286355
+ AprioriLine = 3179.5000595293
+ MinimumPixelZScore = -2.0483817202699
+ MaximumPixelZScore = 2.8640554045295
+ GoodnessOfFit = 0.97240168667426
+ SubPixelCorrelation = 0.97240168667426
+ Obsolete_Eccentricity = 0.85995206536045
+ WholePixelCorrelation = 0.98978024760144
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 220.86690968465
+ Line = 6234.9839367112
+ AprioriSample = 220.81710118731
+ AprioriLine = 6234.7801259019
+ MinimumPixelZScore = -2.0483817202699
+ MaximumPixelZScore = 2.8640554045295
+ GoodnessOfFit = 0.90014960228514
+ SubPixelCorrelation = 0.90014960228514
+ Obsolete_Eccentricity = 0.89695661349753
+ WholePixelCorrelation = 0.91793725667105
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_37
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 36.888733189199
+ Line = 1242.731084961
+ AprioriSample = 36.911483608247
+ AprioriLine = 1242.6935558131
+ MinimumPixelZScore = -3.5448692768999
+ MaximumPixelZScore = 3.21268016751
+ GoodnessOfFit = 0.59407851965547
+ SubPixelCorrelation = 0.59407851965547
+ Obsolete_Eccentricity = 0.74709296406025
+ WholePixelCorrelation = 0.60911835276394
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 157.0
+ Line = 8156.0
+ AprioriSample = 132.61992449207
+ AprioriLine = 8178.9207494154
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/766864399.204
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 236.2196163681
+ Line = 3558.0866737144
+ AprioriSample = 236.22665154064
+ AprioriLine = 3558.2674905463
+ MinimumPixelZScore = -3.5448692768999
+ MaximumPixelZScore = 3.21268016751
+ GoodnessOfFit = 0.92551012715239
+ SubPixelCorrelation = 0.92551012715239
+ Obsolete_Eccentricity = 0.79541873154535
+ WholePixelCorrelation = 0.96799250418854
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 253.44978676116
+ Line = 6612.4380581812
+ AprioriSample = 253.5215797661
+ AprioriLine = 6612.5086541373
+ MinimumPixelZScore = -3.5448692768999
+ MaximumPixelZScore = 3.21268016751
+ GoodnessOfFit = 0.81024350233636
+ SubPixelCorrelation = 0.81024350233636
+ Obsolete_Eccentricity = 0.83198975240015
+ WholePixelCorrelation = 0.85543090385472
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_38
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 34.966885270204
+ Line = 1445.2306971316
+ AprioriSample = 34.976625619327
+ AprioriLine = 1445.2507961096
+ MinimumPixelZScore = -2.7649404184731
+ MaximumPixelZScore = 3.885430669618
+ GoodnessOfFit = 0.50123049691391
+ SubPixelCorrelation = 0.50123049691391
+ Obsolete_Eccentricity = 0.71542230034353
+ WholePixelCorrelation = 0.52019516111106
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 152.0
+ Line = 8559.0
+ AprioriSample = 131.66372638651
+ AprioriLine = 8588.1443315449
+ Reference = True
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/860700556.051
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 248.54298985524
+ Line = 7015.0925938841
+ AprioriSample = 248.47477041243
+ AprioriLine = 7015.0708018329
+ MinimumPixelZScore = -2.7649404184731
+ MaximumPixelZScore = 3.885430669618
+ GoodnessOfFit = 0.57404993830787
+ SubPixelCorrelation = 0.57404993830787
+ Obsolete_Eccentricity = 0.79975823900933
+ WholePixelCorrelation = 0.61126341945065
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_39
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 21.124305682401
+ Line = 1660.7015570648
+ AprioriSample = 21.244027873838
+ AprioriLine = 1660.6652772725
+ MinimumPixelZScore = -9.91464328244
+ MaximumPixelZScore = 6.6095255951013
+ GoodnessOfFit = 0.40060655379026
+ SubPixelCorrelation = 0.40060655379026
+ Obsolete_Eccentricity = 0.8842462315449
+ WholePixelCorrelation = 0.42777155677984
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 122.0
+ Line = 8990.0
+ AprioriSample = 130.84304170727
+ AprioriLine = 8997.4098805041
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_41
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 39.651442821199
+ Line = 2081.9946567966
+ AprioriSample = 39.640958585734
+ AprioriLine = 2081.9963499484
+ MinimumPixelZScore = -2.0151952076585
+ MaximumPixelZScore = 1.89602994523
+ GoodnessOfFit = 0.91233424417264
+ SubPixelCorrelation = 0.91233424417264
+ Obsolete_Eccentricity = 0.8685408387441
+ WholePixelCorrelation = 0.91685736046086
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 158.0
+ Line = 9831.0
+ AprioriSample = 128.74374032515
+ AprioriLine = 9815.6199810588
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_43
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 40.331922777574
+ Line = 2498.4634598633
+ AprioriSample = 40.342396523112
+ AprioriLine = 2498.4688726782
+ MinimumPixelZScore = -2.1929700186508
+ MaximumPixelZScore = 2.6406477049999
+ GoodnessOfFit = 0.87903042477486
+ SubPixelCorrelation = 0.87903042477486
+ Obsolete_Eccentricity = 0.80945067719471
+ WholePixelCorrelation = 0.88307243605489
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/764644820.000
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 158.0
+ Line = 10661.0
+ AprioriSample = 126.82388485966
+ AprioriLine = 10634.051423648
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_50
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 14.277915476186
+ Line = 3935.2833714183
+ AprioriSample = 14.234425279049
+ AprioriLine = 3935.2313000495
+ MinimumPixelZScore = -3.2207280824112
+ MaximumPixelZScore = 2.179464511159
+ GoodnessOfFit = 0.61079317083437
+ SubPixelCorrelation = 0.61079317083437
+ Obsolete_Eccentricity = 0.83055975470962
+ WholePixelCorrelation = 0.621385909313
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/823680993.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 296.0
+ Line = 7863.0
+ AprioriSample = 317.16905352284
+ AprioriLine = 7832.2439273096
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_51
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 11.30320020209
+ Line = 4130.0913785706
+ AprioriSample = 11.27822009864
+ AprioriLine = 4130.0656229356
+ MinimumPixelZScore = -5.5551124504224
+ MaximumPixelZScore = 5.3507909286785
+ GoodnessOfFit = 0.43949327976759
+ SubPixelCorrelation = 0.43949327976759
+ Obsolete_Eccentricity = 0.76159002924015
+ WholePixelCorrelation = 0.46446010837209
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/823680993.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 286.0
+ Line = 8252.0
+ AprioriSample = 314.07066277501
+ AprioriLine = 8241.2675814639
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_53
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 30.377263509207
+ Line = 4535.7660808899
+ AprioriSample = 30.440341462824
+ AprioriLine = 4535.748993877
+ MinimumPixelZScore = -3.7311603048292
+ MaximumPixelZScore = 2.4776325037694
+ GoodnessOfFit = 0.61516820087654
+ SubPixelCorrelation = 0.61516820087654
+ Obsolete_Eccentricity = 0.74206145332326
+ WholePixelCorrelation = 0.61756685189949
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/823680993.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 297.0
+ Line = 9048.0
+ AprioriSample = 307.37707389729
+ AprioriLine = 9059.4587520006
+ Reference = True
+ End_Group
+ End_Object
+
+ Object = ControlPoint
+ PointType = Free
+ PointId = I24827003RDR_bndry_56
+ ChooserName = cnetadd
+ DateTime = 2011-12-15T23:20:27
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/869400711.102
+ MeasureType = RegisteredSubPixel
+ ChooserName = pointreg
+ DateTime = 2012-01-13T13:24:49
+ Sample = 28.435531108092
+ Line = 5157.421973579
+ AprioriSample = 28.433104417652
+ AprioriLine = 5157.4175236742
+ MinimumPixelZScore = -2.608895713487
+ MaximumPixelZScore = 3.0009659960998
+ GoodnessOfFit = 0.80009655417522
+ SubPixelCorrelation = 0.80009655417522
+ Obsolete_Eccentricity = 0.91052297013589
+ WholePixelCorrelation = 0.80523427372119
+ End_Group
+
+ Group = ControlMeasure
+ SerialNumber = Odyssey/THEMIS_IR/823680993.230
+ MeasureType = Candidate
+ ChooserName = cnetref
+ DateTime = 2011-12-15T23:20:28
+ Sample = 305.0
+ Line = 10302.0
+ AprioriSample = 297.73233806667
+ AprioriLine = 10286.943394023
+ Reference = True
+ End_Group
+ End_Object
+End_Object
+End
diff --git a/isis/tests/data/cnetedit/e0902065.cal.sub.cub b/isis/tests/data/cnetedit/e0902065.cal.sub.cub
new file mode 100644
index 0000000000..32bd8b0633
Binary files /dev/null and b/isis/tests/data/cnetedit/e0902065.cal.sub.cub differ