void IsisMain() { //Get user parameters UserInterface &ui = Application::GetUserInterface(); FileName inFile = ui.GetFileName("FROM"); int numberOfLines = ui.GetInteger("NL"); int lineOverlap = ui.GetInteger("OVERLAP"); //Throws exception if user is dumb if(lineOverlap >= numberOfLines) { throw IException(IException::User, "The Line Overlap (OVERLAP) must be less than the Number of Lines (LN).", _FILEINFO_); } //Opens the cube Cube cube; cube.open(inFile.expanded()); //Loops through, cropping as desired int cropNum = 1; int startLine = 1; bool hasReachedEndOfCube = false; while(startLine <= cube.lineCount() && not hasReachedEndOfCube) { //! Sets up the proper paramaters for running the crop program QString parameters = "FROM=" + inFile.expanded() + " TO=" + inFile.path() + "/" + inFile.baseName() + ".segment" + toString(cropNum) + ".cub" + " LINE=" + toString(startLine) + " NLINES="; if(startLine + numberOfLines > cube.lineCount()) { parameters += toString(cube.lineCount() - (startLine - 1)); hasReachedEndOfCube = true; } else { parameters += toString(numberOfLines); } ProgramLauncher::RunIsisProgram("crop", parameters); //The starting line for next crop startLine = 1 + cropNum * (numberOfLines - lineOverlap); cropNum++; } }
FileName FileName::createTempFile(FileName templateFileName) { QString preppedFileName = QString("%1/%2XXXXXX.%3").arg(templateFileName.path()) .arg(templateFileName.baseName()).arg(templateFileName.extension()); QTemporaryFile tempFile(preppedFileName); tempFile.setAutoRemove(false); if (!tempFile.open()) { throw IException(IException::Io, QObject::tr("Could not create a unique temporary file name based on [%1]") .arg(templateFileName.original()), _FILEINFO_); } // We want to set the 'original' path as correctly as possible. So let's use the input original // path with the output temp file's file name in our result. FileName result; QString newTempFileNameStr = templateFileName.originalPath() + "/" + QFileInfo(tempFile.fileName()).fileName(); result = FileName(newTempFileNameStr); return result; }
void IsisMain () { ProcessImportPds p; Pvl pdsLabel; UserInterface &ui = Application::GetUserInterface(); FileName inFile = ui.GetFileName("FROM"); QString imageFile(""); if (ui.WasEntered("IMAGE")) { imageFile = ui.GetFileName("IMAGE"); } // Generate the housekeeping filenames QString hkLabel(""); QString hkData(""); if (ui.WasEntered("HKFROM") ) { hkLabel = ui.GetFileName("HKFROM"); } else { hkLabel = inFile.originalPath() + "/" + inFile.baseName() + "_HK.LBL"; // Determine the housekeeping file FileName hkFile(hkLabel); if (!hkFile.fileExists()) { hkFile = hkLabel.replace("_1B_", "_1A_"); if (hkFile.fileExists()) hkLabel = hkFile.expanded(); } } if (ui.WasEntered("HKTABLE")) { hkData = ui.GetFileName("HKTABLE"); } QString instid; QString missid; try { Pvl lab(inFile.expanded()); instid = (QString) lab.findKeyword ("CHANNEL_ID"); missid = (QString) lab.findKeyword ("INSTRUMENT_HOST_ID"); } catch (IException &e) { QString msg = "Unable to read [INSTRUMENT_ID] or [MISSION_ID] from input file [" + inFile.expanded() + "]"; throw IException(e, IException::Io,msg, _FILEINFO_); } instid = instid.simplified().trimmed(); missid = missid.simplified().trimmed(); if (missid != "DAWN" && instid != "VIS" && instid != "IR") { QString msg = "Input file [" + inFile.expanded() + "] does not appear to be a " + "DAWN Visual and InfraRed Mapping Spectrometer (VIR) EDR or RDR file."; throw IException(IException::Unknown, msg, _FILEINFO_); } QString target; if (ui.WasEntered("TARGET")) { target = ui.GetString("TARGET"); } // p.SetPdsFile (inFile.expanded(),imageFile,pdsLabel); // QString labelFile = ui.GetFileName("FROM"); p.SetPdsFile (inFile.expanded(),imageFile,pdsLabel); p.SetOrganization(Isis::ProcessImport::BIP); Cube *outcube = p.SetOutputCube ("TO"); // p.SaveFileHeader(); Pvl labelPvl (inFile.expanded()); p.StartProcess (); // Get the directory where the DAWN translation tables are. PvlGroup dataDir (Preference::Preferences().findGroup("DataDirectory")); QString transDir = (QString) dataDir["Dawn"] + "/translations/"; // Create a PVL to store the translated labels in Pvl outLabel; // Translate the BandBin group FileName transFile (transDir + "dawnvirBandBin.trn"); PvlTranslationManager bandBinXlater (labelPvl, transFile.expanded()); bandBinXlater.Auto(outLabel); // Translate the Archive group transFile = transDir + "dawnvirArchive.trn"; PvlTranslationManager archiveXlater (labelPvl, transFile.expanded()); archiveXlater.Auto(outLabel); // Translate the Instrument group transFile = transDir + "dawnvirInstrument.trn"; PvlTranslationManager instrumentXlater (labelPvl, transFile.expanded()); instrumentXlater.Auto(outLabel); // Update target if user specifies it if (!target.isEmpty()) { PvlGroup &igrp = outLabel.findGroup("Instrument",Pvl::Traverse); igrp["TargetName"] = target; } // Write the BandBin, Archive, and Instrument groups // to the output cube label outcube->putGroup(outLabel.findGroup("BandBin",Pvl::Traverse)); outcube->putGroup(outLabel.findGroup("Archive",Pvl::Traverse)); outcube->putGroup(outLabel.findGroup("Instrument",Pvl::Traverse)); PvlGroup kerns("Kernels"); if (instid == "VIS") { kerns += PvlKeyword("NaifFrameCode","-203211"); } else if (instid == "IR") { kerns += PvlKeyword("NaifFrameCode","-203213"); } else { QString msg = "Input file [" + inFile.expanded() + "] has an invalid " + "InstrumentId."; throw IException(IException::Unknown, msg, _FILEINFO_); } outcube->putGroup(kerns); // Now handle generation of housekeeping data try { ImportPdsTable hktable(hkLabel, hkData); hktable.setType("ScetTimeClock", "CHARACTER"); hktable.setType("ShutterStatus", "CHARACTER"); hktable.setType("MirrorSin", "DOUBLE"); hktable.setType("MirrorCos", "DOUBLE"); Table hktab = hktable.importTable("ScetTimeClock,ShutterStatus,MirrorSin,MirrorCos", "VIRHouseKeeping"); hktab.Label().addKeyword(PvlKeyword("SourceFile", hkLabel)); outcube->write(hktab); } catch (IException &e) { QString mess = "Cannot read/open housekeeping data"; throw IException(e, IException::User, mess, _FILEINFO_); } p.EndProcess (); }
void IsisMain() { ProcessImportPds p; Pvl pdsLabel; UserInterface &ui = Application::GetUserInterface(); FileName inFile = ui.GetFileName("FROM"); QString instid; QString missid; try { Pvl lab(inFile.expanded()); instid = (QString) lab.findKeyword("INSTRUMENT_ID"); missid = (QString) lab.findKeyword("MISSION_ID"); } catch(IException &e) { QString msg = "Unable to read [INSTRUMENT_ID] or [MISSION_ID] from input file [" + inFile.expanded() + "]"; throw IException(IException::Io, msg, _FILEINFO_); } instid = instid.simplified().trimmed(); missid = missid.simplified().trimmed(); if(missid != "DAWN" && instid != "FC1" && instid != "FC2") { QString msg = "Input file [" + inFile.expanded() + "] does not appear to be " + "a DAWN Framing Camera (FC) EDR or RDR file."; throw IException(IException::Io, msg, _FILEINFO_); } QString target; if(ui.WasEntered("TARGET")) { target = ui.GetString("TARGET"); } p.SetPdsFile(inFile.expanded(), "", pdsLabel); p.SetOrganization(Isis::ProcessImport::BSQ); QString tmpName = "$TEMPORARY/" + inFile.baseName() + ".tmp.cub"; FileName tmpFile(tmpName); CubeAttributeOutput outatt = CubeAttributeOutput("+Real"); p.SetOutputCube(tmpFile.expanded(), outatt); p.SaveFileHeader(); Pvl labelPvl(inFile.expanded()); p.StartProcess(); p.EndProcess(); ProcessBySample p2; CubeAttributeInput inatt; p2.SetInputCube(tmpFile.expanded(), inatt); Cube *outcube = p2.SetOutputCube("TO"); // Get the directory where the DAWN translation tables are. PvlGroup dataDir(Preference::Preferences().findGroup("DataDirectory")); QString transDir = (QString) dataDir["Dawn"] + "/translations/"; // Create a PVL to store the translated labels in Pvl outLabel; // Translate the BandBin group FileName transFile(transDir + "dawnfcBandBin.trn"); PvlTranslationManager bandBinXlater(labelPvl, transFile.expanded()); bandBinXlater.Auto(outLabel); // Translate the Archive group transFile = transDir + "dawnfcArchive.trn"; PvlTranslationManager archiveXlater(labelPvl, transFile.expanded()); archiveXlater.Auto(outLabel); // Translate the Instrument group transFile = transDir + "dawnfcInstrument.trn"; PvlTranslationManager instrumentXlater(labelPvl, transFile.expanded()); instrumentXlater.Auto(outLabel); // Update target if user specifies it if (!target.isEmpty()) { PvlGroup &igrp = outLabel.findGroup("Instrument",Pvl::Traverse); igrp["TargetName"] = target; } // Write the BandBin, Archive, and Instrument groups // to the output cube label outcube->putGroup(outLabel.findGroup("BandBin", Pvl::Traverse)); outcube->putGroup(outLabel.findGroup("Archive", Pvl::Traverse)); outcube->putGroup(outLabel.findGroup("Instrument", Pvl::Traverse)); // Set the BandBin filter name, center, and width values based on the // FilterNumber. PvlGroup &bbGrp(outLabel.findGroup("BandBin", Pvl::Traverse)); int filtno = bbGrp["FilterNumber"]; int center; int width; QString filtname; if(filtno == 1) { center = 700; width = 700; filtname = "Clear_F1"; } else if(filtno == 2) { center = 555; width = 43; filtname = "Green_F2"; } else if(filtno == 3) { center = 749; width = 44; filtname = "Red_F3"; } else if(filtno == 4) { center = 917; width = 45; filtname = "NIR_F4"; } else if(filtno == 5) { center = 965; width = 85; filtname = "NIR_F5"; } else if(filtno == 6) { center = 829; width = 33; filtname = "NIR_F6"; } else if(filtno == 7) { center = 653; width = 42; filtname = "Red_F7"; } else if(filtno == 8) { center = 438; width = 40; filtname = "Blue_F8"; } else { QString msg = "Input file [" + inFile.expanded() + "] has an invalid " + "FilterNumber. The FilterNumber must fall in the range 1 to 8."; throw IException(IException::Io, msg, _FILEINFO_); } bbGrp.addKeyword(PvlKeyword("Center", toString(center))); bbGrp.addKeyword(PvlKeyword("Width", toString(width))); bbGrp.addKeyword(PvlKeyword("FilterName", filtname)); outcube->putGroup(bbGrp); PvlGroup kerns("Kernels"); if(instid == "FC1") { kerns += PvlKeyword("NaifFrameCode", toString(-203110-filtno)); } else if(instid == "FC2") { kerns += PvlKeyword("NaifFrameCode", toString(-203120-filtno)); } else { QString msg = "Input file [" + inFile.expanded() + "] has an invalid " + "InstrumentId."; throw IException(IException::Unknown, msg, _FILEINFO_); } outcube->putGroup(kerns); p2.StartProcess(flipbyline); p2.EndProcess(); QString tmp(tmpFile.expanded()); QFile::remove(tmp); }
void IsisMain() { const QString caminfo_program = "caminfo"; UserInterface &ui = Application::GetUserInterface(); QList< QPair<QString, QString> > *general = NULL, *camstats = NULL, *statistics = NULL; BandGeometry *bandGeom = NULL; // Get input filename FileName in = ui.GetFileName("FROM"); // Get the format QString sFormat = ui.GetAsString("FORMAT"); // if true then run spiceinit, xml default is FALSE // spiceinit will use system kernels if(ui.GetBoolean("SPICE")) { QString parameters = "FROM=" + in.expanded(); ProgramLauncher::RunIsisProgram("spiceinit", parameters); } Process p; Cube *incube = p.SetInputCube("FROM"); // General data gathering general = new QList< QPair<QString, QString> >; general->append(MakePair("Program", caminfo_program)); general->append(MakePair("IsisVersion", Application::Version())); general->append(MakePair("RunDate", iTime::CurrentGMT())); general->append(MakePair("IsisId", SerialNumber::Compose(*incube))); general->append(MakePair("From", in.baseName() + ".cub")); general->append(MakePair("Lines", toString(incube->lineCount()))); general->append(MakePair("Samples", toString(incube->sampleCount()))); general->append(MakePair("Bands", toString(incube->bandCount()))); // Run camstats on the entire image (all bands) // another camstats will be run for each band and output // for each band. if(ui.GetBoolean("CAMSTATS")) { camstats = new QList< QPair<QString, QString> >; QString filename = ui.GetAsString("FROM"); int sinc = ui.GetInteger("SINC"); int linc = ui.GetInteger("LINC"); CameraStatistics stats(filename, sinc, linc); Pvl camPvl = stats.toPvl(); PvlGroup cg = camPvl.findGroup("Latitude", Pvl::Traverse); camstats->append(MakePair("MinimumLatitude", cg["latitudeminimum"][0])); camstats->append(MakePair("MaximumLatitude", cg["latitudemaximum"][0])); cg = camPvl.findGroup("Longitude", Pvl::Traverse); camstats->append(MakePair("MinimumLongitude", cg["longitudeminimum"][0])); camstats->append(MakePair("MaximumLongitude", cg["longitudemaximum"][0])); cg = camPvl.findGroup("Resolution", Pvl::Traverse); camstats->append(MakePair("MinimumResolution", cg["resolutionminimum"][0])); camstats->append(MakePair("MaximumResolution", cg["resolutionmaximum"][0])); cg = camPvl.findGroup("PhaseAngle", Pvl::Traverse); camstats->append(MakePair("MinimumPhase", cg["phaseminimum"][0])); camstats->append(MakePair("MaximumPhase", cg["phasemaximum"][0])); cg = camPvl.findGroup("EmissionAngle", Pvl::Traverse); camstats->append(MakePair("MinimumEmission", cg["emissionminimum"][0])); camstats->append(MakePair("MaximumEmission", cg["emissionmaximum"][0])); cg = camPvl.findGroup("IncidenceAngle", Pvl::Traverse); camstats->append(MakePair("MinimumIncidence", cg["incidenceminimum"][0])); camstats->append(MakePair("MaximumIncidence", cg["incidencemaximum"][0])); cg = camPvl.findGroup("LocalSolarTime", Pvl::Traverse); camstats->append(MakePair("LocalTimeMinimum", cg["localsolartimeMinimum"][0])); camstats->append(MakePair("LocalTimeMaximum", cg["localsolartimeMaximum"][0])); } // Compute statistics for entire cube if(ui.GetBoolean("STATISTICS")) { statistics = new QList< QPair<QString, QString> >; LineManager iline(*incube); Statistics stats; Progress progress; progress.SetText("Statistics..."); progress.SetMaximumSteps(incube->lineCount()*incube->bandCount()); progress.CheckStatus(); iline.SetLine(1); for(; !iline.end() ; iline.next()) { incube->read(iline); stats.AddData(iline.DoubleBuffer(), iline.size()); progress.CheckStatus(); } // Compute stats of entire cube double nPixels = stats.TotalPixels(); double nullpercent = (stats.NullPixels() / (nPixels)) * 100; double hispercent = (stats.HisPixels() / (nPixels)) * 100; double hrspercent = (stats.HrsPixels() / (nPixels)) * 100; double lispercent = (stats.LisPixels() / (nPixels)) * 100; double lrspercent = (stats.LrsPixels() / (nPixels)) * 100; // Statitics output for band statistics->append(MakePair("MeanValue", toString(stats.Average()))); statistics->append(MakePair("StandardDeviation", toString(stats.StandardDeviation()))); statistics->append(MakePair("MinimumValue", toString(stats.Minimum()))); statistics->append(MakePair("MaximumValue", toString(stats.Maximum()))); statistics->append(MakePair("PercentHIS", toString(hispercent))); statistics->append(MakePair("PercentHRS", toString(hrspercent))); statistics->append(MakePair("PercentLIS", toString(lispercent))); statistics->append(MakePair("PercentLRS", toString(lrspercent))); statistics->append(MakePair("PercentNull", toString(nullpercent))); statistics->append(MakePair("TotalPixels", toString(stats.TotalPixels()))); } bool getFootBlob = ui.GetBoolean("USELABEL"); bool doGeometry = ui.GetBoolean("GEOMETRY"); bool doPolygon = ui.GetBoolean("POLYGON"); if(doGeometry || doPolygon || getFootBlob) { Camera *cam = incube->camera(); QString incType = ui.GetString("INCTYPE"); int polySinc, polyLinc; if(doPolygon && incType.toUpper() == "VERTICES") { ImagePolygon poly; poly.initCube(*incube); polySinc = polyLinc = (int)(0.5 + (((poly.validSampleDim() * 2) + (poly.validLineDim() * 2) - 3.0) / ui.GetInteger("NUMVERTICES"))); } else if (incType.toUpper() == "LINCSINC"){ if(ui.WasEntered("POLYSINC")) { polySinc = ui.GetInteger("POLYSINC"); } else { polySinc = (int)(0.5 + 0.10 * incube->sampleCount()); if(polySinc == 0) polySinc = 1; } if(ui.WasEntered("POLYLINC")) { polyLinc = ui.GetInteger("POLYLINC"); } else { polyLinc = (int)(0.5 + 0.10 * incube->lineCount()); if(polyLinc == 0) polyLinc = 1; } } else { QString msg = "Invalid INCTYPE option[" + incType + "]"; throw IException(IException::Programmer, msg, _FILEINFO_); } bandGeom = new BandGeometry(); bandGeom->setSampleInc(polySinc); bandGeom->setLineInc(polyLinc); bandGeom->setMaxIncidence(ui.GetDouble("MAXINCIDENCE")); bandGeom->setMaxEmission(ui.GetDouble("MAXEMISSION")); bool precision = ui.GetBoolean("INCREASEPRECISION"); if (getFootBlob) { // Need to read history to obtain parameters that were used to // create the footprint History hist("IsisCube", in.expanded()); Pvl pvl = hist.ReturnHist(); PvlObject::PvlObjectIterator objIter; bool found = false; PvlGroup fpgrp; for (objIter=pvl.endObject()-1; objIter>=pvl.beginObject(); objIter--) { if (objIter->name().toUpper() == "FOOTPRINTINIT") { found = true; fpgrp = objIter->findGroup("UserParameters"); break; } } if (!found) { QString msg = "Footprint blob was not found in input image history"; throw IException(IException::User, msg, _FILEINFO_); } QString prec = (QString)fpgrp.findKeyword("INCREASEPRECISION"); prec = prec.toUpper(); if (prec == "TRUE") { precision = true; } else { precision = false; } QString inctype = (QString)fpgrp.findKeyword("INCTYPE"); inctype = inctype.toUpper(); if (inctype == "LINCSINC") { int linc = fpgrp.findKeyword("LINC"); int sinc = fpgrp.findKeyword("SINC"); bandGeom->setSampleInc(sinc); bandGeom->setLineInc(linc); } else { int vertices = fpgrp.findKeyword("NUMVERTICES"); int lincsinc = (int)(0.5 + (((incube->sampleCount() * 2) + (incube->lineCount() * 2) - 3.0) / vertices)); bandGeom->setSampleInc(lincsinc); bandGeom->setLineInc(lincsinc); } if (fpgrp.hasKeyword("MAXINCIDENCE")) { double maxinc = fpgrp.findKeyword("MAXINCIDENCE"); bandGeom->setMaxIncidence(maxinc); } if (fpgrp.hasKeyword("MAXEMISSION")) { double maxema = fpgrp.findKeyword("MAXEMISSION"); bandGeom->setMaxEmission(maxema); } } bandGeom->collect(*cam, *incube, doGeometry, doPolygon, getFootBlob, precision); // Check if the user requires valid image center geometry if(ui.GetBoolean("VCAMERA") && (!bandGeom->hasCenterGeometry())) { QString msg = "Image center does not project in camera model"; throw IException(IException::Unknown, msg, _FILEINFO_); } } if(sFormat.toUpper() == "PVL") GeneratePVLOutput(incube, general, camstats, statistics, bandGeom); else GenerateCSVOutput(incube, general, camstats, statistics, bandGeom); // Clean the data delete general; general = NULL; if(camstats) { delete camstats; camstats = NULL; } if(statistics) { delete statistics; statistics = NULL; } if(bandGeom) { delete bandGeom; bandGeom = NULL; } }
//*********************************************************************** // IsisMain() //*********************************************************************** void IsisMain() { UserInterface &ui = Application::GetUserInterface(); FileName in = ui.GetFileName("FROM"); FileName outIr = ui.GetFileName("IR"); FileName outVis = ui.GetFileName("VIS"); Pvl lab(in.expanded()); //Checks if in file is rdr if(lab.hasObject("IMAGE_MAP_PROJECTION")) { QString msg = "[" + in.name() + "] appears to be an rdr file."; msg += " Use pds2isis."; throw IException(IException::User, msg, _FILEINFO_); } //Make sure it is a vims cube try { PvlObject qube(lab.findObject("QUBE")); QString id; id = (QString)qube["INSTRUMENT_ID"]; id = id.simplified().trimmed(); if(id != "VIMS") { QString msg = "Invalid INSTRUMENT_ID [" + id + "]"; throw IException(IException::Unknown, msg, _FILEINFO_); } } catch(IException &e) { QString msg = "Input file [" + in.expanded() + "] does not appear to be " + "in VIMS EDR/RDR format"; throw IException(IException::Io, msg, _FILEINFO_); } FileName tempname(in.baseName() + ".bsq.cub"); Pvl pdsLab(in.expanded()); // It's VIMS, let's figure out if it has the suffix data or not if(toInt(lab.findObject("QUBE")["SUFFIX_ITEMS"][0]) == 0) { // No suffix data, we can use processimportpds ProcessImportPds p; p.SetPdsFile(in.expanded(), "", pdsLab); // Set up the temporary output cube //The temporary cube is set to Real pixeltype, regardless of input pixel type Isis::CubeAttributeOutput outatt = CubeAttributeOutput("+Real"); p.SetOutputCube(tempname.name(), outatt); p.StartProcess(); p.EndProcess(); } else { // We do it the hard way ReadVimsBIL(in.expanded(), lab.findObject("QUBE")["SUFFIX_ITEMS"], tempname.name()); } // Create holder for original labels OriginalLabel origLabel(pdsLab); //Now separate the cubes ProcessByLine l; PvlGroup status("Results"); //VIS cube const PvlObject &qube = lab.findObject("Qube"); if(qube["SAMPLING_MODE_ID"][1] != "N/A") { CubeAttributeInput inattvis = CubeAttributeInput("+1-96"); l.SetInputCube(tempname.name(), inattvis); Cube *oviscube = l.SetOutputCube("VIS"); oviscube->write(origLabel); l.StartProcess(ProcessCube); TranslateVimsLabels(pdsLab, oviscube, VIS); l.EndProcess(); status += PvlKeyword("VisCreated", "true"); } else { status += PvlKeyword("VisCreated", "false"); } //IR cube if(qube["SAMPLING_MODE_ID"][0] != "N/A") { CubeAttributeInput inattir = CubeAttributeInput("+97-352"); l.SetInputCube(tempname.name(), inattir); Cube *oircube = l.SetOutputCube("IR"); oircube->write(origLabel); l.StartProcess(ProcessCube); TranslateVimsLabels(pdsLab, oircube, IR); l.EndProcess(); status += PvlKeyword("IrCreated", "true"); } else { status += PvlKeyword("IrCreated", "false"); } Application::Log(status); //Clean up QString tmp(tempname.expanded()); QFile::remove(tmp); }