Commit 5d510393 authored by Kim Oyama's avatar Kim Oyama
Browse files

BundleAdjust now emits signals so output can post to the bundle dialog in cnetsuite.

git-svn-id: http://subversion.wr.usgs.gov/repos/prog/isis3/branches/ipce@5946 41f8697f-d340-4b68-9986-7bafba869bb8
parent e2fc7f4c
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -109,8 +109,10 @@ void IsisMain() {
    
    // Bundle adjust to solve for new pointing
    BundleSettings settings = bundleSettings();
    BundleAdjust bundleAdjust(settings, cnet, serialNumberList);
    bundleAdjust.solveCholesky();
    BundleAdjust *bundleAdjust = new BundleAdjust(settings, cnet, serialNumberList);
    QObject::connect( bundleAdjust, SIGNAL( statusUpdate(QString) ),
                      bundleAdjust, SLOT( outputBundleStatus(QString) ) );
    bundleAdjust->solveCholesky();
//    bundleAdjust.solveCholeskyBR();

    // ??? Cube c;
@@ -121,7 +123,7 @@ void IsisMain() {
      c.label()->deleteObject("Polygon");
    }

    Table cmatrix = bundleAdjust.cMatrix(0);
    Table cmatrix = bundleAdjust->cMatrix(0);

    // Write out a description in the spice table
    QString deltackComment = "deltackAdjusted = " + Isis::iTime::CurrentLocalTime();
+3 −0
Original line number Diff line number Diff line
#include "Isis.h"

#include <QDir>
#include <QObject>
#include <QList>

#include "BundleAdjust.h"
@@ -55,6 +56,8 @@ void IsisMain() {
  // Bundle adjust the network
  try {

    QObject::connect( bundleAdjustment, SIGNAL( statusUpdate(QString) ),
                      bundleAdjustment, SLOT( outputBundleStatus(QString) ) );
    bundleAdjustment->solveCholesky();
    
    // write updated control net if bundle has converged
+41 −33
Original line number Diff line number Diff line
@@ -258,7 +258,6 @@ namespace Isis {

    // should we initialize objects m_Statsx, m_Statsy, m_Statsrx, m_Statsry, m_Statsrxy


    // (must be a smarter way)
    // get target body radii and body specific conversion factors between radians and meters.
    // need validity checks and different conversion factors for lat and long
@@ -384,7 +383,7 @@ namespace Isis {
   *                        well as no measures.
   */
  bool BundleAdjust::validateNetwork() {
    printf("Validating network...\n");
    emit statusUpdate("Validating network...");

    // verify measures exist for all images
    int nimagesWithInsufficientMeasures = 0;
@@ -404,7 +403,7 @@ namespace Isis {
      throw IException(IException::User, msg, _FILEINFO_);
    }

    printf("Validation complete!...\n");
    emit statusUpdate("Validation complete!...");

    return true;
  }
@@ -559,7 +558,7 @@ namespace Isis {
    clock_t t1 = clock();

    for (;;) {
      printf("starting iteration %d\n", m_nIteration);
      emit statusUpdate( QString("\n starting iteration %1 \n").arg(m_nIteration) );
      clock_t iterationclock1 = clock();

      // send notification to UI indicating "new iteration"
@@ -625,12 +624,21 @@ namespace Isis {
      // variance of unit weight (also reference variance, variance factor, etc.)
      m_bundleStatistics.computeSigma0(dvtpv, m_bundleSettings.convergenceCriteria());

      printf("Iteration: %d\nSigma0: %20.10lf\n", m_nIteration, m_bundleStatistics.sigma0());
      printf("Observations: %d\nConstrained Parameters:%d\nUnknowns: %d\nDegrees of Freedom: %d\n",
             m_bundleStatistics.numberObservations(), 
             m_bundleStatistics.numberConstrainedPointParameters(), 
             m_bundleStatistics.numberUnknownParameters(), 
             m_bundleStatistics.degreesOfFreedom());
      emit statusUpdate(QString("Iteration: %1").arg(m_nIteration) );

      emit statusUpdate(QString("Sigma0: %1").arg(m_bundleStatistics.sigma0() ) );

      emit statusUpdate( QString("Observations: %1").arg(
               m_bundleStatistics.numberObservations() ) );

      emit statusUpdate( QString("Constrained Parameters:%1").arg(
               m_bundleStatistics.numberConstrainedPointParameters() ) );

      emit statusUpdate( QString("Unknowns: %1").arg(
               m_bundleStatistics.numberUnknownParameters() ) );

      emit statusUpdate( QString("Degrees of Freedom: %1").arg(
               m_bundleStatistics.degreesOfFreedom() ) );

      // check for convergence
      if (m_bundleSettings.convergenceCriteria() == BundleSettings::Sigma0) {
@@ -653,7 +661,8 @@ namespace Isis {
          else {  // otherwise iterations are complete
            m_bLastIteration = true;
            m_bundleStatistics.setConverged(true);
            printf("Bundle has converged\n");
            emit statusUpdate("\n Bundle has converged");
            emit bundleConvergence(true);
            break;
          }
        }
@@ -672,7 +681,8 @@ namespace Isis {
        if ( nconverged == numimgparam ) {
          m_bundleStatistics.setConverged(true);
          m_bLastIteration = true;
          printf("Bundle has converged\n");
          emit statusUpdate("Bundle has converged");
          emit bundleConvergence(true);
          break;
        }
      }
@@ -681,7 +691,8 @@ namespace Isis {
      m_bundleStatistics.printMaximumLikelihoodTierInformation();
      clock_t iterationclock2 = clock();
      double dIterationTime = ((iterationclock2 - iterationclock1) / (double)CLOCKS_PER_SEC);
      printf("End of Iteration %d\nElapsed Time: %20.10lf\n", m_nIteration, dIterationTime);
      emit statusUpdate( QString("End of Iteration %1").arg(m_nIteration) );
      emit statusUpdate( QString("Elapsed Time: %1").arg(dIterationTime) );

      // send notification to UI indicating "new iteration"
      // UI.Notify(BundleEvent.END_ITERATION);
@@ -707,9 +718,9 @@ namespace Isis {

    if (m_bundleStatistics.converged() && m_bundleSettings.errorPropagation()) {
      clock_t terror1 = clock();
      printf("\nStarting Error Propagation");
      emit statusUpdate("Starting Error Propagation");
      errorPropagation();
      printf("\n\nError Propagation Complete\n");
      emit statusUpdate("Error Propagation Complete");
      clock_t terror2 = clock();
      m_bundleStatistics.setElapsedTimeErrorProp((terror2 - terror1) / (double)CLOCKS_PER_SEC);
    }
@@ -719,10 +730,10 @@ namespace Isis {

    wrapUp();

    printf("\nGenerating report files\n");
    emit statusUpdate("\n Generating report files");
    output();

    printf("\nBundle complete\n");
    emit statusUpdate("\n Bundle Complete");
    
    iterationSummary();

@@ -3303,9 +3314,7 @@ namespace Isis {
    FileName matrixFile;
    matrixFile = FileName::createTempFile("inverseMatrix.dat");
    // Create file handle

    QFile matrixOutput( matrixFile.name() ); //"covarianceMatrix.dat");

    QFile matrixOutput(matrixFile.name());
    // Open file to write to
    matrixOutput.open(QIODevice::WriteOnly);
    QDataStream outStream(&matrixOutput);
@@ -3647,8 +3656,8 @@ namespace Isis {
    gp += PvlKeyword( "Rejected_Measures", 
                      toString( m_bundleStatistics.numberRejectedObservations()/2) );

    if (m_bundleStatistics.numberMaximumLikelihoodModels() 
             > m_bundleStatistics.maximumLikelihoodModelIndex()) {
    if ( m_bundleStatistics.numberMaximumLikelihoodModels() >
         m_bundleStatistics.maximumLikelihoodModelIndex() ) {
      // if maximum likelihood estimation is being used
      gp += PvlKeyword( "Maximum_Likelihood_Tier: ", 
                        toString( m_bundleStatistics.maximumLikelihoodModelIndex() ) );
@@ -4125,8 +4134,6 @@ namespace Isis {
    sprintf(buf, "\nIMAGE EXTERIOR ORIENTATION\n==========================\n");
    fp_out << buf;

    QMap<QString, QStringList> imagesAndParameters;
    
    for (int i = 0; i < nObservations; i++) {

      //if ( m_bundleStatistics.numberHeldImages() > 0 && m_pHeldSnList->HasSerialNumber(m_pSnList->SerialNumber(i)) )
@@ -4152,17 +4159,8 @@ namespace Isis {
      QString observationString =
          observation->formatBundleOutputString(berrorProp);
      fp_out << (const char*)observationString.toAscii().data();
      
      foreach ( QString image, observation->imageNames() ) {
        imagesAndParameters.insert( image, observation->parameterList() );
      }
    }

////////////////////////////////////////////////////////////////////////////////////////////////////
    // Save list of images and their associated parameters for CorrelationMatrix to use in ice.
    m_bundleStatistics.setCorrMatImgsAndParams(imagesAndParameters);
////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // output point uncertainty statistics if error propagation is on
    if (berrorProp) {
      sprintf(buf, "\n\n\nPOINTS UNCERTAINTY SUMMARY\n==========================\n\n");
@@ -5051,4 +5049,14 @@ namespace Isis {
  bool BundleAdjust::isConverged() {
    return m_bundleStatistics.converged();
  }



  /**
   * Slot for deltack and jigsaw to output the bundle status.
   */
  void BundleAdjust::outputBundleStatus(QString status) {
    status += "\n";
    printf(status.toStdString().c_str());
  }
}
+9 −1
Original line number Diff line number Diff line
@@ -185,7 +185,8 @@ namespace Isis {
   *   @history 2014-07-23 Jeannie Backer - Modified to print "N/A" for rejection multiplier if 
   *                           outlier rejection is turned off.
   */
  class BundleAdjust {
  class BundleAdjust : public QObject {
      Q_OBJECT
    public:
      BundleAdjust(BundleSettings bundleSettings, 
                   const QString &cnetFile, 
@@ -246,6 +247,13 @@ namespace Isis {
        return m_iterationSummary;
      } // TODO: move implementation to cpp per ISIS standards

    signals:
      void statusUpdate(QString status);
      void bundleConvergence(bool converged);

    public slots:
      void outputBundleStatus(QString status);
      
    private:

      void init(Progress *progress = 0);
+7 −4
Original line number Diff line number Diff line
#include "BundleObservationVector.h"

#include <QDebug>

#include "BundleObservation.h"
#include "BundleSettings.h"
#include "IException.h"
@@ -30,7 +32,6 @@ namespace Isis {
                                                     QString observationNumber,
                                                     QString instrumentId,
                                                     BundleSettings& bundleSettings) {

    BundleObservation* bundleObservation;
    bool bAddToExisting = false;

@@ -38,9 +39,10 @@ namespace Isis {
        m_observationNumberToObservationMap.contains(observationNumber)) {
      bundleObservation = m_observationNumberToObservationMap.value(observationNumber);

      if (bundleObservation->instrumentId() == instrumentId)
      if (bundleObservation->instrumentId() == instrumentId){
        bAddToExisting = true;
      }
    }

    if (bAddToExisting) {
      // if we have already added a BundleObservation with this number, we have to add the new
@@ -66,7 +68,6 @@ namespace Isis {
      }

      bundleImage->setParentObservation(bundleObservation);

      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      // TODO: problem when using settings from gui that no instrument id is set
      //
@@ -74,8 +75,10 @@ namespace Isis {
      if ( bundleSettings.numberSolveSettings() == 1) {
        solveSettings = bundleSettings.observationSolveSettings(0);
      }
      else
      else {
        solveSettings = bundleSettings.observationSolveSettings(instrumentId);
      }

      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      bundleObservation->setSolveSettings(solveSettings);
Loading