#ifndef HEMCCLUSTERF_H
#define HEMCCLUSTERF_H
using namespace std;
#include "hreconstructor.h"
#include <iostream> 
#include "hlocation.h"
#include "emcdef.h" 
class HIterator;
class HCategory;
class HGeomVector;
class HEmcCal;
class HRpcCluster;
class HEmcClusterF : public HReconstructor {
private:
  HLocation  fLoc;                               
  HCategory* fEmcCalCat;                         
  HCategory* fClusterCat;                        
  HCategory* fRpcCat;                            
  
  Float_t      cellXmod[emcMaxComponents];       
  Float_t      cellYmod[emcMaxComponents];       
  HGeomVector* emcCellsLab[6][emcMaxComponents]; 
  Float_t      thetaEmcLab[6][emcMaxComponents]; 
  Float_t      sigmaTheta[6][emcMaxComponents];  
  Float_t      phiEmcLab[6][emcMaxComponents];   
  Float_t      sigmaPhi[6][emcMaxComponents];    
  Float_t      sigmaXYmod;                       
  
  Float_t      energy[emcMaxComponents];         
  Char_t       flagUsed[emcMaxComponents];       
  HEmcCal*     pSecECells[emcMaxComponents];     
  
  
  UChar_t      listClustCell[emcMaxComponents];  
  HEmcCal*     pClustCells[emcMaxComponents];    
 
  
  Float_t      dThetaSigOffset;                  
  Float_t      dThetaScale;                      
  Float_t      dTimeOffset;                      
  Float_t      dTimeCut;                         
  Float_t      dThdPhCut;                        
  Float_t      dTimeCutNS;                       
  
  Float_t      cellToCellSpeed;                  
  Float_t      distOffset;                       
  Float_t      timeCutMin;                       
  Float_t      timeCutMax;                       
  Float_t      addEnergy;                        
  Float_t      energyCut;                        
  
  Bool_t       isSimulation;                     
public:
  HEmcClusterF(void);
  HEmcClusterF(const Text_t* name,const Text_t* title);
  ~HEmcClusterF(void);
  
  Bool_t init(void);
  Bool_t reinit(void);
  Bool_t finalize(void) {return kTRUE;}
  Int_t execute(void);
  
  
  void setRpcMatchingParDThDPh(Float_t dTPC)             {dThdPhCut       = dTPC;}    
  void setRpcMatchingParDTheta(Float_t dTh,Float_t dThs) {dThetaSigOffset = dTh;      
                                                          dThetaScale     = dThs;}    
  void setRpcMatchingParDTime(Float_t dTO,Float_t dTC)   {dTimeOffset     = dTO;      
                                                          dTimeCut        = dTC;}     
  void setRpcMatchParDTimeInNs(Float_t dTO,Float_t dTC)  {dTimeOffset     = dTO;      
                                                          dTimeCutNS      = dTC;}     
  
  void setClFnParamCtoCSpeed(Float_t sp)                 {cellToCellSpeed = sp;}      
  void setClFnParamDistOffset(Float_t os)                {distOffset      = os;}      
  void setClFnParamDTimeWindow(Float_t min,Float_t max)  {timeCutMin      = min;      
                                                          timeCutMax      = max;}     
  void addToCellEnergy(Float_t ae)                       {addEnergy       = ae;}
  void setCellEnergyCut(Float_t ct)                      {energyCut       = ct;}
   
protected:
  void         initData(void);
  HRpcCluster* rpcMatch(HEmcCal* cal,Float_t &qualityDThDPh,Float_t &qualityDTime);
  Int_t        maxEnergyCell(void) const;
  Float_t      calcDist(HEmcCal *cal1,HEmcCal *cal2) const;
  Int_t        getNearbyCell(Int_t cell,Int_t i) const;
  static bool  cmpEnergy(pair<Int_t,Float_t> p1,pair<Int_t,Float_t> p2) {return p1.second > p2.second;}
  
public:
  ClassDef(HEmcClusterF,0)   
};
#endif