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);
198 mdEmissionAngle =
Null;
199 mdIncidenceAngle =
Null;
202 mdSampleResidual = 0;
204 mdResidualMagnitude=0;
209 if (measureCamera != NULL) {
210 bool success = measureCamera->
SetImage(pSample, pLine);
218 if (pMeasure != NULL) {
219 double temp = pMeasure->GetSampleResidual();
221 mdSampleResidual = fabs(temp);
224 temp = pMeasure->GetLineResidual();
226 mdLineResidual = fabs(temp);
231 mdResidualMagnitude = fabs(temp);
234 temp = pMeasure->GetSampleShift();
236 m_sampleShift = fabs(temp);
239 temp = pMeasure->GetLineShift();
241 m_lineShift = fabs(temp);
244 temp = pMeasure->GetPixelShift();
246 m_pixelShift = fabs(temp);
253 pCube->
read(inPortal);
254 mdDnValue = inPortal[0];
257 if(pMeasureGrp != NULL) {
258 if(mbCameraRequired && (mdEmissionAngle !=
Null || mdIncidenceAngle !=
Null || mdResolution !=
Null)) {
264 *pMeasureGrp +=
Isis::PvlKeyword(
"EmissionAngle",
"Invalid Emission Angle");
265 *pMeasureGrp +=
Isis::PvlKeyword(
"IncidenceAngle",
"Invalid Incidence Angle");
280 MeasureValidationResults results;
282 if(mbCameraRequired) {
283 if(!ValidEmissionAngle(mdEmissionAngle)) {
284 results.addFailure(MeasureValidationResults::EmissionAngle,
285 mdEmissionAngle, mdMinEmissionAngle, mdMaxEmissionAngle);
288 if(!ValidIncidenceAngle(mdIncidenceAngle)) {
289 results.addFailure(MeasureValidationResults::IncidenceAngle,
290 mdIncidenceAngle, mdMinIncidenceAngle, mdMaxIncidenceAngle);
293 if(!ValidResolution(mdResolution)) {
294 results.addFailure(MeasureValidationResults::Resolution,
295 mdResolution, mdMinResolution, mdMaxResolution);
300 if(!ValidDnValue(mdDnValue)) {
301 results.addFailure(MeasureValidationResults::DNValue,
302 mdDnValue, mdMinDN, mdMaxDN);
306 if(mbValidateFromEdge) {
307 if(!PixelsFromEdge((
int)pSample, (
int)pLine, pCube)) {
308 results.addFailure(MeasureValidationResults::PixelsFromEdge, miPixelsFromEdge);
311 if(!MetersFromEdge((
int)pSample, (
int)pLine, pCube)) {
312 results.addFailure(MeasureValidationResults::MetersFromEdge,
317 if(pMeasure != NULL) {
318 ValidResidualTolerances(mdSampleResidual, mdLineResidual,
319 mdResidualMagnitude, results);
320 ValidShiftTolerances(m_sampleShift, m_lineShift,
321 m_pixelShift, results);
340 double pSample,
double pLine,
Cube *pCube,
PvlGroup *pMeasureGrp) {
342 return ValidStandardOptions(pSample, pLine, NULL, pCube, pMeasureGrp);
362 double dSample, dLine;
363 dSample = pMeasure->GetSample();
364 dLine = pMeasure->GetLine();
366 return (ValidStandardOptions(dSample, dLine, pMeasure, pCube, pMeasureGrp));
374 double dSample, dLine;
375 dSample = pMeasure->GetSample();
376 dLine = pMeasure->GetLine();
378 return ValidStandardOptions(dSample, dLine, pMeasure,
379 pCube, camera, pMeasureGrp);
388 void ControlNetValidMeasure::ValidatePvlFromEdge(
void) {
390 if(mPvlOpGrp.hasKeyword(
"PixelsFromEdge")) {
391 miPixelsFromEdge = mPvlOpGrp[
"PixelsFromEdge"];
392 if(miPixelsFromEdge < 0) {
393 miPixelsFromEdge = 0;
396 mbValidateFromEdge =
true;
401 if(mPvlOpGrp.hasKeyword(
"MetersFromEdge")) {
402 mdMetersFromEdge = mPvlOpGrp[
"MetersFromEdge"];
403 if(mdMetersFromEdge < 0) {
404 mdMetersFromEdge = 0;
407 mbValidateFromEdge =
true;
420 void ControlNetValidMeasure::ValidatePvlResolution(
void) {
421 if(mPvlOpGrp.hasKeyword(
"MinResolution")){
422 mdMinResolution = mPvlOpGrp[
"MinResolution"];
423 mbCameraRequired =
true;
430 if(mPvlOpGrp.hasKeyword(
"MaxResolution")){
431 mdMaxResolution = mPvlOpGrp[
"MaxResolution"];
432 mbCameraRequired =
true;
435 mdMaxResolution = DBL_MAX;
437 mStdOptionsGrp +=
Isis::PvlKeyword(
"MaxResolution", (mdMaxResolution == DBL_MAX ?
"NA" :
toString(mdMaxResolution)));
439 if(mdMinResolution < 0 || mdMaxResolution < 0) {
440 QString msg =
"Invalid Resolution value(s), Resolution must be greater than zero";
444 if(mdMaxResolution < mdMinResolution) {
445 QString msg =
"MinResolution must be less than MaxResolution";
458 void ControlNetValidMeasure::ValidatePvlDN(
void) {
459 if(mPvlOpGrp.hasKeyword(
"MinDN")) {
460 mdMinDN = mPvlOpGrp[
"MinDN"];
468 if(mPvlOpGrp.hasKeyword(
"MaxDN")) {
469 mdMaxDN = mPvlOpGrp[
"MaxDN"];
477 if(mdMaxDN < mdMinDN) {
478 QString msg =
"MinDN must be less than MaxDN";
491 void ControlNetValidMeasure::ValidatePvlEmissionAngle(
void) {
492 if(mPvlOpGrp.hasKeyword(
"MinEmission")) {
493 mdMinEmissionAngle = mPvlOpGrp[
"MinEmission"];
494 mbCameraRequired =
true;
495 if(mdMinEmissionAngle < 0 || mdMinEmissionAngle > 135) {
496 QString msg =
"Invalid Min Emission Angle, Valid Range is [0-135]";
502 if(mPvlOpGrp.hasKeyword(
"MaxEmission")) {
503 mdMaxEmissionAngle = mPvlOpGrp[
"MaxEmission"];
504 mbCameraRequired =
true;
505 if(mdMaxEmissionAngle < 0 || mdMaxEmissionAngle > 135) {
506 QString msg =
"Invalid Max Emission Angle, Valid Range is [0-135]";
512 if(mdMaxEmissionAngle < mdMinEmissionAngle) {
513 QString msg =
"Min EmissionAngle must be less than Max EmissionAngle";
527 void ControlNetValidMeasure::ValidatePvlIncidenceAngle(
void) {
528 if(mPvlOpGrp.hasKeyword(
"MinIncidence")) {
529 mdMinIncidenceAngle = mPvlOpGrp[
"MinIncidence"];
530 mbCameraRequired =
true;
531 if(mdMinIncidenceAngle < 0 || mdMinIncidenceAngle > 135) {
532 QString msg =
"Invalid Min Incidence Angle, Valid Range is [0-135]";
538 if(mPvlOpGrp.hasKeyword(
"MaxIncidence")) {
539 mdMaxIncidenceAngle = mPvlOpGrp[
"MaxIncidence"];
540 mbCameraRequired =
true;
541 if(mdMaxIncidenceAngle < 0 || mdMaxIncidenceAngle > 135) {
542 QString msg =
"Invalid Max Incidence Angle, Valid Range is [0-135]";
548 if(mdMaxIncidenceAngle < mdMinIncidenceAngle) {
549 QString msg =
"Min IncidenceAngle must be less than Max IncidenceAngle";
559 void ControlNetValidMeasure::ValidatePvlResidualTolerances(
void){
561 bool bResMag =
false;
562 if(mPvlOpGrp.hasKeyword(
"SampleResidual")) {
563 mdSampleResTolerance = mPvlOpGrp[
"SampleResidual"];
564 if(mdSampleResTolerance < 0) {
565 QString msg =
"Invalid Sample Residual, must be greater than zero";
570 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleResidual", (mdSampleResTolerance == DBL_MAX ?
"NA" :
toString(mdSampleResTolerance)));
572 if(mPvlOpGrp.hasKeyword(
"LineResidual")) {
573 mdLineResTolerance = mPvlOpGrp[
"LineResidual"];
574 if(mdLineResTolerance < 0) {
575 QString msg =
"Invalid Line Residual, must be greater than zero";
580 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineResidual", (mdLineResTolerance == DBL_MAX ?
"NA" :
toString(mdLineResTolerance)));
582 if(mPvlOpGrp.hasKeyword(
"ResidualMagnitude")) {
583 mdResidualTolerance = mPvlOpGrp[
"ResidualMagnitude"];
584 if(mdResidualTolerance < 0) {
585 QString msg =
"Invalid Residual Magnitude Tolerance, must be greater than zero";
590 mStdOptionsGrp +=
Isis::PvlKeyword(
"ResidualMagnitude", (mdResidualTolerance == DBL_MAX ?
"NA" :
toString(mdResidualTolerance)));
592 if(bRes && bResMag) {
593 QString msg =
"Cannot have both Sample/Line Residuals and Residual Magnitude.";
594 msg +=
"\nChoose either Sample/Line Residual or Residual Magnitude";
604 void ControlNetValidMeasure::ValidatePvlShiftTolerances() {
605 bool hasSampleLineShift =
false;
606 if (mPvlOpGrp.hasKeyword(
"SampleShift")) {
607 m_sampleShiftTolerance = mPvlOpGrp[
"SampleShift"];
608 if (m_sampleShiftTolerance < 0) {
609 QString msg =
"Invalid Sample Shift tolerance:"
610 " must be greater than or equal to zero";
613 hasSampleLineShift =
true;
615 mStdOptionsGrp +=
Isis::PvlKeyword(
"SampleShift", (m_sampleShiftTolerance == DBL_MAX ?
"NA" :
toString(m_sampleShiftTolerance)));
617 if (mPvlOpGrp.hasKeyword(
"LineShift")) {
618 m_lineShiftTolerance = mPvlOpGrp[
"LineShift"];
619 if (m_lineShiftTolerance < 0) {
620 QString msg =
"Invalid Line Shift tolerance:"
621 " must be greater than or equal to zero";
624 hasSampleLineShift =
true;
626 mStdOptionsGrp +=
Isis::PvlKeyword(
"LineShift", (m_lineShiftTolerance == DBL_MAX ?
"NA" :
toString(m_lineShiftTolerance)));
628 bool hasPixelShift =
false;
629 if (mPvlOpGrp.hasKeyword(
"PixelShift")) {
630 m_pixelShiftTolerance = mPvlOpGrp[
"PixelShift"];
631 if (m_pixelShiftTolerance < 0) {
632 QString msg =
"Invalid Pixel Shift tolerance:"
633 " must be greater than or equal to zero";
636 hasPixelShift =
true;
638 mStdOptionsGrp +=
Isis::PvlKeyword(
"PixelShift", (m_pixelShiftTolerance == DBL_MAX ?
"NA" :
toString(m_pixelShiftTolerance)));
640 if (hasSampleLineShift && hasPixelShift) {
641 QString msg =
"Cannot have both Sample/Line Shift and Pixel Shift";
642 msg +=
" tolerances.\n";
643 msg +=
"Choose either Sample/Line Shift or Pixel Shift to validate on";
660 bool ControlNetValidMeasure::ValidEmissionAngle(
double pdEmissionAngle) {
661 if(pdEmissionAngle < mdMinEmissionAngle || pdEmissionAngle > mdMaxEmissionAngle) {
678 bool ControlNetValidMeasure::ValidIncidenceAngle(
double pdIncidenceAngle) {
679 if(pdIncidenceAngle < mdMinIncidenceAngle || pdIncidenceAngle > mdMaxIncidenceAngle) {
695 bool ControlNetValidMeasure::ValidDnValue(
double pdDnValue) {
696 if(
Isis::IsSpecial(pdDnValue) || pdDnValue < mdMinDN || pdDnValue > mdMaxDN) {
712 bool ControlNetValidMeasure::ValidResolution(
double pdResolution) {
713 if(pdResolution < mdMinResolution || pdResolution > mdMaxResolution) {
733 bool ControlNetValidMeasure::ValidResidualTolerances(
double pdSampleResidual,
734 double pdLineResidual,
double pdResidualMagnitude,
738 if(pdSampleResidual > mdSampleResTolerance) {
740 pResults.addFailure(MeasureValidationResults::SampleResidual, mdSampleResTolerance,
"greater");
742 if(pdLineResidual > mdLineResTolerance) {
744 pResults.addFailure(MeasureValidationResults::LineResidual, mdLineResTolerance,
"greater");
746 if(pdResidualMagnitude > mdResidualTolerance) {
748 pResults.addFailure(MeasureValidationResults::ResidualMagnitude, mdResidualTolerance,
"greater");
766 bool ControlNetValidMeasure::ValidShiftTolerances(
767 double sampleShift,
double lineShift,
double pixelShift,
772 if (sampleShift > m_sampleShiftTolerance) {
774 results.addFailure(MeasureValidationResults::SampleShift,
775 m_sampleShiftTolerance,
"greater");
777 if (lineShift > m_lineShiftTolerance) {
779 results.addFailure(MeasureValidationResults::LineShift,
780 m_lineShiftTolerance,
"greater");
782 if (pixelShift > m_pixelShiftTolerance) {
784 results.addFailure(MeasureValidationResults::PixelShift,
785 m_pixelShiftTolerance,
"greater");
803 bool ControlNetValidMeasure::ValidLatLon(
Camera *pCamera,
int piSample,
int piLine) {
818 bool ControlNetValidMeasure::PixelsFromEdge(
int piSample,
int piLine,
Cube *pCube) {
819 if(miPixelsFromEdge <= 0) {
827 if((iNumSamples - piSample) < miPixelsFromEdge) {
832 if((piSample - miPixelsFromEdge) <= 0) {
837 if((iNumLines - piLine) < miPixelsFromEdge) {
842 if((piLine - miPixelsFromEdge) <= 0) {
860 bool ControlNetValidMeasure::MetersFromEdge(
int piSample,
int piLine,
Cube *pCube) {
861 if(mdMetersFromEdge <= 0) {
871 double resMetersTotal = 0;
872 bool bMinDistance =
false;
875 for(
int line = piLine - 1; line > 0; line--) {
878 resMetersTotal += resolution;
879 if(resMetersTotal >= mdMetersFromEdge) {
889 bMinDistance =
false;
891 for(
int line = piLine + 1; line <= iNumLines; line++) {
894 resMetersTotal += resolution;
895 if(resMetersTotal >= mdMetersFromEdge) {
906 bMinDistance =
false;
907 for(
int sample = piSample - 1; sample > 0; sample--) {
910 resMetersTotal += resolution;
911 if(resMetersTotal >= mdMetersFromEdge) {
922 bMinDistance =
false;
923 for(
int sample = piSample + 1; sample <= iNumSamples; sample++) {
926 resMetersTotal += resolution;
927 if(resMetersTotal >= mdMetersFromEdge) {
934 QString msg =
"Cannot Create Camera for Image [" +
const double Null
Value for an Isis Null pixel.
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
PixelType pixelType() const
const double ValidMinimum
The minimum valid double value for Isis pixels.
Camera * camera()
Return a camera associated with the cube.
double GetResidualMagnitude() const
Return Residual magnitude.
Buffer for containing a two dimensional section of an image.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
void read(Blob &blob) const
This method will read data from the specified Blob object.
bool SetImage(const double sample, const double line)
Sets the sample/line values of the image to get the lat/lon values.
double EmissionAngle() const
Returns the emission angle in degrees.
Contains multiple PvlContainers.
#define _FILEINFO_
Macro for the filename and line number.
A single keyword-value pair.
bool IsSpecial(const double d)
Returns if the input pixel is special.
Container for cube-like labels.
void SetPosition(const double sample, const double line, const int band)
Sets the line and sample position of the buffer.
MeasureValidationResults class.
const double ValidMaximum
The maximum valid double value for Isis pixels.
double PixelResolution()
Returns the pixel resolution at the current position in meters/pixel.
QString fileName() const
Returns the opened cube's filename.
bool hasGroup(const QString &name) const
Returns a boolean value based on whether the object has the specified group or not.
Serial Number list generator.
double IncidenceAngle() const
Returns the incidence angle in degrees.
IO Handler for Isis Cubes.