Skip to content
Snippets Groups Projects
LCIO2Plcio.cpp 22.5 KiB
Newer Older
#include "LCIO2Plcio.h"

#include "lcio.h"
#include "EVENT/LCCollection.h" 
#include "plcio/MCParticle.h"
#include "plcio/MCParticleConst.h"
#include "plcio/MCParticleCollection.h"
#include "plcio/LCRunHeader.h"
#include "plcio/LCRunHeaderCollection.h"
#include "EVENT/MCParticle.h"

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);
}

template<typename T>
static plcio::DoubleThree DoubleThreeFROMConstPtr(const T* vpos){
  double tmp[3];
  for(unsigned i=0; i<3; i++)
    tmp[i] = vpos[i];
  return plcio::DoubleThree(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>("TrackerHit", Convertor_TrackerHit));
  map_cvt.insert(std::make_pair<std::string, fptr>("TPCHit", Convertor_TPCHit));
  map_cvt.insert(std::make_pair<std::string, fptr>("ReconstructedParticle", Convertor_ReconstructedParticle));
  map_cvt.insert(std::make_pair<std::string, fptr>("ParticleID", Convertor_ParticleID));
}
LCIO2Plcio::LCIO2Plcio(EVENT::LCCollection* collection){
  LCIO2Plcio();
}

podio::CollectionBase* LCIO2Plcio::Convertor_LCRunHeader(EVENT::LCCollection* lc_col){
  plcio::LCRunHeaderCollection* pl_col = new plcio::LCRunHeaderCollection();
Cao Guangjie's avatar
Cao Guangjie committed

  // Convert basic info from LCIO to plcio;
  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
      EVENT::LCRunHeader* lc_var = (EVENT::LCRunHeader*) lc_col->getElementAt(i) ;
      plcio::LCRunHeader pl_var = (plcio::LCRunHeader) pl_col->create();
      pl_var.setRunNumber( lc_var->getRunNumber() );
      pl_var.setDetectorName( lc_var->getDetectorName() );
      pl_var.setDescription( lc_var->getDescription() );
      
      std::vector<std::string> vec_dct = *(lc_var->getActiveSubdetectors());
      for( unsigned j=0,N=vec_dct.size(); j<N; j++){
        pl_var.addActiveSubdetector( vec_dct[j] );
      }
  }
Cao Guangjie's avatar
Cao Guangjie committed
void LCIO2Plcio::setMCParticle(EVENT::MCParticle* lc_var, plcio::MCParticle& pl_var){

  pl_var.setPDG( lc_var->getPDG() );
  pl_var.setGeneratorStatus( lc_var->getGeneratorStatus() );
  pl_var.setSimulatorStatus( lc_var->getSimulatorStatus() );
  pl_var.setCharge( lc_var->getCharge() );
  pl_var.setTime( lc_var->getTime() );
  pl_var.setMass( lc_var->getMass() );
  pl_var.setStopped( lc_var->isStopped() );
  pl_var.setOverlay( lc_var->isOverlay() );
  pl_var.setBackscatter( lc_var->isBackscatter() );
  pl_var.setDecayedInTracker( lc_var->isDecayedInTracker() );
  pl_var.setDecayedInCalorimeter( lc_var->isDecayedInCalorimeter() );
  pl_var.setCreatedInSimulation( lc_var->isCreatedInSimulation() );
  pl_var.setVertexIsNotEndpointOfParent( lc_var->vertexIsNotEndpointOfParent() );
  pl_var.setHasLeftDetector( lc_var->hasLeftDetector() );

  pl_var.setSpin( plcio::FloatThree( lc_var->getSpin() ) );
  pl_var.setColorFlow( plcio::IntTwo( lc_var->getColorFlow() ) );
  pl_var.setVertex( plcio::DoubleThree( lc_var->getVertex()));
  pl_var.setEndpoint( plcio::DoubleThree( lc_var->getEndpoint() ) );
  pl_var.setMomentum( FloatThreeFROMConstPtr(lc_var->getMomentum()) );
  pl_var.setMomentumAtEndpoint( FloatThreeFROMConstPtr(lc_var->getMomentumAtEndpoint()) );
}

