package hep.aida.ref.plotter.adapter;

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

/**
 *
 * @author  manj
 * @version
 */
class AIDACloudStatistics2D implements ExtendedStatistics
{
   /** Creates new AidaStatistics */
   public AIDACloudStatistics2D(ICloud2D 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);
        
        IAnnotation an = histo.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 histo.meanX();
      if (name.equals("XRms"))  return histo.rmsX();
      if (name.equals("YMean")) return histo.meanY();
      if (name.equals("YRms")) return histo.rmsY();
      return 0;
   }
   public Object getExtendedStatistic(String name)
   {
      if (name.equals("Entries"))    return new Integer(histo.entries());
      if (name.equals(outOfRangeStat)) {
          if ( histo.isConverted() ) 
              return new Integer(histo.histogram().extraEntries());
      }
      if (name.equals(nanExtStat)) {
          if ( histo instanceof Cloud )
              return new Integer( ((Cloud)histo).nanEntries() );
          else if ( histo.isConverted() )
              return new Integer(histo.histogram().allEntries()-histo.histogram().entries()-histo.histogram().extraEntries());
      }
      if (name.equals(sumOfWeightsStat)) return new Double(histo.sumOfWeights());

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