10 #include "ControlMeasure.h"
13 #include <QStringList>
15 #include "Application.h"
17 #include "ControlMeasureLogData.h"
18 #include "ControlNet.h"
19 #include "ControlPoint.h"
22 #include "SpecialPixel.h"
30 ControlMeasure::ControlMeasure() {
32 p_serialNumber =
new QString;
33 p_chooserName =
new QString;
34 p_dateTime =
new QString;
37 p_measureType = Candidate;
39 p_jigsawRejected =
false;
53 p_serialNumber =
new QString(*other.p_serialNumber);
55 p_dateTime =
new QString(*other.p_dateTime);
59 p_measureType = other.p_measureType;
62 p_ignore = other.p_ignore;
65 p_diameter = other.p_diameter;
72 p_camera = other.p_camera;
77 void ControlMeasure::InitializeToNull() {
82 p_serialNumber = NULL;
88 p_aprioriSample =
Null;
90 p_computedEphemerisTime =
Null;
93 p_sampleResidual =
Null;
94 p_lineResidual =
Null;
97 p_focalPlaneMeasuredX =
Null;
98 p_focalPlaneMeasuredY =
Null;
99 p_focalPlaneComputedX =
Null;
100 p_focalPlaneComputedY =
Null;
101 p_measuredEphemerisTime =
Null;
110 ControlMeasure::~ControlMeasure() {
111 if (p_serialNumber) {
112 delete p_serialNumber;
113 p_serialNumber = NULL;
117 delete p_chooserName;
118 p_chooserName = NULL;
134 ControlMeasure::Status ControlMeasure::SetAprioriLine(
double aprioriLine) {
136 return MeasureLocked;
139 p_aprioriLine = aprioriLine;
144 ControlMeasure::Status ControlMeasure::SetAprioriSample(
145 double aprioriSample) {
147 return MeasureLocked;
150 p_aprioriSample = aprioriSample;
169 ControlMeasure::Status ControlMeasure::SetCamera(
Isis::Camera *camera) {
187 ControlMeasure::Status ControlMeasure::SetCubeSerialNumber(QString newSerialNumber) {
189 return MeasureLocked;
190 *p_serialNumber = newSerialNumber;
196 ControlMeasure::Status ControlMeasure::SetChooserName() {
198 return MeasureLocked;
205 ControlMeasure::Status ControlMeasure::SetChooserName(QString name) {
207 return MeasureLocked;
208 *p_chooserName = name;
219 ControlMeasure::Status ControlMeasure::SetCoordinate(
double sample,
221 return SetCoordinate(sample, line, GetType());
232 ControlMeasure::Status ControlMeasure::SetCoordinate(
double sample,
235 return MeasureLocked;
247 ControlMeasure::Status ControlMeasure::SetDateTime() {
249 return MeasureLocked;
250 *p_dateTime = Application::DateTime();
256 ControlMeasure::Status ControlMeasure::SetDateTime(QString datetime) {
258 return MeasureLocked;
259 *p_dateTime = datetime;
272 ControlMeasure::Status ControlMeasure::SetDiameter(
double diameter) {
274 return MeasureLocked;
276 p_diameter = diameter;
281 ControlMeasure::Status ControlMeasure::SetEditLock(
bool editLock) {
282 p_editLock = editLock;
299 ControlMeasure::Status ControlMeasure::SetFocalPlaneMeasured(
double x,
301 p_focalPlaneMeasuredX = x;
302 p_focalPlaneMeasuredY = y;
319 ControlMeasure::Status ControlMeasure::SetFocalPlaneComputed(
double x,
321 p_focalPlaneComputedX = x;
322 p_focalPlaneComputedY = y;
343 ControlMeasure::Status ControlMeasure::SetRejected(
bool reject) {
345 p_jigsawRejected = reject;
350 ControlMeasure::Status ControlMeasure::SetIgnored(
bool newIgnoreStatus) {
352 return MeasureLocked;
355 bool oldStatus = p_ignore;
356 p_ignore = newIgnoreStatus;
359 Parent()->emitMeasureModified(
this, IgnoredModified, oldStatus, p_ignore);
363 if (oldStatus != p_ignore) {
365 if (parentPoint && !parentPoint->IsIgnored() && parentPoint->Parent()) {
366 ControlNet * cnet = parentPoint->Parent();
367 p_ignore ? cnet->measureIgnored(
this) : cnet->measureUnIgnored(
this);
368 cnet->emitNetworkStructureModified();
377 ControlMeasure::Status ControlMeasure::SetLineSigma(
double lineSigma) {
379 return MeasureLocked;
381 p_lineSigma = lineSigma;
399 ControlMeasure::Status ControlMeasure::SetResidual(
double sampResidual,
400 double lineResidual) {
404 p_sampleResidual = sampResidual;
405 p_lineResidual = lineResidual;
410 ControlMeasure::Status ControlMeasure::SetSampleSigma(
double sampleSigma) {
412 return MeasureLocked;
414 p_sampleSigma = sampleSigma;
420 ControlMeasure::Status ControlMeasure::SetType(
MeasureType type) {
422 return MeasureLocked;
425 p_measureType = type;
437 QString msg =
"Cannot set log data with invalid information stored in "
438 "the ControlMeasureLogData";
439 throw IException(IException::Programmer, msg, _FILEINFO_);
445 p_loggedData->append(data);
455 void ControlMeasure::DeleteLogData(
long dataType) {
456 for (
int i = p_loggedData->size()-1; i >= 0; i--) {
460 p_loggedData->remove(i);
469 QVariant ControlMeasure::GetLogValue(
long dataType)
const {
470 for (
int i = 0; i < p_loggedData->size(); i++) {
486 bool ControlMeasure::HasLogData(
long dataType)
const {
487 for (
int i = 0; i < p_loggedData->size(); i++) {
505 bool updated =
false;
507 for (
int i = 0; i < p_loggedData->size(); i++) {
511 (*p_loggedData)[i] = newLogData;
517 QString msg =
"Unable to update the log data for ["
519 " control measure does not have log data for this value. Please use "
520 "SetLogData instead";
521 throw IException(IException::Programmer, msg, _FILEINFO_);
526 double ControlMeasure::GetAprioriLine()
const {
527 return p_aprioriLine;
531 double ControlMeasure::GetAprioriSample()
const {
532 return p_aprioriSample;
542 QString ControlMeasure::GetChooserName()
const {
543 if (*p_chooserName !=
"") {
544 return *p_chooserName;
552 bool ControlMeasure::HasChooserName()
const {
553 return !p_chooserName->isEmpty();
557 QString ControlMeasure::GetCubeSerialNumber()
const {
558 return *p_serialNumber;
563 QString ControlMeasure::GetDateTime()
const {
564 if (*p_dateTime !=
"") {
568 return Application::DateTime();
573 bool ControlMeasure::HasDateTime()
const {
574 return !p_dateTime->isEmpty();
580 double ControlMeasure::GetDiameter()
const {
601 bool ControlMeasure::IsEditLocked()
const {
603 if (parentPoint != NULL && parentPoint->IsEditLocked() &&
604 this == parentPoint->GetRefMeasure())
610 double ControlMeasure::GetFocalPlaneComputedX()
const {
611 return p_focalPlaneComputedX;
615 double ControlMeasure::GetFocalPlaneComputedY()
const {
616 return p_focalPlaneComputedY;
620 double ControlMeasure::GetFocalPlaneMeasuredX()
const {
621 return p_focalPlaneMeasuredX;
625 double ControlMeasure::GetFocalPlaneMeasuredY()
const {
626 return p_focalPlaneMeasuredY;
630 bool ControlMeasure::IsIgnored()
const {
635 bool ControlMeasure::IsRejected()
const {
636 return p_jigsawRejected;
640 bool ControlMeasure::IsMeasured()
const {
641 return p_measureType != Candidate;
645 bool ControlMeasure::IsRegistered()
const {
646 return (p_measureType == RegisteredPixel ||
647 p_measureType == RegisteredSubPixel);
650 bool ControlMeasure::IsStatisticallyRelevant(DataField field)
const {
651 bool relevant =
false;
652 bool validField =
false;
658 case CubeSerialNumber:
661 case FocalPlaneMeasured:
662 case FocalPlaneComputed:
681 QString msg =
"Cannot test IsStatisticallyRelevant on Measure Data ["
682 + QString(field) +
"]";
683 throw IException(IException::Programmer, msg, _FILEINFO_);
690 double ControlMeasure::GetLine()
const {
695 double ControlMeasure::GetLineResidual()
const {
696 return p_lineResidual;
700 double ControlMeasure::GetLineSigma()
const {
712 double ControlMeasure::GetResidualMagnitude()
const {
716 double dist = (p_lineResidual * p_lineResidual) +
717 (p_sampleResidual * p_sampleResidual);
723 double ControlMeasure::GetSample()
const {
728 double ControlMeasure::GetSampleResidual()
const {
729 return p_sampleResidual;
733 double ControlMeasure::GetSampleSigma()
const {
734 return p_sampleSigma;
738 ControlMeasure::MeasureType ControlMeasure::GetType()
const {
739 return p_measureType;
743 QString ControlMeasure::GetPointId()
const {
744 if (parentPoint == NULL) {
745 QString msg =
"Measure has no containing point";
746 throw IException(IException::User, msg, _FILEINFO_);
749 return parentPoint->GetId();
753 double ControlMeasure::GetSampleShift()
const {
754 return (p_sample != Null && p_aprioriSample != Null) ?
755 p_sample - p_aprioriSample :
Null;
759 double ControlMeasure::GetLineShift()
const {
760 return (p_line != Null && p_aprioriLine != Null) ?
761 p_line - p_aprioriLine :
Null;
765 double ControlMeasure::GetPixelShift()
const {
766 double sampleShift = GetSampleShift();
767 double lineShift = GetLineShift();
768 return (sampleShift != Null && lineShift != Null) ?
769 sqrt(pow(GetSampleShift(), 2) + pow(GetLineShift(), 2)) :
Null;
773 ControlMeasureLogData ControlMeasure::GetLogData(
long dataType)
const {
775 ControlMeasureLogData::NumericLogDataType typedDataType =
776 (ControlMeasureLogData::NumericLogDataType)dataType;
778 while (foundIndex < p_loggedData->size()) {
779 const ControlMeasureLogData &logData = p_loggedData->at(foundIndex);
780 if (logData.GetDataType() == typedDataType) {
787 return ControlMeasureLogData(typedDataType);
799 logs = *p_loggedData;
806 double ControlMeasure::GetMeasureData(QString data)
const {
807 if (data ==
"SampleResidual") {
808 return p_sampleResidual;
810 else if (data ==
"LineResidual") {
811 return p_lineResidual;
813 else if (data ==
"Type") {
814 return p_measureType;
816 else if (data ==
"IsMeasured") {
819 else if (data ==
"IsRegistered") {
820 return IsRegistered();
822 else if (data ==
"Ignore") {
826 QString msg = data +
" passed to GetMeasureData but is invalid";
827 throw IException(IException::Programmer, msg, _FILEINFO_);
836 names.push_back(
"SampleResidual");
837 names.push_back(
"LineResidual");
838 names.push_back(
"Type");
839 names.push_back(
"IsMeasured");
840 names.push_back(
"IsRegistered");
841 names.push_back(
"Ignore");
858 qsl <<
"AprioriLine" << QString::number(p_aprioriLine);
862 qsl <<
"AprioriSample" << QString::number(p_aprioriSample);
866 qsl <<
"ChooserName" << *p_chooserName;
870 qsl <<
"CubeSerialNumber" << *p_serialNumber;
874 qsl <<
"DateTime" << *p_dateTime;
878 qsl <<
"Line" << QString::number(p_line);
882 qsl <<
"LineResidual" << QString::number(p_lineResidual);
886 qsl <<
"LineSigma" << QString::number(p_lineSigma);
890 qsl <<
"Sample" << QString::number(p_sample);
894 qsl <<
"SampleResidual" << QString::number(p_sampleResidual);
898 qsl <<
"SampleSigma" << QString::number(p_sampleSigma);
902 qsl <<
"ResidualMagnitude" << QString::number(GetResidualMagnitude());
906 qsl <<
"MeasureType" << GetMeasureTypeString();
921 QString err =
"String [" + str +
"] can not be converted to a MeasureType";
925 if (str ==
"candidate")
926 measureType = ControlMeasure::Candidate;
927 else if (str ==
"manual")
928 measureType = ControlMeasure::Manual;
929 else if (str ==
"registeredpixel")
930 measureType = ControlMeasure::RegisteredPixel;
931 else if (str ==
"registeredsubpixel")
932 measureType = ControlMeasure::RegisteredSubPixel;
934 throw IException(IException::Programmer, err, _FILEINFO_);
955 case ControlMeasure::Candidate:
956 sPrintable =
"Candidate";
959 case ControlMeasure::Manual:
960 sPrintable =
"Manual";
963 case ControlMeasure::RegisteredPixel:
964 sPrintable =
"RegisteredPixel";
967 case ControlMeasure::RegisteredSubPixel:
968 sPrintable =
"RegisteredSubPixel";
972 if (sPrintable ==
"") {
973 QString msg =
"Measure type [" +
toString(type) +
"] cannot be converted "
975 throw IException(IException::Programmer, msg, _FILEINFO_);
987 QString ControlMeasure::GetMeasureTypeString()
const {
988 return MeasureTypeToString(p_measureType);
1005 if (p_serialNumber) {
1006 delete p_serialNumber;
1007 p_serialNumber = NULL;
1009 if (p_chooserName) {
1010 delete p_chooserName;
1011 p_chooserName = NULL;
1018 delete p_loggedData;
1019 p_loggedData = NULL;
1022 p_serialNumber =
new QString;
1023 p_chooserName =
new QString;
1024 p_dateTime =
new QString;
1027 bool oldLock = p_editLock;
1032 *p_loggedData = *other.p_loggedData;
1034 SetCubeSerialNumber(*other.p_serialNumber);
1036 SetDateTime(*other.p_dateTime);
1037 SetType(other.p_measureType);
1040 SetIgnored(other.p_ignore);
1041 SetDiameter(other.p_diameter);
1047 SetCamera(other.p_camera);
1048 SetFocalPlaneMeasured(other.p_focalPlaneMeasuredX, other.p_focalPlaneMeasuredY);
1049 SetFocalPlaneComputed(other.p_focalPlaneComputedX, other.p_focalPlaneComputedY);
1050 p_editLock = oldLock;
1067 return !(*
this == pMeasure);
1088 return pMeasure.p_measureType == p_measureType &&
1089 *pMeasure.p_serialNumber == *p_serialNumber &&
1091 *pMeasure.p_dateTime == *p_dateTime &&
1093 pMeasure.p_ignore == p_ignore &&
1096 pMeasure.
p_line == p_line &&
1097 pMeasure.p_diameter == p_diameter &&
1100 pMeasure.p_computedEphemerisTime == p_computedEphemerisTime &&
1105 pMeasure.p_focalPlaneMeasuredX == p_focalPlaneMeasuredX &&
1106 pMeasure.p_focalPlaneMeasuredY == p_focalPlaneMeasuredY &&
1107 pMeasure.p_focalPlaneComputedX == p_focalPlaneComputedX &&
1108 pMeasure.p_focalPlaneComputedY == p_focalPlaneComputedY &&
1109 pMeasure.p_measuredEphemerisTime == p_measuredEphemerisTime;
1112 void ControlMeasure::MeasureModified() {
1114 *p_chooserName =
"";