podio::CollectionBase* LCIO2Plcio::Convertor_MCParticle(EVENT::LCCollection* lc_col){
  plcio::MCParticleCollection* pl_col = new plcio::MCParticleCollection();

  // Convert basic info from LCIO to plcio;
  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
Cao Guangjie's avatar
Cao Guangjie committed
      EVENT::MCParticle* lc_var = (EVENT::MCParticle*) lc_col->getElementAt(i) ;
      plcio::MCParticle pl_var = (plcio::MCParticle) pl_col->create();
Cao Guangjie's avatar
Cao Guangjie committed
      setMCParticle(lc_var, pl_var);
      // dealing each of 'Parents' of lcio::MCParticle ;
Cao Guangjie's avatar
Cao Guangjie committed
      const MCParticleVec& veclc = lc_var->getParents();
      for(unsigned j=0; j<veclc.size(); j++){
        EVENT::MCParticle* vlcreg = veclc[j];
        for(unsigned k=0; k<i; ++k){
          if(((EVENT::MCParticle*) lc_col->getElementAt(k)) == vlcreg){
            // A loop for plcio's MCParticleCollection to recover plcio's relationship;
Cao Guangjie's avatar
Cao Guangjie committed
            plcio::MCParticle mcprt = pl_col->at(k);
            pl_var.addParent(mcprt);
            mcprt.addDaughter(pl_var);        
	  }
	}
      }
  }
  return pl_col;
}

podio::CollectionBase* LCIO2Plcio::Convertor_SimTrackerHit(EVENT::LCCollection* lc_col){
  plcio::SimTrackerHitCollection* pl_col = new plcio::SimTrackerHitCollection();

  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
Cao Guangjie's avatar
Cao Guangjie committed
    EVENT::SimTrackerHit* lc_var = (EVENT::SimTrackerHit*) lc_col->getElementAt(i) ;
    plcio::SimTrackerHit pl_var = (plcio::SimTrackerHit) pl_col->create();

    pl_var.setCellID0( lc_var->getCellID0() );
    pl_var.setCellID1( lc_var->getCellID1() );
    pl_var.setEDep( lc_var->getEDep() );
    pl_var.setTime( lc_var->getTime() );
    pl_var.setPathLength( lc_var->getPathLength() );
    pl_var.setQuality( lc_var->getQuality() );
    pl_var.setPosition( lc_var->getPosition() );
    pl_var.setMomentum( lc_var->getMomentum() );
    pl_var.setOverlay( lc_var->isOverlay() );
    pl_var.setProducedBySecondary( lc_var->isProducedBySecondary() );

    // Looping the LCIO::MCParticleCollection to pick Particle for Hits;
    CollectionsVec vec_mcp;
    vec_mcp = map_cols["MCParticle"];
    EVENT::LCCollection* hitcol_lc = (EVENT::LCCollection*) vec_mcp[0].first;
    plcio::MCParticleCollection* hitcol_pl = (plcio::MCParticleCollection*) vec_mcp[0].second;

    int index = -1;
    // search corresponding MCParticleCollection*;
Cao Guangjie's avatar
Cao Guangjie committed
    EVENT::MCParticle* mcptr_reg = lc_var->getMCParticle();
    for( unsigned j=0, M=hitcol_lc->getNumberOfElements(); j<M; ++j){
      EVENT::MCParticle* mcpin_lc = (EVENT::MCParticle*) hitcol_lc->getElementAt(j);
      if( mcpin_lc == mcptr_reg ){
	index = j;
      }
    }
//    if( index != -1) lp_info("Cedar: Convertor SimTrackerHit Success.");
    bool is_empty = false;
    if( index == -1){
      if(mcptr_reg == nullptr) is_empty = true;
//      lp_info("Convertor SimTrackerHit Problem.");
//      printf("LCCollection size: %d\n", hitcol_lc->getNumberOfElements());
//      printf("MCParticleCollection size: %d\n", hitcol_pl->size());
//      printf("Index: %d\n", index);
    }
    if( is_empty == false )
Cao Guangjie's avatar
Cao Guangjie committed
      pl_var.setMCParticle( hitcol_pl->at(index) );

  }
  return pl_col;
}

