/* * RemoteHistogram1D.java * * Created on May 28, 2003, 5:38 PM */ package hep.aida.ref.remote; import hep.aida.IAxis; import hep.aida.ref.Annotation; import hep.aida.ref.ReadOnlyException; import hep.aida.ref.histogram.FixedAxis; public class RemoteSettable1DObject extends RemoteManagedObject { Annotation annotation = null; IAxis axis = null; double[] heights = null; double[] errors = null; int[] entries = null; double[] means = null; double[] rmss = null; double mean = DEFAULT_DOUBLE; double rms = DEFAULT_DOUBLE; int inRangeEntries = DEFAULT_INT; int nanEntries = DEFAULT_INT; int minBinEntries = DEFAULT_INT; int maxBinEntries = DEFAULT_INT; double inRangeHeights = DEFAULT_DOUBLE; double equivalentBinEntries = DEFAULT_DOUBLE; double minBinHeights = DEFAULT_DOUBLE; double maxBinHeights = DEFAULT_DOUBLE; public RemoteSettable1DObject(String name) { super(name); } public void setHeights(double[] h) { if (h == null || h.length == 0) { heights = null; inRangeHeights = DEFAULT_DOUBLE; minBinHeights = DEFAULT_DOUBLE; maxBinHeights = DEFAULT_DOUBLE; return; } heights = h; inRangeHeights = 0; minBinHeights = Double.MAX_VALUE; maxBinHeights = Double.MIN_VALUE; for (int i = 1; i < h.length - 1; i++) { inRangeHeights += h[i]; if (h[i] > maxBinHeights) { maxBinHeights = h[i]; } if (h[i] < minBinHeights) { minBinHeights = h[i]; } } } public void setEntries(int[] h) { if (h == null || h.length == 0) { entries = null; inRangeEntries = DEFAULT_INT; minBinEntries = DEFAULT_INT; maxBinEntries = DEFAULT_INT; return; } entries = h; inRangeEntries = 0; minBinEntries = Integer.MAX_VALUE; maxBinEntries = Integer.MIN_VALUE; for (int i = 1; i < h.length - 1; i++) { inRangeEntries += h[i]; if (h[i] > maxBinEntries) { maxBinEntries = h[i]; } if (h[i] < minBinEntries) { minBinEntries = h[i]; } } } public void setErrors(double[] h) { if (h == null || h.length == 0) { errors = null; return; } errors = h; } public void setMeans(double[] h) { if (h == null || h.length == 0) { means = null; return; } means = new double[h.length]; System.arraycopy(h, 0, means, 0, h.length); } public void setRmss(double[] h) { if (h == null || h.length == 0) { rmss = null; return; } rmss = h; } public void setEquivalentBinEntries(double d) { this.equivalentBinEntries = d; } public void setNanEntries(int i) { this.nanEntries = i; } public void setRms(double rms) { this.rms = rms; } public void setMean(double mean) { this.mean = mean; } public double maxBinHeight() { makeSureDataIsValid(); if ( heights == null && entries != null) return (double) maxBinEntries; return maxBinHeights; } public double minBinHeight() { makeSureDataIsValid(); if ( heights == null && entries != null) return (double) minBinEntries; return minBinHeights; } public double equivalentBinEntries() { makeSureDataIsValid(); if (entries == null) return DEFAULT_INT; return equivalentBinEntries; } public double sumExtraBinHeights() { makeSureDataIsValid(); if (heights == null) { if (entries != null) return (double) (entries[0] + entries[entries.length-1]); else return DEFAULT_DOUBLE; } return (heights[0] + heights[heights.length-1]); } public double sumAllBinHeights() { makeSureDataIsValid(); if (heights == null) { if (entries != null) return (double) allEntries(); else return DEFAULT_DOUBLE; } return (sumBinHeights() + sumExtraBinHeights()); } public double sumBinHeights() { makeSureDataIsValid(); if ( heights == null && entries != null) return (double) inRangeEntries; return inRangeHeights; } public int allEntries() { makeSureDataIsValid(); if (entries == null) { if (heights != null) return (int) sumAllBinHeights(); else return DEFAULT_INT; } return (entries() + extraEntries()); } public int extraEntries() { makeSureDataIsValid(); if (entries == null) { if (heights != null) return (int) (heights[0] + heights[heights.length-1]); else return DEFAULT_INT; } return (entries[0] + entries[entries.length-1]); } public int nanEntries() { makeSureDataIsValid(); return nanEntries; } public int binEntries(int param) throws java.lang.IllegalArgumentException { makeSureDataIsValid(); if (entries == null) { if (heights != null) return (int) binHeight(param); else return DEFAULT_INT; } return entries[convertAIDAIndex(param)]; } public double binError(int param) throws java.lang.IllegalArgumentException { makeSureDataIsValid(); if (errors == null) return Math.sqrt(binHeight(param)); return errors[convertAIDAIndex(param)]; } public double binHeight(int param) throws java.lang.IllegalArgumentException { makeSureDataIsValid(); if (heights == null) { if (entries != null) return (double) binEntries(param); else return DEFAULT_DOUBLE; } return heights[convertAIDAIndex(param)]; } public double binMean(int param) throws java.lang.IllegalArgumentException { makeSureDataIsValid(); double d = DEFAULT_DOUBLE; if (means == null) { if (param == IAxis.UNDERFLOW_BIN) d = Double.NEGATIVE_INFINITY; else if (param == IAxis.OVERFLOW_BIN) d = Double.POSITIVE_INFINITY; else d = axis.binCenter(param); } else d = means[convertAIDAIndex(param)]; return d; } public double binRms(int param) { makeSureDataIsValid(); double d = DEFAULT_DOUBLE; if (rmss == null) { if (param == IAxis.UNDERFLOW_BIN) d = DEFAULT_DOUBLE; else if (param == IAxis.OVERFLOW_BIN) d = DEFAULT_DOUBLE; else d = axis.binWidth(param)/rmsFactor; } else d = rmss[convertAIDAIndex(param)]; return d; } private int convertAIDAIndex(int index) { int mi; if ( index == IAxis.UNDERFLOW_BIN ) mi = 0; else if ( index == IAxis.OVERFLOW_BIN ) mi = axis().bins()+1; else mi = index + 1; return mi; } public int[] getBinEntries() { return entries; } public double[] getBinHeights() { return heights; } public double[] getBinErrors() { return errors; } public double[] getBinMeans() { return means; } public double[] getBinRms() { return rmss; } public int dimension() { //makeSureDataIsValid(); return 1; } public double mean() { makeSureDataIsValid(); return mean; } public double rms() { makeSureDataIsValid(); return rms; } public int entries() { makeSureDataIsValid(); if (entries == null && heights != null) return (int) inRangeHeights; return inRangeEntries; } public int coordToIndex(double param) { makeSureDataIsValid(); return axis.coordToIndex(param); } public hep.aida.IAnnotation annotation() { makeSureDataIsValid(); return annotation; } public hep.aida.IAxis axis() { makeSureDataIsValid(); return axis; } public void setAxis(int bins, double min, double max) { axis = new FixedAxis(bins, min, max); } public String title() { //makeSureDataIsValid(); return annotation.value(Annotation.titleKey); } public void setTitle(String title) throws java.lang.IllegalArgumentException { if (!fillable) throw new ReadOnlyException(); annotation.setFillable(true); annotation.setValue(Annotation.titleKey,title); annotation.setFillable(false); } public void reset() throws java.lang.RuntimeException { throw new ReadOnlyException(); } public void fill(double param, double param1) throws java.lang.IllegalArgumentException { throw new ReadOnlyException(); } }