Skip to content
Snippets Groups Projects
Navagation.cpp 2.4 KiB
Newer Older
#include "DataHelper/Navagation.h"

#include "edm4hep/SimTrackerHit.h"
#include "edm4hep/TrackerHit.h"

Navagation* Navagation::m_fNavagation = nullptr;

Navagation* Navagation::Instance(){
  if(!m_fNavagation) m_fNavagation = new Navagation();
  return m_fNavagation;
}

Navagation::Navagation(){
}

Navagation::~Navagation(){
}

void Navagation::Initialize(){
  m_hitColVec.clear();
  m_assColVec.clear();
  for(std::map<int, edm4hep::TrackerHit*>::iterator it=m_trkHits.begin();it!=m_trkHits.end();it++){
    delete it->second;
  }
  m_trkHits.clear();
}

edm4hep::TrackerHit* Navagation::GetTrackerHit(const edm4hep::ObjectID& obj_id, bool delete_by_caller){
  int id = obj_id.collectionID * 10000000 + obj_id.index;
  if(!delete_by_caller){
    if(m_trkHits.find(id)!=m_trkHits.end()) return m_trkHits[id];
  }
  /*
  for(int i=0;i<m_assColVec.size();i++){
    for(auto ass : *m_assColVec[i]){
      edm4hep::ObjectID rec_id = ass.getRec().getObjectID();
      if(rec_id.collectionID!=id.collectionID)break;
      else if(rec_id.index==id.index){
	m_trkHits.push_back(ass.getRec());
	return &(m_trkHits.back());
      }
    }
  }
  */
  for(int i=0;i<m_hitColVec.size();i++){
    for(auto hit : *m_hitColVec[i]){
      edm4hep::ObjectID this_id = hit.getObjectID();
      if(this_id.collectionID!=obj_id.collectionID)break;
      else if(this_id.index==obj_id.index){
	edm4hep::TrackerHit* hit_copy = new edm4hep::TrackerHit(hit);
	if(!delete_by_caller) m_trkHits[id] = hit_copy;
	return hit_copy;//&(m_trkHits[id]);
      }
    }
  }
  
  throw std::runtime_error("Not found TrackerHit");
}

std::vector<edm4hep::ConstSimTrackerHit> Navagation::GetRelatedTrackerHit(const edm4hep::ObjectID& id){
  std::vector<edm4hep::ConstSimTrackerHit> hits;
  for(int i=0;i<m_assColVec.size();i++){
    for(auto ass : *m_assColVec[i]){
      edm4hep::ObjectID this_id = ass.getRec().getObjectID();
      if(this_id.collectionID!=id.collectionID)break;
      else if(this_id.index==id.index) hits.push_back(ass.getSim()); 
    }
  }
  return hits;
}

std::vector<edm4hep::ConstSimTrackerHit> Navagation::GetRelatedTrackerHit(const edm4hep::TrackerHit& hit){
  std::vector<edm4hep::ConstSimTrackerHit> hits;
  for(int i=0;i<m_assColVec.size();i++){
    for(auto ass : *m_assColVec[i]){
      if(ass.getRec().getObjectID().collectionID != hit.getObjectID().collectionID) break;
      else if(ass.getRec()==hit) hits.push_back(ass.getSim());
    }
  }
  return hits;
}