Unverified Commit 3a6ba5fa authored by acpaquette's avatar acpaquette Committed by GitHub
Browse files

Tgo mapProjectReingest Test Conversion (#4890)

* Initial conversion for MapProjectedReingest test

* Initial kernel extraction through ales KernelSlice notenook

* Added ALE style kernel generation for module test

* Updates tgo cassis module test to use a gtest suite fixture

* Fixed old copy-pasted name
parent 23347032
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -1693,4 +1693,41 @@ namespace Isis {
      testCube = new Cube(testPath, "rw");
    }
  }

  void tgoCassisKernels::SetUpTestSuite() {
    QVector<QString> ckKernels = {QString("data/tgoCassis/mapProjectedReingested/em16_tgo_cassis_tel_20160407_20221231_s20220316_v01_0_sliced_-143410.xc"),
                                  QString("data/tgoCassis/mapProjectedReingested/em16_tgo_cassis_tel_20160407_20221231_s20220316_v01_1_sliced_-143410.xc"),
                                  QString("data/tgoCassis/mapProjectedReingested/em16_tgo_sc_ssm_20180501_20180601_s20180321_v01_0_sliced_-143000.xc"),
                                  QString("data/tgoCassis/mapProjectedReingested/em16_tgo_sc_ssm_20180501_20180601_s20180321_v01_1_sliced_-143000.xc")};
    QVector<QString> spkKernels = {QString("data/tgoCassis/mapProjectedReingested/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1_0.xsp"),
                                   QString("data/tgoCassis/mapProjectedReingested/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1_1.xsp")};

    // variables defined in TgoCassisModuleTests
    if (binaryCkKernels.size() == 0) {
      binaryCkKernels = generateBinaryKernels(ckKernels);
      binarySpkKernels = generateBinaryKernels(spkKernels);

      binaryCkKernelsAsString = fileListToString(binaryCkKernels);
      binarySpkKernelsAsString = fileListToString(binarySpkKernels);
    }
  }

  void tgoCassisKernels::TearDownTestSuite() {
    for (QString kernel : binaryCkKernels) {
      if( remove( kernel.toStdString().c_str() ) != 0 ) {
        perror( "Error deleting file" );
      }
    }

    for (QString kernel : binarySpkKernels) {
      if( remove( kernel.toStdString().c_str() ) != 0 ) {
        perror( "Error deleting file" );
      }
    }

    binaryCkKernels = {};
    binarySpkKernels = {};
    binaryCkKernelsAsString = "";
    binarySpkKernelsAsString = "";
  }
}
+12 −0
Original line number Diff line number Diff line
@@ -395,6 +395,18 @@ class ClipperPbCube : public TempTestingFiles {
    void setInstrument(QString instrumentId);
};

class tgoCassisKernels : public ::testing::Test {
  protected:
    static void SetUpTestSuite();
    static void TearDownTestSuite();

    static QVector<QString> binaryCkKernels;
    static QVector<QString> binarySpkKernels;

    static QString binaryCkKernelsAsString;
    static QString binarySpkKernelsAsString;
};

}

#endif
+43 −0
Original line number Diff line number Diff line
@@ -250,4 +250,47 @@ namespace Isis {
        ::testing::Field(&csm::EcefCoord::z, ::testing::DoubleNear(expected.z, 0.0001))
    );
  }

  // Writes binary kernels to the data area. Unsure of the best way to handle
  // clean up. Didn't want to dive into the rabbit hole of C++ alternatives
  // to python yeild statements
  QVector<QString> generateBinaryKernels(QVector<QString> kernelList) {
    QVector<QString> binaryKernelList;

    for (QString kernel : kernelList) {
      FileName file(kernel);
      QString pathToBinaryKernel = file.path() + "/" + file.baseName() + "." + file.extension().replace('x', 'b');
      FileName binaryFile(pathToBinaryKernel);

      if (file.extension().contains("x") && !binaryFile.fileExists()) {
        QString path = file.expanded();
        QString command = "tobin " + path;
        int status = system(command.toLatin1().data());

        if (status != 0) {
          QString msg = "Executing command [" + command +
                        "] failed with return status [" + toString(status) + "]";
          throw IException(IException::Programmer, msg, _FILEINFO_);
        }
      }
      binaryKernelList.append(pathToBinaryKernel);
    }
    return binaryKernelList;
  }

  QString fileListToString(QVector<QString> fileList) {
    QString filesAsString("(");

    for (size_t i = 0; i < fileList.size(); i++) {
      FileName file(fileList[i]);

      filesAsString += file.expanded();
      if (i != fileList.size() - 1) {
        filesAsString += ", ";
      }
    }
    filesAsString += ")";
    return filesAsString;
  }

}
+5 −1
Original line number Diff line number Diff line
@@ -7,12 +7,13 @@
#include <vector>

