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 = 
"";