Isis 3 Programmer Reference
ControlNetStatistics.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "ControlNetStatistics.h"
10
11#include <QDebug>
12
13#include <geos_c.h>
14#include <geos/algorithm/ConvexHull.h>
15#include <geos/geom/CoordinateSequence.h>
16#include <geos/geom/Envelope.h>
17#include <geos/geom/Geometry.h>
18#include <geos/geom/GeometryFactory.h>
19#include <geos/geom/Polygon.h>
20
21#include "ControlNet.h"
22#include "ControlPoint.h"
23#include "ControlMeasure.h"
24#include "ControlMeasureLogData.h"
25#include "Cube.h"
26#include "CubeManager.h"
27#include "FileName.h"
28#include "IString.h"
29#include "Progress.h"
30#include "Pvl.h"
31#include "SpecialPixel.h"
32#include "Statistics.h"
33
34namespace Isis {
35
37 QString sPointType [] = { "Fixed", "Constrained", "Free" };
38
40 QString sBoolean[] = { "False", "True" };
41
51 ControlNetStatistics::ControlNetStatistics(ControlNet *pCNet, const QString &psSerialNumFile,
52 Progress *pProgress) {
53 numCNetImages = 0;
54 mCNet = pCNet;
55
56 mSerialNumList = SerialNumberList(psSerialNumFile);
58
59 mProgress = pProgress;
60
64 }
65
75 mCNet = pCNet;
76 mProgress = pProgress;
77
80 }
81
90
97 int numSn = mSerialNumList.size();
98 numCNetImages = 0;
99 for (int i=0; i<numSn; i++) {
100 QString sn = mSerialNumList.serialNumber(i);
101 mSerialNumMap[sn] = false;
102 }
103 }
104
116 pStatsGrp = PvlGroup("ControlNetSummary");
117 int numSN = mSerialNumList.size();
118
119 if (numSN) {
120 pStatsGrp += PvlKeyword("TotalImages", toString(numSN));
121 pStatsGrp += PvlKeyword("ImagesInControlNet", toString(numCNetImages));
122 }
123
124 pStatsGrp += PvlKeyword("TotalPoints", toString(mCNet->GetNumPoints()));
125 pStatsGrp += PvlKeyword("ValidPoints", toString(NumValidPoints()));
126 pStatsGrp += PvlKeyword("IgnoredPoints", toString(mCNet->GetNumPoints() - NumValidPoints()));
127 pStatsGrp += PvlKeyword("FixedPoints", toString(NumFixedPoints()));
128 pStatsGrp += PvlKeyword("ConstrainedPoints", toString(NumConstrainedPoints()));
129 pStatsGrp += PvlKeyword("FreePoints", toString(NumFreePoints()));
130 pStatsGrp += PvlKeyword("EditLockPoints", toString(mCNet->GetNumEditLockPoints()));
131
132 pStatsGrp += PvlKeyword("TotalMeasures", toString(NumMeasures()));
133 pStatsGrp += PvlKeyword("ValidMeasures", toString(NumValidMeasures()));
134 pStatsGrp += PvlKeyword("IgnoredMeasures", toString(NumIgnoredMeasures()));
135 pStatsGrp += PvlKeyword("EditLockMeasures", toString(mCNet->GetNumEditLockMeasures()));
136
137 double dValue = GetAverageResidual();
138 pStatsGrp += PvlKeyword("AvgResidual", (dValue == Null ? "Null" : toString(dValue)));
139
140 dValue = GetMinimumResidual();
141 pStatsGrp += PvlKeyword("MinResidual", (dValue == Null ? "Null" : toString(dValue)));
142
143 dValue = GetMaximumResidual();
144 pStatsGrp += PvlKeyword("MaxResidual", (dValue == Null ? "Null" : toString(dValue)));
145
146 dValue = GetMinLineResidual();
147 pStatsGrp += PvlKeyword("MinLineResidual", (dValue == Null ? "Null" : toString(dValue)));
148
149 dValue = GetMaxLineResidual();
150 pStatsGrp += PvlKeyword("MaxLineResidual", (dValue == Null ? "Null" : toString(dValue)));
151
152 dValue = GetMinSampleResidual();
153 pStatsGrp += PvlKeyword("MinSampleResidual", (dValue == Null ? "Null" : toString(dValue)));
154
155 dValue = GetMaxSampleResidual();
156 pStatsGrp += PvlKeyword("MaxSampleResidual", (dValue == Null ? "Null" : toString(dValue)));
157
158 // Shifts - Line, Sample, Pixel
159 dValue = GetMinLineShift();
160 pStatsGrp += PvlKeyword("MinLineShift", (dValue == Null ? "Null" : toString(dValue)));
161
162 dValue = GetMaxLineShift();
163 pStatsGrp += PvlKeyword("MaxLineShift", (dValue == Null ? "Null" : toString(dValue)));
164
165 dValue = GetMinSampleShift();
166 pStatsGrp += PvlKeyword("MinSampleShift", (dValue == Null ? "Null" : toString(dValue)));
167
168 dValue = GetMaxSampleShift();
169 pStatsGrp += PvlKeyword("MaxSampleShift", (dValue == Null ? "Null" : toString(dValue)));
170
171 dValue = GetAvgPixelShift();
172 pStatsGrp += PvlKeyword("AvgPixelShift", (dValue == Null ? "NA" : toString(dValue)));
173
174 dValue = GetMinPixelShift();
175 pStatsGrp += PvlKeyword("MinPixelShift", (dValue == Null ? "NA" : toString(dValue)));
176
177 dValue = GetMaxPixelShift();
178 pStatsGrp += PvlKeyword("MaxPixelShift", (dValue == Null ? "NA" : toString(dValue)));
179
180 dValue = mPointDoubleStats[minGFit];
181 pStatsGrp += PvlKeyword("MinGoodnessOfFit", (dValue == Null ? "NA" : toString(dValue)));
182
183 dValue = mPointDoubleStats[maxGFit];
184 pStatsGrp += PvlKeyword("MaxGoodnessOfFit", (dValue == Null ? "NA" : toString(dValue)));
185
186 dValue = mPointDoubleStats[minEccentricity];
187 pStatsGrp += PvlKeyword("MinEccentricity", (dValue == Null ? "NA" : toString(dValue)));
188
189 dValue = mPointDoubleStats[maxEccentricity];
190 pStatsGrp += PvlKeyword("MaxEccentricity", (dValue == Null ? "NA" : toString(dValue)));
191
192 dValue = mPointDoubleStats[minPixelZScore];
193 pStatsGrp += PvlKeyword("MinPixelZScore", (dValue == Null ? "NA" : toString(dValue)));
194
195 dValue = mPointDoubleStats[maxPixelZScore];
196 pStatsGrp += PvlKeyword("MaxPixelZScore", (dValue == Null ? "NA" : toString(dValue)));
197
198 // Convex Hull
199 if (mSerialNumList.size()) {
201 pStatsGrp += PvlKeyword("MinConvexHullRatio", (dValue == Null ? "Null" : toString(dValue)));
202
204 pStatsGrp += PvlKeyword("MaxConvexHullRatio", (dValue == Null ? "Null" : toString(dValue)));
205
207 pStatsGrp += PvlKeyword("AvgConvexHullRatio", (dValue == Null ? "Null" : toString(dValue)));
208 }
209 }
210
211
220 geos::geom::GeometryFactory::Ptr geosFactory = geos::geom::GeometryFactory::create();
221
222 CubeManager cubeMgr;
223 cubeMgr.SetNumOpenCubes(50);
224
225 QList<QString> cnetSerials = mCNet->GetCubeSerials();
226
227 if (mProgress != NULL) {
228 mProgress->SetText("Generating Image Stats.....");
229 mProgress->SetMaximumSteps(cnetSerials.size());
231 }
232
233 foreach (QString sn, cnetSerials) {
234 geos::geom::CoordinateSequence ptCoordinates;
235
236 // setup vector for number of image properties and init to 0
237 QVector<double> imgStats(numImageStats, 0);
238
239 // Open the cube to get the dimensions
240 Cube *cube = cubeMgr.OpenCube(mSerialNumList.fileName(sn));
241
242 mSerialNumMap[sn] = true;
243 numCNetImages++;
244
245 imgStats[imgSamples] = cube->sampleCount();
246 imgStats[imgLines] = cube->lineCount();
247 double cubeArea = imgStats[imgSamples] * imgStats[imgLines];
248
249 QList< ControlMeasure * > measures = mCNet->GetMeasuresInCube(sn);
250
251 // Populate pts with a list of control points
252 if (!measures.isEmpty()) {
253 foreach (ControlMeasure * measure, measures) {
254 ControlPoint *parentPoint = measure->Parent();
255 imgStats[imgTotalPoints]++;
256 if (parentPoint->IsIgnored()) {
257 imgStats[imgIgnoredPoints]++;
258 }
259 if (parentPoint->GetType() == ControlPoint::Fixed) {
260 imgStats[imgFixedPoints]++;
261 }
262 if (parentPoint->GetType() == ControlPoint::Constrained) {
263 imgStats[imgConstrainedPoints]++;
264 }
265 if (parentPoint->GetType() == ControlPoint::Free) {
266 imgStats[imgFreePoints]++;
267 }
268 if (parentPoint->IsEditLocked()) {
269 imgStats[imgLockedPoints]++;
270 }
271 if (measure->IsEditLocked()) {
272 imgStats[imgLocked]++;
273 }
274 ptCoordinates.add(geos::geom::Coordinate(measure->GetSample(),
275 measure->GetLine()));
276 }
277
278 ptCoordinates.add(geos::geom::Coordinate(measures[0]->GetSample(),
279 measures[0]->GetLine()));
280 }
281
282 if (ptCoordinates.size() >= 4) {
283 // Calculate the convex hull
284
285 // Even though geos doesn't create valid linear rings/polygons from this set of coordinates,
286 // because it self-intersects many many times, it still correctly does a convex hull
287 // calculation on the points in the polygon.
288 geos::geom::Geometry * convexHull = geosFactory->createPolygon(
289 geosFactory->createLinearRing(ptCoordinates))->convexHull().release();
290
291 // Calculate the area of the convex hull
292 imgStats[imgConvexHullArea] = convexHull->getArea();
293 imgStats[imgConvexHullRatio] = imgStats[imgConvexHullArea] / cubeArea;
294 }
295
296 // Add info to statistics to get min, max and avg convex hull
297 mConvexHullStats.AddData(imgStats[imgConvexHullArea]);
298 mConvexHullRatioStats.AddData(imgStats[imgConvexHullRatio]);
299
300 mImageMap[sn] = imgStats;
301
302 // Update Progress
303 if (mProgress != NULL)
305 }
306 }
307
308
318 void ControlNetStatistics::PrintImageStats(const QString &psImageFile) {
319 // Check if the image list has been provided
320 if (!mSerialNumList.size()) {
321 QString msg = "Serial Number of Images has not been provided to get Image Stats";
322 throw IException(IException::User, msg, _FILEINFO_);
323 }
324
325 FileName outFile(psImageFile);
326 ofstream ostm;
327 QString outName(outFile.expanded());
328 ostm.open(outName.toLatin1().data(), std::ios::out);
329
330 if ( ostm.fail() ) {
331 QString msg = QObject::tr("Cannot open file [%1]").arg(psImageFile);
332 throw IException(IException::Io, msg, _FILEINFO_);
333 }
334
335 //map< QString, vector<double> >::iterator it;
336 // imgSamples, imgLines, imgTotalPoints, imgIgnoredPoints, imgFixedPoints, imgLockedPoints, imgLocked, imgConstrainedPoints, imgFreePoints, imgConvexHullArea, imgConvexHullRatio
338 // Log into the output file
339 ostm << "Filename, SerialNumber, TotalPoints, PointsIgnored, PointsEditLocked, Fixed, Constrained, Free, ConvexHullRatio" << endl;
340 //for (it = mImageMap.begin(); it != mImageMap.end(); it++) {
341
342 for (it = mSerialNumMap.begin(); it != mSerialNumMap.end(); it++) {
343 ostm << mSerialNumList.fileName(it.key()) << ", " << it.key() << ", ";
344 bool serialNumExists = it.value();
345 if (serialNumExists) {
346 QVector<double> imgStats = mImageMap[(it).key()] ;
347 ostm << imgStats[imgTotalPoints]<< ", " << imgStats[imgIgnoredPoints] << ", " ;
348 ostm << imgStats[imgLockedPoints] << ", " << imgStats[imgFixedPoints] << ", " ;
349 ostm << imgStats[imgConstrainedPoints] << ", " << imgStats[imgFreePoints] << ", ";
350 ostm << imgStats[imgConvexHullRatio] << endl;
351 }
352 else {
353 ostm << "0, 0, 0, 0, 0, 0, 0" << endl;
354 }
355 }
356
357 if (!ostm) {
358 QString msg = QObject::tr("Error writing to file: [%1]").arg(psImageFile);
359 throw IException(IException::Io, msg, _FILEINFO_);
360 }
361 ostm.close();
362 }
363
364
374 QVector<double> ControlNetStatistics::GetImageStatsBySerialNum(QString psSerialNum) const {
375 return (mImageMap.find(psSerialNum)).value();
376 }
377
378
388 void ControlNetStatistics::GeneratePointStats(const QString &psPointFile) {
389 Isis::FileName outFile(psPointFile);
390
391 ofstream ostm;
392 QString outName(outFile.expanded());
393 ostm.open(outName.toLatin1().data(), std::ios::out);
394
395 if ( ostm.fail() ) {
396 QString msg = QObject::tr("Cannot open file [%1]").arg(psPointFile);
397 throw IException(IException::Io, msg, _FILEINFO_);
398 }
399
400 ostm << " PointId, PointType, PointIgnore, PointEditLock, TotalMeasures, MeasuresValid, MeasuresIgnore, MeasuresEditLock" << endl;
401
402 int iNumPoints = mCNet->GetNumPoints();
403
404 // Initialise the Progress object
405 if (mProgress != NULL && iNumPoints > 0) {
406 mProgress->SetText("Point Stats: Loading Control Points...");
407 mProgress->SetMaximumSteps(iNumPoints);
409 }
410
411 for (int i = 0; i < iNumPoints; i++) {
412 const ControlPoint *cPoint = mCNet->GetPoint(i);
413 int iNumMeasures = cPoint->GetNumMeasures();
414 int iValidMeasures = cPoint->GetNumValidMeasures();
415 int iIgnoredMeasures = iNumMeasures - iValidMeasures;
416
417 // Log into the output file
418 ostm << cPoint->GetId() << ", " << sPointType[(int)cPoint->GetType()] << ", " << sBoolean[(int)cPoint->IsIgnored()] << ", " ;
419 ostm << sBoolean[(int)cPoint->IsEditLocked()] << ", " << iNumMeasures << ", " << iValidMeasures << ", ";
420 ostm << iIgnoredMeasures << ", " << cPoint->GetNumLockedMeasures() << endl;
421
422 // Update Progress
423 if (mProgress != NULL)
425 }
426
427 if (!ostm) {
428 QString msg = QObject::tr("Error writing to file: [%1]").arg(psPointFile);
429 throw IException(IException::Io, msg, _FILEINFO_);
430 }
431
432 ostm.close();
433 }
434
435
442 // Init all the entries
443 // totalPoints, validPoints, ignoredPoints, fixedPoints, constrainedPoints, editLockedPoints,
444 // totalMeasures, validMeasures, ignoredMeasures, editLockedMeasures
445 for (int i=0; i<numPointIntStats; i++) {
446 mPointIntStats[i] = 0;
447 }
448
449 int iNumPoints = mCNet->GetNumPoints();
450
451 // totalPoints
452 mPointIntStats[totalPoints] = iNumPoints;
453
454 for (int i = 0; i < iNumPoints; i++) {
455 if (!mCNet->GetPoint(i)->IsIgnored()) {
456 // validPoints
457 mPointIntStats[validPoints]++;
458 }
459 else {
460 // ignoredPoints
461 mPointIntStats[ignoredPoints]++;
462 }
463
464 // fixedPoints
465 if (mCNet->GetPoint(i)->GetType() == ControlPoint::Fixed)
466 mPointIntStats[fixedPoints]++;
467
468 // constrainedPoints
469 if (mCNet->GetPoint(i)->GetType() == ControlPoint::Constrained)
470 mPointIntStats[constrainedPoints]++;
471
472 // free points
473 if (mCNet->GetPoint(i)->GetType() == ControlPoint::Free)
474 mPointIntStats[freePoints]++;
475
476 // editLockedPoints
477 if (mCNet->GetPoint(i)->IsEditLocked()) {
478 mPointIntStats[editLockedPoints]++;
479 }
480
481 // totalMeasures
482 mPointIntStats[totalMeasures] += mCNet->GetPoint(i)->GetNumMeasures();
483
484 // validMeasures
485 mPointIntStats[validMeasures] += mCNet->GetPoint(i)->GetNumValidMeasures();
486
487 // editLockedMeasures
488 mPointIntStats[editLockedMeasures] += mCNet->GetPoint(i)->GetNumLockedMeasures();
489 }
490 // ignoredMeasures
491 mPointIntStats[ignoredMeasures] = mPointIntStats[totalMeasures] - mPointIntStats[validMeasures];
492 }
493
494
501 for (int i = 0; i < numPointDblStats; i++) {
503 }
504 }
505
506
515
516 int iNumPoints = mCNet->GetNumPoints();
517 double dValue = 0;
518
519 Statistics residualMagStats;
520 Statistics pixelShiftStats;
521
522 for (int i = 0; i < iNumPoints; i++) {
523 ControlPoint * cp = mCNet->GetPoint(i);
524
525 if (!cp->IsIgnored()) {
526 for (int cmIndex = 0; cmIndex < cp->GetNumMeasures(); cmIndex++) {
527 ControlMeasure *cm = cp->GetMeasure(cmIndex);
528
529 if (!cm->IsIgnored()) {
530 residualMagStats.AddData(cm->GetResidualMagnitude());
531
532 if (!IsSpecial(cm->GetPixelShift()))
533 pixelShiftStats.AddData(fabs(cm->GetPixelShift()));
534 }
535 }
536 }
537
538 Statistics resMagStats = cp->GetStatistic(
540 UpdateMinMaxStats(resMagStats, minResidual, maxResidual);
541
542 Statistics resLineStats = cp->GetStatistic(
543 &ControlMeasure::GetLineResidual);
544 UpdateMinMaxStats(resLineStats, minLineResidual, maxLineResidual);
545
546 Statistics resSampStats = cp->GetStatistic(
547 &ControlMeasure::GetSampleResidual);
548 UpdateMinMaxStats(resSampStats, minSampleResidual, maxSampleResidual);
549
550 Statistics pixShiftStats = cp->GetStatistic(
551 &ControlMeasure::GetPixelShift);
552 UpdateMinMaxStats(pixShiftStats, minPixelShift, maxPixelShift);
553
554 Statistics lineShiftStats = cp->GetStatistic(
555 &ControlMeasure::GetLineShift);
556 UpdateMinMaxStats(lineShiftStats, minLineShift, maxLineShift);
557
558 Statistics sampShiftStats = cp->GetStatistic(
559 &ControlMeasure::GetSampleShift);
560 UpdateMinMaxStats(sampShiftStats, minSampleShift, maxSampleShift);
561
562 Statistics gFitStats = cp->GetStatistic(
564 UpdateMinMaxStats(gFitStats, minGFit, maxGFit);
565
566 Statistics minPixelZScoreStats = cp->GetStatistic(
568
569 if (minPixelZScoreStats.ValidPixels()) {
570 dValue = fabs(minPixelZScoreStats.Minimum());
571 if (mPointDoubleStats[minPixelZScore] > dValue)
572 mPointDoubleStats[minPixelZScore] = dValue;
573 }
574
575 Statistics maxPixelZScoreStats = cp->GetStatistic(
577
578 if (maxPixelZScoreStats.ValidPixels()) {
579 dValue = fabs(maxPixelZScoreStats.Maximum());
580 if (mPointDoubleStats[maxPixelZScore] > dValue)
581 mPointDoubleStats[maxPixelZScore] = dValue;
582 }
583 }
584
585 // Average Residuals
586 mPointDoubleStats[avgResidual] = residualMagStats.Average();
587
588 // Average Shift
589 mPointDoubleStats[avgPixelShift] = pixelShiftStats.Average();
590 }
591
592
593 void ControlNetStatistics::UpdateMinMaxStats(const Statistics & stats,
594 ePointDoubleStats min, ePointDoubleStats max) {
595 if (stats.ValidPixels()) {
596 if (mPointDoubleStats[min] != Null) {
597 mPointDoubleStats[min] = qMin(
598 mPointDoubleStats[min], fabs(stats.Minimum()));
599 }
600 else {
601 mPointDoubleStats[min] = fabs(stats.Minimum());
602 }
603
604 if (mPointDoubleStats[max] != Null) {
605 mPointDoubleStats[max] = qMax(
606 mPointDoubleStats[max], fabs(stats.Maximum()));
607 }
608 else {
609 mPointDoubleStats[max] = fabs(stats.Maximum());
610 }
611 }
612 }
613}
a control measurement
double GetResidualMagnitude() const
Return Residual magnitude.
@ MinimumPixelZScore
Control measures store z-scores in pairs.
@ GoodnessOfFit
GoodnessOfFit is pointreg information for reference measures.
a control network
Definition ControlNet.h:258
int GetNumEditLockPoints()
Returns the number of edit locked control points.
int GetNumPoints() const
Return the number of control points in the network.
QList< ControlMeasure * > GetMeasuresInCube(QString serialNumber)
Get all the measures pertaining to a given cube serial number.
QList< QString > GetCubeSerials() const
Use this method to get a complete list of all the cube serial numbers in the network.
int GetNumEditLockMeasures()
Return the total number of edit locked measures for all control points in the network.
ControlNet * mCNet
Control Network.
int NumFixedPoints() const
Returns the Number of Fixed Points in the Control Net.
int NumValidPoints() const
Returns the Number of Valid (Not Ignored) Points in the Control Net.
double GetMinLineShift() const
Get Min and Max LineShift.
double GetMinimumResidual() const
Determine the minimum error of all points in the network.
double GetMaximumResidual() const
Determine the maximum error of all points in the network.
QMap< QString, QVector< double > > mImageMap
Contains stats by Image/Serial Num.
int NumFreePoints() const
Returns the number of Constrained Points in Control Net.
Statistics mConvexHullRatioStats
min, max, average convex hull stats
QVector< double > GetImageStatsBySerialNum(QString psSerialNum) const
Returns the Image Stats by Serial Number.
int NumValidMeasures() const
Returns the total Number of valid Measures in the Control Net.
double GetAvgPixelShift() const
Get network Avg PixelShift.
void PrintImageStats(const QString &psImageFile)
Print the Image Stats into specified output file.
void GetPointDoubleStats()
Get Point stats for Residuals and Shifts.
double GetMinSampleResidual() const
Determine the minimum sample error of all points in the network.
int NumIgnoredMeasures() const
Returns the total Number of Ignored Measures in the Control Net.
void InitPointDoubleStats()
Init Pointstats std::vector.
double GetMaxLineResidual() const
Determine the maximum line error of all points in the network.
void InitSerialNumMap()
Init SerialNum std::map.
double GetMaxLineShift() const
Get network Max LineShift.
QMap< int, int > mPointIntStats
Contains QMap of different count stats.
double GetMaxSampleResidual() const
Determine the maximum sample error of all points in the network.
void GenerateControlNetStats(PvlGroup &pStatsGrp)
Generate the Control Net Stats into the PvlGroup.
double GetMinPixelShift() const
Get network Min PixelShift.
double GetMaxSampleShift() const
Get network Max SampleShift.
int NumConstrainedPoints() const
Returns the number of Constrained Points in Control Net.
void GenerateImageStats()
Generate stats like Total, Ignored, Fixed Points in an Image.
SerialNumberList mSerialNumList
Serial Number List.
QMap< int, double > mPointDoubleStats
Contains QMap of different computed stats.
QMap< QString, bool > mSerialNumMap
Whether serial# is part of ControlNet.
void GeneratePointStats(const QString &psPointFile)
Generate stats like Ignored, Fixed, Total Measures, Ignored by Control Point.
Progress * mProgress
Progress state.
double GetAverageResidual() const
Determine the average error of all points in the network.
int NumMeasures() const
Returns the total Number of Measures in the Control Net.
double GetMaxPixelShift() const
Get network Max PixelShift.
double GetMinSampleShift() const
Get network Min SampleShift.
double GetMinLineResidual() const
Determine the minimum line error of all points in the network.
ControlNetStatistics(ControlNet *pCNet, const QString &psSerialNumFile, Progress *pProgress=0)
Constructor.
void GetPointIntStats()
Get point count stats.
A single control point.
PointType GetType() const
@ Constrained
A Constrained point is a Control Point whose lat/lon/radius is somewhat established and should not be...
@ Free
A Free point is a Control Point that identifies common measurements between two or more cubes.
@ Fixed
A Fixed point is a Control Point whose lat/lon is well established and should not be changed.
IO Handler for Isis Cubes.
Definition Cube.h:168
int lineCount() const
Definition Cube.cpp:1740
int sampleCount() const
Definition Cube.cpp:1813
Class for quick re-accessing of cubes based on file name.
Definition CubeManager.h:70
void SetNumOpenCubes(unsigned int numCubes)
This sets the maximum number of opened cubes for this instance of CubeManager.
File name manipulation and expansion.
Definition FileName.h:100
Isis exception class.
Definition IException.h:91
@ User
A type of error that could only have occurred due to a mistake on the user's part (e....
Definition IException.h:126
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition IException.h:155
Program progress reporter.
Definition Progress.h:42
void SetMaximumSteps(const int steps)
This sets the maximum number of steps in the process.
Definition Progress.cpp:85
void SetText(const QString &text)
Changes the value of the text string reported just before 0% processed.
Definition Progress.cpp:61
void CheckStatus()
Checks and updates the status.
Definition Progress.cpp:105
Contains multiple PvlContainers.
Definition PvlGroup.h:41
A single keyword-value pair.
Definition PvlKeyword.h:87
Serial Number list generator.
QString serialNumber(const QString &filename)
Return a serial number given a filename.
int size() const
How many serial number / filename combos are in the list.
QString fileName(const QString &sn)
Return a filename given a serial number.
This class is used to accumulate statistics on double arrays.
Definition Statistics.h:94
double Average() const
Computes and returns the average.
double Minimum() const
Returns the absolute minimum double found in all data passed through the AddData method.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
double Maximum() const
Returns the absolute maximum double found in all data passed through the AddData method.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
QString sPointType[]
String names for Point Type.
const double Null
Value for an Isis Null pixel.
QString sBoolean[]
String values for Boolean.
bool IsSpecial(const double d)
Returns if the input pixel is special.