susy_cfa  b611ccad937ea179f86a1f5663960264616c0a20
generate_cfa_class.cxx
Go to the documentation of this file.
1 #include "generate_cfa.hpp"
2 
3 #include <cctype>
4 
5 #include <utility>
6 #include <string>
7 #include <set>
8 #include <fstream>
9 #include <iostream>
10 #include <stdexcept>
11 
12 #include "TFile.h"
13 #include "TChain.h"
14 #include "TLeafObject.h"
15 
16 int main(int argc, char *argv[]){
17  try{
18  if(argc<=2) throw std::runtime_error("At least two arguments required.");
19  if(!(argc & 1)) throw std::runtime_error("Even number of arguments required.");
20 
21  {TTree t("a","b");}//Magically make ROOT link things correctly...
22 
23  std::vector<std::string> class_names(0);
24  Dictionary full_varset;
25 
26  for(int arg = 1; (arg+1) < argc; arg+=2){
27  TFile in_file(argv[arg], "read");
28  if(!in_file.IsOpen() || in_file.IsZombie()) throw std::runtime_error(std::string("Could not open file ")+argv[arg]);
29 
30  std::string file_name = argv[arg];
31  std::string dir_name = "cfA";
32  if (file_name.find("cfa_file_8")!=std::string::npos) dir_name = "configurableAnalysis";
33  TChain *ptr_chain_a(static_cast<TChain*>(in_file.Get((dir_name+"/eventA").c_str())));
34  if(!ptr_chain_a){
35  throw std::runtime_error(std::string("Could not find chainA in ")+argv[arg]);
36  }
37 
38  TChain *ptr_chain_b(static_cast<TChain*>(in_file.Get((dir_name+"/eventB").c_str())));
39  if(!ptr_chain_b){
40  throw std::runtime_error(std::string("Could not find chainB in ")+argv[arg]);
41  }
42 
43  GetVariables(*ptr_chain_a, true, (arg-1)/2, (argc-1)/2, full_varset);
44  GetVariables(*ptr_chain_b, false, (arg-1)/2, (argc-1)/2, full_varset);
45 
46  class_names.push_back(argv[arg+1]);
47  }
48 
49  std::vector<Variable> base_variables(0), virtual_variables(0);
50  std::vector<std::vector<Variable> > file_variables(0);
51 
52  ClassifyVariables(full_varset, base_variables, virtual_variables, file_variables);
53 
54  WriteBaseHeader(base_variables, virtual_variables);
55  WriteBaseSource(base_variables, virtual_variables);
56 
57  for(size_t file = 0; file<file_variables.size(); ++file){
58  WriteDerivedHeader(class_names.at(file), file_variables.at(file));
59  WriteDerivedSource(class_names.at(file), file_variables.at(file));
60  }
61 
62  Typelist typelist;
63  AddToTypelist(base_variables, typelist);
64  AddToTypelist(virtual_variables, typelist);
65 
66  RepList patterns;
67  GetRules(patterns);
68 
69  RepMap replacements;
70  GetReplacements(typelist, patterns, replacements);
71 
72  RepMap overwrites, new_funcs;
73  GetOverwritten(typelist, replacements, overwrites, new_funcs);
74 
75  WriteMergedHeader(typelist, overwrites, new_funcs);
76  WriteMergedSource(typelist, overwrites, new_funcs, class_names);
77  }
78  catch(std::exception& ex){
79  std::cerr << "An exception occurred: " << ex.what() << std::endl;
80  return EXIT_FAILURE;
81  }
82  catch(...){
83  std::cerr << "An unknown exception occurred." << std::endl;
84  return EXIT_FAILURE;
85  }
86  return EXIT_SUCCESS;
87 }
std::set< std::pair< std::string, std::string > > Typelist
std::vector< std::pair< std::string, std::vector< std::string > > > RepList
void AddToTypelist(const std::vector< Variable > &vars, Typelist &typelist)
void WriteBaseSource(const std::vector< Variable > &base_vars, const std::vector< Variable > &virtual_variables)
void WriteMergedHeader(const Typelist &typelist, const RepMap &overwritten, const RepMap &new_funcs)
void WriteMergedSource(const Typelist &typelist, const RepMap &overwritten, const RepMap &new_funcs, const std::vector< std::string > &class_names)
void GetReplacements(const Typelist &typelist, const RepList &pats, RepMap &reps)
void GetOverwritten(const Typelist &typelist, const RepMap &replacements, RepMap &overwritten, RepMap &new_funcs)
void GetRules(RepList &reps)
void WriteBaseHeader(const std::vector< Variable > &base_vars, const std::vector< Variable > &virtual_variables)
std::map< std::pair< std::string, std::string >, std::vector< std::string > > RepMap
void WriteDerivedHeader(const std::string &class_name, const std::vector< Variable > &vars)
void GetVariables(TChain &chain, const bool is_chain_a, const size_t file, const size_t num_files, Dictionary &vars)
int main(int argc, char *argv[])
void WriteDerivedSource(const std::string &class_name, const std::vector< Variable > &vars)
void ClassifyVariables(const Dictionary &all_var, std::vector< Variable > &base_vars, std::vector< Variable > &virtual_vars, std::vector< std::vector< Variable > > &file_vars)
std::map< std::string, std::vector< std::pair< bool, std::string > > > Dictionary