ROOT logo
#include "hparticlegeantevent.h"


#include "hgeomvector.h"
#include "hcategory.h"
#include "hrecevent.h"
#include "hpartialevent.h"
#include "hgeantheader.h"
#include "hades.h"
#include "hphysicsconstants.h"
#include "hcategorymanager.h"
#include "hparticletool.h"

#include "hgeantkine.h"
#include "hparticlegeant.h"
#include "hparticlegeantdecay.h"


#include <vector>
#include <map>
#include <iostream>
#include <iomanip>
#include <algorithm>

ClassImp(HParticleGeantEvent)


//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HParticleGeantEvent
//
// Simulation object keeping HGeant pointers and decays to ease
    // the geant use.
    //
    //
    //##########################################################################
    // USAGE:
    //
    //
    //  HParticleGeantEvent geantevent; // create the object out side event loop
    //
    //  ...
    //
    //  for (Int_t i=0; i < entries; i++) {
    //    Int_t nbytes =  loop.nextEvent(i);             // get next event. categories will be cleared before
    //    if(nbytes <= 0) { cout<<nbytes<<endl; break; } // last event reached
    //
    //
    //    geantevent.nextEvent(); // fill the geant event structure
    //
    //    cout<<"event "<<i<<"------------------------------------------"<<endl;
    //    cout<<"impact : "<<geantevent.getImpactParam()<<", beam E: "<< geantevent.getBeamEnergy()<< ", event plane: "<<geantevent.getEventPlane()<<endl;
    //    cout<<"mult charged prim 4pi "<<geantevent.getMultiplicity(-1,0,0,0)             // id,generation,charge,type,detbits
    //        <<" acc "<< geantevent.getMultiplicity(-1,0,0,1)
    //        <<" reco true iMDC+oMDC+META "<<geantevent.getMultiplicity(-1,0,0,2,kIsInInnerMDC|kIsInOuterMDC|kIsInMETA)
    //        <<" reco true all "<<geantevent.getMultiplicity(-1,0,0,2,0)
    //        <<endl;
    //
    //    //----------------------------------------------------
    //    // example 1:
    //    for(UInt_t j = 0; j < geantevent.getDecays().size(); j++ ){
    //        HParticleGeantDecay* decay = geantevent.getDecays()[j];
    //        if(decay->getDistFromVertex()<100 ) decay->print(); // print all decays max 10cm arround 0,0,0
    //    }
    //
    //    //----------------------------------------------------
    //    // example 2 :
    //    vector<HParticleGeantDecay*> decays;      // a decay keeps pointer to mother and daughters and the mother decay
    //    geantevent.isDecay(decays,52,-1);         // all omgegas from PLUTO (external : generation = -1) filter params :  motherid, generation, med, dist
    //    for(UInt_t j = 0; j < decays.size(); j++) {
    //       decays[j] ->print();
    //    }
    //    //----------------------------------------------------
    //    // example 3 :
    //    geantevent.isDecay(decays,18,0);          // all primary lambda decays (urqmd+PLUTO(is not decayed outside GEANT))
    //    vector<Int_t > pids;
    //    pids.push_back(14);  // proton
    //    pids.push_back(9);   // pion
    //    for(UInt_t j = 0; j < decays.size(); j++) {
    //       HParticleGeantDecay* lambda = decays[j];
    //       if(!lambda->isExternalSource()) continue;  // keep only PLUTO
    //       if(lambda->isDaughter(pids)) // both particles found
    //
    //       vector<HGeantKine*>& daughters = lambda->getDaughters();
    //       for(UInt_t l = 0; l < daughters.size(); j++){
    //           HParticleGeant* p = geantevent.getParticle(daughters[l]);
    //           if(p->isInAcceptance()){
    //             Int_t nReco p->getNRecoCand(); // number of HParticleCandSim keeping this geant track
    //             for(Int_t k=0; k < nReco; k++){
    //                 if(!p->getRecoCand(k)->isGhostTrack() && p->getRecoCand(k)->isIndDetectors(kIsInInnerMDC||kIsInOuterMDC|kIsInMETA)) { // true reco
    //
    //                 }
    //             }
    //           }
    //        }
    //
    //    }
    //
    //    //----------------------------------------------------
    //    // example 4 :
    //    vector<HParticleGeant*> particles;
    //    geantevent.isParticle(particles,2,-2,0); // all primary positrons  possible filter params : id,motherid,generation,med,dist
    //    for(UInt_t j = 0; j < particles.size(); j++) {
    //        particles[j]->print();
    //        HParticleGeantDecay* d = particles[j]->getMotherDecay(); // will even work for PLUTO decayed particles
    //        if(d) d->print();
    //    }
    //    //----------------------------------------------------
    //    // example 5 :
    //    HParticleCandSim* cand1=0;
    //    for(Int_t j = 0; j < particleCat->getEntries(); j ++){
    //        cand1 = HCategoryManager::getObject(cand1,particleCat,j);
    //        if(!cand1->isFlagBit(Particle::kIsLepton)) continue;
    //
    //        Int_t tr = cand1->getGeantTrack();
    //        HParticleGeant* p      = geantevent.getParticle(tr);
    //        HParticleGeantDecay* d = p->getMotherDecay();    // mother decay
    //        Int_t nDaughter        = d ->getNDaughters();
    //        HGeantKine* sister = 0;
    //        for(Int_t k=0; k < nDaughter; k++){              // find sister track
    //            sister = d->getDaughter(k);
    //            if(sister->getTrack() != p->getParticle()->getTrack()) break;
    //        }
    //        HParticleGeant* pSister = geantevent.getParticle(sister);
    //
    //        Int_t nReco p->getNRecoCand(); // number of HParticleCandSim keeping this geant track
    //        for(Int_t k=0; k < nReco; k++){
    //           p->getRecoCand(k)->print(); // all candidates sharing the same geant track
    //        }
    //        nReco pSister->getNRecoCand(); // number of HParticleCandSim keeping this geant track
    //        for(Int_t k=0; k < nReco; k++){
    //           p->getRecoCand(k)->print(); // all candidates sharing the same geant track
    //        }
    //    }
    //  } // end eventloop
////////////////////////////////////////////////////////////////////////////////


