From 74206b8f5eaf5631460d2e9a3b47c03d8c9863fa Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Thu, 7 Jan 2016 16:01:35 +0000
Subject: [PATCH] Fix skipping events in StdHep Reader

Use moveToEvent function which is called in InputAction
use m_currEvent part of base EventReader class instead of redefining it
Increment m_currEvent in local function to be next to call to reader->readEvent instead of calling in the function calling readParticleCollection
---
 DDG4/lcio/LCIOEventReader.cpp  |  3 +--
 DDG4/lcio/LCIOStdHepReader.cpp | 27 ++++++++++++++++++++++++---
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/DDG4/lcio/LCIOEventReader.cpp b/DDG4/lcio/LCIOEventReader.cpp
index 5d3c0e55c..3e1c5a9fd 100644
--- a/DDG4/lcio/LCIOEventReader.cpp
+++ b/DDG4/lcio/LCIOEventReader.cpp
@@ -49,7 +49,7 @@ namespace {
 
 /// Initializing constructor
 LCIOEventReader::LCIOEventReader(const string& nam)
-  : Geant4EventReader(nam), m_numEvent(0)
+  : Geant4EventReader(nam)
 {
 }
 
@@ -66,7 +66,6 @@ LCIOEventReader::readParticles(int event_number, vector<Particle*>& particles)
   vector<EVENT::MCParticle*>  mcpcoll;
   EventReaderStatus ret = readParticleCollection(event_number,&primaries);
 
-  ++m_numEvent;
   if ( ret != EVENT_READER_OK ) return ret;
 
   int NHEP = primaries->getNumberOfElements();
diff --git a/DDG4/lcio/LCIOStdHepReader.cpp b/DDG4/lcio/LCIOStdHepReader.cpp
index d23ed2853..82e357a9d 100644
--- a/DDG4/lcio/LCIOStdHepReader.cpp
+++ b/DDG4/lcio/LCIOStdHepReader.cpp
@@ -44,6 +44,9 @@ namespace DD4hep  {
       virtual ~LCIOStdHepReader();
       /// Read an event and fill a vector of MCParticles.
       virtual EventReaderStatus readParticleCollection(int event_number, EVENT::LCCollection** particles);
+      virtual EventReaderStatus moveToEvent(int event_number);
+      virtual EventReaderStatus skipEvent() { return EVENT_READER_OK; }
+
     };
   }     /* End namespace lcio   */
 }       /* End namespace DD4hep */
@@ -73,9 +76,8 @@ using namespace DD4hep::Simulation;
 
 /// Initializing constructor
 LCIOStdHepReader::LCIOStdHepReader(const std::string& nam)
-  : LCIOEventReader(nam)
+  : LCIOEventReader(nam), m_reader(new UTIL::LCStdHepRdr(m_name.c_str()))
 {
-  m_reader = new UTIL::LCStdHepRdr(m_name.c_str());
 }
 
 /// Default destructor
@@ -83,10 +85,29 @@ LCIOStdHepReader::~LCIOStdHepReader()    {
   DD4hep::deletePtr(m_reader);
 }
 
+
+/// skipEvents if required
+Geant4EventReader::EventReaderStatus
+LCIOStdHepReader::moveToEvent(int event_number) {
+  if( m_currEvent == 0 && event_number != 0 ) {
+    printout(INFO,"LCIOStdHepReader::moveToEvent","Skipping the first %d events ", event_number );
+    printout(INFO,"LCIOStdHepReader::moveToEvent","Current Event Number: %d", m_currEvent );
+    while ( m_currEvent < event_number ) {
+      EVENT::LCCollection* particles = m_reader->readEvent();
+      if ( 0 == particles ) return EVENT_READER_ERROR;
+      ++m_currEvent;
+    }
+  }
+  return EVENT_READER_OK;
+}
+
 /// Read an event and fill a vector of MCParticles.
 Geant4EventReader::EventReaderStatus
-LCIOStdHepReader::readParticleCollection(int /*event_number */, EVENT::LCCollection** particles)  {
+LCIOStdHepReader::readParticleCollection(int event_number, EVENT::LCCollection** particles)  {
+
   *particles = m_reader->readEvent();
+  ++m_currEvent;
+
   if ( 0 == *particles ) return EVENT_READER_ERROR;
   return EVENT_READER_OK;
 }
-- 
GitLab