#ifndef HGEANTRPC_H
#define HGEANTRPC_H
#include "hlinkeddataobject.h"
class HGeantRpc : public HLinkedDataObject
{
private:
  Int_t    trackNumber;       
  Float_t  trackLength;       
  Float_t  loctrackLength;    
  Float_t  eHit;              
  Float_t  xHit;              
  Float_t  yHit;              
  Float_t  zHit;              
  Float_t  tofHit;            
  Float_t  momHit;            
  Float_t  thetaHit;          
  Float_t  phiHit;            
  Short_t  detectorID;        
  
  Float_t  loctrackLength1;   
  Float_t  eHit1;             
  Float_t  xHit1;             
  Float_t  yHit1;             
  Float_t  momHit1;           
  Float_t  loctrackLength2;   
  Float_t  eHit2;             
  Float_t  xHit2;             
  Float_t  yHit2;             
  Float_t  momHit2;           
  Float_t  loctrackLength3;   
  Float_t  eHit3;             
  Float_t  xHit3;             
  Float_t  yHit3;             
  Float_t  momHit3;           
  Short_t  HGeantRpc_version; 
public:
  HGeantRpc(void);
  ~HGeantRpc(void);
  
  inline void    setTrack(Int_t atrackNumber) {trackNumber = atrackNumber;}
  inline void    setDetectorID(Short_t adetectorID) {detectorID = adetectorID;}
  inline void    setAddress(Int_t sec, Int_t col, Int_t cel, Int_t gap);
  inline void    setVersion(Int_t aHGeantRpc_version) {HGeantRpc_version = aHGeantRpc_version;}
         void    setIncidence(Float_t athetaHit, Float_t aphiHit);
  
  
  
         void    setHit(Float_t axHit, Float_t ayHit, Float_t azHit, Float_t atofHit,
                        Float_t amomHit, Float_t eHit);
         void    setTLength(Float_t atracklength, Float_t aloctracklength);
  
  
  
         void    setHit(Float_t axHit, Float_t ayHit, Float_t azHit, Float_t atofHit,
                        Float_t amomHit, Float_t eHit, Float_t aloctracklength);
  
         void    setGap(Int_t nGap, Float_t axHit, Float_t ayHit, Float_t amomHit,
                        Float_t eHit, Float_t aloctrackLength);
  inline void    setTLengthHit(Float_t atrackLength) {trackLength = atrackLength;};
  inline void    setZHit(Float_t azHit) {zHit = azHit;};
  inline void    setTofHit(Float_t atofHit) {tofHit = atofHit;};
  
  inline Int_t   getSector(void) const;
  inline Int_t   getColumn(void) const;
  inline Int_t   getCell(void)   const;
  inline Int_t   getGap(void)    const;
  inline Int_t   getTrack(void)      {return trackNumber;};
  inline Int_t   getDetectorID(void) {return detectorID;};
  inline Int_t   getNLocationIndex(void) {return 4;};
  inline Int_t   getLocationIndex(Int_t i);
  inline Int_t   getVersion(void) {return HGeantRpc_version;};
  
  
  
         void    getIncidence(Float_t& athetaHit, Float_t& aphiHit);
         void    getTLength(Float_t& atracklength, Float_t& aloctracklength);
         void    getHit(Float_t& axHit, Float_t& ayHit, Float_t& azHit,
                        Float_t& atofHit, Float_t& amomHit, Float_t& aeHit);
  
  
  
  
         Float_t getlocTLengthGap(Int_t nGap);
         void    getGap(Int_t nGap, Float_t& axHit, Float_t& ayHit, Float_t& amomHit,
                        Float_t& aeHit, Float_t& aloctrackLength);
         void    getGap(Int_t nGap, Float_t& axHit, Float_t& ayHit, Float_t& amomHit,
                        Float_t& aeHit);
         void    getGap(Int_t nGap, Float_t& axHit, Float_t& ayHit, Float_t& amomHit);
  
  
  
  inline Float_t getTLengthHit(void) {return trackLength;};
  inline Float_t getZHit(void) {return zHit;};
  inline Float_t getTofHit(void) {return tofHit;};
  
         void    getHit(Float_t& axHit, Float_t& ayHit, Float_t& azHit, Float_t& atofHit,
                        Float_t& amomHit, Float_t& aeHit, Float_t& aloctrackLength);
         void    getHit(Float_t& axHit, Float_t& ayHit, Float_t& azHit, Float_t& atofHit,
                        Float_t& amomHit);
         void    getHit(Float_t& axHit, Float_t& ayHit, Float_t& azHit, Float_t& atofHit);
  
         void    getHitDigi(Float_t& axHit, Float_t& atofHit, Float_t& amomHit,
                            Float_t& aloctrackLength);
  
  
  
  
         void    getCellAverage(Float_t gap, Float_t& axHit, Float_t& ayHit, Float_t& azHit,
                                Float_t& atofHit, Float_t& amomHit, Float_t& aeHit,
                                Float_t& aloctrackLength);
         void    getCellAverage(Float_t& axHit, Float_t& ayHit, Float_t& azHit,
                                Float_t& atofHit, Float_t& amomHit, Float_t& aeHit);
         void    getCellAverage(Float_t& axHit, Float_t& ayHit, Float_t& azHit,
                                Float_t& atofHit, Float_t& amomHit);
         void    getCellAverage(Float_t& axHit, Float_t& ayHit, Float_t& azHit,
                                Float_t& atofHit);
  
         void    getCellAverageDigi(Float_t gap, Float_t& axHit, Float_t& atofHit,
                                    Float_t& amomHit, Float_t& aloctrackLength);
  
  ClassDef(HGeantRpc,5)
};
inline Int_t  HGeantRpc::getSector(void) const{
  if (detectorID<0) return -1*(detectorID+1);
  else return detectorID>>11;
}
inline Int_t  HGeantRpc::getColumn(void) const{
  if (detectorID<0) return -1;
  else return ((detectorID>>8)  & 7);
}
inline Int_t  HGeantRpc::getCell(void) const{
  if (detectorID<0) return -1;
  else return ((detectorID>>2)  & 63);
}
inline Int_t  HGeantRpc::getGap(void) const {
  if (detectorID<0) return -1;
  else return (detectorID & 3);
}
inline void HGeantRpc::setAddress(Int_t sec, Int_t col, Int_t cel, Int_t gap) {
  detectorID = (sec<<11) + (col<<8) + (cel<<2) + gap;
}
inline Int_t HGeantRpc::getLocationIndex(Int_t i) {
  switch (i) {
    case 0 : return getSector();
    case 1 : return getColumn();
    case 2 : return getCell();
    case 3 : return getGap();
  }
  return -1;
}
#endif  /*! HGEANTRPC_H */