From 3bbf046f18def4d3540d4be6dd00afa5cd01b4ad Mon Sep 17 00:00:00 2001
From: Cao Guangjie <gjcao@lxslc611.ihep.ac.cn>
Date: Thu, 24 Oct 2019 17:04:27 +0800
Subject: [PATCH] convert Cluster and Update code function structure.

---
 Examples/options/LCIO_read.py         |   3 +-
 FWCore/FWCore/LCIODataSvc.h           |   2 +
 FWCore/src/components/LCIO2Plcio.cpp  | 299 ++++++++++++++++++++++----
 FWCore/src/components/LCIO2Plcio.h    |  17 ++
 FWCore/src/components/LCIODataSvc.cpp |  28 ++-
 5 files changed, 295 insertions(+), 54 deletions(-)

diff --git a/Examples/options/LCIO_read.py b/Examples/options/LCIO_read.py
index 372754e2..07b4b0ee 100644
--- a/Examples/options/LCIO_read.py
+++ b/Examples/options/LCIO_read.py
@@ -3,7 +3,8 @@
 from Gaudi.Configuration import *
 
 from Configurables import LCIODataSvc
-dsvc = LCIODataSvc("EventDataSvc", input="/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/E240.Pe2e2h_bb.e0.p0.whizard195/e2e2h_bb.e0.p0.00001_000000_sim.slcio")
+# dsvc = LCIODataSvc("EventDataSvc", input="/cefs/data/FullSim/CEPC240/CEPC_v4/higgs/E240.Pe2e2h_bb.e0.p0.whizard195/e2e2h_bb.e0.p0.00001_000000_sim.slcio")
+dsvc = LCIODataSvc("EventDataSvc", input="/cefs/data/DstData/CEPC240/CEPC_v4/higgs/E240.Pe2e2h_X.e0.p0.whizard195/e2e2h_X.e0.p0.00001_001000_dst.slcio")
 
 from Configurables import PlcioReadAlg
 alg = PlcioReadAlg("PlcioReadAlg")
diff --git a/FWCore/FWCore/LCIODataSvc.h b/FWCore/FWCore/LCIODataSvc.h
index 9627a8b7..180f7b8d 100644
--- a/FWCore/FWCore/LCIODataSvc.h
+++ b/FWCore/FWCore/LCIODataSvc.h
@@ -80,6 +80,8 @@ private:
   int m_eventNum{0};
   /// Number of events in the file / to process
   int m_eventMax{-1};
+  /// the current file index in the m_filenames vector
+  int m_fileIndex{0};
 
 
   SmartIF<IConversionSvc> m_cnvSvc;
diff --git a/FWCore/src/components/LCIO2Plcio.cpp b/FWCore/src/components/LCIO2Plcio.cpp
index 8292d421..26a22040 100644
--- a/FWCore/src/components/LCIO2Plcio.cpp
+++ b/FWCore/src/components/LCIO2Plcio.cpp
@@ -12,16 +12,46 @@
 typedef std::vector<EVENT::MCParticle*> MCParticleVec ;
 
 CollectionsMap LCIO2Plcio::map_cols;
+std::string LCIO2Plcio::CollName;
 
 void lp_info(std::string s){
   printf("[LCIO2Plcio]:\t\t%s.\n", &s[0]);
 }
 
