#ifndef MARS_MPedCalcFromLoGain
#define MARS_MPedCalcFromLoGain

#ifndef MARS_MExtractPedestal
#include "MExtractPedestal.h"
#endif

#ifndef ROOT_TArrayI
#include <TArrayI.h>
#endif

#ifndef ROOT_MArrayB
#include "MArrayB.h"
#endif

//class MRawEvtPixelIter;
class MPedestalPix;

class MPedCalcFromLoGain : public MExtractPedestal
{
private:
    static const UShort_t fgExtractWinFirst;  // First FADC slice to use for pedestal calculation (currently set to: 15)
    static const UShort_t fgExtractWinSize;   // number of successive slices used to calculate pedestal (currently set to: 6)
    static const UInt_t   fgNumDump;          //!

    UInt_t  fNumEventsDump;            // Number of event after which MPedestalCam gets updated
    UInt_t  fNumAreasDump;             // Number of events after which averaged areas gets updated
    UInt_t  fNumSectorsDump;           // Number of events after which averaged sectors gets updated

    TArrayI fNumEventsUsed;      //! Number of events used for pedestal calc for each pixel
    TArrayI fTotalCounter;       //! Counter for dumping values to Pedestal Container

    Bool_t  fPedestalUpdate;           // Flag if the pedestal shall be updated after every fNumEventsDump

    // MParContainer
    Int_t  ReadEnv(const TEnv &env, TString prefix, Bool_t print);

    // MTask
    Bool_t ReInit(MParList *pList);
    Int_t  PostProcess();

    // MExtractPedestal
    Int_t  Calc();

    //Helper function to extract slice values by slice number
    //void CalcExtractor(const MRawEvtPixelIter &pixel, Float_t &sum, MPedestalPix &ped);
    void ResetArrays();

    void CalcSectorResult();
    void CalcAreaResult();

public:
    MPedCalcFromLoGain(const char *name=NULL, const char *title=NULL);

    // Getters
    TArrayI *GetNumEventsUsed() { return &fNumEventsUsed; }

    void SetNumEventsDump (UInt_t dumpevents=fgNumDump)  { fNumEventsDump  = dumpevents; }
    void SetNumAreasDump  (UInt_t dumpevents=fgNumDump)  { fNumAreasDump   = dumpevents; }
    void SetNumSectorsDump(UInt_t dumpevents=fgNumDump)  { fNumSectorsDump = dumpevents; }
    void SetNumDump       (UInt_t n=fgNumDump) { fNumEventsDump=n; fNumAreasDump=n; fNumSectorsDump=n; }

    void SetPedestalUpdate(Bool_t b=kTRUE) { fPedestalUpdate      = b; }

    Bool_t SetRangeFromExtractor(const MExtractor &ext)
    {
        return MExtractPedestal::SetRangeFromExtractor(ext, kTRUE);
    }

    void Print(Option_t *o="") const;

    ClassDef(MPedCalcFromLoGain, 1)   // Task to calculate pedestals from data runs
};

#endif
