#ifndef HGEANTRICH_H
#define HGEANTRICH_H
using namespace std;
#include <iostream> 
#include <iomanip>
#include "hlinkeddataobject.h"
class HGeantRichPhoton : public HLinkedDataObject {
public:
  HGeantRichPhoton();
  HGeantRichPhoton(const HGeantRichPhoton &source);
  ~HGeantRichPhoton();
  void    setTrack(Int_t aTrack) { parentTrack = aTrack; }
  void    setHit(Float_t ax, Float_t ay, Float_t ae);
  void    setAddress(Char_t s) { sector = s; }
  void    setPmtId(Int_t pmtId) {fPmtId = pmtId;}
  virtual Int_t getTrack() { return parentTrack; }
  void    getHit(Float_t &ax, Float_t &ay, Float_t &ae);
  Float_t getEnergy() { return eHit; }
  Float_t getX() { return yHit;  }
  Float_t getY() { return xHit;  }
  Int_t   getSector() { return sector; }
  Int_t   getNLocationIndex() { return 1; }
  Int_t   getLocationIndex(Int_t i); 
  Int_t   getPmtId() {return fPmtId;};
  Bool_t  isNewRich() { return (fPmtId == -1) ? kFALSE:kTRUE; }
private:
  Int_t parentTrack;     
  Float_t xHit;          
  Float_t yHit;          
  Float_t eHit;          
  Char_t sector;         
  Int_t fPmtId;          
  
  ClassDef(HGeantRichPhoton,3) 
};
class HGeantRichDirect : public HLinkedDataObject {
public:
  HGeantRichDirect();
  
  ~HGeantRichDirect();
  void    setTrack(Int_t aTrack) { trackNumber = aTrack;}
  void    setTrack(Int_t aTrack, Int_t aID);
  void    setHit(Float_t ax, Float_t ay, Float_t az);
  void    setMomentum(Float_t aMom, Float_t aTheta, Float_t aPhi);
  void    setELoss(Float_t ae, Float_t alen);
  void    setAddress (Char_t s) { sector = s; };
  void    setNumPhot(Int_t num) {numPhot = num;};
  void    setPmtId(Int_t pmtId) {fPmtId = pmtId;}
  void    getTrack(Int_t &aTrack, Int_t &aID);
  virtual Int_t getTrack() {return trackNumber;}
  void    getHit(Float_t &ax, Float_t &ay, Float_t &az);
  void    getMomentum(Float_t &aMom, Float_t &aTheta, Float_t &aPhi);
  void    getELoss(Float_t &ade, Float_t &alen);
  Float_t getX() { return yHit;  }
  Float_t getY() { return xHit;  }
  Float_t getTheta() { return thetaHit; }
  Float_t getPhi() { return phiHit; }
  Float_t getEnergyLoss() { return eLoss; }
  Float_t getTrackLengthInPhotDet() { return trackLength; }
  Int_t   getSector() {return sector;}
  Int_t   getNLocationIndex() { return 1; }
  inline Int_t   getLocationIndex(Int_t i); 
  Int_t   getNumPhot(){return numPhot;}; 
  Int_t   getPmtId() {return fPmtId;};
  Bool_t  isNewRich() { return (fPmtId == -1) ? kFALSE:kTRUE; }
private:
  Int_t trackNumber;     
  Float_t xHit;          
  Float_t yHit;          
  Float_t zHit;          
  Int_t particleID;      
  Float_t momentum;      
  Float_t thetaHit;      
  Float_t phiHit;        
  Float_t eLoss;         
  Float_t trackLength;   
  Char_t sector;         
  Int_t numPhot;         
  Int_t fPmtId;          
  ClassDef(HGeantRichDirect,3) 
};
inline Int_t HGeantRichDirect::getLocationIndex(Int_t i) {
  switch (i) {
    case 0 : return sector;
  }
  return -1;
}
class HGeantRichMirror : public HLinkedDataObject {
public:
  HGeantRichMirror();
  ~HGeantRichMirror();
  void    setTrack(Int_t aTrack) { trackNumber = aTrack;}
  void    setTrack(Int_t aTrack, Int_t aID);
  void    setHit(Float_t ax, Float_t ay, Float_t az);
  void    setAddress (Char_t s) { sector = s; }
  void    setNumPhot(Int_t num) { numPhot = num; }
  void    setXRing(Float_t xCoor) {xRing = xCoor;}
  void    setYRing(Float_t yCoor) {yRing = yCoor;}
  void    setXYring(const Float_t ax, const Float_t ay);
  void    getTrack(Int_t &aTrack, Int_t &aID);
  virtual Int_t getTrack() {return trackNumber;}
  void    getHit(Float_t &ax, Float_t &ay, Float_t &az);
  Float_t getX() { return yLep;  }
  Float_t getY() { return xLep;  }
  Float_t getXRing(){return xRing;}
  Float_t getYRing(){return yRing;}      
  Int_t   getSector() {return sector;}
  Int_t   getNLocationIndex() { return 1; }
  inline Int_t   getLocationIndex(Int_t i); 
  Int_t   getNumPhot(){return numPhot;}; 
private:
  Int_t numPhot;       
  Int_t trackNumber;   
  Float_t xRing;       
  Float_t yRing;       
  Float_t xLep;        
  Float_t yLep;        
  Float_t zLep;        
  Int_t lepID;         
  Char_t sector;       
  ClassDef(HGeantRichMirror,2) 
};
inline Int_t HGeantRichMirror::getLocationIndex(Int_t i) {
  switch (i) {
    case 0 : return sector;
  }
  return -1;
}
#endif  // HGEANTRICH_H