From 5c8432b5139b4310b6c47aa96f6f41a075ebf9d2 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Fri, 16 Aug 2024 11:58:30 -0700
Subject: [PATCH 01/15] Adds initial EIS stitch app with time table creation
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 138 ++++++++++++++++++
isis/src/clipper/apps/eisstitch/eisstitch.h | 18 +++
isis/src/clipper/apps/eisstitch/eisstitch.xml | 62 ++++++++
isis/src/clipper/apps/eisstitch/main.cpp | 19 +++
4 files changed, 237 insertions(+)
create mode 100644 isis/src/clipper/apps/eisstitch/eisstitch.cpp
create mode 100644 isis/src/clipper/apps/eisstitch/eisstitch.h
create mode 100644 isis/src/clipper/apps/eisstitch/eisstitch.xml
create mode 100644 isis/src/clipper/apps/eisstitch/main.cpp
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
new file mode 100644
index 0000000000..2e46aa8a61
--- /dev/null
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -0,0 +1,138 @@
+/** 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 "Application.h"
+#include "Cube.h"
+
+#include "FileName.h"
+#include "FileList.h"
+#include "IException.h"
+#include "iTime.h"
+
+#include "Pvl.h"
+#include "PvlKeyword.h"
+#include "Table.h"
+#include "TableField.h"
+#include "TableRecord.h"
+#include "UserInterface.h"
+
+#include
+#include
+#include
+
+#include "eisstitch.h"
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+// This will eventually change to account for the pushbroom
+// framelets but is just a linescanner for now
+struct eisTiming {
+ double start;
+ double lines;
+ double exposureDuration;
+ // Should be the start + (lineCounts * exposureTimes)
+ double stop;
+
+ eisTiming(double start, double lines, double exposureDuration) :
+ start(start), lines(lines), exposureDuration(exposureDuration)
+ {
+ stop = start + (lines * exposureDuration);
+ }
+};
+
+bool compareByStartTime(const eisTiming &time1, const eisTiming &time2) {
+ return time1.start < time2.start;
+}
+
+namespace Isis {
+
+ void eisstitch(UserInterface &ui) {
+ // Get the list of names of input cubes to stitch together
+ FileList fileList;
+ ui = Application::GetUserInterface();
+ try {
+ fileList.read(ui.GetFileName("FROMLIST"));
+ }
+ catch(IException &e) {
+ QString msg = "Unable to read [" + ui.GetFileName("FROMLIST") + "]";
+ IException(e, IException::User, msg, _FILEINFO_);
+ }
+ if (fileList.size() < 1) {
+ QString msg = "The list file[" + ui.GetFileName("FROMLIST") +
+ " does not contain any filenames";
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+
+ std::vector eisTime = {};
+
+ for (auto file : fileList) {
+ Pvl cubeLabel(file.expanded());
+
+ PvlGroup instGroup;
+ try {
+ instGroup = cubeLabel.findGroup("Instrument", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + file.name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+
+ PvlGroup dimGroup;
+ try {
+ dimGroup = cubeLabel.findGroup("Dimensions", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + file.name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+ QString startTime = QString(instGroup.findKeyword("StartTime"));
+ iTime time(startTime);
+ int lines = dimGroup.findKeyword("Lines");
+ double exposureDuration = instGroup.findKeyword("LineExposureDuration");
+ exposureDuration /= 1000;
+ eisTime.push_back(eisTiming(time.Et(), lines, exposureDuration));
+ }
+
+ sort(eisTime.begin(), eisTime.end(), compareByStartTime);
+
+ // Check for overlap
+ for (int i = 0; i < eisTime.size() - 1; i++) {
+ if (eisTime[i].stop > eisTime[i + 1].start) {
+ QString msg = "Image " + QString(i + 1) + " and " + QString(i + 2) + " in the image list have " +
+ "overlapping times.";
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+ }
+
+ // Assume the images don't know about each other
+ TableField ephTimeField("EphemerisTime", TableField::Double);
+ TableField expTimeField("ExposureTime", TableField::Double);
+ TableField lineStartField("LineStart", TableField::Integer);
+
+ TableRecord timesRecord;
+ timesRecord += ephTimeField;
+ timesRecord += expTimeField;
+ timesRecord += lineStartField;
+
+ Table timesTable("LineScanTimes", timesRecord);
+
+ int currentLine = 1;
+ for (auto time : eisTime) {
+ timesRecord[0] = time.start;
+ timesRecord[1] = time.exposureDuration;
+ timesRecord[2] = currentLine;
+ currentLine += time.lines;
+ timesTable += timesRecord;
+ }
+ cout << Table::toString(timesTable, ",") << endl;
+ }
+}
\ No newline at end of file
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.h b/isis/src/clipper/apps/eisstitch/eisstitch.h
new file mode 100644
index 0000000000..f5d2efec23
--- /dev/null
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.h
@@ -0,0 +1,18 @@
+#ifndef eis2isis_h
+#define eis2isis_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 "UserInterface.h"
+
+namespace Isis {
+ extern void eisstitch(UserInterface &ui);
+}
+
+#endif
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.xml b/isis/src/clipper/apps/eisstitch/eisstitch.xml
new file mode 100644
index 0000000000..569b01bba8
--- /dev/null
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+ Combine Clipper EIS files into a single ISIS cube
+
+
+
+ This program takes a series of Clipper EIS cubes and combines them into a single cube with a unified ephemeris time table
+ as well as a unified camera.
+
+
+
+
+
+ Original version.
+
+
+
+
+ Clipper
+
+
+
+
+
+
+ filename
+ input
+
+ List of cubes to stitch together
+
+
+ The name of a file containing a list of HiRISE image files to be
+ stitched together. Each file should be listed on a separate
+ line.
+
+
+ *
+
+
+
+
+ cube
+ output
+
+ Output ISIS cube file for the stitched image
+
+
+ The output cube file that will contain the EIS stitched image in ISIS format.
+ Currently, no cube is written out.
+
+
+ *.cub
+
+
+
+
+
+
+
diff --git a/isis/src/clipper/apps/eisstitch/main.cpp b/isis/src/clipper/apps/eisstitch/main.cpp
new file mode 100644
index 0000000000..3c6b610dab
--- /dev/null
+++ b/isis/src/clipper/apps/eisstitch/main.cpp
@@ -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 */
+
+#include "Isis.h"
+#include "UserInterface.h"
+#include "eisstitch.h"
+
+using namespace std;
+using namespace Isis;
+
+void IsisMain() {
+ UserInterface &ui = Application::GetUserInterface();
+ eisstitch(ui);
+}
From bb7824f623774f746b718ea0a89f433cef071d3c Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Fri, 16 Aug 2024 12:02:31 -0700
Subject: [PATCH 02/15] Added changelog entry
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d906e8e933..fe8d51a7ad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -114,6 +114,7 @@ file. Slightly modified the FunctionalTestJigsawBundleXYZ ctest accordingly. Iss
### Added
- Added backplane options for SunIllumination and SurfaceObliqueDetectorResolution to phocube [#5467](https://github.com/DOI-USGS/ISIS3/issues/5467)
- Added *.history to the ignore list in downloadIsisData
+- Added initial `eisstitch` app [#5591](https://github.com/DOI-USGS/ISIS3/pull/5591)
### Changed
- Noseam has been refactored to be callable; old Makefile test has been removed and replaced by a gtest. Issue: [#5599](https://github.com/USGS-Astrogeology/ISIS3/issues/5599)
From 1eaa0f1e5026ee848a82b616d2cf7c2151eb4e85 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Wed, 11 Sep 2024 16:23:11 -0700
Subject: [PATCH 03/15] Update eisstitch to place DNs into an output cube
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 97 ++++++++++++++++---
1 file changed, 82 insertions(+), 15 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index 2e46aa8a61..606e7396ee 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -14,6 +14,9 @@ find files of those names at the top level of this repository. **/
#include "IException.h"
#include "iTime.h"
+#include "CubeAttribute.h"
+#include "EisStitchFunctor.h"
+#include "ProcessByBrick.h"
#include "Pvl.h"
#include "PvlKeyword.h"
#include "Table.h"
@@ -24,6 +27,7 @@ find files of those names at the top level of this repository. **/
#include
#include
#include
+#include
#include "eisstitch.h"
#include
@@ -72,14 +76,14 @@ namespace Isis {
throw IException(IException::User, msg, _FILEINFO_);
}
- std::vector eisTime = {};
+ std::vector eisTimes = {};
for (auto file : fileList) {
- Pvl cubeLabel(file.expanded());
+ Pvl inputCubeLabel = Pvl(file.expanded());
PvlGroup instGroup;
try {
- instGroup = cubeLabel.findGroup("Instrument", PvlObject::FindOptions::Traverse);
+ instGroup = inputCubeLabel.findGroup("Instrument", PvlObject::FindOptions::Traverse);
}
catch(IException &e) {
QString msg = "Unable to find instrument group in [" + file.name() + "]";
@@ -88,7 +92,7 @@ namespace Isis {
PvlGroup dimGroup;
try {
- dimGroup = cubeLabel.findGroup("Dimensions", PvlObject::FindOptions::Traverse);
+ dimGroup = inputCubeLabel.findGroup("Dimensions", PvlObject::FindOptions::Traverse);
}
catch(IException &e) {
QString msg = "Unable to find instrument group in [" + file.name() + "]";
@@ -99,14 +103,16 @@ namespace Isis {
int lines = dimGroup.findKeyword("Lines");
double exposureDuration = instGroup.findKeyword("LineExposureDuration");
exposureDuration /= 1000;
- eisTime.push_back(eisTiming(time.Et(), lines, exposureDuration));
+ eisTimes.push_back(eisTiming(time.Et(), lines, exposureDuration));
}
- sort(eisTime.begin(), eisTime.end(), compareByStartTime);
+ // Likely need to re-order the cubes in the fileList if the eisTimes
+ // are moved around
+ sort(eisTimes.begin(), eisTimes.end(), compareByStartTime);
// Check for overlap
- for (int i = 0; i < eisTime.size() - 1; i++) {
- if (eisTime[i].stop > eisTime[i + 1].start) {
+ for (int i = 0; i < eisTimes.size() - 1; i++) {
+ if (eisTimes[i].stop > eisTimes[i + 1].start) {
QString msg = "Image " + QString(i + 1) + " and " + QString(i + 2) + " in the image list have " +
"overlapping times.";
throw IException(IException::User, msg, _FILEINFO_);
@@ -125,14 +131,75 @@ namespace Isis {
Table timesTable("LineScanTimes", timesRecord);
- int currentLine = 1;
- for (auto time : eisTime) {
- timesRecord[0] = time.start;
- timesRecord[1] = time.exposureDuration;
- timesRecord[2] = currentLine;
- currentLine += time.lines;
+ int lineCount = 1;
+ for (int i = 0; i < eisTimes.size(); i++) {
+ timesRecord[0] = eisTimes[i].start;
+ timesRecord[1] = eisTimes[i].exposureDuration;
+ timesRecord[2] = lineCount;
+ lineCount += eisTimes[i].lines;
timesTable += timesRecord;
+
+ if (i < eisTimes.size() - 1) {
+ double imageTotalTime = eisTimes[i].start + (eisTimes[i].exposureDuration * eisTimes[i].lines);
+ if ( std::abs(imageTotalTime - eisTimes[i + 1].start) > std::numeric_limits::epsilon()) {
+ double remainingTime = eisTimes[i + 1].start - imageTotalTime;
+ int blankLines = int(remainingTime / eisTimes[i].exposureDuration);
+ lineCount += blankLines;
+ }
+ }
+ }
+
+ Pvl firstCubeLabel(fileList[0].expanded());
+ PvlGroup dimGroup;
+ try {
+ dimGroup = firstCubeLabel.findGroup("Dimensions", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + fileList[0].name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
}
- cout << Table::toString(timesTable, ",") << endl;
+ int outLines = lineCount - 1;
+ int outSamples = dimGroup["Samples"];
+
+ ProcessByBrick process;
+ process.PropagateLabels(false);
+ process.PropagateTables(false);
+ process.PropagatePolygons(false);
+ process.PropagateOriginalLabel(false);
+ process.SetInputCube(fileList[0].expanded(), CubeAttributeInput());
+
+ QString outCubeFile = ui.GetCubeName("TO");
+ Cube *outCube = process.SetOutputCube(outCubeFile, CubeAttributeOutput(outCubeFile),
+ outSamples, outLines, 1);
+ process.ClearInputCubes();
+ Brick cubeBrick = Brick(outCube->sampleCount(), 1, 1, outCube->pixelType());
+
+ int writeLine = 1;
+
+ for (int i = 0; i < fileList.size(); i++) {
+
+ Cube *inputCube = process.SetInputCube(fileList[i].expanded(), CubeAttributeInput());
+
+ for (int line = 1; line < inputCube->lineCount() + 1; line++) {
+ cubeBrick.SetBasePosition(1, line, 1);
+ inputCube->read(cubeBrick);
+ cubeBrick.SetBasePosition(1, writeLine, 1);
+ outCube->write(cubeBrick);
+ writeLine++;
+ }
+
+ if (i < fileList.size() - 1) {
+ int expectedLines = (int)timesTable[i + 1][2] - 1;
+ while(writeLine != expectedLines) {
+ writeLine++;
+ }
+ }
+
+ process.ClearInputCubes();
+ }
+
+ // Still need to write the Time table and other label data
+
+ process.EndProcess();
}
}
\ No newline at end of file
From d6c448a6839bad5b286b41f41e1c88099245333d Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Fri, 25 Oct 2024 10:53:37 -0700
Subject: [PATCH 04/15] Write label data to new cube in eisstitch
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 128 ++++++++++++++++--
isis/src/clipper/apps/eisstitch/eisstitch.xml | 2 +-
2 files changed, 118 insertions(+), 12 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index 606e7396ee..bc1a8fcf6a 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -41,13 +41,14 @@ using namespace std;
// framelets but is just a linescanner for now
struct eisTiming {
double start;
- double lines;
+ int line_start;
+ int lines;
double exposureDuration;
// Should be the start + (lineCounts * exposureTimes)
double stop;
- eisTiming(double start, double lines, double exposureDuration) :
- start(start), lines(lines), exposureDuration(exposureDuration)
+ eisTiming(double start, int line_start, int lines, double exposureDuration) :
+ start(start), line_start(line_start), lines(lines), exposureDuration(exposureDuration)
{
stop = start + (lines * exposureDuration);
}
@@ -77,8 +78,10 @@ namespace Isis {
}
std::vector eisTimes = {};
+ QString filterName = "";
+ int naifFrameCode = 0;
- for (auto file : fileList) {
+ for (FileName file : fileList) {
Pvl inputCubeLabel = Pvl(file.expanded());
PvlGroup instGroup;
@@ -90,6 +93,46 @@ namespace Isis {
throw IException(e, IException::User, msg, _FILEINFO_);
}
+ PvlGroup kernelGroup;
+ try {
+ kernelGroup = inputCubeLabel.findGroup("Kernels", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find kernels group in [" + file.name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+
+ if (naifFrameCode == 0) {
+ naifFrameCode = kernelGroup.findKeyword("NaifFrameCode");
+ }
+ else {
+ if (naifFrameCode != toInt(kernelGroup.findKeyword("NaifFrameCode"))) {
+ QString msg = "NaifFrameCode [" + kernelGroup.findKeyword("NaifFrameCode")[0] + "] from image [" + file.name() + "] does "
+ "not match recorded frame code " + toString(naifFrameCode);
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+ }
+
+ PvlGroup bandBinGroup;
+ try {
+ bandBinGroup = inputCubeLabel.findGroup("BandBin", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find kernels group in [" + file.name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+
+ if (filterName == "") {
+ filterName = bandBinGroup.findKeyword("FilterName")[0];
+ }
+ else {
+ if (filterName != bandBinGroup.findKeyword("FilterName")[0]) {
+ QString msg = "FilterName [" + kernelGroup.findKeyword("FilterName")[0] + "] from image [" + file.name() + "] does "
+ "not match recorded filter name " + filterName;
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+ }
+
PvlGroup dimGroup;
try {
dimGroup = inputCubeLabel.findGroup("Dimensions", PvlObject::FindOptions::Traverse);
@@ -98,17 +141,26 @@ namespace Isis {
QString msg = "Unable to find instrument group in [" + file.name() + "]";
throw IException(e, IException::User, msg, _FILEINFO_);
}
- QString startTime = QString(instGroup.findKeyword("StartTime"));
- iTime time(startTime);
- int lines = dimGroup.findKeyword("Lines");
- double exposureDuration = instGroup.findKeyword("LineExposureDuration");
- exposureDuration /= 1000;
- eisTimes.push_back(eisTiming(time.Et(), lines, exposureDuration));
+ Table timesTable("LineScanTimes", file.expanded());
+
+ if(timesTable.Records() <= 0) {
+ QString msg = "Table [LineScanTimes] in [";
+ msg += file.expanded() + "] must not be empty";
+ throw IException(IException::Unknown, msg, _FILEINFO_);
+ }
+
+ for(int i = 0; i < timesTable.Records(); i++) {
+ double startTime = (double)timesTable[i][0];
+ int line_start = timesTable[i][2];
+ int lines = int(dimGroup.findKeyword("Lines")) - (line_start - 1);
+ double exposureDuration = timesTable[i][1];
+ eisTimes.push_back(eisTiming(startTime, line_start, lines, exposureDuration));
+ }
}
// Likely need to re-order the cubes in the fileList if the eisTimes
// are moved around
- sort(eisTimes.begin(), eisTimes.end(), compareByStartTime);
+ // sort(eisTimes.begin(), eisTimes.end(), compareByStartTime);
// Check for overlap
for (int i = 0; i < eisTimes.size() - 1; i++) {
@@ -199,6 +251,60 @@ namespace Isis {
}
// Still need to write the Time table and other label data
+ outCube->write(timesTable);
+
+
+ // Group = Instrument
+ // SpacecraftName = Clipper
+ // InstrumentId = WAC-PUSHBROOM
+ // TargetName = Mars
+ // StartTime = "2020 APR 25 23:50:28.1879999637604"
+ // ExposureDuration = 27.547366730736318
+ // End_Group
+
+ Pvl *outLabel = outCube->label();
+ PvlObject &outputIsisObject = outLabel->findObject("IsisCube");
+
+ Pvl inputCubeLabel = Pvl(fileList[0].expanded());
+ PvlGroup inputInstGroup;
+ try {
+ inputInstGroup = inputCubeLabel.findGroup("Instrument", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + fileList[0].name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+
+ PvlGroup instGroup("Instrument");
+ instGroup.addKeyword(PvlKeyword("SpacecraftName", inputInstGroup["SpacecraftName"]));
+ instGroup.addKeyword(PvlKeyword("InstrumentId", inputInstGroup["InstrumentId"]));
+ instGroup.addKeyword(PvlKeyword("TargetName", inputInstGroup["TargetName"]));
+ instGroup.addKeyword(PvlKeyword("StartTime", inputInstGroup["StartTime"]));
+ outputIsisObject.addGroup(instGroup);
+
+
+ PvlGroup inputKernelsGroup;
+ try {
+ inputKernelsGroup = inputCubeLabel.findGroup("Kernels", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + fileList[0].name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+
+ PvlGroup kernelsGroup("Kernels");
+ kernelsGroup.addKeyword(PvlKeyword("NaifFrameCode", inputKernelsGroup["NaifFrameCode"]));
+ outputIsisObject.addGroup(kernelsGroup);
+
+ PvlGroup bandBinGroup;
+ try {
+ bandBinGroup = inputCubeLabel.findGroup("BandBin", PvlObject::FindOptions::Traverse);
+ }
+ catch(IException &e) {
+ QString msg = "Unable to find instrument group in [" + fileList[0].name() + "]";
+ throw IException(e, IException::User, msg, _FILEINFO_);
+ }
+ outputIsisObject.addGroup(bandBinGroup);
process.EndProcess();
}
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.xml b/isis/src/clipper/apps/eisstitch/eisstitch.xml
index 569b01bba8..be18af6b05 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.xml
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.xml
@@ -1,6 +1,6 @@
-
+
Combine Clipper EIS files into a single ISIS cube
From 9a3ee89903ad1d76085dc452eb1589f0f666a640 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Mon, 28 Oct 2024 17:18:53 -0700
Subject: [PATCH 05/15] Remove commented instrument group
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index bc1a8fcf6a..32b9b0c303 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -252,16 +252,7 @@ namespace Isis {
// Still need to write the Time table and other label data
outCube->write(timesTable);
-
-
- // Group = Instrument
- // SpacecraftName = Clipper
- // InstrumentId = WAC-PUSHBROOM
- // TargetName = Mars
- // StartTime = "2020 APR 25 23:50:28.1879999637604"
- // ExposureDuration = 27.547366730736318
- // End_Group
-
+
Pvl *outLabel = outCube->label();
PvlObject &outputIsisObject = outLabel->findObject("IsisCube");
From 8553714da840e7c995d2b746ebd5343a2465c872 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Wed, 30 Oct 2024 17:07:37 -0700
Subject: [PATCH 06/15] Set the detector offset in eisstitch app
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index 32b9b0c303..902679b912 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -80,6 +80,7 @@ namespace Isis {
std::vector eisTimes = {};
QString filterName = "";
int naifFrameCode = 0;
+ int detectorOffset = -1;
for (FileName file : fileList) {
Pvl inputCubeLabel = Pvl(file.expanded());
@@ -92,6 +93,16 @@ namespace Isis {
QString msg = "Unable to find instrument group in [" + file.name() + "]";
throw IException(e, IException::User, msg, _FILEINFO_);
}
+ if (detectorOffset == -1) {
+ detectorOffset = instGroup.findKeyword("DetectorOffset");
+ }
+ else {
+ if (detectorOffset != toInt(instGroup.findKeyword("DetectorOffset"))) {
+ QString msg = "DetectorOffset [" + instGroup.findKeyword("DetectorOffset")[0] + "] from image [" + file.name() + "] does "
+ "not match recorded detector offset " + toString(detectorOffset);
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+ }
PvlGroup kernelGroup;
try {
@@ -271,6 +282,7 @@ namespace Isis {
instGroup.addKeyword(PvlKeyword("InstrumentId", inputInstGroup["InstrumentId"]));
instGroup.addKeyword(PvlKeyword("TargetName", inputInstGroup["TargetName"]));
instGroup.addKeyword(PvlKeyword("StartTime", inputInstGroup["StartTime"]));
+ instGroup.addKeyword(PvlKeyword("DetectorOffset", inputInstGroup["DetectorOffset"]));
outputIsisObject.addGroup(instGroup);
From 0d290dc4932d3ea14b442bbbebe7919936fcd48f Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Wed, 13 Nov 2024 14:56:35 -0700
Subject: [PATCH 07/15] Removed missing .h file include
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index 902679b912..9c807898f4 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -15,7 +15,6 @@ find files of those names at the top level of this repository. **/
#include "iTime.h"
#include "CubeAttribute.h"
-#include "EisStitchFunctor.h"
#include "ProcessByBrick.h"
#include "Pvl.h"
#include "PvlKeyword.h"
@@ -311,4 +310,4 @@ namespace Isis {
process.EndProcess();
}
-}
\ No newline at end of file
+}
From b1801e3c6f64fae25f1c05bf0deb768ee348ec33 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Wed, 14 May 2025 08:24:22 -0700
Subject: [PATCH 08/15] Add clipper EIS instrument check for short circuiting
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index 9c807898f4..c42ae825fb 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -92,6 +92,14 @@ namespace Isis {
QString msg = "Unable to find instrument group in [" + file.name() + "]";
throw IException(e, IException::User, msg, _FILEINFO_);
}
+
+ if (instGroup.findKeyword("SpacecraftName") != "Europa Clipper" &&
+ !instGroup.findKeyword("InstrumentId").contains("EIS")) {
+ QString msg = "Cube " + file.name() + " is not a Clipper EIS image. Either update the "
+ "image or remove it so the other images can be stitched."
+ throw IException(IException::User, msg, _FILEINFO_);
+ }
+
if (detectorOffset == -1) {
detectorOffset = instGroup.findKeyword("DetectorOffset");
}
@@ -99,7 +107,7 @@ namespace Isis {
if (detectorOffset != toInt(instGroup.findKeyword("DetectorOffset"))) {
QString msg = "DetectorOffset [" + instGroup.findKeyword("DetectorOffset")[0] + "] from image [" + file.name() + "] does "
"not match recorded detector offset " + toString(detectorOffset);
- throw IException(IException::User, msg, _FILEINFO_);
+ throw IException(IException::User, msg, _FILEINFO_);
}
}
From 8c85e8911c8ed0ae0466933726773f4fc87d63b6 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Wed, 14 May 2025 08:24:47 -0700
Subject: [PATCH 09/15] Updated description and fromlist information
---
isis/src/clipper/apps/eisstitch/eisstitch.xml | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.xml b/isis/src/clipper/apps/eisstitch/eisstitch.xml
index be18af6b05..e839d3aeb2 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.xml
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.xml
@@ -10,6 +10,10 @@
This program takes a series of Clipper EIS cubes and combines them into a single cube with a unified ephemeris time table
as well as a unified camera.
+
+
+ The program requires that the list of cubes provided be Clipper EIS cubes and that the cubes are in chronological order.
+
@@ -32,9 +36,8 @@
List of cubes to stitch together
- The name of a file containing a list of HiRISE image files to be
- stitched together. Each file should be listed on a separate
- line.
+ The name of a file containing a list of Clipper EIS images in chronological
+ order to be stitched together.
*
@@ -49,7 +52,6 @@
The output cube file that will contain the EIS stitched image in ISIS format.
- Currently, no cube is written out.
*.cub
From 83dcf4d1917d37ffe6a8bfe93c92acf4cdafe091 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Fri, 16 May 2025 09:14:20 -0700
Subject: [PATCH 10/15] Added check in eis stitch for Clipper EIS images
---
isis/src/clipper/apps/eisstitch/eisstitch.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.cpp b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
index c42ae825fb..610492776d 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.cpp
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.cpp
@@ -93,10 +93,10 @@ namespace Isis {
throw IException(e, IException::User, msg, _FILEINFO_);
}
- if (instGroup.findKeyword("SpacecraftName") != "Europa Clipper" &&
- !instGroup.findKeyword("InstrumentId").contains("EIS")) {
+ if (instGroup.findKeyword("SpacecraftName")[0] != "Europa Clipper" &&
+ !instGroup.findKeyword("InstrumentId")[0].contains("EIS")) {
QString msg = "Cube " + file.name() + " is not a Clipper EIS image. Either update the "
- "image or remove it so the other images can be stitched."
+ "image or remove it so the other images can be stitched.";
throw IException(IException::User, msg, _FILEINFO_);
}
From a0e82466f241a5806a12e4642e6f69258e0e3c0b Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Tue, 17 Jun 2025 15:12:49 -0700
Subject: [PATCH 11/15] Added initial eisstitch example
---
isis/src/clipper/apps/eisstitch/eisstitch.xml | 48 ++++++++++++++++++-
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/isis/src/clipper/apps/eisstitch/eisstitch.xml b/isis/src/clipper/apps/eisstitch/eisstitch.xml
index e839d3aeb2..4b036aa370 100644
--- a/isis/src/clipper/apps/eisstitch/eisstitch.xml
+++ b/isis/src/clipper/apps/eisstitch/eisstitch.xml
@@ -44,7 +44,7 @@
-
+
cube
output
@@ -59,6 +59,50 @@
-
+
+
+
+
+ Demonstrats how to use eisstitch
+
+ This example demonstrates the basic workings of eisstitch and
+ how to properly format the input information for stitching.
+
+
+
+ fromlist=eis_cubes.lis to=eis_stitched_cube.cub
+
+
+ This is the command line used to create the stitched output cube
+
+
+
+
+ First chronological capture from an EIS image set
+
+ This is the first image in a series of images taken by the EIS Clipper
+ WAC/NAC camera.
+
+
+
+
+ Second chronological capture from an EIS image set
+
+ This is the second image in a series of images taken by the EIS Clipper
+ WAC/NAC camera.
+
+
+
+
+ Third chronological capture from an EIS image set
+
+ This is the third image in a series of images taken by the EIS Clipper
+ WAC/NAC camera.
+
+
+
+
+
+
From beacb8acb64a2d8b1b0439f688f11564112eb1d6 Mon Sep 17 00:00:00 2001
From: acpaquette
Date: Tue, 17 Jun 2025 15:13:16 -0700
Subject: [PATCH 12/15] Added eisstitch example assets
---
.../apps/eisstitch/assets/images/capture_1.jpg | Bin 0 -> 721047 bytes
.../apps/eisstitch/assets/images/capture_2.jpg | Bin 0 -> 659344 bytes
.../apps/eisstitch/assets/images/capture_3.jpg | Bin 0 -> 623717 bytes
.../assets/thumbs/capture_1_thumb.jpg | Bin 0 -> 90049 bytes
.../assets/thumbs/capture_2_thumb.jpg | Bin 0 -> 82937 bytes
.../assets/thumbs/capture_3_thumb.jpg | Bin 0 -> 80059 bytes
6 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 isis/src/clipper/apps/eisstitch/assets/images/capture_1.jpg
create mode 100644 isis/src/clipper/apps/eisstitch/assets/images/capture_2.jpg
create mode 100644 isis/src/clipper/apps/eisstitch/assets/images/capture_3.jpg
create mode 100644 isis/src/clipper/apps/eisstitch/assets/thumbs/capture_1_thumb.jpg
create mode 100644 isis/src/clipper/apps/eisstitch/assets/thumbs/capture_2_thumb.jpg
create mode 100644 isis/src/clipper/apps/eisstitch/assets/thumbs/capture_3_thumb.jpg
diff --git a/isis/src/clipper/apps/eisstitch/assets/images/capture_1.jpg b/isis/src/clipper/apps/eisstitch/assets/images/capture_1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1c30e48f22f2bf561194c920a48ef122e64c92b4
GIT binary patch
literal 721047
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