package hep.aida.ref.plotter.adapter; import hep.aida.IAnnotation; import hep.aida.IAxis; import hep.aida.ICloud1D; import jas.hist.ExtendedStatistics; import java.util.ArrayList; /** * * @author manj * @version $Id: AIDACloudStatistics1D.java 10734 2007-05-16 19:31:00Z serbo $ */ class AIDACloudStatistics1D implements ExtendedStatistics { public AIDACloudStatistics1D(ICloud1D histo) { this.histo=histo; } public String[] getStatisticNames() { ArrayList stat = new ArrayList(); for ( int i = 0; i < statNames.length; i++ ) stat.add(statNames[i]); if ( getExtendedStatistic(outOfRangeStat) != null && ((Integer) getExtendedStatistic(outOfRangeStat)).intValue() != 0 ) stat.add(outOfRangeStat); if ( getExtendedStatistic(nanExtStat) != null && ((Integer) getExtendedStatistic(nanExtStat)).intValue() != 0 ) stat.add(nanExtStat); if ( ((Integer) getExtendedStatistic("Entries")).intValue() != ((Double) getExtendedStatistic(sumOfWeightsStat)).doubleValue() ) stat.add(sumOfWeightsStat); addAnnotationStatistics(stat); String[] statArray = new String[stat.size()]; for ( int i = 0; i < stat.size(); i++ ) statArray[i] = (String)stat.get(i); return statArray; } public double getStatistic(String name) { if (name.equals("Mean")) return histo.mean(); if (name.equals("Rms")) return histo.rms(); return 0; } public Object getExtendedStatistic(String name) { if (name.equals("Entries")) return new Integer(histo.entries()); if ( histo.isConverted() ) { if (name.equals(outOfRangeStat)) return new Integer(histo.histogram().extraEntries()); if (name.equals(overflowStat)) return new Integer(histo.histogram().binEntries(IAxis.OVERFLOW_BIN)); if (name.equals(underflowStat)) return new Integer(histo.histogram().binEntries(IAxis.UNDERFLOW_BIN)); } else { if (name.equals(outOfRangeStat)) return new Integer(0); if (name.equals(overflowStat)) return new Integer(0); if (name.equals(underflowStat)) return new Integer(0); } if (name.equals(nanExtStat)) return new Integer( histo.nanEntries() ); if (name.equals(sumOfWeightsStat)) return new Double(histo.sumOfWeights()); IAnnotation an = histo.annotation(); if (an == null) return null; String v = null; try { if (an.hasKey("stat."+name)) v = an.value("stat."+name); else if (an.hasKey("stat:"+name)) v = an.value("stat:"+name); } catch (IllegalArgumentException e) {} return v; } private void addAnnotationStatistics(ArrayList stat) { IAnnotation an = histo.annotation(); if (an == null) return; boolean isOutOfRangeSet = false; int n = an.size(); for (int i=0; i<n; i++) { try { String key = an.key(i); String statVal = an.value(i); if (key.toLowerCase().startsWith("stat.") || key.toLowerCase().startsWith("stat:")) { String statKey = key.substring(5); if (statVal.equalsIgnoreCase("false")) { stat.remove(statKey); continue; } if ( overflowStat.equals(statKey) && ((Integer) getExtendedStatistic(statKey)).intValue() == 0 ) continue; if ( underflowStat.equals(statKey) && ((Integer) getExtendedStatistic(statKey)).intValue() == 0 ) continue; if (outOfRangeStat.equals(statKey)) { isOutOfRangeSet = true; continue; } stat.add(statKey); } } catch (IllegalArgumentException e) {} } if (!isOutOfRangeSet && (stat.contains(overflowStat) || stat.contains(underflowStat))) stat.remove(outOfRangeStat); } private ICloud1D histo; private final String[] statNames = {"Entries","Mean","Rms"}; private final String nanExtStat = "NaN"; private final String sumOfWeightsStat = "SumOfWeights"; private final String outOfRangeStat = "OutOfRange"; private final String overflowStat = "Overflow"; private final String underflowStat = "Underflow"; }