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((
"txt/small_tree_cfg/"+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)));
112 int main(
int argc,
char *argv[]){
114 bool do_event_handler =
true;
115 while((c=getopt(argc, argv,
"t"))!=-1){
118 do_event_handler =
false;
124 vector<string> file_names =
Tokenize(
execute(
"ls txt/small_tree_cfg/ 2> /dev/null"),
"\n");
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));
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();
139 all_vars.insert(*var);
143 set<Variable> com_vars;
145 for(set<Variable>::const_iterator var = sep_vars.at(0).second.begin();
146 var != sep_vars.at(0).second.end();
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;
155 com_vars.insert(*var);
158 for(set<Variable>::const_iterator var = com_vars.begin();
159 var != com_vars.end();
161 for(
size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
162 sep_vars.at(ifile).second.erase(*var);
170 for(
size_t ifile = 0; ifile < sep_vars.size(); ++ifile){
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){
180 for(
size_t iexist = 0; !found && iexist < existing.size(); ++iexist){
181 if(
Contains(existing.at(iexist), fixed_names.at(iname))) found =
true;
183 if(!found) to_generate.insert(fixed_names.at(iname));
189 for(set<string>::const_iterator name = to_generate.begin();
190 name != to_generate.end();
201 bool Contains(
const string &text,
const string &pattern){
202 return text.find(pattern) != string::npos;
206 const set<Variable> &com_vars,
207 const vector<string> &names){
208 ofstream
file(
"inc/small_tree.hpp");
210 file <<
"// small_tree: base class to handle reduced tree ntuples\n";
211 file <<
"// File generated with generate_small_tree.exe\n\n";
213 file <<
"#ifndef H_SMALL_TREE\n";
214 file <<
"#define H_SMALL_TREE\n\n";
216 file <<
"#include <vector>\n";
217 file <<
"#include <string>\n\n";
219 file <<
"#include \"TTree.h\"\n";
220 file <<
"#include \"TChain.h\"\n";
221 file <<
"#include \"TTreeFormula.h\"\n\n";
223 file <<
"class small_tree{\n";
225 file <<
" small_tree(); // Constructor to create tree\n";
226 file <<
" small_tree(const std::string &filename); // Constructor to read tree\n\n";
228 file <<
" int Add(const std::string &filename);\n";
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";
235 file <<
" virtual void Fill();\n";
236 file <<
" void Write();\n\n";
238 file <<
" virtual std::string Type() const;\n\n";
240 file <<
" static const double bad_val_;\n\n";
242 file <<
" virtual ~small_tree();\n\n";
244 for(set<Variable>::const_iterator var = com_vars.begin();
245 var != com_vars.end();
247 file <<
" " << var->type_ <<
" const & " << var->name_ <<
"() const;\n";
248 file <<
" " << var->type_ <<
" & " << var->name_ <<
"();\n";
252 for(set<Variable>::const_iterator var = all_vars.begin();
253 var != all_vars.end();
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";
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";
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";
277 file <<
" static VectorLoader vl_;\n";
278 for(set<Variable>::const_iterator var = com_vars.begin();
279 var != com_vars.end();
281 file <<
" " << var->type_ <<
' ' << var->name_ <<
"_;\n";
283 file <<
" " << var->type_ <<
" *p_" << var->name_ <<
"_;\n";
285 file <<
" TBranch *b_" << var->name_ <<
"_;\n";
286 file <<
" mutable bool c_" << var->name_ <<
"_;\n";
290 file <<
"small_tree* NewTree(const std::type_info &type);\n\n";
292 for(
size_t i = 0; i < names.size(); ++i){
293 file <<
"#include \"small_tree_" << names.at(i) <<
".hpp\"\n";
297 file <<
"#endif" << endl;
303 const set<Variable> &com_vars,
304 const vector<string> &names){
305 ofstream
file(
"src/small_tree.cpp");
307 file <<
"// small_tree: base class to handle reduce tree ntuples\n";
308 file <<
"//File generated with generate_small_tree.exe\n\n";
310 file <<
"#include \"small_tree.hpp\"\n\n";
312 file <<
"#include <stdexcept>\n";
313 file <<
"#include <string>\n";
314 file <<
"#include <iostream>\n";
315 file <<
"#include <vector>\n\n";
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";
323 file <<
"using namespace std;\n\n";
325 file <<
"bool small_tree::VectorLoader::loaded_ = false;\n\n";
327 file <<
"small_tree::VectorLoader small_tree::vl_ = small_tree::VectorLoader();\n\n";
329 file <<
"small_tree::VectorLoader::VectorLoader(){\n";
330 file <<
" if(!loaded_){\n";
331 file <<
" gROOT->ProcessLine(\"#include <vector>\");\n";
332 file <<
" loaded_ = true;\n";
336 file <<
"const double small_tree::bad_val_ = -999.;\n\n";
338 file <<
"small_tree::small_tree():\n";
339 file <<
" chain_(\"junk\", \"junk\"),\n";
340 file <<
" tree_(\"tree\", \"tree\"),\n";
341 file <<
" entry_(0),\n";
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();
348 file <<
" " << var->name_ <<
"_(0),\n";
350 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
351 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_)),\n";
353 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &" << var->name_ <<
"_)),\n";
355 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
361 file <<
" read_only_(false){\n";
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";
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();
375 file <<
" " << var->name_ <<
"_(0),\n";
377 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
379 file <<
" b_" << var->name_ <<
"_(NULL),\n";
380 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
386 file <<
" b_" << com_end_2->name_ <<
"_(NULL),\n";
387 file <<
" c_" << com_end_2->name_ <<
"_(false){\n";
389 file <<
" read_only_(true){\n";
391 file <<
" chain_.Add(filename.c_str());\n";
392 for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
394 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
396 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
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";
405 file <<
" tree_.Fill();\n";
408 file <<
" //Resetting variables\n";
409 for(set<Variable>::const_iterator var = com_vars.begin(); var != com_vars.end(); ++var){
411 file <<
" " << var->name_ <<
"_.clear();\n";
412 }
else if(
Contains(var->type_,
"tring")){
413 file <<
" " << var->name_ <<
"_ = \"\";\n";
415 file <<
" " << var->name_ <<
"_ = static_cast<" << var->type_ <<
">(bad_val_);\n";
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";
424 file <<
" tree_.Write();\n";
428 file <<
"string small_tree::Type() const{\n";
429 file <<
" return \"\";\n";
432 file <<
"small_tree::~small_tree(){\n";
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";
439 file <<
" return chain_.Add(filename.c_str());\n";
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";
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";
455 file <<
"long small_tree::GetEntries() const{\n";
456 file <<
" if(read_only_){\n";
457 file <<
" return chain_.GetEntries();\n";
459 file <<
" return tree_.GetEntries();\n";
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";
468 for(set<Variable>::const_iterator var = com_vars.begin(); var!= com_vars.end(); ++var){
469 file <<
" c_" << var->name_ <<
"_ = false;\n";
471 file <<
" entry_ = chain_.LoadTree(entry);\n";
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";
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";
483 file <<
" return " << var->name_ <<
"_;\n";
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";
493 file <<
" return " << var->name_ <<
"_;\n";
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";
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";
513 for(
size_t i = 0; i < names.size(); ++i){
514 file <<
"#include \"small_tree_" << names.at(i) <<
".hpp\"\n";
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";
521 file <<
" else return new small_tree;\n";
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());
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";
536 file <<
"#ifndef H_SMALL_TREE_" << NAME <<
"\n";
537 file <<
"#define H_SMALL_TREE_" << NAME <<
"\n\n";
539 file <<
"#include <vector>\n";
540 file <<
"#include <string>\n\n";
542 file <<
"#include \"TTree.h\"\n";
543 file <<
"#include \"TChain.h\"\n\n";
545 file <<
"#include \"small_tree.hpp\"\n\n";
547 file <<
"class small_tree_" << name <<
" : public small_tree{\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";
552 file <<
" virtual void GetEntry(const long entry);\n\n";
554 file <<
" virtual void Fill();\n\n";
556 file <<
" virtual std::string Type() const;\n\n";
558 file <<
" virtual ~small_tree_" << name <<
"();\n\n";
560 for(set<Variable>::const_iterator var = vars.begin();
563 file <<
" virtual " << var->type_ <<
" const & " << var->name_ <<
"() const;\n";
564 file <<
" virtual " << var->type_ <<
" & " << var->name_ <<
"();\n";
568 file <<
"private:\n";
569 for(set<Variable>::const_iterator var = vars.begin();
572 file <<
" " << var->type_ <<
' ' << var->name_ <<
"_;\n";
574 file <<
" " << var->type_ <<
" *p_" << var->name_ <<
"_;\n";
576 file <<
" TBranch *b_" << var->name_ <<
"_;\n";
577 file <<
" mutable bool c_" << var->name_ <<
"_;\n";
581 file <<
"#endif" << endl;
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());
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";
595 file <<
"#include \"small_tree.hpp\"\n\n";
596 file <<
"#include \"small_tree_" << name <<
".hpp\"\n\n";
598 file <<
"#include <stdexcept>\n";
599 file <<
"#include <string>\n";
600 file <<
"#include <vector>\n\n";
602 file <<
"#include \"TTree.h\"\n";
603 file <<
"#include \"TBranch.h\"\n";
604 file <<
"#include \"TChain.h\"\n\n";
606 file <<
"using namespace std;\n\n";
608 file <<
"small_tree_" << name <<
"::small_tree_" << name <<
"():\n";
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();
615 file <<
" " << var->name_ <<
"_(0),\n";
617 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
618 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_)),\n";
620 file <<
" b_" << var->name_ <<
"_(tree_.Branch(\"" << var->name_ <<
"\", &" << var->name_ <<
"_)),\n";
622 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
629 file <<
" b_" << vars_end_2->name_ <<
"_(tree_.Branch(\"" << vars_end_2->name_ <<
"\", &" << vars_end_2->name_ <<
"_)),\n";
631 file <<
" c_" << vars_end_2->name_ <<
"_(false){\n";
633 file <<
" small_tree(){\n";
637 file <<
"small_tree_" << name <<
"::small_tree_" << name <<
"(const string &filename):\n";
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();
644 file <<
" " << var->name_ <<
"_(0),\n";
646 file <<
" p_" << var->name_ <<
"_(&" << var->name_ <<
"_),\n";
648 file <<
" b_" << var->name_ <<
"_(NULL),\n";
649 file <<
" c_" << var->name_ <<
"_(false),\n";
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";
655 file <<
" b_" << vars_end_2->name_ <<
"_(NULL),\n";
656 file <<
" c_" << vars_end_2->name_ <<
"_(false){\n";
658 file <<
" small_tree(filename){\n";
660 for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
662 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &p_" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
664 file <<
" chain_.SetBranchAddress(\"" << var->name_ <<
"\", &" << var->name_ <<
"_, &b_" << var->name_ <<
"_);\n";
669 file <<
"void small_tree_" << name <<
"::Fill(){\n";
670 file <<
" small_tree::Fill();\n";
672 file <<
" //Resetting variables\n";
673 for(set<Variable>::const_iterator var = vars.begin(); var != vars.end(); ++var){
675 file <<
" " << var->name_ <<
"_.clear();\n";
676 }
else if(
Contains(var->type_,
"tring")){
677 file <<
" " << var->name_ <<
"_ = \"\";\n";
679 file <<
" " << var->name_ <<
"_ = static_cast<" << var->type_ <<
">(bad_val_);\n";
684 file <<
"string small_tree_" << name <<
"::Type() const{\n";
685 file <<
" return \"" << name <<
"\";\n";
688 file <<
"small_tree_" << name <<
"::~small_tree_" << name <<
"(){\n";
691 file <<
"void small_tree_" << name <<
"::GetEntry(const long entry){\n";
692 file <<
" small_tree::GetEntry(entry);\n\n";
694 for(set<Variable>::const_iterator var = vars.begin(); var!= vars.end(); ++var){
695 file <<
" c_" << var->name_ <<
"_ = false;\n";
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";
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";
708 file <<
" return " << var->name_ <<
"_;\n";
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";
718 file <<
" return " << var->name_ <<
"_;\n";
726 ofstream
file(
"inc/event_handler_base.hpp");
728 file <<
" // event_handler_base: base class for reduced tree production\n";
729 file <<
" // File generated with generate_small_tree.exe\n\n";
731 file <<
"#ifndef H_EVENT_HANDLER_BASE\n";
732 file <<
"#define H_EVENT_HANDLER_BASE\n\n";
734 file <<
"#include <string>\n\n";
736 file <<
"#include \"TString.h\"\n\n";
738 file <<
"#include \"phys_objects.hpp\"\n\n";
740 file <<
"class event_handler_base : public phys_objects{\n";
742 file <<
" event_handler_base(const std::string &file_name);\n\n";
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";
748 file <<
" virtual ~event_handler_base();\n";
758 ofstream
file(
"src/event_handler_base.cpp");
760 file <<
"// event_handle_base: base class for reduced tree production\n";
761 file <<
"// File generated with generate_small_tree.exe\n\n";
763 file <<
"#include \"event_handler_base.hpp\"\n\n";
765 file <<
"#include <string>\n";
767 file <<
"using namespace std;\n\n";
769 file <<
"event_handler_base::event_handler_base(const string &file_name):\n";
770 file <<
" phys_objects(file_name){\n";
773 file <<
"event_handler_base::~event_handler_base(){\n";
778 string NAME =
ToCaps(name);
779 ofstream
file((
"inc/event_handler_"+name+
".hpp").c_str());
781 file <<
" // event_handler_" << name <<
": derived class for specialized reduced tree production\n";
782 file <<
" // File generated with generate_small_tree.exe\n\n";
784 file <<
"#ifndef H_EVENT_HANDLER_" << NAME <<
"\n";
785 file <<
"#define H_EVENT_HANDLER_" << NAME <<
"\n";
787 file <<
"#include <string>\n";
789 file <<
"#include \"TString.h\"\n\n";
791 file <<
"#include \"event_handler_base.hpp\"\n\n";
793 file <<
"class event_handler_" << name <<
" : public event_handler_base{\n";
795 file <<
" event_handler_" << name <<
"(const std::string &file_name);\n\n";
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";
801 file <<
" virtual ~event_handler_" << name <<
"();\n";
811 ofstream
file((
"src/event_handler_"+name+
".cpp").c_str());
813 file <<
" // event_handler_" << name <<
": derived class for specialized reduced tree production\n";
814 file <<
" // File generated with generate_small_tree.exe\n\n";
816 file <<
"#include \"event_handler_" << name <<
".hpp\"\n\n";
818 file <<
"#include <string>\n";
820 file <<
"#include \"TString.h\"\n\n";
822 file <<
"#include \"event_handler_base.hpp\"\n\n";
824 file <<
"using namespace std;\n\n";
826 file <<
"event_handler_" << name <<
"::event_handler_" << name <<
"(const string &file_name):\n";
827 file <<
" event_handler_base(file_name){\n";
830 file <<
"void event_handler_" << name <<
"::ReduceTree(int /*num_entries*/, const TString &/*out_file_name*/, int /*num_total_entries*/){\n";
833 file <<
"event_handler_" << name <<
"::~event_handler_" << name <<
"(){\n";
840 ofstream
file(
"inc/event_handler.hpp");
842 file <<
" // event_handler: main class for reduced tree production\n";
843 file <<
" //File generated with generate_small_tree.exe\n\n";
845 file <<
"#ifndef H_EVENT_HANDLER\n";
846 file <<
"#define H_EVENT_HANDLER\n\n";
848 file <<
"#include <string>\n";
850 file <<
"#include \"TString.h\"\n\n";
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";
857 file <<
"class event_handler{\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";
879 ofstream
file(
"src/event_handler.cpp");
881 file <<
"// event_handler: main class for reduced tree production\n";
882 file <<
" //File generated with generate_small_tree.exe\n\n";
884 file <<
"#include \"event_handler.hpp\"\n\n";
886 file <<
"#include <typeinfo>\n";
887 file <<
"#include <string>\n\n";
889 file <<
"#include \"TString.h\"\n\n";
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";
896 file <<
"using namespace std;\n\n";
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";
903 file <<
"event_handler::event_handler(const string &file_name, const string &type):\n";
904 file <<
" ehb(LookUpType(file_name, type)){\n";
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";
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";
920 file <<
" return NULL;\n";
923 file <<
"event_handler_base * LookUpType(const string &/*file_name*/, const string &/*type*/){\n";
924 file <<
" return NULL;\n";
928 file <<
"long event_handler::TotalEntries() const{\n";
929 file <<
" return ehb->TotalEntries();\n";
932 file <<
"short event_handler::GetVersion() const{\n";
933 file <<
" return ehb->GetVersion();\n";
936 file <<
"const std::string& event_handler::SampleName() const{\n";
937 file <<
" return ehb->SampleName();\n";
940 file <<
"const std::string& event_handler::SampleName(const std::string &sample_name){\n";
941 file <<
" return ehb->SampleName(sample_name);\n";
944 file <<
"void event_handler::SetFile(const std::string &file, bool is_8TeV){\n";
945 file <<
" ehb->SetFile(file, is_8TeV);\n";
948 file <<
"void event_handler::AddFiles(const std::string &file){\n";
949 file <<
" ehb->AddFiles(file);\n";
952 file <<
"event_handler::~event_handler(){\n";
953 file <<
" if(ehb){\n";
954 file <<
" delete ehb;\n";
955 file <<
" ehb = NULL;\n";
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)
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)
vector< string > Tokenize(const string &input, const string &tokens=" ")
void GenerateEventHandlerBaseSource()
void GenerateEventHandlerMergeHeader(const vector< string > &names)
void GenerateEventHandlerBaseHeader()