TTTT Analysis  0.1
MVA_Creation.cpp
Go to the documentation of this file.
1 
37 #include <iostream>
38 #include <vector>
39 #include <utility>
40 #include <numeric>
41 #include <limits>
42 
43 #include "filval/filval.hpp"
44 #include "filval_root/filval_root.hpp"
45 
46 #include "MiniTreeDataSet.hpp"
47 #include <TSystem.h>
48 
49 #define PI 3.14159
50 #define W_MASS 80.385 // GeV/c^2
51 #define Z_MASS 91.188 // GeV/c^2
52 #define T_MASS 172.44 // GeV/c^2
53 
54 using namespace std;
55 using namespace fv;
56 using namespace fv::root;
57 
58 void enable_branches(MiniTreeDataSet& mt){
59 
60  mt.track_branch<int>("nLepGood");
61  /* mt.track_branch_vec< int >("nLepGood", "LepGood_pdgId"); */
62  /* mt.track_branch_vec<float>("nLepGood", "LepGood_pt"); */
63  /* mt.track_branch_vec<float>("nLepGood", "LepGood_eta"); */
64  /* mt.track_branch_vec<float>("nLepGood", "LepGood_phi"); */
65  /* mt.track_branch_vec<float>("nLepGood", "LepGood_mass"); */
66  /* mt.track_branch_vec< int >("nLepGood", "LepGood_charge"); */
67  /* mt.track_branch_vec< int >("nLepGood", "LepGood_mcMatchId"); */
68  /* mt.track_branch_vec< int >("nLepGood", "LepGood_mcMatchPdgId"); */
69  /* mt.track_branch_vec< int >("nLepGood", "LepGood_mcMatchAny"); */
70  /* mt.track_branch_vec< int >("nLepGood", "LepGood_mcMatchTau"); */
71  /* mt.track_branch_vec< int >("nLepGood", "LepGood_mcPt"); */
72 
73  mt.track_branch<int>("nJet");
74  /* mt.track_branch_vec<float>("nJet", "Jet_pt"); */
75  /* mt.track_branch_vec<float>("nJet", "Jet_eta"); */
76  /* mt.track_branch_vec<float>("nJet", "Jet_phi"); */
77  /* mt.track_branch_vec<float>("nJet", "Jet_mass"); */
78  /* mt.track_branch_vec<float>("nJet", "Jet_btagCMVA"); */
79  /* mt.track_branch_vec< int >("nJet", "Jet_mcMatchFlav"); */
80  /* mt.track_branch_vec< int >("nJet", "Jet_mcMatchId"); */
81  /* mt.track_branch_vec< int >("nJet", "Jet_mcFlavour"); */
82 
83 
84  mt.track_branch<int>("nGenPart");
85  /* mt.track_branch_vec< int >("nGenPart", "GenPart_pdgId"); */
86  /* mt.track_branch_vec< int >("nGenPart", "GenPart_motherIndex"); */
87  /* mt.track_branch_vec< int >("nGenPart", "GenPart_motherId"); */
88  /* mt.track_branch_vec<float>("nGenPart", "GenPart_pt"); */
89  /* mt.track_branch_vec<float>("nGenPart", "GenPart_eta"); */
90  /* mt.track_branch_vec<float>("nGenPart", "GenPart_phi"); */
91  /* mt.track_branch_vec<float>("nGenPart", "GenPart_mass"); */
92  /* mt.track_branch_vec< int >("nGenPart", "GenPart_status"); */
93 
94  mt.track_branch<int>("nBJetLoose40");
95  mt.track_branch<int>("nBJetMedium40");
96  mt.track_branch<int>("nBJetTight40");
97 
98 
99  /* mt.track_branch<int>("nVert"); */
100 
101  /* mt.track_branch< int >("run" ); */
102  /* mt.track_branch< int >("lumi"); */
103  /* mt.track_branch< int >("evt" ); */
104  /* mt.track_branch<float>("xsec"); */
105 }
106 
107 void declare_values(MiniTreeDataSet& mt){
108 
109  /* auto data = fv::tuple(lookup<int>("nJet"), lookup<int>("nBJetLoose40"), lookup<int>("nBJetMedium40"), lookup<int>("nBJetTight40"), lookup<int>("nLepGood")); */
110 
111  auto event_number = mt.get_current_event_number();
112  auto is_training = fv::apply(fv::GenFunction::register_function<bool(int)>("is_odd",
113  FUNC(([](int n){
114  return (n%2) == 1;
115  }))), fv::tuple(event_number));
116 
117  auto is_signal = fv::bound(fv::GenFunction::register_function<bool()>("is_signal",
118  FUNC(([mt=&mt](){
119  const std::string& label = mt->get_current_event_label();
120  return label == "signal";
121  }))), "is_signal");
122 
123  auto weight = fv::constant<double>("1", 1);
124 
125  /* auto mva_data = fv::root::mva_data(data, is_training, is_signal, weight, "mva_data"); */
126  /* mva_data->enable_logging([](std::tuple<std::tuple<int,int,int,int,int>,bool,bool,double> t) */
127  /* { */
128  /* std::tuple<int,int,int,int,int> data; */
129  /* bool is_training, is_signal; */
130  /* double weight; */
131  /* std::tie(data, is_training, is_signal, weight) = t; */
132  /* int nJet, nBJetLoose40, nBJetMedium40, nBJetTight40, nLepGood; */
133  /* std::tie(nJet, nBJetLoose40, nBJetMedium40, nBJetTight40, nLepGood) = data; */
134  /* std::stringstream ss; */
135  /* ss << "data("<<nJet<<","<<nBJetLoose40<<","<<nBJetMedium40<<","<<nBJetTight40<<","<<nLepGood<<")"<< std::endl */
136  /* <<"\tis_training:" << is_training<< std::endl */
137  /* <<"\tis_signal: " << is_signal << std::endl */
138  /* <<"\tweight: " << weight << std::endl; */
139  /* return ss.str(); */
140  /* }); */
141  auto mva_data = fv::root::mva_data<int,int,int,int,int>(is_training, is_signal, weight,
142  {"nJet", lookup<int>("nJet")},
143  {"nBJetLoose40", lookup<int>("nBJetLoose40")},
144  {"nBJetMedium40", lookup<int>("nBJetMedium40")},
145  {"nBJetTight40", lookup<int>("nBJetTight40")},
146  {"nLepGood", lookup<int>("nLepGood")}
147  );
148  GenValue::alias("mva_data", mva_data);
149 
150 }
151 
152 void declare_containers(MiniTreeDataSet& mt){
153 
154  auto mva_data = (MVAData<int,int,int,int,int>*)lookup<MVAData<int,int,int,int,int>::type>("mva_data");
155  auto mva = mt.register_container<MVA<int,int,int,int,int>>("my_mva", mva_data);
156  mva->add_method("KNN", "H:nkNN=20:ScaleFrac=0.8:SigmaFact=1.0:Kernel=Gaus:UseKernel=F:UseWeight=T:!Trim");
157 }
158 
159 
160 void create_mva(const std::string& output_filename, const std::vector<std::string>& sig_files, const std::vector<std::string>& bg_files, bool silent){
161  gSystem->Load("libfilval.so");
162  auto replace_suffix = [](const std::string& input, const std::string& new_suffix){
163  return input.substr(0, input.find_last_of(".")) + new_suffix;
164  };
165  string log_filename = replace_suffix(output_filename, ".log");
166  fv::util::Log::init_logger(log_filename, fv::util::LogPriority::kLogDebug);
167 
168  std::map<std::string, std::string> filenames_with_labels;
169  for (const std::string& fname : sig_files){
170  filenames_with_labels[fname] = "signal";
171  }
172  for (const std::string& fname : bg_files){
173  filenames_with_labels[fname] = "background";
174  }
175 
176  MiniTreeDataSet mt(output_filename, filenames_with_labels);
177 
178  enable_branches(mt);
179  declare_values(mt);
180  declare_containers(mt);
181 
182  mt.process(silent);
183  mt.save_all();
184 }
185 
186 int main(int argc, char * argv[])
187 {
188  fv::util::ArgParser args(argc, argv);
189  if(args.cmdOptionExists("-h")) {
190  cout << "Usage: ./mva (-s) -out outfile.root -sig [signal_minitree.root]+ -bg [background_minitree.root]+" << endl;
191  return 0;
192  }
193  bool silent = args.cmdOptionExists("-s");
194  string output_filename = args.getCmdOption("-out");
195  std::vector<std::string> sig_files;
196  std::vector<std::string> bg_files;
197  std::vector<std::string>* cur_flist = nullptr;
198 
199  for(int i=1; i<argc; i++){
200  if (!strncmp(argv[i], "-sig", 4)){
201  cur_flist = &sig_files;
202  }
203  else if (!strncmp(argv[i], "-bg", 3)){
204  cur_flist = &bg_files;
205  continue;
206  }
207  else if (!strncmp(argv[i], "-out", 4)){
208  cur_flist = nullptr;
209  }
210  else if (cur_flist != nullptr){
211  cur_flist->push_back(argv[i]);
212  }
213  }
214  create_mva(output_filename, sig_files, bg_files, silent);
215 }
STL namespace.
The namespace containing all filval classes and functions.
Definition: api.hpp:46
Definition: api.hpp:8