diff --git a/Generator/src/GenReader.h b/Generator/src/GenReader.h
index e8abee90134aee82c9d0c2946dc9f9fd6b9b3c43..affb3824c5beebba58b98e203ee29453e35d8742 100644
--- a/Generator/src/GenReader.h
+++ b/Generator/src/GenReader.h
@@ -1,19 +1,25 @@
 #ifndef GenReader_h
 #define GenReader_h 1
 
+/*
+ * GenReader is a base class for the gentools which load events from file
+ */
+
 #include "GenEvent.h"
 #include "IGenTool.h"
 
-using namespace std;
-
 class GenReader: virtual public IGenTool{
 
     public:
-        ~GenReader();
+        virtual ~GenReader() = 0;
         virtual bool configure_gentool()=0;               
         virtual bool mutate(MyHepMC::GenEvent& event)=0;    
         virtual bool finish()=0;
         virtual bool isEnd()=0;
+
+        // The start index is used to skip the first n events.
+        // if start index is 0, then the first event is the first event in the file
+        virtual int startIndex() { return 0; };
 };
 
 #endif
diff --git a/Generator/src/StdHepRdr.cpp b/Generator/src/StdHepRdr.cpp
index 2eccb9f13a4fb81d879177553e752b85d533e8f8..756c124a7daa8768b57c34c8bdbd6abde7bb04da 100644
--- a/Generator/src/StdHepRdr.cpp
+++ b/Generator/src/StdHepRdr.cpp
@@ -31,9 +31,9 @@ StdHepRdr::~StdHepRdr(){
 }
 
 bool StdHepRdr::mutate(MyHepMC::GenEvent& event){
+    ++m_processed_event;
     if(isEnd()) return false;
     LCCollectionVec* mc_vec = m_stdhep_rdr->readEvent();
-    m_processed_event ++;
     int n_mc = mc_vec->getNumberOfElements();
     //std::cout<<"Debug: Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl;
     std::map<int, int> pmcid_lmcid; // mapping between the obj idx in edm4hep and the idx in stdhep
@@ -85,8 +85,12 @@ bool StdHepRdr::mutate(MyHepMC::GenEvent& event){
 }
 
 bool StdHepRdr::isEnd(){
-if(m_processed_event == m_total_event) {std::cout<<"Have read all events, end now."<<std::endl; return true;}
-else return false;
+    if(m_processed_event == m_total_event) {
+        std::cout<<"Have read all events, end now."<<std::endl; 
+        return true;
+    } else {
+        return false;
+    }
 }
 
 bool StdHepRdr::configure_gentool(){
@@ -96,8 +100,8 @@ bool StdHepRdr::configure_gentool(){
         return false;
     }
 
-    m_total_event = m_stdhep_rdr->getNumberOfEvents() - 1 ;
-    m_processed_event=0;
+    m_total_event = m_stdhep_rdr->getNumberOfEvents();
+    m_processed_event=-1;
 
     return true;
 }
@@ -114,6 +118,18 @@ StdHepRdr::initialize() {
         return StatusCode::FAILURE;
     }
 
+    // skip the first n events if startIndex is not 0.
+    if (startIndex() != 0) {
+        for (int i=0; i<startIndex(); ++i) {
+            ++m_processed_event;
+            if(isEnd()) return StatusCode::FAILURE;
+            LCCollectionVec* mc_vec = m_stdhep_rdr->readEvent();
+            delete mc_vec;
+        }
+        info() << "Skip the first " << startIndex() << " events." << endmsg;
+    }
+
+
     return sc;
 }
 
@@ -126,3 +142,7 @@ StdHepRdr::finalize() {
     }
     return sc;
 }
+
+int StdHepRdr::startIndex(){
+    return m_startIndex.value();
+}
\ No newline at end of file
diff --git a/Generator/src/StdHepRdr.h b/Generator/src/StdHepRdr.h
index 4796eedaa4a25b9ae786508f4c5d6cf1dc5b844d..b9e555c9abf8d37598ab527a8c2916fcefea63aa 100644
--- a/Generator/src/StdHepRdr.h
+++ b/Generator/src/StdHepRdr.h
@@ -27,6 +27,8 @@ public:
     bool mutate(MyHepMC::GenEvent& event) override;    
     bool finish() override;
     bool isEnd() override;
+
+    int startIndex() override;
 private:
     lcio::LCStdHepRdrNew* m_stdhep_rdr{nullptr};
     long m_total_event{-1};
@@ -34,7 +36,8 @@ private:
 
     // input file name
     Gaudi::Property<std::string> m_filename{this, "Input"};
-    Gaudi::Property<double> m_starttime{this, "StartTime", 0, "Default start time"};    
+    Gaudi::Property<double> m_starttime{this, "StartTime", 0, "Default start time"};
+    Gaudi::Property<int> m_startIndex{this, "StartIndex", 0, "Default start index"};
 
 };