diff --git a/DDG4/include/DDG4/Geant4Particle.h b/DDG4/include/DDG4/Geant4Particle.h index fe5aaef968b83ac32520283da6fa3b0295c93c2f..7b3fc57644ddf8959037a757641c33ef8497d6d2 100644 --- a/DDG4/include/DDG4/Geant4Particle.h +++ b/DDG4/include/DDG4/Geant4Particle.h @@ -65,15 +65,19 @@ namespace dd4hep { G4PARTICLE_KEEP_ALWAYS = 1<<10, G4PARTICLE_FORCE_KILL = 1<<11, - // Generator status for a given particles: bit 0...3 come from LCIO, rest is internal + // Generator status for a given particles: bit 0...4, agreed by many formats (HepMC, LCIO, ....): G4PARTICLE_GEN_EMPTY = 1<<0, // Empty line G4PARTICLE_GEN_STABLE = 1<<1, // undecayed particle, stable in the generator G4PARTICLE_GEN_DECAYED = 1<<2, // particle decayed in the generator G4PARTICLE_GEN_DOCUMENTATION = 1<<3, // documentation line + G4PARTICLE_GEN_BEAM = 1<<4, // beam particle + + G4PARTICLE_GEN_OTHER = 1<<9, // any other generator status G4PARTICLE_GEN_GENERATOR = // Particle comes from generator ( G4PARTICLE_GEN_EMPTY+G4PARTICLE_GEN_STABLE+ - G4PARTICLE_GEN_DECAYED+G4PARTICLE_GEN_DOCUMENTATION ), + G4PARTICLE_GEN_DECAYED+G4PARTICLE_GEN_DOCUMENTATION+ + G4PARTICLE_GEN_BEAM+G4PARTICLE_GEN_OTHER), G4PARTICLE_GEN_STATUS = 0x3FF, // Mask for generator status (bit 0...9) // Simulation status of a given particle diff --git a/DDG4/lcio/Geant4Output2LCIO.cpp b/DDG4/lcio/Geant4Output2LCIO.cpp index 1f5dfba96d15e9c4650e2eb611c2c679e6703d93..f12de2cfc31f5520f649c956b52ea4eb82eb7183 100644 --- a/DDG4/lcio/Geant4Output2LCIO.cpp +++ b/DDG4/lcio/Geant4Output2LCIO.cpp @@ -240,9 +240,11 @@ lcio::LCCollectionVec* Geant4Output2LCIO::saveParticles(Geant4ParticleMap* parti // Set generator status q->setGeneratorStatus(0); - if ( mask.isSet(G4PARTICLE_GEN_STABLE) ) q->setGeneratorStatus(1); - else if ( mask.isSet(G4PARTICLE_GEN_DECAYED) ) q->setGeneratorStatus(2); + if ( mask.isSet(G4PARTICLE_GEN_STABLE) ) q->setGeneratorStatus(1); + else if ( mask.isSet(G4PARTICLE_GEN_DECAYED) ) q->setGeneratorStatus(2); else if ( mask.isSet(G4PARTICLE_GEN_DOCUMENTATION) ) q->setGeneratorStatus(3); + else if ( mask.isSet(G4PARTICLE_GEN_BEAM) ) q->setGeneratorStatus(4); + else if ( mask.isSet(G4PARTICLE_GEN_OTHER) ) q->setGeneratorStatus(9); // std::cout << " ********** mcp genstatus : " << q->getGeneratorStatus() << std::endl ; // Set simulation status diff --git a/DDG4/lcio/LCIOEventReader.cpp b/DDG4/lcio/LCIOEventReader.cpp index 582f2cc8aa3ebb05b3bd5e3b569335ce690c0f51..412ecc3549e58129e1a1169e3c35a09937e22c74 100644 --- a/DDG4/lcio/LCIOEventReader.cpp +++ b/DDG4/lcio/LCIOEventReader.cpp @@ -133,10 +133,10 @@ LCIOEventReader::readParticles(int event_number, else if ( genStatus == 1 ) status.set(G4PARTICLE_GEN_STABLE); else if ( genStatus == 2 ) status.set(G4PARTICLE_GEN_DECAYED); else if ( genStatus == 3 ) status.set(G4PARTICLE_GEN_DOCUMENTATION); - else { - cout << " #### WARNING - LCIOInputAction : unknown generator status : " - << genStatus << " -> ignored ! " << endl; - } + else if ( genStatus == 4 ) status.set(G4PARTICLE_GEN_BEAM); + else + status.set(G4PARTICLE_GEN_OTHER); + //fixme: need to define the correct logic for selecting the particle to use // for the _one_ event vertex diff --git a/DDG4/src/Geant4Particle.cpp b/DDG4/src/Geant4Particle.cpp index d3887835b7be45ff33f237ba870e42804c2c4799..0a7071e10de9eff5334a3e8d9136affa591ef4b2 100644 --- a/DDG4/src/Geant4Particle.cpp +++ b/DDG4/src/Geant4Particle.cpp @@ -204,6 +204,8 @@ std::string Geant4ParticleHandle::processName() const { else if ( particle->status&G4PARTICLE_GEN_STABLE ) return "Gen.Stable"; else if ( particle->status&G4PARTICLE_GEN_DECAYED ) return "Gen.Decay"; else if ( particle->status&G4PARTICLE_GEN_DOCUMENTATION ) return "Gen.DOC"; + else if ( particle->status&G4PARTICLE_GEN_BEAM ) return "Gen.Beam"; + else if ( particle->status&G4PARTICLE_GEN_OTHER ) return "Gen.Other"; return "???"; } @@ -380,6 +382,8 @@ void Geant4ParticleHandle::dump4(int level, const std::string& src, const char* status.isSet(G4PARTICLE_GEN_STABLE) ? 'S' : '.', status.isSet(G4PARTICLE_GEN_DECAYED) ? 'D' : '.', status.isSet(G4PARTICLE_GEN_DOCUMENTATION) ? 'd' : '.', + status.isSet(G4PARTICLE_GEN_BEAM) ? 'B' : '.', + status.isSet(G4PARTICLE_GEN_OTHER) ? 'o' : '.', status.isSet(G4PARTICLE_SIM_CREATED) ? 's' : '.', status.isSet(G4PARTICLE_SIM_BACKSCATTER) ? 'b' : '.', diff --git a/DDG4/src/Geant4ParticleHandler.cpp b/DDG4/src/Geant4ParticleHandler.cpp index 91474ebcf3a8f3e7a7564d482fa5c8707350b261..c13fbbd09ac9f46a437ab007024299ae5d5adf38 100644 --- a/DDG4/src/Geant4ParticleHandler.cpp +++ b/DDG4/src/Geant4ParticleHandler.cpp @@ -631,7 +631,7 @@ void Geant4ParticleHandler::checkConsistency() const { } // We assume that particles from the generator have consistent parents // For all other particles except the primaries, the parent must be contained in the record. - if ( !mask.isSet(G4PARTICLE_PRIMARY) && !status.anySet(G4PARTICLE_GEN_GENERATOR) ) { + if ( !mask.isSet(G4PARTICLE_PRIMARY) && !status.anySet(G4PARTICLE_GEN_STATUS) ) { TrackEquivalents::const_iterator eq_it = m_equivalentTracks.find(p->g4Parent); bool in_map = false, in_parent_list = false; int parent_id = -1;