package hep.aida.ref;
import hep.aida.IAxis;
import hep.aida.IHistogram;
import hep.aida.IHistogram1D;
/**
Abstract base class extracting and implementing most of the redundancy of the interface.
@author Wolfgang Hoschek, Tony Johnson, and others.
@version 1.0, 23/03/2000
*/
abstract class AbstractHistogram1D extends Histogram implements IHistogram1D
{
protected IAxis xAxis;
AbstractHistogram1D(String title)
{
super(title);
}
public int allEntries()
{
return entries() + extraEntries();
}
public int dimensions()
{
return 1;
}
public int entries()
{
int entries = 0;
for (int i=xAxis.bins(); --i >= 0; ) entries += binEntries(i);
return entries;
}
public int extraEntries()
{
//return entries[xAxis.under] + entries[xAxis.over];
return binEntries(UNDERFLOW) + binEntries(OVERFLOW);
}
/**
* Package private method to map from the external representation of bin
* number to our internal representation of bin number
*/
int map(int index)
{
int bins = xAxis.bins()+2;
if (index >= bins) throw new IllegalArgumentException("bin="+index);
if (index >= 0) return index+1;
if (index == IHistogram.UNDERFLOW) return 0;
if (index == IHistogram.OVERFLOW) return bins-1;
throw new IllegalArgumentException("bin="+index);
}
public int[] minMaxBins()
{
double minValue = Double.MAX_VALUE;
double maxValue = Double.MIN_VALUE;
int minBinX = -1;
int maxBinX = -1;
for (int i=xAxis.bins(); --i >= 0; ) {
double value = binHeight(i);
if (value < minValue) {
minValue = value;
minBinX = i;
}
if (value > maxValue) {
maxValue = value;
maxBinX = i;
}
}
int[] result = {minBinX,maxBinX};
return result;
}
public double sumAllBinHeights()
{
return sumBinHeights() + sumExtraBinHeights();
}
public double sumBinHeights()
{
double sum = 0;
for (int i=xAxis.bins(); --i >= 0; ) sum += binHeight(i);
return sum;
}
public double sumExtraBinHeights()
{
return binHeight(UNDERFLOW) + binHeight(OVERFLOW);
//return heights[xAxis.under] + heights[xAxis.over];
}
public IAxis xAxis()
{
return xAxis;
}
}