From 3b7aec8806358cfe49c88d116a7a7069f913cfca Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Sun, 10 Nov 2019 20:23:47 +0800
Subject: [PATCH] WIP: start to migrate the GenTools.

---
 Generator/CMakeLists.txt    | 14 ++++++++-
 Generator/src/GenAlgo.cpp   | 61 +++++++++++++++++++++----------------
 Generator/src/GenAlgo.h     |  5 ++-
 Generator/src/GenReader.h   |  4 +--
 Generator/src/GtGunTool.cpp | 34 +++++++++++++++++++++
 Generator/src/GtGunTool.h   | 33 ++++++++++++++++++++
 Generator/src/IGenTool.h    | 13 ++++++--
 7 files changed, 132 insertions(+), 32 deletions(-)
 create mode 100644 Generator/src/GtGunTool.cpp
 create mode 100644 Generator/src/GtGunTool.h

diff --git a/Generator/CMakeLists.txt b/Generator/CMakeLists.txt
index a9a5cd9f..b62828d5 100644
--- a/Generator/CMakeLists.txt
+++ b/Generator/CMakeLists.txt
@@ -1,6 +1,18 @@
 ########################################
 gaudi_subdir(Generator v0r0)
-set(GenAlgo_srcs src/GenAlgo.cpp src/GenEvent.cpp src/IGenTool.cpp src/StdHepRdr.cpp src/GenReader.cpp src/GenPrinter.cpp src/LCAscHepRdr.cc src/HepevtRdr.cpp src/SLCIORdr.cpp src/HepMCRdr.cpp)
+set(GenAlgo_srcs 
+    src/IGenTool.cpp 
+    src/GenAlgo.cpp 
+    src/GenEvent.cpp 
+    src/GenReader.cpp 
+    # src/StdHepRdr.cpp 
+    # src/GenPrinter.cpp
+    # src/LCAscHepRdr.cc
+    # src/HepevtRdr.cpp
+    # src/SLCIORdr.cpp
+    # src/HepMCRdr.cpp
+    src/GtGunTool.cpp
+)
 set(GenAlgo_incs src)
 
 find_package(ROOT COMPONENTS RIO Tree TreePlayer MathCore Net Graf3d Graf Gpad REQUIRED)
diff --git a/Generator/src/GenAlgo.cpp b/Generator/src/GenAlgo.cpp
index 902a43dc..6c3784ef 100644
--- a/Generator/src/GenAlgo.cpp
+++ b/Generator/src/GenAlgo.cpp
@@ -13,12 +13,12 @@
 
 #include "IGenTool.h"
 #include "GenEvent.h"
-#include "StdHepRdr.h"
-#include "HepevtRdr.h"// not correct still
-#include "SLCIORdr.h"
-#include "HepMCRdr.h"
-#include "GenPrinter.h"
-#include "GenWriter.h"
+// #include "StdHepRdr.h"
+// #include "HepevtRdr.h"// not correct still
+// #include "SLCIORdr.h"
+// #include "HepMCRdr.h"
+// #include "GenPrinter.h"
+// #include "GenWriter.h"
 
 using namespace std;
 
