package hep.aida.ref.plotter.adapter;

import hep.aida.IAnnotation;
import hep.aida.IDataPoint;
import hep.aida.IDataPointSet;
import hep.aida.IMeasurement;
import hep.aida.ref.event.ObserverAdapter;
import jas.hist.DataSource;
import jas.hist.ExtendedStatistics;
import jas.hist.HasStatistics;
import jas.hist.HistogramUpdate;
import jas.hist.XYDataSource;

import java.util.Vector;

/**
 *
 * @author  The AIDA team @ SLAC
 *
 */
public class AIDADataPointSetAdapter extends ObserverAdapter implements XYDataSource, HasStatistics {
    
    private int axisType = DataSource.DOUBLE;
    
    /**
     * Create a DataSource from a DataPointSet
     */
    public static DataSource create(IDataPointSet dps) {
        if (dps instanceof DataSource) return (DataSource) dps;
        
        AIDADataPointSetAdapter result;
        if ( dps.dimension() < 3 && dps.dimension() > 0 )
            result = new AIDADataPointSetAdapter((IDataPointSet)dps);
        else throw new IllegalArgumentException("Cannot diplay DataPointSets with dimension grater than 2.");
        return result;
    }
    
    protected AIDADataPointSetAdapter(IDataPointSet dps) {
        super(dps);
        this.dpSet = dps;
        st = new AIDADataPointSetStatistics(dpSet);
        this.dimension = dpSet.dimension();
        try {
            String xType = dps.annotation().value("xAxisType");
            if (xType != null && xType.equalsIgnoreCase("date")) axisType = DataSource.DATE;
        } catch (IllegalArgumentException e) {}
        
        update = hr;
     }

    public void setAxisType( int type ) {
        this.axisType = type;
    }
    
    public int getAxisType() {
        return axisType;
    }
        
    public double getMinusError(int i) {
        return dpSet.point(i).coordinate(dimension-1).errorMinus();
    }
    public double getPlusError(int i) {
        return dpSet.point(i).coordinate(dimension-1).errorPlus();
    }
    public double getX(int i) {
        double x = 0;
        if (dimension == 1) 
            x = (double) i;
        else {
            IDataPoint dp = dpSet.point(i);
            IMeasurement m = dp.coordinate(0);
            x = m.value();
        }
        return x;
    }
    public double getY(int i) {
        return dpSet.point(i).coordinate(dimension-1).value();
    }
    public int getNPoints() {
        setValid();
        return dpSet.size();
    }
    public jas.hist.Statistics getStatistics() {
        return st;
    }
    public String getTitle() {
        return dpSet.title();
    }
    
    private IDataPointSet dpSet;
    private AIDADataPointSetStatistics st;
    private int dimension;
    private final static jas.hist.HistogramUpdate hr = new jas.hist.HistogramUpdate(HistogramUpdate.TITLE_UPDATE+HistogramUpdate.DATA_UPDATE+HistogramUpdate.RANGE_UPDATE,false);
    static
    {
       hr.setAxis(hr.HORIZONTAL_AXIS);
       hr.setAxis(hr.VERTICAL_AXIS);
    }
    
    class AIDADataPointSetStatistics implements ExtendedStatistics {

        AIDADataPointSetStatistics( IDataPointSet dps ) {
            this.dps = dps;
        }
        
        public double getStatistic(String str) {
            if ( str.equals(statName) ) return dps.size();
            return 0;
        }
        public String[] getStatisticNames() {
            IAnnotation an = dps.annotation();
            if (an == null) return new String[] { statName };
            else {
                int n = an.size();
                Vector keys = new Vector();
                keys.add(statName);
                for (int i=0; i 

Ads help maintain this website.