From dc53ba43f0229251a8d1b2e0c9dcf1562e7c50d6 Mon Sep 17 00:00:00 2001
From: Frank Gaede <frank.gaede@desy.de>
Date: Fri, 15 Sep 2017 16:15:24 +0200
Subject: [PATCH] add G4PARTICLE_GEN_BEAM and G4PARTICLE_GEN_OTHER

---
 DDG4/include/DDG4/Geant4Particle.h | 8 ++++++--
 DDG4/lcio/Geant4Output2LCIO.cpp    | 6 ++++--
 DDG4/lcio/LCIOEventReader.cpp      | 8 ++++----
 DDG4/src/Geant4Particle.cpp        | 4 ++++
 DDG4/src/Geant4ParticleHandler.cpp | 2 +-
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/DDG4/include/DDG4/Geant4Particle.h b/DDG4/include/DDG4/Geant4Particle.h
index fe5aaef96..7b3fc5764 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 1f5dfba96..f12de2cfc 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 582f2cc8a..412ecc354 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 d3887835b..0a7071e10 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 91474ebcf..c13fbbd09 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;
-- 
GitLab