package hep.aida.ref.histogram;
/**
* Implementation of IProfile1D.
*
* @author The AIDA team at SLAC.
*
*/
import hep.aida.IAxis;
import hep.aida.IProfile2D;
import hep.aida.ref.event.IsObservable;
public class Profile2D extends Profile implements hep.aida.IProfile2D, IsObservable {
private Histogram3D hist;
/**
* Create a 1-dimensional Profile.
*
*/
public Profile2D() {
super("","",2);
}
/**
* Create a 1-dimensional Profile.
* @param name The name of the Profile as a ManagedObject.
* @param title The title of the Profile.
* @param xAxis The x-axis of the Profile.
* @param yAxis The y-axis of the Profile.
*
*/
protected Profile2D(String name, String title, IAxis xAxis, IAxis yAxis) {
this( name, title, xAxis, yAxis, "");
}
protected Profile2D(String name, String title, IAxis xAxis, IAxis yAxis, String options) {
super(name, title, 2, options);
initProfile2D( xAxis, yAxis, options );
}
public void reset() {
hist.reset();
if (isValid) fireStateChanged();
}
public double binMeanX( int indexX, int indexY ) {
return hist.binMeanX(indexX,indexY,0);
}
public double binMeanY( int indexX, int indexY ) {
return hist.binMeanY(indexX,indexY,0);
}
public int binEntries(int indexX, int indexY) {
return hist.binEntries(indexX, indexY, 0);
}
public int binEntriesX(int indexX) {
return hist.binEntriesX(indexX);
}
public int binEntriesY(int indexY) {
return hist.binEntriesY(indexY);
}
public double binError(int indexX, int indexY) {
if ( binEntries(indexX,indexY) == 0 )
return 0;
double sOfWeights = hist.binHeight(indexX, indexY, 0);
if ( sOfWeights != 0 ) return Math.abs(hist.binMeanZ(indexX, indexY,0)/sOfWeights);
return 0.;
}
public double binHeight(int indexX, int indexY) {
if ( binEntries(indexX,indexY) == 0 )
return 0;
return hist.binMeanZ(indexX, indexY, 0);
}
public double binHeightX(int indexX) {
return hist.binHeightX(indexX);
}
public double binHeightY(int indexY) {
return hist.binHeightY(indexY);
}
public double binRms(int indexX, int indexY) {
if ( binEntries(indexX,indexY) == 0 )
return 0;
return hist.binRmsZ(indexX, indexY, 0);
}
public int coordToIndexX(double coord) {
return hist.xAxis().coordToIndex(coord);
}
public int coordToIndexY(double coord) {
return hist.yAxis().coordToIndex(coord);
}
public void fill(double x, double y, double z) throws java.lang.IllegalArgumentException {
hist.fill(x, y, z);
if (isValid) fireStateChanged();
}
public void fill(double x, double y, double z, double weight) throws java.lang.IllegalArgumentException {
hist.fill(x, y, z, weight);
if (isValid) fireStateChanged();
}
public double meanX() {
return hist.meanX();
}
public double meanY() {
return hist.meanY();
}
public double rmsX() {
return hist.rmsX();
}
public double rmsY() {
return hist.rmsY();
}
public IAxis xAxis() {
return hist.xAxis();
}
public IAxis yAxis() {
return hist.yAxis();
}
public int entries() {
return hist.entries();
}
public int allEntries() {
return hist.allEntries();
}
public int extraEntries() {
int n = 0;
for (int i=xAxis().bins(); --i >= -2;)
for (int j=yAxis().bins(); --j >= -2;)
if ( i<0 || j<0 ) n += binEntries(i,j);
return n;
}
public double maxBinHeight() {
double max=Double.NaN;
for(int i=1; i<=xAxis().bins(); i++)
for(int j=1; j<=yAxis().bins(); j++)
if(Double.isNaN(max) || binHeight(i,j) >= max) max=binHeight(i,j);
return max;
}
public double minBinHeight() {
double min=Double.NaN;
for(int i=1; i<=xAxis().bins(); i++)
for(int j=1; j<=yAxis().bins(); j++)
if(Double.isNaN(min) || binHeight(i,j) <= min) min=binHeight(i,j);
return min;
}
public double sumAllBinHeights() {
double sum = 0;
for (int i=xAxis().bins(); --i >= -2;)
for (int j=yAxis().bins(); --j >= -2;)
sum += binHeight(i,j);
return sum;
}
public double sumBinHeights() {
return sumAllBinHeights() - sumExtraBinHeights();
}
public double sumExtraBinHeights() {
int sum = 0;
for (int i=xAxis().bins(); --i >= -2;)
for (int j=yAxis().bins(); --j >= -2;)
if ( i<0 || j<0 ) sum += binHeight(i,j);
return sum;
}
public void scale(double scaleFactor) throws java.lang.IllegalArgumentException {
hist.scale(scaleFactor);
if (isValid) fireStateChanged();
}
public void add(IProfile2D profile) throws IllegalArgumentException {
hist.add( ((Profile2D)profile).histogram() );
if (isValid) fireStateChanged();
}
/**
* non-AIDA methods down here.
*
*/
/**
* Get the internal histogram.
*
*/
protected Histogram3D histogram() {
return hist;
}
protected void setHistogram(Histogram3D hist) {
this.hist = hist;
}
public void initProfile2D( IAxis xAxis, IAxis yAxis ) {
initProfile2D(xAxis, yAxis, "");
}
public void initProfile2D( IAxis xAxis, IAxis yAxis, String options ) {
IAxis zAxis = new FixedAxis(1, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
hist = new Histogram3D(name(), title(), xAxis, yAxis, zAxis, options);
reset();
}
public void setRmsX(double rmsX) {
hist.setRmsX(rmsX);
}
public void setRmsY(double rmsY) {
hist.setRmsY(rmsY);
}
public void setMeanX(double meanX) {
hist.setMeanX(meanX);
}
public void setMeanY(double meanY) {
hist.setMeanY(meanY);
}
public void setNEntries(int entries)
{
hist.setNEntries(entries);
}
public void setValidEntries(int entries)
{
hist.setValidEntries(entries);
}
public void setContents(double[][] heights, double[][] errors, int[][] entries, double[][] rmss, double[][] meanXs, double[][] meanYs) {
int binX = xAxis().bins()+2;
int binY = yAxis().bins()+2;
int[][][] n = new int[binX][binY][3];
double[][][] h = new double[binX][binY][3];
double[][][] e = new double[binX][binY][3];
double[][][] mx = new double[binX][binY][3];
double[][][] rx = new double[binX][binY][3];
double[][][] my = new double[binX][binY][3];
double[][][] ry = new double[binX][binY][3];
double[][][] mz = new double[binX][binY][3];
double[][][] rz = new double[binX][binY][3];
for ( int i = 0; i < binX; i++ ) {
for ( int j = 0; j < binY; j++ ) {
if ( errors[i][j] != 0 ) h[i][j][1] = Math.abs(heights[i][j]/errors[i][j]);
e[i][j][1] = errors[i][j];
n[i][j][1] = entries[i][j];
mx[i][j][1] = meanXs[i][j];
my[i][j][1] = meanYs[i][j];
mz[i][j][1] = heights[i][j];
rz[i][j][1] = Math.abs(rmss[i][j]);
}
}
hist.setContents(h,e,n,mx,rx,my,ry,mz,rz);
}
}