Isis 3.0 Programmer Reference
Back | Home
ControlNetValidMeasure.cpp
2 #include "Cube.h"
3 #include "Camera.h"
4 #include "ControlMeasure.h"
5 #include "CubeManager.h"
7 #include "SerialNumberList.h"
8 #include "SpecialPixel.h"
9 #include "UniversalGroundMap.h"
10 
11 using namespace std;
12 
13 namespace Isis {
14 
23  ControlNetValidMeasure::ControlNetValidMeasure(Pvl *pPvl) {
24  InitStdOptions();
25 
26  if(pPvl != NULL && pPvl->hasGroup("ValidMeasure")) {
27  Parse(*pPvl);
28  }
29  else {
30  InitStdOptionsGroup();
31  }
32  mStatisticsGrp = PvlGroup("Statistics");
33  }
34 
43  ControlNetValidMeasure::ControlNetValidMeasure(Pvl &pPvl) {
44  InitStdOptions();
45 
46  if(pPvl.hasGroup("ValidMeasure")) {
47  Parse(pPvl);
48  }
49  else {
50  InitStdOptionsGroup();
51  }
52  mStatisticsGrp = PvlGroup("Statistics");
53  }
54 
60  void ControlNetValidMeasure::InitStdOptions(void) {
61  mdMinEmissionAngle = 0;
62  mdMaxEmissionAngle = 135;
63  mdMinIncidenceAngle = 0;
64  mdMaxIncidenceAngle = 135;;
65  miPixelsFromEdge = 0;
66  mdMinResolution = 0;
67  mdMaxResolution = DBL_MAX;
68  mdMinDN = Isis::ValidMinimum;
69  mdMaxDN = Isis::ValidMaximum;
70  miPixelsFromEdge = 0;
71  mdMetersFromEdge = 0;
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;
78 
79  mbCameraRequired = false;
80  mbValidateDN = false;
81  mbValidateFromEdge = false;
82  }
83 
89  void ControlNetValidMeasure::InitStdOptionsGroup(void) {
90  mStdOptionsGrp = PvlGroup("StandardOptions");
91 
92  mStdOptionsGrp += Isis::PvlKeyword("MinDN", (mdMinDN == Isis::ValidMinimum ? "NA" : toString(mdMinDN)));
93  mStdOptionsGrp += Isis::PvlKeyword("MaxDN", (mdMaxDN == Isis::ValidMaximum ? "NA" : toString(mdMaxDN)));
94 
95  mStdOptionsGrp += Isis::PvlKeyword("MinEmission", toString(mdMinEmissionAngle));
96  mStdOptionsGrp += Isis::PvlKeyword("MaxEmission", toString(mdMaxEmissionAngle));
97  mStdOptionsGrp += Isis::PvlKeyword("MinIncidence", toString(mdMinIncidenceAngle));
98  mStdOptionsGrp += Isis::PvlKeyword("MaxIncidence", toString(mdMaxIncidenceAngle));
99  mStdOptionsGrp += Isis::PvlKeyword("MinResolution", toString(mdMinResolution));
100  mStdOptionsGrp += Isis::PvlKeyword("MaxResolution", (mdMaxResolution == DBL_MAX ? "NA" : toString(mdSampleResTolerance)));
101  mStdOptionsGrp += Isis::PvlKeyword("PixelsFromEdge", toString(miPixelsFromEdge));
102  mStdOptionsGrp += Isis::PvlKeyword("MetersFromEdge", toString(mdMetersFromEdge));
103 
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)));
107 
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)));
111  }
112 
118  ControlNetValidMeasure::~ControlNetValidMeasure() {
119  mCubeMgr.CleanCubes();
120  }
121 
130  void ControlNetValidMeasure::ReadSerialNumbers(QString psSerialNumfile) {
131  mSerialNumbers = SerialNumberList(psSerialNumfile, true, &mStatus);
132 
133  mCubeMgr.SetNumOpenCubes(50);
134  }
135 
144  void ControlNetValidMeasure::Parse(Pvl &pvlDef) {
145  mPvlOpGrp = pvlDef.findGroup("ValidMeasure", Pvl::Traverse);
146 
147  mStdOptionsGrp = PvlGroup("StandardOptions");
148 
149  ValidatePvlDN();
150  ValidatePvlEmissionAngle();
151  ValidatePvlIncidenceAngle();
152  ValidatePvlResolution();
153  ValidatePvlFromEdge();
154  ValidatePvlResidualTolerances();
155  ValidatePvlShiftTolerances();
156 
157  mPvlLog += mStdOptionsGrp;
158  }
159 
173  MeasureValidationResults ControlNetValidMeasure::ValidStandardOptions(
174  double pSample, double pLine, const ControlMeasure *pMeasure, Cube *pCube,
175  PvlGroup *pMeasureGrp) {
176 
177  // Get the Camera
178  Camera *measureCamera = NULL;
179  if(mbCameraRequired) {
180  try {
181  measureCamera = pCube->camera();
182  }
183  catch(IException &e) {
184  QString msg = "Cannot Create Camera for Image:" + pCube->fileName();
185  throw IException(IException::User, msg, _FILEINFO_);
186  }
187  }
188 
189  return ValidStandardOptions(pSample, pLine, pMeasure,
190  pCube, measureCamera, pMeasureGrp);
191  }
192 
193 
194  MeasureValidationResults ControlNetValidMeasure::ValidStandardOptions(
195  double pSample, double pLine, const ControlMeasure *pMeasure, Cube *pCube,
196  Camera *measureCamera, PvlGroup *pMeasureGrp) {
197 
198  mdEmissionAngle = Null;
199  mdIncidenceAngle = Null;
200  mdDnValue = 0;
201  mdResolution = Null;
202  mdSampleResidual = 0;
203  mdLineResidual = 0;
204  mdResidualMagnitude=0;
205  m_sampleShift = 0;
206  m_lineShift = 0;
207  m_pixelShift = 0;
208 
209  if (measureCamera != NULL) {
210  bool success = measureCamera->SetImage(pSample, pLine);
211  if (success) {
212  mdEmissionAngle = measureCamera->EmissionAngle();
213  mdIncidenceAngle = measureCamera->IncidenceAngle();
214  mdResolution = measureCamera->PixelResolution();
215  }
216  }
217 
218  if (pMeasure != NULL) {
219  double temp = pMeasure->GetSampleResidual();
220  if (temp != Null) {
221  mdSampleResidual = fabs(temp);
222  }
223 
224  temp = pMeasure->GetLineResidual();
225  if (temp != Null) {
226  mdLineResidual = fabs(temp);
227  }
228 
229  temp = pMeasure->GetResidualMagnitude();
230  if (temp != Null) {
231  mdResidualMagnitude = fabs(temp);
232  }
233 
234  temp = pMeasure->GetSampleShift();
235  if (temp != Null) {
236  m_sampleShift = fabs(temp);
237  }
238 
239  temp = pMeasure->GetLineShift();
240  if (temp != Null) {
241  m_lineShift = fabs(temp);
242  }
243 
244  temp = pMeasure->GetPixelShift();
245  if (temp != Null) {
246  m_pixelShift = fabs(temp);
247  }
248  }
249 
250  if(mbValidateDN) {
251  Isis::Portal inPortal(1, 1, pCube->pixelType());
252  inPortal.SetPosition(pSample, pLine, 1);
253  pCube->read(inPortal);
254  mdDnValue = inPortal[0];
255  }
256 
257  if(pMeasureGrp != NULL) {
258  if(mbCameraRequired && (mdEmissionAngle != Null || mdIncidenceAngle != Null || mdResolution != Null)) {
259  *pMeasureGrp += Isis::PvlKeyword("EmissionAngle", toString(mdEmissionAngle));
260  *pMeasureGrp += Isis::PvlKeyword("IncidenceAngle", toString(mdIncidenceAngle));
261  *pMeasureGrp += Isis::PvlKeyword("Resolution", toString(mdResolution));
262  }
263  else {
264  *pMeasureGrp += Isis::PvlKeyword("EmissionAngle", "Invalid Emission Angle");
265  *pMeasureGrp += Isis::PvlKeyword("IncidenceAngle", "Invalid Incidence Angle");
266  *pMeasureGrp += Isis::PvlKeyword("Resolution", "Invalid Resolution");
267  }
268  if(mbValidateDN) {
269  *pMeasureGrp += Isis::PvlKeyword("DNValue", toString(mdDnValue));
270  }
271  *pMeasureGrp += Isis::PvlKeyword("SampleResidual", toString(mdSampleResidual));
272  *pMeasureGrp += Isis::PvlKeyword("LineResidual", toString(mdLineResidual));
273  *pMeasureGrp += Isis::PvlKeyword("ResidualMagnitude", toString(mdResidualMagnitude));
274 
275  *pMeasureGrp += Isis::PvlKeyword("SampleShift", toString(m_sampleShift));
276  *pMeasureGrp += Isis::PvlKeyword("LineShift", toString(m_lineShift));
277  *pMeasureGrp += Isis::PvlKeyword("PixelShift", toString(m_pixelShift));
278  }
279 
280  MeasureValidationResults results;
281 
282  if(mbCameraRequired) {
283  if(!ValidEmissionAngle(mdEmissionAngle)) {
284  results.addFailure(MeasureValidationResults::EmissionAngle,
285  mdEmissionAngle, mdMinEmissionAngle, mdMaxEmissionAngle);
286  }
287 
288  if(!ValidIncidenceAngle(mdIncidenceAngle)) {
289  results.addFailure(MeasureValidationResults::IncidenceAngle,
290  mdIncidenceAngle, mdMinIncidenceAngle, mdMaxIncidenceAngle);
291  }
292 
293  if(!ValidResolution(mdResolution)) {
294  results.addFailure(MeasureValidationResults::Resolution,
295  mdResolution, mdMinResolution, mdMaxResolution);
296  }
297  }
298 
299  if(mbValidateDN) {
300  if(!ValidDnValue(mdDnValue)) {
301  results.addFailure(MeasureValidationResults::DNValue,
302  mdDnValue, mdMinDN, mdMaxDN);
303  }
304  }
305 
306  if(mbValidateFromEdge) {
307  if(!PixelsFromEdge((int)pSample, (int)pLine, pCube)) {
308  results.addFailure(MeasureValidationResults::PixelsFromEdge, miPixelsFromEdge);
309  }
310 
311  if(!MetersFromEdge((int)pSample, (int)pLine, pCube)) {
312  results.addFailure(MeasureValidationResults::MetersFromEdge,
313  mdMetersFromEdge);
314  }
315  }
316 
317  if(pMeasure != NULL) {
318  ValidResidualTolerances(mdSampleResidual, mdLineResidual,
319  mdResidualMagnitude, results);
320  ValidShiftTolerances(m_sampleShift, m_lineShift,
321  m_pixelShift, results);
322  }
323 
324  return results;
325  }
326 
339  MeasureValidationResults ControlNetValidMeasure::ValidStandardOptions(
340  double pSample, double pLine, Cube *pCube, PvlGroup *pMeasureGrp) {
341 
342  return ValidStandardOptions(pSample, pLine, NULL, pCube, pMeasureGrp);
343 
344  }
345 
346 
359  MeasureValidationResults ControlNetValidMeasure::ValidStandardOptions(
360  const ControlMeasure * pMeasure, Cube *pCube, PvlGroup *pMeasureGrp) {
361 
362  double dSample, dLine;
363  dSample = pMeasure->GetSample();
364  dLine = pMeasure->GetLine();
365 
366  return (ValidStandardOptions(dSample, dLine, pMeasure, pCube, pMeasureGrp));
367  }
368 
369 
370  MeasureValidationResults ControlNetValidMeasure::ValidStandardOptions(
371  const ControlMeasure * pMeasure, Cube *pCube, Camera *camera,
372  PvlGroup *pMeasureGrp) {
373 
374  double dSample, dLine;
375  dSample = pMeasure->GetSample();
376  dLine = pMeasure->GetLine();
377 
378  return ValidStandardOptions(dSample, dLine, pMeasure,
379  pCube, camera, pMeasureGrp);
380  }
381 
388  void ControlNetValidMeasure::ValidatePvlFromEdge(void) {
389  // Parse the Pixels from edge
390  if(mPvlOpGrp.hasKeyword("PixelsFromEdge")) {
391  miPixelsFromEdge = mPvlOpGrp["PixelsFromEdge"];
392  if(miPixelsFromEdge < 0) {
393  miPixelsFromEdge = 0;
394  }
395  else {
396  mbValidateFromEdge = true;
397  }
398  mStdOptionsGrp += Isis::PvlKeyword("PixelsFromEdge", toString(miPixelsFromEdge));
399  }
400  // Parse the Meters from edge
401  if(mPvlOpGrp.hasKeyword("MetersFromEdge")) {
402  mdMetersFromEdge = mPvlOpGrp["MetersFromEdge"];
403  if(mdMetersFromEdge < 0) {
404  mdMetersFromEdge = 0;
405  }
406  else {
407  mbValidateFromEdge = true;
408  }
409  mStdOptionsGrp += Isis::PvlKeyword("MetersFromEdge", toString(mdMetersFromEdge));
410  }
411  }
412 
420  void ControlNetValidMeasure::ValidatePvlResolution(void) {
421  if(mPvlOpGrp.hasKeyword("MinResolution")){
422  mdMinResolution = mPvlOpGrp["MinResolution"];
423  mbCameraRequired = true;
424  }
425  else {
426  mdMinResolution = 0;
427  }
428  mStdOptionsGrp += Isis::PvlKeyword("MinResolution", toString(mdMinResolution));
429 
430  if(mPvlOpGrp.hasKeyword("MaxResolution")){
431  mdMaxResolution = mPvlOpGrp["MaxResolution"];
432  mbCameraRequired = true;
433  }
434  else {
435  mdMaxResolution = DBL_MAX;
436  }
437  mStdOptionsGrp += Isis::PvlKeyword("MaxResolution", (mdMaxResolution == DBL_MAX ? "NA" : toString(mdMaxResolution)));
438 
439  if(mdMinResolution < 0 || mdMaxResolution < 0) {
440  QString msg = "Invalid Resolution value(s), Resolution must be greater than zero";
441  throw IException(IException::User, msg, _FILEINFO_);
442  }
443 
444  if(mdMaxResolution < mdMinResolution) {
445  QString msg = "MinResolution must be less than MaxResolution";
446  throw IException(IException::User, msg, _FILEINFO_);
447  }
448  }
449 
458  void ControlNetValidMeasure::ValidatePvlDN(void) {
459  if(mPvlOpGrp.hasKeyword("MinDN")) {
460  mdMinDN = mPvlOpGrp["MinDN"];
461  mbValidateDN = true;
462  }
463  else {
464  mdMinDN = Isis::ValidMinimum;
465  }
466  mStdOptionsGrp += Isis::PvlKeyword("MinDN", (mdMinDN == Isis::ValidMinimum ? "NA" : toString(mdMinDN)));
467 
468  if(mPvlOpGrp.hasKeyword("MaxDN")) {
469  mdMaxDN = mPvlOpGrp["MaxDN"];
470  mbValidateDN = true;
471  }
472  else {
473  mdMaxDN = Isis::ValidMaximum;
474  }
475  mStdOptionsGrp += Isis::PvlKeyword("MaxDN", (mdMaxDN == Isis::ValidMaximum ? "NA" : toString(mdMaxDN)));
476 
477  if(mdMaxDN < mdMinDN) {
478  QString msg = "MinDN must be less than MaxDN";
479  throw IException(IException::User, msg, _FILEINFO_);
480  }
481  }
482 
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]";
497  throw IException(IException::User, msg, _FILEINFO_);
498  }
499  }
500  mStdOptionsGrp += Isis::PvlKeyword("MinEmission", toString(mdMinEmissionAngle));
501 
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]";
507  throw IException(IException::User, msg, _FILEINFO_);
508  }
509  }
510  mStdOptionsGrp += Isis::PvlKeyword("MaxEmission", toString(mdMaxEmissionAngle));
511 
512  if(mdMaxEmissionAngle < mdMinEmissionAngle) {
513  QString msg = "Min EmissionAngle must be less than Max EmissionAngle";
514  throw IException(IException::User, msg, _FILEINFO_);
515  }
516 
517  }
518 
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]";
533  throw IException(IException::User, msg, _FILEINFO_);
534  }
535  }
536  mStdOptionsGrp += Isis::PvlKeyword("MinIncidence", toString(mdMinIncidenceAngle));
537 
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]";
543  throw IException(IException::User, msg, _FILEINFO_);
544  }
545  }
546  mStdOptionsGrp += Isis::PvlKeyword("MaxIncidence", toString(mdMaxIncidenceAngle));
547 
548  if(mdMaxIncidenceAngle < mdMinIncidenceAngle) {
549  QString msg = "Min IncidenceAngle must be less than Max IncidenceAngle";
550  throw IException(IException::User, msg, _FILEINFO_);
551  }
552  }
553 
559  void ControlNetValidMeasure::ValidatePvlResidualTolerances(void){
560  bool bRes=false;
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";
566  throw IException(IException::User, msg, _FILEINFO_);
567  }
568  bRes = true;
569  }
570  mStdOptionsGrp += Isis::PvlKeyword("SampleResidual", (mdSampleResTolerance == DBL_MAX ? "NA" : toString(mdSampleResTolerance)));
571 
572  if(mPvlOpGrp.hasKeyword("LineResidual")) {
573  mdLineResTolerance = mPvlOpGrp["LineResidual"];
574  if(mdLineResTolerance < 0) {
575  QString msg = "Invalid Line Residual, must be greater than zero";
576  throw IException(IException::User, msg, _FILEINFO_);
577  }
578  bRes = true;
579  }
580  mStdOptionsGrp += Isis::PvlKeyword("LineResidual", (mdLineResTolerance == DBL_MAX ? "NA" : toString(mdLineResTolerance)));
581 
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";
586  throw IException(IException::User, msg, _FILEINFO_);
587  }
588  bResMag = true;
589  }
590  mStdOptionsGrp += Isis::PvlKeyword("ResidualMagnitude", (mdResidualTolerance == DBL_MAX ? "NA" : toString(mdResidualTolerance)));
591 
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";
595  throw IException(IException::User, msg, _FILEINFO_);
596  }
597  }
598 
599 
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";
611  throw IException(IException::User, msg, _FILEINFO_);
612  }
613  hasSampleLineShift = true;
614  }
615  mStdOptionsGrp += Isis::PvlKeyword("SampleShift", (m_sampleShiftTolerance == DBL_MAX ? "NA" : toString(m_sampleShiftTolerance)));
616 
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";
622  throw IException(IException::User, msg, _FILEINFO_);
623  }
624  hasSampleLineShift = true;
625  }
626  mStdOptionsGrp += Isis::PvlKeyword("LineShift", (m_lineShiftTolerance == DBL_MAX ? "NA" : toString(m_lineShiftTolerance)));
627 
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";
634  throw IException(IException::User, msg, _FILEINFO_);
635  }
636  hasPixelShift = true;
637  }
638  mStdOptionsGrp += Isis::PvlKeyword("PixelShift", (m_pixelShiftTolerance == DBL_MAX ? "NA" : toString(m_pixelShiftTolerance)));
639 
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";
644  throw IException(IException::User, msg, _FILEINFO_);
645  }
646  }
647 
648 
660  bool ControlNetValidMeasure::ValidEmissionAngle(double pdEmissionAngle) {
661  if(pdEmissionAngle < mdMinEmissionAngle || pdEmissionAngle > mdMaxEmissionAngle) {
662  return false;
663  }
664  return true;
665  }
666 
678  bool ControlNetValidMeasure::ValidIncidenceAngle(double pdIncidenceAngle) {
679  if(pdIncidenceAngle < mdMinIncidenceAngle || pdIncidenceAngle > mdMaxIncidenceAngle) {
680  return false;
681  }
682  return true;
683  }
684 
695  bool ControlNetValidMeasure::ValidDnValue(double pdDnValue) {
696  if(Isis::IsSpecial(pdDnValue) || pdDnValue < mdMinDN || pdDnValue > mdMaxDN) {
697  return false;
698  }
699  return true;
700  }
701 
712  bool ControlNetValidMeasure::ValidResolution(double pdResolution) {
713  if(pdResolution < mdMinResolution || pdResolution > mdMaxResolution) {
714  return false;
715  }
716  return true;
717  }
718 
719 
733  bool ControlNetValidMeasure::ValidResidualTolerances(double pdSampleResidual,
734  double pdLineResidual, double pdResidualMagnitude,
735  MeasureValidationResults & pResults){
736  bool bFlag = true;
737 
738  if(pdSampleResidual > mdSampleResTolerance) {
739  bFlag = false;
740  pResults.addFailure(MeasureValidationResults::SampleResidual, mdSampleResTolerance, "greater");
741  }
742  if(pdLineResidual > mdLineResTolerance) {
743  bFlag = false;
744  pResults.addFailure(MeasureValidationResults::LineResidual, mdLineResTolerance, "greater");
745  }
746  if(pdResidualMagnitude > mdResidualTolerance) {
747  bFlag = false;
748  pResults.addFailure(MeasureValidationResults::ResidualMagnitude, mdResidualTolerance, "greater");
749  }
750 
751  return bFlag;
752  }
753 
754 
766  bool ControlNetValidMeasure::ValidShiftTolerances(
767  double sampleShift, double lineShift, double pixelShift,
768  MeasureValidationResults &results) {
769 
770  bool valid = true;
771 
772  if (sampleShift > m_sampleShiftTolerance) {
773  valid = false;
774  results.addFailure(MeasureValidationResults::SampleShift,
775  m_sampleShiftTolerance, "greater");
776  }
777  if (lineShift > m_lineShiftTolerance) {
778  valid = false;
779  results.addFailure(MeasureValidationResults::LineShift,
780  m_lineShiftTolerance, "greater");
781  }
782  if (pixelShift > m_pixelShiftTolerance) {
783  valid = false;
784  results.addFailure(MeasureValidationResults::PixelShift,
785  m_pixelShiftTolerance, "greater");
786  }
787 
788  return valid;
789  }
790 
791 
803  bool ControlNetValidMeasure::ValidLatLon(Camera *pCamera, int piSample, int piLine) {
804  return true;
805  }
806 
818  bool ControlNetValidMeasure::PixelsFromEdge(int piSample, int piLine, Cube *pCube) {
819  if(miPixelsFromEdge <= 0) {
820  return true;
821  }
822 
823  int iNumSamples = pCube->sampleCount();
824  int iNumLines = pCube->lineCount();
825 
826  // test right
827  if((iNumSamples - piSample) < miPixelsFromEdge) {
828  return false;
829  }
830 
831  // test left
832  if((piSample - miPixelsFromEdge) <= 0) {
833  return false;
834  }
835 
836  // test down
837  if((iNumLines - piLine) < miPixelsFromEdge) {
838  return false;
839  }
840 
841  // test up
842  if((piLine - miPixelsFromEdge) <= 0) {
843  return false;
844  }
845 
846  return true;
847  }
848 
860  bool ControlNetValidMeasure::MetersFromEdge(int piSample, int piLine, Cube *pCube) {
861  if(mdMetersFromEdge <= 0) {
862  return true;
863  }
864 
865  int iNumSamples = pCube->sampleCount();
866  int iNumLines = pCube->lineCount();
867 
868  try {
869  // Get the image's camera to get pixel resolution
870  Camera *camera = pCube->camera();
871  double resMetersTotal = 0;
872  bool bMinDistance = false;
873 
874  // test top
875  for(int line = piLine - 1; line > 0; line--) {
876  camera->SetImage(piSample, line);
877  double resolution = camera->PixelResolution();
878  resMetersTotal += resolution;
879  if(resMetersTotal >= mdMetersFromEdge) {
880  bMinDistance = true;
881  break;
882  }
883  }
884  if(!bMinDistance) {
885  return false;
886  }
887 
888  // test bottom
889  bMinDistance = false;
890  resMetersTotal = 0;
891  for(int line = piLine + 1; line <= iNumLines; line++) {
892  camera->SetImage(piSample, line);
893  double resolution = camera->PixelResolution();
894  resMetersTotal += resolution;
895  if(resMetersTotal >= mdMetersFromEdge) {
896  bMinDistance = true;
897  break;
898  }
899  }
900  if(!bMinDistance) {
901  return false;
902  }
903 
904  // test left
905  resMetersTotal = 0;
906  bMinDistance = false;
907  for(int sample = piSample - 1; sample > 0; sample--) {
908  camera->SetImage(sample, piLine);
909  double resolution = camera->PixelResolution();
910  resMetersTotal += resolution;
911  if(resMetersTotal >= mdMetersFromEdge) {
912  bMinDistance = true;
913  break;
914  }
915  }
916  if(!bMinDistance) {
917  return false;
918  }
919 
920  // test right
921  resMetersTotal = 0;
922  bMinDistance = false;
923  for(int sample = piSample + 1; sample <= iNumSamples; sample++) {
924  camera->SetImage(sample, piLine);
925  double resolution = camera->PixelResolution();
926  resMetersTotal += resolution;
927  if(resMetersTotal >= mdMetersFromEdge) {
928  return true;
929  }
930  }
931  return false;
932  }
933  catch(IException &e) {
934  QString msg = "Cannot Create Camera for Image [" +
935  pCube->fileName() + "]";
936  throw IException(IException::User, msg, _FILEINFO_);
937  }
938  }
939 };
940 
const double Null
Value for an Isis Null pixel.
Definition: SpecialPixel.h:109
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
Definition: PvlObject.h:141
PixelType pixelType() const
Definition: Cube.cpp:1355
const double ValidMinimum
The minimum valid double value for Isis pixels.
Definition: SpecialPixel.h:101
Camera * camera()
Return a camera associated with the cube.
Definition: Cube.cpp:1118
double GetResidualMagnitude() const
Return Residual magnitude.
Buffer for containing a two dimensional section of an image.
Definition: Portal.h:52
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition: IString.cpp:226
void read(Blob &blob) const
This method will read data from the specified Blob object.
Definition: Cube.cpp:686
bool SetImage(const double sample, const double line)
Sets the sample/line values of the image to get the lat/lon values.
Definition: Camera.cpp:166
int sampleCount() const
Definition: Cube.cpp:1404
double EmissionAngle() const
Returns the emission angle in degrees.
Definition: Sensor.cpp:339
Contains multiple PvlContainers.
Definition: PvlGroup.h:57
#define _FILEINFO_
Macro for the filename and line number.
Definition: IException.h:38
A single keyword-value pair.
Definition: PvlKeyword.h:98
bool IsSpecial(const double d)
Returns if the input pixel is special.
Definition: SpecialPixel.h:199
Container for cube-like labels.
Definition: Pvl.h:135
void SetPosition(const double sample, const double line, const int band)
Sets the line and sample position of the buffer.
Definition: Portal.h:109
MeasureValidationResults class.
const double ValidMaximum
The maximum valid double value for Isis pixels.
Definition: SpecialPixel.h:136
double PixelResolution()
Returns the pixel resolution at the current position in meters/pixel.
Definition: Camera.cpp:744
Isis exception class.
Definition: IException.h:99
a control measurement
QString fileName() const
Returns the opened cube&#39;s filename.
Definition: Cube.cpp:1160
bool hasGroup(const QString &name) const
Returns a boolean value based on whether the object has the specified group or not.
Definition: PvlObject.h:222
Serial Number list generator.
double IncidenceAngle() const
Returns the incidence angle in degrees.
Definition: Sensor.cpp:350
int lineCount() const
Definition: Cube.cpp:1331
IO Handler for Isis Cubes.
Definition: Cube.h:158

U.S. Department of the Interior | U.S. Geological Survey
ISIS | Privacy & Disclaimers | Astrogeology Research Program
To contact us, please post comments and questions on the ISIS Support Center
File Modified: 07/12/2023 23:16:37