23 BundleObservation::BundleObservation() {
24 m_serialNumbers.clear();
26 m_parameterNamesList.clear();
27 m_observationNumber =
"";
29 m_instrumentRotation = NULL;
30 m_instrumentPosition = NULL;
33 m_corrections.clear();
35 m_aprioriSigmas.clear();
36 m_adjustedSigmas.clear();
49 BundleObservation::BundleObservation(
BundleImageQsp image, QString observationNumber,
51 m_serialNumbers.clear();
53 m_parameterNamesList.clear();
54 m_observationNumber =
"";
56 m_instrumentRotation = NULL;
57 m_instrumentPosition = NULL;
60 m_corrections.clear();
62 m_aprioriSigmas.clear();
63 m_adjustedSigmas.clear();
65 m_observationNumber = observationNumber;
66 m_instrumentId = instrumentId;
68 m_bundleTargetBody = bundleTargetBody;
72 m_serialNumbers.append(image->serialNumber());
73 m_imageNames.append(image->fileName());
74 m_cubeSerialNumberToBundleImageMap.insert(image->serialNumber(), image);
79 m_instrumentPosition = (image->camera() ?
80 (image->camera()->instrumentPosition() ?
81 image->camera()->instrumentPosition() : NULL)
83 m_instrumentRotation = (image->camera() ?
84 (image->camera()->instrumentRotation() ?
85 image->camera()->instrumentRotation() : NULL)
125 BundleObservation::~BundleObservation() {
167 m_cubeSerialNumberToBundleImageMap.insert(value->serialNumber(), value);
181 BundleImageQsp BundleObservation::imageByCubeSerialNumber(QString cubeSerialNumber) {
184 if (m_cubeSerialNumberToBundleImageMap.contains(cubeSerialNumber)) {
185 bundleImage = m_cubeSerialNumberToBundleImageMap.value(cubeSerialNumber);
208 int nCameraAngleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
209 int nCameraPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
211 int nParameters = 3*nCameraPositionCoefficients + 2*nCameraAngleCoefficients;
212 if (nCameraAngleCoefficients >= 1 && m_solveSettings->solveTwist()) {
213 nParameters += nCameraAngleCoefficients;
216 m_weights.resize(nParameters);
218 m_corrections.resize(nParameters);
219 m_corrections.clear();
222 m_adjustedSigmas.resize(nParameters);
223 m_adjustedSigmas.clear();
224 m_aprioriSigmas.resize(nParameters);
225 for (
int i = 0; i < nParameters; i++)
228 if (!initParameterWeights()) {
243 QString BundleObservation::instrumentId() {
244 return m_instrumentId;
254 return m_instrumentRotation;
264 return m_instrumentPosition;
284 return m_corrections;
303 return m_aprioriSigmas;
313 return m_adjustedSigmas;
324 return m_solveSettings;
336 bool BundleObservation::initializeExteriorOrientation() {
338 if (m_solveSettings->instrumentPositionSolveOption() !=
339 BundleObservationSolveSettings::NoPositionFactors) {
341 double positionBaseTime = 0.0;
342 double positiontimeScale = 0.0;
343 std::vector<double> posPoly1, posPoly2, posPoly3;
345 for (
int i = 0; i < size(); i++) {
347 SpicePosition *spicePosition = image->camera()->instrumentPosition();
353 m_solveSettings->positionInterpolationType());
362 spicePosition->
SetPolynomial(m_solveSettings->positionInterpolationType());
367 if (m_instrumentPosition) {
368 positionBaseTime = m_instrumentPosition->GetBaseTime();
369 positiontimeScale = m_instrumentPosition->GetTimeScale();
370 m_instrumentPosition->GetPolynomial(posPoly1, posPoly2, posPoly3);
376 if (m_solveSettings->instrumentPointingSolveOption() !=
377 BundleObservationSolveSettings::NoPointingFactors) {
379 double rotationBaseTime = 0.0;
380 double rotationtimeScale = 0.0;
381 std::vector<double> anglePoly1, anglePoly2, anglePoly3;
383 for (
int i = 0; i < size(); i++) {
385 SpiceRotation *spicerotation = image->camera()->instrumentRotation();
390 spicerotation->
SetPolynomial(anglePoly1, anglePoly2, anglePoly3,
391 m_solveSettings->pointingInterpolationType());
400 spicerotation->
SetPolynomial(m_solveSettings->pointingInterpolationType());
407 spicerotation->
GetPolynomial(anglePoly1, anglePoly2, anglePoly3);
421 void BundleObservation::initializeBodyRotation() {
422 std::vector<Angle> raCoefs = m_bundleTargetBody->poleRaCoefs();
423 std::vector<Angle> decCoefs = m_bundleTargetBody->poleDecCoefs();
424 std::vector<Angle> pmCoefs = m_bundleTargetBody->pmCoefs();
426 for (
int i = 0; i < size(); i++) {
428 image->camera()->bodyRotation()->setPckPolynomial(raCoefs, decCoefs, pmCoefs);
439 void BundleObservation::updateBodyRotation() {
440 std::vector<Angle> raCoefs = m_bundleTargetBody->poleRaCoefs();
441 std::vector<Angle> decCoefs = m_bundleTargetBody->poleDecCoefs();
442 std::vector<Angle> pmCoefs = m_bundleTargetBody->pmCoefs();
444 for (
int i = 0; i < size(); i++) {
446 image->camera()->bodyRotation()->setPckPolynomial(raCoefs, decCoefs, pmCoefs);
513 bool BundleObservation::initParameterWeights() {
516 double posWeight = 0.0;
517 double velWeight = 0.0;
518 double accWeight = 0.0;
519 double angWeight = 0.0;
520 double angVelWeight = 0.0;
521 double angAccWeight = 0.0;
523 QList<double> aprioriPointingSigmas = m_solveSettings->aprioriPointingSigmas();
524 QList<double> aprioriPositionSigmas = m_solveSettings->aprioriPositionSigmas();
526 int nCamPosCoeffsSolved = 3 *m_solveSettings->numberCameraPositionCoefficientsSolved();
528 int nCamAngleCoeffsSolved;
529 if (m_solveSettings->solveTwist()) {
530 nCamAngleCoeffsSolved = 3 *m_solveSettings->numberCameraAngleCoefficientsSolved();
533 nCamAngleCoeffsSolved = 2 *m_solveSettings->numberCameraAngleCoefficientsSolved();
536 if (aprioriPositionSigmas.size() >= 1 && aprioriPositionSigmas.at(0) > 0.0) {
537 posWeight = aprioriPositionSigmas.at(0);
538 posWeight = 1.0 / (posWeight *posWeight * 1.0e-6);
540 if (aprioriPositionSigmas.size() >= 2 && aprioriPositionSigmas.at(1) > 0.0) {
541 velWeight = aprioriPositionSigmas.at(1);
542 velWeight = 1.0 / (velWeight *velWeight * 1.0e-6);
544 if (aprioriPositionSigmas.size() >= 3 && aprioriPositionSigmas.at(2) > 0.0) {
545 accWeight = aprioriPositionSigmas.at(2);
546 accWeight = 1.0 / (accWeight *accWeight * 1.0e-6);
549 if (aprioriPointingSigmas.size() >= 1 && aprioriPointingSigmas.at(0) > 0.0) {
550 angWeight = aprioriPointingSigmas.at(0);
553 if (aprioriPointingSigmas.size() >= 2 && aprioriPointingSigmas.at(1) > 0.0) {
554 angVelWeight = aprioriPointingSigmas.at(1);
555 angVelWeight = 1.0 / (angVelWeight * angVelWeight *
DEG2RAD *
DEG2RAD);
557 if (aprioriPointingSigmas.size() >= 3 && aprioriPointingSigmas.at(2) > 0.0) {
558 angAccWeight = aprioriPointingSigmas.at(2);
559 angAccWeight = 1.0 / (angAccWeight * angAccWeight *
DEG2RAD *
DEG2RAD);
562 int nSpkTerms = m_solveSettings->spkSolveDegree()+1;
563 nSpkTerms = m_solveSettings->numberCameraPositionCoefficientsSolved();
564 for (
int i = 0; i < nCamPosCoeffsSolved; i++) {
565 if (i % nSpkTerms == 0) {
566 m_aprioriSigmas[i] = aprioriPositionSigmas.at(0);
567 m_weights[i] = posWeight;
569 if (i % nSpkTerms == 1) {
570 m_aprioriSigmas[i] = aprioriPositionSigmas.at(1);
571 m_weights[i] = velWeight;
573 if (i % nSpkTerms == 2) {
574 m_aprioriSigmas[i] = aprioriPositionSigmas.at(2);
575 m_weights[i] = accWeight;
579 int nCkTerms = m_solveSettings->ckSolveDegree()+1;
580 nCkTerms = m_solveSettings->numberCameraAngleCoefficientsSolved();
581 for (
int i = 0; i < nCamAngleCoeffsSolved; i++) {
582 if (i % nCkTerms == 0) {
583 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(0);
584 m_weights[nCamPosCoeffsSolved + i] = angWeight;
586 if (i % nCkTerms == 1) {
587 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(1);
588 m_weights[nCamPosCoeffsSolved + i] = angVelWeight;
590 if (i % nCkTerms == 2) {
591 m_aprioriSigmas[nCamPosCoeffsSolved + i] = aprioriPointingSigmas.at(2);
592 m_weights[nCamPosCoeffsSolved + i] = angAccWeight;
624 int nCameraAngleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
625 int nCameraPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
628 = m_solveSettings->instrumentPositionSolveOption();
629 if (positionOption != BundleObservationSolveSettings::NoPositionFactors) {
631 if (!m_instrumentPosition) {
632 QString msg =
"Instrument position is NULL, but position solve option is ";
633 msg.append(BundleObservationSolveSettings::instrumentPositionSolveOptionToString(
638 std::vector<double> coefX(nCameraPositionCoefficients);
639 std::vector<double> coefY(nCameraPositionCoefficients);
640 std::vector<double> coefZ(nCameraPositionCoefficients);
642 m_instrumentPosition->GetPolynomial(coefX, coefY, coefZ);
645 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
646 coefX[i] += corrections(index);
651 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
652 coefY[i] += corrections(index);
657 for (
int i = 0; i < nCameraPositionCoefficients; i++) {
658 coefZ[i] += corrections(index);
663 for (
int i = 0; i < size(); i++) {
665 SpicePosition *spiceposition = image->camera()->instrumentPosition();
667 m_solveSettings->positionInterpolationType());
672 = m_solveSettings->instrumentPointingSolveOption();
673 if (pointingOption != BundleObservationSolveSettings::NoPointingFactors) {
675 if (!m_instrumentRotation) {
676 QString msg =
"Instrument rotation is NULL, but pointing solve option is ";
677 msg.append(BundleObservationSolveSettings::instrumentPointingSolveOptionToString(
682 std::vector<double> coefRA(nCameraPositionCoefficients);
683 std::vector<double> coefDEC(nCameraPositionCoefficients);
684 std::vector<double> coefTWI(nCameraPositionCoefficients);
686 m_instrumentRotation->GetPolynomial(coefRA, coefDEC, coefTWI);
689 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
690 coefRA[i] += corrections(index);
695 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
696 coefDEC[i] += corrections(index);
700 if (m_solveSettings->solveTwist()) {
702 for (
int i = 0; i < nCameraAngleCoefficients; i++) {
703 coefTWI[i] += corrections(index);
709 for (
int i = 0; i < size(); i++) {
711 SpiceRotation *spiceRotation = image->camera()->instrumentRotation();
713 m_solveSettings->pointingInterpolationType());
718 m_corrections += corrections;
722 QString msg =
"Unable to apply parameter corrections to BundleObservation.";
734 int BundleObservation::numberPositionParameters() {
735 return 3.0 * m_solveSettings->numberCameraPositionCoefficientsSolved();
744 int BundleObservation::numberPointingParameters() {
745 int angleCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
747 if (m_solveSettings->solveTwist()) {
748 return 3.0 * angleCoefficients;
750 return 2.0 * angleCoefficients;
762 int BundleObservation::numberParameters() {
763 return numberPositionParameters() + numberPointingParameters();
772 void BundleObservation::setIndex(
int n) {
782 int BundleObservation::index() {
805 QString BundleObservation::formatBundleOutputString(
bool errorPropagation,
bool imageCSV) {
807 std::cerr <<
"The function formatBundleOutputString is depricated as of ISIS 3.9" 808 "and will be removed in ISIS 4.0" << std::endl;
810 std::vector<double> coefX;
811 std::vector<double> coefY;
812 std::vector<double> coefZ;
813 std::vector<double> coefRA;
814 std::vector<double> coefDEC;
815 std::vector<double> coefTWI;
817 int nPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
818 int nPointingCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
821 bool useDefaultPosition =
false;
822 bool useDefaultPointing =
false;
824 bool useDefaultTwist = !(m_solveSettings->solveTwist());
828 if (nPositionCoefficients == 0) {
829 nPositionCoefficients = 1;
830 useDefaultPosition =
true;
834 if (nPointingCoefficients == 0) {
835 nPointingCoefficients = 1;
836 useDefaultPointing =
true;
841 int nPositionParameters = 3 * nPositionCoefficients;
842 int nPointingParameters = 3 * nPointingCoefficients;
843 int nParameters = nPositionParameters + nPointingParameters;
845 coefX.resize(nPositionCoefficients);
846 coefY.resize(nPositionCoefficients);
847 coefZ.resize(nPositionCoefficients);
848 coefRA.resize(nPointingCoefficients);
849 coefDEC.resize(nPointingCoefficients);
850 coefTWI.resize(nPointingCoefficients);
852 if (m_instrumentPosition) {
853 if (!useDefaultPosition) {
854 m_instrumentPosition->GetPolynomial(coefX, coefY, coefZ);
858 const std::vector<double> centerCoord = m_instrumentPosition->GetCenterCoordinate();
859 coefX[0] = centerCoord[0];
860 coefY[0] = centerCoord[1];
861 coefZ[0] = centerCoord[2];
865 if (m_instrumentRotation) {
866 if (!useDefaultPointing) {
867 m_instrumentRotation->GetPolynomial(coefRA, coefDEC, coefTWI);
871 const std::vector<double> centerAngles = m_instrumentRotation->GetCenterAngles();
872 coefRA[0] = centerAngles[0];
873 coefDEC[0] = centerAngles[1];
874 coefTWI[0] = centerAngles[2];
879 std::vector<double> finalParameterValues;
884 QString str(
"%1(t%2)");
886 if (nPositionCoefficients > 0) {
887 for (
int i = 0; i < nPositionCoefficients; i++) {
888 finalParameterValues.push_back(coefX[i]);
890 parameterNamesList.append( str.arg(
" X ").arg(
"0") );
892 parameterNamesList.append( str.arg(
" ").arg(i) );
894 for (
int i = 0; i < nPositionCoefficients; i++) {
895 finalParameterValues.push_back(coefY[i]);
897 parameterNamesList.append( str.arg(
" Y ").arg(
"0") );
899 parameterNamesList.append( str.arg(
" ").arg(i) );
901 for (
int i = 0; i < nPositionCoefficients; i++) {
902 finalParameterValues.push_back(coefZ[i]);
904 parameterNamesList.append( str.arg(
" Z ").arg(
"0") );
906 parameterNamesList.append( str.arg(
" ").arg(i) );
909 if (nPointingCoefficients > 0) {
910 for (
int i = 0; i < nPointingCoefficients; i++) {
911 finalParameterValues.push_back(coefRA[i] *
RAD2DEG);
913 parameterNamesList.append( str.arg(
" RA ").arg(
"0") );
915 parameterNamesList.append( str.arg(
" ").arg(i) );
917 for (
int i = 0; i < nPointingCoefficients; i++) {
918 finalParameterValues.push_back(coefDEC[i] *
RAD2DEG);
920 parameterNamesList.append( str.arg(
"DEC ").arg(
"0") );
922 parameterNamesList.append( str.arg(
" ").arg(i) );
924 for (
int i = 0; i < nPointingCoefficients; i++) {
925 finalParameterValues.push_back(coefTWI[i] *
RAD2DEG);
927 parameterNamesList.append( str.arg(
"TWI ").arg(
"0") );
929 parameterNamesList.append( str.arg(
" ").arg(i) );
936 if (nPositionCoefficients > 0) {
937 for (
int i = 0; i < nPositionCoefficients; i++) {
938 finalParameterValues.push_back(coefX[i]);
940 for (
int i = 0; i < nPositionCoefficients; i++) {
941 finalParameterValues.push_back(coefY[i]);
943 for (
int i = 0; i < nPositionCoefficients; i++) {
944 finalParameterValues.push_back(coefZ[i]);
947 if (nPointingCoefficients > 0) {
948 for (
int i = 0; i < nPointingCoefficients; i++) {
949 finalParameterValues.push_back(coefRA[i] *
RAD2DEG);
951 for (
int i = 0; i < nPointingCoefficients; i++) {
952 finalParameterValues.push_back(coefDEC[i] *
RAD2DEG);
954 for (
int i = 0; i < nPointingCoefficients; i++) {
955 finalParameterValues.push_back(coefTWI[i] *
RAD2DEG);
961 m_parameterNamesList = parameterNamesList;
963 QString finalqStr =
"";
967 QString sigma =
"N/A";
968 QString adjustedSigma =
"N/A";
969 double correction = 0.0;
974 for (
int i = 0; i < nPositionParameters; i++) {
977 if (!useDefaultPosition) {
978 correction = m_corrections(i);
979 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
980 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
982 if (errorPropagation) {
983 qStr = QString(
"%1%2%3%4%5%6\n").
984 arg( parameterNamesList.at(i) ).
985 arg(finalParameterValues[i] - correction, 17,
'f', 8).
986 arg(correction, 21,
'f', 8).
987 arg(finalParameterValues[i], 20,
'f', 8).
989 arg(adjustedSigma, 18);
992 qStr = QString(
"%1%2%3%4%5%6\n").
993 arg( parameterNamesList.at(i) ).
994 arg(finalParameterValues[i] - correction, 17,
'f', 8).
995 arg(correction, 21,
'f', 8).
996 arg(finalParameterValues[i], 20,
'f', 8).
1007 if (useDefaultPosition) {
1011 for (
int i = nPositionParameters; i < nParameters; i++) {
1012 if (!useDefaultPointing) {
1016 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1018 adjustedSigma =
"N/A";
1022 correction = m_corrections(i - offset);
1023 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1024 sigma = (
IsSpecial(m_aprioriSigmas[i - offset]) ?
"FREE" :
1025 toString(m_aprioriSigmas[i-offset], 8) );
1031 adjustedSigma =
"N/A";
1034 if (errorPropagation) {
1035 qStr = QString(
"%1%2%3%4%5%6\n").
1036 arg( parameterNamesList.at(i) ).
1037 arg( (finalParameterValues[i] - correction *
RAD2DEG), 17,
'f', 8).
1038 arg(correction *
RAD2DEG, 21,
'f', 8).
1039 arg(finalParameterValues[i], 20,
'f', 8).
1041 arg(adjustedSigma, 18);
1044 qStr = QString(
"%1%2%3%4%5%6\n").
1045 arg( parameterNamesList.at(i) ).
1046 arg( (finalParameterValues[i] - correction *
RAD2DEG), 17,
'f', 8).
1047 arg(correction *
RAD2DEG, 21,
'f', 8).
1048 arg(finalParameterValues[i], 20,
'f', 8).
1059 for (
int i = 0; i < nPositionParameters; i++) {
1060 if (!useDefaultPosition) {
1061 correction = m_corrections(i);
1062 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
1063 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
1068 adjustedSigma =
"N/A";
1072 if (errorPropagation) {
1073 qStr +=
toString(finalParameterValues[i] - correction) +
",";
1074 qStr +=
toString(correction) +
",";
1075 qStr +=
toString(finalParameterValues[i]) +
",";
1076 qStr += sigma +
",";
1077 qStr += adjustedSigma +
",";
1080 qStr +=
toString(finalParameterValues[i] - correction) +
",";
1081 qStr +=
toString(correction) +
",";
1082 qStr +=
toString(finalParameterValues[i]) +
",";
1083 qStr += sigma +
",";
1093 if (useDefaultPosition) {
1097 for (
int i = nPositionParameters; i < nParameters; i++) {
1098 if (!useDefaultPointing) {
1101 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1103 adjustedSigma =
"N/A";
1107 correction = m_corrections(i - offset);
1108 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1109 sigma = (
IsSpecial(m_aprioriSigmas[i-offset]) ?
"FREE" :
1110 toString(m_aprioriSigmas[i-offset], 8) );
1116 adjustedSigma =
"N/A";
1120 if (errorPropagation) {
1121 qStr +=
toString(finalParameterValues[i] - correction *
RAD2DEG) +
",";
1123 qStr +=
toString(finalParameterValues[i]) +
",";
1124 qStr += sigma +
",";
1125 qStr += adjustedSigma +
",";
1128 qStr +=
toString(finalParameterValues[i] - correction *
RAD2DEG) +
",";
1130 qStr +=
toString(finalParameterValues[i]) +
",";
1131 qStr += sigma +
",";
1154 int &nPositionCoefficients,
int &nPointingCoefficients,
1155 bool &useDefaultPosition,
1156 bool &useDefaultPointing,
bool &useDefaultTwist) {
1158 std::vector<double> coefX,coefY,coefZ,coefRA,coefDEC,coefTWI;
1159 nPositionCoefficients = m_solveSettings->numberCameraPositionCoefficientsSolved();
1160 nPointingCoefficients = m_solveSettings->numberCameraAngleCoefficientsSolved();
1163 useDefaultPosition =
false;
1164 useDefaultPointing =
false;
1166 useDefaultTwist = !(m_solveSettings->solveTwist());
1170 if (nPositionCoefficients == 0) {
1171 nPositionCoefficients = 1;
1172 useDefaultPosition =
true;
1177 if (nPointingCoefficients == 0) {
1178 nPointingCoefficients = 1;
1179 useDefaultPointing =
true;
1182 coefX.resize(nPositionCoefficients);
1183 coefY.resize(nPositionCoefficients);
1184 coefZ.resize(nPositionCoefficients);
1185 coefRA.resize(nPointingCoefficients);
1186 coefDEC.resize(nPointingCoefficients);
1187 coefTWI.resize(nPointingCoefficients);
1189 if (m_instrumentPosition) {
1190 if (!useDefaultPosition) {
1191 m_instrumentPosition->GetPolynomial(coefX,coefY,coefZ);
1195 const std::vector<double> centerCoord = m_instrumentPosition->GetCenterCoordinate();
1196 coefX[0] = centerCoord[0];
1197 coefY[0] = centerCoord[1];
1198 coefZ[0] = centerCoord[2];
1202 if (m_instrumentRotation) {
1203 if (!useDefaultPointing) {
1204 m_instrumentRotation->GetPolynomial(coefRA,coefDEC,coefTWI);
1208 const std::vector<double> centerAngles = m_instrumentRotation->GetCenterAngles();
1209 coefRA[0] = centerAngles[0];
1210 coefDEC[0] = centerAngles[1];
1211 coefTWI[0] = centerAngles[2];
1216 if (nPositionCoefficients > 0) {
1217 for (
int i=0; i < nPositionCoefficients; i++) {
1218 finalParameterValues.append(coefX[i]);
1220 for (
int i=0; i < nPositionCoefficients; i++) {
1221 finalParameterValues.append(coefY[i]);
1223 for (
int i=0; i < nPositionCoefficients; i++) {
1224 finalParameterValues.append(coefZ[i]);
1227 if (nPointingCoefficients > 0) {
1228 for (
int i=0; i < nPointingCoefficients; i++) {
1229 finalParameterValues.append(coefRA[i]);
1231 for (
int i=0; i < nPointingCoefficients; i++) {
1232 finalParameterValues.append(coefDEC[i]);
1234 for (
int i=0; i < nPointingCoefficients; i++) {
1235 finalParameterValues.append(coefTWI[i]);
1251 void BundleObservation::bundleOutputString(std::ostream &fpOut,
bool errorPropagation) {
1256 int nPositionCoefficients, nPointingCoefficients;
1257 bool useDefaultPosition, useDefaultPointing,useDefaultTwist;
1259 bundleOutputFetchData(finalParameterValues,
1260 nPositionCoefficients,nPointingCoefficients,
1261 useDefaultPosition,useDefaultPointing,useDefaultTwist);
1263 int nPositionParameters = 3 * nPositionCoefficients;
1264 int nPointingParameters = 3 * nPointingCoefficients;
1265 int nParameters = nPositionParameters + nPointingParameters;
1268 QStringList parameterNamesListX,parameterNamesListY,parameterNamesListZ,
1269 parameterNamesListRA,parameterNamesListDEC,parameterNamesListTWI,
1271 QStringList correctionUnitListX,correctionUnitListY,correctionUnitListZ,
1272 correctionUnitListRA,correctionUnitListDEC,correctionUnitListTWI,
1275 QString str(
"%1(%2) ");
1276 QString str2(
"%1(%2) ");
1277 QString strN(
"%1(%2)");
1280 if (nPositionCoefficients > 0) {
1281 for (
int j = 0; j < nPositionCoefficients;j++) {
1283 parameterNamesListX.append(str.arg(
" X ").arg(
"km"));
1284 parameterNamesListY.append(str.arg(
" Y ").arg(
"km"));
1285 parameterNamesListZ.append(str.arg(
" Z ").arg(
"km"));
1286 correctionUnitListX.append(
"m");
1287 correctionUnitListY.append(
"m");
1288 correctionUnitListZ.append(
"m");
1292 parameterNamesListX.append( str2.arg(
" ").arg(
"km/s") );
1293 parameterNamesListY.append( str2.arg(
" ").arg(
"km/s") );
1294 parameterNamesListZ.append( str2.arg(
" ").arg(
"km/s") );
1295 correctionUnitListX.append(
"m/s");
1296 correctionUnitListY.append(
"m/s");
1297 correctionUnitListZ.append(
"m/s");
1300 QString str(
"%1(%2)");
1301 parameterNamesListX.append(strN.arg(
" ").arg(
"km/s^"+
toString(j) ) );
1302 parameterNamesListY.append(strN.arg(
" ").arg(
"km/s^"+
toString(j) ) );
1303 parameterNamesListZ.append(strN.arg(
" ").arg(
"km/s^"+
toString(j) ) );
1304 correctionUnitListX.append(
"m/s^"+
toString(j));
1305 correctionUnitListY.append(
"m/s^"+
toString(j));
1306 correctionUnitListZ.append(
"m/s^"+
toString(j));
1311 if (nPointingCoefficients > 0) {
1312 for (
int j = 0; j < nPointingCoefficients;j++) {
1314 parameterNamesListRA.append(str.arg(
" RA ").arg(
"dd"));
1315 parameterNamesListDEC.append(str.arg(
"DEC ").arg(
"dd"));
1316 parameterNamesListTWI.append(str.arg(
"TWI ").arg(
"dd"));
1317 correctionUnitListRA.append(
"dd");
1318 correctionUnitListDEC.append(
"dd");
1319 correctionUnitListTWI.append(
"dd");
1323 parameterNamesListRA.append( str2.arg(
" ").arg(
"dd/s") );
1324 parameterNamesListDEC.append( str2.arg(
" ").arg(
"dd/s") );
1325 parameterNamesListTWI.append( str2.arg(
" ").arg(
"dd/s") );
1326 correctionUnitListRA.append(
"dd/s");
1327 correctionUnitListDEC.append(
"dd/s");
1328 correctionUnitListTWI.append(
"dd/s");
1331 parameterNamesListRA.append(strN.arg(
" ").arg(
"dd/s^"+
toString(j) ) );
1332 parameterNamesListDEC.append(strN.arg(
" ").arg(
"dd/s^"+
toString(j) ) );
1333 parameterNamesListTWI.append(strN.arg(
" ").arg(
"dd/s^"+
toString(j) ) );
1334 correctionUnitListRA.append(
"dd/s^"+
toString(j));
1335 correctionUnitListDEC.append(
"dd/s^"+
toString(j));
1336 correctionUnitListTWI.append(
"dd/s^"+
toString(j));
1342 parameterNamesList.append(parameterNamesListX);
1343 parameterNamesList.append(parameterNamesListY);
1344 parameterNamesList.append(parameterNamesListZ);
1345 parameterNamesList.append(parameterNamesListRA);
1346 parameterNamesList.append(parameterNamesListDEC);
1347 parameterNamesList.append(parameterNamesListTWI);
1350 correctionUnitList.append(correctionUnitListX);
1351 correctionUnitList.append(correctionUnitListY);
1352 correctionUnitList.append(correctionUnitListZ);
1353 correctionUnitList.append(correctionUnitListDEC);
1354 correctionUnitList.append(correctionUnitListRA);
1355 correctionUnitList.append(correctionUnitListTWI);
1358 m_parameterNamesList = parameterNamesList;
1361 QString sigma =
"N/A";
1362 QString adjustedSigma =
"N/A";
1363 double correction = 0.0;
1366 for (
int i = 0; i < nPositionParameters; i++) {
1369 if (!useDefaultPosition) {
1370 correction = m_corrections(i);
1371 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
1372 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
1375 sprintf(buf,
"%s",parameterNamesList.at(i).toStdString().c_str() );
1377 sprintf(buf,
"%18.8lf ",finalParameterValues[i] - correction);
1379 sprintf(buf,
"%20.8lf ",correction);
1381 sprintf(buf,
"%23.8lf ",finalParameterValues[i]);
1385 sprintf(buf,
"%6s",sigma.toStdString().c_str());
1389 if (errorPropagation) {
1390 sprintf(buf,
"%s",adjustedSigma.toStdString().c_str());
1393 sprintf(buf,
"%s",
"N/A");
1398 sprintf(buf,
"%s\n",correctionUnitList.at(i).toStdString().c_str() );
1407 if (useDefaultPosition) {
1412 for (
int i = nPositionParameters; i < nParameters; i++) {
1413 if (!useDefaultPointing) {
1417 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1419 adjustedSigma =
"N/A";
1423 correction = m_corrections(i - offset);
1424 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1425 sigma = (
IsSpecial(m_aprioriSigmas[i - offset]) ?
"FREE" :
1426 toString(m_aprioriSigmas[i-offset], 8) );
1432 adjustedSigma =
"N/A";
1436 sprintf(buf,
"%s",parameterNamesList.at(i).toStdString().c_str() );
1438 sprintf(buf,
"%18.8lf ",(finalParameterValues[i]*
RAD2DEG - correction*
RAD2DEG));
1440 sprintf(buf,
"%20.8lf ",(correction*
RAD2DEG));
1442 sprintf(buf,
"%23.8lf ",(finalParameterValues[i]*
RAD2DEG));
1446 sprintf(buf,
"%6s",sigma.toStdString().c_str());
1450 if (errorPropagation) {
1451 sprintf(buf,
"%s",adjustedSigma.toStdString().c_str());
1454 sprintf(buf,
"%s",
"N/A");
1459 sprintf(buf,
"%s\n",correctionUnitList.at(i).toStdString().c_str() );
1475 QString BundleObservation::bundleOutputCSV(
bool errorPropagation) {
1478 int nPositionCoefficients, nPointingCoefficients;
1479 bool useDefaultPosition, useDefaultPointing,useDefaultTwist;
1481 bundleOutputFetchData(finalParameterValues,
1482 nPositionCoefficients,nPointingCoefficients,
1483 useDefaultPosition,useDefaultPointing,useDefaultTwist);
1485 int nPositionParameters = 3 * nPositionCoefficients;
1486 int nPointingParameters = 3 * nPointingCoefficients;
1487 int nParameters = nPositionParameters + nPointingParameters;
1489 QString finalqStr =
"";
1492 QString sigma =
"N/A";
1493 QString adjustedSigma =
"N/A";
1494 double correction = 0.0;
1497 for (
int i = 0; i < nPositionParameters; i++) {
1498 if (!useDefaultPosition) {
1499 correction = m_corrections(i);
1500 adjustedSigma = QString::number(m_adjustedSigmas[i],
'f', 8);
1501 sigma = (
IsSpecial(m_aprioriSigmas[i]) ?
"FREE" :
toString(m_aprioriSigmas[i], 8) );
1506 adjustedSigma =
"N/A";
1510 finalqStr +=
toString(finalParameterValues[i] - correction) +
",";
1511 finalqStr +=
toString(correction) +
",";
1512 finalqStr +=
toString(finalParameterValues[i]) +
",";
1513 finalqStr += sigma +
",";
1514 if (errorPropagation) {
1515 finalqStr += adjustedSigma +
",";
1518 finalqStr +=
"N/A,";
1527 if (useDefaultPosition) {
1531 for (
int i = nPositionParameters; i < nParameters; i++) {
1532 if (!useDefaultPointing) {
1535 if ( (i >= nParameters - nPointingCoefficients) && useDefaultTwist) {
1537 adjustedSigma =
"N/A";
1541 correction = m_corrections(i - offset);
1542 adjustedSigma = QString::number(m_adjustedSigmas(i-offset) *
RAD2DEG,
'f', 8);
1543 sigma = (
IsSpecial(m_aprioriSigmas[i-offset]) ?
"FREE" :
1544 toString(m_aprioriSigmas[i-offset], 8) );
1550 adjustedSigma =
"N/A";
1557 finalqStr += sigma +
",";
1558 if (errorPropagation) {
1559 finalqStr += adjustedSigma +
",";
1562 finalqStr +=
"N/A,";
1577 return m_parameterNamesList;
1587 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 BundleObservationSolveSetting...
QMap< QString, BundleImageQsp > m_cubeSerialNumberToBundleImageMap
Map between cube serial number and BundleImage pointers.
Namespace for the standard library.
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.
const double DEG2RAD
Multiplier for converting from degrees to radians.
QString m_instrumentId
Spacecraft instrument id.
InstrumentPositionSolveOption
Options for how to solve for instrument position.
Obtain SPICE position information for a body.
Namespace for ISIS/Bullet specific routines.
SpicePosition * m_instrumentPosition
Instrument spice position (in primary image).
InstrumentPointingSolveOption
Options for how to solve for instrument pointing.
const double RAD2DEG
Multiplier for converting from radians to degrees.
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...
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...