22 #include <G4ParticleTable.hh>
23 #include <EVENT/MCParticle.h>
24 #include <EVENT/LCCollection.h>
39 inline int GET_ENTRY(
const map<EVENT::MCParticle*,int>& mcparts, EVENT::MCParticle* part) {
40 map<EVENT::MCParticle*,int>::const_iterator ip=mcparts.find(part);
41 if ( ip == mcparts.end() ) {
42 throw runtime_error(
"Unknown particle identifier look-up!");
50 LCIOEventReader::LCIOEventReader(
const string& nam)
64 vector<Particle*>& particles)
67 map<EVENT::MCParticle*,int> mcparts;
68 vector<EVENT::MCParticle*> mcpcoll;
74 int NHEP = primaries->getNumberOfElements();
78 mcpcoll.resize(NHEP,0);
79 for(
int i=0; i<NHEP; ++i ) {
80 EVENT::MCParticle* p =
dynamic_cast<EVENT::MCParticle*
>(primaries->getElementAt(i));
86 for(
int i=0; i<NHEP; ++i ) {
87 EVENT::MCParticle* mcp = mcpcoll[i];
89 const double *mom = mcp->getMomentum();
90 const double *vsx = mcp->getVertex();
91 const double *vex = mcp->getEndpoint();
92 const float *spin = mcp->getSpin();
93 const int *color = mcp->getColorFlow();
94 const int pdg = mcp->getPDG();
96 p->
charge = int(mcp->getCharge()*3.0);
97 p->
psx = mom[0]*CLHEP::GeV;
98 p->
psy = mom[1]*CLHEP::GeV;
99 p->
psz = mom[2]*CLHEP::GeV;
100 p->
time = mcp->getTime()*CLHEP::ns;
102 p->
vsx = vsx[0]*CLHEP::mm;
103 p->
vsy = vsx[1]*CLHEP::mm;
104 p->
vsz = vsx[2]*CLHEP::mm;
105 p->
vex = vex[0]*CLHEP::mm;
106 p->
vey = vex[1]*CLHEP::mm;
107 p->
vez = vex[2]*CLHEP::mm;
109 p->
spin[0] = spin[0];
110 p->
spin[1] = spin[1];
111 p->
spin[2] = spin[2];
114 p->
mass = mcp->getMass()*CLHEP::GeV;
115 const EVENT::MCParticleVec &par = mcp->getParents(), &dau=mcp->getDaughters();
116 for(
int num=dau.size(),k=0; k<num; ++k)
117 p->
daughters.insert(GET_ENTRY(mcparts,dau[k]));
118 for(
int num=par.size(),k=0; k<num; ++k)
119 p->
parents.insert(GET_ENTRY(mcparts,par[k]));
122 int genStatus = mcp->getGeneratorStatus();
138 if ( p->
parents.size() == 0 ) {
141 vertices.emplace_back( vtx );
147 vtx->
out.insert(p->
id) ;
158 particles.emplace_back(p);