package hep.aida.ref.histogram; import hep.aida.IHistogram; import hep.aida.ref.event.HistogramEvent; import hep.aida.ref.event.IsObservable; public abstract class Histogram extends AbstractBaseHistogram implements IHistogram, IsObservable { protected final static int X_AXIS = 0; protected final static int Y_AXIS = 1; protected final static int Z_AXIS = 2; protected int allEntries = 0; protected int validEntries = 0; protected double sumOfWeights = 0; protected double sumOfWeightsSquared = 0; protected boolean isFillable = true; private String options; private boolean useOutflows = false; protected boolean meanAndRmsIsSet = false; /** * Create a new Histogram. * @param name The name of the Histogram as a ManagedObject. * @param title The title of the Histogram. * @param dimension The dimension of the Histogram. * */ protected Histogram(String name, String title, int dimension, String options) { super(name, title, dimension, options); this.options = options; } protected java.util.EventObject createEvent() { return new HistogramEvent(this); } /** * Reset the Histogram. After calling this method the Histogram * is as it was just created. * */ public void reset() { super.reset(); allEntries = 0; validEntries = 0; isFillable = true; sumOfWeights = 0; sumOfWeightsSquared = 0; if (isValid) fireStateChanged(); } /** * Get the entries that are within the range of the Histogram; * i.e. all the entries (the number of times the fill method was called) * minus the entries in the overflow or underflow bins. * @return The in-range entries. * */ public int entries() { return validEntries; } /** * Get all the entries in the Histogram, i.e. the number of times the method * fill was called. * @return All the entries in the Histogram. * */ public int allEntries() { return allEntries; } /** * Get the number of entries in the underflow and overflow bins. * @return The number of entries outside the range of the Histogram. * */ abstract public int extraEntries(); /** * Get the number of equivalent entries; i.e. <tt>SUM[ weight ] ^ 2 / SUM[ weight^2 ]</tt>. * @return The equivalent bin entries. * */ public double equivalentBinEntries() { if ( validEntries != 0 ) return sumOfWeights*sumOfWeights/sumOfWeightsSquared; return 0; } /** * Get the sum of the bin heights for in-range entries. * @return The sum of the bin heights. * */ public double sumBinHeights() { return sumAllBinHeights()-sumExtraBinHeights(); } /** * Get the sum of the bin heights for all the entries, in-range and out-range ones. * @return The sum of all the bin's heights. * */ abstract public double sumAllBinHeights(); /** * Get the sum of the bin heights for all the entries outside the Histogram's range. * @return The sum of the out of range bin's heights. * */ abstract public double sumExtraBinHeights(); /** * Get the minimum height of in-range bins in the Histogram. * @return The minimum bin height for in range bins. * */ abstract public double minBinHeight(); /** * Get the maximum height of in-range bins in the Histogram. * @return The maximum bin height for in range bins. * */ abstract public double maxBinHeight(); /** * Scale the weights and the errors by a given factor. * @param scaleFactor The scale factor. * */ abstract public void scale(double scaleFactor); /** * * Developer area. All the non-AIDA methods are down here. * */ public void setNEntries(int entries) { allEntries = entries; } public void setValidEntries(int entries) { //FIXME this is not pretty. It is here for histograms from ROOT or //HBOOK as they don't have enough info to distinguish between allEntries //and valid entries. validEntries = entries; } protected String options() { return options; } protected boolean useOutflows() { return useOutflows; } protected void setUseOutflows(boolean useOutflows) { this.useOutflows = useOutflows; } public int nanEntries() { return allEntries()-entries()-extraEntries(); } public boolean isMeanAndRmsSet() { return meanAndRmsIsSet; } }