30 #include <getSpkAbCorrState.hpp>
59 Spice::Spice(
Pvl &lab) {
61 bool hasTables = (kernels[
"TargetPosition"][0] ==
"Table");
63 init(lab, !hasTables);
92 bool hasTables = (kernels[
"TargetPosition"][0] ==
"Table");
94 init(lab, !hasTables);
103 Spice::Spice(
Cube &cube,
bool noTables) {
104 init(*cube.
label(), noTables);
120 void Spice::init(
Pvl &lab,
bool noTables) {
121 NaifStatus::CheckErrors();
128 m_startTime =
new iTime;
129 m_endTime =
new iTime;
130 m_cacheSize =
new SpiceDouble;
133 m_startTimePadding =
new SpiceDouble;
134 *m_startTimePadding = 0;
135 m_endTimePadding =
new SpiceDouble;
136 *m_endTimePadding = 0;
138 m_instrumentPosition = NULL;
139 m_instrumentRotation = NULL;
140 m_sunPosition = NULL;
141 m_bodyRotation = NULL;
143 m_allowDownsizing =
false;
145 m_spkCode =
new SpiceInt;
146 m_ckCode =
new SpiceInt;
147 m_ikCode =
new SpiceInt;
148 m_sclkCode =
new SpiceInt;
149 m_spkBodyCode =
new SpiceInt;
150 m_bodyFrameCode =
new SpiceInt;
152 m_naifKeywords =
new PvlObject(
"NaifKeywords");
161 *m_startTimePadding =
toDouble(kernels[
"StartPadding"][0]);
164 *m_startTimePadding = 0.0;
168 *m_endTimePadding =
toDouble(kernels[
"EndPadding"][0]);
171 *m_endTimePadding = 0.0;
174 m_usingNaif = !lab.
hasObject(
"NaifKeywords") || noTables;
181 load(kernels[
"TargetPosition"], noTables);
182 load(kernels[
"InstrumentPosition"], noTables);
183 load(kernels[
"InstrumentPointing"], noTables);
187 load(kernels[
"Frame"], noTables);
190 load(kernels[
"TargetAttitudeShape"], noTables);
192 load(kernels[
"Instrument"], noTables);
195 if (kernels.
hasKeyword(
"InstrumentAddendum")) {
196 load(kernels[
"InstrumentAddendum"], noTables);
198 load(kernels[
"LeapSecond"], noTables);
200 load(kernels[
"SpacecraftClock"], noTables);
206 load(kernels[
"Extra"], noTables);
213 m_target =
new Target(
this, lab);
220 if (m_target->name().toUpper() ==
"SATURN" && m_target->shape()->name().toUpper() ==
"PLANE") {
222 load(ringPck, noTables);
226 *m_naifKeywords = lab.
findObject(
"NaifKeywords");
232 m_target =
new Target(
this, lab);
252 QString trykey =
"NaifIkCode";
253 if (kernels.
hasKeyword(
"NaifFrameCode")) trykey =
"NaifFrameCode";
254 *m_ikCode =
toInt(kernels[trykey][0]);
256 *m_spkCode = *m_ikCode / 1000;
257 *m_sclkCode = *m_spkCode;
258 *m_ckCode = *m_ikCode;
260 if (!m_target->isSky()) {
261 QString radiiKey =
"BODY" +
Isis::toString(m_target->naifBodyCode()) +
"_RADII";
262 std::vector<Distance> radii(3,
Distance());
263 radii[0] =
Distance(getDouble(radiiKey, 0), Distance::Kilometers);
264 radii[1] =
Distance(getDouble(radiiKey, 1), Distance::Kilometers);
265 radii[2] =
Distance(getDouble(radiiKey, 2), Distance::Kilometers);
267 m_target->setRadii(radii);
269 *m_spkBodyCode = m_target->naifBodyCode();
273 *m_spkCode = (int) kernels[
"NaifSpkCode"];
277 *m_ckCode = (int) kernels[
"NaifCkCode"];
281 *m_sclkCode = (int) kernels[
"NaifSclkCode"];
284 if (!m_target->isSky()) {
286 *m_spkBodyCode = (int) kernels[
"NaifSpkBodyCode"];
290 if (m_target->isSky()) {
298 if ((m_usingNaif) || (!m_naifKeywords->hasKeyword(
"BODY_FRAME_CODE"))) {
301 cidfrm_c(*m_spkBodyCode,
sizeof(frameName), &frameCode, frameName, &found);
304 QString naifTarget =
"IAU_" + m_target->name().toUpper();
305 namfrm_c(naifTarget.toLatin1().data(), &frameCode);
306 if (frameCode == 0) {
307 QString msg =
"Can not find NAIF BODY_FRAME_CODE for target ["
308 + m_target->name() +
"]";
313 QVariant result = (int)frameCode;
314 storeValue(
"BODY_FRAME_CODE", 0, SpiceIntType, result);
317 frameCode = getInteger(
"BODY_FRAME_CODE", 0);
321 *m_bodyFrameCode = frameCode;
331 vector<Distance> radius = m_target->radii();
332 Distance targetRadius((radius[0] + radius[2])/2.0);
334 ltState, targetRadius);
336 m_sunPosition =
new SpicePosition(10, m_target->naifBodyCode());
340 if (kernels[
"TargetPosition"][0].toUpper() ==
"TABLE") {
342 m_sunPosition->LoadCache(t);
345 m_bodyRotation->LoadCache(t2);
346 if (t2.Label().hasKeyword(
"SolarLongitude")) {
347 *m_solarLongitude =
Longitude(t2.Label()[
"SolarLongitude"],
361 if (kernels[
"InstrumentPointing"].size() == 0) {
363 "No camera pointing available",
369 if (kernels[
"InstrumentPointing"][0].toUpper() ==
"NADIR") {
370 if (m_instrumentRotation) {
371 delete m_instrumentRotation;
372 m_instrumentRotation = NULL;
375 m_instrumentRotation =
new SpiceRotation(*m_ikCode, *m_spkBodyCode);
377 else if (kernels[
"InstrumentPointing"][0].toUpper() ==
"TABLE") {
379 m_instrumentRotation->LoadCache(t);
382 if (kernels[
"InstrumentPosition"].size() == 0) {
384 "No instrument position available",
388 if (kernels[
"InstrumentPosition"][0].toUpper() ==
"TABLE") {
390 m_instrumentPosition->LoadCache(t);
393 NaifStatus::CheckErrors();
406 NaifStatus::CheckErrors();
408 for (
int i = 0; i < key.
size(); i++) {
409 if (key[i] ==
"")
continue;
410 if (key[i].toUpper() ==
"NULL")
break;
411 if (key[i].toUpper() ==
"NADIR")
break;
412 if (key[i].toUpper() ==
"TABLE" && !noTables)
break;
413 if (key[i].toUpper() ==
"TABLE" && noTables)
continue;
415 if (!file.fileExists()) {
416 QString msg =
"Spice file does not exist [" + file.expanded() +
"]";
419 QString fileName = file.expanded();
420 furnsh_c(fileName.toLatin1().data());
421 m_kernels->push_back(key[i]);
424 NaifStatus::CheckErrors();
431 NaifStatus::CheckErrors();
433 if (m_solarLongitude != NULL) {
434 delete m_solarLongitude;
435 m_solarLongitude = NULL;
443 if (m_startTime != NULL) {
448 if (m_endTime != NULL) {
453 if (m_cacheSize != NULL) {
458 if (m_startTimePadding != NULL) {
459 delete m_startTimePadding;
460 m_startTimePadding = NULL;
463 if (m_endTimePadding != NULL) {
464 delete m_endTimePadding;
465 m_endTimePadding = NULL;
468 if (m_instrumentPosition != NULL) {
469 delete m_instrumentPosition;
470 m_instrumentPosition = NULL;
473 if (m_instrumentRotation != NULL) {
474 delete m_instrumentRotation;
475 m_instrumentRotation = NULL;
478 if (m_sunPosition != NULL) {
479 delete m_sunPosition;
480 m_sunPosition = NULL;
483 if (m_bodyRotation != NULL) {
484 delete m_bodyRotation;
485 m_bodyRotation = NULL;
488 if (m_spkCode != NULL) {
493 if (m_ckCode != NULL) {
498 if (m_ikCode != NULL) {
503 if (m_sclkCode != NULL) {
508 if (m_spkBodyCode != NULL) {
509 delete m_spkBodyCode;
510 m_spkBodyCode = NULL;
513 if (m_bodyFrameCode != NULL) {
514 delete m_bodyFrameCode;
515 m_bodyFrameCode = NULL;
518 if (m_target != NULL) {
524 for (
int i = 0; m_kernels && i < m_kernels->size(); i++) {
526 QString fileName = file.expanded();
527 unload_c(fileName.toLatin1().data());
530 if (m_kernels != NULL) {
535 NaifStatus::CheckErrors();
570 int cacheSize,
double tol) {
571 NaifStatus::CheckErrors();
574 if (cacheSize <= 0) {
575 QString msg =
"Argument cacheSize must be greater than zero";
579 if (startTime > endTime) {
580 QString msg =
"Argument startTime must be less than or equal to endTime";
584 if (*m_cacheSize > 0) {
585 QString msg =
"A cache has already been created";
589 if (cacheSize == 1 && (*m_startTimePadding != 0 || *m_endTimePadding != 0)) {
590 QString msg =
"This instrument does not support time padding";
595 if (getSpkAbCorrState(abcorr)) {
596 instrumentPosition()->SetAberrationCorrection(
"NONE");
599 iTime avgTime((startTime.
Et() + endTime.
Et()) / 2.0);
600 computeSolarLongitude(avgTime);
603 if (!m_bodyRotation->IsCached()) {
604 int bodyRotationCacheSize = cacheSize;
605 if (cacheSize > 2) bodyRotationCacheSize = 2;
606 m_bodyRotation->LoadCache(
607 startTime.
Et() - *m_startTimePadding,
608 endTime.
Et() + *m_endTimePadding,
609 bodyRotationCacheSize);
612 if (m_instrumentRotation->GetSource() < SpiceRotation::Memcache) {
613 if (cacheSize > 3) m_instrumentRotation->MinimizeCache(SpiceRotation::Yes);
614 m_instrumentRotation->LoadCache(
615 startTime.
Et() - *m_startTimePadding,
616 endTime.
Et() + *m_endTimePadding,
620 if (m_instrumentPosition->GetSource() < SpicePosition::Memcache) {
621 m_instrumentPosition->LoadCache(
622 startTime.
Et() - *m_startTimePadding,
623 endTime.
Et() + *m_endTimePadding,
625 if (cacheSize > 3) m_instrumentPosition->Memcache2HermiteCache(tol);
628 if (!m_sunPosition->IsCached()) {
629 int sunPositionCacheSize = cacheSize;
630 if (cacheSize > 2) sunPositionCacheSize = 2;
631 m_sunPosition->LoadCache(
632 startTime.
Et() - *m_startTimePadding,
633 endTime.
Et() + *m_endTimePadding,
634 sunPositionCacheSize);
638 *m_startTime = startTime;
639 *m_endTime = endTime;
640 *m_cacheSize = cacheSize;
644 for (
int i = 0; i < m_kernels->size(); i++) {
646 QString fileName = file.expanded();
647 unload_c(fileName.toLatin1().data());
652 NaifStatus::CheckErrors();
663 iTime Spice::cacheStartTime()
const {
700 void Spice::setTime(
const iTime &et) {
710 if (*m_cacheSize == 0) {
711 if (m_startTime->Et() == 0.0 && m_endTime->Et() == 0.0
712 && getSpkAbCorrState(abcorr)) {
713 instrumentPosition()->SetAberrationCorrection(
"NONE");
720 m_bodyRotation->SetEphemerisTime(et.
Et());
721 m_instrumentRotation->SetEphemerisTime(et.
Et());
722 m_instrumentPosition->SetEphemerisTime(et.
Et());
723 m_sunPosition->SetEphemerisTime(et.
Et());
725 std::vector<double> uB = m_bodyRotation->ReferenceVector(m_sunPosition->Coordinate());
730 computeSolarLongitude(*m_et);
742 void Spice::instrumentPosition(
double p[3])
const {
743 instrumentBodyFixedPosition(p);
755 void Spice::instrumentBodyFixedPosition(
double p[3])
const {
757 QString msg =
"Unable to retrieve instrument's body fixed position."
758 " Spice::SetTime must be called first.";
762 std::vector<double> sB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
773 void Spice::instrumentBodyFixedVelocity(
double v[3])
const {
775 QString msg =
"Unable to retrieve instrument's body fixed velocity."
776 " Spice::SetTime must be called first.";
780 std::vector<double> state;
781 state.push_back(m_instrumentPosition->Coordinate()[0]);
782 state.push_back(m_instrumentPosition->Coordinate()[1]);
783 state.push_back(m_instrumentPosition->Coordinate()[2]);
784 state.push_back(m_instrumentPosition->Velocity()[0]);
785 state.push_back(m_instrumentPosition->Velocity()[1]);
786 state.push_back(m_instrumentPosition->Velocity()[2]);
788 std::vector<double> vB = m_bodyRotation->ReferenceVector(state);
806 QString msg =
"Unable to retrieve the time."
807 " Spice::SetTime must be called first.";
822 void Spice::sunPosition(
double p[3])
const {
824 QString msg =
"Unable to retrieve sun's position."
825 " Spice::SetTime must be called first.";
838 double Spice::targetCenterDistance()
const {
839 std::vector<double> sB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
840 return sqrt(pow(sB[0], 2) + pow(sB[1], 2) + pow(sB[2], 2));
851 for (
int i = 0; i < 3; i++)
852 r[i] =m_target->radii()[i];
861 SpiceInt Spice::naifBodyCode()
const {
862 return (
int) m_target->naifBodyCode();
870 SpiceInt Spice::naifSpkCode()
const {
879 SpiceInt Spice::naifCkCode()
const {
888 SpiceInt Spice::naifIkCode()
const {
898 SpiceInt Spice::naifSclkCode()
const {
909 SpiceInt Spice::naifBodyFrameCode()
const {
910 return *m_bodyFrameCode;
919 return *m_naifKeywords;
928 double Spice::resolution() {
944 SpiceInt Spice::getInteger(
const QString &key,
int index) {
945 return readValue(key, SpiceIntType, index).toInt();
958 SpiceDouble Spice::getDouble(
const QString &key,
int index) {
959 return readValue(key, SpiceDoubleType, index).toDouble();
969 iTime Spice::getClockTime(QString clockValue,
int sclkCode) {
970 if (sclkCode == -1) {
971 sclkCode = naifSclkCode();
976 QString key =
"CLOCK_ET_" +
Isis::toString(sclkCode) +
"_" + clockValue;
977 QVariant storedClockTime = getStoredResult(key, SpiceDoubleType);
979 if (storedClockTime.isNull()) {
980 SpiceDouble timeOutput;
981 NaifStatus::CheckErrors();
982 scs2e_c(sclkCode, clockValue.toLatin1().data(), &timeOutput);
983 NaifStatus::CheckErrors();
984 storedClockTime = timeOutput;
985 storeResult(key, SpiceDoubleType, timeOutput);
988 result = storedClockTime.toDouble();
1008 NaifStatus::CheckErrors();
1011 SpiceBoolean found =
false;
1015 SpiceInt numValuesRead;
1017 if (type == SpiceDoubleType) {
1018 SpiceDouble kernelValue;
1019 gdpool_c(key.toLatin1().data(), (SpiceInt)index, 1,
1020 &numValuesRead, &kernelValue, &found);
1023 result = kernelValue;
1025 else if (type == SpiceStringType) {
1026 char kernelValue[512];
1027 gcpool_c(key.toLatin1().data(), (SpiceInt)index, 1,
sizeof(kernelValue),
1028 &numValuesRead, kernelValue, &found);
1031 result = kernelValue;
1033 else if (type == SpiceIntType) {
1034 SpiceInt kernelValue;
1035 gipool_c(key.toLatin1().data(), (SpiceInt)index, 1, &numValuesRead,
1036 &kernelValue, &found);
1039 result = (int)kernelValue;
1043 QString msg =
"Can not find [" + key +
"] in text kernels";
1047 storeValue(key, index, type, result);
1048 NaifStatus::CheckErrors();
1052 result = readStoredValue(key, type, index);
1054 if (result.isNull()) {
1055 QString msg =
"The camera is requesting spice data [" + key +
"] that "
1056 "was not attached, please re-run spiceinit";
1065 void Spice::storeResult(QString name, SpiceValueType type, QVariant value) {
1066 if (type == SpiceDoubleType) {
1069 double doubleVal = value.toDouble();
1070 doubleVal = swapper.Double(&doubleVal);
1071 QByteArray byteCode((
char *) &doubleVal,
sizeof(
double));
1073 type = SpiceByteCodeType;
1076 storeValue(name +
"_COMPUTED", 0, type, value);
1080 QVariant Spice::getStoredResult(QString name, SpiceValueType type) {
1081 bool wasDouble =
false;
1083 if (type == SpiceDoubleType) {
1085 type = SpiceByteCodeType;
1088 QVariant stored = readStoredValue(name +
"_COMPUTED", type, 0);
1090 if (wasDouble && !stored.isNull()) {
1091 EndianSwapper swapper(
"LSB");
1092 double doubleVal = swapper.Double((
void *)QByteArray::fromHex(
1093 stored.toByteArray()).data());
1101 void Spice::storeValue(QString key,
int index, SpiceValueType type,
1103 if (!m_naifKeywords->hasKeyword(key)) {
1104 m_naifKeywords->addKeyword(PvlKeyword(key));
1107 PvlKeyword &storedKey = m_naifKeywords->findKeyword(key);
1109 while(index >= storedKey.size()) {
1110 storedKey.addValue(
"");
1113 if (type == SpiceByteCodeType) {
1114 storedKey[index] = QString(value.toByteArray().toHex().data());
1116 else if (type == SpiceStringType) {
1117 storedKey[index] = value.toString();
1119 else if (type == SpiceDoubleType) {
1120 storedKey[index] =
toString(value.toDouble());
1122 else if (type == SpiceIntType) {
1123 storedKey[index] =
toString(value.toInt());
1126 QString msg =
"Unable to store variant in labels for key [" + key +
"]";
1127 throw IException(IException::Unknown, msg,
_FILEINFO_);
1132 QVariant Spice::readStoredValue(QString key, SpiceValueType type,
1137 if (m_naifKeywords->hasKeyword(key) && !m_usingNaif) {
1138 PvlKeyword &storedKeyword = m_naifKeywords->findKeyword(key);
1141 if (type == SpiceDoubleType) {
1142 result =
toDouble(storedKeyword[index]);
1144 else if (type == SpiceStringType) {
1145 result = storedKeyword[index];
1147 else if (type == SpiceByteCodeType || SpiceStringType) {
1148 result = storedKeyword[index].toLatin1();
1150 else if (type == SpiceIntType) {
1151 result =
toInt(storedKeyword[index]);
1154 catch(IException &) {
1172 QString Spice::getString(
const QString &key,
int index) {
1173 return readValue(key, SpiceStringType, index).toString();
1189 void Spice::subSpacecraftPoint(
double &lat,
double &lon) {
1190 NaifStatus::CheckErrors();
1193 QString msg =
"Unable to retrieve subspacecraft position."
1194 " Spice::SetTime must be called first.";
1198 SpiceDouble usB[3], dist;
1199 std::vector<double> vsB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
1204 unorm_c(sB, usB, &dist);
1206 std::vector<Distance> radii = target()->radii();
1207 SpiceDouble a = radii[0].kilometers();
1208 SpiceDouble b = radii[1].kilometers();
1209 SpiceDouble c = radii[2].kilometers();
1211 SpiceDouble originB[3];
1212 originB[0] = originB[1] = originB[2] = 0.0;
1215 SpiceDouble subB[3];
1216 surfpt_c(originB, usB, a, b, c, subB, &found);
1218 SpiceDouble mylon, mylat;
1219 reclat_c(subB, &a, &mylon, &mylat);
1220 lat = mylat * 180.0 /
PI;
1221 lon = mylon * 180.0 /
PI;
1222 if (lon < 0.0) lon += 360.0;
1224 NaifStatus::CheckErrors();
1238 void Spice::subSolarPoint(
double &lat,
double &lon) {
1239 NaifStatus::CheckErrors();
1242 QString msg =
"Unable to retrieve subsolar point."
1243 " Spice::SetTime must be called first.";
1247 SpiceDouble uuB[3], dist;
1248 unorm_c(m_uB, uuB, &dist);
1250 std::vector<Distance> radii = target()->radii();
1251 SpiceDouble a = radii[0].kilometers();
1252 SpiceDouble b = radii[1].kilometers();
1253 SpiceDouble c = radii[2].kilometers();
1255 SpiceDouble originB[3];
1256 originB[0] = originB[1] = originB[2] = 0.0;
1259 SpiceDouble subB[3];
1260 surfpt_c(originB, uuB, a, b, c, subB, &found);
1262 SpiceDouble mylon, mylat;
1263 reclat_c(subB, &a, &mylon, &mylat);
1264 lat = mylat * 180.0 /
PI;
1265 lon = mylon * 180.0 /
PI;
1266 if (lon < 0.0) lon += 360.0;
1268 NaifStatus::CheckErrors();
1287 QString Spice::targetName()
const {
1288 return m_target->
name();
1298 void Spice::computeSolarLongitude(
iTime et) {
1299 NaifStatus::CheckErrors();
1301 if (m_target->isSky()) {
1306 if (m_bodyRotation->IsCached())
return;
1308 double tipm[3][3], npole[3];
1313 cidfrm_c(*m_spkBodyCode,
sizeof(frameName), &frameCode, frameName, &found);
1316 pxform_c(
"J2000", frameName, et.
Et(), tipm);
1319 tipbod_c(
"J2000", *m_spkBodyCode, et.
Et(), tipm);
1322 for (
int i = 0; i < 3; i++) {
1323 npole[i] = tipm[2][i];
1326 double state[6], lt;
1327 spkez_c(*m_spkBodyCode, et.
Et(),
"J2000",
"NONE", 10, state, <);
1330 ucrss_c(state, &state[3], uavel);
1332 double x[3], y[3], z[3];
1334 ucrss_c(npole, z, x);
1338 for (
int i = 0; i < 3; i++) {
1344 spkez_c(10, et.
Et(),
"J2000",
"LT+S", *m_spkBodyCode, state, <);
1347 mxv_c(trans, state, pos);
1349 double radius, ls, lat;
1350 reclat_c(pos, &radius, &ls, &lat);
1354 NaifStatus::CheckErrors();
1365 computeSolarLongitude(*m_et);
1366 return *m_solarLongitude;
1380 bool Spice::hasKernels(
Pvl &lab) {
1384 std::vector<string> keywords;
1385 keywords.push_back(
"TargetPosition");
1387 if (kernels.
hasKeyword(
"SpacecraftPosition")) {
1388 keywords.push_back(
"SpacecraftPosition");
1391 keywords.push_back(
"InstrumentPosition");
1394 if (kernels.
hasKeyword(
"SpacecraftPointing")) {
1395 keywords.push_back(
"SpacecraftPointing");
1398 keywords.push_back(
"InstrumentPointing");
1402 keywords.push_back(
"Frame");
1406 keywords.push_back(
"Extra");
1410 for (
int ikey = 0; ikey < (int) keywords.size(); ikey++) {
1411 key = kernels[ikey];
1413 for (
int i = 0; i < key.
size(); i++) {
1414 if (key[i] ==
"")
return false;
1415 if (key[i].toUpper() ==
"NULL")
return false;
1416 if (key[i].toUpper() ==
"NADIR")
return false;
1417 if (key[i].toUpper() ==
"TABLE")
return false;
1431 bool Spice::isTimeSet(){
1432 return !(m_et == NULL);
1444 return m_sunPosition;
1455 return m_instrumentPosition;
1466 return m_bodyRotation;
1477 return m_instrumentRotation;
Provides swap observer/target and improved light time correction.
int size() const
Returns the number of values stored in this keyword.
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
File name manipulation and expansion.
Parse and return pieces of a time string.
SpiceValueType
NAIF value primitive type.
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
Pvl * label() const
Returns a pointer to the IsisLabel object associated with the cube.
const double PI(3.14159265358979323846)
The mathematical constant PI.
int toInt(const QString &string)
Global function to convert from a string to an integer.
Provides interface to user configurable Light Time correction feature.
QString fileName() const
Returns the filename used to initialise the Pvl object.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
double toDouble(const QString &string)
Global function to convert from a string to a double.
Distance measurement, usually in meters.
double Et() const
Returns the ephemeris time (TDB) representation of the time as a double.
Longitude force360Domain() const
This returns a longitude that is constricted to 0-360 degrees.
This class is designed to encapsulate the concept of a Longitude.
QString name() const
Return target name.
Contains multiple PvlContainers.
#define _FILEINFO_
Macro for the filename and line number.
A single keyword-value pair.
Obtain SPICE rotation information for a body.
Container for cube-like labels.
This class is used to create and store valid Isis3 targets.
bool checkSpkKernelsForAberrationCorrection()
Check for light time/stellar aberration tag in SPK comments.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
bool hasObject(const QString &name) const
Returns a boolean value based on whether the object exists in the current PvlObject or not...
Class for storing Table blobs information.
Obtain SPICE position information for a body.
Contains Pvl Groups and Pvl Objects.
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
IO Handler for Isis Cubes.