//Create tables of BDT significance for B+->Kst+mumu //david gerick #include "../../GlobalFunctions.hh" #include "../../HeidelbergFitter/LHCbStyle.h" //#include "MVA_b2kmm.cc" using namespace std; using namespace RooFit ; ////////////////////////////////////////////////////// /// GetMVASignificance() /// void GetMVASignificance(std::vector Run, std::vector DDLL, std::string BDTmethod) { bool debug = false; UInt_t NN = Run.size(); assert(NN == DDLL.size()); std::vector< std::vector > rank; std::vector< std::vector< std::string> > latex_name; std::vector< std::vector > value; for(UInt_t n = 0; n < NN; n++){ std::cout << "[LOAD]\t\tRun" << Run.at(n) << " " << DDLL.at(n) << std::endl; //load MVAconfig MVA_variables vars(DDLL.at(n)); rank.push_back(std::vector()); latex_name.push_back(std::vector()); value.push_back(std::vector()); //load results from .txt (This has to be saved manually from the MVA training output, before creating the LaTeX table) std::ifstream file; std::string line = ""; std::string filename = path_to_data+"/"+BDTmethod+"results_Run"+std::to_string(Run.at(n))+DDLL.at(n)+".txt"; file.open(filename); if (file.is_open()){ std::cout << "[INFO]\t\tOpened the result file: " << filename << std::endl; std::cout << "[INFO]\t\tProceed with loading the results!" << std::endl; } else{ std::cout << "[ERROR]\t\tCould not load the result file: " << filename << std::endl; std::cout << "[ERROR]\t\tMake sure, the result from the MVA training are copied (by hand) into the *.txt file" << std::endl; std::cout << "[ERROR]\t\tThe part that needs to be copied looks something like this:" << std::endl; std::cout << "[ERROR]\t\t" << std::endl; for(UInt_t i = 0; i < 8; i++) std::cout << "[ERROR]\t\t--- " << BDTmethod << " : " << i+1 << " : variable" << i+1 << " : value" << std::endl; return; } while(1){ //loop over lines until you find the end of the file getline(file, line); if(file.eof()) break; if(line.length() == 0)continue; size_t first_colon = line.find(":"); if(first_colon == line.length())continue; size_t secon_colon = line.find(":", first_colon+1); if(secon_colon == line.length())continue; size_t third_colon = line.find(":", secon_colon+1); if(third_colon == line.length())continue; if(debug){ std::cout << "Line: '" << line << "'\twith length=" << line.length() << std::endl; std::cout << "First ':' at pos=" << first_colon << "\tSecond ':' at pos=" << secon_colon << "\tThird ':' at pos=" << third_colon << std::endl; } //save the rank rank.at(n).push_back(atoi(line.substr(first_colon+1, secon_colon-first_colon-2).c_str())); std::string branch_name = line.substr(secon_colon+2, third_colon-secon_colon-2); while(replace(branch_name, " ", "")); while(replace(branch_name, "log_", "")); //convert and save the LaTeX name Int_t var = 0; while(var < vars.NumberOfVariables()){ if(vars.AllVariables.at(var).ReaderName.find(branch_name.c_str()) < vars.AllVariables.at(var).ReaderName.length()) break; var++; } if(var == vars.NumberOfVariables()){ std::cout << "[ERROR]\t\tNo LaTeX name found for varialbe: '" << branch_name << "'" << std::endl; return; } latex_name.at(n).push_back(vars.AllVariables.at(var).LaTeXName); while(replace(latex_name.at(n).back(), "K_{s}^{0}", "\\KS ")); while(replace(latex_name.at(n).back(), "K_{s}", "\\KS ")); while(replace(latex_name.at(n).back(), "B^{+}", "\\Bu ")); while(replace(latex_name.at(n).back(), "#chi^{2}", "\\chisq ")); while(replace(latex_name.at(n).back(), "#mu^{+}", "\\mup ")); while(replace(latex_name.at(n).back(), "#mu^{-}", "\\mun ")); while(replace(latex_name.at(n).back(), "K^{*+}", "\\Kstarp ")); while(replace(latex_name.at(n).back(), "#pi^{+}", "\\pip ")); while(replace(latex_name.at(n).back(), "p_{T}", "\\pt ")); while(replace(latex_name.at(n).back(), "#eta", "$\\eta$")); while(replace(latex_name.at(n).back(), "#", "\\")); // while(replace(latex_name.at(n).back(), "", "")); //save the MVA significance value (in %) value.at(n).push_back(atof(line.substr(third_colon+2).c_str())*100.); } assert(rank.at(n).size() == latex_name.at(n).size()); assert(rank.at(n).size() == value.at(n).size()); if(debug){ for(UInt_t i = 0; i < rank.at(n).size(); i++){ std::cout << "#" << rank.at(n).at(i) << ": " << latex_name.at(n).at(i) << " = " << Form("%.2f", value.at(n).at(i)) << std::endl; } } file.close(); } //print LaTeX table: std::cout << std::endl << std::endl << std::endl; std::cout << "\\begin{center}\\begin{tabular}{"; for(UInt_t n = 0; n < NN; n++) std::cout << "lr"; std::cout << "} \\hline" << std::endl; for(UInt_t n = 0; n < NN; n++){ if(n != 0) std::cout << "\t&"; std::cout << "Run " << Run.at(n); if(DDLL.at(n) != "") std::cout << " \\" << DDLL.at(n); std::cout << "\t&[\\\%]"; } std::cout << "\\\\" << std::endl; std::cout << "\\hline" << std::endl; for(UInt_t v = 0; v < rank.at(0).size(); v++){ for(UInt_t n = 0; n < NN; n++){ if(n != 0) std::cout << "\t&"; if(latex_name.at(n).size() > v) std::cout << latex_name.at(n).at(v) << "\t&" << Form("%.2f", value.at(n).at(v)); else std::cout << "\t &"; } std::cout << "\\\\" << std::endl; } std::cout << "\\hline" << std::endl; std::cout << "\\end{tabular}\\end{center}" << std::endl; std::cout << std::endl << std::endl << std::endl; return; } void GetAllMVATables(){ std::string method = std::string(TMVAmethod); if(Kst2Kspiplus){ GetMVASignificance({1, 1}, {"DD", "LL"}, method); GetMVASignificance({2, 2}, {"DD", "LL"}, method); } else{ GetMVASignificance({1, 2}, {"",""}, method); } }