podio::CollectionBase* LCIO2Plcio::Convertor_SimCalorimeterHit(EVENT::LCCollection* lc_col){
  plcio::SimCalorimeterHitCollection* pl_col = new plcio::SimCalorimeterHitCollection();

  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
Cao Guangjie's avatar
Cao Guangjie committed
    EVENT::SimCalorimeterHit* lc_var = (EVENT::SimCalorimeterHit*) lc_col->getElementAt(i);
    plcio::SimCalorimeterHit pl_var = (plcio::SimCalorimeterHit) pl_col->create();

    pl_var.setCellID0( lc_var->getCellID0() );
    pl_var.setCellID1( lc_var->getCellID1() );
    pl_var.setEnergy( lc_var->getEnergy() );
    pl_var.setPosition( FloatThreeFROMConstPtr(lc_var->getPosition()) );
Cao Guangjie's avatar
Cao Guangjie committed

    // converting from lc_var to pl_var on the contribution variables;
    for( unsigned j=0, N=lc_var->getNMCContributions(); j<N; j++){
      plcio::ConstCaloHitContribution tmp(
Cao Guangjie's avatar
Cao Guangjie committed
	lc_var->getPDGCont(j), lc_var->getEnergyCont(j),
	lc_var->getTimeCont(j), FloatThreeFROMConstPtr(lc_var->getStepPosition(j)) 
Cao Guangjie's avatar
Cao Guangjie committed
      pl_var.addContribution( tmp );
    }
  }
  return pl_col;
}

podio::CollectionBase* LCIO2Plcio::Convertor_Cluster(EVENT::LCCollection* lc_col){
  plcio::ClusterCollection* pl_col = new plcio::ClusterCollection();

  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 = (plcio::Cluster) pl_col->create();

    pl_var.setType(lc_var->getType());
    pl_var.setEnergy(lc_var->getEnergy());
    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()) );
    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] );
    }

    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));
// QUEST::isAvailable dows not analyze;
podio::CollectionBase* LCIO2Plcio::Convertor_ParticleID(EVENT::LCCollection* lc_col){
  plcio::ParticleIDCollection* pl_col = new plcio::ParticleIDCollection();

  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
    EVENT::ParticleID* lc_var = (EVENT::ParticleID*) lc_col->getElementAt(i);
    plcio::ParticleID pl_var = (plcio::ParticleID) pl_col->create();

    pl_var.setType( lc_var->getType() );
    pl_var.setPDG( lc_var->getPDG() );
    pl_var.setAlgorythmType( lc_var->getAlgorithmType() );
    pl_var.setLikelihood( lc_var->getLikelihood() );
    EVENT::FloatVec vec_float = lc_var->getParameters();
    for(unsigned j=0; j<vec_float.size(); j++){
      pl_var.addParameter(vec_float[j]);
    }
  }
  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();
