ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
generate_small_tree.cxx
Go to the documentation of this file.
2 
3 #include <cstring>
4 
5 #include <stdexcept>
6 #include <iostream>
7 #include <iomanip>
8 #include <vector>
9 #include <string>
10 #include <fstream>
11 #include <set>
12 
13 #include <unistd.h>
14 
15 using namespace std;
16 
17 string ToCaps(string str){
18  for(string::iterator it = str.begin();
19  it != str.end();
20  ++it){
21  *it = toupper(*it);
22  }
23  return str;
24 }
25 
26 string execute(const string &cmd){
27  FILE *pipe = popen(cmd.c_str(), "r");
28  if(!pipe) throw runtime_error("Could not open pipe.");
29  const size_t buffer_size = 128;
30  char buffer[buffer_size];
31  string result = "";
32  while(!feof(pipe)){
33  if(fgets(buffer, buffer_size, pipe) != NULL) result += buffer;
34  }
35 
36  pclose(pipe);
37  return result;
38 }
39 
40 vector<string> Tokenize(const string& input,
41  const string& tokens = " "){
42  char* ipt(new char[input.size()+1]);
43  memcpy(ipt, input.data(), input.size());
44  ipt[input.size()]=static_cast<char>(0);
45  char* ptr(strtok(ipt, tokens.c_str()));
46  vector<string> output(0);
47  while(ptr!=NULL){
48  output.push_back(ptr);
49  ptr=strtok(NULL, tokens.c_str());
50  }
51  return output;
52 }
53 
54 string FixName(string name){
55  //Variable names can have alphanumeric characters and underscores only
56  string allowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_";
57 
58  //Remove illegal characters
59  size_t pos = name.find_first_not_of(allowed);
60  while(pos < name.size()){
61  name.at(pos) = '_';
62  pos = name.find_first_not_of(allowed);
63  }
64 
65  //Replace double underscore with single underscore
66  pos = name.rfind("__");
67  while(pos < name.size()){
68  name.replace(pos, 2, "_");
69  pos = name.rfind("__");
70  }
71 
72  //Remove leading and trailing spaces
73  pos = 0;
74  for(pos = 0; pos < name.size(); ++pos){
75  if(name.at(pos) != ' ') break;
76  }
77  size_t endpos = name.size();
78  for(endpos = name.size(); endpos != 0; --endpos){
79  if(name.at(endpos-1) != ' ') break;
80  }
81 
82  return name.substr(pos, endpos-pos);
83 }
84 
85 set<Variable> GetVariables(const string &file_name){
86  string allowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_";
87  set<Variable> vars;
88 
89  ifstream infile(("txt/small_tree_cfg/"+file_name).c_str());
90  string line;
91  while(getline(infile, line)){
92  size_t start = line.find_first_not_of(" ");
93  if(start >= line.size() || line.at(start) == '#' || line.at(start) == '/') continue;
94 
95  //Replace double space with single space
96  size_t pos = line.rfind(" ");
97  while(pos < line.size()){
98  line.replace(pos, 2, " ");
99  pos = line.rfind(" ");
100  }
101  size_t end = line.find_last_of(allowed)+1;
102  size_t split = line.rfind(' ', end)+1;
103 
104  vars.insert(Variable(line.substr(start, split-start),
105  line.substr(split, end-split)));
106  }
107  infile.close();
108 
109  return vars;
110 }
111 
112 int main(int argc, char *argv[]){
113  int c = 0;
114  bool do_event_handler = true;
115  while((c=getopt(argc, argv, "t"))!=-1){
116  switch(c){
117  case 't':
118  do_event_handler = false;
119  break;
120  default:
121  break;
122  }
123  }
124  vector<string> file_names = Tokenize(execute("ls txt/small_tree_cfg/ 2> /dev/null"), "\n");
125 
126  vector<pair<string, set<Variable> > > sep_vars(file_names.size());
127  vector<string> fixed_names(file_names.size());
128  for(size_t ifile = 0; ifile < file_names.size(); ++ifile){
129  fixed_names.at(ifile) = FixName(file_names.at(ifile));
130  sep_vars.at(ifile).first = fixed_names.at(ifile);
131  sep_vars.at(ifile).second = GetVariables(file_names.at(ifile));
132  }
133 
134  set<Variable> all_vars;
135  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
136  for(set<Variable>::const_iterator var = sep_vars.at(ifile).second.begin();
137  var != sep_vars.at(ifile).second.end();
138  ++var){
139  all_vars.insert(*var);
140  }
141  }
142 
143  set<Variable> com_vars;
144  if(sep_vars.size()){
145  for(set<Variable>::const_iterator var = sep_vars.at(0).second.begin();
146  var != sep_vars.at(0).second.end();
147  ++var){
148  bool found_in_all = true;
149  for(size_t ifile = 1; found_in_all && ifile < sep_vars.size(); ++ifile){
150  if(sep_vars.at(ifile).second.find(*var) == sep_vars.at(ifile).second.end()){
151  found_in_all = false;
152  }
153  }
154  if(found_in_all){
155  com_vars.insert(*var);
156  }
157  }
158  for(set<Variable>::const_iterator var = com_vars.begin();
159  var != com_vars.end();
160  ++var){
161  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
162  sep_vars.at(ifile).second.erase(*var);
163  }
164  }
165  }
166 
167  WriteBaseHeader(all_vars, com_vars, fixed_names);
168  WriteBaseSource(all_vars, com_vars, fixed_names);
169 
170  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
171  WriteSepHeader(sep_vars.at(ifile));
172  WriteSepSource(sep_vars.at(ifile));
173  }
174 
175  if(do_event_handler){
176  vector<string> existing = Tokenize(execute("ls src/event_handler* 2> /dev/null"));
177  set<string> to_generate;
178  for(size_t iname = 0; iname < fixed_names.size(); ++iname){
179  bool found = false;
180  for(size_t iexist = 0; !found && iexist < existing.size(); ++iexist){
181  if(Contains(existing.at(iexist), fixed_names.at(iname))) found = true;
182  }
183  if(!found) to_generate.insert(fixed_names.at(iname));
184  }
185 
188 
189  for(set<string>::const_iterator name = to_generate.begin();
190  name != to_generate.end();
191  ++name){
194  }
195 
196  GenerateEventHandlerMergeHeader(fixed_names);
197  GenerateEventHandlerMergeSource(fixed_names);
198  }
199 }
200 
201 bool Contains(const string &text, const string &pattern){
202  return text.find(pattern) != string::npos;
203 }
204 
205 void WriteBaseHeader(const set<Variable> &all_vars,
206  const set<Variable> &com_vars,
207  const vector<string> &names){
208  ofstream file("inc/small_tree.hpp");
209 
210  file << "// small_tree: base class to handle reduced tree ntuples\n";
211  file << "// File generated with generate_small_tree.exe\n\n";
212 
213  file << "#ifndef H_SMALL_TREE\n";
214  file << "#define H_SMALL_TREE\n\n";
215 
216  file << "#include <vector>\n";
217  file << "#include <string>\n\n";
218 
219  file << "#include \"TTree.h\"\n";
220  file << "#include \"TChain.h\"\n";
221  file << "#include \"TTreeFormula.h\"\n\n";
222 
223  file << "class small_tree{\n";
224  file << "public:\n";
225  file << " small_tree(); // Constructor to create tree\n";
226  file << " small_tree(const std::string &filename); // Constructor to read tree\n\n";
227 
228  file << " int Add(const std::string &filename);\n";
229 
230  file << " long GetEntries() const;\n";
231  file << " virtual void GetEntry(const long entry);\n";
232  file << " float GetBranchValue(TString branch);\n";
233  file << " bool PassString(TString cut);\n\n";
234 
235  file << " virtual void Fill();\n";
236  file << " void Write();\n\n";
237 
238  file << " virtual std::string Type() const;\n\n";
239 
240  file << " static const double bad_val_;\n\n";
241 
242  file << " virtual ~small_tree();\n\n";
243 
244  for(set<Variable>::const_iterator var = com_vars.begin();
245  var != com_vars.end();
246  ++var){
247  file << " " << var->type_ << " const & " << var->name_ << "() const;\n";
248  file << " " << var->type_ << " & " << var->name_ << "();\n";
249  }
250  file << '\n';
251 
252  for(set<Variable>::const_iterator var = all_vars.begin();
253  var != all_vars.end();
254  ++var){
255  if(com_vars.find(*var) != com_vars.end()) continue;
256  file << " __attribute__((noreturn)) virtual "
257  << var->type_ << " const & " << var->name_ << "() const;\n";
258  file << " __attribute__((noreturn)) virtual "
259  << var->type_ << " & " << var->name_ << "();\n";
260  }
261  file << '\n';
262 
263  file << "protected:\n";
264  file << " TChain chain_;\n";
265  file << " TTree tree_;\n";
266  file << " long entry_;\n";
267  file << " const bool read_only_;\n\n";
268 
269  file << "private:\n";
270  file << " class VectorLoader{\n";
271  file << " public:\n";
272  file << " VectorLoader();\n";
273  file << " private:\n";
274  file << " static bool loaded_;\n";
275  file << " };\n\n";
276 
277  file << " static VectorLoader vl_;\n";
278  for(set<Variable>::const_iterator var = com_vars.begin();
279  var != com_vars.end();
280  ++var){
281  file << " " << var->type_ << ' ' << var->name_ << "_;\n";
282  if(Contains(var->type_, "vector")){
283  file << " " << var->type_ << " *p_" << var->name_ << "_;\n";
284  }
285  file << " TBranch *b_" << var->name_ << "_;\n";
286  file << " mutable bool c_" << var->name_ << "_;\n";
287  }
288  file << "};\n\n";
289 
290  file << "small_tree* NewTree(const std::type_info &type);\n\n";
291 
292  for(size_t i = 0; i < names.size(); ++i){
293  file << "#include \"small_tree_" << names.at(i) << ".hpp\"\n";
294  }
295  file <<'\n';
296 
297  file << "#endif" << endl;
298 
299  file.close();
300 }
301 
302 void WriteBaseSource(const set<Variable> &all_vars,
303  const set<Variable> &com_vars,
304  const vector<string> &names){
305  ofstream file("src/small_tree.cpp");
306 
307  file << "// small_tree: base class to handle reduce tree ntuples\n";
308  file << "//File generated with generate_small_tree.exe\n\n";
309 
310  file << "#include \"small_tree.hpp\"\n\n";
311 
312  file << "#include <stdexcept>\n";
313  file << "#include <string>\n";
314  file << "#include <iostream>\n";
315  file << "#include <vector>\n\n";
316 
317  file << "#include \"TROOT.h\"\n";
318  file << "#include \"TTree.h\"\n";
319  file << "#include \"TBranch.h\"\n";
320  file << "#include \"TChain.h\"\n";
321  file << "#include \"TTreeFormula.h\"\n\n";
322 
323  file << "using namespace std;\n\n";
324 
325  file << "bool small_tree::VectorLoader::loaded_ = false;\n\n";
326 
327  file << "small_tree::VectorLoader small_tree::vl_ = small_tree::VectorLoader();\n\n";
328 
329  file << "small_tree::VectorLoader::VectorLoader(){\n";
330  file << " if(!loaded_){\n";
331  file << " gROOT->ProcessLine(\"#include <vector>\");\n";
332  file << " loaded_ = true;\n";
333  file << " }\n";
334  file << "}\n\n";
335 
336  file << "const double small_tree::bad_val_ = -999.;\n\n";
337 
338  file << "small_tree::small_tree():\n";
339  file << " chain_(\"junk\", \"junk\"),\n";
340  file << " tree_(\"tree\", \"tree\"),\n";
341  file << " entry_(0),\n";
342  if(com_vars.size()){
343  const set<Variable>::const_iterator com_end_2 = --com_vars.end();
344  file << " read_only_(false),\n";
345  for(set<Variable>::const_iterator var = com_vars.begin();
346  var != com_end_2;
347  ++var){
348  file << " " << var->name_ << "_(0),\n";
349  if(Contains(var->type_, "vector")){
350  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
351  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &p_" << var->name_ << "_)),\n";
352  }else{
353  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &" << var->name_ << "_)),\n";
354  }
355  file << " c_" << var->name_ << "_(false),\n";
356  }
357  file << " " << com_end_2->name_ << "_(0),\n";
358  file << " b_" << com_end_2->name_ << "_(tree_.Branch(\"" << com_end_2->name_ << "\", &" << com_end_2->name_ << "_)),\n";
359  file << " c_" << com_end_2->name_ << "_(false){\n";
360  }else{
361  file << " read_only_(false){\n";
362  }
363  file << "}\n\n";
364 
365  file << "small_tree::small_tree(const string &filename):\n";
366  file << " chain_(\"tree\",\"tree\"),\n";
367  file << " tree_(\"junk\",\"junk\"),\n";
368  file << " entry_(0),\n";
369  if(com_vars.size()){
370  const set<Variable>::const_iterator com_end_2 = --com_vars.end();
371  file << " read_only_(true),\n";
372  for(set<Variable>::const_iterator var = com_vars.begin();
373  var != com_end_2;
374  ++var){
375  file << " " << var->name_ << "_(0),\n";
376  if(Contains(var->type_, "vector")){
377  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
378  }
379  file << " b_" << var->name_ << "_(NULL),\n";
380  file << " c_" << var->name_ << "_(false),\n";
381  }
382  file << " " << com_end_2->name_ << "_(0),\n";
383  if(Contains(com_end_2->type_, "vector")){
384  file << " p_" << com_end_2->name_ << "_(&" << com_end_2->name_ << "_),\n";
385  }
386  file << " b_" << com_end_2->name_ << "_(NULL),\n";
387  file << " c_" << com_end_2->name_ << "_(false){\n";
388  }else{
389  file << " read_only_(true){\n";
390  }
391  file << " chain_.Add(filename.c_str());\n";
392  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
393  if(Contains(var->type_, "vector")){
394  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &p_" << var->name_ << "_, &b_" << var->name_ << "_);\n";
395  }else{
396  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &" << var->name_ << "_, &b_" << var->name_ << "_);\n";
397  }
398  }
399  file << "}\n\n";
400 
401  file << "void small_tree::Fill(){\n";
402  file << " if(read_only_){\n";
403  file << " throw std::logic_error(\"Trying to write to read-only tree\");\n";
404  file << " }else{\n";
405  file << " tree_.Fill();\n";
406  file << " }\n\n";
407 
408  file << " //Resetting variables\n";
409  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
410  if(Contains(var->type_, "vector")){
411  file << " " << var->name_ << "_.clear();\n";
412  }else if(Contains(var->type_, "tring")){
413  file << " " << var->name_ << "_ = \"\";\n";
414  }else{
415  file << " " << var->name_ << "_ = static_cast<" << var->type_ << ">(bad_val_);\n";
416  }
417  }
418  file << "}\n\n";
419 
420  file << "void small_tree::Write(){\n";
421  file << " if(read_only_){\n";
422  file << " throw std::logic_error(\"Trying to write to read-only tree.\");\n";
423  file << " }else{\n";
424  file << " tree_.Write();\n";
425  file << " }\n";
426  file << "}\n\n";
427 
428  file << "string small_tree::Type() const{\n";
429  file << " return \"\";\n";
430  file << "}\n\n";
431 
432  file << "small_tree::~small_tree(){\n";
433  file << "}\n\n";
434 
435  file << "int small_tree::Add(const std::string &filename){\n";
436  file << " if(!read_only_){\n";
437  file << " throw std::logic_error(\"Trying to add files to tree opened for writing.\");\n";
438  file << " }\n";
439  file << " return chain_.Add(filename.c_str());\n";
440  file << "}\n\n";
441 
442  file << "float small_tree::GetBranchValue(TString branch){\n";
443  file << " TTreeFormula f(\"formula\",branch, &chain_);\n";
444  file << " float result = f.EvalInstance(0);\n";
445  file << " return result;\n";
446  file << "}\n\n";
447 
448 
449  file << "bool small_tree::PassString(TString cut){\n";
450  file << " TTreeFormula f(\"formula\",cut, &chain_);\n";
451  file << " bool result = f.EvalInstance(0);\n";
452  file << " return result;\n";
453  file << "}\n\n";
454 
455  file << "long small_tree::GetEntries() const{\n";
456  file << " if(read_only_){\n";
457  file << " return chain_.GetEntries();\n";
458  file << " }else{\n";
459  file << " return tree_.GetEntries();\n";
460  file << " }\n";
461  file << "}\n\n";
462 
463  file << "void small_tree::GetEntry(const long entry){\n";
464  file << " if(!read_only_){\n";
465  file << " throw std::logic_error(\"Trying to read from write-only tree.\");\n";
466  file << " }\n\n";
467 
468  for(set<Variable>::const_iterator var = com_vars.begin(); var!= com_vars.end(); ++var){
469  file << " c_" << var->name_ << "_ = false;\n";
470  }
471  file << " entry_ = chain_.LoadTree(entry);\n";
472  file << "}\n\n";
473 
474  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
475  file << var->type_ << " const & small_tree::" << var->name_ << "() const{\n";
476  file << " if(!read_only_){\n";
477  file << " throw std::logic_error(\"Trying to write to const tree.\");\n";
478  file << " }\n";
479  file << " if(!c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
480  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
481  file << " c_" << var->name_ << "_ = true;\n";
482  file << " }\n";
483  file << " return " << var->name_ << "_;\n";
484  file << "}\n\n";
485  }
486 
487  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
488  file << var->type_ << " & small_tree::" << var->name_ << "(){\n";
489  file << " if(read_only_ && !c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
490  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
491  file << " c_" << var->name_ << "_ = true;\n";
492  file << " }\n";
493  file << " return " << var->name_ << "_;\n";
494  file << "}\n\n";
495  }
496 
497  for(set<Variable>::const_iterator var = all_vars.begin(); var != all_vars.end(); ++var){
498  if(com_vars.find(*var) != com_vars.end()) continue;
499  file << var->type_ << " const & small_tree::" << var->name_ << "() const{\n";
500  file << " throw std::logic_error(\"" << var->name_
501  << " does not exist in this small_tree version.\");\n";
502  file << "}\n\n";
503  }
504 
505  for(set<Variable>::const_iterator var = all_vars.begin(); var != all_vars.end(); ++var){
506  if(com_vars.find(*var) != com_vars.end()) continue;
507  file << var->type_ << " & small_tree::" << var->name_ << "(){\n";
508  file << " throw std::logic_error(\"" << var->name_
509  << " does not exist in this small_tree version.\");\n";
510  file << "}\n\n";
511  }
512 
513  for(size_t i = 0; i < names.size(); ++i){
514  file << "#include \"small_tree_" << names.at(i) << ".hpp\"\n";
515  }
516  file << "small_tree* NewTree(const std::type_info &type){\n\n";
517  file << " if(type == typeid(small_tree)) return new small_tree;\n";
518  for(size_t i = 0; i < names.size(); ++i){
519  file << " else if(type == typeid(small_tree_" << names.at(i) << ")) return static_cast<small_tree*>(new small_tree_" << names.at(i) << ");\n";
520  }
521  file << " else return new small_tree;\n";
522  file << "}\n\n";
523 
524  file.close();
525 }
526 
527 void WriteSepHeader(const pair<string, set<Variable> > &sep_vars){
528  string name = sep_vars.first;
529  string NAME = ToCaps(name);
530  set<Variable> vars = sep_vars.second;
531  ofstream file(("inc/small_tree_"+name+".hpp").c_str());
532 
533  file << "// small_tree_" << name << ": " << name << " version of small_tree to handle reduce tree ntuples\n";
534  file << "// File generated with generate_small_tree.exe\n\n";
535 
536  file << "#ifndef H_SMALL_TREE_" << NAME << "\n";
537  file << "#define H_SMALL_TREE_" << NAME << "\n\n";
538 
539  file << "#include <vector>\n";
540  file << "#include <string>\n\n";
541 
542  file << "#include \"TTree.h\"\n";
543  file << "#include \"TChain.h\"\n\n";
544 
545  file << "#include \"small_tree.hpp\"\n\n";
546 
547  file << "class small_tree_" << name << " : public small_tree{\n";
548  file << "public:\n";
549  file << " small_tree_" << name << "(); // Constructor to create tree\n";
550  file << " small_tree_" << name << "(const std::string &filename); // Constructor to read tree\n\n";
551 
552  file << " virtual void GetEntry(const long entry);\n\n";
553 
554  file << " virtual void Fill();\n\n";
555 
556  file << " virtual std::string Type() const;\n\n";
557 
558  file << " virtual ~small_tree_" << name << "();\n\n";
559 
560  for(set<Variable>::const_iterator var = vars.begin();
561  var != vars.end();
562  ++var){
563  file << " virtual " << var->type_ << " const & " << var->name_ << "() const;\n";
564  file << " virtual " << var->type_ << " & " << var->name_ << "();\n";
565  }
566  file << '\n';
567 
568  file << "private:\n";
569  for(set<Variable>::const_iterator var = vars.begin();
570  var != vars.end();
571  ++var){
572  file << " " << var->type_ << ' ' << var->name_ << "_;\n";
573  if(Contains(var->type_, "vector")){
574  file << " " << var->type_ << " *p_" << var->name_ << "_;\n";
575  }
576  file << " TBranch *b_" << var->name_ << "_;\n";
577  file << " mutable bool c_" << var->name_ << "_;\n";
578  }
579  file << "};\n\n";
580 
581  file << "#endif" << endl;
582 
583  file.close();
584 }
585 
586 void WriteSepSource(const pair<string, set<Variable> > &sep_vars){
587  string name = sep_vars.first;
588  string NAME = ToCaps(name);
589  set<Variable> vars = sep_vars.second;
590  ofstream file(("src/small_tree_"+name+".cpp").c_str());
591 
592  file << "// small_tree_" << name << ": " << name << " version of small_tree to handle reduce tree ntuples\n";
593  file << "//File generated with generate_small_tree.exe\n\n";
594 
595  file << "#include \"small_tree.hpp\"\n\n";
596  file << "#include \"small_tree_" << name << ".hpp\"\n\n";
597 
598  file << "#include <stdexcept>\n";
599  file << "#include <string>\n";
600  file << "#include <vector>\n\n";
601 
602  file << "#include \"TTree.h\"\n";
603  file << "#include \"TBranch.h\"\n";
604  file << "#include \"TChain.h\"\n\n";
605 
606  file << "using namespace std;\n\n";
607 
608  file << "small_tree_" << name << "::small_tree_" << name << "():\n";
609  if(vars.size()){
610  const set<Variable>::const_iterator vars_end_2 = --vars.end();
611  file << " small_tree(),\n";
612  for(set<Variable>::const_iterator var = vars.begin();
613  var != vars_end_2;
614  ++var){
615  file << " " << var->name_ << "_(0),\n";
616  if(Contains(var->type_, "vector")){
617  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
618  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &p_" << var->name_ << "_)),\n";
619  }else{
620  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &" << var->name_ << "_)),\n";
621  }
622  file << " c_" << var->name_ << "_(false),\n";
623  }
624  file << " " << vars_end_2->name_ << "_(0),\n";
625  if(Contains(vars_end_2->type_, "vector")){
626  file << " p_" << vars_end_2->name_ << "_(&" << vars_end_2->name_ << "_),\n";
627  file << " b_" << vars_end_2->name_ << "_(tree_.Branch(\"" << vars_end_2->name_ << "\", &p_" << vars_end_2->name_ << "_)),\n";
628  }else{
629  file << " b_" << vars_end_2->name_ << "_(tree_.Branch(\"" << vars_end_2->name_ << "\", &" << vars_end_2->name_ << "_)),\n";
630  }
631  file << " c_" << vars_end_2->name_ << "_(false){\n";
632  }else{
633  file << " small_tree(){\n";
634  }
635  file << "}\n\n";
636 
637  file << "small_tree_" << name << "::small_tree_" << name << "(const string &filename):\n";
638  if(vars.size()){
639  const set<Variable>::const_iterator vars_end_2 = --vars.end();
640  file << " small_tree(filename),\n";
641  for(set<Variable>::const_iterator var = vars.begin();
642  var != vars_end_2;
643  ++var){
644  file << " " << var->name_ << "_(0),\n";
645  if(Contains(var->type_, "vector")){
646  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
647  }
648  file << " b_" << var->name_ << "_(NULL),\n";
649  file << " c_" << var->name_ << "_(false),\n";
650  }
651  file << " " << vars_end_2->name_ << "_(0),\n";
652  if(Contains(vars_end_2->type_, "vector")){
653  file << " p_" << vars_end_2->name_ << "_(&" << vars_end_2->name_ << "_),\n";
654  }
655  file << " b_" << vars_end_2->name_ << "_(NULL),\n";
656  file << " c_" << vars_end_2->name_ << "_(false){\n";
657  }else{
658  file << " small_tree(filename){\n";
659  }
660  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
661  if(Contains(var->type_, "vector")){
662  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &p_" << var->name_ << "_, &b_" << var->name_ << "_);\n";
663  }else{
664  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &" << var->name_ << "_, &b_" << var->name_ << "_);\n";
665  }
666  }
667  file << "}\n\n";
668 
669  file << "void small_tree_" << name << "::Fill(){\n";
670  file << " small_tree::Fill();\n";
671 
672  file << " //Resetting variables\n";
673  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
674  if(Contains(var->type_, "vector")){
675  file << " " << var->name_ << "_.clear();\n";
676  }else if(Contains(var->type_, "tring")){
677  file << " " << var->name_ << "_ = \"\";\n";
678  }else{
679  file << " " << var->name_ << "_ = static_cast<" << var->type_ << ">(bad_val_);\n";
680  }
681  }
682  file << "}\n\n";
683 
684  file << "string small_tree_" << name << "::Type() const{\n";
685  file << " return \"" << name << "\";\n";
686  file << "}\n\n";
687 
688  file << "small_tree_" << name << "::~small_tree_" << name << "(){\n";
689  file << "}\n\n";
690 
691  file << "void small_tree_" << name << "::GetEntry(const long entry){\n";
692  file << " small_tree::GetEntry(entry);\n\n";
693 
694  for(set<Variable>::const_iterator var = vars.begin(); var!= vars.end(); ++var){
695  file << " c_" << var->name_ << "_ = false;\n";
696  }
697  file << "}\n\n";
698 
699  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
700  file << var->type_ << " const & small_tree_" << name << "::" << var->name_ << "() const{\n";
701  file << " if(!read_only_){\n";
702  file << " throw std::logic_error(\"Trying to write to const tree.\");\n";
703  file << " }\n";
704  file << " if(!c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
705  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
706  file << " c_" << var->name_ << "_ = true;\n";
707  file << " }\n";
708  file << " return " << var->name_ << "_;\n";
709  file << "}\n\n";
710  }
711 
712  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
713  file << var->type_ << " & small_tree_" << name << "::" << var->name_ << "(){\n";
714  file << " if(read_only_ && !c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
715  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
716  file << " c_" << var->name_ << "_ = true;\n";
717  file << " }\n";
718  file << " return " << var->name_ << "_;\n";
719  file << "}\n\n";
720  }
721 
722  file.close();
723 }
724 
726  ofstream file("inc/event_handler_base.hpp");
727 
728  file << " // event_handler_base: base class for reduced tree production\n";
729  file << " // File generated with generate_small_tree.exe\n\n";
730 
731  file << "#ifndef H_EVENT_HANDLER_BASE\n";
732  file << "#define H_EVENT_HANDLER_BASE\n\n";
733 
734  file << "#include <string>\n\n";
735 
736  file << "#include \"TString.h\"\n\n";
737 
738  file << "#include \"phys_objects.hpp\"\n\n";
739 
740  file << "class event_handler_base : public phys_objects{\n";
741  file << "public:\n";
742  file << " event_handler_base(const std::string &file_name);\n\n";
743 
744  file << " virtual void ReduceTree(int num_entries,\n";
745  file << " const TString &out_file_name,\n";
746  file << " int num_total_entries) = 0;\n\n";
747 
748  file << " virtual ~event_handler_base();\n";
749 
750  file << "};\n\n";
751 
752  file << "#endif\n";
753 
754  file.close();
755 }
756 
758  ofstream file("src/event_handler_base.cpp");
759 
760  file << "// event_handle_base: base class for reduced tree production\n";
761  file << "// File generated with generate_small_tree.exe\n\n";
762 
763  file << "#include \"event_handler_base.hpp\"\n\n";
764 
765  file << "#include <string>\n";
766 
767  file << "using namespace std;\n\n";
768 
769  file << "event_handler_base::event_handler_base(const string &file_name):\n";
770  file << " phys_objects(file_name){\n";
771  file << "}\n\n";
772 
773  file << "event_handler_base::~event_handler_base(){\n";
774  file << "}\n\n";
775 }
776 
777 void GenerateEventHandlerHeader(const string &name){
778  string NAME = ToCaps(name);
779  ofstream file(("inc/event_handler_"+name+".hpp").c_str());
780 
781  file << " // event_handler_" << name << ": derived class for specialized reduced tree production\n";
782  file << " // File generated with generate_small_tree.exe\n\n";
783 
784  file << "#ifndef H_EVENT_HANDLER_" << NAME << "\n";
785  file << "#define H_EVENT_HANDLER_" << NAME << "\n";
786 
787  file << "#include <string>\n";
788 
789  file << "#include \"TString.h\"\n\n";
790 
791  file << "#include \"event_handler_base.hpp\"\n\n";
792 
793  file << "class event_handler_" << name << " : public event_handler_base{\n";
794  file << "public:\n";
795  file << " event_handler_" << name << "(const std::string &file_name);\n\n";
796 
797  file << " virtual void ReduceTree(int num_entries,\n";
798  file << " const TString &out_file_name,\n";
799  file << " int num_total_entries);\n\n";
800 
801  file << " virtual ~event_handler_" << name << "();\n";
802 
803  file << "};\n\n";
804 
805  file << "#endif\n";
806 
807  file.close();
808 }
809 
810 void GenerateEventHandlerSource(const string &name){
811  ofstream file(("src/event_handler_"+name+".cpp").c_str());
812 
813  file << " // event_handler_" << name << ": derived class for specialized reduced tree production\n";
814  file << " // File generated with generate_small_tree.exe\n\n";
815 
816  file << "#include \"event_handler_" << name << ".hpp\"\n\n";
817 
818  file << "#include <string>\n";
819 
820  file << "#include \"TString.h\"\n\n";
821 
822  file << "#include \"event_handler_base.hpp\"\n\n";
823 
824  file << "using namespace std;\n\n";
825 
826  file << "event_handler_" << name << "::event_handler_" << name << "(const string &file_name):\n";
827  file << " event_handler_base(file_name){\n";
828  file << "}\n\n";
829 
830  file << "void event_handler_" << name << "::ReduceTree(int /*num_entries*/, const TString &/*out_file_name*/, int /*num_total_entries*/){\n";
831  file << "}\n\n";
832 
833  file << "event_handler_" << name << "::~event_handler_" << name << "(){\n";
834  file << "}\n";
835 
836  file.close();
837 }
838 
839 void GenerateEventHandlerMergeHeader(const vector<string> &names){
840  ofstream file("inc/event_handler.hpp");
841 
842  file << " // event_handler: main class for reduced tree production\n";
843  file << " //File generated with generate_small_tree.exe\n\n";
844 
845  file << "#ifndef H_EVENT_HANDLER\n";
846  file << "#define H_EVENT_HANDLER\n\n";
847 
848  file << "#include <string>\n";
849 
850  file << "#include \"TString.h\"\n\n";
851 
852  file << "#include \"event_handler_base.hpp\"\n\n";
853  for(vector<string>::const_iterator name = names.begin(); name != names.end(); ++name){
854  file << "#include \"event_handler_" << *name << ".hpp\"\n";
855  }
856 
857  file << "class event_handler{\n";
858  file << "public:\n";
859  file << " event_handler(const std::string &file_name, const std::string &type);\n";
860  file << " void ReduceTree(int num_entries, const TString &out_file_name, int num_total_entries);\n";
861  file << " long TotalEntries() const;\n";
862  file << " short GetVersion() const;\n";
863  file << " const std::string& SampleName() const;\n";
864  file << " const std::string& SampleName(const std::string &sample_name);\n";
865  file << " void SetFile(const std::string &file, bool is_8TeV = false);\n";
866  file << " void AddFiles(const std::string &file);\n";
867  file << " ~event_handler();\n";
868  file << "private:\n";
869  file << " event_handler_base *ehb;\n";
870  file << " static event_handler_base * LookUpType(const std::string &file_name, const std::string &type);\n";
871  file << "};\n\n";
872 
873  file << "#endif\n";
874 
875  file.close();
876 }
877 
878 void GenerateEventHandlerMergeSource(const vector<string> &names){
879  ofstream file("src/event_handler.cpp");
880 
881  file << "// event_handler: main class for reduced tree production\n";
882  file << " //File generated with generate_small_tree.exe\n\n";
883 
884  file << "#include \"event_handler.hpp\"\n\n";
885 
886  file << "#include <typeinfo>\n";
887  file << "#include <string>\n\n";
888 
889  file << "#include \"TString.h\"\n\n";
890 
891  file << "#include \"event_handler_base.hpp\"\n\n";
892  for(vector<string>::const_iterator name = names.begin(); name != names.end(); ++name){
893  file << "#include \"event_handler_" << *name << ".hpp\"\n";
894  }
895 
896  file << "using namespace std;\n\n";
897 
898  file << "#include \"event_handler_base.hpp\"\n\n";
899  for(vector<string>::const_iterator name = names.begin(); name != names.end(); ++name){
900  file << "#include \"event_handler_" << *name << ".hpp\"\n";
901  }
902 
903  file << "event_handler::event_handler(const string &file_name, const string &type):\n";
904  file << " ehb(LookUpType(file_name, type)){\n";
905  file << "}\n\n";
906 
907  file << "void event_handler::ReduceTree(int num_entries, const TString &out_file_name, int num_total_entries){\n";
908  file << " ehb->ReduceTree(num_entries, out_file_name, num_total_entries);\n";
909  file << "}\n\n";
910 
911  if(names.size()){
912  file << "event_handler_base * event_handler::LookUpType(const string &file_name, const string &type){\n";
913  file << " if(type == \"" << names.front() << "\"){\n";
914  file << " return new event_handler_" << names.front() << "(file_name);\n";
915  for(size_t itype = 1; itype < names.size(); ++itype){
916  file << " }else if(type == \"" << names.at(itype) << "\"){\n";
917  file << " return new event_handler_" << names.at(itype) << "(file_name);\n";
918  }
919  file << " }else{\n";
920  file << " return NULL;\n";
921  file << " }\n";
922  }else{
923  file << "event_handler_base * LookUpType(const string &/*file_name*/, const string &/*type*/){\n";
924  file << " return NULL;\n";
925  }
926  file << "}\n\n";
927 
928  file << "long event_handler::TotalEntries() const{\n";
929  file << " return ehb->TotalEntries();\n";
930  file << "}\n\n";
931 
932  file << "short event_handler::GetVersion() const{\n";
933  file << " return ehb->GetVersion();\n";
934  file << "}\n\n";
935 
936  file << "const std::string& event_handler::SampleName() const{\n";
937  file << " return ehb->SampleName();\n";
938  file << "}\n\n";
939 
940  file << "const std::string& event_handler::SampleName(const std::string &sample_name){\n";
941  file << " return ehb->SampleName(sample_name);\n";
942  file << "}\n\n";
943 
944  file << "void event_handler::SetFile(const std::string &file, bool is_8TeV){\n";
945  file << " ehb->SetFile(file, is_8TeV);\n";
946  file << "}\n\n";
947 
948  file << "void event_handler::AddFiles(const std::string &file){\n";
949  file << " ehb->AddFiles(file);\n";
950  file << "}\n\n";
951 
952  file << "event_handler::~event_handler(){\n";
953  file << " if(ehb){\n";
954  file << " delete ehb;\n";
955  file << " ehb = NULL;\n";
956  file << " }\n";
957  file << "}\n\n";
958 }
string FixName(string name)
void WriteBaseHeader(const set< Variable > &all_vars, const set< Variable > &com_vars, const vector< string > &names)
void WriteSepSource(const pair< string, set< Variable > > &sep_vars)
STL namespace.
string ToCaps(string str)
void GenerateEventHandlerSource(const string &name)
void WriteBaseSource(const set< Variable > &all_vars, const set< Variable > &com_vars, const vector< string > &names)
string execute(const string &cmd)
int main(int argc, char *argv[])
void GenerateEventHandlerMergeSource(const vector< string > &names)
set< Variable > GetVariables(const string &file_name)
bool Contains(const string &text, const string &pattern)
void WriteSepHeader(const pair< string, set< Variable > > &sep_vars)
void GenerateEventHandlerHeader(const string &name)
tuple file
Definition: parse_card.py:238
vector< string > Tokenize(const string &input, const string &tokens=" ")
void GenerateEventHandlerBaseSource()
void GenerateEventHandlerMergeHeader(const vector< string > &names)
void GenerateEventHandlerBaseHeader()