/* * AidaStatistics.java * * Created on March 19, 2001, 12:58 PM */ package hep.aida.ref.plotter.adapter; import hep.aida.IAnnotation; import hep.aida.IAxis; import hep.aida.IProfile1D; import jas.hist.ExtendedStatistics; import java.util.ArrayList; /** * * @author manj * @version $Id: AIDAProfileStatistics1D.java 10734 2007-05-16 19:31:00Z serbo $ */ class AIDAProfileStatistics1D implements ExtendedStatistics { /** Creates new AidaStatistics */ AIDAProfileStatistics1D(IProfile1D profile) { this.profile = profile; } /** * @return A list of statistic names */ public String[] getStatisticNames() { ArrayList stat = new ArrayList(); for ( int i = 0; i < statNames.length; i++ ) stat.add(statNames[i]); if ( ((Integer) getExtendedStatistic(outOfRangeStat)).intValue() != 0 ) stat.add(outOfRangeStat); if ( ((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; } /** * @param The statistic name, as returned by getStatisticNames() * @return The value for the statistic */ public double getStatistic(String name) { if (name.equals("Mean")) return profile.mean(); if (name.equals("Rms")) return profile.rms(); return 0; } public Object getExtendedStatistic(String name) { if (name.equals("Entries")) return new Integer(profile.entries()); if (name.equals(outOfRangeStat)) return new Integer(profile.extraEntries()); if (name.equals(overflowStat)) return new Integer(profile.binEntries(IAxis.OVERFLOW_BIN)); if (name.equals(underflowStat)) return new Integer(profile.binEntries(IAxis.UNDERFLOW_BIN)); if (name.equals(nanExtStat)) return new Integer(profile.nanEntries()); if (name.equals(sumOfWeightsStat)) return new Double(profile.sumBinHeights()); IAnnotation an = profile.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 = profile.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 IProfile1D profile; 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"; }