14#include "CameraFactory.h"
16#include "IException.h"
20#include "Preference.h"
21#include "Preference.h"
23#include "PvlKeyword.h"
77 m_kernelData(dbName) {
156 return findLast(
"TargetAttitudeShape", lab);
177 return findLast(
"TargetPosition", lab);
198 return findAll(
"SpacecraftPointing", lab);
218 return findLast(
"SpacecraftClock", lab);
239 return findLast(
"SpacecraftPosition", lab);
301 return findLast(
"InstrumentAddendum", lab);
340 QList< priority_queue<Kernel> > queues =
findAll(entry, lab);
343 if (queues.size() > 0 && queues.at(0).size() > 0) {
344 lastKernel = queues.at(0).top();
368 QList< priority_queue<Kernel> > queues;
370 int cameraVersion = -1;
380 priority_queue<Kernel> emptyKernelQueue;
381 emptyKernelQueue.push(
Kernel());
382 queues.push_back(emptyKernelQueue);
391 start = (QString) cube.
findGroup(
"Instrument")[
"StartTime"];
393 if (cube.
findGroup(
"Instrument").hasKeyword(
"StopTime")) {
394 end = ((QString) cube.
findGroup(
"Instrument")[
"StopTime"]);
397 end = ((QString) cube.
findGroup(
"Instrument")[
"StartTime"]);
404 priority_queue<Kernel> filesFound;
407 for (
int groupIndex = obj.groups() - 1; groupIndex >= 0; groupIndex--) {
410 PvlGroup &grp = obj.group(groupIndex);
413 if (!grp.isNamed(
"Selection"))
continue;
418 if (grp.hasKeyword(
"Type")) {
419 type = (QString) grp[
"Type"];
432 bool startMatches =
matches(lab, grp, start, cameraVersion);
433 bool endMatches =
matches(lab, grp, end, cameraVersion);
435 if (startMatches && endMatches) {
440 else if (startMatches) {
443 for (
int endTimeIndex = obj.groups() - 1;
447 PvlGroup &endTimeGrp = obj.group(endTimeIndex);
457 if (endTimeIndex == groupIndex)
continue;
458 if (!endTimeGrp.isNamed(
"Selection"))
continue;
459 if (grp.hasKeyword(
"Type") != endTimeGrp.hasKeyword(
"Type"))
continue;
460 if (grp.hasKeyword(
"Type") &&
461 grp[
"Type"] != endTimeGrp[
"Type"])
continue;
462 if (!
matches(lab, endTimeGrp, end, cameraVersion))
continue;
465 bool betterMatch =
false;
468 bool endTimesMatch =
true;
471 for (
int keyIndex = 0;
472 !betterMatch && keyIndex < grp.keywords();
476 if (!key.
isNamed(
"Time"))
continue;
478 iTime timeRangeStart((QString)key[0]);
479 iTime timeRangeEnd((QString)key[1]);
481 bool thisEndMatches =
matches(lab, endTimeGrp,
482 timeRangeEnd, cameraVersion);
483 endTimesMatch = endTimesMatch && thisEndMatches;
485 if (
matches(lab, endTimeGrp, start, cameraVersion)
486 &&
matches(lab, endTimeGrp, end, cameraVersion)) {
494 if (!betterMatch && endTimesMatch) {
498 while (endMatchFiles.size()) {
499 startMatchFiles.push_back(endMatchFiles[endMatchFiles.size() - 1]);
500 endMatchFiles.pop_back();
507 else if (betterMatch) {
515 queues.push_back(filesFound);
519 if (queues.size() == 0) {
520 priority_queue<Kernel> emptyKernelQueue;
521 emptyKernelQueue.push(
Kernel());
522 queues.push_back(emptyKernelQueue);
572 iTime timeToMatch,
int cameraVersion) {
582 bool matchTime = !grp.hasKeyword(
"Time");
583 bool matchKeywords =
true;
584 double startOffset = 0;
585 double endOffset = 0;
588 if (grp.hasKeyword(
"StartOffset")){
589 startOffset = (double) grp[
"StartOffset"] + 0.001;
591 if (grp.hasKeyword(
"EndOffset")){
592 endOffset = (double) grp[
"EndOffset"] + 0.001;
594 if (grp.hasKeyword(
"Instrument")){
601 for (
int keyword = 0; keyword < grp.keywords(); keyword++) {
607 iTime kernelStart = (QString) key[0];
608 iTime kernelEnd = (QString) key[1];
612 if ((kernelStart - startOffset <= timeToMatch) && (kernelEnd + endOffset >= timeToMatch)) {
619 QString instId = (QString) inst.
findKeyword(
"InstrumentId");
626 else if (key.
isNamed(
"Match")) {
628 QString matchGroup = key[0];
629 QString matchKey = key[1];
630 QString matchValue = key[2];
632 QString cubeValue = cube.
findGroup(matchGroup)[matchKey];
633 cubeValue = cubeValue.simplified().trimmed().toUpper();
634 matchValue = matchValue.simplified().trimmed().toUpper();
637 if (cubeValue.compare(matchValue) != 0) {
638 matchKeywords =
false;
643 matchKeywords =
false;
646 else if (key.
isNamed(
"CameraVersion")) {
648 for (
int camVersionKeyIndex = 0;
649 camVersionKeyIndex < key.
size();
650 camVersionKeyIndex++) {
652 bool versionMatch =
false;
653 IString val = key[camVersionKeyIndex];
656 while ((commaTok = val.Token(
",")).ToQt().length() > 0) {
657 if (commaTok.find(
'-') != string::npos) {
660 int end = commaTok.Token(
"-").ToInteger();
662 direction = (start <= end) ? 1 : -1;
664 for (
int version = start;
665 version != end + direction;
666 version += direction) {
667 if (version == cameraVersion) {
674 if (commaTok.ToInteger() == cameraVersion) {
681 matchKeywords =
false;
686 matchKeywords =
false;
691 return matchKeywords && matchTime;
734 PvlGroup &dataDir = Preference::Preferences().findGroup(
"DataDirectory");
735 QString baseDir = dataDir[
"Base"];
738 QString missionDir = dataDir[mission];
752 FileName tpDbPath(missionDir +
"/kernels/tspk");
753 if (tpDbPath.fileExists()) {
805 QString directory,
const Pvl &lab) {
807 FileName configFile = directory +
"/kernels.????.conf";
808 bool noConfigFile =
false;
811 configFile = configFile.highestVersion();
817 FileName kernelDb(directory +
"/kernels.????.db");
822 bool foundMatch =
false;
824 for (
int groupIndex = 0; groupIndex < inst.groups(); groupIndex++) {
826 PvlGroup &grp = inst.group(groupIndex);
828 if (grp.isNamed(
"Selection")
832 for (
int keyIndex = 0; keyIndex < grp.keywords(); keyIndex++) {
835 QString dir = dataDir[keyword[0]];
836 FileName kernelDb( dir +
"/" + keyword[1]);
872 QString msg =
"Unable to read kernel database file ["
873 + kernelDbFile.expanded() +
"].";
903 for (
int i = 0; i < grp.keywords(); i++) {
905 if (kfile.name() !=
"File")
continue;
910 if (kfile.size() == 2) {
911 QString pref = kfile[0];
912 QString version = kfile[1];
913 FileName filename(
"$" + pref +
"/" + version);
919 else if (kfile.size() == 1) {
926 QString msg =
"Invalid File keyword value in [Group = ";
927 msg += grp.name() +
"] in database file [";
static int CameraVersion(Cube &cube)
This looks up the current camera model version from the cube.
File name manipulation and expansion.
QString name() const
Returns the name of the file excluding the path and the attributes in the file name.
FileName highestVersion() const
Searches the directory specified in the file name for the highest version of the file name.
QString originalPath() const
Returns the path of the original file name.
bool isVersioned() const
Checks to see if a file name is versioned by date or numerically.
@ Unknown
A type of error that cannot be classified as any of the other error types.
Adds specific functionality to C++ strings.
int ToInteger() const
Returns the object string as an integer.
IString Token(const IString &separator)
Returns the first token in the IString.
Kernel instrumentAddendum(Pvl &lab)
This method finds the highest version of all Instrument Addendum kernels (iak) identified by the data...
QStringList files(PvlGroup &grp)
This method retrieves the values of all of the "File" keywords in the given PvlGroup.
Kernel spacecraftClock(Pvl &lab)
This method finds the highest version of all Spacecraft Clock kernels (sclk) identified by the databa...
Kernel targetAttitudeShape(Pvl &lab)
This method finds the highest version of all Target Attitude Shape kernels (pck) identified by the da...
void loadKernelDbFiles(PvlGroup &dataDir, QString directory, const Pvl &lab)
This method is called by loadSystemDb() to create a list of all appropriate kernel database files to ...
QList< FileName > m_kernelDbFiles
List of the kernel database file names that were read in when the loadSystemDb() method is called.
Kernel instrument(Pvl &lab)
This method finds the last Instrument kernel found that matches the (ik) criteria in the database and...
~KernelDb()
Destructs KernelDb object.
void loadSystemDb(const QString &mission, const Pvl &lab)
Loads the appropriate kernel database files with the defined BASE and MISSION info for each type of k...
static bool matches(const Pvl &lab, PvlGroup &kernelDbGrp, iTime timeToMatch, int cameraVersion)
This static method determines whether the given cube label matches the given criteria.
Kernel targetPosition(Pvl &lab)
This method finds the highest version of all Target Position kernels (tspk) identified by the databas...
Kernel findLast(const QString &entry, Pvl &lab)
Finds the highest priority Kernel object for the given entry based on the allowed Kernel types.
Pvl m_kernelData
Pvl containing the information in the kernel database(s) that is read in from the constructor and whe...
QList< std::priority_queue< Kernel > > findAll(const QString &entry, Pvl &lab)
Finds all of the Kernel objects for the given entry value based on the allowed Kernel types.
QString m_filename
The name of the kernel database file.
Kernel spacecraftPosition(Pvl &lab)
This method finds the highest version of all Spacecraft Position kernels (spk) identified by the data...
unsigned int m_allowedKernelTypes
This integer value represents which Kernel::Types are allowed.
Kernel frame(Pvl &lab)
This method finds the highest version of all Frame kernels (fk) identified by the database and the al...
QList< std::priority_queue< Kernel > > spacecraftPointing(Pvl &lab)
This method finds a list of the highest versions of all Spacecraft Pointing kernels (ck) identified b...
QList< FileName > kernelDbFiles()
Accessor method to retrieve the list of kernel database files that were read in when loadSystemDb() i...
Kernel dem(Pvl &lab)
This method finds the highest version of all Digital Terrain Models (DEMs) found that match the crite...
Kernel leapSecond(Pvl &lab)
This method finds the top priority of all Leap Second kernels (lsk) identified by the database and th...
void readKernelDbFiles()
This method is called by loadSystemDb() to read kernel database file list compiled by loadKernelDbFil...
KernelDb(const unsigned int allowedKernelTypes)
Constructs a new KernelDb object with a given integer value representing the Kernel::Type enumeration...
This class stores Kernel information, including Type and kernel file names.
static Type typeEnum(const QString &type)
Converts the given string to a character as follows.
bool isNamed(const QString &match) const
Returns whether the given string is equal to the container name or not.
PvlKeyword & findKeyword(const QString &name)
Find a keyword with a specified name.
Contains multiple PvlContainers.
Container for cube-like labels.
void read(const QString &file)
Loads PVL information from a stream.
A single keyword-value pair.
int size() const
Returns the number of values stored in this keyword.
bool isNamed(QString name) const
Determines whether two PvlKeywords have the same name or not.
Contains Pvl Groups and Pvl Objects.
bool hasObject(const QString &name) const
Returns a boolean value based on whether the object exists in the current PvlObject or not.
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
int objects() const
Returns the number of objects.
PvlObject & object(const int index)
Return the object at the specified index.
bool hasGroup(const QString &name) const
Returns a boolean value based on whether the object has the specified group or not.
@ Traverse
Search child objects.
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
Parse and return pieces of a time string.
This is free and unencumbered software released into the public domain.
Namespace for the standard library.