#include <QString>
#include <QVector>

#include "csm.h"

#include "FileName.h"
#include "IException.h"
#include "PvlGroup.h"

#include "Pvl.h"
#include "PvlObject.h"

@@ -65,6 +66,9 @@ namespace Isis {

  ::testing::Matcher<const csm::ImageCoord&> MatchImageCoord(const csm::ImageCoord &expected);
  ::testing::Matcher<const csm::EcefCoord&> MatchEcefCoord(const csm::EcefCoord &expected);

  QVector<QString> generateBinaryKernels(QVector<QString> kernelList);
  QString fileListToString(QVector<QString> fileList);
}

#endif
+146 −0
Original line number Diff line number Diff line
@@ -30,6 +30,12 @@ static QString MOSRANGE_XML = FileName("$ISISROOT/bin/xml/mosrange.xml").expande
static QString CAM2MAP_XML = FileName("$ISISROOT/bin/xml/cam2map.xml").expanded();
static QString CUBEIT_XML = FileName("$ISISROOT/bin/xml/cubeit.xml").expanded();

QVector<QString> tgoCassisKernels::binaryCkKernels = {};
QVector<QString> tgoCassisKernels::binarySpkKernels = {};

QString tgoCassisKernels::binaryCkKernelsAsString = "";
QString tgoCassisKernels::binarySpkKernelsAsString = "";