Cao Guangjie's avatar
Cao Guangjie committed
    for(unsigned j=0; j<6; 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()
    ) );

    //pl_var.setParticleIDUsed( lc_var->getParticleIDUsed() );
    EVENT::ParticleID* lc_locx = lc_var->getParticleIDUsed();
    CollectionsVec vec_cols = map_cols["ParticleID"];
    EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
    plcio::ParticleIDCollection* pl_mapcol = (plcio::ParticleIDCollection*)vec_cols[0].second;
    for(unsigned k=0, LCsize=lc_mapcol->getNumberOfElements(); k<LCsize; k++){
      if(lc_locx == lc_mapcol->getElementAt(k))
        pl_var.setParticleIDUsed(pl_mapcol->at(k));
    }
    
    std::vector<EVENT::Cluster*> vec_clust = lc_var->getClusters();
    for(unsigned j=0; j<vec_clust.size(); j++){
      CollectionsVec vec_cols = map_cols["Cluster"];
      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
      plcio::ClusterCollection* pl_mapcol = (plcio::ClusterCollection*)vec_cols[0].second;
      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++){
        if( vec_clust[j] == lc_mapcol->getElementAt(k) )
          pl_var.addCluster( pl_mapcol->at(k) );
      }
    //pl_var.addTrack();
    EVENT::TrackVec vec_track = lc_var->getTracks();
    for(unsigned j=0; j<vec_track.size(); j++){
      CollectionsVec vec_cols = map_cols["Track"];
      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
      plcio::TrackCollection* pl_mapcol = (plcio::TrackCollection*)vec_cols[0].second;

      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++)
        if(vec_track[j] == lc_mapcol->getElementAt(k))
          pl_var.addTrack(pl_mapcol->at(k));
    //pl_var.addParticleID( lc->getParticleIDs);
    EVENT::ParticleIDVec vec_ParticleID = lc_var->getParticleIDs();
    for(unsigned j=0; j<vec_ParticleID.size(); j++){
      CollectionsVec vec_cols = map_cols["ParticleID"];
      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
      plcio::ParticleIDCollection* pl_mapcol = (plcio::ParticleIDCollection*)vec_cols[0].second;

      for(unsigned k=0,M=lc_mapcol->getNumberOfElements(); k<M; k++){
        if(vec_ParticleID[j] == lc_mapcol->getElementAt(k))
          pl_var.addParticleID( pl_mapcol->at(k) );
      }
    }
  }
  //pl_var.addParticle();
  for(unsigned i=0, N=lc_col->getNumberOfElements(); i<N; i++){
    EVENT::ReconstructedParticle* lc_var = (EVENT::ReconstructedParticle*)lc_col->getElementAt(i);
    EVENT::ReconstructedParticleVec vec_RecPtc = lc_var->getParticles();

    for(unsigned j=0; j<vec_RecPtc.size(); j++){
      for(unsigned k=0, M=lc_col->getNumberOfElements(); k<M; k++){
        if(vec_RecPtc[j] == lc_col->getElementAt(k))
          pl_col->at(i).addParticle( pl_col->at(k) );
      }
    }
  }

  return pl_col;
}

