#ifndef HRICHANALYSIS_H
#define HRICHANALYSIS_H
#include "TArrayI.h"
#include "TObject.h"
#include "hreconstructor.h"
#include "hrichhit.h"
#include "hrichlabel.h"
#include "hrichpadsignal.h"
class HCategory;
class HIterator;
class HParSet;
class HRichAnalysisPar;
class HRichGeometryPar;
class HRichHit;
class HRichHitHeader;
class HRichPadClean;
class HRichPadLabel;
class HRichRingFind;
class HRichAnalysis: public HReconstructor {
private:
   HRichAnalysis(const HRichAnalysis& source);
   HRichAnalysis& operator=(const HRichAnalysis& source);
public:
   Int_t iActiveSector;
   Short_t* pLeftBorder;  
   Short_t* pRightBorder; 
   HRichPadSignal **pPads; 
   HRichLabel *pLabelArea;
   HRichHit *pRings;
   HIterator* fIter; 
   HIterator* fIterHitHeader; 
   Int_t iPadFiredNr;
   Int_t fPadFired[6];
   Int_t iPadCleanedNr;
   Int_t iClusterCleanedNr;
   TArrayI iClustersCleaned;
   Int_t iLabelNr;
   Int_t iRingNr;
   Int_t iRingNrTot;
   Int_t sectorPairNrTot;
   Int_t allPairNrTot; 
   Int_t iFakePad;
   Int_t iFakeLocalMax4;
   Int_t iFakeLocalMax8;
   Int_t maxFiredTotalPads;
protected:
   HRichPadClean *pPadClean;
   HRichPadLabel *pPadLabel;
   HRichRingFind *pRingFind;
   HRichPadSignal* pSectorPads; 
   Int_t maxCols;
   Int_t maxRows;
   Int_t maxPads;
   Int_t secWithCurrent;
   HCategory *m_pCalCat; 
   HCategory *m_pHitCat; 
   HCategory *m_pHitHdrCat; 
   HRichAnalysisPar* fpAnalysisPar;
   HRichGeometryPar* fpGeomPar;
   TArrayI iPadActive;
   HRichHitHeader *hithdrLoop;
public:
   HRichAnalysis();
   HRichAnalysis(const Text_t *name, const Text_t *title, Bool_t kSkip = kFALSE);
   virtual ~HRichAnalysis();
   Bool_t init();
   Bool_t reinit();
   Bool_t finalize();
   Int_t execute();
   Bool_t initParameters();
   void Reset();
   Int_t GetPadsXNr() {
      return maxCols;
   }
   Int_t GetPadsYNr() {
      return maxRows;
   }
   void SetActiveSector(Int_t sectornr);
   Int_t GetActiveSector() {
      return iActiveSector;
   }
   Int_t SetNextSector();
   Int_t GetPadNr() {
      return maxPads;
   }
   HRichPadSignal* GetPad(Int_t padnr) {
      return &pSectorPads[padnr];
   }
   HRichPadSignal* GetPad(Int_t padx, Int_t pady) {
      return &pSectorPads[padx + pady*maxCols];
   }
   Int_t GetLabelNr() {
      return iLabelNr;
   }
   HRichLabel* GetLabel(Int_t labelnr) {
      return &pLabelArea[labelnr];
   }
   Int_t GetRingNr() {
      return iRingNr;
   }
   HRichHit* GetRing(Int_t ringnr) {
      return &pRings[ringnr];
   }
   Bool_t IsOut(Int_t x, Int_t y) {
      return (!(y >= 0 && y < maxRows &&
                x >= pLeftBorder[y] && x <= pRightBorder[y]));
   }
   Bool_t IsOut(Int_t nowPad, Int_t dx, Int_t dy);
   Bool_t IsOut(Int_t x, Int_t y, Int_t dx, Int_t dy);
   HCategory* getCalCat() {
      return m_pCalCat;
   }
   HCategory* getHitCat() {
      return m_pHitCat;
   }
   HCategory* getHitHdrCat() {
      return m_pHitHdrCat;
   }
   void setCalCat(HCategory* pCalCat) {
      m_pCalCat = pCalCat;
   }
   void setHitCat(HCategory* pHitCat) {
      m_pHitCat = pHitCat;
   }
   void setHitHdrCat(HCategory* pHitHdrCat) {
      m_pHitHdrCat = pHitHdrCat;
   }
   HRichAnalysisPar* getAnalysisPar() {
      return fpAnalysisPar ;
   }
   HRichGeometryPar* getGeometryPar() {
      return fpGeomPar     ;
   }
   void setAnalysisPar(HRichAnalysisPar* pPar) {
      fpAnalysisPar = pPar;
   }
   void setGeometryPar(HRichGeometryPar* pPar) {
      fpGeomPar     = pPar;
   }
protected:
   Bool_t  kSkipEvtIfNoRing;
   void clear();
   void updateHeaders(const Int_t nSec, Int_t nEvNr);
   void updateHits(Int_t nSec);
   Int_t getPadsIndex(Int_t nSec, Int_t nRow, Int_t nCol);
   Int_t* getPadsPointer(Int_t* pPads, Int_t nSec);
public:
   ClassDef(HRichAnalysis, 0)
};
#endif // HRICHANALYSIS_H