Skip to content

Commit

Permalink
Updated explode application gtest to use DefaultCube fixture instead …
Browse files Browse the repository at this point in the history
…of cube in isis/tests/data. Addresses DOI-USGS#5557.
  • Loading branch information
kledmundson committed Aug 15, 2024
1 parent ab5ed1d commit 5517dcd
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 0 deletions.
97 changes: 97 additions & 0 deletions isis/src/base/apps/explode/explode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/** 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 "explode.h"

#include "ProcessByLine.h"
#include "IException.h"
#include "FileName.h"

namespace Isis {

// Line processing routine
void CopyBand(Buffer &in, Buffer &out);

/**
* Extracts each band of the input cube into a separate one band cube file.
* Given the output base name of "base", each output cube will be named
* e.g. base.band#.cub. The appropiate BandBin group will be created.
*
* @param ui User Interface with application parameters
*/
void explode(UserInterface &ui) {

// open input cube
Cube icube;
icube.open(ui.GetCubeName("FROM"));

explode(&icube, ui);
}


/**
* Extracts each band of the input cube into a separate one band cube file.
* Given the output base name of "base", each output cube will be named
* e.g. base.band#.cub. The appropiate BandBin group will be created.
*
* @param ui User Interface with application parameters
* @param icube Input cube
*/
void explode(Cube *icube, UserInterface &ui) {

Process p;
p.SetInputCube(icube);
int samps = icube->sampleCount();
int lines = icube->lineCount();
int bands = icube->bandCount();
QString infile = icube->fileName();

// We get the output filename so we can add attributes and extensions
QString outbase = ui.GetCubeName("TO");
CubeAttributeOutput &outatt = ui.GetOutputAttribute("TO");

// Loop and extract each band
for(int band = 1; band <= bands; band++) {
int pband = icube->physicalBand(band);
QString sband(toString(pband));

ProcessByLine p2;
Progress *prog = p2.Progress();
prog->SetText("Exploding band " + sband);

CubeAttributeInput inatt("+" + sband);
p2.SetInputCube(infile, inatt);

QString outfile = outbase + ".band";
if(pband / 1000 == 0) {
outfile += "0";
if(pband / 100 == 0) {
outfile += "0";
if(pband / 10 == 0) {
outfile += "0";
}
}
}
outfile += sband + ".cub";
p2.SetOutputCube(outfile, outatt, samps, lines, 1);

p2.StartProcess(CopyBand);
p2.EndProcess();
}

// Cleanup
p.EndProcess();
}

// Line processing routine
void CopyBand(Buffer &in, Buffer &out) {
for(int i = 0; i < in.size(); i++) {
out[i] = in[i];
}
}
}
19 changes: 19 additions & 0 deletions isis/src/base/apps/explode/explode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/** 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 */

#ifndef explode_h
#define explode_h

#include "UserInterface.h"

namespace Isis{
extern void explode(UserInterface &ui);
extern void explode(Cube *icube, UserInterface &ui);
}

#endif
85 changes: 85 additions & 0 deletions isis/tests/FunctionalTestsExplode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#include "explode.h"

#include <QFileInfo>
#include <QString>
//#include <QTextStream>

#include "CameraFixtures.h"
#include "Cube.h"
#include "Histogram.h"
//#include "LineManager.h"
//#include "Pvl.h"
//#include "PvlGroup.h"
//#include "TestUtilities.h"

#include "gtest/gtest.h"

using namespace Isis;

static QString APP_XML = FileName("$ISISROOT/bin/xml/explode.xml").expanded();

/**
* ExplodeDefault Test
*
* ExplodeDefault test given a single 5x5 input cube with 2 bands.
*
* The output cube is verified by checking the histogram statistics
* for each band.
*
* INPUT: testCube from DefaultCube fixture resized to 5x5x1
*
* OUTPUT: 1) explodeOut.band0001.cub
* 2) explodeOut.band0002.cub
*/
TEST_F(DefaultCube, FunctionalTestExplodeDefault) {

// reduce test cube size and create two bands
resizeCube(5, 5, 2);

// close and reopen test cube to ensure dn buffer is available
testCube->reopen("r");

// run explode
QVector<QString> args = {"to=" + tempDir.path() + "/explodeOut"};
UserInterface ui(APP_XML, args);

try {
explode(testCube, ui);
}
catch(IException &e) {
FAIL() << e.toString().toStdString().c_str() << std::endl;
}

// validate band 1 output cube
Cube outCube1(tempDir.path() + "/explodeOut.band0001.cub");

ASSERT_EQ(outCube1.sampleCount(), 5);
ASSERT_EQ(outCube1.lineCount(), 5);
ASSERT_EQ(outCube1.bandCount(), 1);

std::unique_ptr<Histogram> inCubeBand1Hist (testCube->histogram(1));
std::unique_ptr<Histogram> outCube1Hist (outCube1.histogram(1));

EXPECT_NEAR(outCube1Hist->Average(), inCubeBand1Hist->Average(), .000001);
EXPECT_NEAR(outCube1Hist->Sum(), inCubeBand1Hist->Sum(), .000001);
EXPECT_EQ(outCube1Hist->ValidPixels(), inCubeBand1Hist->ValidPixels());
EXPECT_EQ(outCube1Hist->TotalPixels(), inCubeBand1Hist->TotalPixels());
EXPECT_NEAR(outCube1Hist->StandardDeviation(), inCubeBand1Hist->StandardDeviation(), .000001);

// validate band 2 output cube
Cube outCube2(tempDir.path() + "/explodeOut.band0002.cub");

ASSERT_EQ(outCube2.sampleCount(), 5);
ASSERT_EQ(outCube2.lineCount(), 5);
ASSERT_EQ(outCube2.bandCount(), 1);

std::unique_ptr<Histogram> inCubeBand2Hist (testCube->histogram(2));
std::unique_ptr<Histogram> outCube2Hist (outCube2.histogram(1));

EXPECT_NEAR(outCube2Hist->Average(), inCubeBand2Hist->Average(), .000001);
EXPECT_NEAR(outCube2Hist->Sum(), inCubeBand2Hist->Sum(), .000001);
EXPECT_EQ(outCube2Hist->ValidPixels(), inCubeBand2Hist->ValidPixels());
EXPECT_EQ(outCube2Hist->TotalPixels(), inCubeBand2Hist->TotalPixels());
EXPECT_NEAR(outCube2Hist->StandardDeviation(), inCubeBand2Hist->StandardDeviation(), .000001);
}

0 comments on commit 5517dcd

Please sign in to comment.