HParticleGeantEvent::HParticleGeantEvent()
{
    vParticles    .clear();
    vParticles    .resize(1000);
    vDecays       .clear();
    vDecays       .resize(1000);
    fBeamEnergy = 0;
    fEventPlane = 0;
    fImpactParam= 0;
    bConvertExtThermal = kTRUE;
    bCorrectInfo       = kTRUE;
}

HParticleGeantEvent::~HParticleGeantEvent()
{

    clear();
}

void  HParticleGeantEvent::clear(){

    for(UInt_t i = 0 ; i < vexternalKine.size(); i++ ) delete vexternalKine[i];
    for(UInt_t i = 0 ; i < vDecays.size();       i++ ) delete vDecays[i];
    for(UInt_t i = 0 ; i < vParticles.size();    i++ ) delete vParticles[i];
    vexternalKine.clear();
    vexternalParticles.clear();
    vDecays      .clear();
    vParticles   .clear();
    mToDaughters.clear();
    mToParticle .clear();
    feventVertex.setXYZ(0,0,0);
    fBeamEnergy = 0;
    fEventPlane = 0;
    fImpactParam= 0;

}

void HParticleGeantEvent::nextEvent()
{
    clear();

    vector<HGeantKine*> mothers;
    vector<HGeantKine*> daughters;

    HCategory* kineCat = HCategoryManager::getCategory(catGeantKine,0,"catGeantKine");

    if(!kineCat) return;


    HPartialEvent* simul =((HRecEvent*) gHades->getCurrentEvent())->getPartialEvent(catSimul);

    if(simul) {
	HGeantHeader* header = (HGeantHeader*) simul->getSubHeader();
	if(header){
	    fBeamEnergy  = header->getBeamEnergy();
	    fEventPlane  = header->getEventPlane();
	    fImpactParam = header->getImpactParameter();
	}

    } else cout<<"no catSimul"<<endl;

    //----------------------------------------------------
    // loop over kinecat and book all particles
    Int_t n = kineCat->getEntries();
    HGeantKine* kine=0;
    Bool_t vertexFound = kFALSE;
    for(Int_t j = 0 ;j < n ; j ++){
	kine = HCategoryManager::getObject(kine,kineCat,j);
	if(kine){
	    if(!vertexFound && kine->getParentTrack() == 0){
		kine->getVertex(feventVertex);
		vertexFound = kTRUE;
	    }

	    if(bCorrectInfo && kine->isBugInfo()) {
               kine->setGenerator(0,0,0);
	    }


	    UInt_t gen = HGeantKine::getMothers(kine,mothers);  // get all mothers of current object
	    // returns the actual generation of the particle

	    UInt_t ndaughters = HGeantKine::getDaughters(kine,daughters);

	    if(ndaughters > 0){
		mToDaughters[kine] = daughters;
	    }

	    if(kine->isExternalSource() && kine->getParentTrack() == 0){
		vexternalParticles.push_back(kine);
	    }

	    //----------------------------------------------------
	    // add all particles to working array
	    HParticleGeant* p =  new HParticleGeant();
	    p->setGeneration(gen);
	    p->setParticle(kine);
	    if(mothers.size() > 0) p->setMother(mothers[0]);
	    vParticles.push_back(p);

	    mToParticle[kine->getTrack()] = p;

	    //----------------------------------------------------

	} // if kine
    } // end loop kine

    //----------------------------------------------------
    // map sources of external particles
    // CAUTION : in case parentIndex of the
    // particle is not set, one can not distinguish
    // multiple source of the same type per event.
    // they will end up in the same source

    map<Long64_t,vector<HGeantKine*> > mexternalSource;
    for(UInt_t j=0; j < vexternalParticles.size(); j++){
	HGeantKine* daughter = vexternalParticles[j];

	if(daughter->getGeneratorInfo() == daughter->getGeneratorInfo1() )  continue;  // particle from PLUTO, but decay inside GEANT

	Long64_t index       = daughter->getGeneratorInfo2() + kMaxInt + kMaxInt*daughter->getGeneratorInfo2();
	if(mexternalSource.find(index) == mexternalSource.end()) {
	    // new source
	    vector<HGeantKine*> daughters;
	    daughters.push_back(daughter);
	    mexternalSource[index] = daughters;
	} else { // add daughter to existing source
	    mexternalSource[index].push_back(daughter);
	}

    }

    // for external source we can reconstruct the
    // decay including an fake HGeantKine object
    for(map <Long64_t,vector<HGeantKine*> >::iterator itex = mexternalSource.begin(); itex != mexternalSource.end(); ++itex){

	vector<HGeantKine*>& daughters = itex->second;

	HParticleGeantDecay* decay = new HParticleGeantDecay() ;

	TLorentzVector v1,v2;
	for(UInt_t j = 0; j <daughters.size(); j++){ // reconstruct momentum of mother from daughters
	    // will work for outside GEANT decayed particles
	    HParticleTool::getTLorentzVector(daughters[j],v1);
	    v2 += v1;
	}

	Int_t     sourceID  = daughters[0]->getGeneratorInfo();
	Bool_t    isThermal = daughters[0]->isThermalSource();


	HGeantKine* kine = new HGeantKine();
	if(isThermal && bConvertExtThermal) kine->setID(sourceID-500);
	else                                kine->setID(sourceID);

	kine->setGenerator(daughters[0]->getGeneratorInfo(),daughters[0]->getGeneratorInfo1(),daughters[0]->getGeneratorInfo2());
	kine->setMomentum(v2.Px(),v2.Py(),v2.Pz());
	kine->setVertex(feventVertex.X(),feventVertex.Y(),feventVertex.Z());
	kine->setMechanism(5); // decay
	kine->setMedium(-1); //


	vexternalKine.push_back(kine);

	decay->setMother(kine);
	decay->setDecayVertex(feventVertex.X(),feventVertex.Y(),feventVertex.Z());
	decay->setGeneration(-1);
	decay->setDaughters (daughters);
	decay->sortDaughters();

	vDecays.push_back(decay);
    }
    //----------------------------------------------------



    //----------------------------------------------------
    // build all decays others than external
    for(map <HGeantKine*,vector<HGeantKine*> >::iterator it = mToDaughters.begin(); it != mToDaughters.end(); ++it){
	HGeantKine* mother             = it->first;
	vector<HGeantKine*>& daughters = it->second;

	Float_t x,y,z;
	Int_t   aPar,aMed,aMech;
	mother->getVertex(x,y,z);
	mother->getCreator(aPar,aMed,aMech);
	UInt_t gen = HGeantKine::getGeneration(mother);  // get all mothers of current object

	HParticleGeantDecay* decay = new HParticleGeantDecay();
	decay->setMother(mother);
	decay->setDecayVertex(x,y,z);
	decay->setGeneration(gen) ;
	decay->setDaughters(daughters);
	decay->sortDaughters();


	vDecays.push_back(decay);
    }
    //----------------------------------------------------

    //----------------------------------------------------
    //  create decays for external particles which did
    //  not decay outside HGEANT and did not
    //  yet create (because maybe no daughter is in acceptance)
    //  a decay
    for(UInt_t i = 0; i < vexternalParticles.size(); i++){
	HGeantKine* part = vexternalParticles[i];

	if(part->getParentTrack() == 0 && part->isExternalSource() &&
	   part->getGeneratorInfo() == part->getGeneratorInfo1()  )
	{

	    HParticleGeantDecay* d = isMotherOfDecay(part);
	    if(d == 0){  // not yet in the list of decays
		HGeomVector vert;
		part->getVertex(vert);

		HParticleGeantDecay* decay = new HParticleGeantDecay();
		decay->setMother(part);
		decay->setDecayVertex(vert);
		decay->setGeneration(0);
		vDecays.push_back(decay);
	    }
	}

    }
    //----------------------------------------------------


    //----------------------------------------------------
    //  map decays for mother decays
    if(vDecays.size() > 0){
	for(UInt_t i=vDecays.size()-1; i > 0; i--){
	    HGeantKine* daughter = vDecays[i]->getMother();
	    if(daughter){
		HParticleGeantDecay* dmother = isDaughterOfDecay(daughter);
		if(dmother) vDecays[i]->setMotherDecay(dmother);

	    }
	}
    }
    //----------------------------------------------------

    //----------------------------------------------------
    //  map particles to decays
    for(UInt_t i = 0; i < vParticles.size(); i ++){
	HParticleGeantDecay* decay = isDaughterOfDecay(vParticles[i]->getParticle());
	if(decay) vParticles[i]->setMotherDecay(decay);
    }
    //----------------------------------------------------



    //----------------------------------------------------
    //  map reconstructed particles
    HCategory* candCat = HCategoryManager::getCategory(catParticleCand,2,"catParticleCand");

    if(candCat){
	n = candCat->getEntries();
	HParticleCandSim* cand = 0 ;
	for(Int_t i = 0; i < n ;i ++){
	    cand = HCategoryManager::getObject(cand,candCat,i);
	    if(cand){
		Int_t tr = cand->getGeantTrack();
		if(tr > 0){
		    map<Int_t,HParticleGeant*>::iterator it = mToParticle.find(tr);
		    if(it != mToParticle.end()) {
			HParticleGeant* gP = it->second;
			gP->addRecoCand(cand);
		    }
		}
	    }
	}
    }
    //----------------------------------------------------


}


