From 9e9f7e1bae5167b00ec5b62e092f105b581bd966 Mon Sep 17 00:00:00 2001
From: lintao <lintao@ihep.ac.cn>
Date: Mon, 4 Nov 2024 11:07:21 +0800
Subject: [PATCH] HepevtRdr: add StartIndex and fix potential memory leakage.

---
 Generator/src/HepevtRdr.cpp | 43 ++++++++++++++++++++++++++-----------
 Generator/src/HepevtRdr.h   |  3 +++
 2 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/Generator/src/HepevtRdr.cpp b/Generator/src/HepevtRdr.cpp
index faf5ad9e..bfa94508 100644
--- a/Generator/src/HepevtRdr.cpp
+++ b/Generator/src/HepevtRdr.cpp
@@ -22,7 +22,6 @@
 using namespace lcio;
 using namespace IMPL;
 using namespace edm4hep;
-using namespace std;
 
 typedef enum HEPFILEFORMATS
 {
@@ -46,6 +45,19 @@ StatusCode HepevtRdr::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;
+            LCCollectionVec* mc_vec = m_hepevt_rdr->readEvent();
+            if(mc_vec==nullptr) {
+                break;
+            }
+            delete mc_vec;
+        }
+        info() << "Skip the first " << startIndex() << " events." << endmsg;
+    }
+
     return sc;
 }
 
@@ -68,17 +80,17 @@ bool HepevtRdr::configure_gentool(){
     }
 
     m_hepevt_rdr = new UTIL::LCAscHepRdr(m_filename.value().c_str(), format);
-    m_processed_event=0;
+    m_processed_event=-1;
     std::cout<<"initial hepevt_rdr"<<std::endl;
     return true;
 }
 
 bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
+    ++m_processed_event;
     LCCollectionVec* mc_vec = m_hepevt_rdr->readEvent();
     if(mc_vec==nullptr) return false;
-    m_processed_event ++;
     int n_mc = mc_vec->size();
-    std::cout<<"Read event :"<< m_processed_event <<", mc size :"<< n_mc <<std::endl;
+    info()<<"Read event :"<< m_processed_event <<", mc size :"<< n_mc <<endmsg;
     std::map<int, int> pmcid_lmcid;
     for (int i=0; i < n_mc; i++){
         MCParticleImpl* mc = (MCParticleImpl*) mc_vec->getElementAt(i);
@@ -108,19 +120,22 @@ bool HepevtRdr::mutate(MyHepMC::GenEvent& event){
         const MCParticleVec & mc_daughters = mc->getDaughters();
         auto pmc = event.m_mc_vec.at(i);
         //std::cout<<"mc at "<< i<<", parent size "<<mc_parents.size() <<std::endl;
-        for(unsigned int j=0; j< mc_parents.size(); j++){int p_id = mc_parents.at(j)->id();
-                                                 //std::cout<<"parent id "<<p_id<<std::endl;
-                                                 pmc.addToParents( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) );
-                                                }
+        for(unsigned int j=0; j< mc_parents.size(); j++){
+            int p_id = mc_parents.at(j)->id();
+            //std::cout<<"parent id "<<p_id<<std::endl;
+            pmc.addToParents( event.m_mc_vec.at( pmcid_lmcid.at(p_id) ) );
+        }
         //std::cout<<"mc at "<< i<<", daughter size "<<mc_daughters.size() <<std::endl;
-        for(unsigned int j=0; j< mc_daughters.size(); j++){int d_id = mc_daughters.at(j)->id();
-                                                 //std::cout<<"daughter id "<<d_id<<std::endl;
-                                                 pmc.addToDaughters( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) );
-                                                }
+        for(unsigned int j=0; j< mc_daughters.size(); j++){
+            int d_id = mc_daughters.at(j)->id();
+            //std::cout<<"daughter id "<<d_id<<std::endl;
+            pmc.addToDaughters( event.m_mc_vec.at( pmcid_lmcid.at(d_id) ) );
+        }
     }
      
     event.SetEventHeader( m_processed_event, -99, 9999, "Generator");
     //std::cout<<"end event :"<< m_processed_event <<std::endl;
+    delete mc_vec;
     return true;
 }
 
@@ -131,3 +146,7 @@ bool HepevtRdr::isEnd(){
 bool HepevtRdr::finish(){
     return true;
 }
+
+int HepevtRdr::startIndex(){
+    return m_startIndex.value();
+}
\ No newline at end of file
diff --git a/Generator/src/HepevtRdr.h b/Generator/src/HepevtRdr.h
index 7a1de27f..a9db8690 100644
--- a/Generator/src/HepevtRdr.h
+++ b/Generator/src/HepevtRdr.h
@@ -23,6 +23,8 @@ class HepevtRdr: public extends<AlgTool, GenReader> {
         bool mutate(MyHepMC::GenEvent& event);    
         bool finish();
         bool isEnd();
+
+        int startIndex() override;
     private:
         UTIL::LCAscHepRdr* m_hepevt_rdr = nullptr;
         long m_total_event = -1;
@@ -31,6 +33,7 @@ class HepevtRdr: public extends<AlgTool, GenReader> {
         // input file name
         Gaudi::Property<std::string> m_filename{this, "Input"};
         Gaudi::Property<std::string> m_format{this, "Format"};
+        Gaudi::Property<int> m_startIndex{this, "StartIndex", 0, "Default start index"};
 };
 
 #endif
-- 
GitLab