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);