Isis 3 Programmer Reference
BundleResults.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "BundleResults.h"
10
11#include <QDataStream>
12#include <QDebug>
13#include <QString>
14#include <QtGlobal> // qMax()
15#include <QUuid>
16#include <QXmlStreamWriter>
17
18#include <boost/lexical_cast.hpp>
19#include <boost/numeric/ublas/io.hpp>
20#include <boost/numeric/ublas/matrix_sparse.hpp>
21#include <boost/numeric/ublas/vector_proxy.hpp>
22
23#include "Camera.h"
24#include "ControlMeasure.h"
25#include "ControlPoint.h"
26#include "CorrelationMatrix.h"
27#include "Distance.h"
28#include "FileName.h"
29#include "IString.h"
30#include "MaximumLikelihoodWFunctions.h"
31#include "Project.h"
32#include "PvlKeyword.h"
33#include "PvlObject.h"
34#include "SerialNumberList.h"
35#include "StatCumProbDistDynCalc.h"
36#include "Statistics.h"
37#include "XmlStackedHandlerReader.h"
38
39using namespace boost::numeric::ublas;
40
41namespace Isis {
42
49
50 initialize();
51
55
56 // residual prob distribution is calculated even if there is no maximum likelihood estimation.
57 // so set up the solver to have a node at every percent of the distribution
59
60 }
61
62
72 QObject *parent) : QObject(parent) {
73 // TODO: does xml stuff need project???
74
75 initialize();
76
77 xmlReader->pushContentHandler(new XmlHandler(this, project));
78 xmlReader->setErrorHandler(new XmlHandler(this, project));
79
80 }
81
82
90 : m_correlationMatrix(new CorrelationMatrix(*src.m_correlationMatrix)),
91 m_numberFixedPoints(src.m_numberFixedPoints),
92 m_numberIgnoredPoints(src.m_numberIgnoredPoints),
93 m_numberHeldImages(src.m_numberHeldImages),
94 m_rmsXResiduals(src.m_rmsXResiduals),
95 m_rmsYResiduals(src.m_rmsYResiduals),
96 m_rmsXYResiduals(src.m_rmsXYResiduals),
97 m_rejectionLimit(src.m_rejectionLimit),
98 m_numberObservations(src.m_numberObservations),
99 m_numberImageObservations(src.m_numberImageObservations),
100 m_numberLidarImageObservations(src.m_numberLidarImageObservations),
101 m_numberRejectedObservations(src.m_numberRejectedObservations),
102 m_numberLidarRangeConstraintEquations(src.m_numberLidarRangeConstraintEquations),
103 m_numberUnknownParameters(src.m_numberUnknownParameters),
104 m_numberImageParameters(src.m_numberImageParameters),
105 m_numberConstrainedImageParameters(src.m_numberConstrainedImageParameters),
106 m_numberConstrainedPointParameters(src.m_numberConstrainedPointParameters),
107 m_numberConstrainedLidarPointParameters(src.m_numberConstrainedLidarPointParameters),
108 m_numberConstrainedTargetParameters(src.m_numberConstrainedTargetParameters),
109 m_degreesOfFreedom(src.m_degreesOfFreedom),
110 m_sigma0(src.m_sigma0),
111 m_elapsedTime(src.m_elapsedTime),
112 m_elapsedTimeErrorProp(src.m_elapsedTimeErrorProp),
113 m_converged(src.m_converged),
114 m_bundleControlPoints(src.m_bundleControlPoints),
115 m_bundleLidarPoints(src.m_bundleLidarPoints),
116 m_outNet(src.m_outNet),
117 m_outLidarData(src.m_outLidarData),
118 m_iterations(src.m_iterations),
119 m_observations(src.m_observations),
120 m_rmsImageSampleResiduals(src.m_rmsImageSampleResiduals),
121 m_rmsImageLineResiduals(src.m_rmsImageLineResiduals),
122 m_rmsImageResiduals(src.m_rmsImageResiduals),
123 m_rmsLidarImageSampleResiduals(src.m_rmsLidarImageSampleResiduals),
124 m_rmsLidarImageLineResiduals(src.m_rmsLidarImageLineResiduals),
125 m_rmsLidarImageResiduals(src.m_rmsLidarImageResiduals),
126 m_rmsImageXSigmas(src.m_rmsImageXSigmas),
127 m_rmsImageYSigmas(src.m_rmsImageYSigmas),
128 m_rmsImageZSigmas(src.m_rmsImageZSigmas),
129 m_rmsImageRASigmas(src.m_rmsImageRASigmas),
130 m_rmsImageDECSigmas(src.m_rmsImageDECSigmas),
131 m_rmsImageTWISTSigmas(src.m_rmsImageTWISTSigmas),
132 m_minSigmaCoord1Distance(src.m_minSigmaCoord1Distance),
133 m_maxSigmaCoord1Distance(src.m_maxSigmaCoord1Distance),
134 m_minSigmaCoord2Distance(src.m_minSigmaCoord2Distance),
135 m_maxSigmaCoord2Distance(src.m_maxSigmaCoord2Distance),
136 m_minSigmaCoord3Distance(src.m_minSigmaCoord3Distance),
137 m_maxSigmaCoord3Distance(src.m_maxSigmaCoord3Distance),
138 m_minSigmaCoord1PointId(src.m_minSigmaCoord1PointId),
139 m_maxSigmaCoord1PointId(src.m_maxSigmaCoord1PointId),
140 m_minSigmaCoord2PointId(src.m_minSigmaCoord2PointId),
141 m_maxSigmaCoord2PointId(src.m_maxSigmaCoord2PointId),
142 m_minSigmaCoord3PointId(src.m_minSigmaCoord3PointId),
143 m_maxSigmaCoord3PointId(src.m_maxSigmaCoord3PointId),
144 m_rmsSigmaCoord1Stats(src.m_rmsSigmaCoord1Stats),
145 m_rmsSigmaCoord2Stats(src.m_rmsSigmaCoord2Stats),
146 m_rmsSigmaCoord3Stats(src.m_rmsSigmaCoord3Stats),
147 m_maximumLikelihoodFunctions(src.m_maximumLikelihoodFunctions),
148 m_maximumLikelihoodIndex(src.m_maximumLikelihoodIndex),
149 m_cumPro(new StatCumProbDistDynCalc(*src.m_cumPro)),
150 m_cumProRes(new StatCumProbDistDynCalc(*src.m_cumProRes)),
151 m_maximumLikelihoodMedianR2Residuals(src.m_maximumLikelihoodMedianR2Residuals) {
152 }
153
154
159
160 delete m_correlationMatrix;
161 m_correlationMatrix = NULL;
162
163 delete m_cumPro;
164 m_cumPro = NULL;
165
166 delete m_cumProRes;
167 m_cumProRes = NULL;
168
169 }
170
171
179
180 if (&src != this) {
181 delete m_correlationMatrix;
182 m_correlationMatrix = NULL;
183 m_correlationMatrix = new CorrelationMatrix(*src.m_correlationMatrix);
184
185 m_numberFixedPoints = src.m_numberFixedPoints;
186 m_numberIgnoredPoints = src.m_numberIgnoredPoints;
187 m_numberHeldImages = src.m_numberHeldImages;
188 m_rmsXResiduals = src.m_rmsXResiduals;
189 m_rmsYResiduals = src.m_rmsYResiduals;
190 m_rmsXYResiduals = src.m_rmsXYResiduals;
191 m_rejectionLimit = src.m_rejectionLimit;
192 m_numberObservations = src.m_numberObservations;
193 m_numberImageObservations = src.m_numberImageObservations;
194 m_numberLidarImageObservations = src.m_numberLidarImageObservations;
195 m_numberRejectedObservations = src.m_numberRejectedObservations;
196 m_numberLidarRangeConstraintEquations = src.m_numberLidarRangeConstraintEquations;
197 m_numberUnknownParameters = src.m_numberUnknownParameters;
198 m_numberImageParameters = src.m_numberImageParameters;
199 m_numberConstrainedImageParameters = src.m_numberConstrainedImageParameters;
200 m_numberConstrainedPointParameters = src.m_numberConstrainedPointParameters;
201 m_numberConstrainedLidarPointParameters = src.m_numberConstrainedLidarPointParameters;
202 m_numberConstrainedTargetParameters = src.m_numberConstrainedTargetParameters;
203 m_degreesOfFreedom = src.m_degreesOfFreedom;
204 m_sigma0 = src.m_sigma0;
205 m_elapsedTime = src.m_elapsedTime;
206 m_elapsedTimeErrorProp = src.m_elapsedTimeErrorProp;
207 m_converged = src.m_converged;
208 m_bundleControlPoints = src.m_bundleControlPoints;
209 m_bundleLidarPoints = src.m_bundleLidarPoints;
210 m_outNet = src.m_outNet;
211 m_outLidarData = src.m_outLidarData;
212 m_iterations = src.m_iterations;
213 m_observations = src.m_observations;
214 m_rmsImageSampleResiduals = src.m_rmsImageSampleResiduals;
215 m_rmsImageLineResiduals = src.m_rmsImageLineResiduals;
216 m_rmsImageResiduals = src.m_rmsImageResiduals;
217 m_rmsLidarImageSampleResiduals = src.m_rmsLidarImageSampleResiduals;
218 m_rmsLidarImageLineResiduals = src.m_rmsLidarImageLineResiduals;
219 m_rmsLidarImageResiduals = src.m_rmsLidarImageResiduals;
220 m_rmsImageXSigmas = src.m_rmsImageXSigmas;
221 m_rmsImageYSigmas = src.m_rmsImageYSigmas;
222 m_rmsImageZSigmas = src.m_rmsImageZSigmas;
223 m_rmsImageRASigmas = src.m_rmsImageRASigmas;
224 m_rmsImageDECSigmas = src.m_rmsImageDECSigmas;
225 m_rmsImageTWISTSigmas = src.m_rmsImageTWISTSigmas;
226 m_minSigmaCoord1Distance = src.m_minSigmaCoord1Distance;
227 m_maxSigmaCoord1Distance = src.m_maxSigmaCoord1Distance;
228 m_minSigmaCoord2Distance = src.m_minSigmaCoord2Distance;
229 m_maxSigmaCoord2Distance = src.m_maxSigmaCoord2Distance;
230 m_minSigmaCoord3Distance = src.m_minSigmaCoord3Distance;
231 m_maxSigmaCoord3Distance = src.m_maxSigmaCoord3Distance;
232 m_minSigmaCoord1PointId = src.m_minSigmaCoord1PointId;
233 m_maxSigmaCoord1PointId = src.m_maxSigmaCoord1PointId;
234 m_minSigmaCoord2PointId = src.m_minSigmaCoord2PointId;
235 m_maxSigmaCoord2PointId = src.m_maxSigmaCoord2PointId;
236 m_minSigmaCoord3PointId = src.m_minSigmaCoord3PointId;
237 m_maxSigmaCoord3PointId = src.m_maxSigmaCoord3PointId;
238 m_rmsSigmaCoord1Stats = src.m_rmsSigmaCoord1Stats;
239 m_rmsSigmaCoord2Stats = src.m_rmsSigmaCoord2Stats;
240 m_rmsSigmaCoord3Stats = src.m_rmsSigmaCoord3Stats;
241 m_maximumLikelihoodFunctions = src.m_maximumLikelihoodFunctions;
242 m_maximumLikelihoodIndex = src.m_maximumLikelihoodIndex;
243
244 delete m_cumPro;
245 m_cumPro = NULL;
246 m_cumPro = new StatCumProbDistDynCalc(*src.m_cumPro);
247
248 delete m_cumProRes;
249 m_cumProRes = NULL;
250 m_cumProRes = new StatCumProbDistDynCalc(*src.m_cumProRes);
251
252 m_maximumLikelihoodMedianR2Residuals = src.m_maximumLikelihoodMedianR2Residuals;
253 }
254 return *this;
255 }
256
257
264 m_correlationMatrix = NULL;
265
266 m_numberFixedPoints = 0; // set in BA constructor->init->fillPointIndexMap
267 m_numberIgnoredPoints = 0; // set in BA constructor->init->fillPointIndexMap
268
269
270 // set in BundleAdjust init()
272
273 // members set while computing bundle stats
276 m_rmsImageResiduals.clear();
280 m_rmsImageXSigmas.clear();
281 m_rmsImageYSigmas.clear();
282 m_rmsImageZSigmas.clear();
283 m_rmsImageRASigmas.clear();
284 m_rmsImageDECSigmas.clear();
285 m_rmsImageTWISTSigmas.clear();
286
287 // Initialize coordinate sigma boundaries. Units are meters for sigmas in both
288 // latitudinal and rectangular coordinates
301
305
306
307 // set by compute residuals
308 m_rmsXResiduals = 0.0;
309 m_rmsYResiduals = 0.0;
310 m_rmsXYResiduals = 0.0;
311
312 // set by compute rejection limit
313 m_rejectionLimit = 0.0;
314
315 // set by flag outliers
317
318 // set by formNormalEquations_CHOLMOD, formNormalEquations_SPECIALK, or solve
323
324// ??? unused variable ??? m_numberHeldPoints = 0;
325
326 // set by formNormalEquations_CHOLMOD, formNormalEquations_SPECIALK, or
327 // setParameterWeights (i.e. solve)
333
334 // set by initialize, formNormalEquations_CHOLMOD, formNormalEquations_SPECIALK, or solve
336
337 // solve and solve cholesky
339 m_iterations = 0;
340 m_sigma0 = 0.0;
341 m_elapsedTime = 0.0;
343 m_converged = false; // or initialze method
344
345 m_cumPro = NULL;
349 m_cumProRes = NULL;
350
351 m_observations.clear();
352 m_outNet.clear();
353 m_outLidarData.clear();
354
355 }
356
357
364 m_rmsImageXSigmas.resize(numberImages);
365 m_rmsImageYSigmas.resize(numberImages);
366 m_rmsImageZSigmas.resize(numberImages);
367 m_rmsImageRASigmas.resize(numberImages);
368 m_rmsImageDECSigmas.resize(numberImages);
369 m_rmsImageTWISTSigmas.resize(numberImages);
370 }
371
372
373#if 0
374 void BundleResults::setRmsImageResidualLists(QVector<Statistics> rmsImageLineResiduals,
375 QVector<Statistics> rmsImageSampleResiduals,
376 QVector<Statistics> rmsImageResiduals) {
377 // QList??? jigsaw apptest gives - ASSERT failure in QList<T>::operator[]: "index out of range",
381 }
382#endif
383
384
392 void BundleResults::setRmsImageResidualLists(QList<Statistics> rmsImageLineResiduals,
393 QList<Statistics> rmsImageSampleResiduals,
394 QList<Statistics> rmsImageResiduals) {
398 }
399
400
408 void BundleResults::setRmsLidarImageResidualLists(QList<Statistics> rmsLidarImageLineResiduals,
409 QList<Statistics> rmsLidarImageSampleResiduals,
410 QList<Statistics> rmsLidarImageResiduals) {
414 }
415
416
425 void BundleResults::setSigmaCoord1Range(Distance minCoord1Dist, Distance maxCoord1Dist,
426 QString minCoord1PointId, QString maxCoord1PointId) {
427 m_minSigmaCoord1Distance = minCoord1Dist;
428 m_maxSigmaCoord1Distance = maxCoord1Dist;
429 m_minSigmaCoord1PointId = minCoord1PointId;
430 m_maxSigmaCoord1PointId = maxCoord1PointId;
431 }
432
433
442 void BundleResults::setSigmaCoord2Range(Distance minCoord2Dist, Distance maxCoord2Dist,
443 QString minCoord2PointId, QString maxCoord2PointId) {
444 m_minSigmaCoord2Distance = minCoord2Dist;
445 m_maxSigmaCoord2Distance = maxCoord2Dist;
446 m_minSigmaCoord2PointId = minCoord2PointId;
447 m_maxSigmaCoord2PointId = maxCoord2PointId;
448 }
449
450
459 void BundleResults::setSigmaCoord3Range(Distance minCoord3Dist, Distance maxCoord3Dist,
460 QString minCoord3PointId, QString maxCoord3PointId) {
461 m_minSigmaCoord3Distance = minCoord3Dist;
462 m_maxSigmaCoord3Distance = maxCoord3Dist;
463 m_minSigmaCoord3PointId = minCoord3PointId;
464 m_maxSigmaCoord3PointId = maxCoord3PointId;
465 }
466
467
476 double rmsFromSigmaCoord1Stats,
477 double rmsFromSigmaCoord2Stats,
478 double rmsFromSigmaCoord3Stats) {
479 m_rmsSigmaCoord1Stats = rmsFromSigmaCoord1Stats;
480 m_rmsSigmaCoord2Stats = rmsFromSigmaCoord2Stats;
481 m_rmsSigmaCoord3Stats = rmsFromSigmaCoord3Stats;
482 }
483
484
493 QList< QPair< MaximumLikelihoodWFunctions::Model, double > > modelsWithQuantiles) {
494
495
496 // reinitialize variables if this setup has already been called
499
500 // residual prob distribution is calculated even if there is no maximum likelihood estimation.
501 // set up the solver to have a node at every percent of the distribution
502 m_cumProRes = NULL;
505
506 // if numberMaximumLikelihoodModels > 0, then MaximumLikeliHood Estimation is being used.
507 for (int i = 0; i < modelsWithQuantiles.size(); i++) {
508
509 // if maximum likelihood is being used, the cum prob calculator is initialized.
510 if (i == 0) {
511 m_cumPro = NULL;
513 // set up the solver to have a node at every percent of the distribution
515 }
516
517 // set up the w functions for the maximum likelihood estimation
519 qMakePair(MaximumLikelihoodWFunctions(modelsWithQuantiles[i].first),
520 modelsWithQuantiles[i].second));
521
522 }
523
524
525 //maximum likelihood estimation tiered solutions requiring multiple convergeances are supported,
526 // this index keeps track of which tier the solution is in
528 }
529
530
535// printf("Maximum Likelihood Tier: %d\n", m_maximumLikelihoodIndex);
537 // if maximum likelihood estimation is being used
538 // at the end of every iteration
539 // reset the tweaking contant to the desired quantile of the |residual| distribution
541 double tc = m_cumPro->value(quantile);
542 m_maximumLikelihoodFunctions[m_maximumLikelihoodIndex].first.setTweakingConstant(tc);
543 // print meadians of residuals
545// printf("Median of R^2 residuals: %lf\n", m_maximumLikelihoodMedianR2Residuals);
546
547 //restart the dynamic calculation of the cumulative probility distribution of |R^2 residuals|
548 // so it will be up to date for the next iteration
550 }
551 }
552
553
560 m_cumPro->setQuantiles(nodes);
561 }
562
563
570 m_cumProRes->setQuantiles(nodes);
571 }
572
573
581 m_cumPro->addObs(observationValue);
582 }
583
584
592 m_cumProRes->addObs(observationValue);
593 }
594
595
603
604
611
612
621
622
629
630
639
640
647
648
657
658
666 void BundleResults::setRmsXYResiduals(double rx, double ry, double rxy) {
667 m_rmsXResiduals = rx;
668 m_rmsYResiduals = ry;
669 m_rmsXYResiduals = rxy;
670 }
671
672
678 void BundleResults::setRejectionLimit(double rejectionLimit) {
680 }
681
682
691
692
701
702
714
715
721 void BundleResults::setNumberLidarImageObservations(int numberLidarObservations) {
722 m_numberLidarImageObservations = numberLidarObservations;
723 }
724
725
731 void BundleResults::setNumberImageParameters(int numberParameters) {
732 m_numberImageParameters = numberParameters;
733 }
734
735
742 m_numberConstrainedPointParameters = numberParameters;
743 }
744
745
754
755
762
763
772
773
780
781
790
791
798
799
808
809
815 void BundleResults::setNumberUnknownParameters(int numberParameters) {
816 m_numberUnknownParameters = numberParameters;
817 }
818
819
825 void BundleResults::setNumberLidarRangeConstraints(int numberLidarRangeConstraints) {
826 m_numberLidarRangeConstraintEquations = numberLidarRangeConstraints;
827 }
828
829
843
844
863
864 if (m_degreesOfFreedom > 0) {
866 }
867 else if (m_degreesOfFreedom == 0 && criteria == BundleSettings::ParameterCorrections) {
868 m_sigma0 = dvtpv;
869 }
870 else {
871 QString msg = "Computed degrees of freedom [" + toString(m_degreesOfFreedom)
872 + "] is invalid.";
873 throw IException(IException::Io, msg, _FILEINFO_);
874 }
875
876 m_sigma0 = sqrt(m_sigma0);
877 }
878
879
885 void BundleResults::setDegreesOfFreedom(double degreesOfFreedom) { // old sparse
887 }
888
889
895 void BundleResults::setSigma0(double sigma0) { // old sparse
897 }
898
899
906 m_elapsedTime = time;
907 }
908
909
918
919
925 void BundleResults::setConverged(bool converged) {
926 m_converged = converged;
927 }
928
929
935 void BundleResults::setBundleControlPoints(QVector<BundleControlPointQsp> controlPoints) {
936 m_bundleControlPoints = controlPoints;
937 }
938
939
945 void BundleResults::setBundleLidarPoints(QVector<BundleLidarControlPointQsp> lidarPoints) {
946 m_bundleLidarPoints = lidarPoints;
947 }
948
949
958
959
966 m_outLidarData = outLidarData;
967 }
968
969
975 void BundleResults::setIterations(int iterations) {
977 }
978
979
988
989
990
991 //************************* Accessors **********************************************************//
992
998 QList<Statistics> BundleResults::rmsImageSampleResiduals() const {
1000 }
1001
1002
1008 QList<Statistics> BundleResults::rmsImageLineResiduals() const {
1010 }
1011
1012
1018 QList<Statistics> BundleResults::rmsImageResiduals() const {
1019 return m_rmsImageResiduals;
1020 }
1021
1022
1031
1032
1040 }
1041
1042
1048 QList<Statistics> BundleResults::rmsLidarImageResiduals() const {
1050 }
1051
1052
1058 QVector<Statistics> BundleResults::rmsImageXSigmas() const {
1059 return m_rmsImageXSigmas;
1060 }
1061
1062
1068 QVector<Statistics> BundleResults::rmsImageYSigmas() const {
1069 return m_rmsImageYSigmas;
1070 }
1071
1072
1078 QVector<Statistics> BundleResults::rmsImageZSigmas() const {
1079 return m_rmsImageZSigmas;
1080 }
1081
1082
1088 QVector<Statistics> BundleResults::rmsImageRASigmas() const {
1089 return m_rmsImageRASigmas;
1090 }
1091
1092
1098 QVector<Statistics> BundleResults::rmsImageDECSigmas() const {
1099 return m_rmsImageDECSigmas;
1100 }
1101
1102
1108 QVector<Statistics> BundleResults::rmsImageTWISTSigmas() const {
1109 return m_rmsImageTWISTSigmas;
1110 }
1111
1112
1121
1122
1131
1132
1141
1142
1151
1152
1161
1162
1171
1172
1181
1182
1191
1192
1201
1202
1211
1212
1221
1222
1231
1232
1241
1242
1251
1252
1261
1262
1268 double BundleResults::rmsRx() const {
1269 return m_rmsXResiduals;
1270 }
1271
1272
1278 double BundleResults::rmsRy() const {
1279 return m_rmsYResiduals;
1280 }
1281
1282
1288 double BundleResults::rmsRxy() const {
1289 return m_rmsXYResiduals;
1290 }
1291
1292
1299 return m_rejectionLimit;
1300 }
1301
1302
1311
1312
1321
1322
1331
1332
1341
1342
1351
1352
1361
1362
1371
1372
1381
1382
1391
1392
1401
1402
1409 return m_degreesOfFreedom;
1410 }
1411
1412
1418 double BundleResults::sigma0() const {
1419 return m_sigma0;
1420 }
1421
1422
1429 return m_elapsedTime;
1430 }
1431
1432
1441
1442
1449 return m_converged;
1450 }
1451
1452
1458 QVector<BundleControlPointQsp> &BundleResults::bundleControlPoints() {
1459 return m_bundleControlPoints;
1460 }
1461
1462
1468 QVector<BundleLidarControlPointQsp> &BundleResults::bundleLidarControlPoints() {
1469 return m_bundleLidarPoints;
1470 }
1471
1472
1481 if (!m_outNet) {
1483 "Output Control Network has not been set.",
1484 _FILEINFO_);
1485 }
1486 return m_outNet;
1487 }
1488
1489
1500
1501
1508 return m_iterations;
1509 }
1510
1511
1520
1521
1530
1531
1540
1541
1551
1552
1561
1562
1571
1572
1583
1584
1593 return m_maximumLikelihoodFunctions[modelIndex].second;
1594 }
1595
1596
1597// QList< QPair< MaximumLikelihoodWFunctions, double > >
1598// BundleResults::maximumLikelihoodModels() const {
1599// return m_maximumLikelihoodFunctions;
1600// }
1601
1602
1611 if (m_correlationMatrix) {
1612 return *m_correlationMatrix;
1613 }
1614 else {
1616 "Correlation matrix for this bundle is NULL.",
1617 _FILEINFO_);
1618 }
1619 }
1620
1621
1631
1632
1638 void BundleResults::setCorrMatImgsAndParams(QMap<QString, QStringList> imgsAndParams) {
1639 correlationMatrix();// throw error if null
1641 }
1642
1643
1644 SurfacePoint::CoordinateType BundleResults::coordTypeReports() {
1645 // Get the coordinate type from the output net if it exists. Otherwise use the default.
1647
1648 if (m_outNet) {
1649 type = outputControlNet()->GetCoordType();
1650 }
1651
1652 return type;
1653 }
1654
1655
1662 void BundleResults::save(QXmlStreamWriter &stream, const Project *project) const {
1663 // Get the coordinate type from the output net if it exists. Otherwise use the default.
1665
1666 if (m_outNet) {
1667 coordType = outputControlNet()->GetCoordType();
1668 }
1669
1670 stream.writeStartElement("bundleResults");
1671 stream.writeStartElement("correlationMatrix");
1672 stream.writeAttribute("correlationFileName",
1673 correlationMatrix().correlationFileName().expanded());
1674 stream.writeAttribute("covarianceFileName",
1675 correlationMatrix().covarianceFileName().expanded());
1676 stream.writeStartElement("imagesAndParameters");
1677 QMapIterator<QString, QStringList> imgParamIt(*correlationMatrix().imagesAndParameters());
1678 while (imgParamIt.hasNext()) {
1679 imgParamIt.next();
1680 stream.writeStartElement("image");
1681 stream.writeAttribute("id", imgParamIt.key());
1682 QStringList parameters = imgParamIt.value();
1683 for (int i = 0; i < parameters.size(); i++) {
1684 stream.writeTextElement("parameter", parameters[i]);
1685 }
1686 stream.writeEndElement(); // end image
1687
1688 }
1689 stream.writeEndElement(); // end images and parameters
1690 stream.writeEndElement(); // end correlationMatrix
1691
1692 stream.writeStartElement("generalStatisticsValues");
1693 stream.writeTextElement("numberFixedPoints", toString(numberFixedPoints()));
1694 stream.writeTextElement("numberIgnoredPoints", toString(numberIgnoredPoints()));
1695 stream.writeTextElement("numberHeldImages", toString(numberHeldImages()));
1696 stream.writeTextElement("rejectionLimit", toString(rejectionLimit()));
1697 stream.writeTextElement("numberRejectedObservations", toString(numberRejectedObservations()));
1698 stream.writeTextElement("numberObservations", toString(numberObservations()));
1699 stream.writeTextElement("numberLidarRangeConstraintEquations", toString(numberLidarRangeConstraintEquations()));
1700 stream.writeTextElement("numberImageObservations", toString(numberImageObservations()));
1701 stream.writeTextElement("numberLidarImageObservations", toString(numberLidarImageObservations()));
1702 stream.writeTextElement("numberImageParameters", toString(numberImageParameters()));
1703 stream.writeTextElement("numberConstrainedPointParameters",
1705 stream.writeTextElement("numberConstrainedImageParameters",
1707 stream.writeTextElement("numberConstrainedTargetParameters",
1709 stream.writeTextElement("numberUnknownParameters", toString(numberUnknownParameters()));
1710 stream.writeTextElement("degreesOfFreedom", toString(degreesOfFreedom()));
1711 stream.writeTextElement("sigma0", toString(sigma0()));
1712 stream.writeTextElement("converged", toString(converged()));
1713 stream.writeTextElement("iterations", toString(iterations()));
1714 stream.writeEndElement(); // end generalStatisticsValues
1715
1716 stream.writeStartElement("rms");
1717 stream.writeStartElement("residuals");
1718 stream.writeAttribute("x", toString(rmsRx()));
1719 stream.writeAttribute("y", toString(rmsRy()));
1720 stream.writeAttribute("xy", toString(rmsRxy()));
1721 stream.writeEndElement(); // end residuals element
1722 stream.writeStartElement("sigmas");
1723
1724 // Set the label based of the coordinate type set for reports
1725 switch (coordType) {
1727 stream.writeAttribute("lat", toString(sigmaCoord1StatisticsRms()));
1728 stream.writeAttribute("lon", toString(sigmaCoord2StatisticsRms()));
1729 stream.writeAttribute("rad", toString(sigmaCoord3StatisticsRms()));
1730 break;
1732 stream.writeAttribute("x", toString(sigmaCoord1StatisticsRms()));
1733 stream.writeAttribute("y", toString(sigmaCoord2StatisticsRms()));
1734 stream.writeAttribute("z", toString(sigmaCoord3StatisticsRms()));
1735 break;
1736 default:
1737 IString msg ="Unknown surface point coordinate type enum [" + toString(coordType) + "]." ;
1738 throw IException(IException::Programmer, msg, _FILEINFO_);
1739 }
1740 stream.writeEndElement(); // end sigmas element
1741
1742 stream.writeStartElement("imageResidualsLists");
1743 stream.writeStartElement("residualsList");
1744 stream.writeAttribute("listSize", toString(rmsImageResiduals().size()));
1745 for (int i = 0; i < m_rmsImageResiduals.size(); i++) {
1746 stream.writeStartElement("statisticsItem");
1747 m_rmsImageResiduals[i].save(stream, project);
1748 stream.writeEndElement(); // end statistics item
1749 }
1750 stream.writeEndElement(); // end residuals list
1751 stream.writeStartElement("sampleList");
1752 stream.writeAttribute("listSize", toString(rmsImageSampleResiduals().size()));
1753 for (int i = 0; i < m_rmsImageSampleResiduals.size(); i++) {
1754 stream.writeStartElement("statisticsItem");
1755 m_rmsImageSampleResiduals[i].save(stream, project);
1756 stream.writeEndElement(); // end statistics item
1757 }
1758 stream.writeEndElement(); // end sample residuals list
1759
1760 stream.writeStartElement("lineList");
1761 stream.writeAttribute("listSize", toString(rmsImageLineResiduals().size()));
1762 for (int i = 0; i < m_rmsImageLineResiduals.size(); i++) {
1763 stream.writeStartElement("statisticsItem");
1764 m_rmsImageLineResiduals[i].save(stream, project);
1765 stream.writeEndElement(); // end statistics item
1766 }
1767 stream.writeEndElement(); // end line residuals list
1768
1769 stream.writeStartElement("lidarResidualsList");
1770 stream.writeAttribute("listSize", toString(rmsLidarImageResiduals().size()));
1771 for (int i = 0; i < m_rmsLidarImageResiduals.size(); i++) {
1772 stream.writeStartElement("statisticsItem");
1773 m_rmsLidarImageResiduals[i].save(stream, project);
1774 stream.writeEndElement(); // end statistics item
1775 }
1776 stream.writeEndElement(); // end line residuals list
1777
1778 stream.writeStartElement("lidarSampleList");
1779 stream.writeAttribute("listSize", toString(rmsLidarImageSampleResiduals().size()));
1780 for (int i = 0; i < m_rmsLidarImageSampleResiduals.size(); i++) {
1781 stream.writeStartElement("statisticsItem");
1782 m_rmsLidarImageSampleResiduals[i].save(stream, project);
1783 stream.writeEndElement(); // end statistics item
1784 }
1785 stream.writeEndElement(); // end line residuals list
1786
1787 stream.writeStartElement("lidarLineList");
1788 stream.writeAttribute("listSize", toString(rmsLidarImageLineResiduals().size()));
1789 for (int i = 0; i < m_rmsLidarImageLineResiduals.size(); i++) {
1790 stream.writeStartElement("statisticsItem");
1791 m_rmsLidarImageLineResiduals[i].save(stream, project);
1792 stream.writeEndElement(); // end statistics item
1793 }
1794 stream.writeEndElement(); // end line residuals list
1795 stream.writeEndElement(); // end image residuals lists
1796
1797 stream.writeStartElement("imageSigmasLists");
1798 stream.writeStartElement("xSigmas");
1799 stream.writeAttribute("listSize", toString(rmsImageXSigmas().size()));
1800 for (int i = 0; i < m_rmsImageXSigmas.size(); i++) {
1801 stream.writeStartElement("statisticsItem");
1802 m_rmsImageXSigmas[i].save(stream, project);
1803 stream.writeEndElement(); // end statistics item
1804 }
1805
1806 stream.writeEndElement(); // end x sigma list
1807
1808 stream.writeStartElement("ySigmas");
1809 stream.writeAttribute("listSize", toString(rmsImageYSigmas().size()));
1810 for (int i = 0; i < m_rmsImageYSigmas.size(); i++) {
1811 stream.writeStartElement("statisticsItem");
1812 m_rmsImageYSigmas[i].save(stream, project);
1813 stream.writeEndElement(); // end statistics item
1814 }
1815 stream.writeEndElement(); // end y sigma list
1816
1817 stream.writeStartElement("zSigmas");
1818 stream.writeAttribute("listSize", toString(rmsImageZSigmas().size()));
1819 for (int i = 0; i < m_rmsImageZSigmas.size(); i++) {
1820 stream.writeStartElement("statisticsItem");
1821 m_rmsImageZSigmas[i].save(stream, project);
1822 stream.writeEndElement(); // end statistics item
1823 }
1824 stream.writeEndElement(); // end z sigma list
1825
1826 stream.writeStartElement("raSigmas");
1827 stream.writeAttribute("listSize", toString(rmsImageRASigmas().size()));
1828 for (int i = 0; i < m_rmsImageRASigmas.size(); i++) {
1829 stream.writeStartElement("statisticsItem");
1830 m_rmsImageRASigmas[i].save(stream, project);
1831 stream.writeEndElement(); // end statistics item
1832 }
1833 stream.writeEndElement(); // end ra sigma list
1834
1835 stream.writeStartElement("decSigmas");
1836 stream.writeAttribute("listSize", toString(rmsImageDECSigmas().size()));
1837 for (int i = 0; i < m_rmsImageDECSigmas.size(); i++) {
1838 stream.writeStartElement("statisticsItem");
1839 m_rmsImageDECSigmas[i].save(stream, project);
1840 stream.writeEndElement(); // end statistics item
1841 }
1842 stream.writeEndElement(); // end dec sigma list
1843
1844 stream.writeStartElement("twistSigmas");
1845 stream.writeAttribute("listSize", toString(rmsImageTWISTSigmas().size()));
1846 for (int i = 0; i < m_rmsImageTWISTSigmas.size(); i++) {
1847 stream.writeStartElement("statisticsItem");
1848 m_rmsImageTWISTSigmas[i].save(stream, project);
1849 stream.writeEndElement(); // end statistics item
1850 }
1851 stream.writeEndElement(); // end twist sigma list
1852 stream.writeEndElement(); // end sigmas lists
1853 stream.writeEndElement(); // end rms
1854
1855 stream.writeStartElement("elapsedTime");
1856 stream.writeAttribute("time", toString(elapsedTime()));
1857 stream.writeAttribute("errorProp", toString(elapsedTimeErrorProp()));
1858 stream.writeEndElement(); // end elapsed time
1859
1860 stream.writeStartElement("minMaxSigmas");
1861
1862 // Write the labels corresponding to the coordinate type set for reports
1863 switch (coordType) {
1865 stream.writeStartElement("minLat");
1866 stream.writeAttribute("value", toString(minSigmaCoord1Distance().meters()));
1867 stream.writeAttribute("pointId", minSigmaCoord1PointId());
1868 stream.writeEndElement();
1869 stream.writeStartElement("maxLat");
1870 stream.writeAttribute("value", toString(maxSigmaCoord1Distance().meters()));
1871 stream.writeAttribute("pointId", maxSigmaCoord1PointId());
1872 stream.writeEndElement();
1873 stream.writeStartElement("minLon");
1874 stream.writeAttribute("value", toString(minSigmaCoord2Distance().meters()));
1875 stream.writeAttribute("pointId", minSigmaCoord2PointId());
1876 stream.writeEndElement();
1877 stream.writeStartElement("maxLon");
1878 stream.writeAttribute("value", toString(maxSigmaCoord2Distance().meters()));
1879 stream.writeAttribute("pointId", maxSigmaCoord2PointId());
1880 stream.writeEndElement();
1881 stream.writeStartElement("minRad");
1882 stream.writeAttribute("value", toString(minSigmaCoord3Distance().meters()));
1883 stream.writeAttribute("pointId", minSigmaCoord3PointId());
1884 stream.writeEndElement();
1885 stream.writeStartElement("maxRad");
1886 stream.writeAttribute("value", toString(maxSigmaCoord3Distance().meters()));
1887 stream.writeAttribute("pointId", maxSigmaCoord3PointId());
1888 stream.writeEndElement();
1889 break;
1891 stream.writeStartElement("minX");
1892 stream.writeAttribute("value", toString(minSigmaCoord1Distance().meters()));
1893 stream.writeAttribute("pointId", minSigmaCoord1PointId());
1894 stream.writeEndElement();
1895 stream.writeStartElement("maxX");
1896 stream.writeAttribute("value", toString(maxSigmaCoord1Distance().meters()));
1897 stream.writeAttribute("pointId", maxSigmaCoord1PointId());
1898 stream.writeEndElement();
1899 stream.writeStartElement("minY");
1900 stream.writeAttribute("value", toString(minSigmaCoord2Distance().meters()));
1901 stream.writeAttribute("pointId", minSigmaCoord2PointId());
1902 stream.writeEndElement();
1903 stream.writeStartElement("maxY");
1904 stream.writeAttribute("value", toString(maxSigmaCoord2Distance().meters()));
1905 stream.writeAttribute("pointId", maxSigmaCoord2PointId());
1906 stream.writeEndElement();
1907 stream.writeStartElement("minZ");
1908 stream.writeAttribute("value", toString(minSigmaCoord3Distance().meters()));
1909 stream.writeAttribute("pointId", minSigmaCoord3PointId());
1910 stream.writeEndElement();
1911 stream.writeStartElement("maxZ");
1912 stream.writeAttribute("value", toString(maxSigmaCoord3Distance().meters()));
1913 stream.writeAttribute("pointId", maxSigmaCoord3PointId());
1914 stream.writeEndElement();
1915 break;
1916 default:
1917 IString msg ="Unknown surface point coordinate type enum [" + toString(coordType) + "]." ;
1918 throw IException(IException::Programmer, msg, _FILEINFO_);
1919 }
1920 stream.writeEndElement(); // end minMaxSigmas
1921
1922 // call max likelihood setup from startElement to fill the rest of these values...
1923 stream.writeStartElement("maximumLikelihoodEstimation");
1924 stream.writeAttribute("numberModels", toString(numberMaximumLikelihoodModels()));
1925 stream.writeAttribute("maximumLikelihoodIndex", toString(maximumLikelihoodModelIndex()));
1926 stream.writeAttribute("maximumLikelihoodMedianR2Residuals",
1928
1929 stream.writeStartElement("cumulativeProbabilityCalculator");
1930 // cumulativeProbabilityDistribution().save(stream, project);
1931 stream.writeEndElement(); // end cumulativeProbabilityCalculator
1932
1933 stream.writeStartElement("residualsCumulativeProbabilityCalculator");
1934 // residualsCumulativeProbabilityDistribution().save(stream, project);
1935 stream.writeEndElement(); // end residualsCumulativeProbabilityCalculator
1936
1937 for (int i = 0; i < numberMaximumLikelihoodModels(); i++) {
1938 stream.writeStartElement("model");
1939 stream.writeAttribute("modelNumber", toString(i+1));
1940 stream.writeAttribute("modelSelection",
1942 stream.writeAttribute("tweakingConstant",
1943 toString(m_maximumLikelihoodFunctions[i].first.tweakingConstant()));
1944 stream.writeAttribute("quantile", toString(m_maximumLikelihoodFunctions[i].second));
1945 stream.writeEndElement(); // end this model
1946 }
1947 stream.writeEndElement(); // end maximumLikelihoodEstimation
1948 stream.writeEndElement(); // end bundleResults
1949 }
1950
1951
1959 // TODO: does xml stuff need project???
1960 m_xmlHandlerCumProCalc = NULL;
1961 m_xmlHandlerBundleResults = NULL;
1962 m_xmlHandlerProject = NULL;
1963
1964 m_xmlHandlerBundleResults = statistics;
1965 m_xmlHandlerProject = project; // TODO: does xml stuff need project???
1966 m_xmlHandlerCharacters = "";
1967
1968 m_xmlHandlerResidualsListSize = 0;
1969 m_xmlHandlerSampleResidualsListSize = 0;
1970 m_xmlHandlerLineResidualsListSize = 0;
1971 m_xmlHandlerXSigmasListSize = 0;
1972 m_xmlHandlerYSigmasListSize = 0;
1973 m_xmlHandlerZSigmasListSize = 0;
1974 m_xmlHandlerRASigmasListSize = 0;
1975 m_xmlHandlerDECSigmasListSize = 0;
1976 m_xmlHandlerTWISTSigmasListSize = 0;
1977 m_xmlHandlerStatisticsList.clear();
1978
1979 }
1980
1981
1986 // do not delete this pointer... we don't own it, do we???
1987 // passed into StatCumProbDistDynCalc constructor as pointer
1988 // delete m_xmlHandlerProject; // TODO: does xml stuff need project???
1989 m_xmlHandlerProject = NULL;
1990
1991 // delete m_xmlHandlerBundleResults;
1992 // m_xmlHandlerBundleResults = NULL;
1993
1994 }
1995
1996
2008 bool BundleResults::XmlHandler::startElement(const QString &namespaceURI,
2009 const QString &localName,
2010 const QString &qName,
2011 const QXmlAttributes &atts) {
2012 m_xmlHandlerCharacters = "";
2013
2014 if (XmlStackedHandler::startElement(namespaceURI, localName, qName, atts)) {
2015
2016 if (qName == "correlationMatrix") {
2017 m_xmlHandlerBundleResults->m_correlationMatrix = NULL;
2018 m_xmlHandlerBundleResults->m_correlationMatrix = new CorrelationMatrix();
2019
2020 QString correlationFileName = atts.value("correlationFileName");
2021 if (!correlationFileName.isEmpty()) {
2022 FileName correlationFile(correlationFileName);
2023 m_xmlHandlerBundleResults->m_correlationMatrix->setCorrelationFileName(correlationFile);
2024 }
2025
2026 QString covarianceFileName = atts.value("covarianceFileName");
2027 if (!covarianceFileName.isEmpty()) {
2028 FileName covarianceFile(covarianceFileName);
2029 m_xmlHandlerBundleResults->m_correlationMatrix->setCovarianceFileName(covarianceFile);
2030 }
2031 }
2032 else if (qName == "image") {
2033 QString correlationMatrixImageId = atts.value("id");
2034 if (!correlationMatrixImageId.isEmpty()) {
2035 m_xmlHandlerCorrelationImageId = correlationMatrixImageId;
2036 }
2037 }
2038 else if (qName == "residuals") {
2039 QString rx = atts.value("x");
2040 if (!rx.isEmpty()) {
2041 m_xmlHandlerBundleResults->m_rmsXResiduals = toDouble(rx);
2042 }
2043
2044 QString ry = atts.value("y");
2045 if (!ry.isEmpty()) {
2046 m_xmlHandlerBundleResults->m_rmsYResiduals = toDouble(ry);
2047 }
2048
2049 QString rxy = atts.value("xy");
2050 if (!rxy.isEmpty()) {
2051 m_xmlHandlerBundleResults->m_rmsXYResiduals = toDouble(rxy);
2052 }
2053 }
2054 else if (qName == "sigmas") {
2055 QString lat = atts.value("lat");
2056 if (!lat.isEmpty()) {
2057 m_xmlHandlerBundleResults->m_rmsSigmaCoord1Stats = toDouble(lat);
2058 }
2059 QString lon = atts.value("lon");
2060 if (!lon.isEmpty()) {
2061 m_xmlHandlerBundleResults->m_rmsSigmaCoord2Stats = toDouble(lon);
2062 }
2063 QString rad = atts.value("rad");
2064 if (!rad.isEmpty()) {
2065 m_xmlHandlerBundleResults->m_rmsSigmaCoord3Stats = toDouble(rad);
2066 }
2067 QString x = atts.value("x");
2068 if (!x.isEmpty()) {
2069 m_xmlHandlerBundleResults->m_rmsSigmaCoord1Stats = toDouble(x);
2070 }
2071 QString y = atts.value("y");
2072 if (!y.isEmpty()) {
2073 m_xmlHandlerBundleResults->m_rmsSigmaCoord2Stats = toDouble(y);
2074 }
2075 QString z = atts.value("z");
2076 if (!z.isEmpty()) {
2077 m_xmlHandlerBundleResults->m_rmsSigmaCoord3Stats = toDouble(z);
2078 }
2079 }
2080 else if (qName == "residualsList") {
2081 QString listSizeStr = atts.value("listSize");
2082 if (!listSizeStr.isEmpty()) {
2083 m_xmlHandlerResidualsListSize = toInt(listSizeStr);
2084 }
2085 }
2086 else if (qName == "sampleList") {
2087 QString listSizeStr = atts.value("listSize");
2088 if (!listSizeStr.isEmpty()) {
2089 m_xmlHandlerSampleResidualsListSize = toInt(listSizeStr);
2090 }
2091 }
2092 else if (qName == "lineList") {
2093 QString listSizeStr = atts.value("listSize");
2094 if (!listSizeStr.isEmpty()) {
2095 m_xmlHandlerLineResidualsListSize = toInt(listSizeStr);
2096 }
2097 }
2098 else if (qName == "xSigmas") {
2099 QString listSizeStr = atts.value("listSize");
2100 if (!listSizeStr.isEmpty()) {
2101 m_xmlHandlerXSigmasListSize = toInt(listSizeStr);
2102 }
2103 }
2104 else if (qName == "ySigmas") {
2105 QString listSizeStr = atts.value("listSize");
2106 if (!listSizeStr.isEmpty()) {
2107 m_xmlHandlerYSigmasListSize = toInt(listSizeStr);
2108 }
2109 }
2110 else if (qName == "zSigmas") {
2111 QString listSizeStr = atts.value("listSize");
2112 if (!listSizeStr.isEmpty()) {
2113 m_xmlHandlerZSigmasListSize = toInt(listSizeStr);
2114 }
2115 }
2116 else if (qName == "raSigmas") {
2117 QString listSizeStr = atts.value("listSize");
2118 if (!listSizeStr.isEmpty()) {
2119 m_xmlHandlerRASigmasListSize = toInt(listSizeStr);
2120 }
2121
2122 }
2123 else if (qName == "decSigmas") {
2124 QString listSizeStr = atts.value("listSize");
2125 if (!listSizeStr.isEmpty()) {
2126 m_xmlHandlerDECSigmasListSize = toInt(listSizeStr);
2127 }
2128 }
2129 else if (qName == "twistSigmas") {
2130 QString listSizeStr = atts.value("listSize");
2131 if (!listSizeStr.isEmpty()) {
2132 m_xmlHandlerTWISTSigmasListSize = toInt(listSizeStr);
2133 }
2134 }
2135 else if (qName == "statisticsItem") {
2136 // add statistics object to the xml handler's current statistics list.
2137 m_xmlHandlerStatisticsList.append(
2138 new Statistics(m_xmlHandlerProject, reader()));
2139 }
2140 else if (qName == "elapsedTime") {
2141 QString time = atts.value("time");
2142 if (!time.isEmpty()) {
2143 m_xmlHandlerBundleResults->m_elapsedTime = toDouble(time);
2144 }
2145
2146 QString errorProp = atts.value("errorProp");
2147 if (!errorProp.isEmpty()) {
2148 m_xmlHandlerBundleResults->m_elapsedTimeErrorProp = toDouble(errorProp);
2149 }
2150
2151 }
2152// ??? else if (qName == "minMaxSigmaDistances") {
2153// ??? QString units = atts.value("units");
2154// ??? if (!QString::compare(units, "meters", Qt::CaseInsensitive)) {
2155// ??? QString msg = "Unable to read BundleResults xml. Sigma distances must be "
2156// ??? "provided in meters.";
2157// ??? throw IException(IException::Io, msg, _FILEINFO_);
2158// ??? }
2159// ??? }
2160 else if (qName == "minLat") {
2161 QString minLat = atts.value("value");
2162 if (!minLat.isEmpty()) {
2163 m_xmlHandlerBundleResults->m_minSigmaCoord1Distance.setMeters(toDouble(minLat));
2164 }
2165
2166 QString minLatPointId = atts.value("pointId");
2167 if (!minLatPointId.isEmpty()) {
2168 m_xmlHandlerBundleResults->m_minSigmaCoord1PointId = minLatPointId;
2169 }
2170
2171 }
2172 else if (qName == "minX") {
2173 QString minX = atts.value("value");
2174 if (!minX.isEmpty()) {
2175 m_xmlHandlerBundleResults->m_minSigmaCoord1Distance.setMeters(toDouble(minX));
2176 }
2177
2178 QString minXPointId = atts.value("pointId");
2179 if (!minXPointId.isEmpty()) {
2180 m_xmlHandlerBundleResults->m_minSigmaCoord1PointId = minXPointId;
2181 }
2182 }
2183 else if (qName == "maxLat") {
2184 QString maxLat = atts.value("value");
2185 if (!maxLat.isEmpty()) {
2186 m_xmlHandlerBundleResults->m_maxSigmaCoord1Distance.setMeters(toDouble(maxLat));
2187 }
2188
2189 QString maxLatPointId = atts.value("pointId");
2190 if (!maxLatPointId.isEmpty()) {
2191 m_xmlHandlerBundleResults->m_maxSigmaCoord1PointId = maxLatPointId;
2192 }
2193
2194 }
2195 else if (qName == "maxX") {
2196
2197 QString maxX = atts.value("value");
2198 if (!maxX.isEmpty()) {
2199 m_xmlHandlerBundleResults->m_maxSigmaCoord1Distance.setMeters(toDouble(maxX));
2200 }
2201
2202 QString maxXPointId = atts.value("pointId");
2203 if (!maxXPointId.isEmpty()) {
2204 m_xmlHandlerBundleResults->m_maxSigmaCoord1PointId = maxXPointId;
2205 }
2206
2207 }
2208 else if (qName == "minLon") {
2209
2210 QString minLon = atts.value("value");
2211 if (!minLon.isEmpty()) {
2212 m_xmlHandlerBundleResults->m_minSigmaCoord2Distance.setMeters(toDouble(minLon));
2213 }
2214
2215 QString minLonPointId = atts.value("pointId");
2216 if (!minLonPointId.isEmpty()) {
2217 m_xmlHandlerBundleResults->m_minSigmaCoord2PointId = minLonPointId;
2218 }
2219
2220 }
2221 else if (qName == "minY") {
2222
2223 QString minY = atts.value("value");
2224 if (!minY.isEmpty()) {
2225 m_xmlHandlerBundleResults->m_minSigmaCoord2Distance.setMeters(toDouble(minY));
2226 }
2227
2228 QString minYPointId = atts.value("pointId");
2229 if (!minYPointId.isEmpty()) {
2230 m_xmlHandlerBundleResults->m_minSigmaCoord2PointId = minYPointId;
2231 }
2232
2233 }
2234 else if (qName == "maxLon") {
2235
2236 QString maxLon = atts.value("value");
2237 if (!maxLon.isEmpty()) {
2238 m_xmlHandlerBundleResults->m_maxSigmaCoord2Distance.setMeters(toDouble(maxLon));
2239 }
2240
2241 QString maxLonPointId = atts.value("pointId");
2242 if (!maxLonPointId.isEmpty()) {
2243 m_xmlHandlerBundleResults->m_maxSigmaCoord2PointId = maxLonPointId;
2244 }
2245
2246 }
2247 else if (qName == "maxY") {
2248 QString maxY = atts.value("value");
2249 if (!maxY.isEmpty()) {
2250 m_xmlHandlerBundleResults->m_maxSigmaCoord2Distance.setMeters(toDouble(maxY));
2251 }
2252
2253 QString maxYPointId = atts.value("pointId");
2254 if (!maxYPointId.isEmpty()) {
2255 m_xmlHandlerBundleResults->m_maxSigmaCoord2PointId = maxYPointId;
2256 }
2257
2258 }
2259 else if (qName == "minRad") {
2260
2261 QString minRad = atts.value("value");
2262 if (!minRad.isEmpty()) {
2263 m_xmlHandlerBundleResults->m_minSigmaCoord3Distance.setMeters(toDouble(minRad));
2264 }
2265
2266 QString minRadPointId = atts.value("pointId");
2267 if (!minRadPointId.isEmpty()) {
2268 m_xmlHandlerBundleResults->m_minSigmaCoord3PointId = minRadPointId;
2269 }
2270
2271 }
2272 else if (qName == "minZ") {
2273
2274 QString minZ = atts.value("value");
2275 if (!minZ.isEmpty()) {
2276 m_xmlHandlerBundleResults->m_minSigmaCoord3Distance.setMeters(toDouble(minZ));
2277 }
2278
2279 QString minZPointId = atts.value("pointId");
2280 if (!minZPointId.isEmpty()) {
2281 m_xmlHandlerBundleResults->m_minSigmaCoord3PointId = minZPointId;
2282 }
2283
2284 }
2285 else if (qName == "maxRad") {
2286
2287 QString maxRad = atts.value("value");
2288 if (!maxRad.isEmpty()) {
2289 m_xmlHandlerBundleResults->m_maxSigmaCoord3Distance.setMeters(toDouble(maxRad));
2290 }
2291
2292 QString maxRadPointId = atts.value("pointId");
2293 if (!maxRadPointId.isEmpty()) {
2294 m_xmlHandlerBundleResults->m_maxSigmaCoord3PointId = maxRadPointId;
2295 }
2296
2297 }
2298 else if (qName == "maxZ") {
2299
2300 QString maxZ = atts.value("value");
2301 if (!maxZ.isEmpty()) {
2302 m_xmlHandlerBundleResults->m_maxSigmaCoord3Distance.setMeters(toDouble(maxZ));
2303 }
2304
2305 QString maxZPointId = atts.value("pointId");
2306 if (!maxZPointId.isEmpty()) {
2307 m_xmlHandlerBundleResults->m_maxSigmaCoord3PointId = maxZPointId;
2308 }
2309
2310 }
2311 else if (qName == "maximumLikelihoodEstimation") {
2312 QString maximumLikelihoodIndex = atts.value("maximumLikelihoodIndex");
2313 if (!maximumLikelihoodIndex.isEmpty()) {
2314 m_xmlHandlerBundleResults->m_maximumLikelihoodIndex = toInt(maximumLikelihoodIndex);
2315 }
2316
2318 atts.value("maximumLikelihoodMedianR2Residuals");
2319 if (!maximumLikelihoodMedianR2Residuals.isEmpty()) {
2320 m_xmlHandlerBundleResults->m_maximumLikelihoodMedianR2Residuals =
2322 }
2323 }
2324 else if (qName == "model") {
2325 QString model = atts.value("modelSelection");
2326 QString tweakingConstant = atts.value("tweakingConstant");
2327 QString quantile = atts.value("quantile");
2328 bool validModel = true;
2329 if (model.isEmpty()) validModel = false;
2330 if (tweakingConstant.isEmpty()) validModel = false;
2331 if (quantile.isEmpty()) validModel = false;
2332 if (validModel) {
2333 m_xmlHandlerBundleResults->m_maximumLikelihoodFunctions.append(
2335 MaximumLikelihoodWFunctions::stringToModel(model),
2336 toDouble(tweakingConstant)),
2337 toDouble(quantile)));
2338 }
2339 }
2340 else if (qName == "cumulativeProbabilityCalculator") {
2341 m_xmlHandlerBundleResults->m_cumPro = NULL;
2342 m_xmlHandlerBundleResults->m_cumPro =
2343 new StatCumProbDistDynCalc(m_xmlHandlerProject, reader());
2344 }
2345 else if (qName == "residualsCumulativeProbabilityCalculator") {
2346 m_xmlHandlerBundleResults->m_cumProRes = NULL;
2347 m_xmlHandlerBundleResults->m_cumProRes = new StatCumProbDistDynCalc(m_xmlHandlerProject,
2348 reader());
2349 }
2350 }
2351 return true;
2352 }
2353
2354
2363 m_xmlHandlerCharacters += ch;
2364 return XmlStackedHandler::characters(ch);
2365 }
2366
2367
2377 bool BundleResults::XmlHandler::endElement(const QString &namespaceURI, const QString &localName,
2378 const QString &qName) {
2379
2380 if (!m_xmlHandlerCharacters.isEmpty()) {
2381 if (qName == "parameter") {
2382 // add the parameter to the current list
2383 m_xmlHandlerCorrelationParameterList.append(m_xmlHandlerCharacters);
2384 }
2385 if (qName == "image") {
2386 // add this image and its parameters to the map
2387 if (m_xmlHandlerCorrelationImageId != "") {
2388 m_xmlHandlerCorrelationMap.insert(m_xmlHandlerCorrelationImageId,
2389 m_xmlHandlerCorrelationParameterList);
2390 }
2391 m_xmlHandlerCorrelationImageId = "";
2392 m_xmlHandlerCorrelationParameterList.clear();
2393
2394 }
2395 if (qName == "imagesAndParameters") {
2396 // set the map after all images and parameters have been added
2397 if (!m_xmlHandlerCorrelationMap.isEmpty()) {
2398 m_xmlHandlerBundleResults->setCorrMatImgsAndParams(m_xmlHandlerCorrelationMap);
2399 }
2400 }
2401 else if (qName == "numberFixedPoints") {
2402 m_xmlHandlerBundleResults->m_numberFixedPoints = toInt(m_xmlHandlerCharacters);
2403 }
2404 else if (qName == "numberIgnoredPoints") {
2405 m_xmlHandlerBundleResults->m_numberIgnoredPoints = toInt(m_xmlHandlerCharacters);
2406 }
2407 else if (qName == "numberHeldImages") {
2408 m_xmlHandlerBundleResults->m_numberHeldImages = toInt(m_xmlHandlerCharacters);
2409 }
2410 else if (qName == "rejectionLimit") {
2411 m_xmlHandlerBundleResults->m_rejectionLimit = toDouble(m_xmlHandlerCharacters);
2412 }
2413 else if (qName == "numberRejectedObservations") {
2414 m_xmlHandlerBundleResults->m_numberRejectedObservations = toInt(m_xmlHandlerCharacters);
2415 }
2416 else if (qName == "numberLidarRangeConstraintEquations") {
2417 m_xmlHandlerBundleResults->m_numberLidarRangeConstraintEquations = toInt(m_xmlHandlerCharacters);
2418 }
2419 else if (qName == "numberObservations") {
2420 m_xmlHandlerBundleResults->m_numberObservations = toInt(m_xmlHandlerCharacters);
2421 }
2422 else if (qName == "numberImageObservations") {
2423 m_xmlHandlerBundleResults->m_numberImageObservations = toInt(m_xmlHandlerCharacters);
2424 }
2425 else if (qName == "numberLidarImageObservations") {
2426 m_xmlHandlerBundleResults->m_numberLidarImageObservations = toInt(m_xmlHandlerCharacters);
2427 }
2428 else if (qName == "numberImageParameters") {
2429 m_xmlHandlerBundleResults->m_numberImageParameters = toInt(m_xmlHandlerCharacters);
2430 }
2431 else if (qName == "numberConstrainedPointParameters") {
2432 m_xmlHandlerBundleResults->m_numberConstrainedPointParameters =
2433 toInt(m_xmlHandlerCharacters);
2434 }
2435 else if (qName == "numberConstrainedImageParameters") {
2436 m_xmlHandlerBundleResults->m_numberConstrainedImageParameters =
2437 toInt(m_xmlHandlerCharacters);
2438 }
2439 else if (qName == "numberConstrainedTargetParameters") {
2440 m_xmlHandlerBundleResults->m_numberConstrainedTargetParameters =
2441 toInt(m_xmlHandlerCharacters);
2442 }
2443 else if (qName == "numberUnknownParameters") {
2444 m_xmlHandlerBundleResults->m_numberUnknownParameters = toInt(m_xmlHandlerCharacters);
2445 }
2446 else if (qName == "degreesOfFreedom") {
2447 m_xmlHandlerBundleResults->m_degreesOfFreedom = toInt(m_xmlHandlerCharacters);
2448 }
2449 else if (qName == "sigma0") {
2450 m_xmlHandlerBundleResults->m_sigma0 = toDouble(m_xmlHandlerCharacters);
2451 }
2452 else if (qName == "converged") {
2453 m_xmlHandlerBundleResults->m_converged = toBool(m_xmlHandlerCharacters);
2454 }
2455 else if (qName == "iterations") {
2456 m_xmlHandlerBundleResults->m_iterations = toInt(m_xmlHandlerCharacters);
2457 }
2458 // copy the xml handler's statistics list to the appropriate bundle statistics list
2459 else if (qName == "residualsList") {
2460 if (m_xmlHandlerResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2462 "Unable to read xml file. Invalid residualsList", _FILEINFO_);
2463 }
2464 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2465 m_xmlHandlerBundleResults->m_rmsImageResiduals.append(m_xmlHandlerStatisticsList[i]);
2466 }
2467 m_xmlHandlerStatisticsList.clear();
2468 }
2469 else if (qName == "sampleList") {
2470 if (m_xmlHandlerSampleResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2472 "Unable to read xml file. Invalid sampleList", _FILEINFO_);
2473 }
2474 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2475 m_xmlHandlerBundleResults->m_rmsImageSampleResiduals.append(
2476 m_xmlHandlerStatisticsList[i]);
2477 }
2478 m_xmlHandlerStatisticsList.clear();
2479 }
2480 else if (qName == "lineList") {
2481 if (m_xmlHandlerLineResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2483 "Unable to read xml file. Invalid lineList", _FILEINFO_);
2484 }
2485 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2486 m_xmlHandlerBundleResults->m_rmsImageLineResiduals.append(m_xmlHandlerStatisticsList[i]);
2487 }
2488 m_xmlHandlerStatisticsList.clear();
2489 }
2490 else if (qName == "lidarResidualsList") {
2491 if (m_xmlHandlerResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2493 "Unable to read xml file. Invalid residualsList", _FILEINFO_);
2494 }
2495 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2496 m_xmlHandlerBundleResults->m_rmsLidarImageResiduals.append(m_xmlHandlerStatisticsList[i]);
2497 }
2498 m_xmlHandlerStatisticsList.clear();
2499 }
2500 else if (qName == "lidarSampleList") {
2501 if (m_xmlHandlerSampleResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2503 "Unable to read xml file. Invalid sampleList", _FILEINFO_);
2504 }
2505 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2506 m_xmlHandlerBundleResults->m_rmsLidarImageSampleResiduals.append(
2507 m_xmlHandlerStatisticsList[i]);
2508 }
2509 m_xmlHandlerStatisticsList.clear();
2510 }
2511 else if (qName == "lidarLineList") {
2512 if (m_xmlHandlerLineResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2514 "Unable to read xml file. Invalid lineList", _FILEINFO_);
2515 }
2516 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2517 m_xmlHandlerBundleResults->m_rmsLidarImageLineResiduals.append(m_xmlHandlerStatisticsList[i]);
2518 }
2519 m_xmlHandlerStatisticsList.clear();
2520 }
2521 else if (qName == "xSigmas") {
2522 if (m_xmlHandlerXSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2524 "Unable to read xml file. Invalid xSigmas", _FILEINFO_);
2525 }
2526 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2527 m_xmlHandlerBundleResults->m_rmsImageXSigmas.append(m_xmlHandlerStatisticsList[i]);
2528 }
2529 m_xmlHandlerStatisticsList.clear();
2530 }
2531 else if (qName == "ySigmas") {
2532 if (m_xmlHandlerYSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2534 "Unable to read xml file. Invalid ySigmas", _FILEINFO_);
2535 }
2536 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2537 m_xmlHandlerBundleResults->m_rmsImageYSigmas.append(m_xmlHandlerStatisticsList[i]);
2538 }
2539 m_xmlHandlerStatisticsList.clear();
2540 }
2541 else if (qName == "zSigmas") {
2542 if (m_xmlHandlerZSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2544 "Unable to read xml file. Invalid zSigmas", _FILEINFO_);
2545 }
2546 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2547 m_xmlHandlerBundleResults->m_rmsImageZSigmas.append(m_xmlHandlerStatisticsList[i]);
2548 }
2549 m_xmlHandlerStatisticsList.clear();
2550 }
2551 else if (qName == "raSigmas") {
2552 if (m_xmlHandlerRASigmasListSize != m_xmlHandlerStatisticsList.size()) {
2554 "Unable to read xml file. Invalid raSigmas", _FILEINFO_);
2555 }
2556 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2557 m_xmlHandlerBundleResults->m_rmsImageRASigmas.append(m_xmlHandlerStatisticsList[i]);
2558 }
2559 m_xmlHandlerStatisticsList.clear();
2560 }
2561 else if (qName == "decSigmas") {
2562 if (m_xmlHandlerDECSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2564 "Unable to read xml file. Invalid decSigmas", _FILEINFO_);
2565 }
2566 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2567 m_xmlHandlerBundleResults->m_rmsImageDECSigmas.append(m_xmlHandlerStatisticsList[i]);
2568 }
2569 m_xmlHandlerStatisticsList.clear();
2570 }
2571 else if (qName == "twistSigmas") {
2572 if (m_xmlHandlerTWISTSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2574 "Unable to read xml file. Invalid twistSigmas", _FILEINFO_);
2575 }
2576 for (int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2577 m_xmlHandlerBundleResults->m_rmsImageTWISTSigmas.append(m_xmlHandlerStatisticsList[i]);
2578 }
2579 m_xmlHandlerStatisticsList.clear();
2580 }
2581 }
2582 m_xmlHandlerCharacters = "";
2583 return XmlStackedHandler::endElement(namespaceURI, localName, qName);
2584 }
2585}
This class is a container class for BundleObservations.
This class is an XmlHandler used to read and write BundleResults objects from and to XML files.
XmlHandler(BundleResults *statistics, Project *project)
Constructs an XmlHandler used to save a BundleResults object.
virtual bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts)
Handle an XML start element.
virtual bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName)
Handle end tags for the BundleResults serialized XML.
virtual bool characters(const QString &ch)
Adds a QString to the XmlHandler's internal character data.
~XmlHandler()
Destroys an XmlHandler.
A container class for statistical results from a BundleAdjust solution.
void addProbabilityDistributionObservation(double obsValue)
Adds an observation to the cumulative probability distribution of |R^2 residuals|.
void incrementNumberConstrainedImageParameters(int incrementAmount)
Increase the number of constrained image parameters.
~BundleResults()
Destroys this BundleResults object.
QString m_minSigmaCoord1PointId
The minimum sigma coordinate 1 point id.
QVector< Statistics > m_rmsImageTWISTSigmas
< The root mean square image twist sigmas.
double elapsedTimeErrorProp() const
Returns the elapsed time for error propagation.
int numberRejectedObservations() const
Returns the number of observation that were rejected.
int m_numberUnknownParameters
total number of parameters to solve for
QString minSigmaCoord2PointId() const
Returns the minimum sigma point id for coordinate 2.
void setSigma0(double sigma0)
Sets the sigma0.
double rejectionLimit() const
Returns the rejection limit.
int m_degreesOfFreedom
degrees of freedom
QList< Statistics > m_rmsLidarImageResiduals
RMS image lidar sample & line residual stats for each image in the bundle
int m_numberFixedPoints
number of 'fixed' (ground) points (define)
void incrementNumberConstrainedPointParameters(int incrementAmount)
Increase the number of contrained point parameters.
double rmsRxy() const
Returns the RMS of the x and y residuals.
QList< Statistics > rmsImageSampleResiduals() const
Returns the list of RMS image sample residuals statistics.
QList< Statistics > m_rmsLidarImageSampleResiduals
List of RMS lidar sample residual stats for each image in the bundle
int m_numberConstrainedTargetParameters
number of constrained target parameters
BundleObservationVector m_observations
The vector of BundleObservations from BundleAdjust.
BundleResults(QObject *parent=0)
Constructs a BundleResults object.
ControlNetQsp outputControlNet() const
Returns a shared pointer to the output control network.
int numberObservations() const
Returns the number of observations.
void setElapsedTime(double time)
Sets the elapsed time for the bundle adjustment.
Distance m_maxSigmaCoord3Distance
The maximum sigma radius distance.
MaximumLikelihoodWFunctions maximumLikelihoodModelWFunc(int modelIndex) const
Returns the maximum likelihood model at the given index.
void incrementHeldImages()
Increases the number of 'held' images.
int m_numberLidarImageObservations
lidar image coords. (2 per measure)
double m_maximumLikelihoodMedianR2Residuals
Median of R^2 residuals.
double sigmaCoord3StatisticsRms() const
Returns the RMS of the adjusted sigmas for coordinate 3.
double m_rmsXResiduals
rms of x residuals
double m_rmsSigmaCoord3Stats
rms of adjusted Radius sigmas
void initializeProbabilityDistribution(unsigned int nodes=20)
Initializes or resets the cumulative probability distribution of |R^2 residuals|.
void incrementIgnoredPoints()
Increase the number of ignored points.
void incrementFixedPoints()
Increase the number of 'fixed' (ground) points.
void setBundleControlPoints(QVector< BundleControlPointQsp > controlPoints)
Sets the bundle control point vector.
void setNumberConstrainedPointParameters(int numberParameters)
Set number of contrained point parameters.
void setBundleLidarPoints(QVector< BundleLidarControlPointQsp > lidarPoints)
Sets the bundle lidar point vector.
double sigma0() const
Returns the Sigma0 of the bundle adjustment.
QVector< Statistics > m_rmsImageZSigmas
< The root mean square image z sigmas.
void setIterations(int iterations)
Sets the number of iterations taken by the BundleAdjust.
bool converged() const
Returns whether or not the bundle adjustment converged.
Distance m_maxSigmaCoord1Distance
The maximum sigma latitude distance.
double maximumLikelihoodModelQuantile(int modelIndex) const
Returns the quantile of the maximum likelihood model at the given index.
int m_numberImageObservations
photogrammetry image coords. (2 per measure)
void setSigmaCoord1Range(Distance minCoord1Dist, Distance maxCoord1Dist, QString minCoord1PointId, QString maxCoord1PointId)
Sets the min and max sigma distances and point ids for coordinate 1.
void incrementMaximumLikelihoodModelIndex()
Increases the value that indicates which stage the maximum likelihood adjustment is currently on.
QVector< Statistics > rmsImageDECSigmas() const
Returns the list of RMS image declination sigma statistics.
QString m_maxSigmaCoord1PointId
The maximum sigma coordinate 1 point id.
QVector< Statistics > m_rmsImageYSigmas
< The root mean square image y sigmas.
QList< Statistics > rmsLidarImageSampleResiduals() const
Returns the list of RMS image lidar sample residuals statistics.
void setOutputControlNet(ControlNetQsp outNet)
Sets the output ControlNet.
int m_iterations
The number of iterations taken by BundleAdjust.
double m_rmsXYResiduals
rms of all x and y residuals
int m_numberLidarRangeConstraintEquations
void setSigmaCoord2Range(Distance minCoord2Dist, Distance maxCoord2Dist, QString minCoord2PointId, QString maxCoord2PointId)
Sets the min and max sigma distances and point ids for coordinate 2.
int numberConstrainedPointParameters() const
Returns the number of constrained point parameters.
double rmsRy() const
Returns the RMS of the y residuals.
void resetNumberConstrainedImageParameters()
Resets the number of constrained image parameters to 0.
int m_numberIgnoredPoints
number of ignored points
void computeDegreesOfFreedom()
Computes the degrees of freedom of the bundle adjustment and stores it internally.
Distance m_minSigmaCoord2Distance
The minimum sigma longitude distance.
int iterations() const
Returns the number of iterations taken by the BundleAdjust.
CorrelationMatrix correlationMatrix() const
Returns the Correlation Matrix.
void setNumberRejectedObservations(int numberObservations)
Sets the number of rejected observations.
QString minSigmaCoord1PointId() const
Returns the minimum sigma point id for coordinate 1.
double m_rejectionLimit
current rejection limit
QVector< Statistics > rmsImageYSigmas() const
Returns the list of RMS image y sigma statistics.
QString m_minSigmaCoord2PointId
The minimum sigma coordinate 2 point id.
void maximumLikelihoodSetUp(QList< QPair< MaximumLikelihoodWFunctions::Model, double > > modelsWithQuantiles)
This method steps up the maximum likelihood estimation solution.
void save(QXmlStreamWriter &stream, const Project *project) const
Saves the BundleResults object to an XML file.
int m_numberConstrainedImageParameters
number of constrained image parameters
int numberIgnoredPoints() const
Returns the number of ignored points.
QVector< BundleControlPointQsp > & bundleControlPoints()
Returns a reference to the BundleControlPoint vector.
void setCorrMatImgsAndParams(QMap< QString, QStringList > imgsAndParams)
Set the images and their associated parameters of the correlation matrix.
Distance maxSigmaCoord2Distance() const
Returns the maximum sigma distance for coordinate 2.
QString m_minSigmaCoord3PointId
The minimum sigma coordinate 3 point id.
int numberUnknownParameters() const
Returns the number of unknown parameters.
void addResidualsProbabilityDistributionObservation(double obsValue)
Adds an observation to the cumulative probability distribution of residuals used for reporting.
QVector< BundleLidarControlPointQsp > & bundleLidarControlPoints()
Returns a reference to the BundleLidarControlPoint vector.
int m_numberImageParameters
number of image parameters
double m_sigma0
std deviation of unit weight
int numberImageParameters() const
Returns the total number of image parameters.
QList< Statistics > rmsLidarImageLineResiduals() const
Returns the list of RMS image lidar line residuals statistics.
int m_maximumLikelihoodIndex
This count keeps track of which stage of the maximum likelihood adjustment the bundle is currently on...
QList< Statistics > m_rmsImageLineResiduals
List of RMS image line residual statistics for each image in the bundle
int numberMaximumLikelihoodModels() const
Returns how many maximum likelihood models were used in the bundle adjustment.
StatCumProbDistDynCalc * m_cumProRes
This class keeps track of the cumulative probability distribution of residuals (in unweighted pixels)...
void setNumberLidarRangeConstraints(int numberLidarRangeConstraints)
Sets the total number of lidar range constraints.
int maximumLikelihoodModelIndex() const
Returns which step the bundle adjustment is on.
LidarDataQsp outputLidarData() const
Returns a shared pointer to the output LidarData object.
int m_numberConstrainedPointParameters
number of constrained point parameters
int m_numberConstrainedLidarPointParameters
lidar points
int m_numberRejectedObservations
number of rejected image coordinate observations
int numberHeldImages() const
Returns the number of 'held' images.
double sigmaCoord2StatisticsRms() const
Returns the RMS of the adjusted sigmas for coordinate 2.
StatCumProbDistDynCalc * m_cumPro
This class will be used to calculate the cumulative probability distribution of |R^2 residuals|,...
int m_numberObservations
number of image coordinate observations
void setRejectionLimit(double rejectionLimit)
Sets the rejection limit.
Distance minSigmaCoord3Distance() const
Returns the minimum sigma distance for coordinate 3.
int numberLidarImageObservations() const
Returns the number of lidar observations.
void incrementNumberConstrainedTargetParameters(int incrementAmount)
Increases the number of constrained target parameters.
QVector< BundleControlPointQsp > m_bundleControlPoints
The vector of BundleControlPoints from BundleAdjust.
void setOutputLidarData(LidarDataQsp outLidarData)
Sets the output LidarData object.
double m_rmsSigmaCoord2Stats
rms of adjusted Longitude sigmas
void setNumberImageObservations(int numberObservations)
Sets the number of photogrammetric image observations.
void setRmsImageResidualLists(QList< Statistics > rmsImageLineResiduals, QList< Statistics > rmsImageSampleResiduals, QList< Statistics > rmsImageResiduals)
Sets the root mean square image residual Statistics lists.
double maximumLikelihoodMedianR2Residuals() const
Returns the median of the |R^2 residuals|.
int numberFixedPoints() const
Returns the number of 'fixed' (ground) points.
QString maxSigmaCoord1PointId() const
Returns the maximum sigma point id for coordinate 1.
int numberImageObservations() const
Returns the number of observations.
LidarDataQsp m_outLidarData
Output lidar data from BundleAdjust.
void setNumberLidarImageObservations(int numberLidarObservations)
Sets the number of lidar observations.
void resetNumberConstrainedPointParameters()
Resets the number of contrained point parameters to 0.
void setNumberImageParameters(int numberParameters)
Sets the number of image parameters.
int numberConstrainedTargetParameters() const
Return the number of constrained target parameters.
StatCumProbDistDynCalc residualsCumulativeProbabilityDistribution() const
Returns the cumulative probability distribution of the residuals used for reporting.
double elapsedTime() const
Returns the elapsed time for the bundle adjustment.
QList< Statistics > m_rmsLidarImageLineResiduals
List of RMS lidar line residual stats for each image in the bundle
QList< Statistics > rmsImageResiduals() const
Returns the list of RMS image residuals statistics.
Distance m_maxSigmaCoord2Distance
The maximum sigma longitude distance.
QVector< Statistics > m_rmsImageRASigmas
< The root mean square image right ascension sigmas.
const BundleObservationVector & observations() const
Returns a reference to the observations used by the BundleAdjust.
Distance m_minSigmaCoord3Distance
The minimum sigma radius distance.
ControlNetQsp m_outNet
The output control net from BundleAdjust.
void initialize()
Initializes the BundleResults to a default state where all numeric members are set to 0 or another de...
Distance minSigmaCoord1Distance() const
Returns the minimum sigma distance for coordinate 1.
void setNumberUnknownParameters(int numberParameters)
Sets the total number of parameters to solve for.
void setSigmaCoord3Range(Distance minCoord3Dist, Distance maxCoord3Dist, QString minCoord3PointId, QString maxCoord3PointId)
Sets the min and max sigma distances and point ids for coordinate 3.
QString minSigmaCoord3PointId() const
Returns the minimum sigma point id for coordinate 3.
void setNumberConstrainedLidarPointParameters(int numberParameters)
Set number of contrained point parameters.
double rmsRx() const
Returns the RMS of the x residuals.
void setObservations(BundleObservationVector observations)
Sets the vector of BundleObservations.
void initializeResidualsProbabilityDistribution(unsigned int nodes=20)
Initializes or resets the cumulative probability distribution of residuals used for reporting.
void setRmsFromSigmaStatistics(double rmsFromSigmaCoord1Stats, double rmsFromSigmaCoord2Stats, double rmsFromSigmaCoord3Stats)
Sets the root mean square values of the adjusted sigmas for all three coordinates.
void setRmsXYResiduals(double rx, double ry, double rxy)
Sets the root mean square of the x and y residuals.
QList< Statistics > rmsImageLineResiduals() const
Returns the list of RMS image line residuals statistics.
double m_elapsedTime
elapsed time for bundle
double m_elapsedTimeErrorProp
elapsed time for error propagation
QVector< Statistics > rmsImageRASigmas() const
Returns the list of RMS image right ascension sigma statistics.
void setNumberObservations(int numberObservations)
Sets the number of observations.
int numberLidarRangeConstraintEquations() const
Return the number of lidar range constraint equations.
QVector< Statistics > rmsImageXSigmas() const
Returns the list of RMS image x sigma statistics.
void printMaximumLikelihoodTierInformation()
Prints out information about which tier the solution is in and the status of the residuals.
BundleResults & operator=(const BundleResults &src)
Assignment operator for BundleResults.
void resizeSigmaStatisticsVectors(int numberImages)
Resizes all image sigma vectors.
CorrelationMatrix * m_correlationMatrix
The correlation matrix from the BundleAdjust.
void setDegreesOfFreedom(double degreesOfFreedom)
Sets the degrees of freedom.
Distance m_minSigmaCoord1Distance
The minimum sigma latitude distance.
Distance maxSigmaCoord3Distance() const
Returns the maximum sigma distance for coordinate 3.
Distance maxSigmaCoord1Distance() const
Returns the maximum sigma distance for coordinate 1.
double m_rmsYResiduals
rms of y residuals
QString m_maxSigmaCoord2PointId
The maximum sigma coordinate2 point id.
QList< QPair< MaximumLikelihoodWFunctions, double > > m_maximumLikelihoodFunctions
< The maximum likelihood models and their quantiles.
void setCorrMatCovFileName(FileName name)
Set the covariance file name for the matrix used to calculate the correlation matrix.
QString m_maxSigmaCoord3PointId
The maximum sigma coordinate 3 point id.
QList< Statistics > m_rmsImageSampleResiduals
List of RMS image sample residual statistics for each image in the bundle
QVector< Statistics > rmsImageTWISTSigmas() const
Returns the list of RMS image twist sigma statistics.
void setRmsLidarImageResidualLists(QList< Statistics > rmsLidarImageLineResiduals, QList< Statistics > rmsLidarImageSampleResiduals, QList< Statistics > rmsLidarImageResiduals)
Sets the root mean square lidar image residual Statistics lists.
QString maxSigmaCoord3PointId() const
Returns the maximum sigma point id for coordinate 3.
void computeSigma0(double dvtpv, BundleSettings::ConvergenceCriteria criteria)
Computes the sigma0 and stores it internally.
QList< Statistics > m_rmsImageResiduals
RMS image sample and line residual statistics for each image in the bundle
QString maxSigmaCoord2PointId() const
Returns the maximum sigma point id for coordinate 2.
int numberConstrainedImageParameters() const
Returns the number of constrained image parameters.
void setElapsedTimeErrorProp(double time)
Sets the elapsed time for error propegation.
QVector< Statistics > rmsImageZSigmas() const
Returns the list of RMS image z sigma statistics.
QList< Statistics > rmsLidarImageResiduals() const
Returns the list of RMS image lidar residuals statistics.
int m_numberHeldImages
number of 'held' images (define)
double sigmaCoord1StatisticsRms() const
Returns the RMS of the adjusted sigmas for coordinate 1.
void setConverged(bool converged)
Sets if the bundle adjustment converged.
Distance minSigmaCoord2Distance() const
Returns the minimum sigma distance for coordinate 2.
void resetNumberConstrainedTargetParameters()
Resets the number of constrained target parameters to 0.
double m_rmsSigmaCoord1Stats
rms of adjusted Latitude sigmas
StatCumProbDistDynCalc cumulativeProbabilityDistribution() const
Returns the cumulative probability distribution of the |R^2 residuals|.
int degreesOfFreedom() const
Returns the degrees of freedom.
QVector< Statistics > m_rmsImageDECSigmas
< The root mean square image declination sigmas.
ConvergenceCriteria
This enum defines the options for the bundle adjustment's convergence.
@ ParameterCorrections
All parameter corrections will be used to determine that the bundle adjustment has converged.
This is a container for the correlation matrix that comes from a bundle adjust.
void setCovarianceFileName(FileName covarianceFileName)
Set the qmap of images and parameters.
void setImagesAndParameters(QMap< QString, QStringList > imagesAndParameters)
Set the qmap of images and parameters.
Distance measurement, usually in meters.
Definition Distance.h:34
void setMeters(double distanceInMeters)
Set the distance in meters.
Definition Distance.cpp:96
File name manipulation and expansion.
Definition FileName.h:100
Isis exception class.
Definition IException.h:91
@ Unknown
A type of error that cannot be classified as any of the other error types.
Definition IException.h:118
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition IException.h:146
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition IException.h:155
Adds specific functionality to C++ strings.
Definition IString.h:165
Class provides maximum likelihood estimation functions for robust parameter estimation,...
static QString modelToString(Model model)
Static method to return a string represtentation for a given MaximumLikelihoodWFunctions::Model enum.
The main project for ipce.
Definition Project.h:289
This class is used to approximate cumulative probibility distributions of a stream of observations wi...
double value(double cumProb)
Provides the value of the variable that has the given cumulative probility (according the current est...
void addObs(double obs)
Values for the estimated quantile positions are update as observations are added.
This class is used to accumulate statistics on double arrays.
Definition Statistics.h:94
CoordinateType
Defines the coordinate typ, units, and coordinate index for some of the output methods.
@ Latitudinal
Planetocentric latitudinal (lat/lon/rad) coordinates.
@ Rectangular
Body-fixed rectangular x/y/z coordinates.
Manage a stack of content handlers for reading XML files.
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
int toInt(const QString &string)
Global function to convert from a string to an integer.
Definition IString.cpp:93
bool toBool(const QString &string)
Global function to convert from a string to a boolean.
Definition IString.cpp:38
double toDouble(const QString &string)
Global function to convert from a string to a double.
Definition IString.cpp:149