Unverified Commit d15caf3d authored by Amy Stamile's avatar Amy Stamile Committed by GitHub
Browse files

Clipper Push Broom camera model and tests. (#4564)

* Clipper Push Broom camera model and tests.

* Added detector map and added fixture.

* Wac implemented in pushbroom camera + test.

* Added new test cube to push broom fixture. Addressed PR feedback.

* minor correction.

* Reverted LineScanCameraGroundMap changes.

* Modified fixture for Nac/Wac cubes. Updated ik codes per PR comment.
parent ce631c5d
Loading
Loading
Loading
Loading
+42 −43
Original line number Diff line number Diff line
@@ -616,4 +616,3 @@ namespace Isis {
bool ptXLessThan(const QList<double> l1, const QList<double> l2) {
  return l1[0] < l2[0];
}
+11 −0
Original line number Diff line number Diff line
Group = Clipper/EIS-NAC-PB
  Version = 1
  Library = ClipperPushBroomCamera
  Routine = ClipperPushBroomCameraPlugin
EndGroup

Group = Clipper/EIS-WAC-PB
  Version = 1
  Library = ClipperPushBroomCamera
  Routine = ClipperPushBroomCameraPlugin
EndGroup
+132 −0
Original line number Diff line number Diff line
/** This is free and unencumbered software released into the public domain.

The authors of ISIS do not claim copyright on the contents of this file.
For more details about the LICENSE terms and the AUTHORS, you will
find files of those names at the top level of this repository. **/

/* SPDX-License-Identifier: CC0-1.0 */

#include "ClipperPushBroomCamera.h"

#include "CameraDistortionMap.h"
#include "CameraFocalPlaneMap.h"
#include "iTime.h"
#include "LineScanCameraGroundMap.h"
#include "LineScanCameraSkyMap.h"
#include "NaifStatus.h"
#include "LineScanCameraDetectorMap.h"

namespace Isis {
  /**
   * Constructs a ClipperPushBroomCamera object using the image labels.
   *
   * @param Cube &cube Clipper EIS image.
   */
   ClipperPushBroomCamera::ClipperPushBroomCamera(Cube &cube) : LineScanCamera(cube) {

     m_spacecraftNameLong = "Europa Clipper";
     m_spacecraftNameShort = "Clipper";

     int frameCode = naifIkCode();

     if (frameCode == -159103) {
       m_instrumentNameLong  = "Europa Imaging System Push Broom Narrow Angle Camera";
       m_instrumentNameShort = "EIS-PBNAC";
     }
     else if (frameCode == -159104) {
       m_instrumentNameLong  = "Europa Imaging System Push Broom Wide Angle Camera";
       m_instrumentNameShort = "EIS-PBWAC";
     }
     else {
       QString msg = "Unable to construct Clipper Push Broom camera model. "
                     "Unrecognized NaifFrameCode [" + toString(frameCode) + "].";
       throw IException(IException::User, msg, _FILEINFO_);
     }

     NaifStatus::CheckErrors();

     SetFocalLength();
     SetPixelPitch();

     Pvl &lab = *cube.label();
     PvlGroup &inst = lab.findGroup("Instrument", Pvl::Traverse);
     double lineRate = ((double) inst["LineExposureDuration"]) / 1000;
     QString startTime = inst["StartTime"];
     iTime etStart(startTime);

     // set up detector map
     new LineScanCameraDetectorMap(this, etStart.Et(), lineRate);

     // Set up focal plane map
     CameraFocalPlaneMap *focalMap = new CameraFocalPlaneMap(this, naifIkCode());
     if (m_instrumentNameShort == "EIS-PBNAC") {
       focalMap->SetDetectorOrigin(2048.5, 1024.5);
     }
     else {
       focalMap->SetDetectorOrigin(2092.5, 1112.5);
     }

     // Set up distortion map
     new CameraDistortionMap(this);
     // TODO: set distortion

     // Set up the ground and sky map
     new LineScanCameraGroundMap(this);
     new LineScanCameraSkyMap(this);

     LoadCache();
     NaifStatus::CheckErrors();
   }


   /**
    * Destructor for a ClipperPushBroomCamera object.
    */
   ClipperPushBroomCamera::~ClipperPushBroomCamera() {
   }


   /**
    * CK frame ID - Instrument Code from spacit run on CK
    *
    * @return @b int The appropriate instrument code for the "Camera-matrix"
    *         Kernel Frame ID
    */
   int ClipperPushBroomCamera::CkFrameId() const {
     return (-159000);
   }


   /**
    * CK Reference ID - J2000
    *
    * @return @b int The appropriate instrument code for the "Camera-matrix"
    *         Kernel Reference ID
    */
   int ClipperPushBroomCamera::CkReferenceId() const {
     return (1);
   }


   /**
    * SPK Reference ID - J2000
    *
    * @return @b int The appropriate instrument code for the Spacecraft
    *         Kernel Reference ID
    */
   int ClipperPushBroomCamera::SpkReferenceId() const {
     return (1);
   }
}

/**
 * This is the function that is called in order to instantiate an ClipperPushBroomCamera
 * object.
 *
 * @param Isis::Cube &cube Clipper EIS image.
 *
 * @return Isis::Camera* ClipperPushBroomCamera
 */
extern "C" Isis::Camera *ClipperPushBroomCameraPlugin(Isis::Cube &cube) {
  return new Isis::ClipperPushBroomCamera(cube);
}
+34 −0
Original line number Diff line number Diff line
#ifndef ClipperPushBroomCamera_h
#define ClipperPushBroomCamera_h

/** This is free and unencumbered software released into the public domain.
The authors of ISIS do not claim copyright on the contents of this file.
For more details about the LICENSE terms and the AUTHORS, you will
find files of those names at the top level of this repository. **/

/* SPDX-License-Identifier: CC0-1.0 */

#include "LineScanCamera.h"

#include <QString>

#include "VariableLineScanCameraDetectorMap.h"

namespace Isis {
  /**
   * This is the camera model for the Europa Clipper Push Broom Camera
   *
   */
  class ClipperPushBroomCamera : public LineScanCamera {
    public:
      ClipperPushBroomCamera(Cube &cube);

      ~ClipperPushBroomCamera();

      virtual int CkFrameId() const;
      virtual int CkReferenceId() const;
      virtual int SpkReferenceId() const;
  };
};

#endif
+101 −0
Original line number Diff line number Diff line
#include "ClipperPushBroomCamera.h"
#include "Fixtures.h"
#include "TestUtilities.h"

#include <gtest/gtest.h>

using namespace Isis;

TEST_F(ClipperPbCube, ClipperPushBroomCameraNacTest) {
  setInstrument("EIS-NAC-PB");

  ClipperPushBroomCamera *cam = (ClipperPushBroomCamera *)testCube->camera();

  EXPECT_EQ(cam->CkFrameId(), -159000);
  EXPECT_EQ(cam->CkReferenceId(), 1);
  EXPECT_EQ(cam->SpkTargetId(), -159);
  EXPECT_EQ(cam->SpkReferenceId(), 1);

  EXPECT_NEAR(cam->FocalLength(), 150.402, 0.0001);

  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->spacecraftNameLong(), "Europa Clipper");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->spacecraftNameShort(), "Clipper");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentNameLong(), "Europa Imaging System Push Broom Narrow Angle Camera");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentNameShort(), "EIS-PBNAC");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentId(), "EIS-NAC-PB");

  EXPECT_TRUE(cam->SetImage(1, 1));
  EXPECT_NEAR(cam->UniversalLatitude(), 1.2968475577607894, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 80.39050360283612, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1, 0.0001);
  EXPECT_NEAR(cam->Line(), 1, 0.05);

  EXPECT_TRUE(cam->SetImage(1, 1056));
  EXPECT_NEAR(cam->UniversalLatitude(), 1.2907489089492752, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 80.37388357344733, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1, 0.0001);
  EXPECT_NEAR(cam->Line(), 1056, 0.05);

  EXPECT_TRUE(cam->SetImage(1204, 1056));
  EXPECT_NEAR(cam->UniversalLatitude(), -9.5034882814574857, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 76.218290471624172, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1204, 0.0001);
  EXPECT_NEAR(cam->Line(), 1056, 0.05);

  EXPECT_TRUE(cam->SetImage(1204, 1));
  EXPECT_NEAR(cam->UniversalLatitude(), -9.5037826167213435, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 76.232648851710138, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1204, 0.0001);
  EXPECT_NEAR(cam->Line(), 1, 0.05);
}