HParticleGeantDecay* HParticleGeantEvent::isDaughterOfDecay(HGeantKine* daughter)
{
    // returns the decay for this daughter particle
    // returns 0 if no matching decay is found

    if(!daughter) return NULL;
    for(UInt_t i=0; i < vDecays.size(); i++){
	if(vDecays[i]->isDaughter(daughter)) return  vDecays[i];
    }
    return NULL;
}

HParticleGeantDecay* HParticleGeantEvent::isDaughterOfDecay(Int_t track)
{
    // returns the decay for this kine daughter particle with tracknumber track
    // returns 0 if no matching decay is found
    HGeantKine* moth = getKine(track);
    return  isDaughterOfDecay(moth);
}

HParticleGeantDecay* HParticleGeantEvent::isMotherOfDecay(HGeantKine* moth)
{
    // returns the decay for this mother particle
    // returns 0 if no matching decay is found
    if(!moth) return NULL;
    for(UInt_t i=0; i < vDecays.size(); i++){
	if(vDecays[i]->getMother() && vDecays[i]->getMother() == moth) return  vDecays[i];
    }
    return NULL;
}

HParticleGeantDecay* HParticleGeantEvent::isMotherOfDecay(Int_t track)
{
    // returns the decay for this kine mother particle with tracknumber track
    // returns 0 if no matching decay is found
    HGeantKine* moth = getKine(track);
    return  isMotherOfDecay(moth);
}

Int_t HParticleGeantEvent::isDecay(vector<HParticleGeantDecay*>& decays,
				   Int_t motherid,Int_t generation,Int_t med,Float_t dist)
{
    // fills the vector of decays matching the conditions (vector is cleared automatically
    // before filling).
    // possible filters :   motherid (ID of the mother), ignored if < 0
    //                      generation of the decay (-1 : arteficial ext, 0 : primay mother ....), ignored if < -1
    //                      med (medium where the decay was created),  ignored if < 0
    //                      dist (distance of decay from primary vertex), ignored if ==0 ,
    //                            dist > 0 all decays < dist will be selected,
    //                            dist < 0 all decays > dist will be selected

    decays.clear();
    Float_t di = TMath::Abs(dist);
    for(UInt_t i=0; i < vDecays.size(); i++){

	Float_t d=0;
        if(dist!=0) d = vDecays[i]->getDistFromVertex(&feventVertex);

	if(( (motherid < 0 ) ||  ( vDecays[i]->getMother() && vDecays[i]->getMother()->getID()     == motherid   ) ) &&
	   ( (generation< -1) || ( vDecays[i]->getGeneration()                                     == generation ) ) &&
	   ( (med      < 0 ) ||  ( vDecays[i]->getMother() && vDecays[i]->getMother()->getMedium() == med        ) ) &&
	   ( (dist    == 0 ) ||  ( ( dist > 0 ? d < di : d > di) ) )
	  )
	{
	    decays.push_back(vDecays[i]);
	}
    }

    return decays.size();
}

