package hep.aida.ref.histogram; /** * Implementation of IProfile1D. * * @author The AIDA team at SLAC. * */ import hep.aida.IAxis; import hep.aida.IProfile1D; import hep.aida.ref.event.IsObservable; public class Profile1D extends Profile implements hep.aida.IProfile1D, IsObservable { private Histogram2D hist; /** * Create a 1-dimensional Profile. * */ public Profile1D() { super("","",1); } /** * Create a 1-dimensional Profile. * @param name The name of the Profile as a ManagedObject. * @param title The title of the Profile. * @param axis The x-axis of the Profile. * */ protected Profile1D(String name, String title, IAxis axis) { this(name, title, axis, "" ); } protected Profile1D(String name, String title, IAxis axis, String options) { super(name, title, 1, options); initProfile1D(axis, options); } public void reset() { hist.reset(); if (isValid) fireStateChanged(); } public int entries() { return hist.entries(); } public int allEntries() { return hist.allEntries(); } public int extraEntries() { return binEntries(IAxis.UNDERFLOW_BIN) + binEntries(IAxis.OVERFLOW_BIN); } public double sumAllBinHeights() { double sum = 0; for (int i=axis().bins(); --i >= -2;) sum += binHeight(i); return sum; } public double sumBinHeights() { return sumAllBinHeights() - sumExtraBinHeights(); } public double sumExtraBinHeights() { return binHeight(IAxis.UNDERFLOW_BIN) + binHeight(IAxis.OVERFLOW_BIN); } public double minBinHeight() { double min=Double.NaN; for(int i=1; i<=axis().bins(); i++) if(Double.isNaN(min) || binHeight(i) <= min) min=binHeight(i); return min; } public double maxBinHeight() { double max=Double.NaN; for(int i=1; i<=axis().bins(); i++) if(Double.isNaN(max) || binHeight(i) >= max) max=binHeight(i); return max; } public void fill(double x, double y, double weight) { hist.fill(x, y, weight); if (isValid) fireStateChanged(); } public void fill(double x, double y) { fill(x, y, 1.); } public int binEntries(int index) { return hist.binEntries(index,0); } public double binHeight(int index) { if ( binEntries(index) == 0 ) return 0; return hist.binMeanY(index,0); } public double binError(int index ) { if ( binEntries(index) == 0 ) return 0; double sOfWeights = hist.binHeight(index,0); if ( sOfWeights != 0 ) return Math.abs(hist.binMeanY(index,0)/sOfWeights); return 0.; } public double binMean(int index) { return hist.binMeanX(index,0); } public double binRms(int index) { if ( binEntries(index) == 0 ) return 0; return hist.binRmsY(index,0); } public double mean() { return hist.meanX(); } public double rms() { return hist.rmsX(); } public IAxis axis() { return hist.xAxis(); } public int coordToIndex(double coord) { return axis().coordToIndex(coord); } public void scale(double scaleFactor) throws IllegalArgumentException { hist.scale( scaleFactor ); if (isValid) fireStateChanged(); } public void add(IProfile1D profile) throws IllegalArgumentException { hist.add( ((Profile1D)profile).histogram() ); if (isValid) fireStateChanged(); } /** * non-AIDA methods down here. * */ /** * Get the internal histogram. * */ protected Histogram2D histogram() { return hist; } protected void setHistogram(Histogram2D hist) { this.hist = hist; } public void initProfile1D( IAxis axis ) { initProfile1D(axis, ""); } public void initProfile1D( IAxis axis, String options ) { IAxis yAxis = new FixedAxis(1, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); hist = new Histogram2D(name(), title(), axis, yAxis, options); reset(); } public void setRms(double rms) { hist.setRmsX(rms); } public void setMean(double mean) { hist.setMeanX(mean); } /** * Set the content of the whole Histogram at once. This is a convenience method for saving/restoring Histograms. * Of the arguments below the heights, the errors and the entries array cannot be null. * If the means array is null, the mean is defaulted to the geometric center of the bin. * If the rms array is null, the rms is taken to be the bin width over the root of 12. * * @param heights The bins heights * @param errors The bins errors * @param entries The bin entries. * @param rmss The rmss of the bins * @param meanXs The mean of the bin. * */ public void setContents(double[] heights, double[] errors, int[] entries, double[] rmss, double[] meanXs) { int binX = axis().bins()+2; int[][] n = new int[binX][3]; double[][] h = new double[binX][3]; double[][] e = new double[binX][3]; double[][] mx = new double[binX][3]; double[][] rx = new double[binX][3]; double[][] my = new double[binX][3]; double[][] ry = new double[binX][3]; for ( int i = 0; i < binX; i++ ) { if ( errors[i] != 0 ) h[i][1] = Math.abs(heights[i]/errors[i]); e[i][1] = errors[i]; n[i][1] = entries[i]; if (meanXs != null) mx[i][1] = meanXs[i]; my[i][1] = heights[i]; if (rmss != null) ry[i][1] = Math.abs(rmss[i]); } hist.setContents(h,e,n,mx,rx,my,ry); } public void setNEntries(int entries) { hist.setNEntries(entries); } public void setValidEntries(int entries) { hist.setValidEntries(entries); } }