TEST_F(ClipperPbCube, ClipperPushBroomCameraWacTest) {
  setInstrument("EIS-WAC-PB");

  ClipperPushBroomCamera *cam = (ClipperPushBroomCamera *)testCube->camera();

  EXPECT_EQ(cam->CkFrameId(), -159000);
  EXPECT_EQ(cam->CkReferenceId(), 1);
  EXPECT_EQ(cam->SpkTargetId(), -159);
  EXPECT_EQ(cam->SpkReferenceId(), 1);

  EXPECT_NEAR(cam->FocalLength(), 150.402, 0.0001);

  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->spacecraftNameLong(), "Europa Clipper");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->spacecraftNameShort(), "Clipper");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentNameLong(), "Europa Imaging System Push Broom Wide Angle Camera");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentNameShort(), "EIS-PBWAC");
  EXPECT_PRED_FORMAT2(AssertQStringsEqual, cam->instrumentId(), "EIS-WAC-PB");

  EXPECT_TRUE(cam->SetImage(1, 1));
  EXPECT_NEAR(cam->UniversalLatitude(), 1.5088267433142744, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 81.378861952389798, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1, 0.0001);
  EXPECT_NEAR(cam->Line(), 1, 0.05);

  EXPECT_TRUE(cam->SetImage(1, 2048));
  EXPECT_NEAR(cam->UniversalLatitude(), 1.4965915498699245, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 81.345482351767558, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 1, 0.0001);
  EXPECT_NEAR(cam->Line(), 2048, 0.05);

  EXPECT_TRUE(cam->SetImage(4096, 2048));
  EXPECT_NEAR(cam->UniversalLatitude(), -34.782957391682949, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 68.590363919992924, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 4096, 0.0001);
  EXPECT_NEAR(cam->Line(), 2048, 0.05);

  EXPECT_TRUE(cam->SetImage(4096, 1));
  EXPECT_NEAR(cam->UniversalLatitude(), -34.782957391682949, 0.05);
  EXPECT_NEAR(cam->UniversalLongitude(), 68.590363919992924, 0.05);
  EXPECT_TRUE(cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude()));
  EXPECT_NEAR(cam->Sample(), 4096, 0.0001);
  EXPECT_NEAR(cam->Line(), 1, 0.05);
}
Loading