package org.epics.archiverappliance.retrieval.postprocessors;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
import org.apache.log4j.Logger;
import org.epics.archiverappliance.Event;
/**
*
* <code>Statistics</code> is a post processor which provides a set of statistical numbers for a specific bin.
* The order of parameters is: mean, std, min, max, count.
*
* @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
*
*/
public class Statistics extends SummaryStatsPostProcessor {
public static final String IDENTITY = "stats";
private static Logger logger = Logger.getLogger(Statistics.class.getName());
@Override
public String getIdentity() {
return IDENTITY;
}
@Override
public int getElementCount() {
return 5;
}
@Override
public boolean isProvidingVectorData() {
return true;
}
@Override
public SummaryStatsVectorCollector getCollector() {
return new SummaryStatsVectorCollector() {
SummaryStatistics stats = new SummaryStatistics();
@Override
public void setBinParams(int intervalSecs, long binNum) {
}
@Override
public boolean haveEventsBeenAdded() {
return stats.getN() > 0;
}
@Override
public List<Double> getVectorValues() {
List<Double> list = new ArrayList<>(5);
list.add(stats.getMean());
list.add(stats.getStandardDeviation());
list.add(stats.getMin());
list.add(stats.getMax());
list.add((double)stats.getN());
return list;
}
@Override
public double getStat() {
return Double.NaN;
}
@Override
public void addEvent(Event e) {
double val = e.getSampleValue().getValue().doubleValue();
if(!Double.isNaN(val)) {
stats.addValue(val);
} else {
logger.warn("Skipping NAN");
}
}
};
}
}