package com.ibm.nmon.gui.chart.data;
import java.util.List;
import com.ibm.nmon.analysis.AnalysisRecord;
final class GraphData {
int count = 0;
double sum = 0;
double average = Double.NaN;
double median = Double.NaN;
double percentile95 = Double.NaN;
double percentile99 = Double.NaN;
double minimum = Double.MAX_VALUE;
double maximum = Double.MIN_VALUE;
double standardDeviation = Double.NaN;
static GraphData[] calculate(DatasetCallback callback) {
int dataCount = callback.getDataCount();
GraphData[] graphData = new GraphData[dataCount];
for (int i = 0; i < dataCount; i++) {
GraphData data = new GraphData();
graphData[i] = data;
int itemCount = callback.getItemCount(i);
List<Double> allValues = new java.util.ArrayList<Double>(itemCount);
for (int j = 0; j < itemCount; j++) {
double value = callback.getValue(i, j);
if (Double.isNaN(value)) {
continue;
}
data.sum += value;
if (value > data.maximum) {
data.maximum = value;
}
if (value < data.minimum) {
data.minimum = value;
}
allValues.add(value);
}
if (allValues.size() > 0) {
data.count = allValues.size();
data.average = data.sum / data.count;
java.util.Collections.sort(allValues);
data.median = AnalysisRecord.calculatePercentile(.5, allValues);
data.percentile95 = AnalysisRecord.calculatePercentile(.95, allValues);
data.percentile99 = AnalysisRecord.calculatePercentile(.99, allValues);
double sumSqDiffs = 0;
for (double value : allValues) {
sumSqDiffs += Math.pow(value - data.average, 2);
}
data.standardDeviation = Math.sqrt(sumSqDiffs / data.count);
}
else {
// file has data, but not for the given interval
// set all values to NaN
data.maximum = Double.NaN;
data.minimum = Double.NaN;
}
}
return graphData;
}
}