/*
 * AidaProfileStatistics2D.java
 *
 * Created on March 19, 2001, 1:32 PM
 */

package hep.aida.ref.plotter.adapter;

import hep.aida.*;
import hep.aida.ref.*;
import jas.hist.*;
import java.util.ArrayList;

/**
 *
 * @author  manj
 * @version
 */
class AIDAProfileStatistics2D implements ExtendedStatistics 
{
    
    /** Creates new AidaProfileStatistics2D */
    AIDAProfileStatistics2D(IProfile2D profile)
    {
        this.profile=profile;
    }
   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);
       
        IAnnotation an = profile.annotation();
        if (an != null) {
            int n = an.size();
            for (int i=0; i<n; i++) {
                try {
                    String key = an.key(i);
                    if (key.toLowerCase().startsWith("stat:")) {
                        stat.add(key.substring(5));
                    }                 
                } catch (IllegalArgumentException e) {}
            }
        }
       
       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("XMean"))      return profile.meanX();
        if (name.equals("XRms"))       return profile.rmsX();
        if (name.equals("YMean"))      return profile.meanY();
        if (name.equals("YRms"))       return profile.rmsY();
        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(nanExtStat))   return new Integer(profile.allEntries()-profile.entries()-profile.extraEntries());
        if (name.equals(sumOfWeightsStat)) return new Double(profile.sumBinHeights());

        IAnnotation an = profile.annotation();
        if (an == null) return null;
        String v = null;
        try {
            v = an.value("stat:"+name);
        } catch (IllegalArgumentException e) {}
        return v;
    }
    private IProfile2D profile;
    private String[] statNames = {"Entries","XMean","XRms","YMean","YRms"};
    private final String nanExtStat = "NaN";
    private final String sumOfWeightsStat = "SumOfWeights";
    private final String outOfRangeStat = "OutOfRange";
}
