babymaker  e95a6a9342d4604277fe7cc6149b6b5b24447d89
generate_baby.cxx
Go to the documentation of this file.
1 #include "generate_baby.hh"
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(("../../variables/"+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(){
113  vector<string> file_names = Tokenize(execute("ls ../../variables/ 2> /dev/null"), "\n");
114 
115  vector<pair<string, set<Variable> > > sep_vars(file_names.size());
116  vector<string> fixed_names(file_names.size());
117  for(size_t ifile = 0; ifile < file_names.size(); ++ifile){
118  fixed_names.at(ifile) = FixName(file_names.at(ifile));
119  sep_vars.at(ifile).first = fixed_names.at(ifile);
120  sep_vars.at(ifile).second = GetVariables(file_names.at(ifile));
121  }
122 
123  set<Variable> all_vars;
124  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
125  for(set<Variable>::const_iterator var = sep_vars.at(ifile).second.begin();
126  var != sep_vars.at(ifile).second.end();
127  ++var){
128  all_vars.insert(*var);
129  }
130  }
131 
132  set<Variable> com_vars;
133  if(sep_vars.size()){
134  for(set<Variable>::const_iterator var = sep_vars.at(0).second.begin();
135  var != sep_vars.at(0).second.end();
136  ++var){
137  bool found_in_all = true;
138  for(size_t ifile = 1; found_in_all && ifile < sep_vars.size(); ++ifile){
139  if(sep_vars.at(ifile).second.find(*var) == sep_vars.at(ifile).second.end()){
140  found_in_all = false;
141  }
142  }
143  if(found_in_all){
144  com_vars.insert(*var);
145  }
146  }
147  for(set<Variable>::const_iterator var = com_vars.begin();
148  var != com_vars.end();
149  ++var){
150  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
151  sep_vars.at(ifile).second.erase(*var);
152  }
153  }
154  }
155 
156  WriteBaseHeader(all_vars, com_vars, fixed_names);
157  WriteBaseSource(all_vars, com_vars, fixed_names);
158 
159  for(size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
160  WriteSepHeader(sep_vars.at(ifile));
161  WriteSepSource(sep_vars.at(ifile));
162  }
163 
164 }
165 
166 bool Contains(const string &text, const string &pattern){
167  return text.find(pattern) != string::npos;
168 }
169 
170 void WriteBaseHeader(const set<Variable> &all_vars,
171  const set<Variable> &com_vars,
172  const vector<string> &names){
173 
174  ofstream file("../interface/baby_base.hh");
175 
176  file << "// baby_base: base class to handle reduced tree ntuples\n";
177  file << "// File generated with generate_baby.exe\n\n";
178 
179  file << "#ifndef H_BABY_BASE\n";
180  file << "#define H_BABY_BASE\n\n";
181 
182  file << "#include <vector>\n";
183  file << "#include <string>\n\n";
184 
185  file << "#include \"TTree.h\"\n";
186  file << "#include \"TChain.h\"\n\n";
187  // file << "#include \"TTreeFormula.h\"\n\n";
188 
189  file << "class baby_base{\n";
190  file << "public:\n";
191  file << " baby_base(); // Constructor to create tree\n";
192  file << " baby_base(const std::string &filename); // Constructor to read tree\n\n";
193 
194  file << " int Add(const std::string &filename);\n";
195 
196  file << " long GetEntries() const;\n";
197  file << " virtual void GetEntry(const long entry);\n";
198  file << " bool PassString(TString cut);\n\n";
199 
200  file << " virtual void Clear();\n";
201  file << " virtual void Fill();\n";
202  file << " void Write();\n\n";
203 
204  file << " virtual std::string BabyType() const;\n\n";
205 
206  file << " static const double bad_val_;\n\n";
207 
208  file << " virtual ~baby_base();\n\n";
209 
210  for(set<Variable>::const_iterator var = com_vars.begin();
211  var != com_vars.end();
212  ++var){
213  file << " " << var->type_ << " const & " << var->name_ << "() const;\n";
214  file << " " << var->type_ << " & " << var->name_ << "();\n";
215  }
216  file << '\n';
217 
218  for(set<Variable>::const_iterator var = all_vars.begin();
219  var != all_vars.end();
220  ++var){
221  if(com_vars.find(*var) != com_vars.end()) continue;
222  file << " __attribute__((noreturn)) virtual "
223  << var->type_ << " const & " << var->name_ << "() const;\n";
224  file << " __attribute__((noreturn)) virtual "
225  << var->type_ << " & " << var->name_ << "();\n";
226  }
227  file << " TChain chain_;\n";
228  file << " TTree tree_;\n";
229  file << " long entry_;\n";
230  file << '\n';
231 
232  file << "protected:\n";
233  file << " const bool read_only_;\n\n";
234 
235  file << "private:\n";
236  file << " class VectorLoader{\n";
237  file << " public:\n";
238  file << " VectorLoader();\n";
239  file << " private:\n";
240  file << " static bool loaded_;\n";
241  file << " };\n\n";
242 
243  file << " static VectorLoader vl_;\n";
244  for(set<Variable>::const_iterator var = com_vars.begin();
245  var != com_vars.end();
246  ++var){
247  file << " " << var->type_ << ' ' << var->name_ << "_;\n";
248  if(Contains(var->type_, "vector")){
249  file << " " << var->type_ << " *p_" << var->name_ << "_;\n";
250  }
251  file << " TBranch *b_" << var->name_ << "_;\n";
252  file << " mutable bool c_" << var->name_ << "_;\n";
253  }
254  file << "};\n\n";
255 
256  file << "baby_base* NewTree(const std::type_info &type);\n\n";
257 
258  for(size_t i = 0; i < names.size(); ++i){
259  file << "#include \"babymaker/bmaker/interface/baby_" << names.at(i) << ".hh\"\n";
260  }
261  file <<'\n';
262 
263  file << "#endif" << endl;
264 
265  file.close();
266 }
267 
268 void WriteBaseSource(const set<Variable> &all_vars,
269  const set<Variable> &com_vars,
270  const vector<string> &names){
271  ofstream file("../src/baby_base.cc");
272 
273  file << "// baby_base: base class to handle reduce tree ntuples\n";
274  file << "//File generated with generate_baby.exe\n\n";
275 
276  file << "#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
277 
278  file << "#include <stdexcept>\n";
279  file << "#include <string>\n";
280  file << "#include <iostream>\n";
281  file << "#include <vector>\n\n";
282 
283  file << "#include \"TROOT.h\"\n";
284  file << "#include \"TTree.h\"\n";
285  file << "#include \"TBranch.h\"\n";
286  file << "#include \"TChain.h\"\n";
287  // file << "#include \"TTreeFormula.h\"\n\n";
288 
289  file << "using namespace std;\n\n";
290 
291  file << "bool baby_base::VectorLoader::loaded_ = false;\n\n";
292 
293  file << "baby_base::VectorLoader baby_base::vl_ = baby_base::VectorLoader();\n\n";
294 
295  file << "baby_base::VectorLoader::VectorLoader(){\n";
296  file << " if(!loaded_){\n";
297  file << " gROOT->ProcessLine(\"#include <vector>\");\n";
298  file << " loaded_ = true;\n";
299  file << " }\n";
300  file << "}\n\n";
301 
302  file << "const double baby_base::bad_val_ = -999.;\n\n";
303 
304  file << "baby_base::baby_base():\n";
305  file << " chain_(\"junk\", \"junk\"),\n";
306  file << " tree_(\"tree\", \"tree\"),\n";
307  file << " entry_(0),\n";
308  if(com_vars.size()){
309  const set<Variable>::const_iterator com_end_2 = --com_vars.end();
310  file << " read_only_(false),\n";
311  for(set<Variable>::const_iterator var = com_vars.begin();
312  var != com_end_2;
313  ++var){
314  if(Contains(var->type_, "vector")){
315  file << " " << var->name_ << "_(0),\n";
316  }else if(Contains(var->type_, "tring")){
317  file << " " << var->name_ << "_(\"\"),\n";
318  }else{
319  file << " " << var->name_ << "_(static_cast<" << var->type_ << ">(bad_val_)),\n";
320  }
321  if(Contains(var->type_, "vector")){
322  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
323  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &p_" << var->name_ << "_)),\n";
324  }else{
325  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &" << var->name_ << "_)),\n";
326  }
327  file << " c_" << var->name_ << "_(false),\n";
328  }
329  file << " " << com_end_2->name_ << "_(0),\n";
330  file << " b_" << com_end_2->name_ << "_(tree_.Branch(\"" << com_end_2->name_ << "\", &" << com_end_2->name_ << "_)),\n";
331  file << " c_" << com_end_2->name_ << "_(false){\n";
332  }else{
333  file << " read_only_(false){\n";
334  }
335  file << "}\n\n";
336 
337  file << "baby_base::baby_base(const string &filename):\n";
338  file << " chain_(\"tree\",\"tree\"),\n";
339  file << " tree_(\"junk\",\"junk\"),\n";
340  file << " entry_(0),\n";
341  if(com_vars.size()){
342  const set<Variable>::const_iterator com_end_2 = --com_vars.end();
343  file << " read_only_(true),\n";
344  for(set<Variable>::const_iterator var = com_vars.begin();
345  var != com_end_2;
346  ++var){
347  if(Contains(var->type_, "vector")){
348  file << " " << var->name_ << "_(0),\n";
349  }else if(Contains(var->type_, "tring")){
350  file << " " << var->name_ << "_(\"\"),\n";
351  }else{
352  file << " " << var->name_ << "_(static_cast<" << var->type_ << ">(bad_val_)),\n";
353  }
354  if(Contains(var->type_, "vector")){
355  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
356  }
357  file << " b_" << var->name_ << "_(NULL),\n";
358  file << " c_" << var->name_ << "_(false),\n";
359  }
360  if(Contains(com_end_2->type_, "vector")){
361  file << " " << com_end_2->name_ << "_(0),\n";
362  }else if(Contains(com_end_2->type_, "tring")){
363  file << " " << com_end_2->name_ << "_(\"\"),\n";
364  }else{
365  file << " " << com_end_2->name_ << "_(static_cast<" << com_end_2->type_ << ">(bad_val_)),\n";
366  }
367  if(Contains(com_end_2->type_, "vector")){
368  file << " p_" << com_end_2->name_ << "_(&" << com_end_2->name_ << "_),\n";
369  }
370  file << " b_" << com_end_2->name_ << "_(NULL),\n";
371  file << " c_" << com_end_2->name_ << "_(false){\n";
372  }else{
373  file << " read_only_(true){\n";
374  }
375  file << " chain_.Add(filename.c_str());\n";
376  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
377  if(Contains(var->type_, "vector")){
378  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &p_" << var->name_ << "_, &b_" << var->name_ << "_);\n";
379  }else{
380  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &" << var->name_ << "_, &b_" << var->name_ << "_);\n";
381  }
382  }
383  file << "}\n\n";
384 
385  file << "void baby_base::Fill(){\n";
386  file << " if(read_only_){\n";
387  file << " throw std::logic_error(\"Trying to write to read-only tree\");\n";
388  file << " }else{\n";
389  file << " tree_.Fill();\n";
390  file << " }\n\n";
391  file << "}\n\n";
392 
393  file << "void baby_base::Clear(){\n";
394  file << " if(read_only_){\n";
395  file << " throw std::logic_error(\"Trying to write to read-only tree\");\n";
396  file << " }else{\n";
397  file << " //Resetting variables\n";
398  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
399  if(Contains(var->type_, "vector")){
400  file << " " << var->name_ << "_.clear();\n";
401  }else if(Contains(var->type_, "tring")){
402  file << " " << var->name_ << "_ = \"\";\n";
403  }else{
404  file << " " << var->name_ << "_ = static_cast<" << var->type_ << ">(bad_val_);\n";
405  }
406  }
407  file << " }\n\n";
408  file << "}\n\n";
409 
410  file << "void baby_base::Write(){\n";
411  file << " if(read_only_){\n";
412  file << " throw std::logic_error(\"Trying to write to read-only tree.\");\n";
413  file << " }else{\n";
414  file << " tree_.Write();\n";
415  file << " }\n";
416  file << "}\n\n";
417 
418  file << "string baby_base::BabyType() const{\n";
419  file << " return \"\";\n";
420  file << "}\n\n";
421 
422  file << "baby_base::~baby_base(){\n";
423  file << "}\n\n";
424 
425  file << "int baby_base::Add(const std::string &filename){\n";
426  file << " if(!read_only_){\n";
427  file << " throw std::logic_error(\"Trying to add files to tree opened for writing.\");\n";
428  file << " }\n";
429  file << " return chain_.Add(filename.c_str());\n";
430  file << "}\n\n";
431 
432 
433  file << "bool baby_base::PassString(TString cut){\n";
434  // file << " TTreeFormula f(\"formula\",cut, &chain_);\n";
435  // file << " bool result = f.EvalInstance(0);\n";
436  file << " bool result = true;\n";
437  file << " return result;\n";
438  file << "}\n\n";
439 
440  file << "long baby_base::GetEntries() const{\n";
441  file << " if(read_only_){\n";
442  file << " return chain_.GetEntries();\n";
443  file << " }else{\n";
444  file << " return tree_.GetEntries();\n";
445  file << " }\n";
446  file << "}\n\n";
447 
448  file << "void baby_base::GetEntry(const long entry){\n";
449  file << " if(!read_only_){\n";
450  file << " throw std::logic_error(\"Trying to read from write-only tree.\");\n";
451  file << " }\n\n";
452 
453  for(set<Variable>::const_iterator var = com_vars.begin(); var!= com_vars.end(); ++var){
454  file << " c_" << var->name_ << "_ = false;\n";
455  }
456  file << " entry_ = chain_.LoadTree(entry);\n";
457  file << "}\n\n";
458 
459  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
460  file << var->type_ << " const & baby_base::" << var->name_ << "() const{\n";
461  file << " if(!read_only_){\n";
462  file << " throw std::logic_error(\"Trying to write to const tree.\");\n";
463  file << " }\n";
464  file << " if(!c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
465  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
466  file << " c_" << var->name_ << "_ = true;\n";
467  file << " }\n";
468  file << " return " << var->name_ << "_;\n";
469  file << "}\n\n";
470  }
471 
472  for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
473  file << var->type_ << " & baby_base::" << var->name_ << "(){\n";
474  file << " if(read_only_ && !c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
475  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
476  file << " c_" << var->name_ << "_ = true;\n";
477  file << " }\n";
478  file << " return " << var->name_ << "_;\n";
479  file << "}\n\n";
480  }
481 
482  for(set<Variable>::const_iterator var = all_vars.begin(); var != all_vars.end(); ++var){
483  if(com_vars.find(*var) != com_vars.end()) continue;
484  file << var->type_ << " const & baby_base::" << var->name_ << "() const{\n";
485  file << " throw std::logic_error(\"" << var->name_
486  << " does not exist in this baby_base version.\");\n";
487  file << "}\n\n";
488  }
489 
490  for(set<Variable>::const_iterator var = all_vars.begin(); var != all_vars.end(); ++var){
491  if(com_vars.find(*var) != com_vars.end()) continue;
492  file << var->type_ << " & baby_base::" << var->name_ << "(){\n";
493  file << " throw std::logic_error(\"" << var->name_
494  << " does not exist in this baby_base version.\");\n";
495  file << "}\n\n";
496  }
497 
498  for(size_t i = 0; i < names.size(); ++i){
499  file << "#include \"babymaker/bmaker/interface/baby_" << names.at(i) << ".hh\"\n";
500  }
501  file << "baby_base* NewTree(const std::type_info &type){\n\n";
502  file << " if(type == typeid(baby_base)) return new baby_base;\n";
503  for(size_t i = 0; i < names.size(); ++i){
504  file << " else if(type == typeid(baby_" << names.at(i) << ")) return static_cast<baby_base*>(new baby_" << names.at(i) << ");\n";
505  }
506  file << " else return new baby_base;\n";
507  file << "}\n\n";
508 
509  file.close();
510 }
511 
512 void WriteSepHeader(const pair<string, set<Variable> > &sep_vars){
513  string name = sep_vars.first;
514  string NAME = ToCaps(name);
515  set<Variable> vars = sep_vars.second;
516  ofstream file(("../interface/baby_"+name+".hh").c_str());
517 
518  file << "// baby_" << name << ": " << name << " version of baby_base to handle reduce tree ntuples\n";
519  file << "// File generated with generate_baby.exe\n\n";
520 
521  file << "#ifndef H_BABY_" << NAME << "\n";
522  file << "#define H_BABY_" << NAME << "\n\n";
523 
524  file << "#include <vector>\n";
525  file << "#include <string>\n\n";
526 
527  file << "#include \"TTree.h\"\n";
528  file << "#include \"TChain.h\"\n\n";
529 
530  file << "#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
531 
532  file << "class baby_" << name << " : public baby_base{\n";
533  file << "public:\n";
534  file << " baby_" << name << "(); // Constructor to create tree\n";
535  file << " baby_" << name << "(const std::string &filename); // Constructor to read tree\n\n";
536 
537  file << " virtual void GetEntry(const long entry);\n\n";
538 
539  file << " virtual void Fill();\n\n";
540 
541  file << " virtual std::string BabyType() const;\n\n";
542 
543  file << " virtual ~baby_" << name << "();\n\n";
544 
545  for(set<Variable>::const_iterator var = vars.begin();
546  var != vars.end();
547  ++var){
548  file << " virtual " << var->type_ << " const & " << var->name_ << "() const;\n";
549  file << " virtual " << var->type_ << " & " << var->name_ << "();\n";
550  }
551  file << '\n';
552 
553  file << "private:\n";
554  for(set<Variable>::const_iterator var = vars.begin();
555  var != vars.end();
556  ++var){
557  file << " " << var->type_ << ' ' << var->name_ << "_;\n";
558  if(Contains(var->type_, "vector")){
559  file << " " << var->type_ << " *p_" << var->name_ << "_;\n";
560  }
561  file << " TBranch *b_" << var->name_ << "_;\n";
562  file << " mutable bool c_" << var->name_ << "_;\n";
563  }
564  file << "};\n\n";
565 
566  file << "#endif" << endl;
567 
568  file.close();
569 }
570 
571 void WriteSepSource(const pair<string, set<Variable> > &sep_vars){
572  string name = sep_vars.first;
573  string NAME = ToCaps(name);
574  set<Variable> vars = sep_vars.second;
575  ofstream file(("../src/baby_"+name+".cc").c_str());
576 
577  file << "// baby_" << name << ": " << name << " version of baby_base to handle reduce tree ntuples\n";
578  file << "//File generated with generate_baby.exe\n\n";
579 
580  file << "#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
581  file << "#include \"babymaker/bmaker/interface/baby_" << name << ".hh\"\n\n";
582 
583  file << "#include <stdexcept>\n";
584  file << "#include <string>\n";
585  file << "#include <vector>\n\n";
586 
587  file << "#include \"TTree.h\"\n";
588  file << "#include \"TBranch.h\"\n";
589  file << "#include \"TChain.h\"\n\n";
590 
591  file << "using namespace std;\n\n";
592 
593  file << "baby_" << name << "::baby_" << name << "():\n";
594  if(vars.size()){
595  const set<Variable>::const_iterator vars_end_2 = --vars.end();
596  file << " baby_base(),\n";
597  for(set<Variable>::const_iterator var = vars.begin();
598  var != vars_end_2;
599  ++var){
600  if(Contains(var->type_, "vector")){
601  file << " " << var->name_ << "_(0),\n";
602  }else if(Contains(var->type_, "tring")){
603  file << " " << var->name_ << "_(\"\"),\n";
604  }else{
605  file << " " << var->name_ << "_(static_cast<" << var->type_ << ">(bad_val_)),\n";
606  }
607  if(Contains(var->type_, "vector")){
608  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
609  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &p_" << var->name_ << "_)),\n";
610  }else{
611  file << " b_" << var->name_ << "_(tree_.Branch(\"" << var->name_ << "\", &" << var->name_ << "_)),\n";
612  }
613  file << " c_" << var->name_ << "_(false),\n";
614  }
615  if(Contains(vars_end_2->type_, "vector")){
616  file << " " << vars_end_2->name_ << "_(0),\n";
617  }else if(Contains(vars_end_2->type_, "tring")){
618  file << " " << vars_end_2->name_ << "_(\"\"),\n";
619  }else{
620  file << " " << vars_end_2->name_ << "_(static_cast<" << vars_end_2->type_ << ">(bad_val_)),\n";
621  }
622  if(Contains(vars_end_2->type_, "vector")){
623  file << " p_" << vars_end_2->name_ << "_(&" << vars_end_2->name_ << "_),\n";
624  file << " b_" << vars_end_2->name_ << "_(tree_.Branch(\"" << vars_end_2->name_ << "\", &p_" << vars_end_2->name_ << "_)),\n";
625  }else{
626  file << " b_" << vars_end_2->name_ << "_(tree_.Branch(\"" << vars_end_2->name_ << "\", &" << vars_end_2->name_ << "_)),\n";
627  }
628  file << " c_" << vars_end_2->name_ << "_(false){\n";
629  }else{
630  file << " baby_base(){\n";
631  }
632  file << "}\n\n";
633 
634  file << "baby_" << name << "::baby_" << name << "(const string &filename):\n";
635  if(vars.size()){
636  const set<Variable>::const_iterator vars_end_2 = --vars.end();
637  file << " baby_base(filename),\n";
638  for(set<Variable>::const_iterator var = vars.begin();
639  var != vars_end_2;
640  ++var){
641  if(Contains(var->type_, "vector")){
642  file << " " << var->name_ << "_(0),\n";
643  }else if(Contains(var->type_, "tring")){
644  file << " " << var->name_ << "_(\"\"),\n";
645  }else{
646  file << " " << var->name_ << "_(static_cast<" << var->type_ << ">(bad_val_)),\n";
647  }
648  if(Contains(var->type_, "vector")){
649  file << " p_" << var->name_ << "_(&" << var->name_ << "_),\n";
650  }
651  file << " b_" << var->name_ << "_(NULL),\n";
652  file << " c_" << var->name_ << "_(false),\n";
653  }
654  if(Contains(vars_end_2->type_, "vector")){
655  file << " " << vars_end_2->name_ << "_(0),\n";
656  }else if(Contains(vars_end_2->type_, "tring")){
657  file << " " << vars_end_2->name_ << "_(\"\"),\n";
658  }else{
659  file << " " << vars_end_2->name_ << "_(static_cast<" << vars_end_2->type_ << ">(bad_val_)),\n";
660  }
661  if(Contains(vars_end_2->type_, "vector")){
662  file << " p_" << vars_end_2->name_ << "_(&" << vars_end_2->name_ << "_),\n";
663  }
664  file << " b_" << vars_end_2->name_ << "_(NULL),\n";
665  file << " c_" << vars_end_2->name_ << "_(false){\n";
666  }else{
667  file << " baby_base(filename){\n";
668  }
669  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
670  if(Contains(var->type_, "vector")){
671  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &p_" << var->name_ << "_, &b_" << var->name_ << "_);\n";
672  }else{
673  file << " chain_.SetBranchAddress(\"" << var->name_ << "\", &" << var->name_ << "_, &b_" << var->name_ << "_);\n";
674  }
675  }
676  file << "}\n\n";
677 
678  file << "void baby_" << name << "::Fill(){\n";
679  file << " baby_base::Fill();\n";
680 
681  file << " //Resetting variables\n";
682  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
683  if(Contains(var->type_, "vector")){
684  file << " " << var->name_ << "_.clear();\n";
685  }else if(Contains(var->type_, "tring")){
686  file << " " << var->name_ << "_ = \"\";\n";
687  }else{
688  file << " " << var->name_ << "_ = static_cast<" << var->type_ << ">(bad_val_);\n";
689  }
690  }
691  file << "}\n\n";
692 
693  file << "string baby_" << name << "::BabyType() const{\n";
694  file << " return \"" << name << "\";\n";
695  file << "}\n\n";
696 
697  file << "baby_" << name << "::~baby_" << name << "(){\n";
698  file << "}\n\n";
699 
700  file << "void baby_" << name << "::GetEntry(const long entry){\n";
701  file << " baby_base::GetEntry(entry);\n\n";
702 
703  for(set<Variable>::const_iterator var = vars.begin(); var!= vars.end(); ++var){
704  file << " c_" << var->name_ << "_ = false;\n";
705  }
706  file << "}\n\n";
707 
708  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
709  file << var->type_ << " const & baby_" << name << "::" << var->name_ << "() const{\n";
710  file << " if(!read_only_){\n";
711  file << " throw std::logic_error(\"Trying to write to const tree.\");\n";
712  file << " }\n";
713  file << " if(!c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
714  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
715  file << " c_" << var->name_ << "_ = true;\n";
716  file << " }\n";
717  file << " return " << var->name_ << "_;\n";
718  file << "}\n\n";
719  }
720 
721  for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
722  file << var->type_ << " & baby_" << name << "::" << var->name_ << "(){\n";
723  file << " if(read_only_ && !c_" << var->name_ << "_ && b_" << var->name_ <<"_){\n";
724  file << " b_" << var->name_ << "_->GetEntry(entry_);\n";
725  file << " c_" << var->name_ << "_ = true;\n";
726  file << " }\n";
727  file << " return " << var->name_ << "_;\n";
728  file << "}\n\n";
729  }
730 
731  file.close();
732 }
733 
int line
Printing all rows.
STL namespace.
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)
string FixName(string name)
string cmd
Moving file.
void WriteSepHeader(const pair< string, set< Variable > > &sep_vars)
string execute(const string &cmd)
int main()
set< Variable > GetVariables(const string &file_name)
void WriteBaseSource(const set< Variable > &all_vars, const set< Variable > &com_vars, const vector< string > &names)
vector< string > Tokenize(const string &input, const string &tokens=" ")
string ToCaps(string str)
bool Contains(const string &text, const string &pattern)