HighLAND
OutputManager.cxx
1 #include "OutputManager.hxx"
2 #include <TDirectory.h>
3 #include <TList.h>
4 #include <sstream>
5 #include <stdlib.h>
6 #include <algorithm>
7 
8 //********************************************************************
9 OutputManager::OutputManager():TreeManager(){
10 //********************************************************************
11 
12  _default_docstring="No documentation was specified for this variable";
13  _toy_index=0;
14 
15  _tree_vars_counter_size.resize(NMAXTREES);
16  _link_var_to_counter.resize(NMAXTREES);
17 
18 
19  _tree_vars_counter.resize(NMAXTREES);
20 
21  _tree_vars_float.resize(NMAXTREES);
22  _tree_vars_double.resize(NMAXTREES);
23  _tree_vars_int.resize(NMAXTREES);
24  _tree_vars_char.resize(NMAXTREES);
25 
26  _tree_vars_float_vector.resize(NMAXTREES);
27  _tree_vars_double_vector.resize(NMAXTREES);
28  _tree_vars_int_vector.resize(NMAXTREES);
29  _tree_vars_char_vector.resize(NMAXTREES);
30 
31  _tree_vars_float_matrix.resize(NMAXTREES);
32  _tree_vars_double_matrix.resize(NMAXTREES);
33  _tree_vars_int_matrix.resize(NMAXTREES);
34  _tree_vars_char_matrix.resize(NMAXTREES);
35 
36  _tree_vars_float_3Dmatrix.resize(NMAXTREES);
37  _tree_vars_double_3Dmatrix.resize(NMAXTREES);
38  _tree_vars_int_3Dmatrix.resize(NMAXTREES);
39 
40  _tree_vars_all_vars.resize(NMAXTREES);
41  _tree_vars_all_counters.resize(NMAXTREES);
42 
43 
44  _tree_vars_used_counter.resize(NMAXTREES);
45 
46  _tree_vars_used_float.resize(NMAXTREES);
47  _tree_vars_used_double.resize(NMAXTREES);
48  _tree_vars_used_int.resize(NMAXTREES);
49  _tree_vars_used_char.resize(NMAXTREES);
50 
51  _tree_vars_used_float_vector.resize(NMAXTREES);
52  _tree_vars_used_double_vector.resize(NMAXTREES);
53  _tree_vars_used_int_vector.resize(NMAXTREES);
54  _tree_vars_used_char_vector.resize(NMAXTREES);
55 
56  _tree_vars_used_float_matrix.resize(NMAXTREES);
57  _tree_vars_used_double_matrix.resize(NMAXTREES);
58  _tree_vars_used_int_matrix.resize(NMAXTREES);
59  _tree_vars_used_char_matrix.resize(NMAXTREES);
60 
61  _tree_vars_used_float_3Dmatrix.resize(NMAXTREES);
62  _tree_vars_used_double_3Dmatrix.resize(NMAXTREES);
63  _tree_vars_used_int_3Dmatrix.resize(NMAXTREES);
64 
65 
66  _tree_vars_exist_float.resize(NMAXTREES);
67  _tree_vars_exist_double.resize(NMAXTREES);
68  _tree_vars_exist_int.resize(NMAXTREES);
69  _tree_vars_exist_char.resize(NMAXTREES);
70 
71  _tree_vars_exist_float_vector.resize(NMAXTREES);
72  _tree_vars_exist_double_vector.resize(NMAXTREES);
73  _tree_vars_exist_int_vector.resize(NMAXTREES);
74  _tree_vars_exist_char_vector.resize(NMAXTREES);
75 
76  _tree_vars_exist_float_matrix.resize(NMAXTREES);
77  _tree_vars_exist_double_matrix.resize(NMAXTREES);
78  _tree_vars_exist_int_matrix.resize(NMAXTREES);
79  _tree_vars_exist_char_matrix.resize(NMAXTREES);
80 
81  _tree_vars_exist_float_3Dmatrix.resize(NMAXTREES);
82  _tree_vars_exist_double_3Dmatrix.resize(NMAXTREES);
83  _tree_vars_exist_int_3Dmatrix.resize(NMAXTREES);
84 
85 
86 
87  _single_tree_fill = -1;
88 
89 }
90 
91 //********************************************************************
92 OutputManager::~OutputManager() {
93 //********************************************************************
94  UInt_t tree_index = 0;
95  for (std::vector<TTree*>::iterator treeit = _trees.begin(); treeit != _trees.end(); treeit++, tree_index++) {
96 
97  std::vector<int_vector*>::iterator it_int_vector;
98  for (it_int_vector = _tree_vars_int_vector[tree_index].begin(); it_int_vector != _tree_vars_int_vector[tree_index].end(); it_int_vector++)
99  { delete *it_int_vector; }
100 
101  std::vector<double_vector*>::iterator it_double_vector;
102  for (it_double_vector = _tree_vars_double_vector[tree_index].begin(); it_double_vector != _tree_vars_double_vector[tree_index].end(); it_double_vector++)
103  { delete *it_double_vector; }
104 
105  std::vector<float_vector*>::iterator it_float_vector;
106  for (it_float_vector = _tree_vars_float_vector[tree_index].begin(); it_float_vector != _tree_vars_float_vector[tree_index].end(); it_float_vector++)
107  { delete *it_float_vector; }
108 
109  std::vector<char_vector*>::iterator it_char_vector;
110  for (it_char_vector = _tree_vars_char_vector[tree_index].begin(); it_char_vector != _tree_vars_char_vector[tree_index].end(); it_char_vector++)
111  { delete *it_char_vector; }
112 
113 
114  std::vector<int_matrix*>::iterator it_int_matrix;
115  for (it_int_matrix = _tree_vars_int_matrix[tree_index].begin(); it_int_matrix != _tree_vars_int_matrix[tree_index].end(); it_int_matrix++)
116  { delete *it_int_matrix; }
117 
118  std::vector<double_matrix*>::iterator it_double_matrix;
119  for (it_double_matrix = _tree_vars_double_matrix[tree_index].begin(); it_double_matrix != _tree_vars_double_matrix[tree_index].end(); it_double_matrix++)
120  { delete *it_double_matrix; }
121 
122  std::vector<float_matrix*>::iterator it_float_matrix;
123  for (it_float_matrix = _tree_vars_float_matrix[tree_index].begin(); it_float_matrix != _tree_vars_float_matrix[tree_index].end(); it_float_matrix++)
124  { delete *it_float_matrix; }
125 
126  std::vector<char_matrix*>::iterator it_char_matrix;
127  for (it_char_matrix = _tree_vars_char_matrix[tree_index].begin(); it_char_matrix != _tree_vars_char_matrix[tree_index].end(); it_char_matrix++)
128  { delete *it_char_matrix; }
129 
130 
131  std::vector<int_3Dmatrix*>::iterator it_int_3Dmatrix;
132  for (it_int_3Dmatrix = _tree_vars_int_3Dmatrix[tree_index].begin(); it_int_3Dmatrix != _tree_vars_int_3Dmatrix[tree_index].end(); it_int_3Dmatrix++)
133  { delete *it_int_3Dmatrix; }
134 
135  std::vector<double_3Dmatrix*>::iterator it_double_3Dmatrix;
136  for (it_double_3Dmatrix = _tree_vars_double_3Dmatrix[tree_index].begin(); it_double_3Dmatrix != _tree_vars_double_3Dmatrix[tree_index].end(); it_double_3Dmatrix++)
137  { delete *it_double_3Dmatrix; }
138 
139  std::vector<float_3Dmatrix*>::iterator it_float_3Dmatrix;
140  for (it_float_3Dmatrix = _tree_vars_float_3Dmatrix[tree_index].begin(); it_float_3Dmatrix != _tree_vars_float_3Dmatrix[tree_index].end(); it_float_3Dmatrix++)
141  { delete *it_float_3Dmatrix; }
142 
143  }
144 }
145 
146 //**************************************************
147 void OutputManager::AddTreeWithName(Int_t tree_index, const std::string& name, TTree* tree){
148 //**************************************************
149 
150  // add the TTree with this name
151  if (_file)
152  _file->cd();
153 
154  if (tree){
155  _trees[tree_index] = tree->CloneTree(0);
156  _trees[tree_index]->SetTitle(GetString(tree_index).c_str());
157  }
158  else
159  _trees[tree_index] = new TTree(name.c_str(),GetString(tree_index).c_str());
160 
161  _trees_indices.push_back(tree_index);
162  _trees_nonull.push_back(_trees[tree_index]);
163 
164  if (!_file)
165  _trees[tree_index]->SetDirectory(0);
166  _trees[tree_index]->SetAutoSave(10000000);
167 
168 
169  _tree_vars_counter_size[tree_index].resize(NMAXTREEVARS);
170  _link_var_to_counter[tree_index].resize(NMAXTREEVARS);
171 
172  _tree_vars_counter[tree_index].resize(NMAXTREEVARS);
173 
174  _tree_vars_float[tree_index].resize(NMAXTREEVARS);
175  _tree_vars_double[tree_index].resize(NMAXTREEVARS);
176  _tree_vars_int[tree_index].resize(NMAXTREEVARS);
177  _tree_vars_char[tree_index].resize(NMAXTREEVARS);
178 
179  _tree_vars_float_vector[tree_index].resize(NMAXTREEVARS);
180  _tree_vars_double_vector[tree_index].resize(NMAXTREEVARS);
181  _tree_vars_int_vector[tree_index].resize(NMAXTREEVARS);
182  _tree_vars_char_vector[tree_index].resize(NMAXTREEVARS);
183 
184  _tree_vars_float_matrix[tree_index].resize(NMAXTREEVARS);
185  _tree_vars_double_matrix[tree_index].resize(NMAXTREEVARS);
186  _tree_vars_int_matrix[tree_index].resize(NMAXTREEVARS);
187  _tree_vars_char_matrix[tree_index].resize(NMAXTREEVARS);
188 
189  _tree_vars_float_3Dmatrix[tree_index].resize(NMAXTREEVARS);
190  _tree_vars_double_3Dmatrix[tree_index].resize(NMAXTREEVARS);
191  _tree_vars_int_3Dmatrix[tree_index].resize(NMAXTREEVARS);
192 
193 
194 
195  _tree_vars_exist_float[tree_index].resize(NMAXTREEVARS);
196  _tree_vars_exist_double[tree_index].resize(NMAXTREEVARS);
197  _tree_vars_exist_int[tree_index].resize(NMAXTREEVARS);
198  _tree_vars_exist_char[tree_index].resize(NMAXTREEVARS);
199 
200  _tree_vars_exist_float_vector[tree_index].resize(NMAXTREEVARS);
201  _tree_vars_exist_double_vector[tree_index].resize(NMAXTREEVARS);
202  _tree_vars_exist_int_vector[tree_index].resize(NMAXTREEVARS);
203  _tree_vars_exist_char_vector[tree_index].resize(NMAXTREEVARS);
204 
205  _tree_vars_exist_float_matrix[tree_index].resize(NMAXTREEVARS);
206  _tree_vars_exist_double_matrix[tree_index].resize(NMAXTREEVARS);
207  _tree_vars_exist_int_matrix[tree_index].resize(NMAXTREEVARS);
208  _tree_vars_exist_char_matrix[tree_index].resize(NMAXTREEVARS);
209 
210  _tree_vars_exist_float_3Dmatrix[tree_index].resize(NMAXTREEVARS);
211  _tree_vars_exist_double_3Dmatrix[tree_index].resize(NMAXTREEVARS);
212  _tree_vars_exist_int_3Dmatrix[tree_index].resize(NMAXTREEVARS);
213 
214 
215  for (UInt_t i=0;i<NMAXTREEVARS;i++){
216  _link_var_to_counter[tree_index][i]=-1;
217  _tree_vars_counter_size[tree_index][i]=-1;
218  }
219 
220  _tree_vars_all_vars[tree_index].resize(NMAXTREEVARS);
221  _tree_vars_all_counters[tree_index].resize(NMAXTREEVARS);
222 
223 
224  for (UInt_t i=0;i<NMAXTREEVARS;i++){
225  _tree_vars_all_vars[tree_index][i]="";
226  }
227 
228  for (UInt_t i=0;i<NMAXTREEVARS;i++){
229  _tree_vars_exist_float[tree_index][i]=false;
230  _tree_vars_exist_double[tree_index][i]=false;
231  _tree_vars_exist_int[tree_index][i]=false;
232  _tree_vars_exist_char[tree_index][i]=false;
233 
234  _tree_vars_exist_float_vector[tree_index][i]=false;
235  _tree_vars_exist_double_vector[tree_index][i]=false;
236  _tree_vars_exist_int_vector[tree_index][i]=false;
237  _tree_vars_exist_char_vector[tree_index][i]=false;
238 
239  _tree_vars_exist_float_matrix[tree_index][i]=false;
240  _tree_vars_exist_double_matrix[tree_index][i]=false;
241  _tree_vars_exist_int_matrix[tree_index][i]=false;
242  _tree_vars_exist_char_matrix[tree_index][i]=false;
243 
244  _tree_vars_exist_float_3Dmatrix[tree_index][i]=false;
245  _tree_vars_exist_double_3Dmatrix[tree_index][i]=false;
246  _tree_vars_exist_int_3Dmatrix[tree_index][i]=false;
247  }
248 
249 
250  SetCurrentTree(tree_index);
251 }
252 
253 
254 //**************************************************
255 bool OutputManager::IsSpecialTree(Int_t tree_index) {
256 //**************************************************
257 
258  return (tree_index < (Int_t)NMAXSPECIALTREES);
259 }
260 
261 
262 //********************************************************************
263 bool OutputManager::Initialize(){
264 //********************************************************************
265 
266  // this function is called before the event loop
267 
268  return true;
269 }
270 
271 //********************************************************************
272 bool OutputManager::InitializeEntry(){
273 //********************************************************************
274 
275  // this function is called at the beginning of each event
276  /*
277  std::map< std::string, std::map<std::string, int> >::iterator cit;
278  std::map<std::string, int>::iterator cit2;
279  for (cit= _tree_vars_int_var.begin();cit!=_tree_vars_int_var.end();cit++){
280  std::string name = cit->first;
281  for (cit2= _tree_vars_int_var[name].begin();cit2!=_tree_vars_int_var[name].end();cit2++){
282  cit2->second = 0;
283  }
284  }
285  */
286 #if 0
287  /*
288 
289  std::map< std::string, std::map<std::string, std::vector<Int_t>* > >::iterator vit;
290  std::map<std::string, std::vector<Int_t>* >::iterator vit2;
291  std::vector<Int_t>::iterator vit3;
292  for (vit= _tree_vars_int_vector_var.begin();vit!=_tree_vars_int_vector_var.end();vit++){
293  std::string name = vit->first;
294  for (vit2= _tree_vars_int_vector_var[name].begin();vit2!=_tree_vars_int_vector_var[name].end();vit2++){
295  std::string var = vit2->first;
296  _tree_vars_int_vector_var[name][var]->clear();
297 
298  }
299  }
300  */
301  /*
302 
303  std::map< std::string, std::map<std::string, std::vector<Double_t>* > >::iterator dvit;
304  std::map<std::string, std::vector<Double_t>* >::iterator dvit2;
305  std::vector<Double_t>::iterator dvit3;
306  for (dvit= _tree_vars_double_vector_var.begin();dvit!=_tree_vars_double_vector_var.end();dvit++){
307  std::string name = dvit->first;
308  for (dvit2= _tree_vars_double_vector_var[name].begin();dvit2!=_tree_vars_double_vector_var[name].end();dvit2++){
309  std::string var = dvit2->first;
310  _tree_vars_double_vector_var[name][var]->clear();
311  }
312  }
313  */
314 #endif
315 
316 
317  return true;
318 }
319 
320 //********************************************************************
321 void OutputManager::InitializeTrees(bool iniVars){
322 //********************************************************************
323 
324  for (UInt_t i= 0; i<_trees_indices.size();i++){
325  InitializeTree(_trees_indices[i], iniVars);
326  }
327 }
328 
329 //********************************************************************
330 void OutputManager::InitializeTree(Int_t tree_index, bool iniVars){
331 //********************************************************************
332 
333  // this function is called at the beginning of each tree
334 
335  _toyWeights.clear();
336 
337  std::vector<Int_t>::iterator it;
338  for (it= _tree_vars_used_counter[tree_index].begin();it!=_tree_vars_used_counter[tree_index].end();it++){
339  // initalize to 0 the counters with no defined size
340  InitializeCounter(tree_index,*it);
341  }
342 
343 
344  if (!iniVars) return;
345 
346  // this function is called at the beginning of each tree
347  for (it= _tree_vars_used_int[tree_index].begin();it!=_tree_vars_used_int[tree_index].end();it++)
348  _tree_vars_int[tree_index][*it]=-999;
349 
350  for (it= _tree_vars_used_double[tree_index].begin();it!=_tree_vars_used_double[tree_index].end();it++)
351  _tree_vars_double[tree_index][*it] = -999;
352 
353  for (it= _tree_vars_used_float[tree_index].begin();it!=_tree_vars_used_float[tree_index].end();it++)
354  _tree_vars_float[tree_index][*it] = -999;
355 
356 
357  for (it= _tree_vars_used_int_vector[tree_index].begin();it!=_tree_vars_used_int_vector[tree_index].end();it++)
358  _tree_vars_int_vector[tree_index][*it]->Ini(-999);
359 
360  for (it= _tree_vars_used_float_vector[tree_index].begin();it!=_tree_vars_used_float_vector[tree_index].end();it++)
361  _tree_vars_float_vector[tree_index][*it]->Ini(-999);
362 
363  for (it= _tree_vars_used_double_vector[tree_index].begin();it!=_tree_vars_used_double_vector[tree_index].end();it++)
364  _tree_vars_double_vector[tree_index][*it]->Ini(-999);
365 
366 
367  for (it= _tree_vars_used_int_matrix[tree_index].begin();it!=_tree_vars_used_int_matrix[tree_index].end();it++)
368  _tree_vars_int_matrix[tree_index][*it]->Ini(-999);
369 
370  for (it= _tree_vars_used_float_matrix[tree_index].begin();it!=_tree_vars_used_float_matrix[tree_index].end();it++)
371  _tree_vars_float_matrix[tree_index][*it]->Ini(-999);
372 
373  for (it= _tree_vars_used_double_matrix[tree_index].begin();it!=_tree_vars_used_double_matrix[tree_index].end();it++)
374  _tree_vars_double_matrix[tree_index][*it]->Ini(-999);
375 
376 
377  for (it= _tree_vars_used_int_3Dmatrix[tree_index].begin();it!=_tree_vars_used_int_3Dmatrix[tree_index].end();it++)
378  _tree_vars_int_3Dmatrix[tree_index][*it]->Ini(-999);
379 
380  for (it= _tree_vars_used_float_3Dmatrix[tree_index].begin();it!=_tree_vars_used_float_3Dmatrix[tree_index].end();it++)
381  _tree_vars_float_3Dmatrix[tree_index][*it]->Ini(-999);
382 
383  for (it= _tree_vars_used_double_3Dmatrix[tree_index].begin();it!=_tree_vars_used_double_3Dmatrix[tree_index].end();it++)
384  _tree_vars_double_3Dmatrix[tree_index][*it]->Ini(-999);
385 
386 }
387 
388 //********************************************************************
389 void OutputManager::Finalize(){
390 //********************************************************************
391 
392  // this function is called at the end of each event
393 
394 }
395 
396 //********************************************************************
397 bool OutputManager::HasCounter(Int_t tree_index, Int_t counter_index){
398 //********************************************************************
399 
400  // check that counter exists
401  return (_tree_vars_counter_size[tree_index][counter_index]!=-1);
402 }
403 
404 //********************************************************************
405 bool OutputManager::CheckCounterType(Int_t counter_index, Int_t indx, Int_t var_index){
406 //********************************************************************
407 
408  // check whether the counter has a fix size or not
409  bool correct=true;
410  if (indx==-1){
411  if(_tree_vars_counter_size[GetCurrentTree()][counter_index] > 0){
412  std::cout << "Counter '" << GetCounterName(counter_index) << "' has a fix size = "
413  << _tree_vars_counter_size[GetCurrentTree()][counter_index]
414  << ". Index must be specified !!!" << std::endl;
415  correct=false;
416  }
417  }
418  else{
419  if(_tree_vars_counter_size[GetCurrentTree()][counter_index] == 0){
420  std::cout << "Counter '" << GetCounterName(counter_index) << "' does not have a fix size. Index cannot be specified !!!" << std::endl;
421  correct=false;
422  }
423  if (indx > _tree_vars_counter_size[GetCurrentTree()][counter_index]){
424  std::cout << "Requested index " << indx << " for variable '" << GetVarName(var_index)
425  << "' bigger than fix counter size " << _tree_vars_counter_size[GetCurrentTree()][counter_index] << " !!!" << std::endl;
426  correct =false;
427  }
428  }
429 
430  return correct;
431 }
432 
433 
434 
435 //********************************************************************
436 //void OutputManager::AddCounter(const std::string& tree_name, const std::string& var_name, const std::string& counter_name, int size){
437 //********************************************************************
438 /*
439 
440  if (counter_name!=""){
441  // Add an integer variable for the counter and initialize it to 0
442  AddCounter(tree_name,counter_name,0);
443 
444  // Associate the counter to the variable
445  _tree_vars_vector_counter[tree_name][var_name]=counter_name;
446 
447  // Give a fix value to the counter if requested
448  _tree_vars_counter_size[tree_name][counter_name]=0;
449  if (size>0)
450  _tree_vars_counter_size[tree_name][counter_name]=size;
451  }
452  else{
453  // Associate the counter to the variable
454  _tree_vars_vector_counter[tree_name][var_name]=var_name;
455 
456  // Give a fix value to the counter if requested
457  _tree_vars_counter_size[tree_name][var_name]=0;
458  if (size>0)
459  _tree_vars_counter_size[tree_name][var_name]=size;
460  }
461 }
462 */
463 //********************************************************************
464 void OutputManager::ResizeCounter(Int_t counter_index, Int_t size){
465 //********************************************************************
466 
467  for (UInt_t i= 0; i<_trees_indices.size();i++){
468  ResizeCounter(_trees_indices[i],counter_index,size);
469  }
470 }
471 
472 //********************************************************************
473 void OutputManager::ResizeCounter(Int_t tree_index, Int_t counter_index, Int_t size){
474 //********************************************************************
475 
476  // check that the variable exists
477  if(!HasCounter(tree_index, counter_index)){
478  std::cout << "Counter '" << counter_index << "' does not exist !!!" << std::endl;
479  return;
480  }
481 
482  // Change the size of the counter
483  _tree_vars_counter_size[tree_index][counter_index]=size;
484 
485  _tree_vars_counter[tree_index][counter_index]=size;
486 
487  // Initialize all variables using this counter
488  InitializeCounter(tree_index, counter_index);
489 }
490 
491 //********************************************************************
492 void OutputManager::DeleteVar(Int_t tree_index, Int_t index){
493 //********************************************************************
494 
495  (void)tree_index;
496  (void)index;
497 
498 /*
499  if (_tree_vars_int_var[tree_name].find(name) != _tree_vars_int_var[tree_name].end()){
500  _tree_vars_int_var[tree_name].erase(_tree_vars_int_var[tree_name].find(name));
501  }
502  else if (_tree_vars_double_var[tree_name].find(name) != _tree_vars_double_var[tree_name].end()){
503  _tree_vars_double_var[tree_name].erase(_tree_vars_double_var[tree_name].find(name));
504  }
505  else if (_tree_vars_float_var[tree_name].find(name) != _tree_vars_float_var[tree_name].end()){
506  _tree_vars_float_var[tree_name].erase(_tree_vars_float_var[tree_name].find(name));
507  }
508  else if (_tree_vars_char_var[tree_name].find(name) != _tree_vars_char_var[tree_name].end()){
509  _tree_vars_char_var[tree_name].erase(_tree_vars_char_var[tree_name].find(name));
510  }
511  else if (_tree_vars_int_vector_var[tree_name].find(name) != _tree_vars_int_vector_var[tree_name].end()){
512  delete _tree_vars_int_vector_var[tree_name][name];
513  _tree_vars_int_vector_var[tree_name].erase(_tree_vars_int_vector_var[tree_name].find(name));
514  }
515  else if (_tree_vars_double_vector_var[tree_name].find(name) != _tree_vars_double_vector_var[tree_name].end()){
516  delete _tree_vars_double_vector_var[tree_name][name];
517  _tree_vars_double_vector_var[tree_name].erase(_tree_vars_double_vector_var[tree_name].find(name));
518  }
519  else if (_tree_vars_float_vector_var[tree_name].find(name) != _tree_vars_float_vector_var[tree_name].end()){
520  delete _tree_vars_float_vector_var[tree_name][name];
521  _tree_vars_float_vector_var[tree_name].erase(_tree_vars_float_vector_var[tree_name].find(name));
522  }
523  else if (_tree_vars_char_vector_var[tree_name].find(name) != _tree_vars_char_vector_var[tree_name].end()){
524  delete _tree_vars_char_vector_var[tree_name][name];
525  _tree_vars_char_vector_var[tree_name].erase(_tree_vars_char_vector_var[tree_name].find(name));
526  }
527  else if (_tree_vars_int_matrix_var[tree_name].find(name) != _tree_vars_int_matrix_var[tree_name].end()){
528  delete _tree_vars_int_matrix_var[tree_name][name];
529  _tree_vars_int_matrix_var[tree_name].erase(_tree_vars_int_matrix_var[tree_name].find(name));
530  }
531  else if (_tree_vars_double_matrix_var[tree_name].find(name) != _tree_vars_double_matrix_var[tree_name].end()){
532  delete _tree_vars_double_matrix_var[tree_name][name];
533  _tree_vars_double_matrix_var[tree_name].erase(_tree_vars_double_matrix_var[tree_name].find(name));
534  }
535  else if (_tree_vars_float_matrix_var[tree_name].find(name) != _tree_vars_float_matrix_var[tree_name].end()){
536  delete _tree_vars_float_matrix_var[tree_name][name];
537  _tree_vars_float_matrix_var[tree_name].erase(_tree_vars_float_matrix_var[tree_name].find(name));
538  }
539  else if (_tree_vars_char_matrix_var[tree_name].find(name) != _tree_vars_char_matrix_var[tree_name].end()){
540  delete _tree_vars_char_matrix_var[tree_name][name];
541  _tree_vars_char_matrix_var[tree_name].erase(_tree_vars_char_matrix_var[tree_name].find(name));
542  }
543  else if (_tree_vars_int_3Dmatrix_var[tree_name].find(name) != _tree_vars_int_3Dmatrix_var[tree_name].end()){
544  delete _tree_vars_int_3Dmatrix_var[tree_name][name];
545  _tree_vars_int_3Dmatrix_var[tree_name].erase(_tree_vars_int_3Dmatrix_var[tree_name].find(name));
546  }
547  else if (_tree_vars_double_3Dmatrix_var[tree_name].find(name) != _tree_vars_double_3Dmatrix_var[tree_name].end()){
548  delete _tree_vars_double_3Dmatrix_var[tree_name][name];
549  _tree_vars_double_3Dmatrix_var[tree_name].erase(_tree_vars_double_3Dmatrix_var[tree_name].find(name));
550  }
551  else if (_tree_vars_float_3Dmatrix_var[tree_name].find(name) != _tree_vars_float_3Dmatrix_var[tree_name].end()){
552  delete _tree_vars_float_3Dmatrix_var[tree_name][name];
553  _tree_vars_float_3Dmatrix_var[tree_name].erase(_tree_vars_float_3Dmatrix_var[tree_name].find(name));
554  }
555 
556 */
557  /*
558  if (std::find(_tree_vars_all_vars[tree_name].begin(), _tree_vars_all_vars[tree_name].end(), name) != _tree_vars_all_vars[tree_name].end()) {
559  _tree_vars_all_vars[tree_name].erase(std::find(_tree_vars_all_vars[tree_name].begin(), _tree_vars_all_vars[tree_name].end(), name));
560  }
561  */
562 }
563 
564 
565 //********************************************************************
566 bool OutputManager::ValidateVarNameAndIndex(Int_t tree_index, Int_t var_index, const std::string& var_name) {
567 //********************************************************************
568 
569  if (std::find(_tree_vars_all_vars[tree_index].begin(), _tree_vars_all_vars[tree_index].end(), var_name) != _tree_vars_all_vars[tree_index].end()) {
570  std::cerr << "ERROR: The tree '" << _trees[tree_index]->GetName() << "' already contains a variable called '" << var_name << "' - please call your variable something else." << std::endl;
571  std::cerr << "Program will now exit, to save you from having to solve a nasty bug later..." << std::endl;
572  exit(1);
573  }
574 
575  if (_tree_vars_all_vars[tree_index][var_index]!="") {
576  std::cerr << "ERROR: The tree '" << _trees[tree_index]->GetName() << "' already contains a variable with index " << var_index
577  << " and a different name '" << GetVarName(tree_index, var_index)
578  << "' - please use a different index for variable '" << var_name << "'" << std::endl;
579  std::cerr << "Program will now exit, to save you from having to solve a nasty bug later..." << std::endl;
580  exit(1);
581  }
582 
583  _tree_vars_all_vars[tree_index][var_index]=var_name;
584 
585  return true;
586 }
587 
588 //********************************************************************
589 void OutputManager::InitializeCounter(Int_t counter_index){
590 //********************************************************************
591 
592  for (UInt_t i= 0; i<_trees_indices.size();i++){
593  InitializeCounter(_trees_indices[i], counter_index);
594  }
595 }
596 
597 //********************************************************************
598 void OutputManager::InitializeCounter(Int_t tree_index, Int_t counter_index){
599 //********************************************************************
600 
601  if (_tree_vars_counter_size[tree_index][counter_index] == -1) return;
602 
603  // check if the counter has a fixed value
604  if (_tree_vars_counter_size[tree_index][counter_index] > 0) return;
605 
606  // Reset the counter to 0
607  _tree_vars_counter[tree_index][counter_index]=0;
608 
609 }
610 
611 //********************************************************************
612 void OutputManager::InitializeVar(Int_t index, Double_t ini){
613 //********************************************************************
614 
615  // Initialise int and double variables to the value ini
616 
617  for (UInt_t i= 0; i<_trees_indices.size();i++){
618  Int_t tree_index = _trees_indices[i];
619  if (_tree_vars_int[tree_index][index]!=-1){
620  _tree_vars_int[tree_index][index]=(Int_t)ini;
621  }
622  else if (_tree_vars_float[tree_index][index]!=-1){
623  _tree_vars_float[tree_index][index]=(Float_t)ini;
624  }
625  else if (_tree_vars_double[tree_index][index]!=-1){
626  _tree_vars_double[tree_index][index]=(Double_t)ini;
627  }
628  }
629 }
630 
631 //********************************************************************
632 void OutputManager::InitializeVectorVar(Int_t index, Double_t ini){
633 //********************************************************************
634 
635  (void)index;
636  (void)ini;
637 
638  // Initialise int and Double_t analysis variables to the value ini
639  /*
640  std::map< std::string, TTree* >::iterator cit;
641  for (cit= GetTrees().begin();cit!=GetTrees().end();cit++){
642  std::string tree_name = cit->first;
643 
644  // Get the counter corresponding to this vector variable
645  std::string counter_name = _tree_vars_vector_counter[GetCurrentTree()][name];
646 
647  if (_tree_vars_counter_size[GetCurrentTree()][name]>0){
648  if (_tree_vars_int_vector_var[tree_name].find(name)!=_tree_vars_int_vector_var[tree_name].end()){
649  for (int i=0;i<_tree_vars_counter_size[GetCurrentTree()][name];i++){
650  _tree_vars_int_vector_var[tree_name][name]->Fill(i,(Int_t)ini);
651  }
652  }
653  else if (_tree_vars_float_vector_var[tree_name].find(name)!=_tree_vars_float_vector_var[tree_name].end()){
654  for (int i=0;i<_tree_vars_counter_size[GetCurrentTree()][name];i++){
655  _tree_vars_float_vector_var[tree_name][name]->Fill(i,(Float_t)ini);
656  }
657  }
658  else if (_tree_vars_double_vector_var[tree_name].find(name)!=_tree_vars_double_vector_var[tree_name].end()){
659  for (int i=0;i<_tree_vars_counter_size[GetCurrentTree()][name];i++){
660  _tree_vars_double_vector_var[tree_name][name]->Fill(i,(Double_t)ini);
661  }
662  }
663  }
664  }
665  */
666 }
667 
668 //********************************************************************
669 void OutputManager::InitializeMatrixVar(Int_t index, Double_t ini){
670 //********************************************************************
671  (void)index;
672  (void)ini;
673  // Initialise int and double analysis variables to the value ini
674  /*
675  std::map< std::string, TTree* >::iterator cit;
676  for (cit= GetTrees().begin();cit!=GetTrees().end();cit++){
677  std::string tree_name = cit->first;
678  if (_tree_vars_int_matrix_var[tree_name].find(name)!=_tree_vars_int_matrix_var[tree_name].end()){
679  for (unsigned int i=0;i<_tree_vars_int_matrix_var[tree_name][name]->size();i++){
680  for (unsigned int j=0;j<(*_tree_vars_int_matrix_var[tree_name][name])[i].size();j++){
681  (*(_tree_vars_int_matrix_var[tree_name][name]))[i][j]=(Float_t)ini;
682  }
683  }
684  }
685 
686  else if (_tree_vars_double_matrix_var[tree_name].find(name)!=_tree_vars_double_matrix_var[tree_name].end()){
687  for (unsigned int i=0;i<_tree_vars_double_matrix_var[tree_name][name]->size();i++){
688  for (unsigned int j=0;j<(*_tree_vars_double_matrix_var[tree_name][name])[i].size();j++){
689  (*(_tree_vars_double_matrix_var[tree_name][name]))[i][j]=(Double_t)ini;
690  }
691  }
692  }
693 
694  }
695  */
696 }
697 
698 //********************************************************************
699 void OutputManager::InitializeAnalysisVar(Int_t index, Double_t ini){
700 //********************************************************************
701 
702  InitializeVectorVar(index,ini);
703 }
704 
705 //********************************************************************
706 void OutputManager::InitializeAnalysisVectorVar(Int_t index, Double_t ini){
707 //********************************************************************
708 
709  InitializeMatrixVar(index,ini);
710 }
711 
712 
713 //********************************************************************
714 void OutputManager::FillTree(Int_t tree_index){
715 //********************************************************************
716 
717  if(_file)
718  _file->cd();
719  GetTree(tree_index)->Fill();
720 
721 }
722 
723 //********************************************************************
724 bool OutputManager::OpenOutputFile(const std::string& file){
725 //********************************************************************
726 
727  if (_file) delete _file;
728 
729  _file = new TFile(file.c_str(),"NEW");
730 
731  return !_file->IsZombie();
732 }
733 
734 //********************************************************************
736 //********************************************************************
737 
738  // Write a tree to a file
739  _file->Close();
740 }
741 
742 //********************************************************************
743 void OutputManager::WriteTree(const std::string& file, const std::string& tree_name){
744 //********************************************************************
745 
746  // Write a tree to a file
747  _file = new TFile(file.c_str(),"NEW");
748  GetTree(tree_name.c_str())->Write();
749  _file->Close();
750 }
751 
752 //********************************************************************
753 void OutputManager::WriteTrees(const std::string& file){
754 //********************************************************************
755 
756  // Write all trees to a file
757  _file = new TFile(file.c_str(),"NEW");
758 
759  for (UInt_t i= 0; i<_trees_indices.size();i++){
760  GetTree(_trees_indices[i])->Write();
761  }
762  _file->Close();
763 }
764 
765 //********************************************************************
766 std::string OutputManager::GetString(int a){
767 //********************************************************************
768 
769  std::stringstream st;
770  st << a;
771  return st.str();
772 }
773 
774 
775 //********************************************************************
776 std::string OutputManager::GetSize(const std::string& counter_name, unsigned int size){
777 //********************************************************************
778 
779  std::string ssize=counter_name;
780  if (ssize=="")
781  ssize = GetString(size);
782 
783  return ssize;
784 }
785 
786 //********************************************************************
787 void OutputManager::FillMicroTrees(){
788 //********************************************************************
789 
790  // Number of toy experiments
791  FillVar(NTOYS, (Int_t)GetNToys());
792 
793  /*
794  Float_t total=0;
795  for (UInt_t i=0;i<GetNToys();i++){
796  total += _toyWeights[i];
797  }
798 
799  if (total!=0){
800  for (UInt_t i=0;i<GetNToys();i++){
801  FillVectorVar(toy_weight, (Float_t)_toyWeights[i]/total, i);
802  }
803  }
804  */
805  Float_t w = 1./GetNToys();
806  for (UInt_t i=0;i<GetNToys();i++)
807  FillVectorVar(toy_weight, w, i);
808 
809  // Fill the tree
810  FillTree();
811 }
812 
813 
814 //*********************************************************
815 void OutputManager::SetNToys(Int_t tree_index, Int_t nana){
816 //*********************************************************
817 
818  if(HasCounter(tree_index, NTOYS))
819  ResizeCounter(tree_index, NTOYS,nana);
820  else
821  AddCounter(tree_index,NTOYS,"NTOYS",nana);
822 
823  // Delete the variables that depend on the number of toy experiments
824  DeleteVar(tree_index,toy_index);
825  DeleteVar(tree_index,toy_weight);
826 
827  // Add the variables again with the correct size
828  AddToyVar(tree_index,toy_index, "toy_index" ,"I", "Toy experiment index");
829  AddToyVar(tree_index,toy_weight,"toy_weight","F", "Total toy experiment weight");
830 
831 }
832 
833 //********************************************************************
834 void OutputManager::AddToyVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc){
835 //********************************************************************
836 
837  if (_single_tree_fill==-1){
838  // Add a variable to all trees
839  for (UInt_t i= 0; i<_trees_indices.size();i++){
840  Int_t tree_index = _trees_indices[i];
841  if (IsSpecialTree(tree_index)) continue;
842  AddVectorVar(tree_index, index, name, type,doc, NTOYS,"NTOYS", GetNToys(tree_index));
843  }
844  }
845  else{
846  AddVectorVar(_single_tree_fill, index, name, type,doc, NTOYS,"NTOYS", GetNToys(_single_tree_fill));
847  }
848 }
849 
850 //********************************************************************
851 void OutputManager::AddToyVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring){
852 //********************************************************************
853 
854  AddVectorVar(tree_index,index, name, type,docstring, NTOYS, "NTOYS",GetNToys(tree_index));
855 }
856 
857 //********************************************************************
858 void OutputManager::AddToyVectorVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t size2){
859 //********************************************************************
860 
861  if (_single_tree_fill==-1){
862  // Add a variable to all trees
863  for (UInt_t i= 0; i<_trees_indices.size();i++){
864  Int_t tree_index = _trees_indices[i];
865  if (IsSpecialTree(tree_index)) continue;
866  AddMatrixVar(tree_index, index, name, type,doc, NTOYS, "NTOYS",GetNToys(tree_index), size2);
867  }
868  }
869  else{
870  AddMatrixVar(_single_tree_fill, index, name, type,doc, NTOYS, "NTOYS",GetNToys(_single_tree_fill), size2);
871  }
872 }
873 
874 //********************************************************************
875 void OutputManager::AddToyVectorVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring, Int_t size){
876 //********************************************************************
877 
878  AddMatrixVar(tree_index, index, name, type,docstring, NTOYS, "NTOYS",GetNToys(tree_index),size);
879 }
880 
881 //********************************************************************
882 void OutputManager::AddToyMatrixVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t size2, Int_t size3){
883 //********************************************************************
884 
885  if (_single_tree_fill==-1){
886  // Add a variable to all trees
887  for (UInt_t i= 0; i<_trees_indices.size();i++){
888  Int_t tree_index = _trees_indices[i];
889  if (IsSpecialTree(tree_index)) continue;
890  Add3DMatrixVar(tree_index, index, name, type,doc, NTOYS, "NTOYS",GetNToys(tree_index), size2, size3);
891  }
892  }
893  else{
894  Add3DMatrixVar(_single_tree_fill, index, name, type,doc, NTOYS, "NTOYS",GetNToys(_single_tree_fill), size2, size3);
895  }
896 }
897 
898 //********************************************************************
899 void OutputManager::AddToyMatrixVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring, Int_t size2, Int_t size3){
900 //********************************************************************
901 
902  Add3DMatrixVar(tree_index, index, name, type,docstring, NTOYS, "NTOYS",GetNToys(tree_index),size2, size3);
903 }
904 
905 
906 //********************************************************************
907 void OutputManager::AddVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, double ini){
908 //********************************************************************
909 
910  if (_single_tree_fill==-1){
911  // Add a variable to all trees
912  for (UInt_t i= 0; i<_trees_indices.size();i++){
913  Int_t tree_index = _trees_indices[i];
914  if (IsSpecialTree(tree_index)) continue;
915  AddVar(tree_index, index, name, type,doc, ini);
916  }
917  }
918  else{
919  AddVar(_single_tree_fill, index, name, type,doc, ini);
920  }
921 }
922 
923 //********************************************************************
924 void OutputManager::AddVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& doc, double ini){
925 //********************************************************************
926 
927  ValidateVarNameAndIndex(tree_index,index,name);
928 
929  if (type=="I"){
930  _tree_vars_int[tree_index][index]=ini;
931  _tree_vars_used_int[tree_index].push_back(index);
932  _tree_vars_exist_int[tree_index][index]=true;
933  _trees[tree_index]->Branch(name.c_str(), &_tree_vars_int[tree_index][index], (name+"/"+type).c_str());
934  _trees[tree_index]->SetBranchAddress(name.c_str(), &_tree_vars_int[tree_index][index]);
935  }
936  else if (type=="F"){
937  _tree_vars_float[tree_index][index]=ini;
938  _tree_vars_used_float[tree_index].push_back(index);
939  _tree_vars_exist_float[tree_index][index]=true;
940  _trees[tree_index]->Branch(name.c_str(), &_tree_vars_float[tree_index][index], (name+"/"+type).c_str());
941  _trees[tree_index]->SetBranchAddress(name.c_str(), &_tree_vars_float[tree_index][index]);
942  }
943  else if (type=="D"){
944  _tree_vars_double[tree_index][index]=ini;
945  _tree_vars_used_double[tree_index].push_back(index);
946  _tree_vars_exist_double[tree_index][index]=true;
947  _trees[tree_index]->Branch(name.c_str(), &_tree_vars_double[tree_index][index], (name+"/"+type).c_str());
948  _trees[tree_index]->SetBranchAddress(name.c_str(), &_tree_vars_double[tree_index][index]);
949  }
950  else if (type=="C"){
951  _tree_vars_char[tree_index][index].Fill("");
952  _tree_vars_used_char[tree_index].push_back(index);
953  _tree_vars_exist_char[tree_index][index]=true;
954  _trees[tree_index]->Branch(name.c_str(), &_tree_vars_char[tree_index][index], (name+"/"+type).c_str());
955  _trees[tree_index]->SetBranchAddress(name.c_str(), &_tree_vars_char[tree_index][index]);
956  }
957 
958  docstrings().DocumentVar(GetTreeName(tree_index), name, doc, type, 0, "", 0, "", 0, "");
959 }
960 
961 //********************************************************************
962 void OutputManager::AddVectorVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t counter_index, const std::string& counter_name, Int_t size){
963 //********************************************************************
964 
965  if (_single_tree_fill==-1){
966  // Add a variable to all trees
967  for (UInt_t i= 0; i<_trees_indices.size();i++){
968  Int_t tree_index = _trees_indices[i];
969  if (IsSpecialTree(tree_index)) continue;
970  AddVectorVar(tree_index, index, name, type,doc, counter_index, counter_name, size);
971  }
972  }
973  else{
974  AddVectorVar(_single_tree_fill, index, name, type,doc, counter_index, counter_name, size);
975  }
976 }
977 
978 
979 //********************************************************************
980 void OutputManager::AddVectorVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t counter_index, const std::string& counter_name, Int_t size){
981 //********************************************************************
982 
983  ValidateVarNameAndIndex(tree_index,index,name);
984 
985  std::string ssize= GetSize(counter_name,size);
986 
987  AddCounter(tree_index,index,counter_index,counter_name, size);
988 
989  if (type=="I"){
990  _tree_vars_int_vector[tree_index][index]= new int_vector(abs(size));
991  _tree_vars_used_int_vector[tree_index].push_back(index);
992  _tree_vars_exist_int_vector[tree_index][index]=true;
993  _trees[tree_index]->Branch(name.c_str(), _tree_vars_int_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/I").c_str());
994  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_int_vector[tree_index][index]->GetAddress());
995  }
996  else if (type=="F"){
997  _tree_vars_float_vector[tree_index][index]= new float_vector(abs(size));
998  _tree_vars_used_float_vector[tree_index].push_back(index);
999  _tree_vars_exist_float_vector[tree_index][index]=true;
1000  _trees[tree_index]->Branch(name.c_str(), _tree_vars_float_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/F").c_str());
1001  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_float_vector[tree_index][index]->GetAddress());
1002  }
1003  else if (type=="D"){
1004  _tree_vars_double_vector[tree_index][index]= new double_vector(abs(size));
1005  _tree_vars_used_double_vector[tree_index].push_back(index);
1006  _tree_vars_exist_double_vector[tree_index][index]=true;
1007  _trees[tree_index]->Branch(name.c_str(), _tree_vars_double_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/D").c_str());
1008  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_double_vector[tree_index][index]->GetAddress());
1009  }
1010  else if (type=="C"){
1011  _tree_vars_char_vector[tree_index][index]= new char_vector(abs(size));
1012  _tree_vars_used_char_vector[tree_index].push_back(index);
1013  _tree_vars_exist_char_vector[tree_index][index]=true;
1014  _trees[tree_index]->Branch(name.c_str(), _tree_vars_char_vector[tree_index][index]->GetAddress());
1015  // _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_char_vector[tree_index][index]->GetAddress());
1016  }
1017 
1018  docstrings().DocumentVar(GetTreeName(tree_index), name, doc, type, size, counter_name, 0, "", 0, "");
1019 }
1020 
1021 //********************************************************************
1022 void OutputManager::AddVectorVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t size){
1023 //********************************************************************
1024 
1025  if (_single_tree_fill==-1){
1026  // Add a variable to all trees
1027  for (UInt_t i= 0; i<_trees_indices.size();i++){
1028  Int_t tree_index = _trees_indices[i];
1029  if (IsSpecialTree(tree_index)) continue;
1030  AddVectorVar(tree_index, index, name, type,doc, size);
1031  }
1032  }
1033  else{
1034  AddVectorVar(_single_tree_fill, index, name, type,doc, size);
1035  }
1036 }
1037 
1038 //********************************************************************
1039 void OutputManager::AddVectorVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& doc, const int size){
1040 //********************************************************************
1041 
1042  ValidateVarNameAndIndex(tree_index,index,name);
1043 
1044  std::string ssize= GetSize("",size);
1045 
1046  AddCounter(tree_index,index,-1,"", size);
1047 
1048  if (type=="I"){
1049  _tree_vars_int_vector[tree_index][index]= new int_vector(abs(size));
1050  _tree_vars_used_int_vector[tree_index].push_back(index);
1051  _tree_vars_exist_int_vector[tree_index][index]=true;
1052  _trees[tree_index]->Branch(name.c_str(), _tree_vars_int_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/I").c_str());
1053  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_int_vector[tree_index][index]->GetAddress());
1054  }
1055  else if (type=="F"){
1056  _tree_vars_float_vector[tree_index][index]= new float_vector(abs(size));
1057  _tree_vars_used_float_vector[tree_index].push_back(index);
1058  _tree_vars_exist_float_vector[tree_index][index]=true;
1059  _trees[tree_index]->Branch(name.c_str(), _tree_vars_float_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/F").c_str());
1060  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_float_vector[tree_index][index]->GetAddress());
1061  }
1062  else if (type=="D"){
1063  _tree_vars_double_vector[tree_index][index]= new double_vector(abs(size));
1064  _tree_vars_used_double_vector[tree_index].push_back(index);
1065  _tree_vars_exist_double_vector[tree_index][index]=true;
1066  _trees[tree_index]->Branch(name.c_str(), _tree_vars_double_vector[tree_index][index]->GetAddress(), (name+"["+ssize+"]/D").c_str());
1067  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_double_vector[tree_index][index]->GetAddress());
1068  }
1069  else if (type=="C"){
1070  _tree_vars_char_vector[tree_index][index]= new char_vector(abs(size));
1071  _tree_vars_used_char_vector[tree_index].push_back(index);
1072  _tree_vars_exist_char_vector[tree_index][index]=true;
1073  _trees[tree_index]->Branch(name.c_str(), _tree_vars_char_vector[tree_index][index]->GetAddress());
1074  // _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_char_vector[tree_index][index]->GetAddress());
1075  }
1076 
1077  docstrings().DocumentVar(GetTreeName(tree_index), name, doc, type, size, "", 0, "", 0, "");
1078 }
1079 
1080 //********************************************************************
1081 void OutputManager::AddMatrixVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t counter_index, const std::string& counter_name, Int_t size1, Int_t size2){
1082 //********************************************************************
1083 
1084  if (_single_tree_fill==-1){
1085  // Add a variable to all trees
1086  for (UInt_t i= 0; i<_trees_indices.size();i++){
1087  Int_t tree_index = _trees_indices[i];
1088  if (IsSpecialTree(tree_index)) continue;
1089  AddMatrixVar(tree_index, index, name, type,doc, counter_index, counter_name, size1, size2);
1090  }
1091  }
1092  else{
1093  AddMatrixVar(_single_tree_fill, index, name, type,doc, counter_index, counter_name, size1, size2);
1094  }
1095 }
1096 
1097 //********************************************************************
1098 void OutputManager::AddMatrixVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring, Int_t counter_index, const std::string& counter_name, int size1, int size2){
1099 //********************************************************************
1100 
1101  ValidateVarNameAndIndex(tree_index,index,name);
1102 
1103  std::string ssize1= GetSize(counter_name,size1);
1104  std::string ssize2= GetSize("",size2);
1105  AddCounter(tree_index,index,counter_index,counter_name, size1);
1106  // AddCounter(tree_index,index,-1,"", size2);
1107  if (type=="I"){
1108  _tree_vars_int_matrix[tree_index][index]= new int_matrix(abs(size1),size2);
1109  _tree_vars_used_int_matrix[tree_index].push_back(index);
1110  _tree_vars_exist_int_matrix[tree_index][index]=true;
1111  _trees[tree_index]->Branch(name.c_str(), _tree_vars_int_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/I").c_str());
1112  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_int_matrix[tree_index][index]->GetAddress());
1113  }
1114  else if (type=="D"){
1115  _tree_vars_double_matrix[tree_index][index]= new double_matrix(abs(size1),size2);
1116  _tree_vars_used_double_matrix[tree_index].push_back(index);
1117  _tree_vars_exist_double_matrix[tree_index][index]=true;
1118  _trees[tree_index]->Branch(name.c_str(), _tree_vars_double_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/D").c_str());
1119  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_double_matrix[tree_index][index]->GetAddress());
1120  }
1121  else if (type=="F"){
1122  _tree_vars_float_matrix[tree_index][index]= new float_matrix(abs(size1),size2);
1123  _tree_vars_used_float_matrix[tree_index].push_back(index);
1124  _tree_vars_exist_float_matrix[tree_index][index]=true;
1125  _trees[tree_index]->Branch(name.c_str(), _tree_vars_float_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/F").c_str());
1126  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_float_matrix[tree_index][index]->GetAddress());
1127  }
1128  else if (type=="C"){
1129  _tree_vars_char_matrix[tree_index][index]= new char_matrix(abs(size1),size2);
1130  _tree_vars_used_char_matrix[tree_index].push_back(index);
1131  _tree_vars_exist_char_matrix[tree_index][index]=true;
1132  _trees[tree_index]->Branch(name.c_str(), _tree_vars_char_matrix[tree_index][index]->GetAddress());
1133  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_char_matrix[tree_index][index]->GetAddress());
1134  }
1135 
1136  docstrings().DocumentVar(GetTreeName(tree_index), name, docstring, type, size1, counter_name, size2, "", 0, "");
1137 }
1138 
1139 //********************************************************************
1140 void OutputManager::AddMatrixVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t size1, Int_t size2){
1141 //********************************************************************
1142 
1143  if (_single_tree_fill==-1){
1144  // Add a variable to all trees
1145  for (UInt_t i= 0; i<_trees_indices.size();i++){
1146  Int_t tree_index = _trees_indices[i];
1147  if (IsSpecialTree(tree_index)) continue;
1148  AddMatrixVar(tree_index, index, name, type,doc, size1, size2);
1149  }
1150  }
1151  else{
1152  AddMatrixVar(_single_tree_fill, index, name, type,doc, size1, size2);
1153  }
1154 }
1155 
1156 //********************************************************************
1157 void OutputManager::AddMatrixVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring, int size1, int size2){
1158 //********************************************************************
1159 
1160  ValidateVarNameAndIndex(tree_index,index,name);
1161 
1162  std::string ssize1= GetSize("",size1);
1163  std::string ssize2= GetSize("",size2);
1164  AddCounter(tree_index,index,-1,"", size1);
1165 
1166  if (type=="I"){
1167  _tree_vars_int_matrix[tree_index][index]= new int_matrix(abs(size1),size2);
1168  _tree_vars_used_int_matrix[tree_index].push_back(index);
1169  _tree_vars_exist_int_matrix[tree_index][index]=true;
1170  _trees[tree_index]->Branch(name.c_str(), _tree_vars_int_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/I").c_str());
1171  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_int_matrix[tree_index][index]->GetAddress());
1172  }
1173  else if (type=="D"){
1174  _tree_vars_double_matrix[tree_index][index]= new double_matrix(abs(size1),size2);
1175  _tree_vars_used_double_matrix[tree_index].push_back(index);
1176  _tree_vars_exist_double_matrix[tree_index][index]=true;
1177  _trees[tree_index]->Branch(name.c_str(), _tree_vars_double_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/D").c_str());
1178  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_double_matrix[tree_index][index]->GetAddress());
1179  }
1180  else if (type=="F"){
1181  _tree_vars_float_matrix[tree_index][index]= new float_matrix(abs(size1),size2);
1182  _tree_vars_used_float_matrix[tree_index].push_back(index);
1183  _tree_vars_exist_float_matrix[tree_index][index]=true;
1184  _trees[tree_index]->Branch(name.c_str(), _tree_vars_float_matrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]/F").c_str());
1185  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_float_matrix[tree_index][index]->GetAddress());
1186  }
1187  else if (type=="C"){
1188  _tree_vars_char_matrix[tree_index][index]= new char_matrix(abs(size1),size2);
1189  _tree_vars_used_char_matrix[tree_index].push_back(index);
1190  _tree_vars_exist_char_matrix[tree_index][index]=true;
1191  _trees[tree_index]->Branch(name.c_str(), _tree_vars_char_matrix[tree_index][index]->GetAddress());
1192  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_char_matrix[tree_index][index]->GetAddress());
1193  }
1194 
1195  docstrings().DocumentVar(GetTreeName(tree_index), name, docstring, type, size1, "", size2, "", 0, "");
1196 }
1197 
1198 
1199 //********************************************************************
1200 void OutputManager::Add3DMatrixVar(Int_t index, const std::string& name, const std::string& type, const std::string& doc, Int_t counter_index, const std::string& counter_name, Int_t size1, Int_t size2, Int_t size3){
1201 //********************************************************************
1202 
1203  if (_single_tree_fill==-1){
1204  // Add a variable to all trees
1205  for (UInt_t i= 0; i<_trees_indices.size();i++){
1206  Int_t tree_index = _trees_indices[i];
1207  if (IsSpecialTree(tree_index)) continue;
1208  Add3DMatrixVar(tree_index, index, name, type,doc, counter_index, counter_name, size1, size2, size3);
1209  }
1210  }
1211  else{
1212  Add3DMatrixVar(_single_tree_fill, index, name, type,doc, counter_index, counter_name, size1, size2, size3);
1213  }
1214 }
1215 
1216 //********************************************************************
1217 void OutputManager::Add3DMatrixVar(Int_t tree_index, Int_t index, const std::string& name, const std::string& type, const std::string& docstring, Int_t counter_index, const std::string& counter_name, int size1, int size2, int size3){
1218 //********************************************************************
1219 
1220  ValidateVarNameAndIndex(tree_index,index,name);
1221 
1222  std::string ssize1= GetSize(counter_name,size1);
1223  std::string ssize2= GetSize("",size2);
1224  std::string ssize3= GetSize("",size3);
1225 
1226  AddCounter(tree_index,index,counter_index,counter_name, size1);
1227 
1228  if (type=="I"){
1229  _tree_vars_int_3Dmatrix[tree_index][index]= new int_3Dmatrix(abs(size1),size2,size3);
1230  _tree_vars_used_int_3Dmatrix[tree_index].push_back(index);
1231  _tree_vars_exist_int_3Dmatrix[tree_index][index]=true;
1232  _trees[tree_index]->Branch(name.c_str(), _tree_vars_int_3Dmatrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]["+ssize3+"]/I").c_str());
1233  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_int_3Dmatrix[tree_index][index]->GetAddress());
1234  }
1235  else if (type=="D"){
1236  _tree_vars_double_3Dmatrix[tree_index][index]= new double_3Dmatrix(abs(size1),size2,size3);
1237  _tree_vars_used_double_3Dmatrix[tree_index].push_back(index);
1238  _tree_vars_exist_double_3Dmatrix[tree_index][index]=true;
1239  _trees[tree_index]->Branch(name.c_str(), _tree_vars_double_3Dmatrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]["+ssize3+"]/D").c_str());
1240  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_double_3Dmatrix[tree_index][index]->GetAddress());
1241  }
1242  else if (type=="F"){
1243  _tree_vars_float_3Dmatrix[tree_index][index]= new float_3Dmatrix(abs(size1),size2,size3);
1244  _tree_vars_used_float_3Dmatrix[tree_index].push_back(index);
1245  _tree_vars_exist_float_3Dmatrix[tree_index][index]=true;
1246  _trees[tree_index]->Branch(name.c_str(), _tree_vars_float_3Dmatrix[tree_index][index]->GetAddress(), (name+"["+ssize1+"]["+ssize2+"]["+ssize3+"]/F").c_str());
1247  _trees[tree_index]->SetBranchAddress(name.c_str(), _tree_vars_float_3Dmatrix[tree_index][index]->GetAddress());
1248  }
1249 
1250  docstrings().DocumentVar(GetTreeName(tree_index), name, docstring, type, size1, counter_name, size2, "", size3, "");
1251 }
1252 
1253 //********************************************************************
1254 void OutputManager::AddCounter(Int_t tree_index, Int_t counter_index, const std::string& counter_name, int size){
1255 //********************************************************************
1256 
1257  if (HasCounter(tree_index, counter_index)) return;
1258 
1259 
1260  _tree_vars_counter[tree_index][counter_index]=0;
1261  _tree_vars_counter_size[tree_index][counter_index]=0;
1262 
1263  // Give a fix value to the counter if requested
1264  if (size>0){
1265 
1266  _tree_vars_counter[tree_index][counter_index]=size;
1267  _tree_vars_counter_size[tree_index][counter_index]=size;
1268  }
1269 
1270  _trees[tree_index]->Branch(counter_name.c_str(), &_tree_vars_counter[tree_index][counter_index], (counter_name+"/I").c_str());
1271  _trees[tree_index]->SetBranchAddress(counter_name.c_str(), &_tree_vars_counter[tree_index][counter_index]);
1272 
1273  //add the name to the counters list
1274  _tree_vars_all_counters[tree_index][counter_index]=counter_name;
1275 
1276  _tree_vars_used_counter[tree_index].push_back(counter_index);
1277 
1278  _tree_vars_exist_int[tree_index][counter_index]=true;
1279 
1280 }
1281 
1282 //********************************************************************
1283 void OutputManager::AddCounter(Int_t tree_index, Int_t index, Int_t counter_index, const std::string& counter_name, int size){
1284 //********************************************************************
1285  if (counter_index==-1){
1286 
1287  _tree_vars_counter[tree_index][index]=0;
1288  _tree_vars_counter_size[tree_index][index]=0;
1289 
1290  // Give a fix value to the counter if requested
1291  if (size>0){
1292  _tree_vars_counter[tree_index][index]=size;
1293  _tree_vars_counter_size[tree_index][index]=size;
1294  }
1295  _link_var_to_counter[tree_index][index]= index;
1296  }
1297  else{
1298  _link_var_to_counter[tree_index][index]= counter_index;
1299  AddCounter(tree_index,counter_index,counter_name,size);
1300  }
1301 
1302 }
1303 
1304 //********************************************************************
1305 bool OutputManager::GetFirstIndexFromCounter(Int_t index, Int_t& indx1){
1306 //********************************************************************
1307 
1308  // Get the counter corresponding to this variable
1309  Int_t counter_index = GetCounterIndexForVar(index);
1310  // check the counter type
1311  if (!CheckCounterType(counter_index, indx1, index)) return false;
1312 
1313  // Take the index from the counter
1314  if (indx1==-1)
1315  indx1 = _tree_vars_counter[GetCurrentTree()][counter_index];
1316 
1317  return true;
1318 }
1319 
1320 //********************************************************************
1321 void OutputManager::FillVar(Int_t index, Float_t var){
1322 //********************************************************************
1323 
1324  CheckVariableType(index, "","Float", _tree_vars_exist_float[GetCurrentTree()][index]);
1325  _tree_vars_float[GetCurrentTree()][index]= var;
1326 
1327 }
1328 
1329 //********************************************************************
1330 void OutputManager::FillVar(Int_t index, Double_t var){
1331 //********************************************************************
1332 
1333  CheckVariableType(index, "","Double", _tree_vars_exist_double[GetCurrentTree()][index]);
1334  _tree_vars_double[GetCurrentTree()][index]= var;
1335 }
1336 
1337 //********************************************************************
1338 void OutputManager::FillVar(Int_t index, Int_t var){
1339 //********************************************************************
1340 
1341  CheckVariableType(index, "","Int", _tree_vars_exist_int[GetCurrentTree()][index]);
1342  _tree_vars_int[GetCurrentTree()][index]= var;
1343 }
1344 
1345 //********************************************************************
1346 void OutputManager::FillVar(Int_t index, const std::string& var){
1347 //********************************************************************
1348 
1349  CheckVariableType(index, "","Char", _tree_vars_exist_char[GetCurrentTree()][index]);
1350  _tree_vars_char[GetCurrentTree()][index].Fill(var);
1351 }
1352 
1353 //********************************************************************
1354 Float_t OutputManager::GetVarValueF(Int_t index){
1355 //********************************************************************
1356 
1357  return _tree_vars_float[GetCurrentTree()][index];
1358 }
1359 
1360 //********************************************************************
1361 Double_t OutputManager::GetVarValueD(Int_t index){
1362 //********************************************************************
1363 
1364  return _tree_vars_double[GetCurrentTree()][index];
1365 }
1366 
1367 //********************************************************************
1368 Int_t OutputManager::GetVarValueI(Int_t index){
1369 //********************************************************************
1370 
1371  return _tree_vars_int[GetCurrentTree()][index];
1372 }
1373 
1374 //********************************************************************
1375 void OutputManager::FillVectorVar(Int_t index, Int_t var, Int_t indx){
1376 //********************************************************************
1377 
1378  CheckVariableType(index, "Vector", "Int", _tree_vars_exist_int_vector[GetCurrentTree()][index]);
1379 
1380  if (!GetFirstIndexFromCounter(index,indx)) return;
1381 
1382  // fill the variable
1383  try {
1384  (_tree_vars_int_vector[GetCurrentTree()][index])->Fill(indx,var);
1385  } catch (OutOfBounds) {
1386  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside vector size. Index was: " << indx << std::endl;
1387  }
1388 }
1389 
1390 //********************************************************************
1391 void OutputManager::FillVectorVar(Int_t index, Float_t var, Int_t indx){
1392 //********************************************************************
1393 
1394  CheckVariableType(index, "Vector", "Float", _tree_vars_exist_float_vector[GetCurrentTree()][index]);
1395 
1396  if (!GetFirstIndexFromCounter(index,indx)) return;
1397 
1398  // fill the variable
1399  try {
1400  (_tree_vars_float_vector[GetCurrentTree()][index])->Fill(indx,var);
1401  } catch (OutOfBounds) {
1402  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside vector size. Index was: " << indx << std::endl;
1403  }
1404 }
1405 
1406 //********************************************************************
1407 void OutputManager::FillVectorVar(Int_t index, Double_t var, Int_t indx){
1408 //********************************************************************
1409 
1410  CheckVariableType(index, "Vector", "Double", _tree_vars_exist_double_vector[GetCurrentTree()][index]);
1411 
1412  if (!GetFirstIndexFromCounter(index,indx)) return;
1413 
1414  // fill the variable
1415  try {
1416  (_tree_vars_double_vector[GetCurrentTree()][index])->Fill(indx,var);
1417  } catch (OutOfBounds) {
1418  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside vector size. Index was: " << indx << std::endl;
1419  }
1420 }
1421 
1422 //********************************************************************
1423 void OutputManager::FillVectorVar(Int_t index, const std::string& var, Int_t indx){
1424 //********************************************************************
1425 
1426  CheckVariableType(index, "Vector", "Char", _tree_vars_exist_char_vector[GetCurrentTree()][index]);
1427 
1428  if (!GetFirstIndexFromCounter(index,indx)) return;
1429 
1430  // fill the variable
1431  try {
1432  (_tree_vars_char_vector[GetCurrentTree()][index])->Fill(indx,var.c_str());
1433  } catch (OutOfBounds) {
1434  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside vector size. Index was: " << indx << std::endl;
1435  }
1436 }
1437 
1438 //********************************************************************
1439 void OutputManager::FillMatrixVar(Int_t index, Int_t var, Int_t indx1, Int_t indx2){
1440 //********************************************************************
1441 
1442  CheckVariableType(index, "Matrix", "Int", _tree_vars_exist_int_matrix[GetCurrentTree()][index]);
1443 
1444  if (!GetFirstIndexFromCounter(index,indx1)) return;
1445 
1446  // fill the variable
1447  try {
1448  (_tree_vars_int_matrix[GetCurrentTree()][index])->Fill(indx1,indx2,var);
1449  } catch (OutOfBounds) {
1450  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside matrix size. Indices were: " << indx1 << ", " << indx2 << std::endl;
1451  }
1452 }
1453 
1454 //********************************************************************
1455 void OutputManager::FillMatrixVar(Int_t index, Float_t var, Int_t indx1, Int_t indx2){
1456 //********************************************************************
1457 
1458  CheckVariableType(index, "Matrix", "Float", _tree_vars_exist_float_matrix[GetCurrentTree()][index]);
1459 
1460  if (!GetFirstIndexFromCounter(index,indx1)) return;
1461 
1462  // fill the variable
1463  try {
1464  (_tree_vars_float_matrix[GetCurrentTree()][index])->Fill(indx1,indx2,var);
1465  } catch (OutOfBounds) {
1466  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside matrix size. Indices were: " << indx1 << ", " << indx2 << std::endl;
1467  }
1468 }
1469 
1470 //********************************************************************
1471 void OutputManager::FillMatrixVar(Int_t index, Double_t var, Int_t indx1, Int_t indx2){
1472 //********************************************************************
1473 
1474  CheckVariableType(index, "Matrix", "Double", _tree_vars_exist_double_matrix[GetCurrentTree()][index]);
1475 
1476  if (!GetFirstIndexFromCounter(index,indx1)) return;
1477 
1478  // fill the variable
1479  try {
1480  (_tree_vars_double_matrix[GetCurrentTree()][index])->Fill(indx1,indx2,var);
1481  } catch (OutOfBounds) {
1482  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside matrix size. Indices were: " << indx1 << ", " << indx2 << std::endl;
1483  }
1484 }
1485 
1486 //********************************************************************
1487 void OutputManager::Fill3DMatrixVar(Int_t index, Int_t var, Int_t indx1, Int_t indx2, Int_t indx3){
1488 //********************************************************************
1489 
1490  CheckVariableType(index, "3DMatrix", "Int", _tree_vars_exist_int_3Dmatrix[GetCurrentTree()][index]);
1491 
1492  if (!GetFirstIndexFromCounter(index,indx1)) return;
1493 
1494  // fill the variable
1495  try {
1496  (_tree_vars_int_3Dmatrix[GetCurrentTree()][index])->Fill(indx1,indx2,indx3,var);
1497  } catch (OutOfBounds) {
1498  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside 3D matrix size. Indices were: " << indx1 << ", " << indx2 << ", " << indx3 << std::endl;
1499  }
1500 }
1501 
1502 //********************************************************************
1503 void OutputManager::Fill3DMatrixVar(Int_t index, Float_t var, Int_t indx1, Int_t indx2, Int_t indx3){
1504 //********************************************************************
1505 
1506  CheckVariableType(index, "3DMatrix", "Float", _tree_vars_exist_float_3Dmatrix[GetCurrentTree()][index]);
1507 
1508  if (!GetFirstIndexFromCounter(index,indx1)) return;
1509 
1510  // fill the variable
1511  try {
1512  (_tree_vars_float_3Dmatrix[GetCurrentTree()][index])->Fill(indx1,indx2,indx3,var);
1513  } catch (OutOfBounds) {
1514  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside 3D matrix size. Indices were: " << indx1 << ", " << indx2 << ", " << indx3 << std::endl;
1515  }
1516 }
1517 
1518 //********************************************************************
1519 void OutputManager::Fill3DMatrixVar(Int_t index, Double_t var, Int_t indx1, Int_t indx2, Int_t indx3){
1520 //********************************************************************
1521 
1522  CheckVariableType(index, "3DMatrix", "Double", _tree_vars_exist_double_3Dmatrix[GetCurrentTree()][index]);
1523 
1524  if (!GetFirstIndexFromCounter(index,indx1)) return;
1525 
1526  // fill the variable
1527  try {
1528  (_tree_vars_double_3Dmatrix[GetCurrentTree()][index])->Fill(indx1,indx2,indx3,var);
1529  } catch (OutOfBounds) {
1530  std::cout << "WARNING: Tried to fill variable " << GetVarName(index) << " outside 3D matrix size. Indices were: " << indx1 << ", " << indx2 << ", " << indx3 << std::endl;
1531  }
1532 }
1533 
1534 //********************************************************************
1535 void OutputManager::FillToyVar(Int_t index, Int_t var){
1536 //********************************************************************
1537 
1538  FillVectorVar(index, var, GetToyIndex());
1539 }
1540 
1541 //********************************************************************
1542 void OutputManager::FillToyVar(Int_t index, Float_t var){
1543 //********************************************************************
1544  FillVectorVar(index, var, GetToyIndex());
1545 }
1546 
1547 //********************************************************************
1548 void OutputManager::FillToyVar(Int_t index, Double_t var){
1549 //********************************************************************
1550  FillVectorVar(index, var, GetToyIndex());
1551 }
1552 
1553 //********************************************************************
1554 void OutputManager::FillToyVectorVar(Int_t index, Int_t var, const Int_t comp){
1555 //********************************************************************
1556  FillMatrixVar(index,var, GetToyIndex(),comp);
1557 }
1558 
1559 //********************************************************************
1560 void OutputManager::FillToyVectorVar(Int_t index, Float_t var, const Int_t comp){
1561 //********************************************************************
1562 
1563  FillMatrixVar(index,var, GetToyIndex(),comp);
1564 }
1565 
1566 //********************************************************************
1567 void OutputManager::FillToyVectorVar(Int_t index, Double_t var, const Int_t comp){
1568 //********************************************************************
1569  FillMatrixVar(index,var, GetToyIndex(),comp);
1570 }
1571 
1572 //********************************************************************
1573 void OutputManager::FillToyMatrixVar(Int_t index, Int_t var, const Int_t comp1, const Int_t comp2){
1574 //********************************************************************
1575  Fill3DMatrixVar(index,var, GetToyIndex(),comp1,comp2);
1576 }
1577 
1578 //********************************************************************
1579 void OutputManager::FillToyMatrixVar(Int_t index, Float_t var, const Int_t comp1, const Int_t comp2){
1580 //********************************************************************
1581 
1582  Fill3DMatrixVar(index,var, GetToyIndex(),comp1,comp2);
1583 }
1584 
1585 //********************************************************************
1586 void OutputManager::FillToyMatrixVar(Int_t index, Double_t var, const Int_t comp1, const Int_t comp2){
1587 //********************************************************************
1588  Fill3DMatrixVar(index,var, GetToyIndex(),comp1,comp2);
1589 }
1590 
1591 //********************************************************************
1592 void OutputManager::CheckVariableType(Int_t index, const std::string& dim, const std::string& type, Bool_t exist){
1593 //********************************************************************
1594 
1595  if (!exist){
1596  std::cout << "ERROR in OutputManager::Fill" << dim << "Var(). " << GetVarName(index) << " is not a " << type << " variable. !!!!" << std::endl;
1597  std::cout << "Please check the call to Fill" << dim << "Var(" << GetVarName(index) << ", A) in your analysis algorithm and cast the A input value if needed !!!!" << std::endl;
1598  exit(1);
1599  }
1600 }
void AddVar(Int_t index, const std::string &name, const std::string &type, const std::string &doc, double ini=-9999)
Add a single variable to all trees.
Float_t GetVarValueF(Int_t index)
Get the value of a var already filled (so to be used in another package)
void AddTreeWithName(Int_t tree_index, const std::string &tree_name, TTree *tree=NULL)
Add a tree provided its index and name.
void AddToyVar(Int_t index, const std::string &name, const std::string &type, const std::string &docstring)
Add a single analysis variable to all trees.
void FillVectorVar(Int_t index, Float_t var, Int_t indx=-1)
Fill a vector variable.
void FillToyVectorVar(Int_t index, Int_t var, Int_t comp)
Fill a vector analysis variable.
Exception for if we try to fill outside the size of float_vector etc.
void FillTree()
Fill the current tree.
bool ValidateVarNameAndIndex(Int_t tree_index, Int_t var_index, const std::string &var_name)
void Fill3DMatrixVar(Int_t index, Float_t var, Int_t indx1, Int_t indx2, Int_t indx3)
Fill a 3D matrix variable.
void FillToyMatrixVar(Int_t index, Int_t var, Int_t comp1, Int_t comp2)
Fill a matrix analysis variable.
void WriteTrees(const std::string &file)
Write all trees into a file.
void SetNToys(Int_t tree_index, int ntoys)
Sets and gets the number of toy experiments for a given configuration.
void FillToyVar(Int_t index, Int_t var)
Fill a single analysis variable.
void FillVar(Int_t index, Float_t var)
Fill a single variable.
void WriteTree(const std::string &file, const std::string &conf)
Write a specific tree into a file.
void AddMatrixVar(Int_t index, const std::string &name, const std::string &type, const std::string &doc, Int_t counter_index, const std::string &counter_name, int size1=-MAXVECTORSIZE, int size2=-1)
Add a matrix variable to all trees.
void CloseOutputFile()
close the output file
void AddToyMatrixVar(Int_t index, const std::string &name, const std::string &type, const std::string &docstring, int ncomp1, int ncomp2)
Add a matrix analysis variable to all trees.
bool OpenOutputFile(const std::string &file)
open the output file
void AddVectorVar(Int_t index, const std::string &name, const std::string &type, const std::string &doc, Int_t counter_index, const std::string &counter_name, Int_t size=-MAXVECTORSIZE)
Add a vector variable to all trees.
void AddToyVectorVar(Int_t index, const std::string &name, const std::string &type, const std::string &docstring, int ncomp)
Add a vector analysis variable to all trees.
void Write()
Write histograms of the memory usage to the output file.
Definition: MemoryUsage.cxx:27
void FillMatrixVar(Int_t index, Float_t var, Int_t indx1, Int_t indx2)
Fill a matrix variable.
bool IsSpecialTree(Int_t tree_index)
void Add3DMatrixVar(Int_t index, const std::string &name, const std::string &type, const std::string &doc, Int_t counter_index, const std::string &counter_name, int size1=-MAXVECTORSIZE, int size2=-1, int size3=-1)
Add a 3D matrix variable to all trees.