26 #include <QStringList>
36 #include "ControlNetFileV0002.pb.h"
45 ControlMeasure::ControlMeasure() {
47 p_serialNumber =
new QString;
48 p_chooserName =
new QString;
49 p_dateTime =
new QString;
52 p_measureType = Candidate;
54 p_jigsawRejected =
false;
68 ControlMeasure::ControlMeasure(
72 p_serialNumber =
new QString(protoBuf.serialnumber().c_str());
73 p_chooserName =
new QString(protoBuf.choosername().c_str());
74 p_dateTime =
new QString(protoBuf.datetime().c_str());
77 switch (protoBuf.type()) {
78 case ControlPointFileEntryV0002_Measure::Candidate:
79 p_measureType = ControlMeasure::Candidate;
81 case ControlPointFileEntryV0002_Measure::Manual:
82 p_measureType = ControlMeasure::Manual;
84 case ControlPointFileEntryV0002_Measure::RegisteredPixel:
85 p_measureType = ControlMeasure::RegisteredPixel;
87 case ControlPointFileEntryV0002_Measure::RegisteredSubPixel:
88 p_measureType = ControlMeasure::RegisteredSubPixel;
92 p_editLock = protoBuf.editlock();
93 p_jigsawRejected = protoBuf.jigsawrejected();
94 p_ignore = protoBuf.ignore();
95 p_sample = protoBuf.sample();
96 p_line = protoBuf.line();
99 if (protoBuf.has_diameter())
100 p_diameter = protoBuf.diameter();
102 if (protoBuf.has_apriorisample())
103 p_aprioriSample = protoBuf.apriorisample();
105 if (protoBuf.has_aprioriline())
106 p_aprioriLine = protoBuf.aprioriline();
108 if (protoBuf.has_samplesigma())
109 p_sampleSigma = protoBuf.samplesigma();
111 if (protoBuf.has_linesigma())
112 p_lineSigma = protoBuf.linesigma();
114 if (protoBuf.has_sampleresidual())
115 p_sampleResidual = protoBuf.sampleresidual();
117 if (protoBuf.has_lineresidual())
118 p_lineResidual = protoBuf.lineresidual();
120 for (
int dataEntry = 0;
121 dataEntry < protoBuf.log_size();
124 p_loggedData->push_back(logEntry);
137 p_serialNumber =
new QString(*other.p_serialNumber);
139 p_dateTime =
new QString(*other.p_dateTime);
143 p_measureType = other.p_measureType;
146 p_ignore = other.p_ignore;
149 p_diameter = other.p_diameter;
156 p_camera = other.p_camera;
162 void ControlMeasure::InitializeToNull() {
163 p_serialNumber = NULL;
164 p_chooserName = NULL;
169 p_aprioriSample =
Null;
170 p_aprioriLine =
Null;
171 p_computedEphemerisTime =
Null;
172 p_sampleSigma =
Null;
174 p_sampleResidual =
Null;
175 p_lineResidual =
Null;
178 p_focalPlaneMeasuredX =
Null;
179 p_focalPlaneMeasuredY =
Null;
180 p_focalPlaneComputedX =
Null;
181 p_focalPlaneComputedY =
Null;
182 p_measuredEphemerisTime =
Null;
185 associatedCSN = NULL;
192 ControlMeasure::~ControlMeasure() {
193 if (p_serialNumber) {
194 delete p_serialNumber;
195 p_serialNumber = NULL;
199 delete p_chooserName;
200 p_chooserName = NULL;
213 associatedCSN = NULL;
217 ControlMeasure::Status ControlMeasure::SetAprioriLine(
double aprioriLine) {
219 return MeasureLocked;
221 p_aprioriLine = aprioriLine;
226 ControlMeasure::Status ControlMeasure::SetAprioriSample(
227 double aprioriSample) {
229 return MeasureLocked;
231 p_aprioriSample = aprioriSample;
250 ControlMeasure::Status ControlMeasure::SetCamera(
Isis::Camera *camera) {
268 ControlMeasure::Status ControlMeasure::SetCubeSerialNumber(QString newSerialNumber) {
270 return MeasureLocked;
271 *p_serialNumber = newSerialNumber;
277 ControlMeasure::Status ControlMeasure::SetChooserName() {
279 return MeasureLocked;
286 ControlMeasure::Status ControlMeasure::SetChooserName(QString name) {
288 return MeasureLocked;
289 *p_chooserName = name;
300 ControlMeasure::Status ControlMeasure::SetCoordinate(
double sample,
302 return SetCoordinate(sample, line, GetType());
313 ControlMeasure::Status ControlMeasure::SetCoordinate(
double sample,
316 return MeasureLocked;
326 ControlMeasure::Status ControlMeasure::SetDateTime() {
328 return MeasureLocked;
329 *p_dateTime = Application::DateTime();
335 ControlMeasure::Status ControlMeasure::SetDateTime(QString datetime) {
337 return MeasureLocked;
338 *p_dateTime = datetime;
351 ControlMeasure::Status ControlMeasure::SetDiameter(
double diameter) {
353 return MeasureLocked;
355 p_diameter = diameter;
360 ControlMeasure::Status ControlMeasure::SetEditLock(
bool editLock) {
361 p_editLock = editLock;
378 ControlMeasure::Status ControlMeasure::SetFocalPlaneMeasured(
double x,
380 p_focalPlaneMeasuredX = x;
381 p_focalPlaneMeasuredY = y;
398 ControlMeasure::Status ControlMeasure::SetFocalPlaneComputed(
double x,
400 p_focalPlaneComputedX = x;
401 p_focalPlaneComputedY = y;
422 ControlMeasure::Status ControlMeasure::SetRejected(
bool reject) {
424 p_jigsawRejected = reject;
429 ControlMeasure::Status ControlMeasure::SetIgnored(
bool newIgnoreStatus) {
431 return MeasureLocked;
433 bool oldStatus = p_ignore;
434 p_ignore = newIgnoreStatus;
437 if (oldStatus != p_ignore) {
439 if (parentPoint && !parentPoint->IsIgnored() && parentPoint->Parent()) {
442 cnet->emitNetworkStructureModified();
450 ControlMeasure::Status ControlMeasure::SetLineSigma(
double lineSigma) {
452 return MeasureLocked;
454 p_lineSigma = lineSigma;
472 ControlMeasure::Status ControlMeasure::SetResidual(
double sampResidual,
473 double lineResidual) {
475 p_sampleResidual = sampResidual;
476 p_lineResidual = lineResidual;
481 ControlMeasure::Status ControlMeasure::SetSampleSigma(
double sampleSigma) {
483 return MeasureLocked;
485 p_sampleSigma = sampleSigma;
491 ControlMeasure::Status ControlMeasure::SetType(
MeasureType type) {
493 return MeasureLocked;
495 p_measureType = type;
507 IString msg =
"Cannot set log data with invalid information stored in "
508 "the ControlMeasureLogData";
515 p_loggedData->append(data);
525 void ControlMeasure::DeleteLogData(
long dataType) {
526 for (
int i = p_loggedData->size()-1; i >= 0; i--) {
530 p_loggedData->remove(i);
539 QVariant ControlMeasure::GetLogValue(
long dataType)
const {
540 for (
int i = 0; i < p_loggedData->size(); i++) {
556 bool ControlMeasure::HasLogData(
long dataType)
const {
557 for (
int i = 0; i < p_loggedData->size(); i++) {
575 bool updated =
false;
577 for (
int i = 0; i < p_loggedData->size(); i++) {
581 (*p_loggedData)[i] = newLogData;
587 IString msg =
"Unable to update the log data for [" +
589 " control measure does not have log data for this value. Please use "
590 "SetLogData instead";
596 double ControlMeasure::GetAprioriLine()
const {
597 return p_aprioriLine;
601 double ControlMeasure::GetAprioriSample()
const {
602 return p_aprioriSample;
612 QString ControlMeasure::GetChooserName()
const {
613 if (*p_chooserName !=
"") {
614 return *p_chooserName;
617 return FileName(Application::Name()).name();
623 QString ControlMeasure::GetCubeSerialNumber()
const {
624 return *p_serialNumber;
629 QString ControlMeasure::GetDateTime()
const {
630 if (*p_dateTime !=
"") {
634 return Application::DateTime();
640 double ControlMeasure::GetDiameter()
const {
661 bool ControlMeasure::IsEditLocked()
const {
663 if (parentPoint != NULL && parentPoint->IsEditLocked() &&
664 this == parentPoint->GetRefMeasure())
670 double ControlMeasure::GetFocalPlaneComputedX()
const {
671 return p_focalPlaneComputedX;
675 double ControlMeasure::GetFocalPlaneComputedY()
const {
676 return p_focalPlaneComputedY;
680 double ControlMeasure::GetFocalPlaneMeasuredX()
const {
681 return p_focalPlaneMeasuredX;
685 double ControlMeasure::GetFocalPlaneMeasuredY()
const {
686 return p_focalPlaneMeasuredY;
690 bool ControlMeasure::IsIgnored()
const {
695 bool ControlMeasure::IsRejected()
const {
696 return p_jigsawRejected;
700 bool ControlMeasure::IsMeasured()
const {
701 return p_measureType != Candidate;
705 bool ControlMeasure::IsRegistered()
const {
706 return (p_measureType == RegisteredPixel ||
707 p_measureType == RegisteredSubPixel);
710 bool ControlMeasure::IsStatisticallyRelevant(DataField field)
const {
711 bool relevant =
false;
712 bool validField =
false;
718 case CubeSerialNumber:
721 case FocalPlaneMeasured:
722 case FocalPlaneComputed:
741 IString msg =
"Cannot test IsStatisticallyRelevant on Measure Data ["
742 + IString(field) +
"]";
743 throw IException(IException::Programmer, msg,
_FILEINFO_);
750 double ControlMeasure::GetLine()
const {
755 double ControlMeasure::GetLineResidual()
const {
756 return p_lineResidual;
760 double ControlMeasure::GetLineSigma()
const {
766 double ControlMeasure::GetResidualMagnitude()
const {
770 double dist = (p_lineResidual * p_lineResidual) +
771 (p_sampleResidual * p_sampleResidual);
777 double ControlMeasure::GetSample()
const {
782 double ControlMeasure::GetSampleResidual()
const {
783 return p_sampleResidual;
787 double ControlMeasure::GetSampleSigma()
const {
788 return p_sampleSigma;
792 ControlMeasure::MeasureType ControlMeasure::GetType()
const {
793 return p_measureType;
797 QString ControlMeasure::GetPointId()
const {
798 if (parentPoint == NULL) {
799 IString msg =
"Measure has no containing point";
800 throw IException(IException::User, msg,
_FILEINFO_);
803 return parentPoint->GetId();
807 double ControlMeasure::GetSampleShift()
const {
808 return (p_sample !=
Null && p_aprioriSample !=
Null) ?
809 p_sample - p_aprioriSample :
Null;
813 double ControlMeasure::GetLineShift()
const {
814 return (p_line !=
Null && p_aprioriLine !=
Null) ?
815 p_line - p_aprioriLine :
Null;
819 double ControlMeasure::GetPixelShift()
const {
820 double sampleShift = GetSampleShift();
821 double lineShift = GetLineShift();
822 return (sampleShift !=
Null && lineShift !=
Null) ?
823 sqrt(pow(GetSampleShift(), 2) + pow(GetLineShift(), 2)) :
Null;
827 ControlMeasureLogData ControlMeasure::GetLogData(
long dataType)
const {
829 ControlMeasureLogData::NumericLogDataType typedDataType =
830 (ControlMeasureLogData::NumericLogDataType)dataType;
832 while (foundIndex < p_loggedData->size()) {
833 const ControlMeasureLogData &logData = p_loggedData->at(foundIndex);
834 if (logData.GetDataType() == typedDataType) {
841 return ControlMeasureLogData(typedDataType);
846 double ControlMeasure::GetMeasureData(QString data)
const {
847 if (data ==
"SampleResidual")
848 return p_sampleResidual;
849 else if (data ==
"LineResidual")
850 return p_lineResidual;
851 else if (data ==
"Type")
852 return p_measureType;
853 else if (data ==
"IsMeasured")
855 else if (data ==
"IsRegistered")
856 return IsRegistered();
857 else if (data ==
"Ignore")
860 IString msg = data +
" passed to GetMeasureData but is invalid";
870 names.push_back(
"SampleResidual");
871 names.push_back(
"LineResidual");
872 names.push_back(
"Type");
873 names.push_back(
"IsMeasured");
874 names.push_back(
"IsRegistered");
875 names.push_back(
"Ignore");
892 qsl <<
"AprioriLine" << QString::number(p_aprioriLine);
896 qsl <<
"AprioriSample" << QString::number(p_aprioriSample);
900 qsl <<
"ChooserName" << *p_chooserName;
904 qsl <<
"CubeSerialNumber" << *p_serialNumber;
908 qsl <<
"DateTime" << *p_dateTime;
912 qsl <<
"Line" << QString::number(p_line);
916 qsl <<
"LineResidual" << QString::number(p_lineResidual);
920 qsl <<
"LineSigma" << QString::number(p_lineSigma);
924 qsl <<
"Sample" << QString::number(p_sample);
928 qsl <<
"SampleResidual" << QString::number(p_sampleResidual);
932 qsl <<
"SampleSigma" << QString::number(p_sampleSigma);
936 qsl <<
"ResidualMagnitude" << QString::number(GetResidualMagnitude());
940 qsl <<
"MeasureType" << GetMeasureTypeString();
956 err +=
IString(str) +
"] can not be converted to a MeasureType";
960 if (str ==
"candidate")
961 measureType = ControlMeasure::Candidate;
962 else if (str ==
"manual")
963 measureType = ControlMeasure::Manual;
964 else if (str ==
"registeredpixel")
965 measureType = ControlMeasure::RegisteredPixel;
966 else if (str ==
"registeredsubpixel")
967 measureType = ControlMeasure::RegisteredSubPixel;
990 case ControlMeasure::Candidate:
991 sPrintable =
"Candidate";
994 case ControlMeasure::Manual:
995 sPrintable =
"Manual";
998 case ControlMeasure::RegisteredPixel:
999 sPrintable =
"RegisteredPixel";
1002 case ControlMeasure::RegisteredSubPixel:
1003 sPrintable =
"RegisteredSubPixel";
1007 if (sPrintable ==
"") {
1008 QString msg =
"Measure type [" +
toString(type) +
"] cannot be converted "
1021 QString ControlMeasure::GetMeasureTypeString()
const {
1022 return MeasureTypeToString(p_measureType);
1039 if (p_serialNumber) {
1040 delete p_serialNumber;
1041 p_serialNumber = NULL;
1043 if (p_chooserName) {
1044 delete p_chooserName;
1045 p_chooserName = NULL;
1052 delete p_loggedData;
1053 p_loggedData = NULL;
1056 p_serialNumber =
new QString;
1057 p_chooserName =
new QString;
1058 p_dateTime =
new QString;
1061 *p_serialNumber = *other.p_serialNumber;
1063 *p_dateTime = *other.p_dateTime;
1064 *p_loggedData = *other.p_loggedData;
1066 p_measureType = other.p_measureType;
1070 SetIgnored(other.p_ignore);
1074 p_diameter = other.p_diameter;
1081 p_camera = other.p_camera;
1082 p_focalPlaneMeasuredX = other.p_focalPlaneMeasuredX;
1083 p_focalPlaneMeasuredY = other.p_focalPlaneMeasuredY;
1084 p_focalPlaneComputedX = other.p_focalPlaneComputedX;
1085 p_focalPlaneComputedY = other.p_focalPlaneComputedY;
1102 return !(*
this == pMeasure);
1123 return pMeasure.p_measureType == p_measureType &&
1124 *pMeasure.p_serialNumber == *p_serialNumber &&
1126 *pMeasure.p_dateTime == *p_dateTime &&
1128 pMeasure.p_ignore == p_ignore &&
1131 pMeasure.
p_line == p_line &&
1132 pMeasure.p_diameter == p_diameter &&
1135 pMeasure.p_computedEphemerisTime == p_computedEphemerisTime &&
1140 pMeasure.p_focalPlaneMeasuredX == p_focalPlaneMeasuredX &&
1141 pMeasure.p_focalPlaneMeasuredY == p_focalPlaneMeasuredY &&
1142 pMeasure.p_focalPlaneComputedX == p_focalPlaneComputedX &&
1143 pMeasure.p_focalPlaneComputedY == p_focalPlaneComputedY &&
1144 pMeasure.p_measuredEphemerisTime == p_measuredEphemerisTime;
1151 protoBufMeasure.set_serialnumber(GetCubeSerialNumber().toLatin1().data());
1152 switch (GetType()) {
1153 case ControlMeasure::Candidate:
1154 protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::Candidate);
1156 case ControlMeasure::Manual:
1157 protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::Manual);
1159 case ControlMeasure::RegisteredPixel:
1160 protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::RegisteredPixel);
1162 case ControlMeasure::RegisteredSubPixel:
1163 protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::RegisteredSubPixel);
1167 if (GetChooserName() !=
"") {
1168 protoBufMeasure.set_choosername(GetChooserName().toLatin1().data());
1170 if (GetDateTime() !=
"") {
1171 protoBufMeasure.set_datetime(GetDateTime().toLatin1().data());
1174 protoBufMeasure.set_editlock(
true);
1177 protoBufMeasure.set_ignore(
true);
1180 protoBufMeasure.set_jigsawrejected(
true);
1182 if (GetSample() != 0.)
1183 protoBufMeasure.set_sample(GetSample());
1186 protoBufMeasure.set_line(GetLine());
1189 protoBufMeasure.set_sampleresidual(GetSampleResidual());
1192 protoBufMeasure.set_lineresidual(GetLineResidual());
1195 protoBufMeasure.set_diameter(GetDiameter());
1198 protoBufMeasure.set_apriorisample(GetAprioriSample());
1201 protoBufMeasure.set_aprioriline(GetAprioriLine());
1204 protoBufMeasure.set_samplesigma(GetSampleSigma());
1207 protoBufMeasure.set_linesigma(GetLineSigma());
1209 ControlMeasureLogData logEntry;
1210 foreach(logEntry, *p_loggedData) {
1211 *protoBufMeasure.add_log() = logEntry.ToProtocolBuffer();
1214 return protoBufMeasure;
1218 void ControlMeasure::MeasureModified() {
1220 *p_chooserName =
"";
NumericLogDataType GetDataType() const
Get the data type associated with this log data.
double p_aprioriSample
The first identified location of the.
double p_lineResidual
Jigsaw information - Solution error - replaces p_lineError.
const double Null
Value for an Isis Null pixel.
bool p_jigsawRejected
Status of measure for last bundle adjust iteration.
File name manipulation and expansion.
double p_sample
Current sample/line measurement.
ControlCubeGraphNode * associatedCSN
Pointer to the Serial Number.
Statistical and similar ControlMeasure associated information.
QString * p_chooserName
list the program used and the definition file or include the user name for qnet
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
bool p_editLock
If true do not edit anything in measure.
double p_sampleSigma
Uncertainty/sigma in pixels of the measurement (current sample/line)
double p_lineSigma
Not sure how we determine this for automated or manual picking.
double p_line
Jigsaw uses this measure.
#define _FILEINFO_
Macro for the filename and line number.
double p_aprioriLine
measure by autoseed. Pointreg/Interest < always use this location to star...
bool IsSpecial(const double d)
Returns if the input pixel is special.
MeasureType
Control network measurement types.
bool IsValid() const
This tests if the log data is complete and valid.
double p_sampleResidual
Jigsaw information - Solution error - replaces p_sampleError.
QVariant GetValue() const
Get the data type associated with this log data.
QString DataTypeToName(NumericLogDataType) const
This converts the log data type to a string and is used internally for convertions to and from Pvl...
Adds specific functionality to C++ strings.
void measureUnIgnored(ControlMeasure *measure)
Updates the connections for the ControlCubeGraphNode associated with the measure's serial number to r...