#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