#ifndef HEMCCLUSTER_H
#define HEMCCLUSTER_H
#include "TObject.h"
#include "hemccalsim.h"
class HEmcCluster : public TObject {
protected:
  Char_t  sector;         
  UChar_t cell;           
  Short_t index;          
  UChar_t ncells;         
  Float_t energy;         
  Float_t cellEnergy;     
  Float_t time;           
  Float_t xmod;           
  Float_t ymod;           
  Float_t sigmaXYmod;     
  Float_t xlab;           
  Float_t ylab;           
  Float_t zlab;           
  Float_t theta;          
  Float_t phi;            
  UInt_t flags;           
                          
  UChar_t cellList[24];   
  Short_t rpcIndex;       
  UChar_t nMatchedCells;  
  UChar_t nMatchedTracks; 
  Float_t qualityDThDPh;  
                          
  Float_t qualityDTime;   
public:
  HEmcCluster(void) :
    sector(-1),
    cell (0),
    index(-1),
    ncells(0),
    energy(0.),
    cellEnergy(0.),
    time(0.),
    xmod(0.),
    ymod(0.),
    sigmaXYmod(0.),
    xlab(0.),
    ylab(0.),
    zlab(0.),
    theta(0.),
    phi(0.),
    flags(1),
    rpcIndex(-1),
    nMatchedCells(0),
    nMatchedTracks(0),
    qualityDThDPh(-100.),
    qualityDTime (-100.)
  {
    memset(cellList,0,sizeof(cellList));
  }
  ~HEmcCluster(void){}
  
  Char_t getSector(void)          const         {return sector;}
  UChar_t getCell(void)           const         {return cell;}
  Short_t getIndex(void)          const         {return index;}
  Float_t getEnergy(void)         const         {return energy;}
  Float_t getTime(void)           const         {return time;}
  Float_t getMaxEnergy(void)      const         {return cellEnergy;}
  Float_t getXMod(void)           const         {return xmod;}
  Float_t getYMod(void)           const         {return ymod;}
  Float_t getSigmaXMod(void)      const         {return sigmaXYmod;}
  Float_t getSigmaYMod(void)      const         {return sigmaXYmod;}
  Float_t getXLab(void)           const         {return xlab;}
  Float_t getYLab(void)           const         {return ylab;}
  Float_t getZLab(void)           const         {return zlab;}
  void    getXYZLab(Float_t& x,Float_t& y,Float_t& z) {x=xlab; y=ylab; z=zlab;}
  Float_t getTheta()              const         {return  theta;}
  Float_t getPhi()                const         {return  phi;}
  UChar_t getCell(Int_t ind)      const;
  UChar_t getNCells(void)         const         {return ncells<=25 ? ncells : 25;}
  UChar_t getTotalNCells(void)    const         {return ncells;}
  Bool_t  ifActive(void)          const         {return flags & 0x01;     }
  Bool_t  isUsedInParticleCand(void) const      {return (flags>>1) & 0x01;}
  
  Short_t getRpcIndex(void)       const         {return rpcIndex;}
  Float_t getQualDThDPh(void)     const         {return qualityDThDPh;}
  Float_t getQualDTime(void)      const         {return qualityDTime;}
  UChar_t getNMatchedCells(void)  const         {return nMatchedCells;}
  UChar_t getNMatchedTracks(void) const         {return nMatchedTracks;}
  void    setRpcIndex(Short_t i)                {rpcIndex = i;}
  void    setQualDThDPh(Float_t q)              {qualityDThDPh = q;}
  void    setQualDTime(Float_t q)               {qualityDTime  = q;}
  void    setNMatchedCells(UChar_t n)           {nMatchedCells = n;}
  void    addMatchedTrack(void)                 {if(nMatchedTracks < 255) nMatchedTracks++;}
  
  void    setSector(Char_t s)                   {sector      = s;}
  void    setIndex(Short_t ind)                 {index       = ind;}
  void    setEnergy(Float_t e)                  {energy      = e;}
  void    setTime(Float_t t)                    {time        = t;}
  void    setMaxEnergy(Float_t e)               {cellEnergy  = e;}
  void    setXYMod(Float_t x,Float_t y)         {xmod=x; ymod=y;}
  void    setSigmaXYMod(Float_t sigma)          {sigmaXYmod=sigma;}
  void    setXYZLab(Float_t x,Float_t y,Float_t z) {xlab=x; ylab=y; zlab=z;}
  void    setTheta(Float_t a)                   {theta       = a;}
  void    setPhi(Float_t a)                     {phi         = a;}
  void    setCellList(Int_t ncs,UChar_t* list);
  void    setInactive()                         { flags &= ~( 0x01 << 0 ); }
  void    setIsUsedInParticleCand(void)         { flags |=  ( 0x01 << 1);  }
  void    unsetIsUsedInParticleCand(void)       { flags &= ~( 0x01 << 1 ); }
  ClassDef(HEmcCluster,1) 
};
#endif /* !HEMCCLUSTER_H */