TEST(TgoCassisModuleTests, TgoCassisStitchUnstitch) {
  QTemporaryDir prefix;

@@ -1571,7 +1577,147 @@ TEST(TgoCassisModuleTests, TgoCassisColorMosaic) {
  EXPECT_NEAR(hist->Sum(), 183.71230971813202, 0.0001);
  EXPECT_EQ(hist->ValidPixels(), 614);
  EXPECT_NEAR(hist->StandardDeviation(), 0.0054483425167489693, 0.0001);
}


TEST_F(tgoCassisKernels, TgoCassisMapProjectedReingested) {
  QTemporaryDir prefix;

  // run tgocassis2isis on red framelet.
  QString outputCubeName = prefix.path() + "CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.cub";
  QString digestedFile = prefix.path() + "/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.equi.img";
  QVector<QString> tgocassis2isisArgs = {
                        "from=data/tgoCassis/mapProjectedReingested/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.xml",
                        "to=" + outputCubeName};
  UserInterface tgocassis2isisUi(TGOCASSIS2ISIS_XML, tgocassis2isisArgs);
  try {
    tgocassis2isis(tgocassis2isisUi);
  }
  catch (IException &e) {
    FAIL() << "Unable to run tgocassis2isis on image: " << e.what() << std::endl;
  }

  // run spiceinit on framelet.
  QVector<QString> spiceinitArgs = {"from=" + outputCubeName,
                                    "ck=" + binaryCkKernelsAsString,
                                    "spk=" + binarySpkKernelsAsString};
  UserInterface spiceinitUi(SPICEINIT_XML, spiceinitArgs);
  try {
    spiceinit(spiceinitUi);
  }
  catch (IException &e) {
    FAIL() << "Unable to run spiceinit on image: " << e.what() << std::endl;
  }

  // run cam2map on pan cube
  QString projCubeName = prefix.path() + "/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.equi.cub";
  QString mapFile = "data/tgoCassis/mapProjectedReingested/equi.map";
  QVector<QString> cam2mapArgs = {"from=" + outputCubeName,
                                  "to=" + projCubeName,
                                  "map=" + mapFile,
                                  "pixres=mpp",
                                  "resolution=200"};
  UserInterface cam2mapUi(CAM2MAP_XML, cam2mapArgs);
  try {
    cam2map(cam2mapUi);
  }
  catch (IException &e) {
    FAIL() << "Unable to run cam2map on image: " << e.what() << std::endl;
  }

  // run tgocassisrdrgen on image.
  QVector<QString> rdrgenArgs = {"from=" + projCubeName,  "to=" + digestedFile};
  UserInterface rdrgenUi(RDRGEN_XML, rdrgenArgs);
  try {
    tgocassisrdrgen(rdrgenUi);
  }
  catch (IException &e) {
    FAIL() << "Unable to run tgocassisrdrgen on image: " << e.what() << std::endl;
  }

  // run tgocassis2isis on digested red framelet.
  QString digestedXML = prefix.path() + "/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.equi.xml";
  QString reingestedFile = prefix.path() + "/CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.equi.reingested.cub";
  tgocassis2isisArgs = {"from=" + digestedXML, "to=" + reingestedFile};
  UserInterface tgocassis2isisReingest(TGOCASSIS2ISIS_XML, tgocassis2isisArgs);
  try {
    tgocassis2isis(tgocassis2isisReingest);
  }
  catch (IException &e) {
    FAIL() << "Unable to run tgocassis2isis on red image: " << e.what() << std::endl;
  }

  // RED Cube
  Cube reingestCube(reingestedFile);
  Pvl *reingestLabel = reingestCube.label();

  // Instrument Group
  std::istringstream iss(R"(
    Group = Instrument
      SpacecraftName   = "TRACE GAS ORBITER"
      InstrumentId     = CaSSIS
      Expanded         = 1
      TargetName       = Mars
      StartTime        = 2018-05-05T23:11:48.767
      ExposureDuration = 1.488e-003 <seconds>
      Filter           = RED
      Expanded         = 1
      SummingMode      = 0
    End_Group
  )");

  PvlGroup truthInstGroup;
  iss >> truthInstGroup;
  PvlGroup &instGroup = reingestLabel->findGroup("Instrument", Pvl::Traverse);

  EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, instGroup, truthInstGroup);

  // Archive Group
  std::istringstream arss(R"(
    Group = Archive
      ObservationId    = MY34_002002_211_2
      DataSetId        = urn:esa:psa:em16_tgo_cas:data_projected:my34_002002_211_2
      ProductVersionId = 1.0
      FileName         = CAS-M01-2018-05-05T23.11.48.767-RED-01029-B1.equi.img
      ScalingFactor    = 1.0
      YearDoy          = 2018125
    End_Group
  )");

  PvlGroup truthArchiveGroup;
  arss >> truthArchiveGroup;

  PvlGroup &archiveGroup = reingestLabel->findGroup("Archive", Pvl::Traverse);

  EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, archiveGroup, truthArchiveGroup);

  // BandBin Group
  std::istringstream bbss(R"(
    Group = BandBin
      FilterName = RED
      Center     = 840 <nm>
      Width      = 100 <nm>
      NaifIkCode = -143422
    End_Group
  )");

  PvlGroup truthBandBinGroup;
  bbss >> truthBandBinGroup;

  PvlGroup &bandBinGroup = reingestLabel->findGroup("BandBin", Pvl::Traverse);

  EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, bandBinGroup, truthBandBinGroup);

  // Kernels Group
  PvlGroup &kernels = reingestLabel->findGroup("Kernels", Pvl::Traverse);
  EXPECT_EQ(int(kernels["NaifFrameCode"]), -143400);

  Histogram *hist = reingestCube.histogram();

  EXPECT_NEAR(hist->Average(), 0.11603580358533563, 0.0001);
  EXPECT_NEAR(hist->Sum(), 26.108894683420658, 0.0001);
  EXPECT_EQ(hist->ValidPixels(), 225);
  EXPECT_NEAR(hist->StandardDeviation(), 0.0031002995166270952, 0.0001);
}


Loading