USGS

Isis 3.0 Object Programmers' Reference

Home

CameraStatistics.cpp
1 #include "IsisDebug.h"
2 #include "CameraStatistics.h"
3 
4 #include "Camera.h"
5 #include "Cube.h"
6 #include "Distance.h"
7 #include "Progress.h"
8 #include "Statistics.h"
9 
10 namespace Isis {
11 
12 
27  CameraStatistics::CameraStatistics(QString filename, int sinc, int linc) {
28  Cube cube;
29  cube.open(filename);
30  Camera *cam = cube.camera();
31  init(cam, sinc, linc, filename);
32  }
33 
34 
49  CameraStatistics::CameraStatistics(Camera *cam, int sinc, int linc) {
50  init(cam, sinc, linc, "");
51  }
52 
53 
68  CameraStatistics::CameraStatistics(Camera *cam, int sinc, int linc,
69  QString filename) {
70  init(cam, sinc, linc, filename);
71  }
72 
73 
86  void CameraStatistics::init(Camera *cam, int sinc, int linc,
87  QString filename) {
88 
89  m_filename = filename;
90  m_sinc = sinc;
91  m_linc = linc;
92 
93  m_latStat = new Statistics();
94  m_lonStat = new Statistics();
95  m_resStat = new Statistics();
97  m_lineResStat = new Statistics();
99  m_phaseStat = new Statistics();
100  m_emissionStat = new Statistics();
101  m_incidenceStat = new Statistics();
105 
106  int eband = cam->Bands();
107 
108  // If the camera is band independent then only run one band
109  if (cam->IsBandIndependent()) eband = 1;
110 
111  int pTotal = eband * ((cam->Lines() - 2) / linc + 2);
112  Progress progress;
113  progress.SetMaximumSteps(pTotal);
114  progress.CheckStatus();
115 
116  for (int band = 1; band <= eband; band++) {
117  cam->SetBand(band);
118  for (int line = 1; line < (int)cam->Lines(); line = line + linc) {
119  for (int sample = 1; sample < cam->Samples(); sample = sample + sinc) {
120  addStats(cam, sample, line);
121  }
122 
123  // Set the sample value to the last sample and run buildstats
124  int sample = cam->Samples();
125  addStats(cam, sample, line);
126  progress.CheckStatus();
127  }
128 
129  // Set the line value to the last line and run on all samples (sample +
130  // sinc)
131  int line = cam->Lines();
132  for (int sample = 1; sample < cam->Samples(); sample = sample + sinc) {
133  addStats(cam, sample, line);
134  }
135 
136  // Set last sample and run with last line
137  int sample = cam->Samples();
138  addStats(cam, sample, line);
139  progress.CheckStatus();
140  }
141  }
142 
143 
148  if (m_latStat != NULL) {
149  delete m_latStat;
150  m_latStat = NULL;
151  }
152  if (m_lonStat != NULL) {
153  delete m_lonStat;
154  m_lonStat = NULL;
155  }
156  if (m_resStat != NULL) {
157  delete m_resStat;
158  m_resStat = NULL;
159  }
160  if (m_sampleResStat != NULL) {
161  delete m_sampleResStat;
162  m_sampleResStat = NULL;
163  }
164  if (m_lineResStat != NULL) {
165  delete m_lineResStat;
166  m_lineResStat = NULL;
167  }
168  if (m_aspectRatioStat != NULL) {
169  delete m_aspectRatioStat;
170  m_aspectRatioStat = NULL;
171  }
172  if (m_phaseStat != NULL) {
173  delete m_phaseStat;
174  m_phaseStat = NULL;
175  }
176  if (m_emissionStat != NULL) {
177  delete m_emissionStat;
178  m_emissionStat = NULL;
179  }
180  if (m_incidenceStat != NULL) {
181  delete m_incidenceStat;
182  m_incidenceStat = NULL;
183  }
184  if (m_localSolarTimeStat != NULL) {
185  delete m_localSolarTimeStat;
186  m_localSolarTimeStat = NULL;
187  }
188  if (m_localRaduisStat != NULL) {
189  delete m_localRaduisStat;
190  m_localRaduisStat = NULL;
191  }
192  if (m_northAzimuthStat != NULL) {
193  delete m_northAzimuthStat;
194  m_northAzimuthStat = NULL;
195  }
196  }
197 
198 
207  void CameraStatistics::addStats(Camera *cam, int &sample, int &line) {
208  cam->SetImage(sample, line);
209  if(cam->HasSurfaceIntersection()) {
215  m_phaseStat->AddData(cam->PhaseAngle());
220  // if IsValid
222 
223  // if resolution not equal to -1.0
224  double aspectRatio = cam->LineResolution() / cam->SampleResolution();
225  m_aspectRatioStat->AddData(aspectRatio);
226  }
227  }
228 
229 
242  double value, QString unit="") const {
243 
244  if(IsSpecial(value)) {
245  return (PvlKeyword(keyname, "NULL"));
246  }
247  else {
248  return (PvlKeyword(keyname, toString(value), unit));
249  }
250  }
251 
252 
328  // Set up the Pvl groups and get min, max, avg, and sd for each statstics
329  // object
330  PvlGroup pUser("User Parameters");
331  if (m_filename != "") pUser += PvlKeyword("Filename", m_filename);
332  pUser += PvlKeyword("Linc", toString(m_linc));
333  pUser += PvlKeyword("Sinc", toString(m_sinc));
334 
335  PvlGroup pLat("Latitude");
336  pLat += constructKeyword("LatitudeMinimum", m_latStat->Minimum());
337  pLat += constructKeyword("LatitudeMaximum", m_latStat->Maximum());
338  pLat += constructKeyword("LatitudeAverage", m_latStat->Average());
339  pLat += constructKeyword("LatitudeStandardDeviation", m_latStat->StandardDeviation());
340 
341  PvlGroup pLon("Longitude");
342  pLon += constructKeyword("LongitudeMinimum", m_lonStat->Minimum());
343  pLon += constructKeyword("LongitudeMaximum", m_lonStat->Maximum());
344  pLon += constructKeyword("LongitudeAverage", m_lonStat->Average());
345  pLon += constructKeyword("LongitudeStandardDeviation", m_lonStat->StandardDeviation());
346 
347  PvlGroup pSampleRes("SampleResolution");
348  pSampleRes += constructKeyword("SampleResolutionMinimum", m_sampleResStat->Minimum(),
349  "meters/pixel");
350  pSampleRes += constructKeyword("SampleResolutionMaximum", m_sampleResStat->Maximum(),
351  "meters/pixel");
352  pSampleRes += constructKeyword("SampleResolutionAverage", m_sampleResStat->Average(),
353  "meters/pixel");
354  pSampleRes += constructKeyword("SampleResolutionStandardDeviation",
355  m_sampleResStat->StandardDeviation(), "meters/pixel");
356 
357  PvlGroup pLineRes("LineResolution");
358  pLineRes += constructKeyword("LineResolutionMinimum", m_lineResStat->Minimum(),
359  "meters/pixel");
360  pLineRes += constructKeyword("LineResolutionMaximum", m_lineResStat->Maximum(),
361  "meters/pixel");
362  pLineRes += constructKeyword("LineResolutionAverage", m_lineResStat->Average(),
363  "meters/pixel");
364  pLineRes += constructKeyword("LineResolutionStandardDeviation",
365  m_lineResStat->StandardDeviation(), "meters/pixel");
366 
367  PvlGroup pResolution("Resolution");
368  pResolution += constructKeyword("ResolutionMinimum", m_resStat->Minimum(),
369  "meters/pixel");
370  pResolution += constructKeyword("ResolutionMaximum", m_resStat->Maximum(),
371  "meters/pixel");
372  pResolution += constructKeyword("ResolutionAverage", m_resStat->Average(),
373  "meters/pixel");
374  pResolution += constructKeyword("ResolutionStandardDeviation",
375  m_resStat->StandardDeviation(), "meters/pixel");
376 
377  PvlGroup pAspectRatio("AspectRatio");
378  pAspectRatio += constructKeyword("AspectRatioMinimum", m_aspectRatioStat->Minimum());
379  pAspectRatio += constructKeyword("AspectRatioMaximun", m_aspectRatioStat->Maximum());
380  pAspectRatio += constructKeyword("AspectRatioAverage", m_aspectRatioStat->Average());
381  pAspectRatio += constructKeyword("AspectRatioStandardDeviation",
383 
384  PvlGroup pPhase("PhaseAngle");
385  pPhase += constructKeyword("PhaseMinimum", m_phaseStat->Minimum());
386  pPhase += constructKeyword("PhaseMaximum", m_phaseStat->Maximum());
387  pPhase += constructKeyword("PhaseAverage", m_phaseStat->Average());
388  pPhase += constructKeyword("PhaseStandardDeviation", m_phaseStat->StandardDeviation());
389 
390  PvlGroup pEmission("EmissionAngle");
391  pEmission += constructKeyword("EmissionMinimum", m_emissionStat->Minimum());
392  pEmission += constructKeyword("EmissionMaximum", m_emissionStat->Maximum());
393  pEmission += constructKeyword("EmissionAverage", m_emissionStat->Average());
394  pEmission += constructKeyword("EmissionStandardDeviation",
396 
397  PvlGroup pIncidence("IncidenceAngle");
398  pIncidence += constructKeyword("IncidenceMinimum", m_incidenceStat->Minimum());
399  pIncidence += constructKeyword("IncidenceMaximum", m_incidenceStat->Maximum());
400  pIncidence += constructKeyword("IncidenceAverage", m_incidenceStat->Average());
401  pIncidence += constructKeyword("IncidenceStandardDeviation",
403 
404  PvlGroup pTime("LocalSolarTime");
405  pTime += constructKeyword("LocalSolarTimeMinimum", m_localSolarTimeStat->Minimum(),
406  "hours");
407  pTime += constructKeyword("LocalSolarTimeMaximum", m_localSolarTimeStat->Maximum(),
408  "hours");
409  pTime += constructKeyword("LocalSolarTimeAverage", m_localSolarTimeStat->Average(),
410  "hours");
411  pTime += constructKeyword("LocalSolarTimeStandardDeviation",
413 
414  PvlGroup pLocalRadius("LocalRadius");
415  pLocalRadius += constructKeyword("LocalRadiusMinimum", m_localRaduisStat->Minimum());
416  pLocalRadius += constructKeyword("LocalRadiusMaximum", m_localRaduisStat->Maximum());
417  pLocalRadius += constructKeyword("LocalRadiusAverage", m_localRaduisStat->Average());
418  pLocalRadius += constructKeyword("LocalRadiusStandardDeviation",
420 
421  PvlGroup pNorthAzimuth("NorthAzimuth");
422  pNorthAzimuth += constructKeyword("NorthAzimuthMinimum", m_northAzimuthStat->Minimum());
423  pNorthAzimuth += constructKeyword("NorthAzimuthMaximum", m_northAzimuthStat->Maximum());
424  pNorthAzimuth += constructKeyword("NorthAzimuthAverage", m_northAzimuthStat->Average());
425  pNorthAzimuth += constructKeyword("NorthAzimuthStandardDeviation",
427 
428  Pvl returnPvl;
429  returnPvl.setTerminator("");
430  returnPvl.addGroup(pUser);
431  returnPvl.addGroup(pLat);
432  returnPvl.addGroup(pLon);
433  returnPvl.addGroup(pSampleRes);
434  returnPvl.addGroup(pLineRes);
435  returnPvl.addGroup(pResolution);
436  returnPvl.addGroup(pAspectRatio);
437  returnPvl.addGroup(pPhase);
438  returnPvl.addGroup(pEmission);
439  returnPvl.addGroup(pIncidence);
440  returnPvl.addGroup(pTime);
441  returnPvl.addGroup(pLocalRadius);
442  returnPvl.addGroup(pNorthAzimuth);
443  return returnPvl;
444  }
445 }
446