#ifndef __HPARTICLEGEANTEVENT_H__
#define __HPARTICLEGEANTEVENT_H__
#include "hgeomvector.h"
#include "hparticledef.h"
#include "TObject.h"
#include <vector>
#include <map>
using namespace std;
using namespace Particle;
class HParticleGeant;
class HParticleGeantDecay;
class HGeantKine;
class HParticleGeantEvent : public TObject {
private:
    map<HGeantKine*, vector<HGeantKine*> >  mToDaughters;        
    map<Int_t, HParticleGeant* >            mToParticle;         
    vector <HParticleGeantDecay*>           vDecays;             
    vector<HGeantKine*>                     vexternalParticles;  
    vector<HGeantKine*>                     vexternalKine;       
    vector<HParticleGeant*>                 vParticles;          
    HGeomVector   feventVertex;       
    Float_t       fBeamEnergy;        
    Float_t       fEventPlane;        
    Float_t       fImpactParam;       
    Bool_t        bConvertExtThermal; 
    Bool_t        bCorrectInfo;       
    void          clear();
public:
    HParticleGeantEvent();
    ~HParticleGeantEvent();
    void                           setConvertExtThermal(Bool_t convert) { bConvertExtThermal = convert; }
    void                           setCorrectGenInfo   (Bool_t cor)     { bCorrectInfo       = cor; }
    vector<HGeantKine*>&           getExternalParticles() { return vexternalParticles;}
    HGeomVector&                   getEventVertex()       { return feventVertex; }
    vector<HParticleGeantDecay*>&  getDecays()            { return vDecays;}
    vector<HParticleGeant*>&       getParticles()         { return vParticles;}
    Float_t                        getBeamEnergy()        { return fBeamEnergy;}
    Float_t                        getEventPlane()        { return fEventPlane;}
    Float_t                        getImpactParam()       { return fImpactParam;}
    void                           nextEvent();
    HParticleGeantDecay*           isMotherOfDecay  (Int_t track);
    HParticleGeantDecay*           isMotherOfDecay  (HGeantKine* moth);
    HParticleGeantDecay*           isDaughterOfDecay(HGeantKine* daughter);
    HParticleGeantDecay*           isDaughterOfDecay(Int_t track);
    Int_t                          isDecay   (vector<HParticleGeantDecay*>& decays,Int_t motherid = -2, Int_t generation = -2,Int_t med = -2,Float_t dist=0);
    Int_t                          isParticle(vector<HGeantKine*>&     particles,Int_t id  = -2 ,Int_t motherid = -2, Int_t generation = -2, Int_t med = -2 ,Float_t dist   = 0);
    Int_t                          isParticle(vector<HParticleGeant*>& particles,Int_t id  = -2 ,Int_t motherid = -2, Int_t generation = -2, Int_t med = -2 ,Float_t dist   = 0);
    HParticleGeant*                getParticle(Int_t track);
    HParticleGeant*                getParticle(HGeantKine*);
    HGeantKine*                    getKine    (Int_t track);
    UInt_t                         getMultiplicity(Int_t id=-10,Int_t generation=0,Int_t charge=0,UInt_t type=1,UInt_t detbits=kIsInInnerMDC|kIsInOuterMDC|kIsInMETA);
    ClassDef(HParticleGeantEvent,0)
};
#endif