#ifndef __EDHITOBJECTS__
#define __EDHITOBJECTS__
#include "TEveElement.h"
#include "TEvePointSet.h"
#include "TEveLine.h"
#include "TEveCompound.h"
#include "TEveQuadSet.h"
#include "TEveFrameBox.h"
class HMdcSegSim;
class HMdcCal1Sim;
class HTofHitSim;
class HWallHitSim;
class HTofClusterSim;
class HShowerHit;
class HShowerHitSim;
class HEmcCluster;
class HEmcClusterSim;
class HRichHitSim;
class HRpcClusterSim;
class HMetaMatch2;
class candidate;
class HParticleCandSim;
class HGeantKine;
class HGeantRichMirror;
class HGeantRichDirect;
class HGeomVector;
class HEDVertex : public TEvePointSet {
private:
public:
    HEDVertex();
    virtual ~HEDVertex();
    void Print();
    ClassDef(HEDVertex,0)    
};
class HEDSegment : public TEveLine {
private:
public:
    HEDSegment(HMdcSegSim* seg = 0);
    virtual ~HEDSegment();
    void Print();
    ClassDef(HEDSegment,0)   
};
class HEDMdcWire : public TEveLine {
private:
    Int_t nTimes;                  
    Bool_t makeWire(Int_t s,Int_t m,Int_t l,Int_t c,HMdcCal1Sim* cal = 0);
public:
    HEDMdcWire(HMdcCal1Sim* cal = 0);
    HEDMdcWire(Int_t s,Int_t m,Int_t l,Int_t c);
    virtual ~HEDMdcWire();
    void  setNtimes(Int_t times = 0) { nTimes = times;}
    Int_t getNtimes()                { return  nTimes ; }
    void  countUp()                  { nTimes++; }
    void  countDown()                { nTimes--; if(nTimes < 0) nTimes = 0;}
    void  Print();
    ClassDef(HEDMdcWire,0)   
};
class HEDRichHit : public TEveLine {
private:
public:
    HEDRichHit(HRichHitSim* hit = 0,HParticleCandSim* cand = 0);
    virtual ~HEDRichHit();
    void Print();
    ClassDef(HEDRichHit,0)    
};
class HEDWallHit : public TEvePointSet {
private:
public:
    HEDWallHit(HWallHitSim* hit = 0);
    virtual ~HEDWallHit();
    void Print();
    ClassDef(HEDWallHit,0)     
};
class HEDWallPlane : public TEveQuadSet {
private:
    TEveFrameBox* box;
public:
    HEDWallPlane();
    virtual ~HEDWallPlane();
    void Print();
    ClassDef(HEDWallPlane,0)   
};
class HEDTofHit : public TEvePointSet {
private:
public:
    HEDTofHit(HTofHitSim* hit = 0);
    virtual ~HEDTofHit();
    void Print();
    ClassDef(HEDTofHit,0)     
};
class HEDTofCluster : public TEvePointSet {
private:
public:
    HEDTofCluster(HTofClusterSim* hit = 0);
    virtual ~HEDTofCluster();
    void Print();
    ClassDef(HEDTofCluster,0)   
};
class HEDRpcCluster : public TEvePointSet {
private:
public:
    HEDRpcCluster(HRpcClusterSim* hit = 0);
    virtual ~HEDRpcCluster();
    void Print();
    ClassDef(HEDRpcCluster,0)  
};
class HEDShowerHit : public TEvePointSet {
private:
public:
    HEDShowerHit(HShowerHitSim* hit = 0);
    virtual ~HEDShowerHit();
    void Print();
    ClassDef(HEDShowerHit,0)   
};
class HEDEmcCluster : public TEvePointSet {
private:
public:
    HEDEmcCluster(HEmcClusterSim* hit = 0);
    virtual ~HEDEmcCluster();
    void Print();
    ClassDef(HEDEmcCluster,0)   
};
class HEDParticleCand : public TEveCompound {
private:
public:
    HEDParticleCand(HParticleCandSim* cand = 0);
    virtual ~HEDParticleCand();
    void Print();
    void SetLineColor  (Color_t val) { ((TEveLine*)FindChild("EDParticleCand"))->SetLineColor(val);}
    void SetLineStyle  (Style_t val) { ((TEveLine*)FindChild("EDParticleCand"))->SetLineStyle(val);}
    void SetLineWidth  (Style_t val) { ((TEveLine*)FindChild("EDParticleCand"))->SetLineWidth(val);}
    void SetMarkerColor(Color_t val) { ((TEveLine*)FindChild("EDParticleCand"))  ->SetLineColor(val); }
    void SetMarkerStyle(Style_t val) { ((TEveLine*)FindChild("EDParticleCand"))->SetMarkerStyle(val);}
    void SetMarkerSize (Size_t val)  { ((TEveLine*)FindChild("EDParticleCand"))->SetMarkerSize(val) ;}
    void SetRnrLine    (Bool_t val)  { ((TEveLine*)FindChild("EDParticleCand"))  ->SetRnrLine(val);}
    void SetRnrPoints  (Bool_t val)  { ((TEveLine*)FindChild("EDParticleCand"))->SetRnrPoints(val);}
    ClassDef(HEDParticleCand,0)  
};
class HEDRichPadPlane : public TEveQuadSet {
private:
    TEveFrameBox* box;
public:
    HEDRichPadPlane(Int_t sec,Int_t cleaned=0);
    virtual ~HEDRichPadPlane();
    void Print();
    ClassDef(HEDRichPadPlane,0)   
};
class HEDRich700PadPlane : public TEveQuadSet {
private:
public:
    HEDRich700PadPlane();
    virtual ~HEDRich700PadPlane();
    void Print();
    ClassDef(HEDRich700PadPlane,0)   
};
class HEDRichRing : public TEveLine {
private:
public:
    HEDRichRing(HRichHitSim* hit = 0);
    virtual ~HEDRichRing();
    void Print();
    ClassDef(HEDRichRing,0)       
};
class HEDRichHitPadPlane : public TEvePointSet {
private:
public:
    HEDRichHitPadPlane(HRichHitSim* hit = 0);
    virtual ~HEDRichHitPadPlane();
    void Print();
    ClassDef(HEDRichHitPadPlane,0) 
};
class HEDRichGeantPadPlane : public TEvePointSet {
private:
public:
    HEDRichGeantPadPlane(HGeantKine* kine = 0,Int_t select=0,HGeantRichDirect* geaDir=0); 
    virtual ~HEDRichGeantPadPlane();
    void Print();
    ClassDef(HEDRichGeantPadPlane,0) 
};
class HEDRichGeantMirror : public TEvePointSet {
private:
public:
    HEDRichGeantMirror(HGeantRichMirror*);
    virtual ~HEDRichGeantMirror();
    void Print();
    ClassDef(HEDRichGeantMirror,0) 
};
class HEDRichCompound : public TEveCompound {
private:
public:
    HEDRichCompound(HRichHitSim* hit = 0);
    virtual ~HEDRichCompound();
    void Print();
    void SetLineColor  (Color_t val) { ((TEveLine*)    FindChild("EDRichRing")) ->SetLineColor(val);}
    void SetLineStyle  (Style_t val) { ((TEveLine*)    FindChild("EDRichRing")) ->SetLineStyle(val);}
    void SetLineWidth  (Style_t val) { ((TEveLine*)    FindChild("EDRichRing")) ->SetLineWidth(val);}
    void SetColor(Color_t val) { 
	((TEvePointSet*)FindChild("EDRichHitPadPlane"))->SetMarkerColor(val);
        ((TEveLine*)    FindChild("EDRichHitMirror"))  ->SetLineColor(val);
    }
    void SetColorMirrorHit(Color_t val) { 
	((TEveLine*)    FindChild("EDRichHitMirror"))  ->SetLineColor(val);
    }
    void SetColorPadPlaneHit(Color_t val) { 
	((TEvePointSet*)FindChild("EDRichHitPadPlane"))->SetMarkerColor(val);
    }
    void SetMarkerStyle(Style_t val) { ((TEvePointSet*)FindChild("EDRichHitPadPlane"))->SetMarkerStyle(val);}
    void SetMarkerSize (Size_t val)  { ((TEvePointSet*)FindChild("EDRichHitPadPlane"))->SetMarkerSize(val) ;}
    void SetRnrLine    (Bool_t val)  { ((TEveLine*)    FindChild("EDRichHitMirror"))  ->SetRnrLine(val);}
    void SetRnrPoints  (Bool_t val)  { ((TEvePointSet*)FindChild("EDRichHitPadPlane"))->SetRnrSelf(val);}
    ClassDef(HEDRichCompound,0)  
};
class HEDGroup : public TEveElementList {
private:
    Int_t size;
    TEveElementList** list;
public:
    HEDGroup(const Char_t* name = "",const Char_t* title = "",Int_t n = 6, const Char_t* subname = "Sector");
    virtual ~HEDGroup();
    TEveElementList* getList(Int_t n)                     const { if(n >= 0 && n < size) {return  list[n];} else { return 0;}}
    void             AddElement(Int_t n, TEveElement* el)       { if(n >= 0 && n < size) (list[n])->AddElement(el);}
    void             DestroyElements()                          { for(Int_t n = 0; n < size; n ++) list[n]->DestroyElements(); }
    ClassDef(HEDGroup,0)  
};
class HEDGroup2D : public TEveElementList {
private:
    Int_t size1,size2;;
    TEveElementList** list1;
    TEveElementList*** list2;
public:
    HEDGroup2D(const Char_t* name = "",const Char_t* title = "",Int_t n1 = 6,Int_t n2 = 4, const Char_t* subname1 = "Sector", const Char_t* subname2 = "Module");
    virtual ~HEDGroup2D();
    TEveElementList* getList(Int_t i,Int_t j)                   const { if(i >= 0 && i < size1 && j >= 0 && j < size2) {return  list2[i][j];} else { return 0;}}
    void             AddElement(Int_t i,Int_t j,TEveElement* el)      { if(i >= 0 && i < size1 && j >= 0 && j < size2) (list2[i][j])->AddElement(el);}
    void             DestroyElements()                                { for(Int_t i = 0; i < size1; i ++) for(Int_t j = 0; j < size2; j ++) list2[i][j]->DestroyElements(); }
    ClassDef(HEDGroup2D,0)  
};
#endif  // hit object definition