43 #include "filval/filval.hpp" 44 #include "filval_root/filval_root.hpp" 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 58 void enable_branches(MiniTreeDataSet& mt){
60 mt.track_branch<
int>(
"nLepGood");
73 mt.track_branch<
int>(
"nJet");
84 mt.track_branch<
int>(
"nGenPart");
94 mt.track_branch<
int>(
"nBJetLoose40");
95 mt.track_branch<
int>(
"nBJetMedium40");
96 mt.track_branch<
int>(
"nBJetTight40");
107 void declare_values(MiniTreeDataSet& mt){
111 auto event_number = mt.get_current_event_number();
112 auto is_training = fv::apply(fv::GenFunction::register_function<
bool(
int)>(
"is_odd",
115 }))), fv::tuple(event_number));
117 auto is_signal = fv::bound(fv::GenFunction::register_function<
bool()>(
"is_signal",
119 const std::string& label = mt->get_current_event_label();
120 return label ==
"signal";
123 auto weight = fv::constant<double>(
"1", 1);
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")}
148 GenValue::alias(
"mva_data", mva_data);
152 void declare_containers(MiniTreeDataSet& mt){
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");
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;
165 string log_filename = replace_suffix(output_filename,
".log");
166 fv::util::Log::init_logger(log_filename, fv::util::LogPriority::kLogDebug);
168 std::map<std::string, std::string> filenames_with_labels;
169 for (
const std::string& fname : sig_files){
170 filenames_with_labels[fname] =
"signal";
172 for (
const std::string& fname : bg_files){
173 filenames_with_labels[fname] =
"background";
176 MiniTreeDataSet mt(output_filename, filenames_with_labels);
180 declare_containers(mt);
186 int main(
int argc,
char * argv[])
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;
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;
199 for(
int i=1; i<argc; i++){
200 if (!strncmp(argv[i],
"-sig", 4)){
201 cur_flist = &sig_files;
203 else if (!strncmp(argv[i],
"-bg", 3)){
204 cur_flist = &bg_files;
207 else if (!strncmp(argv[i],
"-out", 4)){
210 else if (cur_flist !=
nullptr){
211 cur_flist->push_back(argv[i]);
214 create_mva(output_filename, sig_files, bg_files, silent);
The namespace containing all filval classes and functions.