package hep.aida.ref;
import hep.aida.IAxis;
import hep.aida.IHistogram;
/**
Fixed-width axis; A reference implementation of hep.aida.IAxis.
@author Wolfgang Hoschek, Tony Johnson, and others.
@version 1.0, 23/03/2000
*/
public class FixedAxis implements IAxis
{
private int bins;
private double min;
private double binWidth;
// Package private for ease of use in Histogram1D and Histogram2D
private int xunder, xover;
/**
* Create an Axis
* @param bins Number of bins
* @param min Minimum for axis
* @param max Maximum for axis
*/
public FixedAxis(int bins, double min, double max)
{
if (bins < 1) throw new IllegalArgumentException("bins="+bins);
if (max <= min) throw new IllegalArgumentException("max <= min");
// Note, for internal consistency we save only min and binWidth
// and always use these quantities for all calculations. Due to
// rounding errors the return value from upperEdge is not necessarily
// exactly equal to max
this.bins = bins;
this.min = min;
this.binWidth = (max - min)/bins;
// our internal definition of overflow/underflow differs from
// that of the outside world
//this.under = 0;
//this.over = bins+1;
}
public double binCentre(int index)
{
return min + binWidth*index + binWidth/2;
}
public double binLowerEdge(int index)
{
if (index == IHistogram.UNDERFLOW) return Double.NEGATIVE_INFINITY;
if (index == IHistogram.OVERFLOW) return upperEdge();
return min + binWidth*index;
}
public int bins()
{
return bins;
}
public double binUpperEdge(int index)
{
if (index == IHistogram.UNDERFLOW) return min;
if (index == IHistogram.OVERFLOW) return Double.POSITIVE_INFINITY;
return min + binWidth*(index+1);
}
public double binWidth(int index)
{
return binWidth;
}
public int coordToIndex(double coord)
{
if (coord < min) return IHistogram.UNDERFLOW;
int index = (int) Math.floor((coord - min)/binWidth);
if (index >= bins) return IHistogram.OVERFLOW;
return index;
}
public double lowerEdge()
{
return min;
}
public double upperEdge()
{
return min + binWidth*bins;
}
/**
* This package private method is similar to coordToIndex except
* that it returns our internal definition for overflow/underflow
*/
int xgetBin(double coord)
{
if (coord < min) return xunder;
int index = (int) Math.floor((coord - min)/binWidth);
if (index > bins) return xover;
return index+1;
}
/**
* Package private method to map from the external representation of bin
* number to our internal representation of bin number
*/
int xmap(int index)
{
if (index >= bins) throw new IllegalArgumentException("bin="+index);
if (index >= 0) return index+1;
if (index == IHistogram.UNDERFLOW) return xunder;
if (index == IHistogram.OVERFLOW) return xover;
throw new IllegalArgumentException("bin="+index);
}
}