package hep.aida.ref.histogram; /** * Implementation of IBaseHistogram. * * @author The AIDA Team at SLAC. * */ import hep.aida.IAnnotation; import hep.aida.IAxis; import hep.aida.IBaseHistogram; import hep.aida.ref.AidaUtils; import hep.aida.ref.Annotation; import hep.aida.ref.ManagedObject; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; public abstract class AbstractBaseHistogram extends ManagedObject implements IBaseHistogram { private int dimension; private IAnnotation annotation; // Allowed keys that can be set in the annotation from options static String[] styleKeys = {"xaxislabel", "xaxisscale", "xaxistype", "yaxislabel", "yaxisscale", "yaxistype"}; /** * Utility method to map the bin number from the external representation (from -2 to nBins-1 where -2 is the overflow and -1 is the underflow) * to the internal one (from 0 to nBins+1 where 0 is the underflow and nBins+1 if the overflow bin) * @param index The bin number in the external representation. * @param axis The axis to which the bin belongs to. * @return The bin number in the internal representation. * */ protected int mapBinNumber(int index, IAxis axis) { int bins = axis.bins()+2; if (index >= bins) throw new IllegalArgumentException("bin="+index); if (index >= 0) return index+1; if (index == IAxis.UNDERFLOW_BIN) return 0; if (index == IAxis.OVERFLOW_BIN) return bins-1; throw new IllegalArgumentException("bin="+index); } /** * Creates a new instance of BaseHistogram. * @param name The name of the BaseHistogram. See ManagedObject for details. * @param title The title of the BaseHistogram. * @param dimension The dimension of the BaseHistogram. * */ public AbstractBaseHistogram(String name, String title, int dimension) { this(name, title, dimension, null); } public AbstractBaseHistogram(String name, String title, int dimension, String options) { super(name); this.dimension = dimension; annotation = new Annotation(); annotation.addItem(Annotation.titleKey,title,true); setOptions(options); } private void setOptions(String options) { if (options == null || options.trim().equals("")) return; Map optionMap = AidaUtils.parseOptions( options ); if (optionMap.isEmpty()) return; Iterator it = optionMap.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); if ( key.toLowerCase().startsWith("annotation.") || key.toLowerCase().startsWith("annotation:") ) { String annVal = (String) optionMap.get(key); String annKey = key.substring(11); if ( annVal != null && !annVal.trim().equals("") && annKey != null && !annKey.trim().equals("") ) annotation.addItem(annKey, annVal, true); } } } /** * Get the histogram title. * @return the Histogram title. * */ public String title() { String title = annotation.value(Annotation.titleKey); if ( title == null ) title = ""; return title; } /** * Set the histogram title. * @param title The title. * */ public void setTitle(String title) { if ( title == null ) title = ""; annotation.setValue(Annotation.titleKey,title); if (isValid) fireStateChanged(); } /** * Get the IAnnotation associated with the histogram. * @return The IAnnotation. * */ public IAnnotation annotation() { return annotation; } public void setAnnotation( IAnnotation annotation ) { this.annotation = annotation; } /** * Get the dimension of the histogram. * */ public int dimension() { return dimension; } /** * Reset the histogram; as if just created. * */ public void reset() { // annotation.reset(); } /** * Number of in-range entries in the histogram. * @return The number of in-range entries. * */ abstract public int entries(); /** * Number of entries whose coordinate or weight is NaN. Such entries * are counted as allEntries but don't contribute to the statistics. * @return The number of entries whose value or weight is NaN. * */ abstract public int nanEntries(); }