Int_t HParticleGeantEvent::isParticle(vector<HGeantKine*>& particles,
				      Int_t id,Int_t motherid, Int_t generation,
				      Int_t med,Float_t dist)
{
    // fills the vector of particles matching the conditions (vector is cleared automatically
    // before filling).
    // possible filters :   id (id of the particle), ignored if < 0
    //                      motherid (ID of the mother), ignored if < 0
    //                      generation of the decay (0 : primay mother ....), ignored if < 0
    //                      med (medium where the decay was created),  ignored if < 0
    //                      dist (distance of decay from primary vertex), ignored if ==0 ,
    //                            dist > 0 all decays < dist will be selected,
    //                            dist < 0 all decays > dist will be selected

    particles.clear();

    Float_t di = TMath::Abs(dist);

    for(UInt_t i=0; i < vParticles.size(); i++){

	HParticleGeant* p          = vParticles[i];
	HParticleGeantDecay* decay = p->getMotherDecay();
	HGeantKine* mother = 0;
	if(decay) mother = decay->getMother();

	Float_t d=0;
        if(dist!=0) d = p->getDistFromVertex(&feventVertex);

	if(( (id < 0 )       ||  ( p->getParticle()->getID()             == id ) ) &&
	   ( (generation< 0 )||  ( p->getGeneration() == generation            ) ) &&
	   ( (motherid < 0 ) ||  ( decay && mother && mother->getID()    == motherid ) ) &&
	   ( (med      < 0 ) ||  ( p->getParticle()->getMedium()         == med      ) ) &&
	   ( (dist    == 0 ) ||  ( ( dist > 0 ? d < di : d > di) ) )
	  )
	{
	    particles.push_back(p->getParticle());
	}
    }
    return particles.size();
}

Int_t HParticleGeantEvent::isParticle(vector<HParticleGeant*>& particles,
				      Int_t id,Int_t motherid, Int_t generation,
				      Int_t med ,Float_t dist)
{
    // fills the vector of particles matching the conditions (vector is cleared automatically
    // before filling).
    // possible filters :   id (id of the particle), ignored if < 0
    //                      motherid (ID of the mother), ignored if < 0
    //                      generation of the decay (0 : primay mother ....), ignored if < 0
    //                      med (medium where the decay was created),  ignored if < 0
    //                      dist (distance of decay from primary vertex), ignored if ==0 ,
    //                            dist > 0 all decays < dist will be selected,
    //                            dist < 0 all decays > dist will be selected

    particles.clear();

    Float_t di = TMath::Abs(dist);

    for(UInt_t i=0; i < vParticles.size(); i++){

	HParticleGeant* p          = vParticles[i];
	HParticleGeantDecay* decay = p->getMotherDecay();
	HGeantKine* mother = 0;
	if(decay) mother = decay->getMother();

	Float_t d=0;
        if(dist!=0) d = p->getDistFromVertex(&feventVertex);

	if(( (id < 0 )       ||  ( p->getParticle()->getID()             == id ) ) &&
	   ( (generation< 0 )||  ( p->getGeneration() == generation            ) ) &&
	   ( (motherid < 0 ) ||  ( decay && mother && mother->getID()    == motherid ) ) &&
	   ( (med      < 0 ) ||  ( p->getParticle()->getMedium()         == med      ) ) &&
	   ( (dist    == 0 ) ||  ( ( dist > 0 ? d < di : d > di) ) )
	  )
	{
	    particles.push_back(p);
	}
    }
    return particles.size();
}

HParticleGeant* HParticleGeantEvent::getParticle(Int_t track)
{
    // return the particle belonging to the tracknumber track
    // return 0 if no matching particle is found

    map<Int_t,HParticleGeant*>::iterator it = mToParticle.find(track);
    if(it != mToParticle.end()) return it->second;
    else return 0;
}

HParticleGeant* HParticleGeantEvent::getParticle(HGeantKine* kine)
{
    // return the particle belonging to the kine track
    // return 0 if no matching particle is found
    if(!kine) return 0;
    return  getParticle(kine->getTrack());
}

HGeantKine*   HParticleGeantEvent::getKine(Int_t track)
{
    // return the kine particle belonging to the track
    // return 0 if no matching particle is found
    HParticleGeant* p = getParticle(track);
    if(p) return p->getParticle();
    else return 0;

}

