#ifndef ESTATS_H
#define ESTATS_H

#include "../ebasicarray_dec.h"

class estatsDensity
{
 public:
  efloatarray dens;
  float xmin;
  float xmax;
  float xstep;
  float bw;

  void clear();
  void calc(edoublearray& xarr,double bw=1.0);
  void calcSorted(const edoublearray& xarr,double bw=1.0);

  void calcWeighted(edoublearray& xarr,edoublearray& warr,double bw=1.0);
  void calcWeightedSorted(edoublearray& xarr,edoublearray& warr,double bw=1.0);
};

class estatsMMedian
{
 public:
  efloatarray med;
  efloatarray p1;
  efloatarray p99;
  efloatarray p25;
  efloatarray p75;
  float xmin;
  float xmax;
  float xstep;
  float xwin;

  void clear();
  void calc(efloatarray& xarr,efloatarray& yarr);
};

class estats
{
 public:
  ebasicarray<double> values;
  ebasicarray<double> weights;

  double mean;
  double stddev;
  double median;
  double p99;
  double p95;
  double p75;
  double p25;
  double p5;
  double p1;

  void reset();
  void add(double value);
  void add(double value,double w);
  void add(const edoublearray& farr);
  void add(const efloatarray& farr);
  void add(const edoublearray& farr,const edoublearray& weights);
  void calc();
  void calcWeighted();

  void calc(edoublearray& vals);
  void calcWeighted(edoublearray& vals,edoublearray& weights);
};

class ebin
{
 public:
  edoublearray xbin;
  eintarray    ybin;
  int maxcount;
  
  eintarray iv;
  edoublearray values;
  void calc(int nbins=0);
};


class ebin2
{
 public:
  edoublearray xbin;
  edoublearray ybin;
  eintarray    ycount;
  int maxcount;

  double xmin;
  double xmax;
  
  eintarray iv;
  edoublearray xvalues;
  edoublearray yvalues;
  void calc(int nbins=0);
};



#include <iostream>

using namespace std;

ostream& operator<<(ostream& stream, const estats& stats);

#endif

