22 BundleObservation::BundleObservation() {
23 m_serialNumbers.clear();
25 m_parameterNamesList.clear();
26 m_observationNumber =
"";
28 m_instrumentRotation = NULL;
29 m_instrumentPosition = NULL;
32 m_corrections.clear();
34 m_aprioriSigmas.clear();
35 m_adjustedSigmas.clear();
48 BundleObservation::BundleObservation(BundleImageQsp image, QString observationNumber,
50 m_serialNumbers.clear();
52 m_parameterNamesList.clear();
53 m_observationNumber =
"";
55 m_instrumentRotation = NULL;
56 m_instrumentPosition = NULL;
59 m_corrections.clear();
61 m_aprioriSigmas.clear();
62 m_adjustedSigmas.clear();
64 m_observationNumber = observationNumber;
65 m_instrumentId = instrumentId;
67 m_bundleTargetBody = bundleTargetBody;
71 m_serialNumbers.append(image->serialNumber());
72 m_imageNames.append(image->fileName());
73 m_cubeSerialNumberToBundleImageMap.insert(image->serialNumber(), image);
78 m_instrumentPosition = (image->camera() ?
79 (image->camera()->instrumentPosition() ?
80 image->camera()->instrumentPosition() : NULL)
82 m_instrumentRotation = (image->camera() ?
83 (image->camera()->instrumentRotation() ?
84 image->camera()->instrumentRotation() : NULL)
124 BundleObservation::~BundleObservation() {
164 void BundleObservation::append(
const BundleImageQsp &value) {
166 m_cubeSerialNumberToBundleImageMap.insert(value->serialNumber(), value);
180 BundleImageQsp BundleObservation::imageByCubeSerialNumber(QString cubeSerialNumber) {
181 BundleImageQsp bundleImage;
183 if (m_cubeSerialNumberToBundleImageMap.contains(cubeSerialNumber)) {
184 bundleImage = m_cubeSerialNumberToBundleImageMap.value(cubeSerialNumber);
207 int nCameraAngleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
208 int nCameraPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
210 int nParameters = 3*nCameraPositionCoefficients + 2*nCameraAngleCoefficients;
211 if (nCameraAngleCoefficients >= 1 && m_solveSettings->solveTwist()) {
212 nParameters += nCameraAngleCoefficients;
215 m_weights.resize(nParameters);
217 m_corrections.resize(nParameters);
218 m_corrections.clear();
221 m_adjustedSigmas.resize(nParameters);
222 m_adjustedSigmas.clear();
223 m_aprioriSigmas.resize(nParameters);
224 for (
int i = 0; i < nParameters; i++)
227 if (!initParameterWeights()) {
242 QString BundleObservation::instrumentId() {
243 return m_instrumentId;
253 return m_instrumentRotation;
263 return m_instrumentPosition;
283 return m_corrections;
302 return m_aprioriSigmas;
312 return m_adjustedSigmas;
323 return m_solveSettings;
335 bool BundleObservation::initializeExteriorOrientation() {
337 if (m_solveSettings->instrumentPositionSolveOption() !=
338 BundleObservationSolveSettings::NoPositionFactors) {
340 double positionBaseTime = 0.0;
341 double positiontimeScale = 0.0;
342 std::vector<double> posPoly1, posPoly2, posPoly3;
344 for (
int i = 0; i < size(); i++) {
345 BundleImageQsp image = at(i);
346 SpicePosition *spicePosition = image->camera()->instrumentPosition();
352 m_solveSettings->positionInterpolationType());
361 spicePosition->
SetPolynomial(m_solveSettings->positionInterpolationType());
366 if (m_instrumentPosition) {
367 positionBaseTime = m_instrumentPosition->GetBaseTime();
368 positiontimeScale = m_instrumentPosition->GetTimeScale();
369 m_instrumentPosition->GetPolynomial(posPoly1, posPoly2, posPoly3);
375 if (m_solveSettings->instrumentPointingSolveOption() !=
376 BundleObservationSolveSettings::NoPointingFactors) {
378 double rotationBaseTime = 0.0;
379 double rotationtimeScale = 0.0;
380 std::vector<double> anglePoly1, anglePoly2, anglePoly3;
382 for (
int i = 0; i < size(); i++) {
383 BundleImageQsp image = at(i);
384 SpiceRotation *spicerotation = image->camera()->instrumentRotation();
389 spicerotation->
SetPolynomial(anglePoly1, anglePoly2, anglePoly3,
390 m_solveSettings->pointingInterpolationType());
399 spicerotation->
SetPolynomial(m_solveSettings->pointingInterpolationType());
406 spicerotation->
GetPolynomial(anglePoly1, anglePoly2, anglePoly3);
420 void BundleObservation::initializeBodyRotation() {
421 std::vector<Angle> raCoefs = m_bundleTargetBody->poleRaCoefs();
422 std::vector<Angle> decCoefs = m_bundleTargetBody->poleDecCoefs();
423 std::vector<Angle> pmCoefs = m_bundleTargetBody->pmCoefs();
425 for (
int i = 0; i < size(); i++) {
426 BundleImageQsp image = at(i);
427 image->camera()->bodyRotation()->setPckPolynomial(raCoefs, decCoefs, pmCoefs);
438 void BundleObservation::updateBodyRotation() {
439 std::vector<Angle> raCoefs = m_bundleTargetBody->poleRaCoefs();
440 std::vector<Angle> decCoefs = m_bundleTargetBody->poleDecCoefs();
441 std::vector<Angle> pmCoefs = m_bundleTargetBody->pmCoefs();
443 for (
int i = 0; i < size(); i++) {
444 BundleImageQsp image = at(i);
445 image->camera()->bodyRotation()->setPckPolynomial(raCoefs, decCoefs, pmCoefs);
512 bool BundleObservation::initParameterWeights() {
515 double posWeight = 0.0;
516 double velWeight = 0.0;
517 double accWeight = 0.0;
518 double angWeight = 0.0;
519 double angVelWeight = 0.0;
520 double angAccWeight = 0.0;
522 QList<double> aprioriPointingSigmas = m_solveSettings->aprioriPointingSigmas();
523 QList<double> aprioriPositionSigmas = m_solveSettings->aprioriPositionSigmas();
525 int nCamPosCoeffsSolved = 3 *m_solveSettings->numberCameraPositionCoefficientsSolved();
527 int nCamAngleCoeffsSolved;
528 if (m_solveSettings->solveTwist()) {
529 nCamAngleCoeffsSolved = 3 *m_solveSettings->numberCameraAngleCoefficientsSolved();
532 nCamAngleCoeffsSolved = 2 *m_solveSettings->numberCameraAngleCoefficientsSolved();
535 if (aprioriPositionSigmas.size() >= 1 && aprioriPositionSigmas.at(0) > 0.0) {
536 posWeight = aprioriPositionSigmas.at(0);
537 posWeight = 1.0 / (posWeight *posWeight * 1.0e-6);
539 if (aprioriPositionSigmas.size() >= 2 && aprioriPositionSigmas.at(1) > 0.0) {
540 velWeight = aprioriPositionSigmas.at(1);
541 velWeight = 1.0 / (velWeight *velWeight * 1.0e-6);
543 if (aprioriPositionSigmas.size() >= 3 && aprioriPositionSigmas.at(2) > 0.0) {
544 accWeight = aprioriPositionSigmas.at(2);
545 accWeight = 1.0 / (accWeight *accWeight * 1.0e-6);
548 if (aprioriPointingSigmas.size() >= 1 && aprioriPointingSigmas.at(0) > 0.0) {
549 angWeight = aprioriPointingSigmas.at(0);
552 if (aprioriPointingSigmas.size() >= 2 && aprioriPointingSigmas.at(1) > 0.0) {
553 angVelWeight = aprioriPointingSigmas.at(1);
554 angVelWeight = 1.0 / (angVelWeight * angVelWeight *
DEG2RAD *
DEG2RAD);
556 if (aprioriPointingSigmas.size() >= 3 && aprioriPointingSigmas.at(2) > 0.0) {
557 angAccWeight = aprioriPointingSigmas.at(2);
558 angAccWeight = 1.0 / (angAccWeight * angAccWeight *
DEG2RAD *
DEG2RAD);
561 int nSpkTerms = m_solveSettings->spkSolveDegree()+1;
562 nSpkTerms = m_solveSettings->numberCameraPositionCoefficientsSolved();
563 for (
int i = 0; i < nCamPosCoeffsSolved; i++) {
564 if (i % nSpkTerms == 0) {
565 m_aprioriSigmas[i] = aprioriPositionSigmas.at(0);
566 m_weights[i] = posWeight;
568 if (i % nSpkTerms == 1) {
569 m_aprioriSigmas[i] = aprioriPositionSigmas.at(1);
570 m_weights[i] = velWeight;
572 if (i % nSpkTerms == 2) {
573 m_aprioriSigmas[i] = aprioriPositionSigmas.at(2);
574 m_weights[i] = accWeight;
578 int nCkTerms = m_solveSettings->ckSolveDegree()+1;
579 nCkTerms = m_solveSettings->numberCameraAngleCoefficientsSolved();
580 for (
int i = 0; i < nCamAngleCoeffsSolved; i++) {
581 if (i % nCkTerms == 0) {
582 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(0);
583 m_weights[nCamPosCoeffsSolved + i] = angWeight;
585 if (i % nCkTerms == 1) {
586 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(1);
587 m_weights[nCamPosCoeffsSolved + i] = angVelWeight;
589 if (i % nCkTerms == 2) {
590 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(2);
591 m_weights[nCamPosCoeffsSolved + i] = angAccWeight;
623 int nCameraAngleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
624 int nCameraPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
627 = m_solveSettings->instrumentPositionSolveOption();
628 if (positionOption != BundleObservationSolveSettings::NoPositionFactors) {
630 if (!m_instrumentPosition) {
631 QString msg =
"Instrument position is NULL, but position solve option is ";
632 msg.append(BundleObservationSolveSettings::instrumentPositionSolveOptionToString(
637 std::vector<double> coefX(nCameraPositionCoefficients);
638 std::vector<double> coefY(nCameraPositionCoefficients);
639 std::vector<double> coefZ(nCameraPositionCoefficients);
641 m_instrumentPosition->GetPolynomial(coefX, coefY, coefZ);
644 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
645 coefX[i] += corrections(index);
650 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
651 coefY[i] += corrections(index);
656 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
657 coefZ[i] += corrections(index);
662 for (
int i = 0; i < size(); i++) {
663 BundleImageQsp image = at(i);
664 SpicePosition *spiceposition = image->camera()->instrumentPosition();
666 m_solveSettings->positionInterpolationType());
671 = m_solveSettings->instrumentPointingSolveOption();
672 if (pointingOption != BundleObservationSolveSettings::NoPointingFactors) {
674 if (!m_instrumentRotation) {
675 QString msg =
"Instrument rotation is NULL, but pointing solve option is ";
676 msg.append(BundleObservationSolveSettings::instrumentPointingSolveOptionToString(
681 std::vector<double> coefRA(nCameraPositionCoefficients);
682 std::vector<double> coefDEC(nCameraPositionCoefficients);
683 std::vector<double> coefTWI(nCameraPositionCoefficients);
685 m_instrumentRotation->GetPolynomial(coefRA, coefDEC, coefTWI);
688 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
689 coefRA[i] += corrections(index);
694 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
695 coefDEC[i] += corrections(index);
699 if (m_solveSettings->solveTwist()) {
701 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
702 coefTWI[i] += corrections(index);
708 for (
int i = 0; i < size(); i++) {
709 BundleImageQsp image = at(i);
710 SpiceRotation *spiceRotation = image->camera()->instrumentRotation();
712 m_solveSettings->pointingInterpolationType());
717 m_corrections += corrections;
721 QString msg =
"Unable to apply parameter corrections to BundleObservation.";
733 int BundleObservation::numberPositionParameters() {
734 return 3.0 * m_solveSettings->numberCameraPositionCoefficientsSolved();
743 int BundleObservation::numberPointingParameters() {
744 int angleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
746 if (m_solveSettings->solveTwist()) {
747 return 3.0 * angleCoefficients;
749 return 2.0 * angleCoefficients;
761 int BundleObservation::numberParameters() {
762 return numberPositionParameters() + numberPointingParameters();
771 void BundleObservation::setIndex(
int n) {
781 int BundleObservation::index() {
802 QString BundleObservation::formatBundleOutputString(
bool errorPropagation,
bool imageCSV) {
804 std::vector<double> coefX;
805 std::vector<double> coefY;
806 std::vector<double> coefZ;
807 std::vector<double> coefRA;
808 std::vector<double> coefDEC;
809 std::vector<double> coefTWI;
811 int nPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
812 int nPointingCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
815 bool useDefaultPosition =
false;
816 bool useDefaultPointing =
false;
818 bool useDefaultTwist = !(m_solveSettings->solveTwist());
822 if (nPositionCoefficients == 0) {
823 nPositionCoefficients = 1;
824 useDefaultPosition =
true;
828 if (nPointingCoefficients == 0) {
829 nPointingCoefficients = 1;
830 useDefaultPointing =
true;
835 int nPositionParameters = 3 * nPositionCoefficients;
836 int nPointingParameters = 3 * nPointingCoefficients;
837 int nParameters = nPositionParameters + nPointingParameters;
839 coefX.resize(nPositionCoefficients);
840 coefY.resize(nPositionCoefficients);
841 coefZ.resize(nPositionCoefficients);
842 coefRA.resize(nPointingCoefficients);
843 coefDEC.resize(nPointingCoefficients);
844 coefTWI.resize(nPointingCoefficients);
846 if (m_instrumentPosition) {
847 if (!useDefaultPosition) {
848 m_instrumentPosition->GetPolynomial(coefX, coefY, coefZ);
852 const std::vector<double> centerCoord = m_instrumentPosition->GetCenterCoordinate();
853 coefX[0] = centerCoord[0];
854 coefY[0] = centerCoord[1];
855 coefZ[0] = centerCoord[2];
859 if (m_instrumentRotation) {
860 if (!useDefaultPointing) {
861 m_instrumentRotation->GetPolynomial(coefRA, coefDEC, coefTWI);
865 const std::vector<double> centerAngles = m_instrumentRotation->GetCenterAngles();
866 coefRA[0] = centerAngles[0];
867 coefDEC[0] = centerAngles[1];
868 coefTWI[0] = centerAngles[2];
873 std::vector<double> finalParameterValues;
878 QString str(
"%1(t%2)");
880 if (nPositionCoefficients > 0) {
881 for (
int i = 0; i < nPositionCoefficients; i++) {
882 finalParameterValues.push_back(coefX[i]);
884 parameterNamesList.append( str.arg(
" X ").arg(
"0") );
886 parameterNamesList.append( str.arg(
" ").arg(i) );
888 for (
int i = 0; i < nPositionCoefficients; i++) {
889 finalParameterValues.push_back(coefY[i]);
891 parameterNamesList.append( str.arg(
" Y ").arg(
"0") );
893 parameterNamesList.append( str.arg(
" ").arg(i) );
895 for (
int i = 0; i < nPositionCoefficients; i++) {
896 finalParameterValues.push_back(coefZ[i]);
898 parameterNamesList.append( str.arg(
" Z ").arg(
"0") );
900 parameterNamesList.append( str.arg(
" ").arg(i) );
903 if (nPointingCoefficients > 0) {
904 for (
int i = 0; i < nPointingCoefficients; i++) {
905 finalParameterValues.push_back(coefRA[i] *
RAD2DEG);
907 parameterNamesList.append( str.arg(
" RA ").arg(
"0") );
909 parameterNamesList.append( str.arg(
" ").arg(i) );
911 for (
int i = 0; i < nPointingCoefficients; i++) {
912 finalParameterValues.push_back(coefDEC[i] *
RAD2DEG);
914 parameterNamesList.append( str.arg(
"DEC ").arg(
"0") );
916 parameterNamesList.append( str.arg(
" ").arg(i) );
918 for (
int i = 0; i < nPointingCoefficients; i++) {
919 finalParameterValues.push_back(coefTWI[i] *
RAD2DEG);
921 parameterNamesList.append( str.arg(
"TWI ").arg(
"0") );
923 parameterNamesList.append( str.arg(
" ").arg(i) );
930 if (nPositionCoefficients > 0) {
931 for (
int i = 0; i < nPositionCoefficients; i++) {
932 finalParameterValues.push_back(coefX[i]);
934 for (
int i = 0; i < nPositionCoefficients; i++) {
935 finalParameterValues.push_back(coefY[i]);
937 for (
int i = 0; i < nPositionCoefficients; i++) {
938 finalParameterValues.push_back(coefZ[i]);
941 if (nPointingCoefficients > 0) {
942 for (
int i = 0; i < nPointingCoefficients; i++) {
943 finalParameterValues.push_back(coefRA[i] *
RAD2DEG);
945 for (
int i = 0; i < nPointingCoefficients; i++) {
946 finalParameterValues.push_back(coefDEC[i] *
RAD2DEG);
948 for (
int i = 0; i < nPointingCoefficients; i++) {
949 finalParameterValues.push_back(coefTWI[i] *
RAD2DEG);
955 m_parameterNamesList = parameterNamesList;
957 QString finalqStr =
"";
961 QString sigma =
"N/A";
962 QString adjustedSigma =
"N/A";
963 double correction = 0.0;
968 for (
int i = 0; i < nPositionParameters; i++) {
971 if (!useDefaultPosition) {
972 correction = m_corrections(i);
973 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
974 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
976 if (errorPropagation) {
977 qStr = QString(
"%1%2%3%4%5%6\n").
978 arg( parameterNamesList.at(i) ).
979 arg(finalParameterValues[i] - correction, 17,
'f', 8).
980 arg(correction, 21,
'f', 8).
981 arg(finalParameterValues[i], 20,
'f', 8).
983 arg(adjustedSigma, 18);
986 qStr = QString(
"%1%2%3%4%5%6\n").
987 arg( parameterNamesList.at(i) ).
988 arg(finalParameterValues[i] - correction, 17,
'f', 8).
989 arg(correction, 21,
'f', 8).
990 arg(finalParameterValues[i], 20,
'f', 8).
1001 if (useDefaultPosition) {
1005 for (
int i = nPositionParameters; i < nParameters; i++) {
1006 if (!useDefaultPointing) {
1010 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1012 adjustedSigma =
"N/A";
1016 correction = m_corrections(i - offset);
1017 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1018 sigma = (
IsSpecial(m_aprioriSigmas[i - offset]) ?
"FREE" :
1019 toString(m_aprioriSigmas[i-offset], 8) );
1025 adjustedSigma =
"N/A";
1028 if (errorPropagation) {
1029 qStr = QString(
"%1%2%3%4%5%6\n").
1030 arg( parameterNamesList.at(i) ).
1031 arg( (finalParameterValues[i] - correction *
RAD2DEG), 17,
'f', 8).
1032 arg(correction * RAD2DEG, 21,
'f', 8).
1033 arg(finalParameterValues[i], 20,
'f', 8).
1035 arg(adjustedSigma, 18);
1038 qStr = QString(
"%1%2%3%4%5%6\n").
1039 arg( parameterNamesList.at(i) ).
1040 arg( (finalParameterValues[i] - correction *
RAD2DEG), 17,
'f', 8).
1041 arg(correction * RAD2DEG, 21,
'f', 8).
1042 arg(finalParameterValues[i], 20,
'f', 8).
1053 for (
int i = 0; i < nPositionParameters; i++) {
1054 if (!useDefaultPosition) {
1055 correction = m_corrections(i);
1056 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
1057 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
1062 adjustedSigma =
"N/A";
1066 if (errorPropagation) {
1067 qStr +=
toString(finalParameterValues[i] - correction) +
",";
1068 qStr +=
toString(correction) +
",";
1069 qStr +=
toString(finalParameterValues[i]) +
",";
1070 qStr += sigma +
",";
1071 qStr += adjustedSigma +
",";
1074 qStr +=
toString(finalParameterValues[i] - correction) +
",";
1075 qStr +=
toString(correction) +
",";
1076 qStr +=
toString(finalParameterValues[i]) +
",";
1077 qStr += sigma +
",";
1087 if (useDefaultPosition) {
1091 for (
int i = nPositionParameters; i < nParameters; i++) {
1092 if (!useDefaultPointing) {
1095 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1097 adjustedSigma =
"N/A";
1101 correction = m_corrections(i - offset);
1102 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1103 sigma = (
IsSpecial(m_aprioriSigmas[i-offset]) ?
"FREE" :
1104 toString(m_aprioriSigmas[i-offset], 8) );
1110 adjustedSigma =
"N/A";
1114 if (errorPropagation) {
1115 qStr +=
toString(finalParameterValues[i] - correction *
RAD2DEG) +
",";
1116 qStr +=
toString(correction * RAD2DEG) +
",";
1117 qStr +=
toString(finalParameterValues[i]) +
",";
1118 qStr += sigma +
",";
1119 qStr += adjustedSigma +
",";
1122 qStr +=
toString(finalParameterValues[i] - correction *
RAD2DEG) +
",";
1123 qStr +=
toString(correction * RAD2DEG) +
",";
1124 qStr +=
toString(finalParameterValues[i]) +
",";
1125 qStr += sigma +
",";
1142 return m_parameterNamesList;
1152 return m_imageNames;
void SetOverrideBaseTime(double baseTime, double timeScale)
Set an override base time to be used with observations on scanners to allow all images in an observat...
const double Null
Value for an Isis Null pixel.
QString m_observationNumber
This is typically equivalent to serial number except in the case of "observation mode" (e...
void SetPolynomialDegree(int degree)
Set the degree of the polynomials to be fit to the three camera angles for the time period covered by...
void GetPolynomial(std::vector< double > &abcAng1, std::vector< double > &abcAng2, std::vector< double > &abcAng3)
Return the coefficients of a polynomial fit to each of the three camera angles for the time period co...
QSharedPointer< BundleObservationSolveSettings > BundleObservationSolveSettingsQsp
Definition for BundleObservationSolveSettingsQsp, a QSharedPointer to a < BundleObservationSolveSet...
QMap< QString, BundleImageQsp > m_cubeSerialNumberToBundleImageMap
Map between cube serial number and BundleImage pointers.
const double DEG2RAD(0.017453292519943295769237)
Multiplier for converting from degrees to radians.
QSharedPointer< BundleTargetBody > BundleTargetBodyQsp
Definition for BundleTargetBodyQsp, a QSharedPointer to a BundleTargetBody.
Class for bundle observations.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
BundleObservationSolveSettingsQsp m_solveSettings
Solve settings for this observation.
boost::numeric::ublas::vector< double > Vector
Definition for an Isis::LinearAlgebra::Vector of doubles.
double GetBaseTime()
Accessor method to get the rotation base time.
SpiceRotation * m_instrumentRotation
Instrument spice rotation (in primary image).
#define _FILEINFO_
Macro for the filename and line number.
void SetPolynomialDegree(int degree)
Set the polynomial degree.
void SetOverrideBaseTime(double baseTime, double timeScale)
Set an override base time to be used with observations on scanners to allow all images in an observat...
QStringList m_serialNumbers
List of all cube serial numbers in observation.
bool IsSpecial(const double d)
Returns if the input pixel is special.
Obtain SPICE rotation information for a body.
This class is used to modify and manage solve settings for 1 to many BundleObservations.
QString m_instrumentId
Spacecraft instrument id.
InstrumentPositionSolveOption
Options for how to solve for instrument position.
Obtain SPICE position information for a body.
SpicePosition * m_instrumentPosition
Instrument spice position (in primary image).
InstrumentPointingSolveOption
Options for how to solve for instrument pointing.
double GetTimeScale()
Accessor method to get the rotation time scale.
void SetPolynomial(const Source type=PolyFunction)
Set the coefficients of a polynomial fit to each of the three camera angles for the time period cover...
const double RAD2DEG(57.29577951308232087679815481)
Multiplier for converting from radians to degrees.
int m_index
Index of this observation.
void SetPolynomial(const Source type=PolyFunction)
Set the coefficients of a polynomial fit to each of the components (X, Y, Z) of the position vector f...