podio::CollectionBase* LCIO2Plcio::Convertor_TrackerHit(EVENT::LCCollection* lc_col){
  plcio::TrackerHitCollection* pl_col = new plcio::TrackerHitCollection();
  
  for(unsigned i=0,N=lc_col->getNumberOfElements(); i<N; i++){
    EVENT::TrackerHit* lc_var = (EVENT::TrackerHit*) lc_col->getElementAt(i);
    plcio::TrackerHit  pl_var = (plcio::TrackerHit) pl_col->create();
    
    pl_var.setCellID0(lc_var->getCellID0());
    pl_var.setCellID1(lc_var->getCellID1());

    pl_var.setType(lc_var->getType());
    pl_var.setQuality(lc_var->getQuality());
    pl_var.setTime(lc_var->getTime());
    pl_var.setEDep(lc_var->getEDep());
    pl_var.setEDepError(lc_var->getEDepError());
    pl_var.setEdx(lc_var->getdEdx());
    pl_var.setPosition( DoubleThreeFROMConstPtr(lc_var->getPosition()));
    pl_var.setCovMatrix( vec6_2_arr6(lc_var->getCovMatrix()));
  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() );
    //rely on TrackerHits collection;
    //corresoponding with TrackerHit collection; 
    EVENT::TrackerHitVec lcio_seq1 = lc_var->getTrackerHits();
    for(unsigned j=0; j<lcio_seq1.size(); j++){
      EVENT::TrackerHit* lc_locx = lcio_seq1[j];
      CollectionsVec vec_cols = map_cols["TrackerHit"];
      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
      plcio::TrackerHitCollection* pl_mapcol = (plcio::TrackerHitCollection*) vec_cols[0].second;

      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++){
        if( lc_locx == lc_mapcol->getElementAt(k) )
          pl_var.addTrackerHit( pl_mapcol->at(k) );
      } 
    }

    //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->getTrackStates() );
    EVENT::TrackStateVec lcio_seq3 = lc_var->getTrackStates();
    for(unsigned j=0; j<lcio_seq3.size(); j++){
      EVENT::TrackState* lc_locx = lcio_seq3[j];
      std::array<float, 15> tmp_covM;
      for(unsigned k=0; k<15; k++){
        tmp_covM[k] = lc_locx->getCovMatrix()[k];
      }
      plcio::TrackState tmp;
      tmp.D0 = lc_locx->getD0();
      tmp.Z0 = lc_locx->getZ0();
      tmp.covMatrix = tmp_covM; 
      tmp.location = lc_locx->getLocation();
      tmp.omega = lc_locx->getOmega();
      tmp.phi = lc_locx->getPhi();
      tmp.referencePoint = FloatThreeFROMConstPtr( lc_locx->getReferencePoint() );
      tmp.tanLambda = lc_locx->getTanLambda();
      pl_var.addTrackState( tmp );
    }
  }

  //pl_var.( lc_var->getTracks() );
  for(unsigned i=0; i<lc_col->getNumberOfElements(); i++){
    EVENT::Track* lc_var = (EVENT::Track*)lc_col->getElementAt(i);
    EVENT::TrackVec lcio_seq2 = lc_var->getTracks();

    for(unsigned j=0; j<lcio_seq2.size(); j++){
      EVENT::Track* lc_locx = lcio_seq2[j];
      for(unsigned k=0; k<lc_col->getNumberOfElements(); k++){
        if( lc_locx == lc_col->getElementAt(k) )
          pl_col->at(i).addTrack(pl_col->at(k));
      }
Cao Guangjie's avatar
Cao Guangjie committed
podio::CollectionBase* LCIO2Plcio::Convertor_Vertex(EVENT::LCCollection* lc_col){
  plcio::VertexCollection* pl_col = new plcio::VertexCollection();

  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
    EVENT::Vertex* lc_var = (EVENT::Vertex*) lc_col->getElementAt(i);
    plcio::Vertex pl_var = (plcio::Vertex) pl_col->create();
  
    // Quest: data.primary is an int value, set by boolean number;
    pl_var.setPrimary( lc_var->isPrimary() );
    pl_var.setChi2( lc_var->getChi2() );
    pl_var.setProbability( lc_var->getProbability() );

    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> vec_pra = lc_var->getParameters();
    for( unsigned j=0,M=vec_pra.size(); j<M; j++){
      pl_var.addParameter(vec_pra[j]);
    }

    // convert string into int(type code);
//    pl_var.setAlgorithmType( lc_var->getAlgorithmType() );
//    pl_var.setCovMatrix( lc_var->() );
//    pl_var.setAssociatedParticle( lc_var->() );
  }
  return pl_col;
}

podio::CollectionBase* LCIO2Plcio::Convertor_TPCHit(EVENT::LCCollection* lc_col){
  plcio::TPCHitCollection* pl_col = new plcio::TPCHitCollection();

  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
    EVENT::TPCHit* lc_var = (EVENT::TPCHit*) lc_col->getElementAt(i);
    plcio::TPCHit pl_var = (plcio::TPCHit) pl_col->create();

    pl_var.setCellID(lc_var->getCellID());
    pl_var.setTime(lc_var->getTime());
    pl_var.setCharge(lc_var->getCharge());
    pl_var.setQuality(lc_var->getQuality());

    for( unsigned j=0,M=lc_var->getNRawDataWords(); j<M; j++){
      pl_var.addRawDataWord(lc_var->getRawDataWord(j));
    }
  }
  return pl_col;
}

bool LCIO2Plcio::isReady(const std::string& TypeName){
  if( TypeName == "SimTrackerHit" ){
    std::vector<std::string>::iterator it = find(
                  vec_Types.begin(), vec_Types.end(), "MCParticle"
    );
    if( it != vec_Types.end() )
      return true;
  }
  return false;
}

podio::CollectionBase* LCIO2Plcio::Convertor_getPlcio(EVENT::LCCollection* lc_col){

  podio::CollectionBase* collection(nullptr);
  TypeName = lc_col->getTypeName();

//  lp_info("Converting "+TypeName);
  bool ready = true; 
  if( !ready ){
    lp_info("Not ready yet.");
    lp_info("Please put MCParticle firstly in the python file, Please");
    return nullptr;
  }

  fptr fp;
  if( map_cvt.find(TypeName) == map_cvt.end()){
    lp_info("unrecognized "+TypeName);
  }else{
    fp = *map_cvt[TypeName];
  }

  fp = *map_cvt[TypeName];
  collection = fp(lc_col);

// maintain map<TypeName, CollVec>;
    map_cols[TypeName].push_back(
      std::pair<EVENT::LCCollection*, podio::CollectionBase*>(lc_col, collection)
    );

//  lp_info("done.");
  return collection;
}