File failed to load: https://isis.astrogeology.usgs.gov/9.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
CameraStatistics.cpp
1
5
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
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("UserParameters");
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",
453 m_aspectRatioStat->StandardDeviation());
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",
466 m_emissionStat->StandardDeviation());
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",
473 m_incidenceStat->StandardDeviation());
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",
483 m_localSolarTimeStat->StandardDeviation(), "hours");
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",
490 m_localRaduisStat->StandardDeviation());
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",
497 m_northAzimuthStat->StandardDeviation());
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}
double NorthAzimuth()
Returns the North Azimuth.
Definition Camera.cpp:1927
virtual double SampleResolution()
Returns the sample resolution at the current position in meters.
Definition Camera.cpp:640
virtual double ObliquePixelResolution(bool useLocal=true)
Returns the oblique pixel resolution at the current position in meters/pixel.
Definition Camera.cpp:696
int Lines() const
Returns the number of lines in the image.
Definition Camera.cpp:2816
virtual double PixelResolution()
Returns the pixel resolution at the current position in meters/pixel.
Definition Camera.cpp:681
virtual 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:156
virtual double LineResolution()
Returns the line resolution at the current position in meters.
Definition Camera.cpp:660
virtual double ObliqueLineResolution(bool useLocal=true)
Returns the oblique line resolution at the current position in meters.
Definition Camera.cpp:672
virtual bool IsBandIndependent()
Virtual method that checks if the band is independent.
Definition Camera.cpp:2679
virtual double ObliqueSampleResolution(bool useLocal=true)
Returns the oblique sample resolution at the current position in m.
Definition Camera.cpp:650
int Samples() const
Returns the number of samples in the image.
Definition Camera.cpp:2806
virtual void SetBand(const int band)
Virtual method that sets the band number.
Definition Camera.cpp:2710
int Bands() const
Returns the number of bands in the image.
Definition Camera.cpp:2826
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:1464
void open(const QString &cfile, QString access="r")
This method will open an existing isis cube for reading or reading/writing.
Definition Cube.cpp:629
double meters() const
Get the distance in meters.
Definition Distance.cpp:85
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
void addGroup(const Isis::PvlGroup &group)
Add a group to the object.
Definition PvlObject.h:186
double LocalSolarTime()
Return the local solar time in hours.
Definition Sensor.cpp:665
virtual double UniversalLatitude() const
Returns the planetocentric latitude, in degrees, at the surface intersection point in the body fixed ...
Definition Sensor.cpp:212
bool HasSurfaceIntersection() const
Returns if the last call to either SetLookDirection or SetUniversalGround had a valid intersection wi...
Definition Sensor.cpp:188
virtual double PhaseAngle() const
Returns the phase angle in degrees.
Definition Sensor.cpp:314
virtual double IncidenceAngle() const
Returns the incidence angle in degrees.
Definition Sensor.cpp:339
virtual double UniversalLongitude() const
Returns the positive east, 0-360 domain longitude, in degrees, at the surface intersection point in t...
Definition Sensor.cpp:235
Distance LocalRadius() const
Returns the local radius at the intersection point.
Definition Sensor.cpp:269
virtual double EmissionAngle() const
Returns the emission angle in degrees.
Definition Sensor.cpp:328
This class is used to accumulate statistics on double arrays.
Definition Statistics.h:93
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.