package hep.aida.ref.histogram; import hep.aida.ICloud; import hep.aida.IHistogram; import hep.aida.ref.event.HistogramEvent; import hep.aida.ref.event.IsObservable; import java.util.Map; public abstract class Cloud extends AbstractBaseHistogram implements ICloud, IsObservable { /** * Create a Cloud. * @param name The name of the Cloud as a ManagedObject. * @param title The title of the Cloud. * @param dimension The Cloud's dimension. * @param maxEntries The maximum number of entries after which the Cloud will convert to a Histogram. * If maxEntries is negative the Cloud will not convert automatically. * @param options A String containing options (e.g. "autoconvert=false") * */ protected Cloud(String name, String title, int dimension, int maxEntries, String options) { super(name, title, dimension, options); initCloud(maxEntries,options); } protected java.util.EventObject createEvent() { return new HistogramEvent(this); } /** * Reset the histogram; as if just created. * */ public void reset() { super.reset(); validEntries = 0; if (isValid) fireStateChanged(); } /** * Get the sum of weights of of all the entries * @return The sum of the weights of all the entries. * */ abstract public double sumOfWeights(); /** * Convert the ICloud to an IHistogram using the default number of bins. * */ abstract public void convertToHistogram(); /** * Check if the ICloud has been converted to an IHistogram. * @return <code>true</code> if it has been converted. * */ abstract public boolean isConverted(); /** * Scale the weights by a given factor. * @param scaleFactor The scale factor. * */ abstract public void scale(double scaleFactor); /** * * All the non-AIDA methods should go below this. * */ /** * Check if the Cloud is set to convert to an Histogram automatically. * @return <code>true</code> if it will convert automatically, <code>false</code> otherwise. * */ protected boolean autoConvert() { return autoConvert; } /** * Get the maximum number of entries after which the Cloud will convert * to an Histogram. * @return The maximum number of entries. * */ public int maxEntries() { return maxEntries; } /** * Get the options with which the Cloud was created. * @return The String of options. * */ public String getOptions() { return options; } public void initCloud(int maxEntries, String options) { this.maxEntries = maxEntries; if (options != null) this.options = options; Map optionMap = hep.aida.ref.AidaUtils.parseOptions( options ); String autoconv = (String) optionMap.get("autoconvert"); if ( autoconv == null ) autoConvert = true; else autoConvert = Boolean.valueOf(autoconv).booleanValue(); if ( maxEntries < 0 ) autoConvert = false; if ( maxEntries <= 0 ) arraySize = Cloud.CLOUD_ARRAY_ENTRIES; else arraySize = maxEntries > Cloud.CLOUD_ARRAY_ENTRIES ? Cloud.CLOUD_ARRAY_ENTRIES : maxEntries; String marginStr = (String) optionMap.get("margin"); if ( marginStr != null ) { try { double tmpMargin = Double.valueOf(marginStr).doubleValue(); if ( tmpMargin < 0 ) throw new IllegalArgumentException("Illegal margin "+tmpMargin+"; it cannot be negative"); margin = tmpMargin; } catch (NumberFormatException nfe) { throw new IllegalArgumentException("Illegal value for margin option "+marginStr+". It has to be a positive double."); } } } protected double margin() { return margin; } protected abstract IHistogram hist(); public int nanEntries() { if ( isConverted() ) return hist().nanEntries(); return entries() - validEntries; } protected int arraySize; protected int maxEntries; private boolean autoConvert; public static final int CLOUD_ARRAY_ENTRIES = 1000; private String options = ""; private double margin = 0.05; protected int validEntries = 0; }