KaliVeda
Toolkit for HIC analysis
KVTreeVectorBranchHandler.h
1 #pragma once
2 
38 #include <vector>
39 #include <unordered_map>
40 #include "TTree.h"
41 
43 {
44  template<typename U>
45  class my_vector
46  {
47  std::vector<U> _data;
48  public:
49  my_vector& operator=(const my_vector&) = delete;
50  my_vector& operator=(my_vector&&) = delete;
51  void operator=(U u)
52  {
53  _data.push_back(u);
54  }
55  std::vector<U>& get_vec_ref()
56  {
57  return _data;
58  }
59  };
60  template<typename T>
61  using particle_vector = std::unordered_map<std::string,my_vector<T>>;
62  template<typename T>
63  std::reference_wrapper<particle_vector<T>> get_vectors()
64  {
65  return std::ref(particle_vector<T>{});
66  }
67  template<typename T>
68  void clear_all_vectors()
69  {
70  for(auto &v : get_vectors<T>().get())
71  {
72  v.second.get_vec_ref().clear();
73  }
74  }
75  particle_vector<bool> bool_vectors;
76  particle_vector<int> int_vectors;
77  particle_vector<float> float_vectors;
78  particle_vector<double> double_vectors;
79  particle_vector<std::string> string_vectors;
80 
81  public:
82 
96  template<typename VarType>
97  void AddVectorBranch(TTree* t, const std::string& var)
98  {
99  t->Branch(var.c_str(), &get_vectors<VarType>().get()[var].get_vec_ref());
100  }
101 
106  {
107  clear_all_vectors<bool>();
108  clear_all_vectors<int>();
109  clear_all_vectors<double>();
110  clear_all_vectors<float>();
111  clear_all_vectors<std::string>();
112  }
127  template<typename VarType>
128  void FillVectorBranch(const std::string& var, VarType val)
129  {
130  get_vectors<VarType>().get()[var] = val;
131  }
132 };
133 
134 template<>
135 std::reference_wrapper<KVTreeVectorBranchHandler::particle_vector<bool>>
136 inline KVTreeVectorBranchHandler::get_vectors<bool>()
137 {
138  return bool_vectors;
139 }
140 template<>
141 std::reference_wrapper<KVTreeVectorBranchHandler::particle_vector<std::string>>
142 inline KVTreeVectorBranchHandler::get_vectors<std::string>()
143 {
144  return string_vectors;
145 }
146 template<>
147 std::reference_wrapper<KVTreeVectorBranchHandler::particle_vector<int>>
148 inline KVTreeVectorBranchHandler::get_vectors<int>()
149 {
150  return int_vectors;
151 }
152 template<>
153 std::reference_wrapper<KVTreeVectorBranchHandler::particle_vector<double>>
154 inline KVTreeVectorBranchHandler::get_vectors<double>()
155 {
156  return double_vectors;
157 }
158 template<>
159 std::reference_wrapper<KVTreeVectorBranchHandler::particle_vector<float>>
160 inline KVTreeVectorBranchHandler::get_vectors<float>()
161 {
162  return float_vectors;
163 }
Binding & operator=(OUT(*fun)(U0 u0))
Facilitate use of std::vector branches in data analysis.
void FillVectorBranch(const std::string &var, VarType val)
void AddVectorBranch(TTree *t, const std::string &var)
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
v