From 6e4535c513a7cbc5bbd0b57b744db004c3b5737e Mon Sep 17 00:00:00 2001 From: Kristin Date: Thu, 7 Jan 2021 15:38:21 -0700 Subject: [PATCH 1/4] Update cubeatt to add cubeattributeinput option. Also add tests for all function signatures available --- isis/src/base/apps/cubeatt/cubeatt.cpp | 10 ++++ isis/src/base/apps/cubeatt/cubeatt.h | 1 + isis/tests/FunctionalTestsCubeatt.cpp | 72 +++++++++++++++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/isis/src/base/apps/cubeatt/cubeatt.cpp b/isis/src/base/apps/cubeatt/cubeatt.cpp index 12a2414410..2412ade40c 100644 --- a/isis/src/base/apps/cubeatt/cubeatt.cpp +++ b/isis/src/base/apps/cubeatt/cubeatt.cpp @@ -44,6 +44,16 @@ namespace Isis { p.EndProcess(); } + // Allows specification of both input and output attributes + void cubeatt(QString inputCubePath, CubeAttributeInput inAtt, QString outputCubePath, CubeAttributeOutput outputAttributes, bool propTables) { + Cube icube; + if (inAtt.bands().size() != 0) { + icube.setVirtualBands(inAtt.bands()); + } + icube.open(inputCubePath); + cubeatt(&icube, outputCubePath, outputAttributes, propTables); + } + // Line processing routine void cubeattProcess(Buffer &in, Buffer &out) { // Loop and copy pixels in the line. diff --git a/isis/src/base/apps/cubeatt/cubeatt.h b/isis/src/base/apps/cubeatt/cubeatt.h index b853cedd7e..4e05b713f6 100644 --- a/isis/src/base/apps/cubeatt/cubeatt.h +++ b/isis/src/base/apps/cubeatt/cubeatt.h @@ -7,6 +7,7 @@ namespace Isis{ extern void cubeatt(Cube *icube, QString outputCubePath, CubeAttributeOutput outputAttributes, bool propTables=false); + extern void cubeatt(QString inputCubePath, CubeAttributeInput inputAttributes, QString outputCubePath, CubeAttributeOutput outputAttributes, bool propTables=false); extern void cubeatt(Cube *icube, UserInterface &ui); extern void cubeatt(UserInterface &ui); } diff --git a/isis/tests/FunctionalTestsCubeatt.cpp b/isis/tests/FunctionalTestsCubeatt.cpp index d7d598a16d..f1b989a42a 100644 --- a/isis/tests/FunctionalTestsCubeatt.cpp +++ b/isis/tests/FunctionalTestsCubeatt.cpp @@ -34,6 +34,7 @@ TEST_F(SmallCube, FunctionalTestCubeattBitttypeAndRange) { EXPECT_FLOAT_EQ(outputStats->Maximum(), 1.0); } + TEST_F(SmallCube, FunctionalTestCubeattNoChange) { QString cubePath = tempDir.path() + "/NoChangeCubeatt.cub"; QVector args = {"from=" + testCube->fileName(), "to=" + cubePath}; @@ -61,7 +62,6 @@ TEST_F(SmallCube, FunctionalTestCubeattNoChange) { } - TEST_F(SmallCube, FunctionalTestCubeattVirtualBands) { QString cubePath = tempDir.path() + "/VirtualBandsCubeatt.cub"; QVector args = {"from=" + testCube->fileName() + "+3,2,4,2,1,5,7,6,4", "to=" + cubePath}; @@ -98,3 +98,73 @@ TEST_F(SmallCube, FunctionalTestCubeattVirtualBands) { } +// Test using an already open cube as input and ui +TEST_F(SmallCube, FunctionalTestCubeattInputCube) { + QString outputCubePath = tempDir.path() + "/bitTypeCubeatt.cub+8bit+0.0:1.0"; + QVector args = {"from=" + testCube->fileName(), "to=" + outputCubePath}; + UserInterface options(APP_XML, args); + + cubeatt(testCube, options); + Cube outputCube(outputCubePath); + + // Check attributes: pixel type, storage format, label format, storage order, pixel range, bands + EXPECT_EQ(outputCube.pixelType(), PixelType::UnsignedByte); + // Setting the pixel range modifies the base/multiplier, so check those. + EXPECT_NE(outputCube.base(), 0); + EXPECT_NE(outputCube.multiplier(), 1); + + // Test the DNs + Statistics *outputStats = outputCube.statistics(); + EXPECT_FLOAT_EQ(outputStats->Minimum(), 0.0); + EXPECT_FLOAT_EQ(outputStats->Maximum(), 1.0); +} + + +// Test using an already open cube as input and specifying an output path and output attributes +TEST_F(SmallCube, FunctionalTestCubeattInputCubeOutputPath) { + QString outputCubePath = tempDir.path() + "/bitTypeCubeatt.cub"; + CubeAttributeOutput attributeOutput("+8bit+0.0:1.0"); + + cubeatt(testCube, outputCubePath, attributeOutput); + Cube outputCube(outputCubePath); + + // Check attributes: pixel type, storage format, label format, storage order, pixel range, bands + // Setting the pixel range modifies the base/multiplier, so check those. + EXPECT_NE(outputCube.base(), 0); + EXPECT_NE(outputCube.multiplier(), 1); + + // Test the DNs + Statistics *outputStats = outputCube.statistics(); + EXPECT_FLOAT_EQ(outputStats->Minimum(), 0.0); + EXPECT_FLOAT_EQ(outputStats->Maximum(), 1.0); +} + +// Test using the input/output paths and cube attribute input and output passed in directly +TEST_F(SmallCube, FunctionalTestCubeattInputAndOutputAttributes) { + QString inputCubePath = testCube->fileName(); + CubeAttributeInput attributeInput("+3,2,4"); + QString outputCubePath = tempDir.path() + "/bitTypeAndVirtualBandsCubeatt.cub"; + CubeAttributeOutput attributeOutput("+200:300"); + + cubeatt(inputCubePath, attributeInput, outputCubePath, attributeOutput); + + Cube outputCube(outputCubePath); + + Statistics *outputStats = outputCube.statistics(); + EXPECT_GE(outputStats->Minimum(), 200); + EXPECT_LE(outputStats->Maximum(), 300); + EXPECT_EQ(outputCube.bandCount(), 3); + + // Do need to check the label for this one, since outputCube.physicalBand() will not work + // in this context: + Pvl *label = outputCube.label(); + PvlGroup bandBin = label->findObject("IsisCube").findGroup("BandBin"); + EXPECT_EQ(QString(bandBin["OriginalBand"][0]), "3"); + EXPECT_EQ(QString(bandBin["OriginalBand"][1]), "2"); + EXPECT_EQ(QString(bandBin["OriginalBand"][2]), "4"); + + // Test that DNs for each band have moved appropriately + EXPECT_DOUBLE_EQ(outputCube.statistics(1)->Average(), testCube->statistics(3)->Average()); + EXPECT_DOUBLE_EQ(outputCube.statistics(2)->Average(), testCube->statistics(2)->Average()); + EXPECT_DOUBLE_EQ(outputCube.statistics(3)->Average(), testCube->statistics(4)->Average()); +} From 00e1c5b03b46f810def8c7c1b46acaff3cb96d7e Mon Sep 17 00:00:00 2001 From: Kristin Date: Thu, 7 Jan 2021 15:44:55 -0700 Subject: [PATCH 2/4] Remove unnecessary comments --- isis/tests/FunctionalTestsCubeatt.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/isis/tests/FunctionalTestsCubeatt.cpp b/isis/tests/FunctionalTestsCubeatt.cpp index f1b989a42a..8263454da3 100644 --- a/isis/tests/FunctionalTestsCubeatt.cpp +++ b/isis/tests/FunctionalTestsCubeatt.cpp @@ -107,7 +107,6 @@ TEST_F(SmallCube, FunctionalTestCubeattInputCube) { cubeatt(testCube, options); Cube outputCube(outputCubePath); - // Check attributes: pixel type, storage format, label format, storage order, pixel range, bands EXPECT_EQ(outputCube.pixelType(), PixelType::UnsignedByte); // Setting the pixel range modifies the base/multiplier, so check those. EXPECT_NE(outputCube.base(), 0); @@ -128,7 +127,6 @@ TEST_F(SmallCube, FunctionalTestCubeattInputCubeOutputPath) { cubeatt(testCube, outputCubePath, attributeOutput); Cube outputCube(outputCubePath); - // Check attributes: pixel type, storage format, label format, storage order, pixel range, bands // Setting the pixel range modifies the base/multiplier, so check those. EXPECT_NE(outputCube.base(), 0); EXPECT_NE(outputCube.multiplier(), 1); @@ -155,8 +153,6 @@ TEST_F(SmallCube, FunctionalTestCubeattInputAndOutputAttributes) { EXPECT_LE(outputStats->Maximum(), 300); EXPECT_EQ(outputCube.bandCount(), 3); - // Do need to check the label for this one, since outputCube.physicalBand() will not work - // in this context: Pvl *label = outputCube.label(); PvlGroup bandBin = label->findObject("IsisCube").findGroup("BandBin"); EXPECT_EQ(QString(bandBin["OriginalBand"][0]), "3"); From 4e414bdb60c9fbfb64f7d965525e023aa6636d9d Mon Sep 17 00:00:00 2001 From: Kristin Date: Fri, 8 Jan 2021 12:46:51 -0700 Subject: [PATCH 3/4] Update to use explicit array conversion. --- isis/src/base/objs/XmlToJson/XmlToJson.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/isis/src/base/objs/XmlToJson/XmlToJson.cpp b/isis/src/base/objs/XmlToJson/XmlToJson.cpp index 02b613ae48..26036ebe7f 100644 --- a/isis/src/base/objs/XmlToJson/XmlToJson.cpp +++ b/isis/src/base/objs/XmlToJson/XmlToJson.cpp @@ -155,7 +155,10 @@ namespace Isis { // Translated json goal: a:[val1, val2] // If the converted json has an array already, append, else make it an array if (!output[element.tagName().toStdString()].is_array()) { - output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; + json repeatedArray; + repeatedArray.push_back(output[element.tagName().toStdString()]); + output[element.tagName().toStdString()] = repeatedArray; +// output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; } output[element.tagName().toStdString()].push_back(converted[element.tagName().toStdString()]); } @@ -171,7 +174,10 @@ namespace Isis { json temporaryJson; convertXmlToJson(next, temporaryJson); if (!output[element.tagName().toStdString()].is_array()) { - output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; + json repeatedArray; + repeatedArray.push_back(output[element.tagName().toStdString()]); + output[element.tagName().toStdString()] = repeatedArray; +// output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; } output[element.tagName().toStdString()].push_back(temporaryJson); } From f35c78fa045de040ef1b41722e74237d8362a553 Mon Sep 17 00:00:00 2001 From: Kristin Date: Fri, 8 Jan 2021 13:30:26 -0700 Subject: [PATCH 4/4] Remove commented out code --- isis/src/base/objs/XmlToJson/XmlToJson.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/isis/src/base/objs/XmlToJson/XmlToJson.cpp b/isis/src/base/objs/XmlToJson/XmlToJson.cpp index 26036ebe7f..8fe8024f82 100644 --- a/isis/src/base/objs/XmlToJson/XmlToJson.cpp +++ b/isis/src/base/objs/XmlToJson/XmlToJson.cpp @@ -158,7 +158,6 @@ namespace Isis { json repeatedArray; repeatedArray.push_back(output[element.tagName().toStdString()]); output[element.tagName().toStdString()] = repeatedArray; -// output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; } output[element.tagName().toStdString()].push_back(converted[element.tagName().toStdString()]); } @@ -177,7 +176,6 @@ namespace Isis { json repeatedArray; repeatedArray.push_back(output[element.tagName().toStdString()]); output[element.tagName().toStdString()] = repeatedArray; -// output[element.tagName().toStdString()] = {output[element.tagName().toStdString()]}; } output[element.tagName().toStdString()].push_back(temporaryJson); }