#ifndef HShowerHitFinder_H
#define HShowerHitFinder_H
#include "hreconstructor.h"
#include "hlocation.h"
#include "hratree.h"
#include "hspecgeompar.h"
#include "hgeomvector.h"
class HCategory;
class HIterator;
class HShowerCal;
class HShowerHit;
class HShowerPID;
class HShowerHitHeader;
class HShowerCriterium;
class HShowerHitFPar;
class HShowerGeometry;
class HSpecGeomPar;
class HShowerHitFinder : public HReconstructor {
private:
HLocation m_Loc;
HRaTree *m_pCellArr;
HCategory *m_pCalCat;
HCategory *m_pHitCat;
HCategory *m_pPIDCat;
HCategory *m_pHitHdrCat;
HShowerHitFPar *m_pHitFPar;
HShowerGeometry *m_pGeometry;
HSpecGeomPar *m_pHSpecGeomPar;
HIterator *fIter;
Bool_t m_bIsFillPID;
Bool_t m_bIsSort;
HShowerCriterium *m_pCriterium;
Bool_t isSim ;
public:
HShowerHitFinder();
HShowerHitFinder(const Text_t *name,const Text_t *title);
~HShowerHitFinder();
Int_t execute (void);
Bool_t init (void);
Bool_t finalize (void);
Bool_t initParameters(void);
Bool_t lookForHit(HShowerCal* cal, HLocation &fLoc);
Float_t calculateSum(HLocation &fLoc, Int_t nRange, Int_t* pncs = NULL);
Float_t calculateVar(HLocation &fLoc, Int_t nRange, Float_t avg);
Bool_t isLocalMax (HLocation &fLoc);
HShowerHitFinder &operator=(HShowerHitFinder &c);
HCategory* getCalCat () { return m_pCalCat;}
HCategory* getHitCat () { return m_pHitCat;}
HCategory* getPIDCat () { return m_pPIDCat;}
HShowerHitFPar* getHitFPar () { return m_pHitFPar;}
HShowerGeometry* getGeometry () { return m_pGeometry;}
HSpecGeomPar* getHSpecGeomPar() { return m_pHSpecGeomPar;}
void setCalCat(HCategory* pCalCat) { m_pCalCat = pCalCat;}
void setHitCat(HCategory* pHitCat) { m_pHitCat = pHitCat;}
void setPIDCat(HCategory* pPIDCat) { m_pPIDCat = pPIDCat;}
void setHitFPar(HShowerHitFPar* pPar) { m_pHitFPar= pPar;}
void setGeometry(HShowerGeometry* pGeometry) { m_pGeometry= pGeometry;}
void setCriterium(HShowerCriterium* pCrit);
void setHSpecGeomPar(HSpecGeomPar *pSpecGeometry){ m_pHSpecGeomPar = pSpecGeometry;}
Bool_t IsSortFlagSet() { return m_bIsSort;}
Bool_t IsFillPID() { return m_bIsFillPID;}
void setSortFlag(Bool_t bSort = kTRUE) { m_bIsSort = bSort;}
void setFillPID(Bool_t bIsFillPID = kTRUE) { m_bIsFillPID = bIsFillPID;}
private:
void fillSums(HShowerHit* hit, HLocation &fLoc);
virtual void calcCoord(HShowerHit* hit, HLocation &fLoc);
virtual void calcCoordWithSigma(HShowerHit* hit, HLocation &fLoc, Int_t nRange);
void fillPID(HShowerHit* hit, HShowerPID* pid);
HShowerHitHeader* getHitHeader(HLocation &fLoc);
void updateClusters(HLocation &fLoc);
void updateLocalMax(HLocation &fLoc);
void updateFiredCells(HLocation &fLoc);
ClassDef(HShowerHitFinder,0)
};
#endif