UInt_t  HParticleGeantEvent::getMultiplicity(Int_t id,Int_t generation,Int_t charge,UInt_t type,UInt_t detbits)
{
    // get particle multiplity
    // id    :   id      < 0  -> all IDs,  (default)
    //           id      >= 0 -> particles of the given id
    // gen   :   gen     < 0  -> all generations
    //           gen     = 0  -> primaries (default)
    // charge  : charge  = 0  -> all charged particles (default)
    //           charge  = 1  -> all positive charged particles
    //           charge  =-1  -> all negative charged particles
    //           charge  =-2  -> all particles
    // type  :   type    = 0  -> 4pi
    //           type    = 1  -> acceptance (default)
    //           type    = 2  -> reconstructed (requires kIsUsed + !isGhostTrack() + isInInnerMDC|isInOuterMDC|isInMETA)
    // detbits : detbits = 0  -> ignored
    //           detbits = kIsInInnerMDC|kIsInOuterMDC|kIsInMETA  default

    UInt_t mult = 0;
    for(UInt_t i=0; i < vParticles.size(); i++){

	HParticleGeant* p          = vParticles[i];

	Bool_t acc  = p->isInAcceptance();
	Bool_t reco = (p->getNTrueReco(kTRUE,detbits) > 0) ? kTRUE : kFALSE;

	Int_t chrg  = HPhysicsConstants::charge(p->getParticle()->getID());


	if(( (id         <  0 ) ||  ( p->getParticle()->getID()  == id         ) ) &&
	   ( (generation <  0 ) ||  ( p->getGeneration()         == generation ) ) &&
           ( (type       == 0 ) ||  (type   == 1 && acc)     || (type   == 2 && reco)     ) &&
           ( (charge     ==-2 ) ||  (charge == 0 && chrg!=0) || (charge == 1 && chrg > 0) || (charge ==-1 && chrg < 0)  )
	  )
	{
	    mult++;
	}
    }
    return mult;



}

 hparticlegeantevent.cc:1
 hparticlegeantevent.cc:2
 hparticlegeantevent.cc:3
 hparticlegeantevent.cc:4
 hparticlegeantevent.cc:5
 hparticlegeantevent.cc:6
 hparticlegeantevent.cc:7
 hparticlegeantevent.cc:8
 hparticlegeantevent.cc:9
 hparticlegeantevent.cc:10
 hparticlegeantevent.cc:11
 hparticlegeantevent.cc:12
 hparticlegeantevent.cc:13
 hparticlegeantevent.cc:14
 hparticlegeantevent.cc:15
 hparticlegeantevent.cc:16
 hparticlegeantevent.cc:17
 hparticlegeantevent.cc:18
 hparticlegeantevent.cc:19
 hparticlegeantevent.cc:20
 hparticlegeantevent.cc:21
 hparticlegeantevent.cc:22
 hparticlegeantevent.cc:23
 hparticlegeantevent.cc:24
 hparticlegeantevent.cc:25
 hparticlegeantevent.cc:26
 hparticlegeantevent.cc:27
 hparticlegeantevent.cc:28
 hparticlegeantevent.cc:29
 hparticlegeantevent.cc:30
 hparticlegeantevent.cc:31
 hparticlegeantevent.cc:32
 hparticlegeantevent.cc:33
 hparticlegeantevent.cc:34
 hparticlegeantevent.cc:35
 hparticlegeantevent.cc:36
 hparticlegeantevent.cc:37
 hparticlegeantevent.cc:38
 hparticlegeantevent.cc:39
 hparticlegeantevent.cc:40
 hparticlegeantevent.cc:41
 hparticlegeantevent.cc:42
 hparticlegeantevent.cc:43
 hparticlegeantevent.cc:44
 hparticlegeantevent.cc:45
 hparticlegeantevent.cc:46
 hparticlegeantevent.cc:47
 hparticlegeantevent.cc:48
 hparticlegeantevent.cc:49
 hparticlegeantevent.cc:50
 hparticlegeantevent.cc:51
 hparticlegeantevent.cc:52
 hparticlegeantevent.cc:53
 hparticlegeantevent.cc:54
 hparticlegeantevent.cc:55
 hparticlegeantevent.cc:56
 hparticlegeantevent.cc:57
 hparticlegeantevent.cc:58
 hparticlegeantevent.cc:59
 hparticlegeantevent.cc:60
 hparticlegeantevent.cc:61
 hparticlegeantevent.cc:62
 hparticlegeantevent.cc:63
 hparticlegeantevent.cc:64
 hparticlegeantevent.cc:65
 hparticlegeantevent.cc:66
 hparticlegeantevent.cc:67
 hparticlegeantevent.cc:68
 hparticlegeantevent.cc:69
 hparticlegeantevent.cc:70
 hparticlegeantevent.cc:71
 hparticlegeantevent.cc:72
 hparticlegeantevent.cc:73
 hparticlegeantevent.cc:74
 hparticlegeantevent.cc:75
 hparticlegeantevent.cc:76
 hparticlegeantevent.cc:77
 hparticlegeantevent.cc:78
 hparticlegeantevent.cc:79
 hparticlegeantevent.cc:80
 hparticlegeantevent.cc:81
 hparticlegeantevent.cc:82
 hparticlegeantevent.cc:83
 hparticlegeantevent.cc:84
 hparticlegeantevent.cc:85
 hparticlegeantevent.cc:86
 hparticlegeantevent.cc:87
 hparticlegeantevent.cc:88
 hparticlegeantevent.cc:89
 hparticlegeantevent.cc:90
 hparticlegeantevent.cc:91
 hparticlegeantevent.cc:92
 hparticlegeantevent.cc:93
 hparticlegeantevent.cc:94
 hparticlegeantevent.cc:95
 hparticlegeantevent.cc:96
 hparticlegeantevent.cc:97
 hparticlegeantevent.cc:98
 hparticlegeantevent.cc:99
 hparticlegeantevent.cc:100
 hparticlegeantevent.cc:101
 hparticlegeantevent.cc:102
 hparticlegeantevent.cc:103
 hparticlegeantevent.cc:104
 hparticlegeantevent.cc:105
 hparticlegeantevent.cc:106
 hparticlegeantevent.cc:107
 hparticlegeantevent.cc:108
 hparticlegeantevent.cc:109
 hparticlegeantevent.cc:110
 hparticlegeantevent.cc:111
 hparticlegeantevent.cc:112
 hparticlegeantevent.cc:113
 hparticlegeantevent.cc:114
 hparticlegeantevent.cc:115
 hparticlegeantevent.cc:116
 hparticlegeantevent.cc:117
 hparticlegeantevent.cc:118
 hparticlegeantevent.cc:119
 hparticlegeantevent.cc:120
 hparticlegeantevent.cc:121
 hparticlegeantevent.cc:122
 hparticlegeantevent.cc:123
 hparticlegeantevent.cc:124
 hparticlegeantevent.cc:125
 hparticlegeantevent.cc:126
 hparticlegeantevent.cc:127
 hparticlegeantevent.cc:128
 hparticlegeantevent.cc:129
 hparticlegeantevent.cc:130
 hparticlegeantevent.cc:131
 hparticlegeantevent.cc:132
 hparticlegeantevent.cc:133
 hparticlegeantevent.cc:134
 hparticlegeantevent.cc:135
 hparticlegeantevent.cc:136
 hparticlegeantevent.cc:137
 hparticlegeantevent.cc:138
 hparticlegeantevent.cc:139
 hparticlegeantevent.cc:140
 hparticlegeantevent.cc:141
 hparticlegeantevent.cc:142
 hparticlegeantevent.cc:143
 hparticlegeantevent.cc:144
 hparticlegeantevent.cc:145
 hparticlegeantevent.cc:146
 hparticlegeantevent.cc:147
 hparticlegeantevent.cc:148
 hparticlegeantevent.cc:149
 hparticlegeantevent.cc:150
 hparticlegeantevent.cc:151
 hparticlegeantevent.cc:152
 hparticlegeantevent.cc:153
 hparticlegeantevent.cc:154
 hparticlegeantevent.cc:155
 hparticlegeantevent.cc:156
 hparticlegeantevent.cc:157
 hparticlegeantevent.cc:158
 hparticlegeantevent.cc:159
 hparticlegeantevent.cc:160
 hparticlegeantevent.cc:161
 hparticlegeantevent.cc:162
 hparticlegeantevent.cc:163
 hparticlegeantevent.cc:164
 hparticlegeantevent.cc:165
 hparticlegeantevent.cc:166
 hparticlegeantevent.cc:167
 hparticlegeantevent.cc:168
 hparticlegeantevent.cc:169
 hparticlegeantevent.cc:170
 hparticlegeantevent.cc:171
 hparticlegeantevent.cc:172
 hparticlegeantevent.cc:173
 hparticlegeantevent.cc:174
 hparticlegeantevent.cc:175
 hparticlegeantevent.cc:176
 hparticlegeantevent.cc:177
 hparticlegeantevent.cc:178
 hparticlegeantevent.cc:179
 hparticlegeantevent.cc:180
 hparticlegeantevent.cc:181
 hparticlegeantevent.cc:182
 hparticlegeantevent.cc:183
 hparticlegeantevent.cc:184
 hparticlegeantevent.cc:185
 hparticlegeantevent.cc:186
 hparticlegeantevent.cc:187
 hparticlegeantevent.cc:188
 hparticlegeantevent.cc:189
 hparticlegeantevent.cc:190
 hparticlegeantevent.cc:191
 hparticlegeantevent.cc:192
 hparticlegeantevent.cc:193
 hparticlegeantevent.cc:194
 hparticlegeantevent.cc:195
 hparticlegeantevent.cc:196
 hparticlegeantevent.cc:197
 hparticlegeantevent.cc:198
 hparticlegeantevent.cc:199
 hparticlegeantevent.cc:200
 hparticlegeantevent.cc:201
 hparticlegeantevent.cc:202
 hparticlegeantevent.cc:203
 hparticlegeantevent.cc:204
 hparticlegeantevent.cc:205
 hparticlegeantevent.cc:206
 hparticlegeantevent.cc:207
 hparticlegeantevent.cc:208
 hparticlegeantevent.cc:209
 hparticlegeantevent.cc:210
 hparticlegeantevent.cc:211
 hparticlegeantevent.cc:212
 hparticlegeantevent.cc:213
 hparticlegeantevent.cc:214
 hparticlegeantevent.cc:215
 hparticlegeantevent.cc:216
 hparticlegeantevent.cc:217
 hparticlegeantevent.cc:218
 hparticlegeantevent.cc:219
 hparticlegeantevent.cc:220
 hparticlegeantevent.cc:221
 hparticlegeantevent.cc:222
 hparticlegeantevent.cc:223
 hparticlegeantevent.cc:224
 hparticlegeantevent.cc:225
 hparticlegeantevent.cc:226
 hparticlegeantevent.cc:227
 hparticlegeantevent.cc:228
 hparticlegeantevent.cc:229
 hparticlegeantevent.cc:230
 hparticlegeantevent.cc:231
 hparticlegeantevent.cc:232
 hparticlegeantevent.cc:233
 hparticlegeantevent.cc:234
 hparticlegeantevent.cc:235
 hparticlegeantevent.cc:236
 hparticlegeantevent.cc:237
 hparticlegeantevent.cc:238
 hparticlegeantevent.cc:239
 hparticlegeantevent.cc:240
 hparticlegeantevent.cc:241
 hparticlegeantevent.cc:242
 hparticlegeantevent.cc:243
 hparticlegeantevent.cc:244
 hparticlegeantevent.cc:245
 hparticlegeantevent.cc:246
 hparticlegeantevent.cc:247
 hparticlegeantevent.cc:248
 hparticlegeantevent.cc:249
 hparticlegeantevent.cc:250
 hparticlegeantevent.cc:251
 hparticlegeantevent.cc:252
 hparticlegeantevent.cc:253
 hparticlegeantevent.cc:254
 hparticlegeantevent.cc:255
 hparticlegeantevent.cc:256
 hparticlegeantevent.cc:257
 hparticlegeantevent.cc:258
 hparticlegeantevent.cc:259
 hparticlegeantevent.cc:260
 hparticlegeantevent.cc:261
 hparticlegeantevent.cc:262
 hparticlegeantevent.cc:263
 hparticlegeantevent.cc:264
 hparticlegeantevent.cc:265
 hparticlegeantevent.cc:266
 hparticlegeantevent.cc:267
 hparticlegeantevent.cc:268
 hparticlegeantevent.cc:269
 hparticlegeantevent.cc:270
 hparticlegeantevent.cc:271
 hparticlegeantevent.cc:272
 hparticlegeantevent.cc:273
 hparticlegeantevent.cc:274
 hparticlegeantevent.cc:275
 hparticlegeantevent.cc:276
 hparticlegeantevent.cc:277
 hparticlegeantevent.cc:278
 hparticlegeantevent.cc:279
 hparticlegeantevent.cc:280
 hparticlegeantevent.cc:281
 hparticlegeantevent.cc:282
 hparticlegeantevent.cc:283
 hparticlegeantevent.cc:284
 hparticlegeantevent.cc:285
 hparticlegeantevent.cc:286
 hparticlegeantevent.cc:287
 hparticlegeantevent.cc:288
 hparticlegeantevent.cc:289
 hparticlegeantevent.cc:290
 hparticlegeantevent.cc:291
 hparticlegeantevent.cc:292
 hparticlegeantevent.cc:293
 hparticlegeantevent.cc:294
 hparticlegeantevent.cc:295
 hparticlegeantevent.cc:296
 hparticlegeantevent.cc:297
 hparticlegeantevent.cc:298
 hparticlegeantevent.cc:299
 hparticlegeantevent.cc:300
 hparticlegeantevent.cc:301
 hparticlegeantevent.cc:302
 hparticlegeantevent.cc:303
 hparticlegeantevent.cc:304
 hparticlegeantevent.cc:305
 hparticlegeantevent.cc:306
 hparticlegeantevent.cc:307
 hparticlegeantevent.cc:308
 hparticlegeantevent.cc:309
 hparticlegeantevent.cc:310
 hparticlegeantevent.cc:311
 hparticlegeantevent.cc:312
 hparticlegeantevent.cc:313
 hparticlegeantevent.cc:314
 hparticlegeantevent.cc:315
 hparticlegeantevent.cc:316
 hparticlegeantevent.cc:317
 hparticlegeantevent.cc:318
 hparticlegeantevent.cc:319
 hparticlegeantevent.cc:320
 hparticlegeantevent.cc:321
 hparticlegeantevent.cc:322
 hparticlegeantevent.cc:323
 hparticlegeantevent.cc:324
 hparticlegeantevent.cc:325
 hparticlegeantevent.cc:326
 hparticlegeantevent.cc:327
 hparticlegeantevent.cc:328
 hparticlegeantevent.cc:329
 hparticlegeantevent.cc:330
 hparticlegeantevent.cc:331
 hparticlegeantevent.cc:332
 hparticlegeantevent.cc:333
 hparticlegeantevent.cc:334
 hparticlegeantevent.cc:335
 hparticlegeantevent.cc:336
 hparticlegeantevent.cc:337
 hparticlegeantevent.cc:338
 hparticlegeantevent.cc:339
 hparticlegeantevent.cc:340
 hparticlegeantevent.cc:341
 hparticlegeantevent.cc:342
 hparticlegeantevent.cc:343
 hparticlegeantevent.cc:344
 hparticlegeantevent.cc:345
 hparticlegeantevent.cc:346
 hparticlegeantevent.cc:347
 hparticlegeantevent.cc:348
 hparticlegeantevent.cc:349
 hparticlegeantevent.cc:350
 hparticlegeantevent.cc:351
 hparticlegeantevent.cc:352
 hparticlegeantevent.cc:353
 hparticlegeantevent.cc:354
 hparticlegeantevent.cc:355
 hparticlegeantevent.cc:356
 hparticlegeantevent.cc:357
 hparticlegeantevent.cc:358
 hparticlegeantevent.cc:359
 hparticlegeantevent.cc:360
 hparticlegeantevent.cc:361
 hparticlegeantevent.cc:362
 hparticlegeantevent.cc:363
 hparticlegeantevent.cc:364
 hparticlegeantevent.cc:365
 hparticlegeantevent.cc:366
 hparticlegeantevent.cc:367
 hparticlegeantevent.cc:368
 hparticlegeantevent.cc:369
 hparticlegeantevent.cc:370
 hparticlegeantevent.cc:371
 hparticlegeantevent.cc:372
 hparticlegeantevent.cc:373
 hparticlegeantevent.cc:374
 hparticlegeantevent.cc:375
 hparticlegeantevent.cc:376
 hparticlegeantevent.cc:377
 hparticlegeantevent.cc:378
 hparticlegeantevent.cc:379
 hparticlegeantevent.cc:380
 hparticlegeantevent.cc:381
 hparticlegeantevent.cc:382
 hparticlegeantevent.cc:383
 hparticlegeantevent.cc:384
 hparticlegeantevent.cc:385
 hparticlegeantevent.cc:386
 hparticlegeantevent.cc:387
 hparticlegeantevent.cc:388
 hparticlegeantevent.cc:389
 hparticlegeantevent.cc:390
 hparticlegeantevent.cc:391
 hparticlegeantevent.cc:392
 hparticlegeantevent.cc:393
 hparticlegeantevent.cc:394
 hparticlegeantevent.cc:395
 hparticlegeantevent.cc:396
 hparticlegeantevent.cc:397
 hparticlegeantevent.cc:398
 hparticlegeantevent.cc:399
 hparticlegeantevent.cc:400
 hparticlegeantevent.cc:401
 hparticlegeantevent.cc:402
 hparticlegeantevent.cc:403
 hparticlegeantevent.cc:404
 hparticlegeantevent.cc:405
 hparticlegeantevent.cc:406
 hparticlegeantevent.cc:407
 hparticlegeantevent.cc:408
 hparticlegeantevent.cc:409
 hparticlegeantevent.cc:410
 hparticlegeantevent.cc:411
 hparticlegeantevent.cc:412
 hparticlegeantevent.cc:413
 hparticlegeantevent.cc:414
 hparticlegeantevent.cc:415
 hparticlegeantevent.cc:416
 hparticlegeantevent.cc:417
 hparticlegeantevent.cc:418
 hparticlegeantevent.cc:419
 hparticlegeantevent.cc:420
 hparticlegeantevent.cc:421
 hparticlegeantevent.cc:422
 hparticlegeantevent.cc:423
 hparticlegeantevent.cc:424
 hparticlegeantevent.cc:425
 hparticlegeantevent.cc:426
 hparticlegeantevent.cc:427
 hparticlegeantevent.cc:428
 hparticlegeantevent.cc:429
 hparticlegeantevent.cc:430
 hparticlegeantevent.cc:431
 hparticlegeantevent.cc:432
 hparticlegeantevent.cc:433
 hparticlegeantevent.cc:434
 hparticlegeantevent.cc:435
 hparticlegeantevent.cc:436
 hparticlegeantevent.cc:437
 hparticlegeantevent.cc:438
 hparticlegeantevent.cc:439
 hparticlegeantevent.cc:440
 hparticlegeantevent.cc:441
 hparticlegeantevent.cc:442
 hparticlegeantevent.cc:443
 hparticlegeantevent.cc:444
 hparticlegeantevent.cc:445
 hparticlegeantevent.cc:446
 hparticlegeantevent.cc:447
 hparticlegeantevent.cc:448
 hparticlegeantevent.cc:449
 hparticlegeantevent.cc:450
 hparticlegeantevent.cc:451
 hparticlegeantevent.cc:452
 hparticlegeantevent.cc:453
 hparticlegeantevent.cc:454
 hparticlegeantevent.cc:455
 hparticlegeantevent.cc:456
 hparticlegeantevent.cc:457
 hparticlegeantevent.cc:458
 hparticlegeantevent.cc:459
 hparticlegeantevent.cc:460
 hparticlegeantevent.cc:461
 hparticlegeantevent.cc:462
 hparticlegeantevent.cc:463
 hparticlegeantevent.cc:464
 hparticlegeantevent.cc:465
 hparticlegeantevent.cc:466
 hparticlegeantevent.cc:467
 hparticlegeantevent.cc:468
 hparticlegeantevent.cc:469
 hparticlegeantevent.cc:470
 hparticlegeantevent.cc:471
 hparticlegeantevent.cc:472
 hparticlegeantevent.cc:473
 hparticlegeantevent.cc:474
 hparticlegeantevent.cc:475
 hparticlegeantevent.cc:476
 hparticlegeantevent.cc:477
 hparticlegeantevent.cc:478
 hparticlegeantevent.cc:479
 hparticlegeantevent.cc:480
 hparticlegeantevent.cc:481
 hparticlegeantevent.cc:482
 hparticlegeantevent.cc:483
 hparticlegeantevent.cc:484
 hparticlegeantevent.cc:485
 hparticlegeantevent.cc:486
 hparticlegeantevent.cc:487
 hparticlegeantevent.cc:488
 hparticlegeantevent.cc:489
 hparticlegeantevent.cc:490
 hparticlegeantevent.cc:491
 hparticlegeantevent.cc:492
 hparticlegeantevent.cc:493
 hparticlegeantevent.cc:494
 hparticlegeantevent.cc:495
 hparticlegeantevent.cc:496
 hparticlegeantevent.cc:497
 hparticlegeantevent.cc:498
 hparticlegeantevent.cc:499
 hparticlegeantevent.cc:500
 hparticlegeantevent.cc:501
 hparticlegeantevent.cc:502
 hparticlegeantevent.cc:503
 hparticlegeantevent.cc:504
 hparticlegeantevent.cc:505
 hparticlegeantevent.cc:506
 hparticlegeantevent.cc:507
 hparticlegeantevent.cc:508
 hparticlegeantevent.cc:509
 hparticlegeantevent.cc:510
 hparticlegeantevent.cc:511
 hparticlegeantevent.cc:512
 hparticlegeantevent.cc:513
 hparticlegeantevent.cc:514
 hparticlegeantevent.cc:515
 hparticlegeantevent.cc:516
 hparticlegeantevent.cc:517
 hparticlegeantevent.cc:518
 hparticlegeantevent.cc:519
 hparticlegeantevent.cc:520
 hparticlegeantevent.cc:521
 hparticlegeantevent.cc:522
 hparticlegeantevent.cc:523
 hparticlegeantevent.cc:524
 hparticlegeantevent.cc:525
 hparticlegeantevent.cc:526
 hparticlegeantevent.cc:527
 hparticlegeantevent.cc:528
 hparticlegeantevent.cc:529
 hparticlegeantevent.cc:530
 hparticlegeantevent.cc:531
 hparticlegeantevent.cc:532
 hparticlegeantevent.cc:533
 hparticlegeantevent.cc:534
 hparticlegeantevent.cc:535
 hparticlegeantevent.cc:536
 hparticlegeantevent.cc:537
 hparticlegeantevent.cc:538
 hparticlegeantevent.cc:539
 hparticlegeantevent.cc:540
 hparticlegeantevent.cc:541
 hparticlegeantevent.cc:542
 hparticlegeantevent.cc:543
 hparticlegeantevent.cc:544
 hparticlegeantevent.cc:545
 hparticlegeantevent.cc:546
 hparticlegeantevent.cc:547
 hparticlegeantevent.cc:548
 hparticlegeantevent.cc:549
 hparticlegeantevent.cc:550
 hparticlegeantevent.cc:551
 hparticlegeantevent.cc:552
 hparticlegeantevent.cc:553
 hparticlegeantevent.cc:554
 hparticlegeantevent.cc:555
 hparticlegeantevent.cc:556
 hparticlegeantevent.cc:557
 hparticlegeantevent.cc:558
 hparticlegeantevent.cc:559
 hparticlegeantevent.cc:560
 hparticlegeantevent.cc:561
 hparticlegeantevent.cc:562
 hparticlegeantevent.cc:563
 hparticlegeantevent.cc:564
 hparticlegeantevent.cc:565
 hparticlegeantevent.cc:566
 hparticlegeantevent.cc:567
 hparticlegeantevent.cc:568
 hparticlegeantevent.cc:569
 hparticlegeantevent.cc:570
 hparticlegeantevent.cc:571
 hparticlegeantevent.cc:572
 hparticlegeantevent.cc:573
 hparticlegeantevent.cc:574
 hparticlegeantevent.cc:575
 hparticlegeantevent.cc:576
 hparticlegeantevent.cc:577
 hparticlegeantevent.cc:578
 hparticlegeantevent.cc:579
 hparticlegeantevent.cc:580
 hparticlegeantevent.cc:581
 hparticlegeantevent.cc:582
 hparticlegeantevent.cc:583
 hparticlegeantevent.cc:584
 hparticlegeantevent.cc:585
 hparticlegeantevent.cc:586
 hparticlegeantevent.cc:587
 hparticlegeantevent.cc:588
 hparticlegeantevent.cc:589
 hparticlegeantevent.cc:590
 hparticlegeantevent.cc:591
 hparticlegeantevent.cc:592
 hparticlegeantevent.cc:593
 hparticlegeantevent.cc:594
 hparticlegeantevent.cc:595
 hparticlegeantevent.cc:596
 hparticlegeantevent.cc:597
 hparticlegeantevent.cc:598
 hparticlegeantevent.cc:599
 hparticlegeantevent.cc:600
 hparticlegeantevent.cc:601
 hparticlegeantevent.cc:602
 hparticlegeantevent.cc:603
 hparticlegeantevent.cc:604
 hparticlegeantevent.cc:605
 hparticlegeantevent.cc:606
 hparticlegeantevent.cc:607
 hparticlegeantevent.cc:608
 hparticlegeantevent.cc:609
 hparticlegeantevent.cc:610
 hparticlegeantevent.cc:611
 hparticlegeantevent.cc:612
 hparticlegeantevent.cc:613
 hparticlegeantevent.cc:614
 hparticlegeantevent.cc:615
 hparticlegeantevent.cc:616
 hparticlegeantevent.cc:617
 hparticlegeantevent.cc:618
 hparticlegeantevent.cc:619
 hparticlegeantevent.cc:620
 hparticlegeantevent.cc:621
 hparticlegeantevent.cc:622
 hparticlegeantevent.cc:623
 hparticlegeantevent.cc:624
 hparticlegeantevent.cc:625
 hparticlegeantevent.cc:626
 hparticlegeantevent.cc:627
 hparticlegeantevent.cc:628
 hparticlegeantevent.cc:629
 hparticlegeantevent.cc:630
 hparticlegeantevent.cc:631
 hparticlegeantevent.cc:632
 hparticlegeantevent.cc:633
 hparticlegeantevent.cc:634
 hparticlegeantevent.cc:635
 hparticlegeantevent.cc:636
 hparticlegeantevent.cc:637
 hparticlegeantevent.cc:638
 hparticlegeantevent.cc:639
 hparticlegeantevent.cc:640
 hparticlegeantevent.cc:641
 hparticlegeantevent.cc:642
 hparticlegeantevent.cc:643
 hparticlegeantevent.cc:644