//Renata Kopecna #include #include #include #include #include #include "GetMeanError.hh" #include #include #include "ScriptHelpers.hh" std::vector getSM(std::string observable){ if (observable == "Fl") return {+0.248569008046490070, +0.2581971160208132000, +0.42526014659559220000, +0.49420669353506260000, +0.1850102996703149000}; //s1s else if (observable == "S3") return {+0.000732569649322501, -0.0324523859139632900, -0.08563864422457230000, -0.18934424485647136000, -0.0130310503598977030}; //s3 else if (observable == "S4") return {-0.028317693174889150, -0.2425837027660650600, -0.28116530113868093000, -0.29668531019781386000, -0.1468982883895949300}; //s4 else if (observable == "S5") return {+0.035479698896675250, -0.3745017565795041000, -0.40726931726860705000, -0.30161750053585110000, -0.1915219985323076700}; //s5 else if (observable == "Afb")return {-0.122319885918514240, +0.2473816826915200600, +0.52432045165541470000, +0.52106439209368990000, +0.0147578966169414490}; //s6s else if (observable == "S7") return {-0.019468600975846337, -0.0105435770924197210, -0.00219285191192886900, -0.00119446595061885200, -0.0160492529928752330}; //s7 else if (observable == "S8") return {-0.010192773160727949, -0.0043019891737210840, +0.00104987431866559550, +0.00027244645255727460, -0.0070279543261629670}; //s8 else if (observable == "S9") return {-0.000756965302130655, -0.0006959911482550733, +0.00044741790607562027, +0.00026464193866571387, -0.0007199408885633002}; //s9 else{ spdlog::warn("Wrong observable, returning an empty vector"); return {}; } } std::vector fixSM(std::string observable){ std::vector tmp = {}; for (auto val : getSM(observable)){ if (observable == "Fl") tmp.push_back(round((1-4.0*val/3.0)*100.0)/100.0); else if (observable=="Afb") tmp.push_back(round((3.0*val/4.0)*100.0)/100.0); else tmp.push_back(round(val*100.0)/100.0); } return tmp; } int loadAllFiles(std::string observable, basic_params params){ //load chain with all results of bootstrapping TChain * ch = new TChain(observable.c_str()); std::string files = final_result_name_toys(1111, params.reference, params.nBins, true, params, params.Run, false, false, false, false, false, true); replace(files, "1111", "*"); //integer replaced by a string * replace(files, "ToysFit/", "ToysFit/"+std::to_string(params.jobID)+"/"); spdlog::debug("Loading files: " + files); ch->Add(files.c_str()); int nEntries = ch->GetEntries(); spdlog::debug("Loaded {0:d} entries", nEntries); if (nEntries == 0){ spdlog::error("No files found!"); return 404; } //link variables to branches double value = DEFAULT_TREE_VAL; double error = DEFAULT_TREE_ERR; double errorup = DEFAULT_TREE_ERR; double errordown = DEFAULT_TREE_ERR; int migrad = DEFAULT_TREE_INT; int cov = DEFAULT_TREE_INT; int bin = DEFAULT_TREE_INT; int pdf = DEFAULT_TREE_INT; ch->SetBranchStatus("*",1); //TODO optimize ch->SetBranchAddress("value", &value); ch->SetBranchAddress("error", &error); ch->SetBranchAddress("error_up", &errorup); ch->SetBranchAddress("error_down", &errordown); ch->SetBranchAddress("migrad", &migrad); ch->SetBranchAddress("status_cov", &cov); ch->SetBranchAddress("bin", &bin); ch->SetBranchAddress("pdf", &pdf); const int nBins = params.nBins; std::vector errors[nBins]; //Don't fill a histogram just yet, just put the values in a vector first //Loop over the entries and fill the vector for (int iter = 0; iter < nEntries; iter++){ ch->GetEntry(iter); //require converged migrad if (migrad!=0) continue; //require fitresult = 300 or 100 (or 200) if(!(cov == 1 || cov == 3 || cov == 2)) continue; if (pdf == 1) continue; //Just take one pdf, as the values are shared spdlog::trace("Parameter value at entry {0:d}: {1:f}", iter, value); spdlog::trace("Parameter error at entry {0:d}: {1:f}", iter, error); errors[bin].push_back(error); } //Debug print in case for (int b = 0; b < nBins; b++){ spdlog::debug("Got {0:d} entries for bin {1:d}", errors[b].size(),b); } //Now init a histogram for each bin and fill it std::vector means; for (int b = 0; b < nBins; b++){ //Get the max and the min of the errors double max = *max_element(errors[b].begin(), errors[b].end()); double min = *min_element(errors[b].begin(), errors[b].end()); if (min == max) continue; //If errors are all the same, it was fixed, so don't plot //Easier than checking folding if (max>1.0) max = 0.5; if (min<0.01) min = 0.01; //Create the TH1D for the errors TH1D *h_errors = new TH1D(observable.c_str(), (observable+" in q^{2} bin #"+std::to_string(b) +";"+observable+";Entries").c_str(), errors[b].size()/10, min, max); //Fill the TH1D from the read vector for (auto err: errors[b]) h_errors->Fill(err); //Fit the distribution with a gaussia TF1 *fit_func = new TF1("fit_func","gaus",min,max); fit_func->SetParameters(h_errors->GetMaximum(), h_errors->GetMean(), h_errors->GetRMS() ); h_errors->Fit("fit_func",spdlog_debug() ? "R" : "RQ"); //Plot and save it plotAndSave(h_errors,observable,"./"+observable+"_"+std::to_string(params.jobID)+"_"+std::to_string(b),"eps"); //Save the mean to a vector so you can print it later means.push_back(fit_func->GetParameter("Mean") ); h_errors->Clear(); } if (means.size()>0){ std::vectorvalSM = fixSM(observable); std::cout << "$" << observable << "$\t"; for_indexed (auto val: means) std::cout << " & $" << valSM[i] << " \\pm " << val << "$"; std::cout << "\\\\" << std::endl; } return 0; }