5 #include "CubeManager.h"
23 ControlNetValidMeasure::ControlNetValidMeasure(
Pvl *pPvl) {
26 if(pPvl != NULL && pPvl->
hasGroup(
"ValidMeasure")) {
30 InitStdOptionsGroup();
32 mStatisticsGrp =
PvlGroup(
"Statistics");
43 ControlNetValidMeasure::ControlNetValidMeasure(
Pvl &pPvl) {
50 InitStdOptionsGroup();
52 mStatisticsGrp =
PvlGroup(
"Statistics");
60 void ControlNetValidMeasure::InitStdOptions(
void) {
61 mdMinEmissionAngle = 0;
62 mdMaxEmissionAngle = 135;
63 mdMinIncidenceAngle = 0;
64 mdMaxIncidenceAngle = 135;;
67 mdMaxResolution = DBL_MAX;
72 mdSampleResTolerance = DBL_MAX;
73 mdLineResTolerance = DBL_MAX;
74 mdResidualTolerance = DBL_MAX;
75 m_sampleShiftTolerance = DBL_MAX;
76 m_lineShiftTolerance = DBL_MAX;
77 m_pixelShiftTolerance = DBL_MAX;
79 mbCameraRequired =
false;
81 mbValidateFromEdge =
false;
89 void ControlNetValidMeasure::InitStdOptionsGroup(
void) {
90 mStdOptionsGrp =
PvlGroup(
"StandardOptions");
100 mStdOptionsGrp +=
Isis::PvlKeyword(
"MaxResolution", (mdMaxResolution == DBL_MAX ?
"NA" :
toString(mdSampleResTolerance)));
104 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleResidual", (mdSampleResTolerance == DBL_MAX ?
"NA" :
toString(mdSampleResTolerance)));
105 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineResidual", (mdLineResTolerance == DBL_MAX ?
"NA" :
toString(mdLineResTolerance)));
106 mStdOptionsGrp +=
Isis::PvlKeyword(
"ResidualMagnitude", (mdResidualTolerance == DBL_MAX ?
"NA" :
toString(mdResidualTolerance)));
108 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleShift", (m_sampleShiftTolerance == DBL_MAX ?
"NA" :
toString(m_sampleShiftTolerance)));
109 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineShift", (m_lineShiftTolerance == DBL_MAX ?
"NA" :
toString(m_lineShiftTolerance)));
110 mStdOptionsGrp +=
Isis::PvlKeyword(
"PixelShift", (m_pixelShiftTolerance == DBL_MAX ?
"NA" :
toString(m_pixelShiftTolerance)));
118 ControlNetValidMeasure::~ControlNetValidMeasure() {
119 mCubeMgr.CleanCubes();
130 void ControlNetValidMeasure::ReadSerialNumbers(QString psSerialNumfile) {
133 mCubeMgr.SetNumOpenCubes(50);
144 void ControlNetValidMeasure::Parse(
Pvl &pvlDef) {
145 mPvlOpGrp = pvlDef.
findGroup(
"ValidMeasure", Pvl::Traverse);
147 mStdOptionsGrp =
PvlGroup(
"StandardOptions");
150 ValidatePvlEmissionAngle();
151 ValidatePvlIncidenceAngle();
152 ValidatePvlResolution();
153 ValidatePvlFromEdge();
154 ValidatePvlResidualTolerances();
155 ValidatePvlShiftTolerances();
157 mPvlLog += mStdOptionsGrp;
178 Camera *measureCamera = NULL;
179 if(mbCameraRequired) {
181 measureCamera = pCube->
camera();
184 QString msg =
"Cannot Create Camera for Image:" + pCube->
fileName();
189 return ValidStandardOptions(pSample, pLine, pMeasure,
190 pCube, measureCamera, pMeasureGrp);
199 mdIncidenceAngle = 0;
202 mdSampleResidual = 0;
204 mdResidualMagnitude=0;
209 if (measureCamera != NULL) {
210 measureCamera->
SetImage(pSample, pLine);
217 if (pMeasure != NULL) {
218 double temp = pMeasure->GetSampleResidual();
220 mdSampleResidual = fabs(temp);
223 temp = pMeasure->GetLineResidual();
225 mdLineResidual = fabs(temp);
230 mdResidualMagnitude = fabs(temp);
233 temp = pMeasure->GetSampleShift();
235 m_sampleShift = fabs(temp);
238 temp = pMeasure->GetLineShift();
240 m_lineShift = fabs(temp);
243 temp = pMeasure->GetPixelShift();
245 m_pixelShift = fabs(temp);
252 pCube->
read(inPortal);
253 mdDnValue = inPortal[0];
256 if(pMeasureGrp != NULL) {
257 if(mbCameraRequired) {
274 MeasureValidationResults results;
276 if(mbCameraRequired) {
277 if(!ValidEmissionAngle(mdEmissionAngle)) {
278 results.addFailure(MeasureValidationResults::EmissionAngle,
279 mdEmissionAngle, mdMinEmissionAngle, mdMaxEmissionAngle);
282 if(!ValidIncidenceAngle(mdIncidenceAngle)) {
283 results.addFailure(MeasureValidationResults::IncidenceAngle,
284 mdIncidenceAngle, mdMinIncidenceAngle, mdMaxEmissionAngle);
287 if(!ValidResolution(mdResolution)) {
288 results.addFailure(MeasureValidationResults::Resolution,
289 mdResolution, mdMinResolution, mdMaxResolution);
294 if(!ValidDnValue(mdDnValue)) {
295 results.addFailure(MeasureValidationResults::DNValue,
296 mdDnValue, mdMinDN, mdMaxDN);
300 if(mbValidateFromEdge) {
301 if(!PixelsFromEdge((
int)pSample, (
int)pLine, pCube)) {
302 results.addFailure(MeasureValidationResults::PixelsFromEdge, miPixelsFromEdge);
305 if(!MetersFromEdge((
int)pSample, (
int)pLine, pCube)) {
306 results.addFailure(MeasureValidationResults::MetersFromEdge,
311 if(pMeasure != NULL) {
312 ValidResidualTolerances(mdSampleResidual, mdLineResidual,
313 mdResidualMagnitude, results);
314 ValidShiftTolerances(m_sampleShift, m_lineShift,
315 m_pixelShift, results);
334 double pSample,
double pLine,
Cube *pCube,
PvlGroup *pMeasureGrp) {
336 return ValidStandardOptions(pSample, pLine, NULL, pCube, pMeasureGrp);
356 double dSample, dLine;
357 dSample = pMeasure->GetSample();
358 dLine = pMeasure->GetLine();
360 return (ValidStandardOptions(dSample, dLine, pMeasure, pCube, pMeasureGrp));
368 double dSample, dLine;
369 dSample = pMeasure->GetSample();
370 dLine = pMeasure->GetLine();
372 return ValidStandardOptions(dSample, dLine, pMeasure,
373 pCube, camera, pMeasureGrp);
382 void ControlNetValidMeasure::ValidatePvlFromEdge(
void) {
384 if(mPvlOpGrp.hasKeyword(
"PixelsFromEdge")) {
385 miPixelsFromEdge = mPvlOpGrp[
"PixelsFromEdge"];
386 if(miPixelsFromEdge < 0) {
387 miPixelsFromEdge = 0;
390 mbValidateFromEdge =
true;
395 if(mPvlOpGrp.hasKeyword(
"MetersFromEdge")) {
396 mdMetersFromEdge = mPvlOpGrp[
"MetersFromEdge"];
397 if(mdMetersFromEdge < 0) {
398 mdMetersFromEdge = 0;
401 mbValidateFromEdge =
true;
414 void ControlNetValidMeasure::ValidatePvlResolution(
void) {
415 if(mPvlOpGrp.hasKeyword(
"MinResolution")){
416 mdMinResolution = mPvlOpGrp[
"MinResolution"];
417 mbCameraRequired =
true;
424 if(mPvlOpGrp.hasKeyword(
"MaxResolution")){
425 mdMaxResolution = mPvlOpGrp[
"MaxResolution"];
426 mbCameraRequired =
true;
429 mdMaxResolution = DBL_MAX;
431 mStdOptionsGrp +=
Isis::PvlKeyword(
"MaxResolution", (mdMaxResolution == DBL_MAX ?
"NA" :
toString(mdMaxResolution)));
433 if(mdMinResolution < 0 || mdMaxResolution < 0) {
434 QString msg =
"Invalid Resolution value(s), Resolution must be greater than zero";
438 if(mdMaxResolution < mdMinResolution) {
439 QString msg =
"MinResolution must be less than MaxResolution";
452 void ControlNetValidMeasure::ValidatePvlDN(
void) {
453 if(mPvlOpGrp.hasKeyword(
"MinDN")) {
454 mdMinDN = mPvlOpGrp[
"MinDN"];
462 if(mPvlOpGrp.hasKeyword(
"MaxDN")) {
463 mdMaxDN = mPvlOpGrp[
"MaxDN"];
471 if(mdMaxDN < mdMinDN) {
472 QString msg =
"MinDN must be less than MaxDN";
485 void ControlNetValidMeasure::ValidatePvlEmissionAngle(
void) {
486 if(mPvlOpGrp.hasKeyword(
"MinEmission")) {
487 mdMinEmissionAngle = mPvlOpGrp[
"MinEmission"];
488 mbCameraRequired =
true;
489 if(mdMinEmissionAngle < 0 || mdMinEmissionAngle > 135) {
490 QString msg =
"Invalid Min Emission Angle, Valid Range is [0-135]";
496 if(mPvlOpGrp.hasKeyword(
"MaxEmission")) {
497 mdMaxEmissionAngle = mPvlOpGrp[
"MaxEmission"];
498 mbCameraRequired =
true;
499 if(mdMaxEmissionAngle < 0 || mdMaxEmissionAngle > 135) {
500 QString msg =
"Invalid Max Emission Angle, Valid Range is [0-135]";
506 if(mdMaxEmissionAngle < mdMinEmissionAngle) {
507 QString msg =
"Min EmissionAngle must be less than Max EmissionAngle";
521 void ControlNetValidMeasure::ValidatePvlIncidenceAngle(
void) {
522 if(mPvlOpGrp.hasKeyword(
"MinIncidence")) {
523 mdMinIncidenceAngle = mPvlOpGrp[
"MinIncidence"];
524 mbCameraRequired =
true;
525 if(mdMinIncidenceAngle < 0 || mdMinIncidenceAngle > 135) {
526 QString msg =
"Invalid Min Incidence Angle, Valid Range is [0-135]";
532 if(mPvlOpGrp.hasKeyword(
"MaxIncidence")) {
533 mdMaxIncidenceAngle = mPvlOpGrp[
"MaxIncidence"];
534 mbCameraRequired =
true;
535 if(mdMaxIncidenceAngle < 0 || mdMaxIncidenceAngle > 135) {
536 QString msg =
"Invalid Max Incidence Angle, Valid Range is [0-135]";
542 if(mdMaxIncidenceAngle < mdMinIncidenceAngle) {
543 QString msg =
"Min IncidenceAngle must be less than Max IncidenceAngle";
553 void ControlNetValidMeasure::ValidatePvlResidualTolerances(
void){
555 bool bResMag =
false;
556 if(mPvlOpGrp.hasKeyword(
"SampleResidual")) {
557 mdSampleResTolerance = mPvlOpGrp[
"SampleResidual"];
558 if(mdSampleResTolerance < 0) {
559 QString msg =
"Invalid Sample Residual, must be greater than zero";
564 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleResidual", (mdSampleResTolerance == DBL_MAX ?
"NA" :
toString(mdSampleResTolerance)));
566 if(mPvlOpGrp.hasKeyword(
"LineResidual")) {
567 mdLineResTolerance = mPvlOpGrp[
"LineResidual"];
568 if(mdLineResTolerance < 0) {
569 QString msg =
"Invalid Line Residual, must be greater than zero";
574 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineResidual", (mdLineResTolerance == DBL_MAX ?
"NA" :
toString(mdLineResTolerance)));
576 if(mPvlOpGrp.hasKeyword(
"ResidualMagnitude")) {
577 mdResidualTolerance = mPvlOpGrp[
"ResidualMagnitude"];
578 if(mdResidualTolerance < 0) {
579 QString msg =
"Invalid Residual Magnitude Tolerance, must be greater than zero";
584 mStdOptionsGrp +=
Isis::PvlKeyword(
"ResidualMagnitude", (mdResidualTolerance == DBL_MAX ?
"NA" :
toString(mdResidualTolerance)));
586 if(bRes && bResMag) {
587 QString msg =
"Cannot have both Sample/Line Residuals and Residual Magnitude.";
588 msg +=
"\nChoose either Sample/Line Residual or Residual Magnitude";
598 void ControlNetValidMeasure::ValidatePvlShiftTolerances() {
599 bool hasSampleLineShift =
false;
600 if (mPvlOpGrp.hasKeyword(
"SampleShift")) {
601 m_sampleShiftTolerance = mPvlOpGrp[
"SampleShift"];
602 if (m_sampleShiftTolerance < 0) {
603 QString msg =
"Invalid Sample Shift tolerance:"
604 " must be greater than or equal to zero";
607 hasSampleLineShift =
true;
609 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleShift", (m_sampleShiftTolerance == DBL_MAX ?
"NA" :
toString(m_sampleShiftTolerance)));
611 if (mPvlOpGrp.hasKeyword(
"LineShift")) {
612 m_lineShiftTolerance = mPvlOpGrp[
"LineShift"];
613 if (m_lineShiftTolerance < 0) {
614 QString msg =
"Invalid Line Shift tolerance:"
615 " must be greater than or equal to zero";
618 hasSampleLineShift =
true;
620 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineShift", (m_lineShiftTolerance == DBL_MAX ?
"NA" :
toString(m_lineShiftTolerance)));
622 bool hasPixelShift =
false;
623 if (mPvlOpGrp.hasKeyword(
"PixelShift")) {
624 m_pixelShiftTolerance = mPvlOpGrp[
"PixelShift"];
625 if (m_pixelShiftTolerance < 0) {
626 QString msg =
"Invalid Pixel Shift tolerance:"
627 " must be greater than or equal to zero";
630 hasPixelShift =
true;
632 mStdOptionsGrp +=
Isis::PvlKeyword(
"PixelShift", (m_pixelShiftTolerance == DBL_MAX ?
"NA" :
toString(m_pixelShiftTolerance)));
634 if (hasSampleLineShift && hasPixelShift) {
635 QString msg =
"Cannot have both Sample/Line Shift and Pixel Shift";
636 msg +=
" tolerances.\n";
637 msg +=
"Choose either Sample/Line Shift or Pixel Shift to validate on";
654 bool ControlNetValidMeasure::ValidEmissionAngle(
double pdEmissionAngle) {
655 if(pdEmissionAngle < mdMinEmissionAngle || pdEmissionAngle > mdMaxEmissionAngle) {
672 bool ControlNetValidMeasure::ValidIncidenceAngle(
double pdIncidenceAngle) {
673 if(pdIncidenceAngle < mdMinIncidenceAngle || pdIncidenceAngle > mdMaxIncidenceAngle) {
689 bool ControlNetValidMeasure::ValidDnValue(
double pdDnValue) {
690 if(
Isis::IsSpecial(pdDnValue) || pdDnValue < mdMinDN || pdDnValue > mdMaxDN) {
706 bool ControlNetValidMeasure::ValidResolution(
double pdResolution) {
707 if(pdResolution < mdMinResolution || pdResolution > mdMaxResolution) {
727 bool ControlNetValidMeasure::ValidResidualTolerances(
double pdSampleResidual,
728 double pdLineResidual,
double pdResidualMagnitude,
732 if(pdSampleResidual > mdSampleResTolerance) {
734 pResults.addFailure(MeasureValidationResults::SampleResidual, mdSampleResTolerance,
"greater");
736 if(pdLineResidual > mdLineResTolerance) {
738 pResults.addFailure(MeasureValidationResults::LineResidual, mdLineResTolerance,
"greater");
740 if(pdResidualMagnitude > mdResidualTolerance) {
742 pResults.addFailure(MeasureValidationResults::ResidualMagnitude, mdResidualTolerance,
"greater");
760 bool ControlNetValidMeasure::ValidShiftTolerances(
761 double sampleShift,
double lineShift,
double pixelShift,
766 if (sampleShift > m_sampleShiftTolerance) {
768 results.addFailure(MeasureValidationResults::SampleShift,
769 m_sampleShiftTolerance,
"greater");
771 if (lineShift > m_lineShiftTolerance) {
773 results.addFailure(MeasureValidationResults::LineShift,
774 m_lineShiftTolerance,
"greater");
776 if (pixelShift > m_pixelShiftTolerance) {
778 results.addFailure(MeasureValidationResults::PixelShift,
779 m_pixelShiftTolerance,
"greater");
797 bool ControlNetValidMeasure::ValidLatLon(
Camera *pCamera,
int piSample,
int piLine) {
812 bool ControlNetValidMeasure::PixelsFromEdge(
int piSample,
int piLine,
Cube *pCube) {
813 if(miPixelsFromEdge <= 0) {
821 if((iNumSamples - piSample) < miPixelsFromEdge) {
826 if((piSample - miPixelsFromEdge) <= 0) {
831 if((iNumLines - piLine) < miPixelsFromEdge) {
836 if((piLine - miPixelsFromEdge) <= 0) {
854 bool ControlNetValidMeasure::MetersFromEdge(
int piSample,
int piLine,
Cube *pCube) {
855 if(mdMetersFromEdge <= 0) {
865 double resMetersTotal = 0;
866 bool bMinDistance =
false;
869 for(
int line = piLine - 1; line > 0; line--) {
872 resMetersTotal += resolution;
873 if(resMetersTotal >= mdMetersFromEdge) {
883 bMinDistance =
false;
885 for(
int line = piLine + 1; line <= iNumLines; line++) {
888 resMetersTotal += resolution;
889 if(resMetersTotal >= mdMetersFromEdge) {
900 bMinDistance =
false;
901 for(
int sample = piSample - 1; sample > 0; sample--) {
904 resMetersTotal += resolution;
905 if(resMetersTotal >= mdMetersFromEdge) {
916 bMinDistance =
false;
917 for(
int sample = piSample + 1; sample <= iNumSamples; sample++) {
920 resMetersTotal += resolution;
921 if(resMetersTotal >= mdMetersFromEdge) {
928 QString msg =
"Cannot Create Camera for Image [" +