@@ -26,32 +26,41 @@ DECLARE_COMPONENT(GenAlgo)
 
 GenAlgo::GenAlgo(const std::string& name, ISvcLocator* pSvcLocator): GaudiAlgorithm(name, pSvcLocator) {
     declareProperty("MCParticle", m_hdl, "MCParticle collection (output)");
+    declareProperty("GenTools", m_genToolNames, "List of GenTools");
     m_evtid = 0;
 
 }
 
 StatusCode
 GenAlgo::initialize() {
-    
-    cout << "initialize start" << endl; 
-    string generatorName = m_input_file.value();
-    string outputName    = m_output_file.value();
-    string format        = m_input_format.value();
-    IGenTool* gen_reader;
-    if(format=="stdhep") gen_reader  = new StdHepRdr(generatorName);    
-    else if(format=="slcio") gen_reader  = new SLCIORdr(generatorName);    
-    else if(format=="hepmc") gen_reader  = new HepMCRdr(generatorName);    
-    else{cout << "Error : unsupport format for generator input file" << endl; return StatusCode::FAILURE; }
-    //IGenTool* gen_reader  = new HepevtRdr(generatorName);    
-    m_genTools.push_back(gen_reader);
-    if(m_print.value()) {
-        IGenTool* gen_printer = new GenPrinter(generatorName);    
-        m_genTools.push_back(gen_printer);
+    if (m_genToolNames.size()==0) {
+        error() << "Please specify the gentools to be used in GenAlgo." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    for (auto gtname: m_genToolNames) {
+        m_genTools.push_back(gtname);
     }
+    
+    // cout << "initialize start" << endl; 
+    // string generatorName = m_input_file.value();
+    // string outputName    = m_output_file.value();
+    // string format        = m_input_format.value();
+    // IGenTool* gen_reader;
+    // if(format=="stdhep") gen_reader  = new StdHepRdr(generatorName);    
+    // else if(format=="slcio") gen_reader  = new SLCIORdr(generatorName);    
+    // else if(format=="hepmc") gen_reader  = new HepMCRdr(generatorName);    
+    // else{cout << "Error : unsupport format for generator input file" << endl; return StatusCode::FAILURE; }
+    // //IGenTool* gen_reader  = new HepevtRdr(generatorName);    
+    // m_genTools.push_back(gen_reader);
+    // if(m_print.value()) {
+    //     IGenTool* gen_printer = new GenPrinter(generatorName);    
+    //     m_genTools.push_back(gen_printer);
+    // }
     //IGenTool* gen_writer  = new GenWriter (outputName);    
     //m_genTools.push_back(gen_writer);
 
-    cout << "initialize done" << endl; 
+    // cout << "initialize done" << endl; 
     return StatusCode::SUCCESS;
 
 }
@@ -62,8 +71,8 @@ GenAlgo::execute() {
     auto mcCol = m_hdl.createAndPut();
     MyHepMC::GenEvent m_event(*mcCol);
 
-    for(std::vector<IGenTool*>::iterator it=m_genTools.begin(); it != m_genTools.end(); ++it) {
-        if ((*it)->mutate(m_event)) {} 
+    for(auto gentool: m_genTools) {
+        if (gentool->mutate(m_event)) {} 
         else {
             cout << "Have read all events, stop now." << endl; 
             auto ep = serviceLocator()->as<IEventProcessor>();
@@ -84,8 +93,8 @@ GenAlgo::execute() {
 StatusCode
 GenAlgo::finalize() {
     cout << "finalize" << endl; 
-    for(std::vector<IGenTool*>::iterator it=m_genTools.begin(); it != m_genTools.end(); ++it) {
-        if ((*it)->finish()) {} 
+    for(auto gentool: m_genTools) {
+        if (gentool->finish()) {} 
         else {cout << "finish Failed" << endl; return StatusCode::FAILURE; }
     }
     return StatusCode::SUCCESS;
diff --git a/Generator/src/GenAlgo.h b/Generator/src/GenAlgo.h
index 499449e1..0fd060dc 100644
--- a/Generator/src/GenAlgo.h
+++ b/Generator/src/GenAlgo.h
@@ -4,6 +4,7 @@
 
 #include <GaudiKernel/Algorithm.h>
 #include "GaudiKernel/Property.h"
+#include <GaudiKernel/ToolHandle.h>
 
 #include "GaudiAlg/GaudiAlgorithm.h"
 #include "FWCore/DataHandle.h"
@@ -36,7 +37,9 @@ private:
     Gaudi::Property<bool> m_do_write{this, "WriteFile", "NULL"};
 
     std::vector<std::string> m_genToolNames;                                                         
-    std::vector<IGenTool*> m_genTools;                                                               
+    // std::vector<IGenTool*> m_genTools;
+    ToolHandleArray<IGenTool> m_genTools;
+
     int m_evtid;                               
     int m_evtMax;
     //MyHepMC::GenEvent m_event;
diff --git a/Generator/src/GenReader.h b/Generator/src/GenReader.h
index b9abac0a..e8abee90 100644
--- a/Generator/src/GenReader.h
+++ b/Generator/src/GenReader.h
@@ -6,11 +6,11 @@
 
 using namespace std;
 
-class GenReader: public IGenTool{
+class GenReader: virtual public IGenTool{
 
     public:
         ~GenReader();
-        virtual bool configure()=0;               
+        virtual bool configure_gentool()=0;               
         virtual bool mutate(MyHepMC::GenEvent& event)=0;    
         virtual bool finish()=0;
         virtual bool isEnd()=0;
diff --git a/Generator/src/GtGunTool.cpp b/Generator/src/GtGunTool.cpp
new file mode 100644
index 00000000..b4087cce
--- /dev/null
+++ b/Generator/src/GtGunTool.cpp
@@ -0,0 +1,34 @@
+#include "GtGunTool.h"
+
+DECLARE_COMPONENT(GtGunTool)
+
+StatusCode
+GtGunTool::initialize() {
+    StatusCode sc;
+
+    return sc;
+}
+
+StatusCode
+GtGunTool::finalize() {
+    StatusCode sc;
+    return sc;
+}
+
+bool
+GtGunTool::mutate(MyHepMC::GenEvent& event) {
+
+    return true;
+}
+
+bool
+GtGunTool::finish() {
+    return true;
+}
+
+bool
+GtGunTool::configure_gentool() {
+
+    return true;
+}
+
diff --git a/Generator/src/GtGunTool.h b/Generator/src/GtGunTool.h
new file mode 100644
index 00000000..4138a8ee
--- /dev/null
+++ b/Generator/src/GtGunTool.h
@@ -0,0 +1,33 @@
+#ifndef GtGunTool_h
+#define GtGunTool_h
+
+/*
+ * Description: 
+ *   A particle gun to generate particles.
+ *   User could specify following:
+ *   * PDGID or Particle Name
+ *   * Status: this is used for extension.
+ *   * Momentum or TotalEnergy or KineticEnergy
+ *   * Position and Time
+ */
+
+#include <GaudiKernel/AlgTool.h>
+#include "IGenTool.h"
+
+class GtGunTool: public extends<AlgTool, IGenTool> {
+public:
+    using extends::extends;
+
+    // Overriding initialize and finalize
+    StatusCode initialize() override;
+    StatusCode finalize() override;
+
+    // IGenTool
+    bool mutate(MyHepMC::GenEvent& event) override;
+    bool finish() override;
+    bool configure_gentool() override;
+
+};
+
+
+#endif
diff --git a/Generator/src/IGenTool.h b/Generator/src/IGenTool.h
index 87af6bd8..ef43bc74 100644
--- a/Generator/src/IGenTool.h
+++ b/Generator/src/IGenTool.h
@@ -1,14 +1,23 @@
 #ifndef IGenTool_h
 #define IGenTool_h 1
 
+/*
+ * IGenTool is used to mutate an event. Several tools could be used 
+ * together to create a full event.
+ *
+ * ChangeLog:
+ * - 2019.11.10, Tao Lin, make the IGenTool a Gaudi tool.
+ */
+
+#include "GaudiKernel/IAlgTool.h"
 #include "GenEvent.h"
 
 
-class IGenTool {
+class IGenTool: virtual public IAlgTool  {
     public:
         virtual bool mutate(MyHepMC::GenEvent& event)=0;
         virtual bool finish()=0;
-        virtual bool configure()=0;
+        virtual bool configure_gentool()=0;
         virtual ~IGenTool();
 };
 
-- 
GitLab