9 #include "BundleResults.h"
11 #include <QDataStream>
16 #include <QXmlStreamWriter>
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>
24 #include "ControlMeasure.h"
25 #include "ControlPoint.h"
26 #include "CorrelationMatrix.h"
30 #include "MaximumLikelihoodWFunctions.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"
39 using namespace boost::numeric::ublas;
78 xmlReader->setErrorHandler(
new XmlHandler(
this, project));
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_numberRejectedObservations(src.m_numberRejectedObservations),
100 m_numberUnknownParameters(src.m_numberUnknownParameters),
101 m_numberImageParameters(src.m_numberImageParameters),
102 m_numberConstrainedImageParameters(src.m_numberConstrainedImageParameters),
103 m_numberConstrainedPointParameters(src.m_numberConstrainedPointParameters),
104 m_numberConstrainedTargetParameters(src.m_numberConstrainedTargetParameters),
105 m_degreesOfFreedom(src.m_degreesOfFreedom),
106 m_sigma0(src.m_sigma0),
107 m_elapsedTime(src.m_elapsedTime),
108 m_elapsedTimeErrorProp(src.m_elapsedTimeErrorProp),
109 m_converged(src.m_converged),
110 m_bundleControlPoints(src.m_bundleControlPoints),
111 m_outNet(src.m_outNet),
112 m_iterations(src.m_iterations),
113 m_observations(src.m_observations),
114 m_rmsImageSampleResiduals(src.m_rmsImageSampleResiduals),
115 m_rmsImageLineResiduals(src.m_rmsImageLineResiduals),
116 m_rmsImageResiduals(src.m_rmsImageResiduals),
117 m_rmsImageXSigmas(src.m_rmsImageXSigmas),
118 m_rmsImageYSigmas(src.m_rmsImageYSigmas),
119 m_rmsImageZSigmas(src.m_rmsImageZSigmas),
120 m_rmsImageRASigmas(src.m_rmsImageRASigmas),
121 m_rmsImageDECSigmas(src.m_rmsImageDECSigmas),
122 m_rmsImageTWISTSigmas(src.m_rmsImageTWISTSigmas),
123 m_minSigmaCoord1Distance(src.m_minSigmaCoord1Distance),
124 m_maxSigmaCoord1Distance(src.m_maxSigmaCoord1Distance),
125 m_minSigmaCoord2Distance(src.m_minSigmaCoord2Distance),
126 m_maxSigmaCoord2Distance(src.m_maxSigmaCoord2Distance),
127 m_minSigmaCoord3Distance(src.m_minSigmaCoord3Distance),
128 m_maxSigmaCoord3Distance(src.m_maxSigmaCoord3Distance),
129 m_minSigmaCoord1PointId(src.m_minSigmaCoord1PointId),
130 m_maxSigmaCoord1PointId(src.m_maxSigmaCoord1PointId),
131 m_minSigmaCoord2PointId(src.m_minSigmaCoord2PointId),
132 m_maxSigmaCoord2PointId(src.m_maxSigmaCoord2PointId),
133 m_minSigmaCoord3PointId(src.m_minSigmaCoord3PointId),
134 m_maxSigmaCoord3PointId(src.m_maxSigmaCoord3PointId),
135 m_rmsSigmaCoord1Stats(src.m_rmsSigmaCoord1Stats),
136 m_rmsSigmaCoord2Stats(src.m_rmsSigmaCoord2Stats),
137 m_rmsSigmaCoord3Stats(src.m_rmsSigmaCoord3Stats),
138 m_maximumLikelihoodFunctions(src.m_maximumLikelihoodFunctions),
139 m_maximumLikelihoodIndex(src.m_maximumLikelihoodIndex),
142 m_maximumLikelihoodMedianR2Residuals(src.m_maximumLikelihoodMedianR2Residuals) {
194 m_converged = src.m_converged;
202 m_rmsImageXSigmas = src.m_rmsImageXSigmas;
259 m_rmsImageXSigmas.clear();
338 m_rmsImageXSigmas.resize(numberImages);
384 QString minCoord1PointId, QString maxCoord1PointId) {
401 QString minCoord2PointId, QString maxCoord2PointId) {
418 QString minCoord3PointId, QString maxCoord3PointId) {
434 double rmsFromSigmaCoord1Stats,
435 double rmsFromSigmaCoord2Stats,
436 double rmsFromSigmaCoord3Stats) {
465 for (
int i = 0; i < modelsWithQuantiles.size(); i++) {
478 modelsWithQuantiles[i].second));
906 return m_rmsImageXSigmas;
1290 "Output Control Network has not been set.",
1411 "Correlation matrix for this bundle is NULL.",
1465 stream.writeStartElement(
"bundleResults");
1466 stream.writeStartElement(
"correlationMatrix");
1467 stream.writeAttribute(
"correlationFileName",
1469 stream.writeAttribute(
"covarianceFileName",
1471 stream.writeStartElement(
"imagesAndParameters");
1472 QMapIterator<QString, QStringList> imgParamIt(*
correlationMatrix().imagesAndParameters());
1473 while (imgParamIt.hasNext()) {
1475 stream.writeStartElement(
"image");
1476 stream.writeAttribute(
"id", imgParamIt.key());
1478 for (
int i = 0; i < parameters.size(); i++) {
1479 stream.writeTextElement(
"parameter", parameters[i]);
1481 stream.writeEndElement();
1484 stream.writeEndElement();
1485 stream.writeEndElement();
1487 stream.writeStartElement(
"generalStatisticsValues");
1495 stream.writeTextElement(
"numberConstrainedPointParameters",
1497 stream.writeTextElement(
"numberConstrainedImageParameters",
1499 stream.writeTextElement(
"numberConstrainedTargetParameters",
1505 stream.writeEndElement();
1507 stream.writeStartElement(
"rms");
1508 stream.writeStartElement(
"residuals");
1512 stream.writeEndElement();
1513 stream.writeStartElement(
"sigmas");
1516 switch (coordType) {
1528 IString msg =
"Unknown surface point coordinate type enum [" +
toString(coordType) +
"]." ;
1531 stream.writeEndElement();
1533 stream.writeStartElement(
"imageResidualsLists");
1534 stream.writeStartElement(
"residualsList");
1537 stream.writeStartElement(
"statisticsItem");
1539 stream.writeEndElement();
1541 stream.writeEndElement();
1542 stream.writeStartElement(
"sampleList");
1545 stream.writeStartElement(
"statisticsItem");
1547 stream.writeEndElement();
1549 stream.writeEndElement();
1551 stream.writeStartElement(
"lineList");
1554 stream.writeStartElement(
"statisticsItem");
1556 stream.writeEndElement();
1558 stream.writeEndElement();
1559 stream.writeEndElement();
1561 stream.writeStartElement(
"imageSigmasLists");
1562 stream.writeStartElement(
"xSigmas");
1564 for (
int i = 0; i < m_rmsImageXSigmas.size(); i++) {
1565 stream.writeStartElement(
"statisticsItem");
1566 m_rmsImageXSigmas[i].save(stream, project);
1567 stream.writeEndElement();
1570 stream.writeEndElement();
1572 stream.writeStartElement(
"ySigmas");
1575 stream.writeStartElement(
"statisticsItem");
1577 stream.writeEndElement();
1579 stream.writeEndElement();
1581 stream.writeStartElement(
"zSigmas");
1584 stream.writeStartElement(
"statisticsItem");
1586 stream.writeEndElement();
1588 stream.writeEndElement();
1590 stream.writeStartElement(
"raSigmas");
1593 stream.writeStartElement(
"statisticsItem");
1595 stream.writeEndElement();
1597 stream.writeEndElement();
1599 stream.writeStartElement(
"decSigmas");
1602 stream.writeStartElement(
"statisticsItem");
1604 stream.writeEndElement();
1606 stream.writeEndElement();
1608 stream.writeStartElement(
"twistSigmas");
1611 stream.writeStartElement(
"statisticsItem");
1613 stream.writeEndElement();
1615 stream.writeEndElement();
1616 stream.writeEndElement();
1617 stream.writeEndElement();
1619 stream.writeStartElement(
"elapsedTime");
1622 stream.writeEndElement();
1624 stream.writeStartElement(
"minMaxSigmas");
1627 switch (coordType) {
1629 stream.writeStartElement(
"minLat");
1632 stream.writeEndElement();
1633 stream.writeStartElement(
"maxLat");
1636 stream.writeEndElement();
1637 stream.writeStartElement(
"minLon");
1640 stream.writeEndElement();
1641 stream.writeStartElement(
"maxLon");
1644 stream.writeEndElement();
1645 stream.writeStartElement(
"minRad");
1648 stream.writeEndElement();
1649 stream.writeStartElement(
"maxRad");
1652 stream.writeEndElement();
1655 stream.writeStartElement(
"minX");
1658 stream.writeEndElement();
1659 stream.writeStartElement(
"maxX");
1662 stream.writeEndElement();
1663 stream.writeStartElement(
"minY");
1666 stream.writeEndElement();
1667 stream.writeStartElement(
"maxY");
1670 stream.writeEndElement();
1671 stream.writeStartElement(
"minZ");
1674 stream.writeEndElement();
1675 stream.writeStartElement(
"maxZ");
1678 stream.writeEndElement();
1681 IString msg =
"Unknown surface point coordinate type enum [" +
toString(coordType) +
"]." ;
1684 stream.writeEndElement();
1687 stream.writeStartElement(
"maximumLikelihoodEstimation");
1690 stream.writeAttribute(
"maximumLikelihoodMedianR2Residuals",
1693 stream.writeStartElement(
"cumulativeProbabilityCalculator");
1695 stream.writeEndElement();
1697 stream.writeStartElement(
"residualsCumulativeProbabilityCalculator");
1699 stream.writeEndElement();
1702 stream.writeStartElement(
"model");
1703 stream.writeAttribute(
"modelNumber",
toString(i+1));
1704 stream.writeAttribute(
"modelSelection",
1706 stream.writeAttribute(
"tweakingConstant",
1709 stream.writeEndElement();
1711 stream.writeEndElement();
1712 stream.writeEndElement();
1724 m_xmlHandlerCumProCalc = NULL;
1725 m_xmlHandlerBundleResults = NULL;
1726 m_xmlHandlerProject = NULL;
1728 m_xmlHandlerBundleResults = statistics;
1729 m_xmlHandlerProject = project;
1730 m_xmlHandlerCharacters =
"";
1732 m_xmlHandlerResidualsListSize = 0;
1733 m_xmlHandlerSampleResidualsListSize = 0;
1734 m_xmlHandlerLineResidualsListSize = 0;
1735 m_xmlHandlerXSigmasListSize = 0;
1736 m_xmlHandlerYSigmasListSize = 0;
1737 m_xmlHandlerZSigmasListSize = 0;
1738 m_xmlHandlerRASigmasListSize = 0;
1739 m_xmlHandlerDECSigmasListSize = 0;
1740 m_xmlHandlerTWISTSigmasListSize = 0;
1741 m_xmlHandlerStatisticsList.clear();
1753 m_xmlHandlerProject = NULL;
1773 const QString &localName,
1774 const QString &qName,
1775 const QXmlAttributes &atts) {
1776 m_xmlHandlerCharacters =
"";
1778 if (XmlStackedHandler::startElement(namespaceURI, localName, qName, atts)) {
1780 if (qName ==
"correlationMatrix") {
1781 m_xmlHandlerBundleResults->m_correlationMatrix = NULL;
1784 QString correlationFileName = atts.value(
"correlationFileName");
1785 if (!correlationFileName.isEmpty()) {
1786 FileName correlationFile(correlationFileName);
1787 m_xmlHandlerBundleResults->m_correlationMatrix->setCorrelationFileName(correlationFile);
1790 QString covarianceFileName = atts.value(
"covarianceFileName");
1791 if (!covarianceFileName.isEmpty()) {
1792 FileName covarianceFile(covarianceFileName);
1793 m_xmlHandlerBundleResults->m_correlationMatrix->setCovarianceFileName(covarianceFile);
1796 else if (qName ==
"image") {
1797 QString correlationMatrixImageId = atts.value(
"id");
1798 if (!correlationMatrixImageId.isEmpty()) {
1799 m_xmlHandlerCorrelationImageId = correlationMatrixImageId;
1802 else if (qName ==
"residuals") {
1803 QString rx = atts.value(
"x");
1804 if (!rx.isEmpty()) {
1805 m_xmlHandlerBundleResults->m_rmsXResiduals =
toDouble(rx);
1808 QString ry = atts.value(
"y");
1809 if (!ry.isEmpty()) {
1810 m_xmlHandlerBundleResults->m_rmsYResiduals =
toDouble(ry);
1813 QString rxy = atts.value(
"xy");
1814 if (!rxy.isEmpty()) {
1815 m_xmlHandlerBundleResults->m_rmsXYResiduals =
toDouble(rxy);
1818 else if (qName ==
"sigmas") {
1819 QString lat = atts.value(
"lat");
1820 if (!lat.isEmpty()) {
1821 m_xmlHandlerBundleResults->m_rmsSigmaCoord1Stats =
toDouble(lat);
1823 QString lon = atts.value(
"lon");
1824 if (!lon.isEmpty()) {
1825 m_xmlHandlerBundleResults->m_rmsSigmaCoord2Stats =
toDouble(lon);
1827 QString rad = atts.value(
"rad");
1828 if (!rad.isEmpty()) {
1829 m_xmlHandlerBundleResults->m_rmsSigmaCoord3Stats =
toDouble(rad);
1831 QString x = atts.value(
"x");
1833 m_xmlHandlerBundleResults->m_rmsSigmaCoord1Stats =
toDouble(x);
1835 QString y = atts.value(
"y");
1837 m_xmlHandlerBundleResults->m_rmsSigmaCoord2Stats =
toDouble(y);
1839 QString z = atts.value(
"z");
1841 m_xmlHandlerBundleResults->m_rmsSigmaCoord3Stats =
toDouble(z);
1844 else if (qName ==
"residualsList") {
1845 QString listSizeStr = atts.value(
"listSize");
1846 if (!listSizeStr.isEmpty()) {
1847 m_xmlHandlerResidualsListSize =
toInt(listSizeStr);
1850 else if (qName ==
"sampleList") {
1851 QString listSizeStr = atts.value(
"listSize");
1852 if (!listSizeStr.isEmpty()) {
1853 m_xmlHandlerSampleResidualsListSize =
toInt(listSizeStr);
1856 else if (qName ==
"lineList") {
1857 QString listSizeStr = atts.value(
"listSize");
1858 if (!listSizeStr.isEmpty()) {
1859 m_xmlHandlerLineResidualsListSize =
toInt(listSizeStr);
1862 else if (qName ==
"xSigmas") {
1863 QString listSizeStr = atts.value(
"listSize");
1864 if (!listSizeStr.isEmpty()) {
1865 m_xmlHandlerXSigmasListSize =
toInt(listSizeStr);
1868 else if (qName ==
"ySigmas") {
1869 QString listSizeStr = atts.value(
"listSize");
1870 if (!listSizeStr.isEmpty()) {
1871 m_xmlHandlerYSigmasListSize =
toInt(listSizeStr);
1874 else if (qName ==
"zSigmas") {
1875 QString listSizeStr = atts.value(
"listSize");
1876 if (!listSizeStr.isEmpty()) {
1877 m_xmlHandlerZSigmasListSize =
toInt(listSizeStr);
1880 else if (qName ==
"raSigmas") {
1881 QString listSizeStr = atts.value(
"listSize");
1882 if (!listSizeStr.isEmpty()) {
1883 m_xmlHandlerRASigmasListSize =
toInt(listSizeStr);
1887 else if (qName ==
"decSigmas") {
1888 QString listSizeStr = atts.value(
"listSize");
1889 if (!listSizeStr.isEmpty()) {
1890 m_xmlHandlerDECSigmasListSize =
toInt(listSizeStr);
1893 else if (qName ==
"twistSigmas") {
1894 QString listSizeStr = atts.value(
"listSize");
1895 if (!listSizeStr.isEmpty()) {
1896 m_xmlHandlerTWISTSigmasListSize =
toInt(listSizeStr);
1899 else if (qName ==
"statisticsItem") {
1901 m_xmlHandlerStatisticsList.append(
1902 new Statistics(m_xmlHandlerProject, reader()));
1904 else if (qName ==
"elapsedTime") {
1905 QString time = atts.value(
"time");
1906 if (!time.isEmpty()) {
1907 m_xmlHandlerBundleResults->m_elapsedTime =
toDouble(time);
1910 QString errorProp = atts.value(
"errorProp");
1911 if (!errorProp.isEmpty()) {
1912 m_xmlHandlerBundleResults->m_elapsedTimeErrorProp =
toDouble(errorProp);
1924 else if (qName ==
"minLat") {
1925 QString minLat = atts.value(
"value");
1926 if (!minLat.isEmpty()) {
1927 m_xmlHandlerBundleResults->m_minSigmaCoord1Distance.setMeters(
toDouble(minLat));
1930 QString minLatPointId = atts.value(
"pointId");
1931 if (!minLatPointId.isEmpty()) {
1932 m_xmlHandlerBundleResults->m_minSigmaCoord1PointId = minLatPointId;
1936 else if (qName ==
"minX") {
1937 QString minX = atts.value(
"value");
1938 if (!minX.isEmpty()) {
1939 m_xmlHandlerBundleResults->m_minSigmaCoord1Distance.setMeters(
toDouble(minX));
1942 QString minXPointId = atts.value(
"pointId");
1943 if (!minXPointId.isEmpty()) {
1944 m_xmlHandlerBundleResults->m_minSigmaCoord1PointId = minXPointId;
1947 else if (qName ==
"maxLat") {
1948 QString maxLat = atts.value(
"value");
1949 if (!maxLat.isEmpty()) {
1950 m_xmlHandlerBundleResults->m_maxSigmaCoord1Distance.setMeters(
toDouble(maxLat));
1953 QString maxLatPointId = atts.value(
"pointId");
1954 if (!maxLatPointId.isEmpty()) {
1955 m_xmlHandlerBundleResults->m_maxSigmaCoord1PointId = maxLatPointId;
1959 else if (qName ==
"maxX") {
1961 QString maxX = atts.value(
"value");
1962 if (!maxX.isEmpty()) {
1963 m_xmlHandlerBundleResults->m_maxSigmaCoord1Distance.setMeters(
toDouble(maxX));
1966 QString maxXPointId = atts.value(
"pointId");
1967 if (!maxXPointId.isEmpty()) {
1968 m_xmlHandlerBundleResults->m_maxSigmaCoord1PointId = maxXPointId;
1972 else if (qName ==
"minLon") {
1974 QString minLon = atts.value(
"value");
1975 if (!minLon.isEmpty()) {
1976 m_xmlHandlerBundleResults->m_minSigmaCoord2Distance.setMeters(
toDouble(minLon));
1979 QString minLonPointId = atts.value(
"pointId");
1980 if (!minLonPointId.isEmpty()) {
1981 m_xmlHandlerBundleResults->m_minSigmaCoord2PointId = minLonPointId;
1985 else if (qName ==
"minY") {
1987 QString minY = atts.value(
"value");
1988 if (!minY.isEmpty()) {
1989 m_xmlHandlerBundleResults->m_minSigmaCoord2Distance.setMeters(
toDouble(minY));
1992 QString minYPointId = atts.value(
"pointId");
1993 if (!minYPointId.isEmpty()) {
1994 m_xmlHandlerBundleResults->m_minSigmaCoord2PointId = minYPointId;
1998 else if (qName ==
"maxLon") {
2000 QString maxLon = atts.value(
"value");
2001 if (!maxLon.isEmpty()) {
2002 m_xmlHandlerBundleResults->m_maxSigmaCoord2Distance.setMeters(
toDouble(maxLon));
2005 QString maxLonPointId = atts.value(
"pointId");
2006 if (!maxLonPointId.isEmpty()) {
2007 m_xmlHandlerBundleResults->m_maxSigmaCoord2PointId = maxLonPointId;
2011 else if (qName ==
"maxY") {
2012 QString maxY = atts.value(
"value");
2013 if (!maxY.isEmpty()) {
2014 m_xmlHandlerBundleResults->m_maxSigmaCoord2Distance.setMeters(
toDouble(maxY));
2017 QString maxYPointId = atts.value(
"pointId");
2018 if (!maxYPointId.isEmpty()) {
2019 m_xmlHandlerBundleResults->m_maxSigmaCoord2PointId = maxYPointId;
2023 else if (qName ==
"minRad") {
2025 QString minRad = atts.value(
"value");
2026 if (!minRad.isEmpty()) {
2027 m_xmlHandlerBundleResults->m_minSigmaCoord3Distance.setMeters(
toDouble(minRad));
2030 QString minRadPointId = atts.value(
"pointId");
2031 if (!minRadPointId.isEmpty()) {
2032 m_xmlHandlerBundleResults->m_minSigmaCoord3PointId = minRadPointId;
2036 else if (qName ==
"minZ") {
2038 QString minZ = atts.value(
"value");
2039 if (!minZ.isEmpty()) {
2040 m_xmlHandlerBundleResults->m_minSigmaCoord3Distance.setMeters(
toDouble(minZ));
2043 QString minZPointId = atts.value(
"pointId");
2044 if (!minZPointId.isEmpty()) {
2045 m_xmlHandlerBundleResults->m_minSigmaCoord3PointId = minZPointId;
2049 else if (qName ==
"maxRad") {
2051 QString maxRad = atts.value(
"value");
2052 if (!maxRad.isEmpty()) {
2053 m_xmlHandlerBundleResults->m_maxSigmaCoord3Distance.setMeters(
toDouble(maxRad));
2056 QString maxRadPointId = atts.value(
"pointId");
2057 if (!maxRadPointId.isEmpty()) {
2058 m_xmlHandlerBundleResults->m_maxSigmaCoord3PointId = maxRadPointId;
2062 else if (qName ==
"maxZ") {
2064 QString maxZ = atts.value(
"value");
2065 if (!maxZ.isEmpty()) {
2066 m_xmlHandlerBundleResults->m_maxSigmaCoord3Distance.setMeters(
toDouble(maxZ));
2069 QString maxZPointId = atts.value(
"pointId");
2070 if (!maxZPointId.isEmpty()) {
2071 m_xmlHandlerBundleResults->m_maxSigmaCoord3PointId = maxZPointId;
2075 else if (qName ==
"maximumLikelihoodEstimation") {
2076 QString maximumLikelihoodIndex = atts.value(
"maximumLikelihoodIndex");
2077 if (!maximumLikelihoodIndex.isEmpty()) {
2078 m_xmlHandlerBundleResults->m_maximumLikelihoodIndex =
toInt(maximumLikelihoodIndex);
2082 atts.value(
"maximumLikelihoodMedianR2Residuals");
2084 m_xmlHandlerBundleResults->m_maximumLikelihoodMedianR2Residuals =
2088 else if (qName ==
"model") {
2089 QString model = atts.value(
"modelSelection");
2090 QString tweakingConstant = atts.value(
"tweakingConstant");
2091 QString quantile = atts.value(
"quantile");
2092 bool validModel =
true;
2093 if (model.isEmpty()) validModel =
false;
2094 if (tweakingConstant.isEmpty()) validModel =
false;
2095 if (quantile.isEmpty()) validModel =
false;
2097 m_xmlHandlerBundleResults->m_maximumLikelihoodFunctions.append(
2099 MaximumLikelihoodWFunctions::stringToModel(model),
2104 else if (qName ==
"cumulativeProbabilityCalculator") {
2105 m_xmlHandlerBundleResults->m_cumPro = NULL;
2106 m_xmlHandlerBundleResults->m_cumPro =
2109 else if (qName ==
"residualsCumulativeProbabilityCalculator") {
2110 m_xmlHandlerBundleResults->m_cumProRes = NULL;
2127 m_xmlHandlerCharacters += ch;
2128 return XmlStackedHandler::characters(ch);
2142 const QString &qName) {
2144 if (!m_xmlHandlerCharacters.isEmpty()) {
2145 if (qName ==
"parameter") {
2147 m_xmlHandlerCorrelationParameterList.append(m_xmlHandlerCharacters);
2149 if (qName ==
"image") {
2151 if (m_xmlHandlerCorrelationImageId !=
"") {
2152 m_xmlHandlerCorrelationMap.insert(m_xmlHandlerCorrelationImageId,
2153 m_xmlHandlerCorrelationParameterList);
2155 m_xmlHandlerCorrelationImageId =
"";
2156 m_xmlHandlerCorrelationParameterList.clear();
2159 if (qName ==
"imagesAndParameters") {
2161 if (!m_xmlHandlerCorrelationMap.isEmpty()) {
2162 m_xmlHandlerBundleResults->setCorrMatImgsAndParams(m_xmlHandlerCorrelationMap);
2165 else if (qName ==
"numberFixedPoints") {
2166 m_xmlHandlerBundleResults->m_numberFixedPoints =
toInt(m_xmlHandlerCharacters);
2168 else if (qName ==
"numberIgnoredPoints") {
2169 m_xmlHandlerBundleResults->m_numberIgnoredPoints =
toInt(m_xmlHandlerCharacters);
2171 else if (qName ==
"numberHeldImages") {
2172 m_xmlHandlerBundleResults->m_numberHeldImages =
toInt(m_xmlHandlerCharacters);
2174 else if (qName ==
"rejectionLimit") {
2175 m_xmlHandlerBundleResults->m_rejectionLimit =
toDouble(m_xmlHandlerCharacters);
2177 else if (qName ==
"numberRejectedObservations") {
2178 m_xmlHandlerBundleResults->m_numberRejectedObservations =
toInt(m_xmlHandlerCharacters);
2180 else if (qName ==
"numberObservations") {
2181 m_xmlHandlerBundleResults->m_numberObservations =
toInt(m_xmlHandlerCharacters);
2183 else if (qName ==
"numberImageParameters") {
2184 m_xmlHandlerBundleResults->m_numberImageParameters =
toInt(m_xmlHandlerCharacters);
2186 else if (qName ==
"numberConstrainedPointParameters") {
2187 m_xmlHandlerBundleResults->m_numberConstrainedPointParameters =
2188 toInt(m_xmlHandlerCharacters);
2190 else if (qName ==
"numberConstrainedImageParameters") {
2191 m_xmlHandlerBundleResults->m_numberConstrainedImageParameters =
2192 toInt(m_xmlHandlerCharacters);
2194 else if (qName ==
"numberConstrainedTargetParameters") {
2195 m_xmlHandlerBundleResults->m_numberConstrainedTargetParameters =
2196 toInt(m_xmlHandlerCharacters);
2198 else if (qName ==
"numberUnknownParameters") {
2199 m_xmlHandlerBundleResults->m_numberUnknownParameters =
toInt(m_xmlHandlerCharacters);
2201 else if (qName ==
"degreesOfFreedom") {
2202 m_xmlHandlerBundleResults->m_degreesOfFreedom =
toInt(m_xmlHandlerCharacters);
2204 else if (qName ==
"sigma0") {
2205 m_xmlHandlerBundleResults->m_sigma0 =
toDouble(m_xmlHandlerCharacters);
2207 else if (qName ==
"converged") {
2208 m_xmlHandlerBundleResults->m_converged =
toBool(m_xmlHandlerCharacters);
2211 else if (qName ==
"residualsList") {
2212 if (m_xmlHandlerResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2214 "Unable to read xml file. Invalid residualsList", _FILEINFO_);
2216 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2217 m_xmlHandlerBundleResults->m_rmsImageResiduals.append(m_xmlHandlerStatisticsList[i]);
2219 m_xmlHandlerStatisticsList.clear();
2221 else if (qName ==
"sampleList") {
2222 if (m_xmlHandlerSampleResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2224 "Unable to read xml file. Invalid sampleList", _FILEINFO_);
2226 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2227 m_xmlHandlerBundleResults->m_rmsImageSampleResiduals.append(
2228 m_xmlHandlerStatisticsList[i]);
2230 m_xmlHandlerStatisticsList.clear();
2232 else if (qName ==
"lineList") {
2233 if (m_xmlHandlerLineResidualsListSize != m_xmlHandlerStatisticsList.size()) {
2235 "Unable to read xml file. Invalid lineList", _FILEINFO_);
2237 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2238 m_xmlHandlerBundleResults->m_rmsImageLineResiduals.append(m_xmlHandlerStatisticsList[i]);
2240 m_xmlHandlerStatisticsList.clear();
2242 else if (qName ==
"xSigmas") {
2243 if (m_xmlHandlerXSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2245 "Unable to read xml file. Invalid xSigmas", _FILEINFO_);
2247 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2248 m_xmlHandlerBundleResults->m_rmsImageXSigmas.append(m_xmlHandlerStatisticsList[i]);
2250 m_xmlHandlerStatisticsList.clear();
2252 else if (qName ==
"ySigmas") {
2253 if (m_xmlHandlerYSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2255 "Unable to read xml file. Invalid ySigmas", _FILEINFO_);
2257 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2258 m_xmlHandlerBundleResults->m_rmsImageYSigmas.append(m_xmlHandlerStatisticsList[i]);
2260 m_xmlHandlerStatisticsList.clear();
2262 else if (qName ==
"zSigmas") {
2263 if (m_xmlHandlerZSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2265 "Unable to read xml file. Invalid zSigmas", _FILEINFO_);
2267 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2268 m_xmlHandlerBundleResults->m_rmsImageZSigmas.append(m_xmlHandlerStatisticsList[i]);
2270 m_xmlHandlerStatisticsList.clear();
2272 else if (qName ==
"raSigmas") {
2273 if (m_xmlHandlerRASigmasListSize != m_xmlHandlerStatisticsList.size()) {
2275 "Unable to read xml file. Invalid raSigmas", _FILEINFO_);
2277 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2278 m_xmlHandlerBundleResults->m_rmsImageRASigmas.append(m_xmlHandlerStatisticsList[i]);
2280 m_xmlHandlerStatisticsList.clear();
2282 else if (qName ==
"decSigmas") {
2283 if (m_xmlHandlerDECSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2285 "Unable to read xml file. Invalid decSigmas", _FILEINFO_);
2287 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2288 m_xmlHandlerBundleResults->m_rmsImageDECSigmas.append(m_xmlHandlerStatisticsList[i]);
2290 m_xmlHandlerStatisticsList.clear();
2292 else if (qName ==
"twistSigmas") {
2293 if (m_xmlHandlerTWISTSigmasListSize != m_xmlHandlerStatisticsList.size()) {
2295 "Unable to read xml file. Invalid twistSigmas", _FILEINFO_);
2297 for (
int i = 0; i < m_xmlHandlerStatisticsList.size(); i++) {
2298 m_xmlHandlerBundleResults->m_rmsImageTWISTSigmas.append(m_xmlHandlerStatisticsList[i]);
2300 m_xmlHandlerStatisticsList.clear();
2303 m_xmlHandlerCharacters =
"";
2304 return XmlStackedHandler::endElement(namespaceURI, localName, qName);