+template<typename T>
+static plcio::FloatThree FloatThreeFROMConstPtr(const T* vpos){
+  float tmp[3];
+  for(unsigned i=0; i<3; i++){
+    tmp[i] = vpos[i];
+  }
+  return plcio::FloatThree(tmp);
+}
+
+template<typename T>
+static plcio::FloatThree FloatThreeFROMFloatVec(std::vector<T> vec){
+  float tmp[3];
+  for(unsigned i=0; i<3; i++){
+    tmp[i] = vec[i];
+  }
+  return plcio::FloatThree(tmp);
+}
+
+std::array<float, 6> vec6_2_arr6(std::vector<float> vec){
+  std::array<float, 6> arr;
+  for(unsigned i=0; i<6; i++){
+    arr[i] = vec[i];
+  }
+  return arr;
+}
+
 LCIO2Plcio::LCIO2Plcio(){
   map_cvt.insert(std::make_pair<std::string, fptr>("MCParticle", Convertor_MCParticle));
   map_cvt.insert(std::make_pair<std::string, fptr>("LCRunHeader", Convertor_LCRunHeader));
   map_cvt.insert(std::make_pair<std::string, fptr>("SimTrackerHit", Convertor_SimTrackerHit));
   map_cvt.insert(std::make_pair<std::string, fptr>("SimCalorimeterHit", Convertor_SimCalorimeterHit));
+  map_cvt.insert(std::make_pair<std::string, fptr>("Cluster", Convertor_Cluster));
+  map_cvt.insert(std::make_pair<std::string, fptr>("Track", Convertor_Track));
+  map_cvt.insert(std::make_pair<std::string, fptr>("TPCHit", Convertor_TPCHit));
 }
 LCIO2Plcio::LCIO2Plcio(EVENT::LCCollection* collection){
   LCIO2Plcio();
@@ -67,20 +97,8 @@ void LCIO2Plcio::setMCParticle(EVENT::MCParticle* lc_var, plcio::MCParticle& pl_
   pl_var.setColorFlow( plcio::IntTwo( lc_var->getColorFlow() ) );
   pl_var.setVertex( plcio::DoubleThree( lc_var->getVertex()));
   pl_var.setEndpoint( plcio::DoubleThree( lc_var->getEndpoint() ) );
-
-  // send float ptr as parameter to FloatThree.
-  float plcio_v[3];
-  const double* lcio_v = lc_var->getMomentum();
-  plcio_v[0] = lcio_v[0];
-  plcio_v[1] = lcio_v[1];
-  plcio_v[2] = lcio_v[2];
-  pl_var.setMomentum( plcio::FloatThree( plcio_v ) );
-
-  lcio_v = lc_var->getMomentumAtEndpoint();
-  plcio_v[0] = lcio_v[0];
-  plcio_v[1] = lcio_v[1];
-  plcio_v[2] = lcio_v[2];
-  pl_var.setMomentumAtEndpoint( plcio::FloatThree( plcio_v ) );
+  pl_var.setMomentum( FloatThreeFROMConstPtr(lc_var->getMomentum()) );
+  pl_var.setMomentumAtEndpoint( FloatThreeFROMConstPtr(lc_var->getMomentumAtEndpoint()) );
 }
 
 podio::CollectionBase* LCIO2Plcio::Convertor_MCParticle(EVENT::LCCollection* lc_col){
@@ -168,23 +186,13 @@ podio::CollectionBase* LCIO2Plcio::Convertor_SimCalorimeterHit(EVENT::LCCollecti
     pl_var.setCellID0( lc_var->getCellID0() );
     pl_var.setCellID1( lc_var->getCellID1() );
     pl_var.setEnergy( lc_var->getEnergy() );
-
-    float plcio_v[3];
-    const float* lcio_v = lc_var->getPosition();
-    plcio_v[0] = lcio_v[0];
-    plcio_v[1] = lcio_v[1];
-    plcio_v[2] = lcio_v[2];
-    pl_var.setPosition( plcio::FloatThree( plcio_v ) );
+    pl_var.setPosition( FloatThreeFROMConstPtr(lc_var->getPosition()) );
 
     // converting from lc_var to pl_var on the contribution variables;
     for( unsigned j=0, N=lc_var->getNMCContributions(); j<N; j++){
-      plcio_v[0] = lc_var->getStepPosition(j)[0];
-      plcio_v[1] = lc_var->getStepPosition(j)[1];
-      plcio_v[2] = lc_var->getStepPosition(j)[2];
-
       plcio::ConstCaloHitContribution tmp(
 	lc_var->getPDGCont(j), lc_var->getEnergyCont(j),
-	lc_var->getTimeCont(j), plcio::FloatThree(plcio_v) 
+	lc_var->getTimeCont(j), FloatThreeFROMConstPtr(lc_var->getStepPosition(j)) 
       );
       pl_var.addContribution( tmp );
     }
@@ -204,30 +212,233 @@ podio::CollectionBase* LCIO2Plcio::Convertor_Cluster(EVENT::LCCollection* lc_col
     pl_var.setEnergyError(lc_var->getEnergyError());
     pl_var.setPhi(lc_var->getIPhi());
     pl_var.setITheta(lc_var->getITheta());
+    pl_var.setPosition( FloatThreeFROMConstPtr(lc_var->getPosition()) );
+    pl_var.setPositionError( vec6_2_arr6(lc_var->getPositionError()) );
+    pl_var.setDirectionError( FloatThreeFROMFloatVec(lc_var->getDirectionError()) );
 
-    float plcio_v[3];
-    const float* lcio_v = lc_var->getPosition();
-    plcio_v[0] = lcio_v[0];
-    plcio_v[1] = lcio_v[1];
-    plcio_v[2] = lcio_v[2];
-    pl_var.setPosition( plcio::FloatThree(plcio_v) );
+    std::vector<float> lcio_seq0 = lc_var->getShape();
+    for(unsigned j=0; j<lcio_seq0.size(); j++){
+      pl_var.addShap( lcio_seq0[j] );
+    }
+
+    lcio_seq0 = lc_var->getHitContributions();
+    for(unsigned j=0; j<lcio_seq0.size(); j++){
+      pl_var.addHitContribution( lcio_seq0[j] );
+    }
+
+    lcio_seq0 = lc_var->getSubdetectorEnergies();
+    for(unsigned j=0; j<lcio_seq0.size(); j++){
+      pl_var.addSubdetectorEnergie( lcio_seq0[j] );
+    }
 
-    std::vector<float> lcio_vecfloat = lc_var->getPositionError();
-    std::array<float, 6> plcio_arr6;
+    EVENT::ParticleIDVec lcio_seq1 = lc_var->getParticleIDs();
+    for(unsigned j=0; j<lcio_seq1.size(); j++){
+      EVENT::ParticleID* lc_locx = lcio_seq1[j];
+
+      pl_var.addParticleID( plcio::ConstParticleID(
+        lc_locx->getType(), 
+	lc_locx->getPDG(),
+	lc_locx->getAlgorithmType(), 
+	lc_locx->getLikelihood()
+      ) );
+    }
+
+    EVENT::CalorimeterHitVec lcio_seq2 = lc_var->getCalorimeterHits();
+    for(unsigned j=0; j<lcio_seq2.size(); j++){
+      EVENT::CalorimeterHit* lc_locx = lcio_seq2[j];
+
+      podio::CollectionIDTable col2id;
+      plcio::ObjectID tmp;
+      tmp.index = i;
+      tmp.collectionID = col2id.collectionID(CollName);
+
+      pl_var.addHit( plcio::ConstCalorimeterHit(
+        lc_locx->getCellID0(),
+        lc_locx->getCellID1(),
+        lc_locx->getEnergy(),
+        lc_locx->getEnergyError(),
+        lc_locx->getTime(),
+        FloatThreeFROMConstPtr(lc_locx->getPosition()),
+        lc_locx->getType(),
+        tmp
+      ) );
+    }
+  }
+
+  for(unsigned i=0,N=lc_col->getNumberOfElements(); i<N; i++){
+    EVENT::Cluster* lc_var = (EVENT::Cluster*) lc_col->getElementAt(i);
+    plcio::Cluster pl_var = pl_col->at(i);
+    EVENT::ClusterVec lcio_seq3 = lc_var->getClusters();
+
+    for(unsigned j=0; j<lcio_seq3.size(); j++){
+      for(unsigned k=0,K=lc_col->getNumberOfElements(); k<K; k++){
+        if(lcio_seq3[j] == lc_col->getElementAt(k)){
+          pl_var.addCluster(pl_col->at(k));
+	}
+      }
+    }
+  }
+
+  return pl_col;
+}
+
+podio::CollectionBase* LCIO2Plcio::Convertor_ReconstructedParticle(EVENT::LCCollection* lc_col){
+  plcio::ReconstructedParticleCollection* pl_col = new plcio::ReconstructedParticleCollection();
+
+  for(unsigned i=0,N=lc_col->getNumberOfElements(); i<N; i++){
+    EVENT::ReconstructedParticle* lc_var = (EVENT::ReconstructedParticle*) lc_col->getElementAt(i);
+    plcio::ReconstructedParticle pl_var = (plcio::ReconstructedParticle) pl_col->create();
+
+    pl_var.setType( lc_var->getType() );
+    pl_var.setEnergy( lc_var->getEnergy() );
+    pl_var.setCharge( lc_var->getCharge() );
+    pl_var.setMass( lc_var->getMass() );
+    pl_var.setGoodnessOfPID( lc_var->getGoodnessOfPID() );
+
+    pl_var.setMomentum( FloatThreeFROMConstPtr(lc_var->getMomentum()) );
+    pl_var.setReferencePoint( FloatThreeFROMConstPtr(lc_var->getReferencePoint()) );
+
+    std::vector<float> vec = lc_var->getCovMatrix();
+    for(unsigned j=0,N=vec.size(); j<N; j++){
+      pl_var.setCovMatrix( j, vec[j] );
+    }
+
+    // QUEST: boolean to int: isPrimary, str2int: getAlgorithmType;
+    // pl_var.setStartVertex( lc_var->getStartVertex() ) 
+    std::array<float, 6> arr_6;
+    EVENT::FloatVec fvec = lc_var->getStartVertex()->getCovMatrix();
     for(unsigned j=0; j<6; j++){
-      plcio_arr6[j] = lcio_vecfloat[j];
+      arr_6[j] = fvec[j];
+    }
+    pl_var.setStartVertex( plcio::ConstVertex(
+      lc_var->getStartVertex()->isPrimary(),
+      lc_var->getStartVertex()->getChi2(),
+      lc_var->getStartVertex()->getProbability(),
+      FloatThreeFROMConstPtr( lc_var->getStartVertex()->getPosition() ),
+      arr_6,
+      0
+      //lc_var->getStartVertex()->getAlgorithmType()
+    ) );
+
+    // QUEST: LCIO/ParticleID has a int algType;
+    //pl_var.setParticleIDUsed( lc_var->igetParticleIDUsed() );
+    pl_var.setParticleIDUsed( plcio::ConstParticleID(
+      lc_var->getParticleIDUsed()->getType(),
+      lc_var->getParticleIDUsed()->getPDG(),
+      lc_var->getParticleIDUsed()->getAlgorithmType(),
+      lc_var->getParticleIDUsed()->getLikelihood()
+    ) );
+
+    //pl_var.addCluster();
+    // QUEST: set value directly;
+
+    std::vector<EVENT::Cluster*> vec_clust = lc_var->getClusters();
+    for(unsigned j=0; j<vec_clust.size(); j++){
+      for(unsigned k=0; k<6; k++){
+        arr_6[k] = vec_clust[j]->getPositionError()[k];
+      }
+
+      pl_var.addCluster( plcio::ConstCluster(
+        vec_clust[j]->getType(),
+        vec_clust[j]->getEnergy(),
+        vec_clust[j]->getEnergyError(),
+        FloatThreeFROMConstPtr( vec_clust[j]->getPosition() ),
+        arr_6,
+        vec_clust[j]->getITheta(),
+        vec_clust[j]->getIPhi(),
+        FloatThreeFROMFloatVec( vec_clust[j]->getDirectionError() )
+      ) );
+    }
+
+    //pl_var.addTrack();
+    // QUEST: set value directly;
+    EVENT::TrackVec vec_track = lc_var->getTracks();
+    for(unsigned j=0; j<vec_track.size(); j++){
+      pl_var.addTrack(plcio::ConstTrack(
+       // plcio/include/plcio/TrackConst.h
+       //  LCIO/include/EVENT/Track.h 
+      ));
     }
-    pl_var.setPositionError(plcio_arr6);
-
-//    pl_var.(lc_var->getDirectionError());
-//    pl_var.(lc_var->getShape());
-//    pl_var.(lc_var->getParticleIDs());
-//    pl_var.(lc_var->getClusters());
-//    pl_var.(lc_var->getCalorimeterHits());
-//    pl_var.(lc_var->getHitContributions());
-//    pl_var.(lc_var->getSubdetectorEnergies());
+
+    //pl_var.addParticle();
+    //pl_var.addParticleID();
   }
+  return pl_col;
+}
+
+podio::CollectionBase* LCIO2Plcio::Convertor_Track(EVENT::LCCollection* lc_col){
+  plcio::TrackCollection* pl_col = new plcio::TrackCollection();
+
+  for(unsigned i=0,N=lc_col->getNumberOfElements(); i<N; i++){
+    EVENT::Track* lc_var = (EVENT::Track*) lc_col->getElementAt(i);
+    plcio::Track pl_var = (plcio::Track) pl_col->create();
+
+    pl_var.setType( lc_var->getType() );
+    pl_var.setChi2( lc_var->getChi2() );
+    pl_var.setNdf( lc_var->getNdf() );
+    pl_var.setDEdx( lc_var->getdEdx() );
+    pl_var.setDEdxError( lc_var->getdEdxError() );
+    pl_var.setRadiusOfInnermostHit( lc_var->getRadiusOfInnermostHit() );
+
+    //pl_var.addTrackerHit( lc_var->getTrackerHits() );
+    EVENT::TrackerHitVec lcio_seq1 = lc_var->getTrackerHits();
+    for(unsigned j=0; j<lcio_seq1.size(); j++){
+      EVENT::TrackerHit* lc_locx = lcio_seq1[j];
+
+      const double* lcio_v = lc_locx->getPosition();
+      double plcio_v[3];
+      plcio_v[0] = lcio_v[0];
+      plcio_v[1] = lcio_v[1];
+      plcio_v[2] = lcio_v[2];
+
+      std::array<float, 6> plcio_arr6;
+      for(unsigned k=0; k<6; k++){
+        plcio_arr6[k] = lc_locx->getCovMatrix()[k];
+      }
 
+      pl_var.addTrackerHit(plcio::ConstTrackerHit(
+        lc_locx->getCellID0(),
+        lc_locx->getCellID1(),
+        lc_locx->getType(),
+        lc_locx->getQuality(),
+        lc_locx->getTime(),
+        lc_locx->getEDep(),
+        lc_locx->getEDepError(),
+        lc_locx->getdEdx(),
+        plcio::DoubleThree(plcio_v),
+        plcio_arr6
+      ));
+    }
+
+    //pl_var.( lc_var->getSubdetectorHitNumbers() );
+    std::vector<int> lcio_IntVec1 = lc_var->getSubdetectorHitNumbers();
+    for(unsigned j=0; j<lcio_IntVec1.size(); j++){
+      pl_var.addSubDetectorHitNumber(lcio_IntVec1[j]);
+    }
+
+    //pl_var.( lc_var->getTracks() );
+    EVENT::TrackVec lcio_seq2 = lc_var->getTracks();
+    for(unsigned j=0; j<lcio_seq2.size(); j++){
+      EVENT::Track* lc_locx = lcio_seq2[j];
+
+      pl_var.addTrack(plcio::ConstTrack(
+        lc_locx->getType(),
+        lc_locx->getChi2(),
+        lc_locx->getNdf(),
+        lc_locx->getdEdx(),
+        lc_locx->getdEdxError(),
+        lc_locx->getRadiusOfInnermostHit()
+      ));
+    }
+
+    //pl_var.( lc_var->getTrackStates() );
+    EVENT::TrackStateVec lcio_seq3 = lc_var->getTrackStates();
+    for(unsigned j=0; j<lcio_seq3.size(); j++){
+      EVENT::TrackState* lc_locx = lcio_seq3[j];
+
+      //pl_var.addTrackState(plcio::TrackState());
+    }
+  }
   return pl_col;
 }
 
diff --git a/FWCore/src/components/LCIO2Plcio.h b/FWCore/src/components/LCIO2Plcio.h
index a72aedf0..a49ab30e 100644
--- a/FWCore/src/components/LCIO2Plcio.h
+++ b/FWCore/src/components/LCIO2Plcio.h
@@ -26,6 +26,18 @@
 #include "EVENT/Cluster.h"
 #include "plcio/Cluster.h"
 #include "plcio/ClusterCollection.h"
+#include "EVENT/ParticleID.h"
+#include "EVENT/CalorimeterHit.h"
+#include "plcio/CalorimeterHit.h"
+#include "podio/CollectionIDTable.h"
+#include "EVENT/Track.h" 
+#include "EVENT/TrackerHit.h"
+#include "EVENT/TrackState.h" 
+#include "plcio/Track.h"  
+#include "plcio/TrackCollection.h"  
+#include "EVENT/ReconstructedParticle.h" 
+#include "plcio/ReconstructedParticle.h"  
+#include "plcio/ReconstructedParticleCollection.h"  
 
 #include <utility>
 // Forward declarations
@@ -62,15 +74,20 @@ public:
   static podio::CollectionBase* Convertor_SimTrackerHit(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_SimCalorimeterHit(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_Cluster(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_Track(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_ReconstructedParticle(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_LCRelation(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_Vertex(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_TPCHit(EVENT::LCCollection*);
 
   static void setMCParticle(EVENT::MCParticle*, plcio::MCParticle&);
+  void setCollName(const std::string &collName){ CollName = collName; };
 
   bool isReady(const std::string&);
 
 private:
   std::string TypeName;
+  static std::string CollName;
   // maintain a log vec about data read;
   std::vector<std::string> vec_Types;
 
diff --git a/FWCore/src/components/LCIODataSvc.cpp b/FWCore/src/components/LCIODataSvc.cpp
index b5ed5235..4901b1ce 100644
--- a/FWCore/src/components/LCIODataSvc.cpp
+++ b/FWCore/src/components/LCIODataSvc.cpp
@@ -34,11 +34,10 @@ StatusCode LCIODataSvc::initialize() {
   }
 
   if (m_filenames.size() > 0) {
-    if (m_filenames[0] != "") {
-      m_reader->open(m_filenames);
-      m_eventMax = m_reader->getNumberOfEvents();
-    }
+    m_reader->open(m_filenames[0]);
+    m_eventMax = m_reader->getNumberOfEvents();
   }
+
   return status;
 }
 /// Service reinitialisation
@@ -48,6 +47,9 @@ StatusCode LCIODataSvc::reinitialize() {
 }
 /// Service finalization
 StatusCode LCIODataSvc::finalize() {
+  m_reader->close();
+  delete m_reader;
+  m_reader = nullptr;
   m_cnvSvc = 0;  // release
   DataSvc::finalize().ignore();
   return StatusCode::SUCCESS;
@@ -74,11 +76,18 @@ void LCIODataSvc::endOfRead() {
   if (m_eventMax != -1) {
     // m_provider.clearCaches();
     // m_reader.endOfEvent();
-    if (m_eventNum++ > m_eventMax) {
-      info() << "Reached end of file with event " << m_eventMax << endmsg;
-      IEventProcessor* eventProcessor;
-      service("ApplicationMgr", eventProcessor);
-      eventProcessor->stopRun();
+    if ( ++m_eventNum >= m_eventMax ) {
+      if ( ++m_fileIndex < m_filenames.size() ) {  // move to next file
+        m_reader->close();
+        m_reader->open( m_filenames[m_fileIndex] );
+        m_eventMax += m_reader->getNumberOfEvents();
+      }
+      else {  // reach to the end of the file list
+        info() << "Reached end of file with event " << m_eventMax << endmsg;
+        IEventProcessor* eventProcessor;
+        service("ApplicationMgr", eventProcessor);
+        eventProcessor->stopRun();
+      }
     }
   }
   evt = nullptr;
@@ -149,6 +158,7 @@ StatusCode LCIODataSvc::readCollection(const std::string& collName, int collecti
 //    LCIO2Plcio::setLCIOMCParticleCollection(mcpcol_lc);
 //    LCIO2Plcio::setPlcioMCParticleCollection(mcpcol_pl);
 //  }
+  cvtor.setCollName(collName);
   collection = cvtor.Convertor_getPlcio( lc_col );
   pl_evtcol->at(0)->addCollectionName(collName);
   pl_evtcol->at(0)->addCollectionType(TypeName);
-- 
GitLab