15 #include <unordered_map>
18 #ifndef _INTERACTIONTREE_
19 #define _INTERACTIONTREE_
28 std::vector<TreeNode *> children;
38 void AddHit(
int trackID, T hit);
39 void AddNode(
int trackID,
int parentID);
40 void SortHits(
bool (*f)(T, T));
42 void Clear() { hashMap.clear(); };
46 std::unordered_map<int, TreeNode<T> *> hashMap;
49 typedef typename std::unordered_map<int, TreeNode<T> *>::iterator UOMIterator;
58 std::vector<T>().swap(hits);
67 if (hashMap.find(trackID) == hashMap.end())
68 AddNode(trackID, hit->parentID);
70 hashMap[trackID]->hits.push_back(hit);
75 std::pair<UOMIterator, bool> mapResult;
77 if (hashMap.find(parentID) == hashMap.end()) {
79 mapResult = hashMap.insert(std::make_pair(parentID, parentnode));
83 hashMap[parentID]->children.push_back(childnode);
84 hashMap.insert(std::make_pair(trackID, childnode));
89 for (std::pair<
int,
TreeNode<T> *> element : hashMap) {
90 std::sort(element.second->hits.begin(), element.second->hits.end(), order);
96 for (std::pair<
int,
TreeNode<T> *> element : hashMap) {
97 std::cout <<
"trackID " << element.first <<
" has " << element.second->children.size() <<
" children" << std::endl;
98 for (
int ic = 0; ic < element.second->children.size(); ic++) {
99 std::cout <<
" - " << element.second->children[ic]->trackID << std::endl;
100 for (
int ihit = 0; ihit < element.second->children[ic]->hits.size(); ihit++) {
101 std::cout <<
" --- " << element.second->children[ic]->hits[ihit]->particlePdg <<
" "
102 << element.second->children[ic]->hits[ihit]->time <<
" "
103 << element.second->children[ic]->hits[ihit]->eDep <<
" ";
104 std::cout <<
"(" << element.second->children[ic]->hits[ihit]->entrancePoint[0] <<
", ";
105 std::cout << element.second->children[ic]->hits[ihit]->entrancePoint[1] <<
", ";
106 std::cout << element.second->children[ic]->hits[ihit]->entrancePoint[2] <<
") -> ";
107 std::cout <<
"(" << element.second->children[ic]->hits[ihit]->exitPoint[0] <<
", ";
108 std::cout << element.second->children[ic]->hits[ihit]->exitPoint[1] <<
", ";
109 std::cout << element.second->children[ic]->hits[ihit]->exitPoint[2] <<
")";
110 std::cout << std::endl;