37 CubeCalculator::CubeCalculator() {
38 m_calculations = NULL;
40 m_dataDefinitions = NULL;
43 m_cameraBuffers = NULL;
57 CubeCalculator::~CubeCalculator() {
60 delete m_calculations;
62 delete m_dataDefinitions;
65 delete m_cameraBuffers;
67 m_calculations = NULL;
69 m_dataDefinitions = NULL;
72 m_cameraBuffers = NULL;
79 void CubeCalculator::Clear() {
83 m_calculations->clear();
90 if (m_dataDefinitions) {
91 m_dataDefinitions->clear();
96 for (
int i = 0; i < m_cubeStats->size(); i++) {
97 delete (*m_cubeStats)[i];
98 (*m_cubeStats)[i] = NULL;
100 m_cubeStats->clear();
104 m_cubeCameras->clear();
108 if (m_cameraBuffers) {
109 for (
int i = 0; i < m_cameraBuffers->size(); i++) {
110 delete (*m_cameraBuffers)[i];
111 (*m_cameraBuffers)[i] = NULL;
113 m_cameraBuffers->clear();
138 for (
int currentCalculation = 0; currentCalculation < m_calculations->size();
139 currentCalculation++) {
140 if ((*m_calculations)[currentCalculation] == CallNextMethod) {
141 void (
Calculator::*aMethod)() = (*m_methods)[methodIndex];
146 DataValue &data = (*m_dataDefinitions)[dataIndex];
147 if (data.
type() == DataValue::Constant) {
150 else if (data.
type() == DataValue::Band) {
153 else if (data.
type() == DataValue::Line) {
156 else if (data.
type() == DataValue::Sample) {
158 samples.resize(m_outputSamples);
160 for (
int i = 0; i < m_outputSamples; i++) {
166 else if (data.
type() == DataValue::CubeData) {
169 else if (data.
type() == DataValue::InaData) {
170 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->inaBuffer(curLine,
174 else if (data.
type() == DataValue::EmaData) {
175 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->emaBuffer(curLine,
179 else if (data.
type() == DataValue::PhaData) {
180 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->phaBuffer(curLine,
184 else if (data.
type() == DataValue::InalData) {
185 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->inalBuffer(curLine,
189 else if (data.
type() == DataValue::EmalData) {
190 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->emalBuffer(curLine,
194 else if (data.
type() == DataValue::PhalData) {
195 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->phalBuffer(curLine,
199 else if (data.
type() == DataValue::LatData) {
200 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->latBuffer(curLine,
204 else if (data.
type() == DataValue::LonData) {
205 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->lonBuffer(curLine,
209 else if (data.
type() == DataValue::ResData) {
210 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->resBuffer(curLine,
214 else if (data.
type() == DataValue::RadiusData) {
215 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->radiusBuffer(curLine,
219 else if (data.
type() == DataValue::InacData) {
220 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->inacBuffer(curLine,
224 else if (data.
type() == DataValue::EmacData) {
225 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->emacBuffer(curLine,
229 else if (data.
type() == DataValue::PhacData) {
230 Push(*((*m_cameraBuffers)[data.
cubeIndex()]->phacBuffer(curLine,
241 if (StackSize() != 1) {
242 string msg =
"Too many operands in the equation.";
264 void CubeCalculator::prepareCalculations(QString equation,
280 if (isdigit(token[0]) || token[0] ==
'.') {
281 m_calculations->push_back(PushNextData);
282 m_dataDefinitions->push_back(
DataValue(DataValue::Constant,
287 else if (token[0] ==
'f') {
290 if (file < 0 || file >= (
int)inCubes.size()) {
291 QString msg =
"Invalid file number [" + tok.ToQt() +
"]";
295 m_calculations->push_back(PushNextData);
296 m_dataDefinitions->push_back(
DataValue(DataValue::CubeData, file));
298 else if (token ==
"band") {
299 m_calculations->push_back(PushNextData);
300 m_dataDefinitions->push_back(
DataValue(DataValue::Band));
302 else if (token ==
"line") {
303 m_calculations->push_back(PushNextData);
304 m_dataDefinitions->push_back(
DataValue(DataValue::Line));
306 else if (token ==
"sample") {
307 m_calculations->push_back(PushNextData);
308 m_dataDefinitions->push_back(
DataValue(DataValue::Sample));
311 else if (token ==
"+") {
312 addMethodCall(&Calculator::Add);
316 else if (token ==
"-") {
317 addMethodCall(&Calculator::Subtract);
321 else if (token ==
"*") {
322 addMethodCall(&Calculator::Multiply);
326 else if (token ==
"/") {
327 addMethodCall(&Calculator::Divide);
331 else if (token ==
"%") {
332 addMethodCall(&Calculator::Modulus);
336 else if (token ==
"^") {
337 addMethodCall(&Calculator::Exponent);
341 else if (token ==
"--") {
342 addMethodCall(&Calculator::Negative);
346 else if (token ==
"neg") {
347 addMethodCall(&Calculator::Negative);
351 else if (token ==
"<<") {
352 addMethodCall(&Calculator::LeftShift);
356 else if (token ==
">>") {
357 addMethodCall(&Calculator::RightShift);
361 else if (token ==
"linemax") {
362 addMethodCall(&Calculator::MaximumLine);
366 else if (token ==
"max") {
367 addMethodCall(&Calculator::MaximumPixel);
371 else if (token ==
"linemin") {
372 addMethodCall(&Calculator::MinimumLine);
376 else if (token ==
"min") {
377 addMethodCall(&Calculator::MinimumPixel);
381 else if (token ==
"abs") {
382 addMethodCall(&Calculator::AbsoluteValue);
386 else if (token ==
"sqrt") {
387 addMethodCall(&Calculator::SquareRoot);
391 else if (token ==
"log" || token ==
"ln") {
392 addMethodCall(&Calculator::Log);
396 else if (token ==
"log10") {
397 addMethodCall(&Calculator::Log10);
401 else if (token ==
"pi") {
402 m_calculations->push_back(PushNextData);
403 m_dataDefinitions->push_back(
409 else if (token ==
"e") {
410 m_calculations->push_back(PushNextData);
411 m_dataDefinitions->push_back(
416 else if (token ==
"rads") {
417 m_calculations->push_back(PushNextData);
418 m_dataDefinitions->push_back(
422 addMethodCall(&Calculator::Multiply);
425 else if (token ==
"degs") {
426 m_calculations->push_back(PushNextData);
427 m_dataDefinitions->push_back(
430 addMethodCall(&Calculator::Multiply);
434 else if (token ==
"sin") {
435 addMethodCall(&Calculator::Sine);
439 else if (token ==
"cos") {
440 addMethodCall(&Calculator::Cosine);
444 else if (token ==
"tan") {
445 addMethodCall(&Calculator::Tangent);
449 else if (token ==
"sec") {
450 addMethodCall(&Calculator::Secant);
454 else if (token ==
"csc") {
455 addMethodCall(&Calculator::Cosecant);
459 else if (token ==
"cot") {
460 addMethodCall(&Calculator::Cotangent);
464 else if (token ==
"asin") {
465 addMethodCall(&Calculator::Arcsine);
469 else if (token ==
"acos") {
470 addMethodCall(&Calculator::Arccosine);
474 else if (token ==
"atan") {
475 addMethodCall(&Calculator::Arctangent);
479 else if (token ==
"atan2") {
480 addMethodCall(&Calculator::Arctangent2);
484 else if (token ==
"sinh") {
485 addMethodCall(&Calculator::SineH);
489 else if (token ==
"cosh") {
490 addMethodCall(&Calculator::CosineH);
494 else if (token ==
"tanh") {
495 addMethodCall(&Calculator::TangentH);
499 else if (token ==
"<") {
500 addMethodCall(&Calculator::LessThan);
504 else if (token ==
">") {
505 addMethodCall(&Calculator::GreaterThan);
509 else if (token ==
"<=") {
510 addMethodCall(&Calculator::LessThanOrEqual);
514 else if (token ==
">=") {
515 addMethodCall(&Calculator::GreaterThanOrEqual);
519 else if (token ==
"==") {
520 addMethodCall(&Calculator::Equal);
524 else if (token ==
"!=") {
525 addMethodCall(&Calculator::NotEqual);
529 else if (token ==
"cubemax") {
530 int cubeIndex = lastPushToCubeStats(inCubes);
532 m_calculations->push_back(PushNextData);
533 m_dataDefinitions->push_back(
534 DataValue(DataValue::Constant, (*m_cubeStats)[cubeIndex]->Maximum())
540 else if (token ==
"cubemin") {
541 int cubeIndex = lastPushToCubeStats(inCubes);
543 m_calculations->push_back(PushNextData);
544 m_dataDefinitions->push_back(
545 DataValue(DataValue::Constant, (*m_cubeStats)[cubeIndex]->Minimum())
551 else if (token ==
"cubeavg") {
552 int cubeIndex = lastPushToCubeStats(inCubes);
554 m_calculations->push_back(PushNextData);
555 m_dataDefinitions->push_back(
562 else if (token ==
"cubestd") {
563 int cubeIndex = lastPushToCubeStats(inCubes);
565 m_calculations->push_back(PushNextData);
566 m_dataDefinitions->push_back(
567 DataValue(DataValue::Constant, (*m_cubeStats)[cubeIndex]->StandardDeviation())
573 else if (token ==
"inac") {
574 int cubeIndex = lastPushToCubeCameras(inCubes);
575 (*m_cameraBuffers)[cubeIndex]->enableInacBuffer();
577 m_calculations->push_back(PushNextData);
578 m_dataDefinitions->push_back(
DataValue(DataValue::InacData, cubeIndex));
582 else if (token ==
"emac") {
583 int cubeIndex = lastPushToCubeCameras(inCubes);
584 (*m_cameraBuffers)[cubeIndex]->enableEmacBuffer();
586 m_calculations->push_back(PushNextData);
587 m_dataDefinitions->push_back(
DataValue(DataValue::EmacData, cubeIndex));
591 else if (token ==
"phac") {
592 int cubeIndex = lastPushToCubeCameras(inCubes);
593 (*m_cameraBuffers)[cubeIndex]->enablePhacBuffer();
595 m_calculations->push_back(PushNextData);
596 m_dataDefinitions->push_back(
DataValue(DataValue::PhacData, cubeIndex));
600 else if (token ==
"ina") {
601 int cubeIndex = lastPushToCubeCameras(inCubes);
602 (*m_cameraBuffers)[cubeIndex]->enableInaBuffer();
604 m_calculations->push_back(PushNextData);
605 m_dataDefinitions->push_back(
DataValue(DataValue::InaData, cubeIndex));
609 else if (token ==
"ema") {
610 int cubeIndex = lastPushToCubeCameras(inCubes);
611 (*m_cameraBuffers)[cubeIndex]->enableEmaBuffer();
613 m_calculations->push_back(PushNextData);
614 m_dataDefinitions->push_back(
DataValue(DataValue::EmaData, cubeIndex));
618 else if (token ==
"pha") {
619 int cubeIndex = lastPushToCubeCameras(inCubes);
620 (*m_cameraBuffers)[cubeIndex]->enablePhaBuffer();
622 m_calculations->push_back(PushNextData);
623 m_dataDefinitions->push_back(
DataValue(DataValue::PhaData, cubeIndex));
627 else if (token ==
"inal") {
628 int cubeIndex = lastPushToCubeCameras(inCubes);
629 (*m_cameraBuffers)[cubeIndex]->enableInalBuffer();
631 m_calculations->push_back(PushNextData);
632 m_dataDefinitions->push_back(
DataValue(DataValue::InalData, cubeIndex));
636 else if (token ==
"emal") {
637 int cubeIndex = lastPushToCubeCameras(inCubes);
638 (*m_cameraBuffers)[cubeIndex]->enableEmalBuffer();
640 m_calculations->push_back(PushNextData);
641 m_dataDefinitions->push_back(
DataValue(DataValue::EmalData, cubeIndex));
645 else if (token ==
"phal") {
646 int cubeIndex = lastPushToCubeCameras(inCubes);
647 (*m_cameraBuffers)[cubeIndex]->enablePhalBuffer();
649 m_calculations->push_back(PushNextData);
650 m_dataDefinitions->push_back(
DataValue(DataValue::PhalData, cubeIndex));
654 else if (token ==
"lat") {
655 int cubeIndex = lastPushToCubeCameras(inCubes);
656 (*m_cameraBuffers)[cubeIndex]->enableLatBuffer();
658 m_calculations->push_back(PushNextData);
659 m_dataDefinitions->push_back(
DataValue(DataValue::LatData, cubeIndex));
663 else if (token ==
"lon") {
664 int cubeIndex = lastPushToCubeCameras(inCubes);
665 (*m_cameraBuffers)[cubeIndex]->enableLonBuffer();
667 m_calculations->push_back(PushNextData);
668 m_dataDefinitions->push_back(
DataValue(DataValue::LonData, cubeIndex));
672 else if (token ==
"res") {
673 int cubeIndex = lastPushToCubeCameras(inCubes);
674 (*m_cameraBuffers)[cubeIndex]->enableResBuffer();
676 m_calculations->push_back(PushNextData);
677 m_dataDefinitions->push_back(
DataValue(DataValue::ResData, cubeIndex));
681 else if (token ==
"radius") {
682 int cubeIndex = lastPushToCubeCameras(inCubes);
683 (*m_cameraBuffers)[cubeIndex]->enableRadiusBuffer();
685 m_calculations->push_back(PushNextData);
686 m_dataDefinitions->push_back(
DataValue(DataValue::RadiusData, cubeIndex));
690 else if (token ==
"") {
694 string msg =
"Unidentified operator [";
715 if (!m_calculations->size()) {
716 string msg =
"Not sure which file to get statistics from";
720 if ((*m_calculations)[m_calculations->size() - 1] != PushNextData) {
721 string msg =
"This function must not contain calculations,";
722 msg +=
" only input cubes may be specified.";
726 m_calculations->pop_back();
729 DataValue lastData = (*m_dataDefinitions)[m_dataDefinitions->size() - 1];
731 if (lastData.
type() != DataValue::CubeData) {
732 string msg =
"This function must not contain constants,";
733 msg +=
" only input cubes may be specified.";
737 int cubeStatsIndex = lastData.
cubeIndex();
738 m_dataDefinitions->pop_back();
743 while (m_cubeStats->size() < cubeStatsIndex + 1) {
744 m_cubeStats->push_back(NULL);
749 if ((*m_cubeStats)[cubeStatsIndex] == NULL) {
750 (*m_cubeStats)[cubeStatsIndex] = inCubes[cubeStatsIndex]->statistics();
753 return cubeStatsIndex;
775 if (!m_calculations->size()) {
776 string msg =
"Not sure which file to get cameras from";
780 if ((*m_calculations)[m_calculations->size() - 1] != PushNextData) {
781 string msg =
"This function must not contain calculations,";
782 msg +=
" only input cubes may be specified.";
786 m_calculations->pop_back();
789 DataValue lastData = (*m_dataDefinitions)[m_dataDefinitions->size() - 1];
791 if (lastData.
type() != DataValue::CubeData) {
792 string msg =
"This function must not contain constants,";
793 msg +=
" only input cubes may be specified.";
798 m_dataDefinitions->pop_back();
803 while (m_cubeCameras->size() < cubeIndex + 1) {
804 m_cubeCameras->push_back(NULL);
807 while (m_cameraBuffers->size() < cubeIndex + 1) {
808 m_cameraBuffers->push_back(NULL);
813 if ((*m_cubeCameras)[cubeIndex] == NULL) {
816 cam = inCubes[cubeIndex]->camera();
818 string msg =
"This function requires a camera and the input cube does";
819 msg +=
" not have one. You may need to run spiceinit";
824 string msg =
"This function requires a camera and the input cube does";
825 msg +=
" not have one. You may need to run spiceinit";
829 (*m_cubeCameras)[cubeIndex] = cam;
843 void CubeCalculator::addMethodCall(
void (
Calculator::*method)(
void)) {
844 m_calculations->push_back(CallNextMethod);
845 m_methods->push_back(method);
855 DataValue::DataValue() {
858 m_constantValue = 0.0;
872 m_constantValue = 0.0;
888 m_constantValue = 0.0;
889 m_cubeIndex = cubeIndex;
907 if (type == Constant) {
908 m_constantValue = value;
928 int DataValue::cubeIndex() {
938 double DataValue::constant() {
939 return m_constantValue;
948 CameraBuffers::CameraBuffers(
Camera *camera) {
962 m_radiusBuffer = NULL;
971 CameraBuffers::~CameraBuffers() {
984 delete m_radiusBuffer;
998 m_radiusBuffer = NULL;
1003 void CameraBuffers::enablePhaBuffer() {
1009 void CameraBuffers::enableInaBuffer() {
1015 void CameraBuffers::enableEmaBuffer() {
1021 void CameraBuffers::enableLatBuffer() {
1027 void CameraBuffers::enableLonBuffer() {
1033 void CameraBuffers::enableResBuffer() {
1039 void CameraBuffers::enableRadiusBuffer() {
1045 void CameraBuffers::enablePhalBuffer() {
1051 void CameraBuffers::enableInalBuffer() {
1057 void CameraBuffers::enableEmalBuffer() {
1063 void CameraBuffers::enablePhacBuffer() {
1069 void CameraBuffers::enableInacBuffer() {
1075 void CameraBuffers::enableEmacBuffer() {
1080 QVector<double> *CameraBuffers::phaBuffer(
int currentLine,
int ns,
int currentBand) {
1081 loadBuffers(currentLine, ns, currentBand);
1086 QVector<double> *CameraBuffers::inaBuffer(
int currentLine,
int ns,
int currentBand) {
1087 loadBuffers(currentLine, ns, currentBand);
1092 QVector<double> *CameraBuffers::emaBuffer(
int currentLine,
int ns,
int currentBand) {
1093 loadBuffers(currentLine, ns, currentBand);
1098 QVector<double> *CameraBuffers::latBuffer(
int currentLine,
int ns,
int currentBand) {
1099 loadBuffers(currentLine, ns, currentBand);
1104 QVector<double> *CameraBuffers::lonBuffer(
int currentLine,
int ns,
int currentBand) {
1105 loadBuffers(currentLine, ns, currentBand);
1110 QVector<double> *CameraBuffers::resBuffer(
int currentLine,
int ns,
int currentBand) {
1111 loadBuffers(currentLine, ns, currentBand);
1116 QVector<double> *CameraBuffers::radiusBuffer(
int currentLine,
int ns,
int currentBand) {
1117 loadBuffers(currentLine,ns,currentBand);
1118 return m_radiusBuffer;
1122 QVector<double> *CameraBuffers::phalBuffer(
int currentLine,
int ns,
int currentBand) {
1123 loadBuffers(currentLine, ns, currentBand);
1124 return m_phalBuffer;
1128 QVector<double> *CameraBuffers::inalBuffer(
int currentLine,
int ns,
int currentBand) {
1129 loadBuffers(currentLine, ns, currentBand);
1130 return m_inalBuffer;
1134 QVector<double> *CameraBuffers::emalBuffer(
int currentLine,
int ns,
int currentBand) {
1135 loadBuffers(currentLine, ns, currentBand);
1136 return m_emalBuffer;
1140 QVector<double> *CameraBuffers::phacBuffer(
int currentLine,
int ns,
int currentBand) {
1141 loadBuffers(currentLine, ns, currentBand);
1142 return m_phacBuffer;
1146 QVector<double> *CameraBuffers::inacBuffer(
int currentLine,
int ns,
int currentBand) {
1147 loadBuffers(currentLine, ns, currentBand);
1148 return m_inacBuffer;
1152 QVector<double> *CameraBuffers::emacBuffer(
int currentLine,
int ns,
int currentBand) {
1153 loadBuffers(currentLine, ns, currentBand);
1154 return m_emacBuffer;
1158 void CameraBuffers::loadBuffers(
int currentLine,
int ns,
int currentBand) {
1159 if (currentLine != m_lastLine) {
1160 m_lastLine = currentLine;
1163 if (m_phaBuffer) m_phaBuffer->resize(ns);
1164 if (m_inaBuffer) m_inaBuffer->resize(ns);
1165 if (m_emaBuffer) m_emaBuffer->resize(ns);
1166 if (m_latBuffer) m_latBuffer->resize(ns);
1167 if (m_lonBuffer) m_lonBuffer->resize(ns);
1168 if (m_resBuffer) m_resBuffer->resize(ns);
1169 if (m_radiusBuffer) m_radiusBuffer->resize(ns);
1170 if (m_phalBuffer) m_phalBuffer->resize(ns);
1171 if (m_inalBuffer) m_inalBuffer->resize(ns);
1172 if (m_emalBuffer) m_emalBuffer->resize(ns);
1175 if (m_phacBuffer) m_phacBuffer->resize(1);
1176 if (m_inacBuffer) m_inacBuffer->resize(1);
1177 if (m_emacBuffer) m_emacBuffer->resize(1);
1179 m_camera->SetBand(currentBand);
1181 if (m_phacBuffer || m_inacBuffer || m_emacBuffer) {
1183 double centerLine = m_camera->Lines() / 2.0 + 0.5;
1184 double centerSamp = m_camera->Samples() / 2.0 + 0.5;
1186 if (m_camera->SetImage(centerSamp, centerLine)) {
1189 (*m_phacBuffer)[0] = m_camera->PhaseAngle();
1193 (*m_inacBuffer)[0] = m_camera->IncidenceAngle();
1197 (*m_emacBuffer)[0] = m_camera->EmissionAngle();
1201 QString msg =
"Unable to compute illumination angles at image center for operator [" 1203 throw IException(IException::Unknown, msg,
_FILEINFO_);
1208 for (
int i = 0; i < ns; i++) {
1210 if (m_camera->SetImage(i + 1, currentLine)) {
1211 if (m_phaBuffer) (*m_phaBuffer)[i] = m_camera->PhaseAngle();
1212 if (m_inaBuffer) (*m_inaBuffer)[i] = m_camera->IncidenceAngle();
1213 if (m_emaBuffer) (*m_emaBuffer)[i] = m_camera->EmissionAngle();
1214 if (m_latBuffer) (*m_latBuffer)[i] = m_camera->UniversalLatitude();
1215 if (m_lonBuffer) (*m_lonBuffer)[i] = m_camera->UniversalLongitude();
1216 if (m_resBuffer) (*m_resBuffer)[i] = m_camera->PixelResolution();
1217 if (m_radiusBuffer) (*m_radiusBuffer)[i] = m_camera->LocalRadius().meters();
1218 if (m_phalBuffer || m_inalBuffer || m_emalBuffer) {
1219 Angle phal, inal, emal;
1221 m_camera->LocalPhotometricAngles(phal, inal, emal, okay);
1223 if (m_phalBuffer) (*m_phalBuffer)[i] = phal.degrees();
1224 if (m_inalBuffer) (*m_inalBuffer)[i] = inal.degrees();
1225 if (m_emalBuffer) (*m_emalBuffer)[i] = emal.degrees();
1228 if (m_phalBuffer) (*m_phalBuffer)[i] = NAN;
1229 if (m_inalBuffer) (*m_inalBuffer)[i] = NAN;
1230 if (m_emalBuffer) (*m_emalBuffer)[i] = NAN;
1235 if (m_phaBuffer) (*m_phaBuffer)[i] = NAN;
1236 if (m_inaBuffer) (*m_inaBuffer)[i] = NAN;
1237 if (m_emaBuffer) (*m_emaBuffer)[i] = NAN;
1238 if (m_latBuffer) (*m_latBuffer)[i] = NAN;
1239 if (m_lonBuffer) (*m_lonBuffer)[i] = NAN;
1240 if (m_resBuffer) (*m_resBuffer)[i] = NAN;
1241 if (m_radiusBuffer) (*m_radiusBuffer)[i] = NAN;
1242 if (m_phalBuffer) (*m_phalBuffer)[i] = NAN;
1243 if (m_inalBuffer) (*m_inalBuffer)[i] = NAN;
1244 if (m_emalBuffer) (*m_emalBuffer)[i] = NAN;
This class is used to define what kind of data is being pushed onto the cube calculator.
const double PI
The mathematical constant PI.
This class is used to manage buffers for calculating camera related information, such as angles...
double ToDouble() const
Returns the floating point value the IString represents.
Namespace for the standard library.
int ToInteger() const
Returns the object string as an integer.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
IString Token(const IString &separator)
Returns the first token in the IString.
DataValueType type()
Accesses the type of the DataValue.
#define _FILEINFO_
Macro for the filename and line number.
DataValueType
This is used to tell what kind of data to push onto the RPN calculator.
const double E
Sets some basic constants for use in ISIS programming.
int cubeIndex()
Accesses the cube index of the DataValue.
Adds specific functionality to C++ strings.
Namespace for ISIS/Bullet specific routines.
double constant()
Accesses the constant value of the DataValue.
Functor for reduce using average functionality.
IO Handler for Isis Cubes.