30 Statistics::Statistics() {
36 void Statistics::Reset() {
48 p_overRangePixels = 0;
49 p_underRangePixels = 0;
50 p_removedData =
false;
54 Statistics::~Statistics() {};
66 void Statistics::AddData(
const double *data,
const unsigned int count) {
67 for(
unsigned int i = 0; i < count; i++) {
68 double value = data[i];
88 void Statistics::RemoveData(
const double *data,
const unsigned int count) {
91 for(
unsigned int i = 0; i < count; i++) {
96 p_sumsum -= data[i] * data[i];
114 else if(AboveRange(data[i])) {
118 p_underRangePixels--;
122 if(p_totalPixels < 0) {
123 string m =
"You are removing non-existant data in [Statistics::RemoveData]";
128 void Statistics::RemoveData(
const double data) {
129 RemoveData(&data, 1);
132 void Statistics::SetValidRange(
const double minimum,
const double maximum) {
133 p_validMinimum = minimum;
134 p_validMaximum = maximum;
136 if(p_validMaximum < p_validMinimum) {
138 IString sMin(minimum);
139 IString sMax(maximum);
140 std::string m =
"Invalid Range: Minimum [" + sMin +
"] must be less than the Maximum [" + sMax +
"]";
141 throw IException(IException::Programmer, m,
_FILEINFO_);
150 double Statistics::Average()
const {
151 if(p_validPixels < 1)
return Isis::NULL8;
152 return p_sum / p_validPixels;
161 double Statistics::StandardDeviation()
const {
162 if(p_validPixels <= 1)
return Isis::NULL8;
163 return sqrt(Variance());
176 double Statistics::Variance()
const {
177 if(p_validPixels <= 1)
return Isis::NULL8;
178 double temp = p_validPixels * p_sumsum - p_sum * p_sum;
179 if(temp < 0.0) temp = 0.0;
180 return temp / ((p_validPixels - 1.0) * p_validPixels);
192 double Statistics::Rms()
const {
193 if(p_validPixels < 1)
return Isis::NULL8;
194 double temp = p_sumsum / p_validPixels;
195 if(temp < 0.0) temp = 0.0;
208 double Statistics::Minimum()
const {
210 string m =
"Minimum is invalid since you removed data";
214 if(p_validPixels < 1)
return Isis::NULL8;
228 double Statistics::Maximum()
const {
230 string m =
"Maximum is invalid since you removed data";
234 if(p_validPixels < 1)
return Isis::NULL8;
244 BigInt Statistics::TotalPixels()
const {
245 return p_totalPixels;
256 BigInt Statistics::ValidPixels()
const {
257 return p_validPixels;
266 BigInt Statistics::OverRangePixels()
const {
267 return p_overRangePixels;
276 BigInt Statistics::UnderRangePixels()
const {
277 return p_underRangePixels;
285 BigInt Statistics::NullPixels()
const {
295 BigInt Statistics::LisPixels()
const {
305 BigInt Statistics::LrsPixels()
const {
315 BigInt Statistics::HisPixels()
const {
325 BigInt Statistics::HrsPixels()
const {
335 BigInt Statistics::OutOfRangePixels()
const {
336 return p_overRangePixels + p_underRangePixels;
354 double Statistics::ChebyshevMinimum(
const double percent)
const {
355 if((percent <= 0.0) || (percent >= 100.0)) {
356 string m =
"Invalid value for percent";
360 if(p_validPixels < 1)
return Isis::NULL8;
361 double k = sqrt(1.0 / (1.0 - percent / 100.0));
362 return Average() - k * StandardDeviation();
380 double Statistics::ChebyshevMaximum(
const double percent)
const {
381 if((percent <= 0.0) || (percent >= 100.0)) {
382 string m =
"Invalid value for percent";
386 if(p_validPixels < 1)
return Isis::NULL8;
387 double k = sqrt(1.0 / (1.0 - percent / 100.0));
388 return Average() + k * StandardDeviation();
405 double Statistics::BestMinimum(
const double percent)
const {
406 if(p_validPixels < 1)
return Isis::NULL8;
407 double min = ChebyshevMinimum(percent);
408 if(Minimum() > min) min = Minimum();
427 double Statistics::BestMaximum(
const double percent)
const {
428 if(p_validPixels < 1)
return Isis::NULL8;
429 double max = ChebyshevMaximum(percent);
430 if(Maximum() < max) max = Maximum();
446 double Statistics::ZScore(
const double value)
const {
447 if(StandardDeviation() == 0) {
448 if(value == Maximum())
return 0;
450 string m =
"Undefined Z-score. Standard deviation is zero and";
455 return (value -
Average()) / StandardDeviation();