#ifndef PEDESTALSUBTRACTION_H
#define PEDESTALSUBTRACTION_H

#include "MovingStat.h"

class pedestalSubtraction  {
  /** @short class defining the pedestal subtraction based on an approximated moving average */
 public:
  /** constructor 
      \param nn number of samples to calculate the moving average (defaults to 1000)
  */
  pedestalSubtraction (int nn=1000) : stat(nn) {};
  /* void setPointers(double *me, double *va) {mean=me; var=va; stat.setPointers(mean, var);}; */
    /** virtual destructorr 
     */
    virtual ~pedestalSubtraction() {};
    
    /** clears the moving average */
    virtual void Clear() {stat.Clear();}
    
    /** adds the element to the moving average 
	\param val value to be added
    */
    virtual void addToPedestal(double val){stat.Calc(val);};

  /** returns the average value of the pedestal
      \returns mean of the moving average
    */
    virtual double getPedestal(){return stat.Mean();};

  /** returns the standard deviation of the moving average
      \returns standard deviation of the moving average
    */
    virtual double getPedestalRMS(){return stat.StandardDeviation();};

  /**sets/gets the number of samples for the moving average
      \param i number of elements for the moving average. If -1 (default) or negative, gets.
      \returns actual number of samples for the moving average
    */
    virtual int SetNPedestals(int i=-1) {return stat.SetN(i);};

  /**sets/gets the number of samples for the moving average
      \returns actual number of samples for the moving average
    */
    virtual int GetNPedestals() {return stat.GetN();};
    
    /** sets the moving average */
    virtual void setPedestal(double val, double rms=0, int m=-1) {stat.Set(val, rms, m);}

  
    /** sets the moving average */
    virtual void setPedestalRMS(double rms) {stat.SetRMS(rms);}

    /**sets/gets the number of samples for the moving average
      \returns actual number of samples for the moving average
    */
    virtual int getNumpedestals() {return stat.NumDataValues();};

 private:
    MovingStat stat; /**< approximated moving average struct */

};
#endif
