Unverified Commit f2ab92c7 authored by Jesse Mapel's avatar Jesse Mapel Committed by GitHub
Browse files

Merge pull request #154 from AgoinsUSGS/Goins_Adam_M05361

Added TargetBodyRadii to Control Network headers. Fixes #5361.
parents 5d216f70 4ef2222a
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -237,14 +237,24 @@ namespace Isis {
   *                           parent prematurely to be able to set the radii
   *                           in ControlPoint.
   * @history 2017-12-21 Jesse Mapel - Modified to use the ControlNetVersioner.
   *
   * @history 2018-04-05 Adam Goins - Added a check to the versionedReader targetRadii
   *                         group to set radii values to those ingested from the versioner
   *                         if they exist. Otherwise, we call SetTarget with the targetname.
   */
  void ControlNet::ReadControl(const QString &filename, Progress *progress) {

    FileName cnetFileName(filename);
    ControlNetVersioner versionedReader(cnetFileName, progress);

    if ( versionedReader.hasTargetRadii() ) {
      p_targetName = versionedReader.targetName();
      p_targetRadii.clear();
      foreach (Distance distance, versionedReader.targetRadii()) {
        p_targetRadii.push_back(distance);
      }
    }
    else {
      SetTarget( versionedReader.targetName() );
    }
    p_networkId   = versionedReader.netId();
    p_userName    = versionedReader.userName();
    p_created     = versionedReader.creationDate();
+5 −1
Original line number Diff line number Diff line
@@ -213,6 +213,10 @@ namespace Isis {
   *                           image. Previously, this had to be done throug the graph.
   *   @history 2018-01-26 Kristin Berry - Added pointAdded() function to eliminate redundant measure
   *                           adds to the control network.
   *   @history 2018-04-05 Adam Goins - Added a check to the versionedReader targetRadii
   *                           group to set radii values to those ingested from the versioner
   *                           if they exist. Otherwise, we call SetTarget with the targetname.
   *                           Fixes #5361.
   */
  class ControlNet : public QObject {
      Q_OBJECT
+1 −0
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ Object = ControlNetwork
  Created      = 2010-07-10T12:50:15
  LastModified = 2010-07-10T12:50:55
  Description  = "UnitTest of ControlNetwork"
  TargetRadii  = (3396190.0, 3396190.0, 3376200.0)
  Version      = 5

  Object = ControlPoint
+2 −2
Original line number Diff line number Diff line
@@ -10,5 +10,5 @@ message ControlNetFileHeaderV0005 {
  optional string description  = 5;
  optional string userName     = 6;
  optional int32  numPoints    = 7;
  repeated double targetRadii = 10;
}
+113 −35
Original line number Diff line number Diff line
@@ -63,6 +63,14 @@ namespace Isis {
    header.lastModified = net->GetLastModified();
    header.description = net->Description();
    header.userName = net->GetUserName();

    std::vector<Distance> netRadii = net->GetTargetRadii();
    if ( netRadii.size() >= 3 &&
         netRadii[0].isValid() &&
         netRadii[1].isValid() &&
         netRadii[2].isValid() ) {
           header.targetRadii = net->GetTargetRadii();
         }
    createHeader(header);
  }

@@ -158,6 +166,25 @@ namespace Isis {
  }


  /**
  * Returns true if the targetRadii in the header has values.
  *
  * @return @b boolean True if the targetRadii in the header is populated.
  */
  bool ControlNetVersioner::hasTargetRadii() const {
    return m_header.targetRadii.empty() ? false : true;
  }

  /**
  * Returns the targetRadii Distance vector located in the header.
  *
  * @return @b std::vector<Distance> A vector containing the target body radii.
  */
  std::vector<Distance> ControlNetVersioner::targetRadii() const {
    return m_header.targetRadii;
  }


  /**
   * Returns the number of points that have been read in or are ready to write out.
   *
@@ -202,24 +229,20 @@ namespace Isis {
    network += PvlKeyword("Created", m_header.created);
    network += PvlKeyword("LastModified", m_header.lastModified);
    network += PvlKeyword("Description", m_header.description);

    // Grab TargetRadii if they exist.
    if (!m_header.targetRadii.empty()) {
        PvlKeyword pvlRadii("TargetRadii");
        for (uint i = 0; i < m_header.targetRadii.size(); i++) {
          pvlRadii += toString(m_header.targetRadii[i].meters());
        }
        network += pvlRadii;
      }
    // optionally add username to output?

    // This is the Pvl version we're converting to
    network += PvlKeyword("Version", "5");

    //  Get Target Radii from naif kernel
    PvlGroup pvlRadii;
    QString target = (QString)network.findKeyword("TargetName",Pvl::Traverse);
    if ( target != "" ) {
      try {
        NaifStatus::CheckErrors();
        pvlRadii = Target::radiiGroup(target);
      }
      catch (IException) {
        // leave pvlRadii empty if target is not recognized by NAIF
      }
    }

    foreach (ControlPoint *controlPoint, m_points) {
      PvlObject pvlPoint("ControlPoint");

@@ -341,11 +364,11 @@ namespace Isis {
          matrix += toString(aprioriCovarianceMatrix(1, 2));
          matrix += toString(aprioriCovarianceMatrix(2, 2));

          if ( pvlRadii.hasKeyword("EquatorialRadius") && pvlRadii.hasKeyword("PolarRadius") ) {
          if ( !m_header.targetRadii.empty() ) {

            aprioriSurfacePoint.SetRadii( Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
                                          Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
                                          Distance(pvlRadii["PolarRadius"], Distance::Meters) );
            aprioriSurfacePoint.SetRadii( m_header.targetRadii[0],
                                          m_header.targetRadii[1],
                                          m_header.targetRadii[2] );

            if ( aprioriSurfacePoint.GetLatSigmaDistance().meters() != Isis::Null
                 && aprioriSurfacePoint.GetLonSigmaDistance().meters() != Isis::Null
@@ -424,11 +447,11 @@ namespace Isis {
          matrix += toString(adjustedCovarianceMatrix(1, 2));
          matrix += toString(adjustedCovarianceMatrix(2, 2));

          if ( pvlRadii.hasKeyword("EquatorialRadius") && pvlRadii.hasKeyword("PolarRadius") ) {
          if ( !m_header.targetRadii.empty() ) {

            adjustedSurfacePoint.SetRadii(Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
                                          Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
                                          Distance(pvlRadii["PolarRadius"], Distance::Meters) );
            adjustedSurfacePoint.SetRadii( m_header.targetRadii[0],
                                           m_header.targetRadii[1],
                                           m_header.targetRadii[2] );

            if ( adjustedSurfacePoint.GetLatSigmaDistance().meters() != Isis::Null
                 && adjustedSurfacePoint.GetLonSigmaDistance().meters() != Isis::Null
@@ -716,6 +739,7 @@ namespace Isis {
      try {
        PvlObject pointObject = network.object(objectIndex);
        ControlPointV0002 point(pointObject);

        m_points.append( createPoint(point) );

        if (progress) {
@@ -847,6 +871,16 @@ namespace Isis {
      header.lastModified = network.findKeyword("LastModified")[0];
      header.description = network.findKeyword("Description")[0];
      header.userName = network.findKeyword("UserName")[0];
      if (network.hasKeyword("TargetRadii")) {
        header.targetRadii.clear();
        for (int i = 0; i < network.findKeyword("TargetRadii").size(); i++) {
          Distance distance = Distance(toDouble(network.findKeyword("TargetRadii")[i]),
                                           Distance::Meters);
          if ( distance.isValid() ) {
            header.targetRadii.push_back(distance);
          }
        }
      }
      createHeader(header);
    }
    catch (IException &e) {
@@ -1170,6 +1204,7 @@ namespace Isis {
  void ControlNetVersioner::readProtobufV0005(const Pvl &header,
                                              const FileName netFile,
                                              Progress *progress) {

    // read the header protobuf object
    const PvlObject &protoBufferInfo = header.findObject("ProtoBuffer");
    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
@@ -1228,6 +1263,15 @@ namespace Isis {
      header.lastModified = protoHeader.lastmodified().c_str();
      header.description = protoHeader.description().c_str();
      header.userName = protoHeader.username().c_str();
      if ( protoHeader.targetradii_size() >= 3 ) {
        header.targetRadii.clear();
        for (int i = 0; i < protoHeader.targetradii_size(); i++) {
          Distance distance = Distance(protoHeader.targetradii(i), Distance::Meters);
          if ( distance.isValid() ) {
            header.targetRadii.push_back(distance);
          }
        }
      }
      createHeader(header);
    }
    catch (IException &e) {
@@ -1357,6 +1401,7 @@ namespace Isis {
   * @return @b ControlPoint* The ControlPoint constructed from the given point.
   */
  ControlPoint *ControlNetVersioner::createPoint(ControlPointV0003 &point) {

    ControlPointFileEntryV0002 protoPoint = point.pointData();
    ControlPoint *controlPoint = new ControlPoint;

@@ -1521,16 +1566,19 @@ namespace Isis {

      controlPoint->SetAdjustedSurfacePoint(adjustedSurfacePoint);
    }
    if (  !m_header.targetRadii.empty() &&
          m_header.targetRadii[0].isValid() &&
          m_header.targetRadii[1].isValid() &&
          m_header.targetRadii[2].isValid() ) {

    if ( m_header.equatorialRadius.isValid() && m_header.polarRadius.isValid() ) {
      SurfacePoint aprioriSurfacePoint = controlPoint->GetAprioriSurfacePoint();
      SurfacePoint adjustedSurfacePoint = controlPoint->GetAdjustedSurfacePoint();
      aprioriSurfacePoint.SetRadii(m_header.equatorialRadius,
                                   m_header.equatorialRadius,
                                   m_header.polarRadius);
      adjustedSurfacePoint.SetRadii(m_header.equatorialRadius,
                                    m_header.equatorialRadius,
                                    m_header.polarRadius);
      aprioriSurfacePoint.SetRadii(m_header.targetRadii[0],
                                   m_header.targetRadii[1],
                                   m_header.targetRadii[2]);
      adjustedSurfacePoint.SetRadii(m_header.targetRadii[0],
                                    m_header.targetRadii[1],
                                    m_header.targetRadii[2]);
      controlPoint->SetAdjustedSurfacePoint(adjustedSurfacePoint);
      controlPoint->SetAprioriSurfacePoint(aprioriSurfacePoint);
    }
@@ -1670,12 +1718,22 @@ namespace Isis {
      m_header.targetName = "Mars";
    }

    if ( !m_header.targetName.isEmpty() ) {
    if ( m_header.targetRadii.empty() ) {
      try {
          // attempt to get target radii values...
          // The target body raii values are read from the PvlV0005 and BinaryV0005
          // Networks. In the event these values weren't read (from an older network)
          // then we must grab them from the Target::radii group.
          if ( !m_header.targetName.isEmpty() ) {

            PvlGroup pvlRadii = Target::radiiGroup(m_header.targetName);
        m_header.equatorialRadius.setMeters(pvlRadii["EquatorialRadius"]);
        m_header.polarRadius.setMeters(pvlRadii["PolarRadius"]);
            m_header.targetRadii.push_back(Distance(pvlRadii["EquatorialRadius"],
                                             Distance::Meters));
            m_header.targetRadii.push_back(Distance(pvlRadii["EquatorialRadius"],
                                             Distance::Meters));
            m_header.targetRadii.push_back(Distance(pvlRadii["PolarRadius"],
                                             Distance::Meters));
          }
       }
       catch (IException &e) {
         // do nothing
@@ -1725,6 +1783,12 @@ namespace Isis {
      protobufHeader.set_description(m_header.description.toLatin1().data());
      protobufHeader.set_username(m_header.userName.toLatin1().data());

      if ( !m_header.targetRadii.empty() ) {
        for (uint i = 0; i < m_header.targetRadii.size(); i++) {
          protobufHeader.add_targetradii(m_header.targetRadii[i].meters());
        }
      }

      streampos coreHeaderSize = protobufHeader.ByteSize();

      Pvl p;
@@ -1748,12 +1812,20 @@ namespace Isis {
      netInfo.addComment("This group is for informational purposes only");
      netInfo += PvlKeyword("NetworkId", protobufHeader.networkid().c_str());
      netInfo += PvlKeyword("TargetName", protobufHeader.targetname().c_str());

          // Grab TargetRadii if they exist.
          if (!m_header.targetRadii.empty()) {
              PvlKeyword pvlRadii("TargetRadii");
              for (uint i = 0; i < m_header.targetRadii.size(); i++) {
                pvlRadii += toString(m_header.targetRadii[i].meters());
              }
              netInfo += pvlRadii;
            }
      netInfo += PvlKeyword("UserName", protobufHeader.username().c_str());
      netInfo += PvlKeyword("Created", protobufHeader.created().c_str());
      netInfo += PvlKeyword("LastModified", protobufHeader.lastmodified().c_str());
      netInfo += PvlKeyword("Description", protobufHeader.description().c_str());
      netInfo += PvlKeyword("NumberOfPoints", toString(numPoints));

      netInfo += PvlKeyword("NumberOfMeasures", toString(numMeasures));
      netInfo += PvlKeyword("Version", "5");
      protoObj.addGroup(netInfo);
@@ -1789,6 +1861,12 @@ namespace Isis {
    protobufHeader.set_description(m_header.description.toLatin1().data());
    protobufHeader.set_username(m_header.userName.toLatin1().data());

    if ( !m_header.targetRadii.empty() ) {
      for (uint i = 0; i < m_header.targetRadii.size(); i++) {
        protobufHeader.add_targetradii(m_header.targetRadii[i].meters());
      }
    }

    // Write out the header
    if ( !protobufHeader.SerializeToOstream(output) ) {
      QString msg = "Failed to write output control network file.";
Loading