Isis 3 Programmer Reference
CameraStatistics.cpp
1
6/* SPDX-License-Identifier: CC0-1.0 */
7#include "CameraStatistics.h"
8
9#include "Camera.h"
10#include "Cube.h"
11#include "Distance.h"
12#include "Progress.h"
13#include "Statistics.h"
14
15namespace Isis {
16
17
32 CameraStatistics::CameraStatistics(QString filename, int sinc, int linc) {
33 Cube cube;
34 cube.open(filename);
35 Camera *cam = cube.camera();
36 init(cam, sinc, linc, filename);
37 }
38
39
54 CameraStatistics::CameraStatistics(Camera *cam, int sinc, int linc) {
55 init(cam, sinc, linc, "");
56 }
57
58
74 QString filename) {
75 init(cam, sinc, linc, filename);
76 }
77
78
91 void CameraStatistics::init(Camera *cam, int sinc, int linc,
92 QString filename) {
93
94 m_filename = filename;
95 m_sinc = sinc;
96 m_linc = linc;
97
98 m_latStat = new Statistics();
99 m_lonStat = new Statistics();
100 m_resStat = new Statistics();
101
102
106
107
111 m_phaseStat = new Statistics();
117
118 int eband = cam->Bands();
119
120 // If the camera is band independent then only run one band
121 if (cam->IsBandIndependent()) eband = 1;
122
123 int pTotal = eband * ((cam->Lines() - 2) / linc + 2);
124 Progress progress;
125 progress.SetMaximumSteps(pTotal);
126 progress.CheckStatus();
127
128 for (int band = 1; band <= eband; band++) {
129 cam->SetBand(band);
130 for (int line = 1; line < (int)cam->Lines(); line = line + linc) {
131 for (int sample = 1; sample < cam->Samples(); sample = sample + sinc) {
132 addStats(cam, sample, line);
133 }
134
135 // Set the sample value to the last sample and run buildstats
136 int sample = cam->Samples();
137 addStats(cam, sample, line);
138 progress.CheckStatus();
139 }
140
141 // Set the line value to the last line and run on all samples (sample +
142 // sinc)
143 int line = cam->Lines();
144 for (int sample = 1; sample < cam->Samples(); sample = sample + sinc) {
145 addStats(cam, sample, line);
146 }
147
148 // Set last sample and run with last line
149 int sample = cam->Samples();
150 addStats(cam, sample, line);
151 progress.CheckStatus();
152 }
153 }
154
155
160 if (m_latStat != NULL) {
161 delete m_latStat;
162 m_latStat = NULL;
163 }
164 if (m_lonStat != NULL) {
165 delete m_lonStat;
166 m_lonStat = NULL;
167 }
168 if (m_resStat != NULL) {
169 delete m_resStat;
170 m_resStat = NULL;
171 }
172
173
174 if (m_obliqueLineResStat != NULL) {
177
178 }
179
180 if (m_obliqueSampleResStat != NULL) {
183
184 }
185
186 if (m_obliqueResStat != NULL) {
187 delete m_obliqueResStat;
188 m_obliqueResStat = NULL;
189 }
190
191 if (m_sampleResStat != NULL) {
192 delete m_sampleResStat;
193 m_sampleResStat = NULL;
194 }
195 if (m_lineResStat != NULL) {
196 delete m_lineResStat;
197 m_lineResStat = NULL;
198 }
199 if (m_aspectRatioStat != NULL) {
200 delete m_aspectRatioStat;
201 m_aspectRatioStat = NULL;
202 }
203 if (m_phaseStat != NULL) {
204 delete m_phaseStat;
205 m_phaseStat = NULL;
206 }
207 if (m_emissionStat != NULL) {
208 delete m_emissionStat;
209 m_emissionStat = NULL;
210 }
211 if (m_incidenceStat != NULL) {
212 delete m_incidenceStat;
213 m_incidenceStat = NULL;
214 }
215 if (m_localSolarTimeStat != NULL) {
218 }
219 if (m_localRaduisStat != NULL) {
220 delete m_localRaduisStat;
221 m_localRaduisStat = NULL;
222 }
223 if (m_northAzimuthStat != NULL) {
224 delete m_northAzimuthStat;
225 m_northAzimuthStat = NULL;
226 }
227 }
228
229
238 void CameraStatistics::addStats(Camera *cam, int &sample, int &line) {
239 cam->SetImage(sample, line);
240 if(cam->HasSurfaceIntersection()) {
241 m_latStat->AddData(cam->UniversalLatitude());
242 m_lonStat->AddData(cam->UniversalLongitude());
243
244
245 m_obliqueResStat->AddData(cam->ObliquePixelResolution());
246 m_obliqueSampleResStat->AddData(cam->ObliqueSampleResolution());
247 m_obliqueLineResStat->AddData(cam->ObliqueLineResolution());
248
249
250
251 m_resStat->AddData(cam->PixelResolution());
252 m_sampleResStat->AddData(cam->SampleResolution());
253 m_lineResStat->AddData(cam->LineResolution());
254 m_phaseStat->AddData(cam->PhaseAngle());
255 m_emissionStat->AddData(cam->EmissionAngle());
256 m_incidenceStat->AddData(cam->IncidenceAngle());
257 m_localSolarTimeStat->AddData(cam->LocalSolarTime());
258 m_localRaduisStat->AddData(cam->LocalRadius().meters());
259 // if IsValid
260 m_northAzimuthStat->AddData(cam->NorthAzimuth());
261
262 // if resolution not equal to -1.0
263 double aspectRatio = cam->LineResolution() / cam->SampleResolution();
264 m_aspectRatioStat->AddData(aspectRatio);
265 }
266 }
267
268
281 double value, QString unit="") const {
282
283 if(IsSpecial(value)) {
284 return (PvlKeyword(keyname, "NULL"));
285 }
286 else {
287 return (PvlKeyword(keyname, toString(value), unit));
288 }
289 }
290
291
367 // Set up the Pvl groups and get min, max, avg, and sd for each statstics
368 // object
369 PvlGroup pUser("User Parameters");
370 if (m_filename != "") pUser += PvlKeyword("Filename", m_filename);
371 pUser += PvlKeyword("Linc", toString(m_linc));
372 pUser += PvlKeyword("Sinc", toString(m_sinc));
373
374 PvlGroup pLat("Latitude");
375 pLat += constructKeyword("LatitudeMinimum", m_latStat->Minimum());
376 pLat += constructKeyword("LatitudeMaximum", m_latStat->Maximum());
377 pLat += constructKeyword("LatitudeAverage", m_latStat->Average());
378 pLat += constructKeyword("LatitudeStandardDeviation", m_latStat->StandardDeviation());
379
380 PvlGroup pLon("Longitude");
381 pLon += constructKeyword("LongitudeMinimum", m_lonStat->Minimum());
382 pLon += constructKeyword("LongitudeMaximum", m_lonStat->Maximum());
383 pLon += constructKeyword("LongitudeAverage", m_lonStat->Average());
384 pLon += constructKeyword("LongitudeStandardDeviation", m_lonStat->StandardDeviation());
385
386 PvlGroup pObliqueSampleRes("ObliqueSampleResolution");
387 pObliqueSampleRes += constructKeyword("ObliqueSampleResolutionMinimum",
388 m_obliqueSampleResStat->Minimum(), "meters/pixel");
389 pObliqueSampleRes += constructKeyword("ObliqueSampleResolutionMaximum",
390 m_obliqueSampleResStat->Maximum(),"meters/pixel");
391 pObliqueSampleRes += constructKeyword("ObliqueSampleResolutionAverage",
392 m_obliqueSampleResStat->Average(),"meters/pixel");
393 pObliqueSampleRes += constructKeyword("ObliqueSampleResolutionStandardDeviation",
394 m_obliqueSampleResStat->StandardDeviation(), "meters/pixel");
395
396 PvlGroup pObliqueLineRes("ObliqueLineResolution");
397 pObliqueLineRes += constructKeyword("ObliqueLineResolutionMinimum", m_obliqueLineResStat->Minimum(),
398 "meters/pixel");
399 pObliqueLineRes += constructKeyword("ObliqueLineResolutionMaximum", m_obliqueLineResStat->Maximum(),
400 "meters/pixel");
401 pObliqueLineRes += constructKeyword("ObliqueLineResolutionAverage", m_obliqueLineResStat->Average(),
402 "meters/pixel");
403 pObliqueLineRes += constructKeyword("ObliqueLineResolutionStandardDeviation",
404 m_obliqueLineResStat->StandardDeviation(), "meters/pixel");
405
406 PvlGroup pObliqueResolution("ObliqueResolution");
407 pObliqueResolution += constructKeyword("ObliqueResolutionMinimum", m_obliqueResStat->Minimum(),
408 "meters/pixel");
409 pObliqueResolution += constructKeyword("ObliqueResolutionMaximum", m_obliqueResStat->Maximum(),
410 "meters/pixel");
411 pObliqueResolution += constructKeyword("ObliqueResolutionAverage", m_obliqueResStat->Average(),
412 "meters/pixel");
413 pObliqueResolution += constructKeyword("ObliqueResolutionStandardDeviation",
414 m_obliqueResStat->StandardDeviation(), "meters/pixel");
415
416
417 PvlGroup pSampleRes("SampleResolution");
418 pSampleRes += constructKeyword("SampleResolutionMinimum", m_sampleResStat->Minimum(),
419 "meters/pixel");
420 pSampleRes += constructKeyword("SampleResolutionMaximum", m_sampleResStat->Maximum(),
421 "meters/pixel");
422 pSampleRes += constructKeyword("SampleResolutionAverage", m_sampleResStat->Average(),
423 "meters/pixel");
424 pSampleRes += constructKeyword("SampleResolutionStandardDeviation",
425 m_sampleResStat->StandardDeviation(), "meters/pixel");
426
427 PvlGroup pLineRes("LineResolution");
428 pLineRes += constructKeyword("LineResolutionMinimum", m_lineResStat->Minimum(),
429 "meters/pixel");
430 pLineRes += constructKeyword("LineResolutionMaximum", m_lineResStat->Maximum(),
431 "meters/pixel");
432 pLineRes += constructKeyword("LineResolutionAverage", m_lineResStat->Average(),
433 "meters/pixel");
434 pLineRes += constructKeyword("LineResolutionStandardDeviation",
435 m_lineResStat->StandardDeviation(), "meters/pixel");
436
437 PvlGroup pResolution("Resolution");
438 pResolution += constructKeyword("ResolutionMinimum", m_resStat->Minimum(),
439 "meters/pixel");
440 pResolution += constructKeyword("ResolutionMaximum", m_resStat->Maximum(),
441 "meters/pixel");
442 pResolution += constructKeyword("ResolutionAverage", m_resStat->Average(),
443 "meters/pixel");
444 pResolution += constructKeyword("ResolutionStandardDeviation",
445 m_resStat->StandardDeviation(), "meters/pixel");
446
447 PvlGroup pAspectRatio("AspectRatio");
448 pAspectRatio += constructKeyword("AspectRatioMinimum", m_aspectRatioStat->Minimum());
449 // Note: Maximum is spelled wrong here.
450 pAspectRatio += constructKeyword("AspectRatioMaximun", m_aspectRatioStat->Maximum());
451 pAspectRatio += constructKeyword("AspectRatioAverage", m_aspectRatioStat->Average());
452 pAspectRatio += constructKeyword("AspectRatioStandardDeviation",
454
455 PvlGroup pPhase("PhaseAngle");
456 pPhase += constructKeyword("PhaseMinimum", m_phaseStat->Minimum());
457 pPhase += constructKeyword("PhaseMaximum", m_phaseStat->Maximum());
458 pPhase += constructKeyword("PhaseAverage", m_phaseStat->Average());
459 pPhase += constructKeyword("PhaseStandardDeviation", m_phaseStat->StandardDeviation());
460
461 PvlGroup pEmission("EmissionAngle");
462 pEmission += constructKeyword("EmissionMinimum", m_emissionStat->Minimum());
463 pEmission += constructKeyword("EmissionMaximum", m_emissionStat->Maximum());
464 pEmission += constructKeyword("EmissionAverage", m_emissionStat->Average());
465 pEmission += constructKeyword("EmissionStandardDeviation",
467
468 PvlGroup pIncidence("IncidenceAngle");
469 pIncidence += constructKeyword("IncidenceMinimum", m_incidenceStat->Minimum());
470 pIncidence += constructKeyword("IncidenceMaximum", m_incidenceStat->Maximum());
471 pIncidence += constructKeyword("IncidenceAverage", m_incidenceStat->Average());
472 pIncidence += constructKeyword("IncidenceStandardDeviation",
474
475 PvlGroup pTime("LocalSolarTime");
476 pTime += constructKeyword("LocalSolarTimeMinimum", m_localSolarTimeStat->Minimum(),
477 "hours");
478 pTime += constructKeyword("LocalSolarTimeMaximum", m_localSolarTimeStat->Maximum(),
479 "hours");
480 pTime += constructKeyword("LocalSolarTimeAverage", m_localSolarTimeStat->Average(),
481 "hours");
482 pTime += constructKeyword("LocalSolarTimeStandardDeviation",
484
485 PvlGroup pLocalRadius("LocalRadius");
486 pLocalRadius += constructKeyword("LocalRadiusMinimum", m_localRaduisStat->Minimum());
487 pLocalRadius += constructKeyword("LocalRadiusMaximum", m_localRaduisStat->Maximum());
488 pLocalRadius += constructKeyword("LocalRadiusAverage", m_localRaduisStat->Average());
489 pLocalRadius += constructKeyword("LocalRadiusStandardDeviation",
491
492 PvlGroup pNorthAzimuth("NorthAzimuth");
493 pNorthAzimuth += constructKeyword("NorthAzimuthMinimum", m_northAzimuthStat->Minimum());
494 pNorthAzimuth += constructKeyword("NorthAzimuthMaximum", m_northAzimuthStat->Maximum());
495 pNorthAzimuth += constructKeyword("NorthAzimuthAverage", m_northAzimuthStat->Average());
496 pNorthAzimuth += constructKeyword("NorthAzimuthStandardDeviation",
498
499 Pvl returnPvl;
500 returnPvl.setTerminator("");
501 returnPvl.addGroup(pUser);
502 returnPvl.addGroup(pLat);
503 returnPvl.addGroup(pLon);
504 returnPvl.addGroup(pSampleRes);
505 returnPvl.addGroup(pLineRes);
506 returnPvl.addGroup(pResolution);
507
508 returnPvl.addGroup(pObliqueSampleRes);
509 returnPvl.addGroup(pObliqueLineRes);
510 returnPvl.addGroup(pObliqueResolution);
511
512 returnPvl.addGroup(pAspectRatio);
513 returnPvl.addGroup(pPhase);
514 returnPvl.addGroup(pEmission);
515 returnPvl.addGroup(pIncidence);
516 returnPvl.addGroup(pTime);
517 returnPvl.addGroup(pLocalRadius);
518 returnPvl.addGroup(pNorthAzimuth);
519 return returnPvl;
520 }
521}
void init(Camera *cam, int sinc, int linc, QString filename)
Initializes this collection of statistics by incrementing over sample/line positions in the Camera an...
Statistics * m_lonStat
Universal longitude statistics.
Statistics * m_lineResStat
Line resolution statistics.
Statistics * m_obliqueResStat
Oblique pixel resolution statistics.
Statistics * m_aspectRatioStat
Aspect ratio statistics.
Statistics * m_obliqueLineResStat
Oblique line resolution statistics.
Statistics * m_sampleResStat
Sample resolution statistics.
CameraStatistics(QString filename, int sinc, int linc)
Constructs the Camera Statistics object from a Cube filename.
Statistics * m_phaseStat
Phase angle statistics.
Pvl toPvl() const
Constructs a Pvl object from the values in the various statistics objects.
Statistics * m_obliqueSampleResStat
Oblique sample resolution statistics.
Statistics * m_localSolarTimeStat
Local solar time statistics.
Statistics * m_resStat
Pixel resolution statistics.
int m_sinc
Sample increment for composing statistics.
int m_linc
Line increment for composing statistics.
virtual ~CameraStatistics()
Destroy this instance, deletes all the Statistics objects.
void addStats(Camera *cam, int &sample, int &line)
Add statistics data to Statistics objects if the Camera position given by the provided line and sampl...
PvlKeyword constructKeyword(QString keyname, double value, QString unit) const
Takes a name, value, and optionally units and constructs a PVL Keyword.
Statistics * m_northAzimuthStat
North azimuth statistics.
Statistics * m_localRaduisStat
Local radius statistics (in meters).
Statistics * m_emissionStat
Emission angle statistics.
Statistics * m_incidenceStat
Incidence angle statistics.
QString m_filename
FileName of the Cube the Camera was derived from.
Statistics * m_latStat
Universal latitude statistics.
IO Handler for Isis Cubes.
Definition Cube.h:168
Camera * camera()
Return a camera associated with the cube.
Definition Cube.cpp:1457
void open(const QString &cfile, QString access="r")
This method will open an existing isis cube for reading or reading/writing.
Definition Cube.cpp:622
Program progress reporter.
Definition Progress.h:42
void SetMaximumSteps(const int steps)
This sets the maximum number of steps in the process.
Definition Progress.cpp:85
void CheckStatus()
Checks and updates the status.
Definition Progress.cpp:105
Contains multiple PvlContainers.
Definition PvlGroup.h:41
Container for cube-like labels.
Definition Pvl.h:119
void setTerminator(const QString &term)
Sets the terminator used to signify the end of the PVL informationDefaults to "END".
Definition Pvl.h:144
A single keyword-value pair.
Definition PvlKeyword.h:87
This class is used to accumulate statistics on double arrays.
Definition Statistics.h:94
double Average() const
Computes and returns the average.
double Minimum() const
Returns the absolute minimum double found in all data passed through the AddData method.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
double Maximum() const
Returns the absolute maximum double found in all data passed through the AddData method.
double StandardDeviation() const
Computes and returns the standard deviation.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
bool IsSpecial(const double d)
Returns if the input pixel is special.