18 for(string::iterator it = str.begin();
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];
33 if(fgets(buffer, buffer_size, pipe) != NULL) result += buffer;
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);
48 output.push_back(ptr);
49 ptr=strtok(NULL, tokens.c_str());
56 string allowed =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_";
59 size_t pos = name.find_first_not_of(allowed);
60 while(pos < name.size()){
62 pos = name.find_first_not_of(allowed);
66 pos = name.rfind(
"__");
67 while(pos < name.size()){
68 name.replace(pos, 2,
"_");
69 pos = name.rfind(
"__");
74 for(pos = 0; pos < name.size(); ++pos){
75 if(name.at(pos) !=
' ')
break;
77 size_t endpos = name.size();
78 for(endpos = name.size(); endpos != 0; --endpos){
79 if(name.at(endpos-1) !=
' ')
break;
82 return name.substr(pos, endpos-pos);
86 string allowed =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_";
89 ifstream infile((
"../../variables/"+file_name).c_str());
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;
96 size_t pos = line.rfind(
" ");
97 while(pos < line.size()){
98 line.replace(pos, 2,
" ");
99 pos = line.rfind(
" ");
101 size_t end = line.find_last_of(allowed)+1;
102 size_t split = line.rfind(
' ', end)+1;
104 vars.insert(
Variable(line.substr(start, split-start),
105 line.substr(split, end-split)));
113 vector<string> file_names =
Tokenize(
execute(
"ls ../../variables/ 2> /dev/null"),
"\n");
115 vector<pair<string, set<Variable> > > sep_vars(file_names.size());
116 vector<string> fixed_names(file_names.size());
119 sep_vars.at(
ifile).first = fixed_names.at(
ifile);
123 set<Variable> all_vars;
125 for(set<Variable>::const_iterator var = sep_vars.at(
ifile).second.begin();
126 var != sep_vars.at(
ifile).second.end();
128 all_vars.insert(*var);
132 set<Variable> com_vars;
134 for(set<Variable>::const_iterator var = sep_vars.at(0).second.begin();
135 var != sep_vars.at(0).second.end();
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;
144 com_vars.insert(*var);
147 for(set<Variable>::const_iterator var = com_vars.begin();
148 var != com_vars.end();
151 sep_vars.at(
ifile).second.erase(*var);
166 bool Contains(
const string &text,
const string &pattern){
167 return text.find(pattern) != string::npos;
171 const set<Variable> &com_vars,
172 const vector<string> &names){
174 ofstream file(
"../interface/baby_base.hh");
176 file <<
"// baby_base: base class to handle reduced tree ntuples\n";
177 file <<
"// File generated with generate_baby.exe\n\n";
179 file <<
"#ifndef H_BABY_BASE\n";
180 file <<
"#define H_BABY_BASE\n\n";
182 file <<
"#include <vector>\n";
183 file <<
"#include <string>\n\n";
185 file <<
"#include \"TTree.h\"\n";
186 file <<
"#include \"TChain.h\"\n\n";
189 file <<
"class baby_base{\n";
191 file <<
" baby_base(); // Constructor to create tree\n";
192 file <<
" baby_base(const std::string &filename); // Constructor to read tree\n\n";
194 file <<
" int Add(const std::string &filename);\n";
196 file <<
" long GetEntries() const;\n";
197 file <<
" virtual void GetEntry(const long entry);\n";
198 file <<
" bool PassString(TString cut);\n\n";
200 file <<
" virtual void Clear();\n";
201 file <<
" virtual void Fill();\n";
202 file <<
" void Write();\n\n";
204 file <<
" virtual std::string BabyType() const;\n\n";
206 file <<
" static const double bad_val_;\n\n";
208 file <<
" virtual ~baby_base();\n\n";
210 for(set<Variable>::const_iterator var = com_vars.begin();
211 var != com_vars.end();
213 file <<
" " << var->type_ <<
" const & " << var->name_ <<
"() const;\n";
214 file <<
" " << var->type_ <<
" & " << var->name_ <<
"();\n";
218 for(set<Variable>::const_iterator var = all_vars.begin();
219 var != all_vars.end();
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";
227 file <<
" TChain chain_;\n";
228 file <<
" TTree tree_;\n";
229 file <<
" long entry_;\n";
232 file <<
"protected:\n";
233 file <<
" const bool read_only_;\n\n";
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";
243 file <<
" static VectorLoader vl_;\n";
244 for(set<Variable>::const_iterator var = com_vars.begin();
245 var != com_vars.end();
247 file <<
" " << var->type_ <<
' ' << var->name_ <<
"_;\n";
249 file <<
" " << var->type_ <<
" *p_" << var->name_ <<
"_;\n";
251 file <<
" TBranch *b_" << var->name_ <<
"_;\n";
252 file <<
" mutable bool c_" << var->name_ <<
"_;\n";
256 file <<
"baby_base* NewTree(const std::type_info &type);\n\n";
258 for(
size_t i = 0; i < names.size(); ++i){
259 file <<
"#include \"babymaker/bmaker/interface/baby_" << names.at(i) <<
".hh\"\n";
263 file <<
"#endif" << endl;
269 const set<Variable> &com_vars,
270 const vector<string> &names){
271 ofstream file(
"../src/baby_base.cc");
273 file <<
"// baby_base: base class to handle reduce tree ntuples\n";
274 file <<
"//File generated with generate_baby.exe\n\n";
276 file <<
"#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
278 file <<
"#include <stdexcept>\n";
279 file <<
"#include <string>\n";
280 file <<
"#include <iostream>\n";
281 file <<
"#include <vector>\n\n";
283 file <<
"#include \"TROOT.h\"\n";
284 file <<
"#include \"TTree.h\"\n";
285 file <<
"#include \"TBranch.h\"\n";
286 file <<
"#include \"TChain.h\"\n";
289 file <<
"using namespace std;\n\n";
291 file <<
"bool baby_base::VectorLoader::loaded_ = false;\n\n";
293 file <<
"baby_base::VectorLoader baby_base::vl_ = baby_base::VectorLoader();\n\n";
295 file <<
"baby_base::VectorLoader::VectorLoader(){\n";
296 file <<
" if(!loaded_){\n";
297 file <<
" gROOT->ProcessLine(\"#include <vector>\");\n";
298 file <<
" loaded_ = true;\n";
302 file <<
"const double baby_base::bad_val_ = -999.;\n\n";
304 file <<
"baby_base::baby_base():\n";
305 file <<
" chain_(\"junk\", \"junk\"),\n";
306 file <<
" tree_(\"tree\", \"tree\"),\n";
307 file <<
" entry_(0),\n";
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();
315 file <<
" " << var->name_ <<
"_(0),\n";
316 }
else if(
Contains(var->type_,
"tring")){
317 file <<
" " << var->name_ <<
"_(\"\"),\n";
319 file <<
" " << var->name_ <<
"_(static_cast<" << var->type_ <<
">(bad_val_)),\n";
322 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
323 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_)),\n";
325 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &" << var->name_ <<
"_)),\n";
327 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
333 file <<
" read_only_(false){\n";
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";
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();
348 file <<
" " << var->name_ <<
"_(0),\n";
349 }
else if(
Contains(var->type_,
"tring")){
350 file <<
" " << var->name_ <<
"_(\"\"),\n";
352 file <<
" " << var->name_ <<
"_(static_cast<" << var->type_ <<
">(bad_val_)),\n";
355 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
357 file <<
" b_" << var->name_ <<
"_(NULL),\n";
358 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
365 file <<
" " << com_end_2->name_ <<
"_(static_cast<" << com_end_2->type_ <<
">(bad_val_)),\n";
367 if(
Contains(com_end_2->type_,
"vector")){
368 file <<
" p_" << com_end_2->name_ <<
"_(&" << com_end_2->name_ <<
"_),\n";
370 file <<
" b_" << com_end_2->name_ <<
"_(NULL),\n";
371 file <<
" c_" << com_end_2->name_ <<
"_(false){\n";
373 file <<
" read_only_(true){\n";
375 file <<
" chain_.Add(filename.c_str());\n";
376 for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
378 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
380 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
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";
389 file <<
" tree_.Fill();\n";
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";
397 file <<
" //Resetting variables\n";
398 for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
400 file <<
" " << var->name_ <<
"_.clear();\n";
401 }
else if(
Contains(var->type_,
"tring")){
402 file <<
" " << var->name_ <<
"_ = \"\";\n";
404 file <<
" " << var->name_ <<
"_ = static_cast<" << var->type_ <<
">(bad_val_);\n";
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";
414 file <<
" tree_.Write();\n";
418 file <<
"string baby_base::BabyType() const{\n";
419 file <<
" return \"\";\n";
422 file <<
"baby_base::~baby_base(){\n";
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";
429 file <<
" return chain_.Add(filename.c_str());\n";
433 file <<
"bool baby_base::PassString(TString cut){\n";
436 file <<
" bool result = true;\n";
437 file <<
" return result;\n";
440 file <<
"long baby_base::GetEntries() const{\n";
441 file <<
" if(read_only_){\n";
442 file <<
" return chain_.GetEntries();\n";
444 file <<
" return tree_.GetEntries();\n";
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";
453 for(set<Variable>::const_iterator var = com_vars.begin(); var!= com_vars.end(); ++var){
454 file <<
" c_" << var->name_ <<
"_ = false;\n";
456 file <<
" entry_ = chain_.LoadTree(entry);\n";
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";
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";
468 file <<
" return " << var->name_ <<
"_;\n";
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";
478 file <<
" return " << var->name_ <<
"_;\n";
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";
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";
498 for(
size_t i = 0; i < names.size(); ++i){
499 file <<
"#include \"babymaker/bmaker/interface/baby_" << names.at(i) <<
".hh\"\n";
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";
506 file <<
" else return new baby_base;\n";
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());
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";
521 file <<
"#ifndef H_BABY_" << NAME <<
"\n";
522 file <<
"#define H_BABY_" << NAME <<
"\n\n";
524 file <<
"#include <vector>\n";
525 file <<
"#include <string>\n\n";
527 file <<
"#include \"TTree.h\"\n";
528 file <<
"#include \"TChain.h\"\n\n";
530 file <<
"#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
532 file <<
"class baby_" << name <<
" : public baby_base{\n";
534 file <<
" baby_" << name <<
"(); // Constructor to create tree\n";
535 file <<
" baby_" << name <<
"(const std::string &filename); // Constructor to read tree\n\n";
537 file <<
" virtual void GetEntry(const long entry);\n\n";
539 file <<
" virtual void Fill();\n\n";
541 file <<
" virtual std::string BabyType() const;\n\n";
543 file <<
" virtual ~baby_" << name <<
"();\n\n";
545 for(set<Variable>::const_iterator var = vars.begin();
548 file <<
" virtual " << var->type_ <<
" const & " << var->name_ <<
"() const;\n";
549 file <<
" virtual " << var->type_ <<
" & " << var->name_ <<
"();\n";
553 file <<
"private:\n";
554 for(set<Variable>::const_iterator var = vars.begin();
557 file <<
" " << var->type_ <<
' ' << var->name_ <<
"_;\n";
559 file <<
" " << var->type_ <<
" *p_" << var->name_ <<
"_;\n";
561 file <<
" TBranch *b_" << var->name_ <<
"_;\n";
562 file <<
" mutable bool c_" << var->name_ <<
"_;\n";
566 file <<
"#endif" << endl;
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());
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";
580 file <<
"#include \"babymaker/bmaker/interface/baby_base.hh\"\n\n";
581 file <<
"#include \"babymaker/bmaker/interface/baby_" << name <<
".hh\"\n\n";
583 file <<
"#include <stdexcept>\n";
584 file <<
"#include <string>\n";
585 file <<
"#include <vector>\n\n";
587 file <<
"#include \"TTree.h\"\n";
588 file <<
"#include \"TBranch.h\"\n";
589 file <<
"#include \"TChain.h\"\n\n";
591 file <<
"using namespace std;\n\n";
593 file <<
"baby_" << name <<
"::baby_" << name <<
"():\n";
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();
601 file <<
" " << var->name_ <<
"_(0),\n";
602 }
else if(
Contains(var->type_,
"tring")){
603 file <<
" " << var->name_ <<
"_(\"\"),\n";
605 file <<
" " << var->name_ <<
"_(static_cast<" << var->type_ <<
">(bad_val_)),\n";
608 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
609 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_)),\n";
611 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &" << var->name_ <<
"_)),\n";
613 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
620 file <<
" " << vars_end_2->name_ <<
"_(static_cast<" << vars_end_2->type_ <<
">(bad_val_)),\n";
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";
626 file <<
" b_" << vars_end_2->name_ <<
"_(tree_.Branch(\"" << vars_end_2->name_ <<
"\", &" << vars_end_2->name_ <<
"_)),\n";
628 file <<
" c_" << vars_end_2->name_ <<
"_(false){\n";
630 file <<
" baby_base(){\n";
634 file <<
"baby_" << name <<
"::baby_" << name <<
"(const string &filename):\n";
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();
642 file <<
" " << var->name_ <<
"_(0),\n";
643 }
else if(
Contains(var->type_,
"tring")){
644 file <<
" " << var->name_ <<
"_(\"\"),\n";
646 file <<
" " << var->name_ <<
"_(static_cast<" << var->type_ <<
">(bad_val_)),\n";
649 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
651 file <<
" b_" << var->name_ <<
"_(NULL),\n";
652 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
659 file <<
" " << vars_end_2->name_ <<
"_(static_cast<" << vars_end_2->type_ <<
">(bad_val_)),\n";
661 if(
Contains(vars_end_2->type_,
"vector")){
662 file <<
" p_" << vars_end_2->name_ <<
"_(&" << vars_end_2->name_ <<
"_),\n";
664 file <<
" b_" << vars_end_2->name_ <<
"_(NULL),\n";
665 file <<
" c_" << vars_end_2->name_ <<
"_(false){\n";
667 file <<
" baby_base(filename){\n";
669 for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
671 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
673 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
678 file <<
"void baby_" << name <<
"::Fill(){\n";
679 file <<
" baby_base::Fill();\n";
681 file <<
" //Resetting variables\n";
682 for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
684 file <<
" " << var->name_ <<
"_.clear();\n";
685 }
else if(
Contains(var->type_,
"tring")){
686 file <<
" " << var->name_ <<
"_ = \"\";\n";
688 file <<
" " << var->name_ <<
"_ = static_cast<" << var->type_ <<
">(bad_val_);\n";
693 file <<
"string baby_" << name <<
"::BabyType() const{\n";
694 file <<
" return \"" << name <<
"\";\n";
697 file <<
"baby_" << name <<
"::~baby_" << name <<
"(){\n";
700 file <<
"void baby_" << name <<
"::GetEntry(const long entry){\n";
701 file <<
" baby_base::GetEntry(entry);\n\n";
703 for(set<Variable>::const_iterator var = vars.begin(); var!= vars.end(); ++var){
704 file <<
" c_" << var->name_ <<
"_ = false;\n";
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";
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";
717 file <<
" return " << var->name_ <<
"_;\n";
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";
727 file <<
" return " << var->name_ <<
"_;\n";
int line
Printing all rows.
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)
void WriteSepHeader(const pair< string, set< Variable > > &sep_vars)
string execute(const string &cmd)
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)