//compare MC and data of BDT variables for B+->Kst+mumu //david gerick //Renata Kopecna #include "../GlobalFunctions.hh" #include "../nTrackWeights.cpp" #include "../LHCbStyle.h" //#include "MVA_b2kmm.cc" using namespace std; using namespace RooFit ; #include // std::max, min ////////////////////////////////////////////////////// /// compareVariables() /// compute and plot a desired variable for given year and subdecay channel /// choose weither it is sWeighted, not weighted, weighted by nTracks or 2 * 1D reweighted by /// nTracks and B_plus_PT. The data sample can be sweighted, so the weighting /// only concerns the MC sample. /// Choose, weither to print the plots to pdf and root files. /// variables can be plotted in log(var) or log(1 - var), using the according booleans /// /// compareAll***() /// compare all variables given in the function and save the plots /// /// compareTrackMultiplicities() /// compare the distribution of different track types between Run I and Run II /// use sWeights and normalize the samples! /// /// compareAnglesInPHSP() /// see the effects of re-weighting of PHSP MC on the angular distributions /// /// compareAnglesInMC() /// see the effects of re-weighting of MC on the angular distributions /// /// compareAnglesInPHSPbeforeAndAfterBDTcut() /// see the effect of the BDT cut on the angular distributions of PHSP MC /// /// const bool CutInQ2 = false; double minQ2 = 15.0; double maxQ2 = 100.0; const bool CutInMuPt = false; double minPT = 1100.0; //2500 double maxPT = 2500.0; //10000 const bool separateCharge = false; bool plusCharge = false; int evalOperation(bool useTwoVars = false, int x = 0, int y = 0, std::string operation = "plus",bool bLogVar = false, bool bLog1minusVar = false){ if (bLogVar){ x = log(x); y = log(y); } else if (bLog1minusVar){ x = log(1-x); y = log(1-y); } if (!useTwoVars) return x; if (operation == "max") return max(x,y); else if (operation == "min") return min(x,y); else if (operation == "abs") return abs(x-y); else if (operation == "plus") return x+y; else if (operation == "minus") return x-y; else{ coutERROR("Wrong opetaion specified, returning 0!"); return 0; } } double evalOperation(bool useTwoVars = false, double x = 0.0, double y = 0.0, std::string operation = "plus",bool bLogVar = false, bool bLog1minusVar = false){ if (bLogVar){ x = log(x); y = log(y); } else if (bLog1minusVar){ x = log(1-x); y = log(1-y); } if (!useTwoVars) return x; if (operation == "max") return max(x,y); else if (operation == "min") return min(x,y); else if (operation == "abs") return abs(x-y); else if (operation == "plus") return x+y; else if (operation == "minus") return x-y; else{ coutERROR("Wrong opetaion specified, returning 0!"); return 0.; } } int compareVariables(int year = 2011, std::string variable = "B_plus_PT", bool sWeight = true, bool bWeighted = true, bool b2Dweighted = true, bool bLogVar = false, bool bLog1minusVar = false, bool bPrint = true, bool KshortDecayInVelo = true, std::string weightBranch = "CB", bool useTwoVars = false, string operation = "", string variable2 = "" , string xAxis = "") { //if 2D weighted, set boolean for 1D weighting false if(b2Dweighted)bWeighted = false; //We don't use more than two variables; here are the option of what to do with the variables //Tried some fanc ystuff, was too complicated to quickly write // max(x,y) // min(x,y) //abs(x-y) //x-y //x+y //where x,y can be both in log if bLogVar is true gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); //lhcbStyle->SetOptTitle(1); //lhcbStyle->SetTitleSize(0.1,"x"); //lhcbStyle->SetTitleSize(0.1,"y"); //lhcbStyle->SetTitleSize(0.1,"z"); bool varIsInt = false; if(variable == "nTracks") varIsInt = true; if(variable == "nSPDHits") varIsInt = true; if(variable == "nLongTracks") varIsInt = true; if(variable == "nVeloTracks") varIsInt = true; if(variable == "nTTracks") varIsInt = true; if(variable == "nDownstreamTracks") varIsInt = true; if(variable == "nUpstreamTracks") varIsInt = true; if(variable == "nPV") varIsInt = true; bool varIsInt2 = false; if(variable2 == "nTracks") varIsInt2 = true; if(variable2 == "nSPDHits") varIsInt2 = true; if(variable2 == "nLongTracks") varIsInt2 = true; if(variable2 == "nVeloTracks") varIsInt2 = true; if(variable2 == "nTTracks") varIsInt2 = true; if(variable2 == "nDownstreamTracks") varIsInt2 = true; if(variable2 == "nUpstreamTracks") varIsInt2 = true; if(variable2 == "nPV") varIsInt2 = true; ///for now hardcoded, but might be possible to include in input parameters if comparison between data and reference MC is needed const bool ReferenceChannel = true; ///for writting only the ratio and superposition const bool minimumPlot = true; ///print the LHCb tag and the legend onto plots? const bool print_legend = true; if(bLogVar && bLog1minusVar){ coutERROR( "Only Log( var ) or Log( 1 - var ) option possible, but both flags were set for variable: " + variable); if (useTwoVars) coutERROR(" and variable " + variable2); return 0; } //put both magnet polarities into one TChain TChain * treeData = new TChain("DecayTree"); TChain * treeMC = new TChain("DecayTreeTruthMatched"); // Kst2Kpluspi0Resolved case if(Kst2Kpluspi0Resolved){ if(ReferenceChannel){ treeData->Add(Form("%s/Tuples/Data/%i_RefKplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMC->Add(Form("%s/Tuples/MC/%i_RefKplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year > 2016 ? 2016 : year)); } else{ treeData->Add(Form("%s/Tuples/Data/%i_KplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMC->Add(Form("%s/Tuples/MC/%i_KplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year == 2015 ? 2016 : year)); } } // Kst2Kpluspi0Merged case else if(Kst2Kpluspi0Merged){ if(ReferenceChannel){ treeData->Add(Form("%s/Tuples/Data/%i_RefKplusPi0Merged_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMC->Add(Form("%s/Tuples/MC/%i_KplusPi0MergedRef_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); } else{ treeData->Add(Form("%s/Tuples/Data/%i_KplusPi0Merged_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMC->Add(Form("%s/Tuples/MC/%i_KplusPi0Merged_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); } } // Kst2Kspiplus case else if(Kst2Kspiplus){ if(ReferenceChannel){ treeData->Add(Form("%s/Tuples/Data/%i_KshortPiplus_BDTinputRef.root", path_to_output_KshortPiplus.c_str(), year)); treeMC->Add(Form("%s/Tuples/MC/%i_RefKshortPiplusRef_BDTinput.root", path_to_output_KshortPiplus.c_str(), year)); } else{ if(AlwaysUseRefChannelData) treeData->Add(Form("%s/Tuples/Data/%i_RefKshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); else treeData->Add(Form("%s/Tuples/Data/%i_KshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); treeMC->Add(Form("%s/Tuples/MC/%i_KshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); } } //initialize canvas for printing // TCanvas * c1 = new TCanvas("c1", "raw distributions"); string varName = variable; string drawFormula; string drawFormTmp = ""; if(bLogVar) drawFormula = Form("log( %s )", variable.c_str()); else if(bLog1minusVar) drawFormula = Form("log(1 - %s)", variable.c_str()); else drawFormula = variable; if (useTwoVars){ if(bLogVar) drawFormTmp = Form("log( %s )", variable2.c_str()); else if(bLog1minusVar) drawFormTmp = Form("log(1 - %s)", variable2.c_str()); else drawFormTmp = variable2; if (operation.find("max") != std::string::npos){ varName = "max_" + variable + "_" + variable2 + "_"; drawFormula = "max(" + drawFormula + "," + drawFormTmp + ")"; operation = "max"; } else if (operation.find("min") != std::string::npos) { varName = "min_" + variable + "_" + variable2 + "_"; drawFormula = "min(" + drawFormula + "," + drawFormTmp + ")"; operation = "min"; } else if (operation.find("abs") != std::string::npos) { varName = "abs_" + variable + "_" + variable2 + "_"; drawFormula = "abs(" + drawFormula + "-" + drawFormTmp + ")"; operation = "abs"; } else if (operation.find("plus") != std::string::npos) { varName = variable + "+" + variable2; drawFormula = drawFormula + "+" + drawFormTmp; operation = "plus"; } else if (operation.find("minus") != std::string::npos) { varName = variable + "-" + variable2; drawFormula = drawFormula + "-" + drawFormTmp; operation = "minus"; } else{ coutERROR("Ivalid mathematical formula given: " + operation); return 0; } } std::string histName = Form("%i%s%s", year,(SplitDDandLL ? (KshortDecayInVelo ? "LL" : "DD") : ""),varName.c_str()); cout << "[INFO]\t\tUsing name for histograms " << histName << endl; cout << "[INFO]\t\tUsing draw formula " << Form("%s>>%sData", drawFormula.c_str(),histName.c_str()) << endl; //data: initialize histograms into objects treeData->Draw(Form("%s>>%sData", drawFormula.c_str(),histName.c_str()), ""); TH1 * hist0varData = (TH1*)gPad->GetPrimitive(Form("%sData",histName.c_str())); //MC: initialize histograms into objects treeMC ->Draw(Form("%s>>%sMC", drawFormula.c_str(),histName.c_str()), ""); TH1D * hist0varMC = (TH1D*)gPad->GetPrimitive(Form("%sMC",histName.c_str())); //Get min and max of x-range from both histograms: int nBins; double BinContent; int nBinMin, nBinMax; float Min; float Max; if(variable == "nTracks" || variable == "nSPDHits"){ nBins= 60; Min = -0.5; Max = 599.5; } else if(variable == "nLongTracks" || variable == "nVeloTracks" || variable == "nTTracks" || variable == "nBackTracks"|| variable == "nMuonTracks"){ nBins = 50; Min = -0.5; Max = 149.5; } else if(variable == "nDownstreamTracks" || variable == "nUpstreamTracks"){ nBins = 50; Min = -0.5; Max = 49.5; } else if(variable == "nPV"){ nBins = 8; Min = 0.5; Max = 8.5; } else { //get number of bins of both histograms and select larger number for new histogram int nBinsData = hist0varData->GetXaxis()->GetNbins(); int nBinsMC = hist0varMC->GetXaxis()->GetNbins(); if(nBinsData >= nBinsMC)nBins = nBinsData; else nBins = nBinsMC; //data nBinMin = 0; BinContent = 0.0; while(BinContent == 0.0){ nBinMin++; BinContent = hist0varData->GetBinContent(nBinMin); } float MinData = hist0varData->GetXaxis()->GetBinLowEdge(nBinMin); nBinMax = nBinsData + 1; BinContent = 0.0; while(BinContent == 0.0){ nBinMax--; BinContent = hist0varData->GetBinContent(nBinMax); } float MaxData = hist0varData->GetXaxis()->GetBinUpEdge(nBinMax); //MC nBinMin = 0; BinContent = 0.0; while(BinContent == 0.0){ nBinMin++; BinContent = hist0varMC->GetBinContent(nBinMin); } float MinMC = hist0varMC->GetXaxis()->GetBinLowEdge(nBinMin); nBinMax = nBinsData + 1; BinContent = 0.0; while(BinContent == 0.0){ nBinMax--; BinContent = hist0varMC->GetBinContent(nBinMax); } float MaxMC = hist0varMC->GetXaxis()->GetBinUpEdge(nBinMax); std::cout << "Found hist0varData bins: " << nBinsData << " from " << MinData << " to " << MaxData << std::endl; std::cout << "Found hist0varMC bins: " << nBinsMC << " from " << MinMC << " to " << MaxMC << std::endl; if(MinData <= MinMC)Min = MinData; else Min = MinMC; if(MaxData >= MaxMC)Max = MaxData; else Max = MaxMC; nBins/=2; } //default axis lable is the variable name: std::string xaxistitle = (xAxis == "" ? drawFormula : xAxis); //use MVA loader to get nicely formated variable name and units //manual intervention for ranges on X-axis if(Kst2Kspiplus){ //B+ if(strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)Min = -20.; else if(strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)Min = 1.; else if(strcmp(variable.c_str(), "B_plus_FD_OWNPV") == 0)Max = 150.; else if(strcmp(variable.c_str(), (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT")) == 0)Max = 40000.; else if(strcmp(variable.c_str(), "B_plus_DOCA1") == 0)Max = 1000.; else if(strcmp(variable.c_str(), "B_plus_IP_OWNPV") == 0)Max = 0.12; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)Max = 1.001; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePT") == 0)Max = 40000.; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePasym") == 0)Max = 1.001; else if(strcmp(variable.c_str(), "B_plus_NEW_ConeP") == 0)Max = 60000.; else if(strcmp(variable.c_str(), UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" ) == 0)Max = 5.; //K* else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0){ Min = -5.; Max = 10.; } else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT")) == 0)Max = 20000.; else if(strcmp(variable.c_str(), UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA" ) == 0)Max = 5.; //Ks0 else if(strcmp(variable.c_str(), (UseDTF ? "K_short_PT_DTF" : "K_short_PT")) == 0)Max = 10000.; else if(strcmp(variable.c_str(), "K_short_FD_OWNPV") == 0 && SplitDDandLL && !KshortDecayInVelo)Max = 2500.; else if(strcmp(variable.c_str(), "K_short_FD_OWNPV") == 0 && SplitDDandLL && KshortDecayInVelo)Max = 700.; //pi+- from Ks0 else if(strcmp(variable.c_str(), (UseDTF ? "Ks_pi_minus_PT_DTF" : "Ks_pi_minus_PT")) == 0)Max = 10000.; else if(strcmp(variable.c_str(), (UseDTF ? "Ks_pi_plus_PT_DTF" : "Ks_pi_plus_PT")) == 0)Max = 10000.; //pi+ else if(strcmp(variable.c_str(), (UseDTF ? "pi_plus_PT_DTF" : "pi_plus_PT")) == 0)Max = 12000.; else if(strcmp(variable.c_str(), (UseDTF ? "pi_plus_ETA_DTF" : "pi_plus_ETA")) == 0)Max = 5.; else if(strcmp(variable.c_str(), "nLongTracks") == 0)Max = 110; } else{//Kplus pi0 channels if (Kst2Kpluspi0Merged){ //B+ if (strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)Min = -20.; else if (strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)Min = 1.; else if (strcmp(variable.c_str(), "B_plus_FD_OWNPV") == 0)Max = 200.; else if (strcmp(variable.c_str(), (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT")) == 0)Max = 60000.; else if (strcmp(variable.c_str(), "B_plus_DOCA1") == 0)Max = 1000.; else if (strcmp(variable.c_str(), "B_plus_IP_OWNPV") == 0)Max = 0.12; else if (strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)Max = 1.001; else if(strcmp(variable.c_str(), UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" ) == 0)Max = 5.; //K* else if (strcmp(variable.c_str(), (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT_")) == 0)Max = 30000.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)Max = 60.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)Min = -10.; else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA") ) == 0)Max = 5.; //K+ else if (strcmp(variable.c_str(), "K_plus_IPCHI2_OWNPV") == 0)Max = 40000.; else if (strcmp(variable.c_str(), "K_plus_IPCHI2_OWNPV") == 0)Min = -5.; else if (strcmp(variable.c_str(), (UseDTF ? "K_plus_PT_DTF" : "K_plus_PT")) == 0)Max = 20000.; else if (strcmp(variable.c_str(), (UseDTF ? "K_plus_ETA_DTF" : "K_plus_ETA")) == 0)Max = 5.; //pi0 else if (strcmp(variable.c_str(), "pi_zero_merged_ETA") == 0)Min = 1.; else if (strcmp(variable.c_str(), (UseDTF ? "pi_zero_merged_ETA_DTF" : "pi_zero_merged_ETA")) == 0)Max = 5.; } else if (Kst2Kpluspi0Resolved){ //B+ if (strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)Min = -20.; else if (strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)Min = 1.; else if (strcmp(variable.c_str(), "B_plus_FD_OWNPV") == 0)Max = 200.; else if (!bLogVar && strcmp(variable.c_str(), (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT")) == 0)Max = 60000.; else if (strcmp(variable.c_str(), "B_plus_DOCA1") == 0)Max = 1000.; else if (strcmp(variable.c_str(), "B_plus_IP_OWNPV") == 0)Max = 0.12; else if (strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)Max = 1.001; else if (strcmp(variable.c_str(), (UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" )) == 0)Max = 5.; //K* else if (strcmp(variable.c_str(), (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT")) == 0)Max = 30000.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)Max = 60.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)Min = -60.; else if (strcmp(variable.c_str(), UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA" ) == 0)Max = 5.; //K+ else if (strcmp(variable.c_str(), "K_plus_IPCHI2_OWNPV") == 0)Max = 40000.; else if (strcmp(variable.c_str(), "K_plus_IPCHI2_OWNPV") == 0)Min = 0.; else if (!bLogVar && strcmp(variable.c_str(), (UseDTF ? "K_plus_PT_DTF" : "K_plus_PT")) == 0)Max = 20000.; else if (strcmp(variable.c_str(), (UseDTF ? "K_plus_ETA_DTF" : "K_plus_ETA")) == 0)Max = 5.; //pi0 else if (strcmp(variable.c_str(), (UseDTF ? "pi_zero_resolved_ETA_DTF" : "pi_zero_resolved_ETA")) == 0)Max = 5.; //gamma PT else if (strcmp(variable.c_str(), (UseDTF ? "gamma1_PT_DTF" : "gamma1_PT")) == 0) Max = 8.; else if (strcmp(variable.c_str(), (UseDTF ? "gamma2_PT_DTF" : "gamma2_PT")) == 0) Max = 8.; //mu //else if (strcmp(variable.c_str(), "mu_minus_IPCHI2_OWNPV") == 0){ Min = 0.; Max = 20.; } //else if (strcmp(variable.c_str(), "mu_plus_IPCHI2_OWNPV") == 0){ Min = 0.; Max = 20.; } if (useTwoVars){ if (operation == "abs" && variable=="pi_zero_resolved_ETA_DTF") Max = 1.5; } } } //create new histograms to fill data from tree by looping over tree //same number of bins and same range to be able to divide the histograms! hist0varData = new TH1D("hist0varData", Form("%s from data", histName.c_str()), nBins, Min, Max); hist0varMC = new TH1D("hist0varMC", Form("%s from MC", histName.c_str()), nBins, Min, Max); std::cout << "Created hist0varData bins: " << nBins << " from " << Min << " to " << Max << std::endl; std::cout << "Created hist0varMC bins: " << nBins << " from " << Min << " to " << Max << std::endl; //default type of variables is double, if variable is integer, add name to list in line 71 double dVariable = 100., dVariable2 = 100.; int iVariable = 100, iVariable2 = 100; double dSWeights = 1., MCWeights = 1.; double Q2 = 0.; double mu_minus_PT = 0.; double mu_minus_PT_MC = 0.; int B_plus_ID = 0; int B_plus_ID_MC = 0; double dVariable_oppCharge = 100.; int iVariable_oppCharge = 100; int TM = false; int TM_gammas = false; std::string variable_charge = variable; bool varIsMu = false; bool varIsKsPi = false; if (separateCharge){ if (variable.find("mu") != std::string::npos){ if (!replace(variable_charge, "plus","minus")){ replace(variable_charge, "minus","plus"); plusCharge = false; } else plusCharge = true; varIsMu = true; } if (variable.find("Ks_pi") != std::string::npos){ if (!replace(variable_charge, "plus","minus")){ replace(variable_charge, "minus","plus"); plusCharge = false; } else plusCharge = true; varIsKsPi = true; } //add a string variable_charge with mu_oppCharge_XY } //deactivate all branches exept the one/two of interest! treeData->SetBranchStatus("*",0); treeData->SetBranchStatus("mu_minus_PT",1); treeData->SetBranchStatus(variable.c_str(),1); if (useTwoVars)treeData->SetBranchStatus(variable2.c_str(),1); if (sWeight) treeData->SetBranchStatus("N_Bplus_sw",1); if (separateCharge){ treeData->SetBranchStatus("B_plus_ID",1); } treeMC->SetBranchStatus("*",0); treeMC->SetBranchStatus("Q2",1); treeMC->SetBranchStatus("mu_minus_PT",1); treeMC->SetBranchStatus(variable.c_str(),1); treeMC->SetBranchStatus("TMed",1); treeMC->SetBranchStatus("TM_gammas",1); if (useTwoVars)treeMC->SetBranchStatus(variable2.c_str(),1); if (separateCharge){ treeMC->SetBranchStatus("B_plus_ID",1); } if(bWeighted) treeMC ->SetBranchStatus(Form("weight_%s", weightBranch.c_str()),1); else if(b2Dweighted)treeMC ->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); //Data std::cout << "Loading " << treeData->GetEntries() << " data events!" << std::endl; if(varIsInt)treeData -> SetBranchAddress( variable.c_str() , &iVariable ); else treeData -> SetBranchAddress( variable.c_str() , &dVariable ); if (useTwoVars){ if(varIsInt2)treeData -> SetBranchAddress( variable2.c_str() , &iVariable2 ); else treeData -> SetBranchAddress( variable2.c_str() , &dVariable2 ); } if (sWeight) treeData -> SetBranchAddress( "N_Bplus_sw" , &dSWeights ); if(CutInMuPt) treeData -> SetBranchAddress( "mu_minus_PT" , &mu_minus_PT ); if (separateCharge){ //TODO treeData -> SetBranchAddress( "B_plus_ID" , &B_plus_ID ); if (varIsMu || varIsKsPi){ //load muplus/muminus branch too treeData->SetBranchStatus(variable_charge.c_str(),1); if(varIsInt2) treeData->SetBranchAddress(variable_charge.c_str(), &iVariable_oppCharge); else treeData->SetBranchAddress(variable_charge.c_str(), &dVariable_oppCharge); } } for(int i = 0; i < treeData->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading data event " << i << " / " << treeData->GetEntries() << std::endl; treeData->GetEntry(i); if(CutInMuPt){ if(mu_minus_PT > maxPT || mu_minus_PT < minPT){ continue; } } if (separateCharge){ //doesn't work for two variables!!! if (varIsMu || varIsKsPi){ if (plusCharge && B_plus_ID == -521){ if(varIsInt) hist0varData->Fill( evalOperation(useTwoVars, iVariable_oppCharge,iVariable2,operation,bLogVar,bLog1minusVar), dSWeights); else hist0varData->Fill( evalOperation(useTwoVars,dVariable_oppCharge,dVariable2,operation,bLogVar,bLog1minusVar), dSWeights); continue; } if (!plusCharge && B_plus_ID == 521){ if(varIsInt) hist0varData->Fill( evalOperation(useTwoVars, iVariable_oppCharge,iVariable2,operation,bLogVar,bLog1minusVar), dSWeights); else hist0varData->Fill( evalOperation(useTwoVars,dVariable_oppCharge,dVariable2,operation,bLogVar,bLog1minusVar), dSWeights); continue; } } else { if (plusCharge && B_plus_ID == -521) continue; if (!plusCharge && B_plus_ID == 521) continue; } } if(varIsInt) hist0varData->Fill( evalOperation(useTwoVars, iVariable,iVariable2,operation,bLogVar,bLog1minusVar), dSWeights); else hist0varData->Fill( evalOperation(useTwoVars,dVariable,dVariable2,operation,bLogVar,bLog1minusVar), dSWeights); } if (!sWeight) hist0varData->Sumw2(); //TODO: check if(hist0varData->GetEntries() == 0){ std::cout << "No DATA events found" << std::endl; return 0; } if(hist0varData->Integral() == 0){ std::cout << "No DATA events included in the pre-defined range!" << std::endl; return 0; } //MC std::cout << "Loading " << treeMC->GetEntries() << " MC events!" << std::endl; //TODO: is it smart to "re-set" branch adress to the same variable as in the data case? if(varIsInt)treeMC -> SetBranchAddress( variable.c_str() , &iVariable ); else treeMC -> SetBranchAddress( variable.c_str() , &dVariable ); if (useTwoVars){ if(varIsInt2)treeMC -> SetBranchAddress( variable2.c_str() , &iVariable2 ); else treeMC -> SetBranchAddress( variable2.c_str() , &dVariable2 ); } if(bWeighted) treeMC -> SetBranchAddress( Form("weight_%s", weightBranch.c_str()) , &MCWeights ); else if(b2Dweighted)treeMC -> SetBranchAddress( Form("weight2D_%s",weightBranch.c_str()) , &MCWeights ); if(CutInQ2) treeMC -> SetBranchAddress( "Q2" , &Q2 ); if(CutInMuPt) treeMC -> SetBranchAddress( "mu_minus_PT" , &mu_minus_PT_MC ); if (separateCharge){ treeMC -> SetBranchAddress( "B_plus_ID" , &B_plus_ID_MC ); if (varIsMu || varIsKsPi){ treeMC->SetBranchStatus(variable_charge.c_str(),1); if(varIsInt2) treeMC->SetBranchAddress(variable_charge.c_str(), &iVariable_oppCharge); else treeMC->SetBranchAddress(variable_charge.c_str(), &dVariable_oppCharge); } } treeMC->SetBranchAddress("TMed",&TM); treeMC->SetBranchAddress("TM_gammas",&TM_gammas); hist0varMC->Sumw2(); for(int i = 0; i < treeMC->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading MC event " << i << " / " << treeMC->GetEntries() << std::endl; treeMC->GetEntry(i); if (!isTM("TMed",TM,false,TM_gammas)) continue; if(CutInQ2){ if(Q2 > maxQ2*1.0e6 || Q2 < minQ2*1.0e6){ continue; } } if(CutInMuPt){ if(mu_minus_PT_MC > maxPT || mu_minus_PT_MC < minPT){ continue; } } if (separateCharge){ //doesn't work for two variables!!! if (varIsMu || varIsKsPi){ if (plusCharge && B_plus_ID_MC == -521){ //TODO if(varIsInt) hist0varMC->Fill( evalOperation(useTwoVars, iVariable_oppCharge,iVariable2,operation,bLogVar,bLog1minusVar), MCWeights); else hist0varMC->Fill( evalOperation(useTwoVars,dVariable_oppCharge,dVariable2,operation,bLogVar,bLog1minusVar), MCWeights); continue; } if (!plusCharge && B_plus_ID_MC == 521){ //TODO if(varIsInt) hist0varMC->Fill( evalOperation(useTwoVars, iVariable_oppCharge,iVariable2,operation,bLogVar,bLog1minusVar), MCWeights); else hist0varMC->Fill( evalOperation(useTwoVars,dVariable_oppCharge,dVariable2,operation,bLogVar,bLog1minusVar), MCWeights); continue; } } else { if (plusCharge && B_plus_ID_MC == -521) continue; if (!plusCharge && B_plus_ID_MC == 521) continue; } } if(varIsInt) hist0varMC->Fill( evalOperation(useTwoVars, iVariable,iVariable2,operation,bLogVar,bLog1minusVar), MCWeights); else hist0varMC->Fill( evalOperation(useTwoVars,dVariable,dVariable2,operation,bLogVar,bLog1minusVar), MCWeights); } if (!bWeighted && !b2Dweighted) hist0varMC->Sumw2(); if(hist0varMC->GetEntries() == 0){ std::cout << "No MC events found" << std::endl; return 0; } if(hist0varMC->Integral() == 0){ std::cout << "No MC events included in the pre-defined range!" << std::endl; return 0; } std::cout << "Loaded all events: Data and MC" << std::endl; std::cout << "DATA: " << hist0varData->GetEntries() << " events with weights in range: " << hist0varData->Integral() << std::endl; std::cout << "MC : " << hist0varMC->GetEntries() << " events with weights in range: " << hist0varMC->Integral() << std::endl; //make ratio: TH1D * hist0varDataClone = (TH1D*) hist0varData->Clone("hist0varDataClone"); TH1D * hist0varMCclone = (TH1D*) hist0varMC->Clone("hist0varMCclone"); TH1D * hist0ratio = (TH1D*) hist0varMC->Clone("hist0ratio"); hist0varDataClone->SetTitle(Form("%i%s%s: data for %s [norm]", year, TheDecay.c_str(), (SplitDDandLL && Kst2Kspiplus ? (KshortDecayInVelo ? " (LL)" : " (DD)") : ""), drawFormula.c_str())); hist0varMCclone ->SetTitle(Form("%i%s%s: MC for %s [norm]", year, TheDecay.c_str(), (SplitDDandLL && Kst2Kspiplus ? (KshortDecayInVelo ? " (LL)" : " (DD)") : ""), drawFormula.c_str())); hist0ratio ->SetTitle(Form("%i%s%s: ratio MC/data for %s",year, TheDecay.c_str(), (SplitDDandLL && Kst2Kspiplus ? (KshortDecayInVelo ? " (LL)" : " (DD)") : ""), drawFormula.c_str())); //normalize the clones and the ratio histo hist0varDataClone->Scale(1 / hist0varDataClone->Integral()); hist0ratio ->Scale(1 / hist0ratio->Integral()); hist0varMCclone ->Scale(1 / hist0varMCclone->Integral()); hist0ratio->Divide(hist0varDataClone); //set correct ranges for the histograms: double dNormalizedVariableMax = 0. , dRatioMax = 0., dNormalizedVariableMin = 100. , dRatioMin = 100.; for(int bin = 1; bin <= nBins; bin++){ double dDataClone = hist0varDataClone->GetBinContent(bin); double dMCClone = hist0varMCclone->GetBinContent(bin); double dRatio = hist0ratio->GetBinContent(bin); if(dNormalizedVariableMax <= dDataClone)dNormalizedVariableMax = dDataClone; if(dNormalizedVariableMax <= dMCClone) dNormalizedVariableMax = dMCClone; if(dRatioMax <= dRatio) dRatioMax = dRatio; if(dNormalizedVariableMin >= dDataClone)dNormalizedVariableMin = dDataClone; if(dNormalizedVariableMin >= dMCClone) dNormalizedVariableMin = dMCClone; if(dRatioMin >= dRatio) dRatioMin = dRatio; } dNormalizedVariableMax *= 1.1; if(dNormalizedVariableMin < 0)dNormalizedVariableMin *= 1.1; else dNormalizedVariableMin = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(dRatioMax > 3.)dRatioMax = 3.; if(dRatioMax < 2.)dRatioMax = 2.; dRatioMax *= 1.1; std::cout << "[INFO]\t\tAll histograms and ratios created. Proceed with plotting to .eps and .root files!" << std::endl; //configurables for plotting float lowerPlotHeight = 0.6; //create two pads into one canvas TCanvas* c2= new TCanvas("c2", "ratio and superposition"); float textsize = gStyle->GetTextSize(); TPad *pad1 = new TPad("pad1", "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad *pad2 = new TPad("pad2", "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hist0ratio->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hist0ratio->GetXaxis()->SetLabelSize(0.0);//don't print labels hist0ratio->GetXaxis()->SetRangeUser(Min, Max); hist0ratio->GetXaxis()->SetTickLength(hist0ratio->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hist0ratio->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hist0ratio->GetYaxis()->SetTitle("ratio MC/data"); hist0ratio->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hist0ratio->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hist0ratio->GetYaxis()->SetTickLength(hist0ratio->GetYaxis()->GetTickLength()); hist0ratio->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hist0ratio->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); hist0ratio->GetYaxis()->SetRangeUser(0.001, 3); hist0ratio->Draw("E1"); TLine * unityline = new TLine(Min, 1, Max, 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hist0varDataClone->GetXaxis()->SetTitleOffset(1.05); hist0varDataClone->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varDataClone->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varDataClone->GetXaxis()->SetTickLength (hist0ratio->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hist0varDataClone->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hist0varDataClone->GetXaxis()->SetTitle(xaxistitle.c_str()); hist0varDataClone->GetXaxis()->SetRangeUser(Min, Max); hist0varDataClone->GetYaxis()->SetRangeUser(dNormalizedVariableMin, dNormalizedVariableMax); hist0varDataClone->GetYaxis()->SetTitle("weighted events"); hist0varDataClone->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varDataClone->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varDataClone->GetYaxis()->SetTickLength(hist0ratio->GetYaxis()->GetTickLength()); hist0varDataClone->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hist0varDataClone->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hist0varDataClone->Draw("E1"); hist0varMCclone->SetLineColor(2); hist0varMCclone->SetMarkerColor(2); //hist0varMCclone->GetYaxis()->SetTitle("weighted events"); hist0varMCclone->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.4; float LegendYposition = 0.62; if(strcmp(variable.c_str(), "pi_plus_ETA") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "K_short_IPCHI2_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "mu_minus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "mu_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "pi_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "K_short_DIRA_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "K_short_FD_OWNPV") == 0 && SplitDDandLL && !KshortDecayInVelo)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" )) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "K_plus_ETA_DTF" :"K_plus_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "pi_zero_resolved_ETA_DTF" : "pi_zero_resolved_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "pi_zero_merged_ETA_DTF" : "pi_zero_merged_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), (UseDTF ? "gamma2_PT_DTF" : "gamma2_PT")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "gamma1_PT_DTF" : "gamma1_PT")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "gamma2_CL") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "gamma1_CL") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "K_plus_TRACK_CHI2NDOF") == 0)LegendXposition = 0.62; if(strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "B_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "mu_minus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "mu_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" )) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "K_plus_ETA_DTF" :"K_plus_ETA")) == 0)LegendXposition = 0.52; else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)LegendXposition = 0.2; if (variable.find("gamma1_PT") != std::string::npos){ LegendXposition = 0.45; LegendYposition = 0.3; } else if (variable.find("mu_minus_IPCHI2_OWNPV") != std::string::npos){ LegendXposition = 0.45; LegendYposition = 0.3; } else if (variable.find("_CL") != std::string::npos){ LegendXposition = 0.3; } else if (variable.find("K_plus_PT") != std::string::npos){ LegendXposition = 0.62; } else if (variable.find("B_plus_PT") != std::string::npos){ LegendXposition = 0.62; } else if (variable.find("nLongTracks") != std::string::npos){ LegendXposition = 0.62; } if(print_legend){ TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); /* if(bLogVar) leg->SetHeader(Form("Log( %s )", variable.c_str())); else if(bLog1minusVar) leg->SetHeader(Form("Log( 1 - %s )", variable.c_str())); else leg->SetHeader(variable.c_str()); */ leg->AddEntry(hist0varDataClone,sWeight?"sWeighted data":"data", "lpe"); if(b2Dweighted) leg->AddEntry(hist0varMCclone,"2 x 1D reweighted MC", "lpe"); else if(bWeighted)leg->AddEntry(hist0varMCclone,"reweighted MC", "lpe"); else leg->AddEntry(hist0varMCclone,"non-weighted MC", "lpe"); leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "", 1, 1/lowerPlotHeight); } //Further plots, if needed! TCanvas * c3; TCanvas * c4; if (!minimumPlot){ c3 = new TCanvas("c3", "ratio"); c3->Clear(); c3->cd(); hist0ratio->GetYaxis()->SetRangeUser(0, dRatioMax); hist0ratio->GetYaxis()->SetTitle("ratio MC/data [norm.]"); hist0ratio->Draw("E1"); unityline->Draw("SAME"); c4 = new TCanvas("c4", "overlay"); c4->Clear(); c4->cd(); hist0varDataClone->GetYaxis()->SetRangeUser(0, dNormalizedVariableMax); hist0varDataClone->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varDataClone->Draw("E1"); hist0varMCclone->SetLineColor(2); hist0varMCclone->SetMarkerColor(2); hist0varMCclone->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varMCclone->Draw("E1SAME"); } std::string WeightingOptions = ""; if(b2Dweighted)WeightingOptions.append("_2D_weighted"); if(bWeighted)WeightingOptions.append("_weighted"); if(ReferenceChannel)WeightingOptions.append("_Ref"); if(!sWeight)WeightingOptions.append("_nosWeight"); if (CutInQ2)WeightingOptions.append("_cutQ2"+to_string(minQ2)+"_"+to_string(maxQ2)); if (CutInMuPt)WeightingOptions.append("_cutPT"+to_string(minPT)+"_"+to_string(maxPT)); if (separateCharge){ WeightingOptions.append("_actualCharge"); if (plusCharge) WeightingOptions.append("Plus"); else WeightingOptions.append("Minus"); } if(bPrint){ if (Kst2Kpluspi0Merged || Kst2Kpluspi0Resolved){ c2->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data%s_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c2->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data%s.jpg", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); //c2->SaveAs(Form("%s/ComparePlots/%i_%s_%s_MC_data%s.root", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); if (!minimumPlot){ c3->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data_ratio%s_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c3->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data_ratio%s.jpg", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); //c3->SaveAs(Form("%s/ComparePlots/%i_%s_%s_MC_data_ratio%s.root", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); c4->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data_overlay%s_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c4->Print(Form("%s/ComparePlots/%i_%s_%s_MC_data_overlay%s.jpg", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); //c4->SaveAs(Form("%s/ComparePlots/%i_%s_%s_MC_data_overlay%s.root", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); } } if (Kst2Kspiplus){ c2->Print(Form("%s/ComparePlots/%i_%s%s_%s_MC_data%s_%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c2->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data%s.root", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), varName.c_str(), WeightingOptions.c_str())); if (!minimumPlot){ c3->Print(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_ratio%s_%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c3->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_ratio%s.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); c4->Print(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_overlay%s_%s.eps", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str(),weightBranch.c_str())); //c4->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_overlay%s.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), varName.c_str(), WeightingOptions.c_str())); } } } c2->Close(); if (!minimumPlot){ c3->Close(); c4->Close(); } delete c2; if (!minimumPlot){ delete c3; delete c4; } delete hist0ratio; delete hist0varData; delete hist0varDataClone; delete hist0varMC; delete hist0varMCclone; delete treeData; delete treeMC; std::cout << "[INFO]\t\tAll done with variable: " << varName << std::endl; return 1; } int compareVariablesKplusKshort(int year = 2011, std::string variable = "B_plus_PT", bool sWeightKplus = false,bool sWeightKshort = true, bool bWeighted = true, bool b2Dweighted = true, bool bLogVar = false, bool bLog1minusVar = false, bool bPrint = true, bool KshortDecayInVelo = true, std::string weightBranch = firstMCweight ) { //if 2D weighted, set boolean for 1D weighting false if(b2Dweighted)bWeighted = false; gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); //lhcbStyle->SetOptTitle(1); //lhcbStyle->SetTitleSize(0.1,"x"); //lhcbStyle->SetTitleSize(0.1,"y"); //lhcbStyle->SetTitleSize(0.1,"z"); ///by default all variables are assumed to be doubles. If variable is an integer, add to the following list: bool varIsInt = false; if(variable == "nTracks") varIsInt = true; if(variable == "nSPDHits") varIsInt = true; if(variable == "nLongTracks") varIsInt = true; if(variable == "nVeloTracks") varIsInt = true; if(variable == "nTTracks") varIsInt = true; if(variable == "nDownstreamTracks") varIsInt = true; if(variable == "nUpstreamTracks") varIsInt = true; ///for now hardcoded, but might be possible to include in input parameters if comparison between data and reference MC is needed const bool ReferenceChannel = false; ///for writting only the ratio and superposition const bool minimumPlot = true; if(bLogVar && bLog1minusVar){ coutERROR("Only Log( var ) or Log( 1 - var ) option possible, but both flags were set for variable: " + variable); return 0; } //put both magnet polarities into one TChain TChain * treeDataKplus = new TChain("DecayTree"); TChain * treeMCKplus = new TChain("DecayTreeTruthMatched"); TChain * treeDataKshort = new TChain("DecayTree"); TChain * treeMCKshort = new TChain("DecayTreeTruthMatched"); // Kst2Kpluspi0Resolved c if(ReferenceChannel){ treeDataKplus->Add(Form("%s/data/%i_KplusPi0Resolved_BDTinputRef.root", path_to_output_KplusPizero.c_str(), year)); treeMCKplus->Add(Form("%s/data/MC/%i_RefKplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); } else{ treeDataKplus->Add(Form("%s/data/%i_KplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMCKplus->Add(Form("%s/data/MC/%i_KplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); } // Kst2Kspiplus if(ReferenceChannel){ treeDataKshort->Add(Form("%s/data/%i_KshortPiplus_BDTinputRef.root", path_to_output_KshortPiplus.c_str(), year)); treeMCKshort->Add(Form("%s/data/MC/%i_RefKshortPiplusRef_BDTinput.root", path_to_output_KshortPiplus.c_str(), year)); } else{ treeDataKshort->Add(Form("%s/data/%i_KshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (KshortDecayInVelo ? "_LL" : "_DD" ))); treeMCKshort->Add(Form("%s/data/MC/%i_KshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (KshortDecayInVelo ? "_LL" : "_DD"))); } std::string histNameKplus = Form("%i%s%s", year,"",variable.c_str()); std::string histNameKshort = Form("%i%s%s", year,((KshortDecayInVelo ? "LL" : "DD")),variable.c_str()); //DataKplus: create histograms from trees if(bLogVar) treeDataKplus->Draw(Form("TMath::Log( %s )>>%sDataKplus", variable.c_str(),histNameKplus.c_str()), ""); else if(bLog1minusVar) treeDataKplus->Draw(Form("TMath::Log(1 - %s)>>%sDataKplus",variable.c_str(),histNameKplus.c_str()), ""); else treeDataKplus->Draw(Form("%s>>%sDataKplus", variable.c_str(),histNameKplus.c_str()), ""); TH1 * hist0varDataKplus = (TH1*)gDirectory->Get(Form("%sDataKplus", histNameKplus.c_str())); //DataKshort: initialize histograms into objects if(bLogVar) treeDataKshort->Draw(Form("TMath::Log( %s )>>%sDataKshort", variable.c_str(),histNameKshort.c_str()), ""); else if(bLog1minusVar) treeDataKshort->Draw(Form("TMath::Log(1 - %s)>>%sDataKshort",variable.c_str(),histNameKshort.c_str()), ""); else treeDataKshort->Draw(Form("%s>>%sDataKshort", variable.c_str(),histNameKshort.c_str()), ""); TH1 * hist0varDataKshort = (TH1*)gDirectory->Get(Form("%sDataKshort",histNameKshort.c_str())); //MCKplus: create histograms from trees if(bLogVar) treeMCKshort ->Draw(Form("TMath::Log( %s )>>%sMCKplus", variable.c_str(),histNameKshort.c_str()), ""); else if(bLog1minusVar) treeMCKshort ->Draw(Form("TMath::Log(1 - %s)>>%sMCKplus", variable.c_str(),histNameKshort.c_str()), ""); else treeMCKshort ->Draw(Form("%s>>%sMCKplus", variable.c_str(),histNameKshort.c_str()), ""); TH1D * hist0varMCKplus = (TH1D*)gDirectory->Get(Form("%sMCKplus",histNameKshort.c_str())); //MCKshort: create histograms from trees if(bLogVar) treeMCKshort ->Draw(Form("TMath::Log( %s )>>%sMCKshort", variable.c_str(),histNameKshort.c_str()), ""); else if(bLog1minusVar) treeMCKshort ->Draw(Form("TMath::Log(1 - %s)>>%sMCKshort", variable.c_str(),histNameKshort.c_str()), ""); else treeMCKshort ->Draw(Form("%s>>%sMCKshort", variable.c_str(),histNameKshort.c_str()), ""); TH1D * hist0varMCKshort = (TH1D*)gDirectory->Get(Form("%sMCKshort",histNameKshort.c_str())); //Get min and max of x-range from both histograms: int nBinsData, nBinsMC; double BinContentData, BinContentMC; int nBinMinData, nBinMaxData; int nBinMinMC, nBinMaxMC; float MinData, MaxData; float MinMC, MaxMC; if(variable == "nTracks" || variable == "nSPDHits"){ nBinsData = 60; nBinsMC = 60; MinData = -0.5; MinMC = -0.5; MaxData = 599.5; MaxMC = 599.5; } else if(variable == "nLongTracks" || variable == "nVeloTracks" || variable == "nTTracks" || variable == "nBackTracks"|| variable == "nMuonTracks"){ nBinsData = 50; nBinsMC = 50; MinData = -0.5; MinMC = -0.5; MaxData = 149.5; MaxMC = 149.5; } else if(variable == "nDownstreamTracks" || variable == "nUpstreamTracks"){ nBinsData = 50; nBinsMC = 50; MinData = -0.5; MinMC = -0.5; MaxData = 49.5; MaxMC = 49.5; } else { //get number of bins of both histograms and select larger number for new histogram int nBinsDataKplus = hist0varDataKplus ->GetXaxis()->GetNbins(); int nBinsDataKshort = hist0varDataKshort ->GetXaxis()->GetNbins(); int nBinsMCKplus = hist0varMCKplus ->GetXaxis()->GetNbins(); int nBinsMCKshort = hist0varMCKshort ->GetXaxis()->GetNbins(); if(nBinsDataKplus >= nBinsDataKshort) nBinsData = nBinsDataKplus; else nBinsData = nBinsDataKshort; if(nBinsMCKplus >= nBinsMCKshort) nBinsMC = nBinsMCKplus; else nBinsMC = nBinsMCKshort; //DATA //Kplus nBinMinData = 0; BinContentData = 0; while(BinContentData == 0){ nBinMinData++; BinContentData = hist0varDataKplus->GetBinContent(nBinMinData); } float MinDataKplus = hist0varDataKplus->GetXaxis()->GetBinLowEdge(nBinMinData); nBinMaxData = nBinsData + 1; BinContentData = 0; while(BinContentData == 0){ nBinMaxData--; BinContentData = hist0varDataKplus->GetBinContent(nBinMaxData); } float MaxDataKplus = hist0varDataKplus->GetXaxis()->GetBinUpEdge(nBinMaxData); //Kshort nBinMinData = 0; BinContentData = 0; while(BinContentData == 0){ nBinMinData++; BinContentData = hist0varDataKshort->GetBinContent(nBinMinData); } float MinDataKshort = hist0varDataKshort->GetXaxis()->GetBinLowEdge(nBinMinData); nBinMaxData = nBinsData + 1; BinContentData = 0; while(BinContentData == 0){ nBinMaxData--; BinContentData = hist0varDataKshort->GetBinContent(nBinMaxData); } float MaxDataKshort = hist0varDataKshort->GetXaxis()->GetBinUpEdge(nBinMaxData); //MC //Kplus nBinMinMC = 0; BinContentMC = 0; while(BinContentMC == 0){ nBinMinMC++; BinContentMC = hist0varMCKplus->GetBinContent(nBinMinMC); } float MinMCKplus = hist0varMCKplus->GetXaxis()->GetBinLowEdge(nBinMinMC); nBinMaxMC = nBinsMC + 1; BinContentMC = 0; while(BinContentMC == 0){ nBinMaxMC--; BinContentMC = hist0varMCKplus->GetBinContent(nBinMaxMC); } float MaxMCKplus = hist0varMCKplus->GetXaxis()->GetBinUpEdge(nBinMaxMC); //Kshort nBinMinMC = 0; BinContentMC = 0; while(BinContentMC == 0){ nBinMinMC++; BinContentMC = hist0varMCKshort->GetBinContent(nBinMinMC); } float MinMCKshort = hist0varMCKshort->GetXaxis()->GetBinLowEdge(nBinMinMC); nBinMaxMC = nBinsMC + 1; BinContentMC = 0; while(BinContentMC == 0){ nBinMaxMC--; BinContentMC = hist0varMCKshort->GetBinContent(nBinMaxMC); } float MaxMCKshort = hist0varMCKshort->GetXaxis()->GetBinUpEdge(nBinMaxMC); std::cout << "Found hist0varDataKplus bins: " << nBinsData << " from " << MinDataKplus << " to " << MaxDataKplus << std::endl; std::cout << "Found hist0varDataKshort bins: " << nBinsData << " from " << MinDataKshort << " to " << MaxDataKshort << std::endl; std::cout << "Found hist0varMCKplus bins: " << nBinsMC << " from " << MinMCKplus << " to " << MaxMCKplus << std::endl; std::cout << "Found hist0varMCKshort bins: " << nBinsMC << " from " << MinMCKshort << " to " << MaxMCKshort << std::endl; if(MinDataKplus <= MinDataKshort)MinData = MinDataKplus ; else MinData = MinDataKshort; if(MaxDataKplus >= MaxDataKshort)MaxData = MaxDataKplus ; else MaxData = MaxDataKshort; if(MinMCKplus <= MinMCKshort)MinMC = MinMCKplus ; else MinMC = MinMCKshort; if(MaxMCKplus >= MaxMCKshort)MaxMC = MaxMCKplus ; else MaxMC = MaxMCKshort; nBinsData/=2; nBinsMC/=2; } //default axis lable is the variable name: std::string xaxistitle = variable; //Load the MVA config from the txt file MVA_variables vars(""); //rename xAxis for nTracks if(strcmp(variable.c_str(), "nTracks") == 0){ xaxistitle = "Track Multiplicity"; std::cout << "[INFO]\tUsing Axis Label: " << xaxistitle << std::endl; } //use MVA loader to get nicely formated variable name and units //manual intervention for ranges on X-axis //B+ if(strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)MinData = -20.; else if(strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)MinData = 1.; else if(strcmp(variable.c_str(), "B_plus_FD_OWNPV") == 0)MaxData = 200.; else if(strcmp(variable.c_str(), (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT")) == 0)MaxData = 60000.; else if(strcmp(variable.c_str(), "B_plus_DOCA1") == 0)MaxData = 1000.; else if(strcmp(variable.c_str(), "B_plus_IP_OWNPV") == 0)MaxData = 0.12; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)MaxData = 1.; else if(strcmp(variable.c_str(), UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" ) == 0)MaxData = 5.; //K* else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)MinData = -7.; else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)MaxData = 60.; else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT")) == 0)MaxData = 20000.; else if(strcmp(variable.c_str(), UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA" ) == 0)MaxData = 5.; //B+ if (strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)MinMC = -20.; else if (strcmp(variable.c_str(), "B_plus_OWNPV_CHI2") == 0)MinMC = 1.; else if (strcmp(variable.c_str(), "B_plus_FD_OWNPV") == 0)MaxMC = 200.; else if (strcmp(variable.c_str(), (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT")) == 0)MaxMC = 60000.; else if (strcmp(variable.c_str(), "B_plus_DOCA1") == 0)MaxMC = 1000.; else if (strcmp(variable.c_str(), "B_plus_IP_OWNPV") == 0)MaxMC = 0.12; else if (strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)MaxMC = 1.; else if (strcmp(variable.c_str(), (UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" )) == 0)MaxMC = 5.; //K* else if (strcmp(variable.c_str(), (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT")) == 0)MaxMC = 30000.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)MaxMC = 60.; else if (strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)MinMC = -60.; else if (strcmp(variable.c_str(), UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA" ) == 0)MaxMC = 5.; //create new histograms to fill data from tree by looping over tree //same number of bins and same range to be able to divide the histograms! hist0varDataKplus = new TH1D("hist0varDataKplus ",Form("Kplus %s from data", variable.c_str()), nBinsData, MinData, MaxData); hist0varDataKshort = new TH1D("hist0varDataKshort",Form("Kshort %s from data", variable.c_str()), nBinsData, MinData, MaxData); hist0varMCKplus = new TH1D("hist0varMCKplus ", Form("Kplus %s from MC", variable.c_str()), nBinsMC, MinMC, MaxMC); hist0varMCKshort = new TH1D("hist0varMCKshort", Form("Kshort %s from MC", variable.c_str()), nBinsMC, MinMC, MaxMC); std::cout << "Created hist0varDataKplus bins: " << nBinsData << " from " << MinData << " to " << MaxData << std::endl; std::cout << "Created hist0varDataKshort bins: " << nBinsData << " from " << MinData << " to " << MaxData << std::endl; std::cout << "Created hist0varMCKplus bins: " << nBinsMC << " from " << MinMC << " to " << MaxMC << std::endl; std::cout << "Created hist0varMCKshort bins: " << nBinsMC << " from " << MinMC << " to " << MaxMC << std::endl; //default type of variables is double, if variable is integer, add name to list in line 71 double dVariableKplusData; double dVariableKplusMC; int iVariableKplusData; int iVariableKplusMC; double dSWeightsKplus = 1., MCWeightsKplus = 1.; double dVariableKshortData; double dVariableKshortMC; int iVariableKshortData; int iVariableKshortMC; double dSWeightsKshort = 1., MCWeightsKshort = 1.; //deactivate all branches exept the one of intrest! treeDataKplus->SetBranchStatus("*",0); treeDataKplus->SetBranchStatus(variable.c_str(),1); if (sWeightKplus) treeDataKplus->SetBranchStatus("N_Bplus_sw",1); treeDataKshort->SetBranchStatus("*",0); treeDataKshort->SetBranchStatus(variable.c_str(),1); if (sWeightKshort) treeDataKshort->SetBranchStatus("N_Bplus_sw",1); treeMCKplus ->SetBranchStatus("*",0); treeMCKplus ->SetBranchStatus(variable.c_str(),1); if(bWeighted) treeMCKplus ->SetBranchStatus(Form("weight_%s", weightBranch.c_str()),1); else if(b2Dweighted)treeMCKplus ->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); treeMCKshort ->SetBranchStatus("*",0); treeMCKshort ->SetBranchStatus(variable.c_str(),1); if(bWeighted) treeMCKshort ->SetBranchStatus(Form("weight_%s", weightBranch.c_str()),1); else if(b2Dweighted)treeMCKshort ->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); //Data Kplus std::cout << "Loading " << treeDataKplus->GetEntries() << " data events!" << std::endl; if(varIsInt)treeDataKplus -> SetBranchAddress( variable.c_str() , &iVariableKplusData); else treeDataKplus-> SetBranchAddress( variable.c_str() , &dVariableKplusData ); if (sWeightKplus) treeDataKplus -> SetBranchAddress( "N_Bplus_sw" , &dSWeightsKplus ); for(int i = 0; i < treeDataKplus->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading data Kplus event " << i << " / " << treeDataKplus->GetEntries() << std::endl; treeDataKplus->GetEntry(i); if(varIsInt){ if(bLogVar) iVariableKplusData = TMath::Log(iVariableKplusData); else if(bLog1minusVar) iVariableKplusData = TMath::Log(1-iVariableKplusData); hist0varDataKplus->Fill(iVariableKplusData, dSWeightsKplus); } else{ if(bLogVar) dVariableKplusData = TMath::Log(dVariableKplusData); else if(bLog1minusVar) dVariableKplusData = TMath::Log(1-dVariableKplusData); hist0varDataKplus->Fill(dVariableKplusData, dSWeightsKplus); } } if (!sWeightKplus) hist0varDataKplus->Sumw2(); //Data Kshort std::cout << "Loading " << treeDataKshort->GetEntries() << " data Kshort events!" << std::endl; if(varIsInt)treeDataKshort -> SetBranchAddress( variable.c_str() , &iVariableKshortData ); else treeDataKshort-> SetBranchAddress( variable.c_str() , &dVariableKshortData ); if (sWeightKshort) treeDataKshort -> SetBranchAddress( "N_Bplus_sw" , &dSWeightsKshort ); for(int i = 0; i < treeDataKshort->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading data Kshort event " << i << " / " << treeDataKshort->GetEntries() << std::endl; treeDataKshort->GetEntry(i); if(varIsInt){ if(bLogVar) iVariableKshortData = TMath::Log(iVariableKshortData); else if(bLog1minusVar) iVariableKshortData = TMath::Log(1-iVariableKshortData); hist0varDataKshort->Fill(iVariableKshortData, dSWeightsKshort); } else{ if(bLogVar) dVariableKshortData = TMath::Log(dVariableKshortData); else if(bLog1minusVar) dVariableKshortData = TMath::Log(1-dVariableKshortData); hist0varDataKshort->Fill(dVariableKshortData, dSWeightsKshort); } } if (!sWeightKshort) hist0varDataKshort->Sumw2(); //MC Kplus std::cout << "Loading " << treeMCKplus->GetEntries() << " MC Kplus events!" << std::endl; if(varIsInt)treeMCKplus -> SetBranchAddress( variable.c_str() , &iVariableKplusMC ); else treeMCKplus -> SetBranchAddress( variable.c_str() , &dVariableKplusMC ); if(bWeighted) treeMCKplus -> SetBranchAddress( Form("weight_%s", weightBranch.c_str()), &MCWeightsKplus ); else if(b2Dweighted)treeMCKplus -> SetBranchAddress( Form("weight2D_%s", weightBranch.c_str()), &MCWeightsKplus ); else hist0varMCKplus->Sumw2(); for(int i = 0; i < treeMCKplus->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading MC Kplus event " << i << " / " << treeMCKplus->GetEntries() << std::endl; treeMCKplus->GetEntry(i); if(varIsInt){ if(bLogVar) iVariableKplusMC = TMath::Log(iVariableKplusMC); else if(bLog1minusVar) iVariableKplusMC = TMath::Log(1-iVariableKplusMC); hist0varMCKplus->Fill(iVariableKplusMC, MCWeightsKplus); } else{ if(bLogVar) dVariableKplusMC = TMath::Log(dVariableKplusMC); else if(bLog1minusVar) dVariableKplusMC = TMath::Log(1-dVariableKplusMC); hist0varMCKplus->Fill(dVariableKplusMC, MCWeightsKplus); } } //MC Kshort std::cout << "Loading " << treeMCKshort->GetEntries() << " MC Kshort events!" << std::endl; if(varIsInt)treeMCKshort -> SetBranchAddress( variable.c_str() , &iVariableKshortMC ); else treeMCKshort -> SetBranchAddress( variable.c_str() , &dVariableKshortMC ); if(bWeighted) treeMCKplus -> SetBranchAddress( Form("weight_%s", weightBranch.c_str()), &MCWeightsKshort ); else if(b2Dweighted)treeMCKplus -> SetBranchAddress( Form("weight2D_%s", weightBranch.c_str()), &MCWeightsKshort ); else hist0varMCKshort->Sumw2(); for(int i = 0; i < treeMCKshort->GetEntries(); i++){ if(i%10000==0 && i != 0)std::cout << "Loading MC Kshort event " << i << " / " << treeMCKshort->GetEntries() << std::endl; treeMCKshort->GetEntry(i); if(varIsInt){ if(bLogVar) iVariableKshortMC = TMath::Log(iVariableKshortMC); else if(bLog1minusVar) iVariableKshortMC = TMath::Log(1-iVariableKshortMC); hist0varMCKshort->Fill(iVariableKshortMC, MCWeightsKshort); } else{ if(bLogVar) dVariableKshortMC = TMath::Log(dVariableKshortMC); else if(bLog1minusVar) dVariableKshortMC = TMath::Log(1-dVariableKshortMC); hist0varMCKshort->Fill(dVariableKshortMC, MCWeightsKshort); } } //make ratio: TH1D * hist0varDataCloneKplus = (TH1D*) hist0varDataKplus ->Clone("hist0varDataCloneKplus "); TH1D * hist0varDataCloneKshort = (TH1D*) hist0varDataKshort->Clone("hist0varDataCloneKshort"); TH1D * hist0varMCcloneKplus = (TH1D*) hist0varMCKplus ->Clone("hist0varMCcloneKplus "); TH1D * hist0varMCcloneKshort = (TH1D*) hist0varMCKshort->Clone("hist0varMCcloneKshort"); TH1D * hist0ratioData = (TH1D*) hist0varDataKplus ->Clone("hist0ratioData"); TH1D * hist0ratioMC = (TH1D*) hist0varMCKplus ->Clone("hist0ratioMC"); //Kplus if(bLogVar){ hist0varDataCloneKplus ->SetTitle(Form("%i%s%s: data Kplus for Log(%s) [norm]", year, TheDecay.c_str(), "", variable.c_str())); hist0varMCcloneKplus ->SetTitle(Form("%i%s%s: MC Kplus for Log(%s) [norm]", year, TheDecay.c_str(), "", variable.c_str())); hist0ratioData ->SetTitle(Form("%i%s%s: ratio data Kplus/Kshort for Log(%s)", year, TheDecay.c_str(), KshortDecayInVelo ? " (LL)" : " (DD)", variable.c_str())); } else if(bLog1minusVar){ hist0varDataCloneKplus ->SetTitle(Form("%i%s%s: data Kplus for Log(1 - %s) [norm]", year, TheDecay.c_str(), (""), variable.c_str())); hist0varMCcloneKplus ->SetTitle(Form("%i%s%s: MC Kplus for Log(1 - %s) [norm]", year, TheDecay.c_str(), (""), variable.c_str())); hist0ratioData->SetTitle(Form("%i%s%s: ratio data Kplus/Kshort for Log(1 - %s)", year, TheDecay.c_str(), (KshortDecayInVelo ? " (LL)" : " (DD)"), variable.c_str())); } else{ hist0varDataCloneKplus ->SetTitle(Form("%i%s%s: data Kplus for %s [norm]", year, TheDecay.c_str(), (""), variable.c_str())); hist0varMCcloneKplus ->SetTitle(Form("%i%s%s: MC Kplus for %s [norm]", year, TheDecay.c_str(), (""), variable.c_str())); hist0ratioData->SetTitle(Form("%i%s%s: ratio data Kplus/Kshort for %s", year, TheDecay.c_str(), (KshortDecayInVelo ? " (LL)" : " (DD)"), variable.c_str())); } //Kshort if(bLogVar){ hist0varDataCloneKshort->SetTitle(Form("%i%s%s: data Kshort for Log(%s) [norm]", year, TheDecay.c_str(), ((KshortDecayInVelo ? " (LL)" : " (DD)") ), variable.c_str())); hist0varMCcloneKshort->SetTitle(Form("%i%s%s: MC Kshort for Log(%s) [norm]", year, TheDecay.c_str(), ( (KshortDecayInVelo ? " (LL)" : " (DD)")), variable.c_str())); hist0ratioMC->SetTitle(Form("%i%s%s: ratio MC/data for Log(%s)", year, TheDecay.c_str(), ((KshortDecayInVelo ? " (LL)" : " (DD)") ), variable.c_str())); } else if(bLog1minusVar){ hist0varDataCloneKshort->SetTitle(Form("%i%s%s: data Kshort for Log(1 - %s) [norm]", year, TheDecay.c_str(), ( (KshortDecayInVelo ? " (LL)" : " (DD)") ), variable.c_str())); hist0varMCcloneKshort->SetTitle(Form("%i%s%s: MC Kshort for Log(1 - %s) [norm]", year, TheDecay.c_str(), ((KshortDecayInVelo ? " (LL)" : " (DD)") ), variable.c_str())); hist0ratioMC->SetTitle(Form("%i%s%s: ratio MC Kplus/Kshort for Log(1 - %s)", year, TheDecay.c_str(), ( (KshortDecayInVelo ? " (LL)" : " (DD)") ), variable.c_str())); } else{ hist0varDataCloneKshort->SetTitle(Form("%i%s%s: data Kshort for %s [norm]", year, TheDecay.c_str(), (KshortDecayInVelo ? " (LL)" : " (DD)") , variable.c_str())); hist0varMCcloneKshort->SetTitle(Form("%i%s%s: MC Kshort for %s [norm]", year, TheDecay.c_str(), (KshortDecayInVelo ? " (LL)" : " (DD)") , variable.c_str())); hist0ratioMC->SetTitle(Form("%i%s%s: ratio MC Kplus/Kshort for %s", year, TheDecay.c_str(), (KshortDecayInVelo ? " (LL)" : " (DD)") , variable.c_str())); } /// Sumw2 is already applied, so comment out the following 5 lines! //Sumw2 uncertainties of all histos //hist0varMC->Sumw2(); //hist0varMCclone->Sumw2(); //hist0varData->Sumw2(); //hist0varDataClone->Sumw2(); //hist0ratio->Sumw2(); //normalize the clones and the ratio histo hist0varDataCloneKplus->Scale(1 / hist0varDataCloneKplus->Integral()); hist0varDataCloneKshort->Scale(1 / hist0varDataCloneKshort->Integral()); hist0ratioData ->Scale(1 / hist0ratioData->Integral()); hist0varMCcloneKplus ->Scale(1 / hist0varMCcloneKplus->Integral()); hist0varMCcloneKshort ->Scale(1 / hist0varMCcloneKshort->Integral()); hist0ratioMC ->Scale(1 / hist0ratioMC->Integral()); hist0ratioData->Divide(hist0varDataCloneKshort); hist0ratioMC->Divide(hist0varMCcloneKshort); //set correct ranges for the histograms: //Data double dNormalizedVariableMaxData = 0. , dRatioMaxData = 0., dNormalizedVariableMinData = 100. , dRatioMinData = 100.; for(int bin = 1; bin <= nBinsData; bin++){ double dDataCloneKplus = hist0varDataCloneKplus->GetBinContent(bin); double dDataCloneKshort = hist0varDataCloneKshort->GetBinContent(bin); double dRatioData = hist0ratioData->GetBinContent(bin); if(dNormalizedVariableMaxData <= dDataCloneKplus) dNormalizedVariableMaxData = dDataCloneKplus; //TODO (i nahore, fakt nechapu) if(dNormalizedVariableMaxData <= dDataCloneKshort) dNormalizedVariableMaxData = dDataCloneKshort; if(dRatioMaxData <= dRatioData) dRatioMaxData = dRatioData; if(dNormalizedVariableMinData >= dDataCloneKplus) dNormalizedVariableMinData = dDataCloneKplus; if(dNormalizedVariableMinData >= dDataCloneKshort) dNormalizedVariableMinData = dDataCloneKshort; if(dRatioMinData >= dRatioData) dRatioMinData = dRatioData; } dNormalizedVariableMaxData *= 1.1; if(dNormalizedVariableMinData < 0)dNormalizedVariableMinData *= 1.1; else dNormalizedVariableMinData = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(dRatioMaxData > 3.)dRatioMaxData = 3.; if(dRatioMaxData < 2.)dRatioMaxData = 2.; dRatioMaxData *= 1.1; //set correct ranges for the histograms: //MC double dNormalizedVariableMaxMC = 0. , dRatioMaxMC = 0., dNormalizedVariableMinMC = 100. , dRatioMinMC = 100.; for(int bin = 1; bin <= nBinsMC; bin++){ double dMCcloneKplus = hist0varMCcloneKplus->GetBinContent(bin); double dMCcloneKshort = hist0varMCcloneKshort->GetBinContent(bin); double dRatioMC = hist0ratioMC->GetBinContent(bin); if(dNormalizedVariableMaxMC <= dMCcloneKplus) dNormalizedVariableMaxMC = dMCcloneKplus; if(dNormalizedVariableMaxMC <= dMCcloneKshort) dNormalizedVariableMaxMC = dMCcloneKshort; if(dRatioMaxMC <= dRatioMC) dRatioMaxMC = dRatioMC; if(dNormalizedVariableMinMC >= dMCcloneKplus) dNormalizedVariableMinMC = dMCcloneKplus; if(dNormalizedVariableMinMC >= dMCcloneKshort) dNormalizedVariableMinMC = dMCcloneKshort; if(dRatioMinMC >= dRatioMC) dRatioMinMC = dRatioMC; } dNormalizedVariableMaxMC *= 1.1; if(dNormalizedVariableMinMC < 0)dNormalizedVariableMinMC *= 1.1; else dNormalizedVariableMinMC = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(dRatioMaxMC > 3.)dRatioMaxMC = 3.; if(dRatioMaxMC < 2.)dRatioMaxMC = 2.; dRatioMaxMC *= 1.1; //configurables for plotting float lowerPlotHeight = 0.6; /********************************* ********************************* * * DATA * ********************************* *********************************/ //create two pads into one canvas TCanvas* c2= new TCanvas("c2", "ratio and superposition"); float textsize = gStyle->GetTextSize(); TPad *pad1 = new TPad("pad1", "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad *pad2 = new TPad("pad2", "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hist0ratioData->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hist0ratioData->GetXaxis()->SetLabelSize(0.0);//don't print labels hist0ratioData->GetXaxis()->SetRangeUser(MinData, MaxData); hist0ratioData->GetXaxis()->SetTickLength(hist0ratioData->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hist0ratioData->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hist0ratioData->GetYaxis()->SetTitle("ratio data Kplus/Kshort"); hist0ratioData->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hist0ratioData->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hist0ratioData->GetYaxis()->SetTickLength(hist0ratioData->GetYaxis()->GetTickLength()); hist0ratioData->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hist0ratioData->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); hist0ratioData->GetYaxis()->SetRangeUser(0.001, 3); hist0ratioData->Draw("E1"); TLine * unityline = new TLine(MinData, 1, MaxData, 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hist0varDataCloneKplus->GetXaxis()->SetTitleOffset(1.05); hist0varDataCloneKplus->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varDataCloneKplus->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varDataCloneKplus->GetXaxis()->SetTickLength (hist0ratioData->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hist0varDataCloneKplus->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hist0varDataCloneKplus->GetXaxis()->SetTitle(xaxistitle.c_str()); hist0varDataCloneKplus->GetXaxis()->SetRangeUser(MinData, MaxData); hist0varDataCloneKplus->GetYaxis()->SetRangeUser(dNormalizedVariableMinData, dNormalizedVariableMaxData); hist0varDataCloneKplus->GetYaxis()->SetTitle("weighted events"); hist0varDataCloneKplus->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varDataCloneKplus->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varDataCloneKplus->GetYaxis()->SetTickLength(hist0ratioData->GetYaxis()->GetTickLength()); hist0varDataCloneKplus->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hist0varDataCloneKplus->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hist0varDataCloneKplus->Draw("E1"); hist0varDataCloneKshort->SetLineColor(2); hist0varDataCloneKshort->SetMarkerColor(2); //hist0varMCclone->GetYaxis()->SetTitle("weighted events"); hist0varDataCloneKshort->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.4; float LegendYposition = 0.62; if(strcmp(variable.c_str(), "B_plus_DIRA_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "B_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "K_star_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.2; else if(strcmp(variable.c_str(), "mu_minus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "mu_plus_IPCHI2_OWNPV") == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "B_plus_ETA_DTF" :"B_plus_ETA" )) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), (UseDTF ? "K_plus_ETA_DTF" :"K_plus_ETA")) == 0)LegendXposition = 0.52; else if(strcmp(variable.c_str(), (UseDTF ? "K_star_plus_ETA_DTF" :"K_star_plus_ETA")) == 0)LegendXposition = 0.62; else if(strcmp(variable.c_str(), "B_plus_NEW_ConePTasym") == 0)LegendXposition = 0.2; if (variable.find("gamma1_PT") != std::string::npos){ LegendXposition = 0.5; LegendYposition = 0.7; } else if (variable.find("mu_minus_IPCHI2_OWNPV") != std::string::npos){ LegendXposition = 0.5; LegendYposition = 0.7; } else if (variable.find("_CL") != std::string::npos){ LegendXposition = 0.3; } else if (variable.find("K_plus_PT") != std::string::npos){ LegendXposition = 0.62; } else if (variable.find("B_plus_PT") != std::string::npos){ LegendXposition = 0.62; } TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); /* if(bLogVar) leg->SetHeader(Form("Log( %s )", variable.c_str())); else if(bLog1minusVar) leg->SetHeader(Form("Log( 1 - %s )", variable.c_str())); else leg->SetHeader(variable.c_str()); */ leg->AddEntry(hist0varDataCloneKplus,sWeightKplus? "sWeighted Kplus data" :" Kplus data" , "lpe"); leg->AddEntry(hist0varDataCloneKshort,sWeightKshort?"sWeighted Kshort data":" Kshort data", "lpe"); /* if(b2Dweighted) leg->AddEntry(hist0varDataCloneKshort,"2 x 1D reweighted MC", "lpe"); //TODO else if(bWeighted)leg->AddEntry(hist0varDataCloneKshort,"reweighted MC", "lpe"); else leg->AddEntry(hist0varDataCloneKshort,"non-weighted MC", "lpe"); */ leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "", 1, 1/lowerPlotHeight); //Further plots, if needed! TCanvas * c3; TCanvas * c4; if (!minimumPlot){ c3 = new TCanvas("c3", "ratio"); c3->Clear(); c3->cd(); hist0ratioData->GetYaxis()->SetRangeUser(0, dRatioMaxData); hist0ratioData->GetYaxis()->SetTitle("ratio MC/data [norm.]"); hist0ratioData->Draw("E1"); unityline->Draw("SAME"); c4 = new TCanvas("c4", "overlay"); c4->Clear(); c4->cd(); hist0varDataCloneKplus->GetYaxis()->SetRangeUser(0, dNormalizedVariableMaxData); hist0varDataCloneKplus->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varDataCloneKplus->Draw("E1"); hist0varDataCloneKshort->SetLineColor(2); hist0varDataCloneKshort->SetMarkerColor(2); hist0varDataCloneKshort->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varDataCloneKshort->Draw("E1SAME"); } std::string WeightingOptions = ""; if(b2Dweighted)WeightingOptions.append("_2D_weighted"); if(bWeighted)WeightingOptions.append("_weighted"); if(ReferenceChannel)WeightingOptions.append("_Ref"); if (!sWeightKshort) WeightingOptions.append("_nosWeightKshort"); if (!sWeightKplus) WeightingOptions.append("_nosWeightKplus"); WeightingOptions.append("_KshortComparison"); if(bPrint){ c2->Print(Form("%s/ComparePlots/%i_%s%s_%s_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (KshortDecayInVelo ? "_LL" : "_DD"), variable.c_str(), WeightingOptions.c_str())); //c2->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data%s.root", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), variable.c_str(), WeightingOptions.c_str())); if (!minimumPlot){ c3->Print(Form("%s/ComparePlots/%i_%s%s_%s_ratio%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (KshortDecayInVelo ? "_LL" : "_DD"), variable.c_str(), WeightingOptions.c_str())); //c3->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_ratio%s.root", path_to_output_KplusPizero.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); c4->Print(Form("%s/ComparePlots/%i_%s%s_%s_overlay%s.eps", path_to_output_KplusPizero.c_str(), year, (KshortDecayInVelo ? "_LL" : "_DD"), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); //c4->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_overlay%s.root", path_to_output_KplusPizero.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); } } c2->Close(); if (!minimumPlot){ c3->Close(); c4->Close(); } delete c2; if (!minimumPlot){ delete c3; delete c4; } /********************************* ********************************* * * MC * ********************************* *********************************/ //create two pads into one canvas TCanvas* c2MC= new TCanvas("c2MC", "ratio and superposition"); textsize = gStyle->GetTextSize(); c2MC->cd(); TPad *pad1MC = new TPad("pad1MC", "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad *pad2MC = new TPad("pad2MC", "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1MC->Draw(); pad2MC->Draw(); //modifiy pad for main plot pad1MC->Clear(); pad1MC->SetBorderSize (0); pad1MC->SetBottomMargin(1e-6); pad1MC->SetTopMargin(pad1MC->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1MC->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hist0ratioMC->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hist0ratioMC->GetXaxis()->SetLabelSize(0.0);//don't print labels hist0ratioMC->GetXaxis()->SetRangeUser(MinMC, MaxMC); hist0ratioMC->GetXaxis()->SetTickLength(hist0ratioMC->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hist0ratioMC->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hist0ratioMC->GetYaxis()->SetTitle("ratio MC Kplus/Kshort"); hist0ratioMC->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hist0ratioMC->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hist0ratioMC->GetYaxis()->SetTickLength(hist0ratioMC->GetYaxis()->GetTickLength()); hist0ratioMC->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hist0ratioMC->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); hist0ratioMC->GetYaxis()->SetRangeUser(0.001, 3); hist0ratioMC->Draw("E1"); TLine * unitylineMC = new TLine(MinMC, 1, MaxMC, 1); unitylineMC->SetLineStyle(2); unitylineMC->SetLineColor(4); unitylineMC->Draw("SAME"); pad2MC->Clear(); pad2MC->SetBorderSize (0); pad2MC->SetTopMargin (1e-6); pad2MC->SetBottomMargin(pad2MC->GetBottomMargin() / lowerPlotHeight ); pad2MC->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hist0varMCcloneKplus->GetXaxis()->SetTitleOffset(1.05); hist0varMCcloneKplus->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varMCcloneKplus->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varMCcloneKplus->GetXaxis()->SetTickLength (hist0ratioMC->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hist0varMCcloneKplus->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hist0varMCcloneKplus->GetXaxis()->SetTitle(xaxistitle.c_str()); hist0varMCcloneKplus->GetXaxis()->SetRangeUser(MinMC, MaxMC); hist0varMCcloneKplus->GetYaxis()->SetRangeUser(dNormalizedVariableMinMC, dNormalizedVariableMaxMC); hist0varMCcloneKplus->GetYaxis()->SetTitle("weighted events"); hist0varMCcloneKplus->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hist0varMCcloneKplus->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hist0varMCcloneKplus->GetYaxis()->SetTickLength(hist0ratioMC->GetYaxis()->GetTickLength()); hist0varMCcloneKplus->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hist0varMCcloneKplus->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hist0varMCcloneKplus->Draw("E1"); hist0varMCcloneKshort->SetLineColor(2); hist0varMCcloneKshort->SetMarkerColor(2); //hist0varMCclone->GetYaxis()->SetTitle("weighted events"); hist0varMCcloneKshort->Draw("E1SAME"); TLegend * legMC = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); /* if(bLogVar) legMC->SetHeader(Form("Log( %s )", variable.c_str())); else if(bLog1minusVar) legMC->SetHeader(Form("Log( 1 - %s )", variable.c_str())); else legMC->SetHeader(variable.c_str()); */ legMC->AddEntry(hist0varMCcloneKplus, "Kplus MC" , "lpe"); legMC->AddEntry(hist0varMCcloneKshort,"Kshort MC", "lpe"); /* if(b2Dweighted) legMC->AddEntry(hist0varMCcloneKshort,"2 x 1D reweighted MC", "lpe"); //TODO else if(bWeighted)legMC->AddEntry(hist0varMCcloneKshort,"reweighted MC", "lpe"); else legMC->AddEntry(hist0varMCcloneKshort,"non-weighted MC", "lpe"); */ legMC->SetTextSize(0.04/lowerPlotHeight); // works fine legMC->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "", 1, 1/lowerPlotHeight); //Further plots, if needed! TCanvas * c3MC; TCanvas * c4MC; if (!minimumPlot){ c3MC = new TCanvas("c3MC", "ratio"); c3MC->Clear(); c3MC->cd(); hist0ratioMC->GetYaxis()->SetRangeUser(0, dRatioMaxMC); hist0ratioMC->GetYaxis()->SetTitle("ratio MC Kplus/Kshort [norm.]"); hist0ratioMC->Draw("E1"); unitylineMC->Draw("SAME"); c4MC = new TCanvas("c4MC", "overlay"); c4MC->Clear(); c4MC->cd(); hist0varMCcloneKplus->GetYaxis()->SetRangeUser(0, dNormalizedVariableMaxMC); hist0varMCcloneKplus->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varMCcloneKplus->Draw("E1"); hist0varMCcloneKshort->SetLineColor(2); hist0varMCcloneKshort->SetMarkerColor(2); hist0varMCcloneKshort->GetYaxis()->SetTitle("Weighted Decays / bin [norm.]"); hist0varMCcloneKshort->Draw("E1SAME"); } WeightingOptions = ""; if(b2Dweighted)WeightingOptions.append("_2D_weighted"); if(bWeighted)WeightingOptions.append("_weighted"); if(ReferenceChannel)WeightingOptions.append("_Ref"); WeightingOptions.append("_KshortComparison"); if(bPrint){ c2MC->Print(Form("%s/ComparePlots/%i_%s%s_%s_%s_MC.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (KshortDecayInVelo ? "_LL" : "_DD"), variable.c_str(), WeightingOptions.c_str())); //c2MC->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data%s.root", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), variable.c_str(), WeightingOptions.c_str())); if (!minimumPlot){ c3MC->Print(Form("%s/ComparePlots/%i_%s%s_%s_ratio%s_MC.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (KshortDecayInVelo ? "_LL" : "_DD"), variable.c_str(), WeightingOptions.c_str())); //c3MC->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_ratio%s.root", path_to_output_KplusPizero.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); c4MC->Print(Form("%s/ComparePlots/%i_%s%s_%s_overlay%s_MC.eps", path_to_output_KplusPizero.c_str(), year, (KshortDecayInVelo ? "_LL" : "_DD"), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); //c4MC->SaveAs(Form("%s/ComparePlots/%i_%s%s_%s_MC_data_overlay%s.root", path_to_output_KplusPizero.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), TheDecay.c_str(), variable.c_str(), WeightingOptions.c_str())); } } c2MC->Close(); if (!minimumPlot){ c3MC->Close(); c4MC->Close(); } delete c2MC; if (!minimumPlot){ delete c3MC; delete c4MC; } delete hist0ratioData; delete hist0ratioMC; delete hist0varDataKplus; delete hist0varDataCloneKplus; delete hist0varDataKshort; delete hist0varDataCloneKshort; delete hist0varMCKplus; delete hist0varMCcloneKplus; delete hist0varMCKshort; delete hist0varMCcloneKshort; delete treeDataKshort; delete treeDataKplus; delete treeMCKplus; delete treeMCKshort; return 1; } ///////////////////////////////////////////////////// /// /// comparison of all Kshort variables: /// ///////////////////////////////////////////////////// int compareAllKshorts(bool sWeight = true, bool bWeighted = true, bool b2DWeighted = true, int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; bool SplitIntoDDandLL = true; int nYear = (Run == 1 ? 2011 : 2015); while(nYear < (Run == 1 ? 2013 : 2019)){ int iteration = 1; bool KshortDecayInVelo = true; while((SplitIntoDDandLL || iteration == 1) && iteration < 3){ compareVariables(nYear, "nTracks", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_DIRA_OWNPV", sWeight, bWeighted, b2DWeighted, false, true, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "B_plus_OWNPV_CHI2", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_ENDVERTEX_CHI2", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_FD_OWNPV", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_IP_OWNPV", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, UseDTF?"B_plus_PT_DTF":"B_plus_PT", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "B_plus_DOCA1", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "B_plus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "B_plus_DTF_chi2", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "K_star_plus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, UseDTF?"K_star_plus_PT_DTF":"K_star_plus_PT", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "K_star_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "mu_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "mu_minus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "mu_plus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "mu_minus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "K_short_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "K_short_FD_OWNPV", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, UseDTF?"K_short_PT_DTF":"K_short_PT", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "K_short_DIRA_OWNPV", sWeight, bWeighted, b2DWeighted, false, true, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "pi_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, true, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, UseDTF?"pi_plus_PT_DTF":"pi_plus_PT", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "Ks_pi_plus_PT"+(UseDTF?"_DTF":""), sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //compareVariables(nYear, "Ks_pi_minus_PT"+(UseDTF?"_DTF":""),sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); KshortDecayInVelo = false; iteration++; } nYear++; } return 1; } int compareAllKshortsWeightedAndUnweighted(){ //not weighted compareAllKshorts(false, false); //1D weighted compareAllKshorts(true, false); //2D weighted compareAllKshorts(true, true); return 1; } int compareKshortPreSelectionAndStrippingVariables(int Run = 1){ checkRun(Run); bool sWeight = true; bool bWeighted = true; bool b2DWeighted = true; bool save2file = true; bool SplitIntoDDandLL = true; int nYear = (Run == 1 ? 2011 : 2015); std::string weightBranch = "nTracks"; while(nYear < (Run == 1 ? 2013 : 2019)){ int iteration = 1; bool KshortDecayInVelo = true; while((SplitIntoDDandLL || iteration == 1) && iteration < 3){ //pre selection PID cuts: compareVariables(nYear, "pi_plus_PIDK", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "mu_plus_ProbNNmu", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); compareVariables(nYear, "mu_minus_ProbNNmu", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); //stripping // compareVariables(nYear, "", sWeight, bWeighted, b2DWeighted, false, false, save2file, KshortDecayInVelo, weightBranch); KshortDecayInVelo = false; iteration++; } nYear++; } return 1; } int compareKshortMVAonly( bool sWeight = true, bool bWeighted = true, bool b2DWeighted = true, int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; bool runDDandLLforAllVariables = true; //Load the MVA config from the txt file MVA_variables varsDD("DD"); MVA_variables varsLL("LL"); std::cout << "Get compare plots for these variables: " << std::endl; std::cout << "DD tracks: " << std::endl; varsDD.print(); std::cout << "LL tracks: " << std::endl; varsLL.print(); bool bLogX = false, bLog1X = false; int nYear = (Run == 1 ? 2011 : 2015); while(nYear < (Run == 1 ? 2013 : 2019)){ //DD tracks for(int i = 0, j = 0; i < varsDD.NumberOfVariables(); i++){ bLogX = false; bLog1X = false; if(strcmp(varsDD.AllVariables.at(i).Formula.c_str(), "log(x)") == 0){ bLogX = true; bLog1X = false; } else if(strcmp(varsDD.AllVariables.at(i).Formula.c_str(), "log(1-x)") == 0){ bLogX = false; bLog1X = true; } if(compareVariables(nYear, varsDD.AllBranches.at(j),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch) == 0)return 0; if(runDDandLLforAllVariables) if(compareVariables(nYear, varsDD.AllBranches.at(j),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, true, weightBranch) == 0)return 0; j += varsDD.AllVariables.at(i).NoBr; } //LL tracks for(int i = 0, j = 0; i < varsLL.NumberOfVariables(); i++){ if(strcmp(varsLL.AllVariables.at(i).Formula.c_str(), "log(x)") == 0)bLogX = true; else if(strcmp(varsLL.AllVariables.at(i).Formula.c_str(), "log(1-x)") == 0)bLog1X = true; else{ bLogX = false; bLog1X = false; } if(compareVariables(nYear, varsLL.AllBranches.at(j),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, true, weightBranch) == 0)return 0; if(runDDandLLforAllVariables) if(compareVariables(nYear, varsLL.AllBranches.at(j),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch) == 0)return 0; j += varsLL.AllVariables.at(i).NoBr; } for(int ddll = 0; ddll < 2; ddll++){ //also compare nPV and B_plus_PT (risk of running double, if used in MVA, but who cares :) if(compareVariables(nYear, "nPV", sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, "nLongTracks", sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "B_plus_PT_DTF" : "B_plus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; ////also compare pT and eta of all daughters if(compareVariables(nYear, (UseDTF ? "Ks_pi_minus_PT_DTF" : "Ks_pi_minus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "Ks_pi_plus_PT_DTF" : "Ks_pi_plus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "K_star_plus_PT_DTF" : "K_star_plus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "K_short_PT_DTF" : "K_short_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "pi_plus_PT_DTF" : "pi_plus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "mu_plus_PT_DTF" : "mu_plus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "mu_minus_PT_DTF" : "mu_minus_PT"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "Ks_pi_minus_ETA_DTF" : "Ks_pi_minus_ETA"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "Ks_pi_plus_ETA_DTF" : "Ks_pi_plus_ETA"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "K_star_plus_ETA_DTF" : "K_star_plus_ETA"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "K_short_ETA_DTF" : "K_short_ETA"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; if(compareVariables(nYear, (UseDTF ? "pi_plus_ETA_DTF" : "pi_plus_ETA"), sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, ddll, weightBranch) == 0) return 0; } nYear++; } return 1; } ///////////////////////////////////////////////////// /// /// comparison of all Kplus variables: /// ///////////////////////////////////////////////////// int compareMuIPKplusResolved(int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; vectoryears = yearsVectorInt(true,false,false,Run); for (auto nYear: years){ /// mu compareVariables(nYear, "mu_plus_IPCHI2_OWNPV", true, true, true, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "mu_minus_IPCHI2_OWNPV", true, true, true, 1, 0, save2file, false, weightBranch); nYear++; if (nYear==2013) nYear =2015; } return 1; } int compareAllKplusResolved(bool sWeight = true, bool bWeighted = true, bool b2DWeighted = false, int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; weightBranch = firstMCweight + "_TM_rndGamma"; vectoryears = yearsVectorInt(true,false,true,Run); //Set to PHSP, otherwise 2015 wouldn't be done for (auto nYear: years){ //Why is this not a vector is beyond me //Global compareVariables(nYear, "nTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "nLongTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "nVeloTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "nTTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "nUpstreamTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "nDownstreamTracks", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); ///B+ compareVariables(nYear, "B_plus_DIRA_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 1, save2file, false, weightBranch); compareVariables(nYear, "B_plus_OWNPV_CHI2", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_FD_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF?"B_plus_PT_DTF":"B_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_IP_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); //compareVariables(nYear, "B_plus_DOCA1", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_NEW_ConePT", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_NEW_ConePasym", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_NEW_ConeP", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "B_plus_ETA_DTF":"B_plus_ETA"),sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// K* compareVariables(nYear, (UseDTF ? "K_star_plus_PT_DTF":"K_star_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_star_plus_ETA_DTF":"K_star_plus_ETA"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "K_star_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// mu compareVariables(nYear, "mu_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "mu_minus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); ///K+ compareVariables(nYear, "K_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "K_plus_TRACK_CHI2NDOF", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_plus_PT_DTF":"K_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_plus_ETA_DTF":"K_plus_ETA"),sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// pi0 compareVariables(nYear, UseDTF ? "pi_zero_resolved_PT_DTF":"pi_zero_resolved_PT", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, UseDTF ? "pi_zero_resolved_ETA_DTF":"pi_zero_resolved_ETA", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "pi_zero_resolved_CL", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); //compareVariables(nYear, "K_plus_PI0_ETA", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); //TODO: check!!! //gamma compareVariables(nYear, (UseDTF ? "gamma1_PT_DTF":"gamma1_PT"), sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "gamma2_PT_DTF":"gamma2_PT"), sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "gamma1_CL", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "gamma2_CL", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "open_angle", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); nYear++; } return 1; } int compareAllKplusMerged(bool sWeight = true, bool bWeighted = true, bool b2DWeighted = false, int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; int nYear = (Run == 1 ? 2011 : 2015); while(nYear < (Run == 1 ? 2013 : 2018)){ ///B+ compareVariables(nYear, "B_plus_DIRA_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 1, save2file, false, weightBranch); compareVariables(nYear, "B_plus_OWNPV_CHI2", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_FD_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "B_plus_PT_DTF":"B_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_IP_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); //compareVariables(nYear, "B_plus_DOCA1", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "B_plus_NEW_ConePTasym", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "B_plus_ETA_DTF":"B_plus_ETA"),sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// K* compareVariables(nYear, (UseDTF ? "K_star_plus_PT_DTF":"K_star_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_star_plus_ETA_DTF":"K_star_plus_ETA"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "K_star_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// mu compareVariables(nYear, "mu_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); compareVariables(nYear, "mu_minus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 1, 0, save2file, false, weightBranch); ///K+ compareVariables(nYear, "K_plus_IPCHI2_OWNPV", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, "K_plus_TRACK_CHI2NDOF", sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_plus_PT_DTF":"K_plus_PT"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); compareVariables(nYear, (UseDTF ? "K_plus_ETA_DTF":"K_plus_ETA"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); /// pi0 compareVariables(nYear, (UseDTF ? "pi_zero_merged_ETA_DTF" : "pi_zero_merged_ETA"), sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch); nYear++; } return 1; } int compareKplusResolvedMVAonly(bool sWeight = true, bool bWeighted = true, bool b2DWeighted = true, int Run = 1, std::string weightBranch = firstMCweight){ checkRun(Run); bool save2file = true; weightBranch = firstMCweight + "_TM_rndGamma"; //Load the MVA config from the txt file MVA_variables vars(""); std::cout << "Get compare plots for these variables: " << std::endl; vars.print(); string operation = ""; bool bLogX = false, bLog1X = false; vectoryears = yearsVectorInt(true,false,true,Run); //Set to PHSP in order to process also 2015 for (auto nYear: years){ int k = 0; //check for all branches actually used for(int i = 0; i < vars.NumberOfVariables(); i++){ //loop over used variables bLogX = false; bLog1X = false; operation = ""; if ( vars.AllVariables.at(i).NoBr == 2){ cout << "[INFO]\tPlotting variable: " << vars.AllVariables.at(i).LaTeXName << endl; if( vars.AllVariables.at(i).Formula.find("log(1")!= std::string::npos){ bLogX = false; bLog1X = true; } else if( vars.AllVariables.at(i).Formula.find("log(x") != std::string::npos){ bLogX = true; bLog1X = false; } if( vars.AllVariables.at(i).Formula.find("max") != std::string::npos) operation = "max"; else if( vars.AllVariables.at(i).Formula.find("min") != std::string::npos) operation = "min"; else if( vars.AllVariables.at(i).Formula.find("abs") != std::string::npos) operation = "abs"; if(compareVariables(nYear, vars.AllBranches.at(k),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch, false, "","" , "") == 0)return 0; if(compareVariables(nYear, vars.AllBranches.at(k+1),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch, false, "","" , "" ) == 0)return 0; compareVariables(nYear, vars.AllBranches.at(k),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch, true, operation, vars.AllBranches.at(k+1), vars.AllVariables.at(i).LaTeXName); k+=2; } else{ cout << "[INFO]\tPlotting variable: " << vars.AllBranches.at(k) << endl; if( vars.AllVariables.at(i).Formula.find("log(x)") != std::string::npos){ bLogX = true; bLog1X = false; } else if( vars.AllVariables.at(i).Formula.find("log(1-x)")!= std::string::npos){ bLogX = false; bLog1X = true; } if(compareVariables(nYear, vars.AllBranches.at(k),sWeight, bWeighted, b2DWeighted, bLogX, bLog1X, save2file, false, weightBranch,false, "","", vars.AllVariables.at(i).LaTeXName) == 0)return 0; k++; } } //also compare nTracks and B_plus_PT (risk of running double, if used in MVA, but who cares :) if(compareVariables(nYear, firstMCweight, sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch) == 0)return 0; if(compareVariables(nYear, seconMCweight, sWeight, bWeighted, b2DWeighted, 0, 0, save2file, false, weightBranch) == 0)return 0; nYear++; } return 1; } int compareAllKplus(std::string weightBranch = firstMCweight){ NtrackWeightAllKplus(false, false, true); if (compareAllKplusResolved (true, 0, 0, 1, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 0, 1, 1, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 1, 0, 1, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 1, 1, 1, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 0, 0, 2, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 0, 1, 2, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 1, 0, 2, weightBranch)==0) return 0; if (compareAllKplusResolved (true, 1, 1, 2, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 0, 0, 1, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 0, 1, 1, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 1, 0, 1, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 1, 1, 1, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 0, 0, 2, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 0, 1, 2, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 1, 0, 2, weightBranch)==0) return 0; if (compareKplusResolvedMVAonly (true, 1, 1, 2, weightBranch)==0) return 0; return 1; } ///////////////////////////////////////////////////// /// /// comparison of all variables: /// ///////////////////////////////////////////////////// int compareAll(int Run = 1){ if(Kst2Kspiplus) return compareKshortMVAonly(true,true, true, Run); if(Kst2Kpluspi0Resolved)return compareKplusResolvedMVAonly(true,true, true, Run); if(Kst2Kpluspi0Merged) return compareAllKplusMerged(true,true,true, Run); coutERROR("Nothing processed! Incorrect decay string given!"); return 0; } ///////////////////////////////////////////////////// /// /// comparison of track multiplicities between Run I and Run II /// ///////////////////////////////////////////////////// int compareTrackMultiplicities(bool KshortDecaysInVelo = false, bool MC = false, std::string weightBranch = firstMCweight){ //change hardcoded if the distributions should be compared unweighted, otherwise use 2 * 1D reweight in PT(B+) and nTracks bool reweightMC = true; bool sWeight = true; gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); //lhcbStyle->SetOptTitle(1); //create one tree per Run and add all years and magnet polarities into the same tree TChain * treeRun1 = new TChain(MC ? "DecayTreeTruthMatched" : "DecayTree"); TChain * treeRun2 = new TChain(MC ? "DecayTreeTruthMatched" : "DecayTree"); // Kst2Kpluspi0Resolved case if(Kst2Kpluspi0Resolved){ if(MC){ treeRun1->Add(Form("%s/data/MC/2011_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/MC/2012_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2015_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2016_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); } else{ treeRun1->Add(Form("%s/data/2011_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/2012_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2015_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2016_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); } } // Kst2Kpluspi0Merged case else if(Kst2Kpluspi0Merged){ if(MC){ coutERROR("No merged pi0 MC sample available!"); return 0; treeRun1->Add(Form("%s/data/MC/2011_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/MC/2012_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2015_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2016_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); } else{ treeRun1->Add(Form("%s/data/2011_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/2012_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2015_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2016_KplusPi0Merged_BDTinput%s.root", path_to_output_KplusPizero.c_str(), sWeight ? "" : "_nosWeight")); } } // Kst2Kspiplus case else if(Kst2Kspiplus){ if(MC){ if(SplitDDandLL){ treeRun1->Add(Form("%s/data/MC/2011_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/MC/2012_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2015_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2016_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); } else{ treeRun1->Add(Form("%s/data/MC/2011_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/MC/2012_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2015_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/MC/2016_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); } } else{ if(SplitDDandLL){ treeRun1->Add(Form("%s/data/2011_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/2012_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2015_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2016_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", sWeight ? "" : "_nosWeight")); } else{ treeRun1->Add(Form("%s/data/2011_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun1->Add(Form("%s/data/2012_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2015_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); treeRun2->Add(Form("%s/data/2016_KshortPiplus_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), sWeight ? "" : "_nosWeight")); } } } else return 0; //create vector with all requested variables that are compared between Run1 and Run2 std::vector TrackTypes; TrackTypes.push_back("nTracks"); TrackTypes.push_back("nLongTracks"); TrackTypes.push_back("nBackTracks"); TrackTypes.push_back("nDownstreamTracks"); TrackTypes.push_back("nTTracks"); TrackTypes.push_back("nUpstreamTracks"); TrackTypes.push_back("nVeloTracks"); std::vector UpperLimits; UpperLimits.push_back(500); UpperLimits.push_back(125); UpperLimits.push_back(75); UpperLimits.push_back(75); UpperLimits.push_back(150); UpperLimits.push_back(45); UpperLimits.push_back(300); const unsigned int N = TrackTypes.size(); if(UpperLimits.size() != N){ coutWarning("Number of given upper limits for variable distributions does not match the number of varialbes!"); while(UpperLimits.size() < N)UpperLimits.push_back(100); } int nTracksRun1[N]; int nTracksRun2[N]; TH1D * histosRun1[N]; TH1D * histosRun2[N]; for(unsigned int tt = 0; tt < N; tt++){ //link all variables from TTree to the int: treeRun1->SetBranchAddress(TrackTypes.at(tt).c_str(), &nTracksRun1[tt]); treeRun2->SetBranchAddress(TrackTypes.at(tt).c_str(), &nTracksRun2[tt]); histosRun1[tt] = new TH1D(Form("%s_Run1", TrackTypes.at(tt).c_str()), "2011 + 2012", (UpperLimits.at(tt) > 200) ? 100 : UpperLimits.at(tt) + 1 , -0.5 , UpperLimits.at(tt) + 0.5 ); histosRun2[tt] = new TH1D(Form("%s_Run2", TrackTypes.at(tt).c_str()), "2015 + 2016", (UpperLimits.at(tt) > 200) ? 100 : UpperLimits.at(tt) + 1 , -0.5 , UpperLimits.at(tt) + 0.5 ); histosRun1[tt]->SetMarkerStyle(20); histosRun2[tt]->SetMarkerStyle(20); histosRun1[tt]->SetMarkerColor(2); histosRun2[tt]->SetMarkerColor(4); histosRun1[tt]->SetLineColor(2); histosRun2[tt]->SetLineColor(4); histosRun1[tt]->GetXaxis()->SetTitle(TrackTypes.at(tt).c_str()); histosRun1[tt]->GetYaxis()->SetTitle("normalized events"); histosRun2[tt]->GetXaxis()->SetTitle(TrackTypes.at(tt).c_str()); histosRun2[tt]->GetYaxis()->SetTitle("normalized events"); } //link weights! double wRun1 = 1.0; double wRun2 = 1.0; if(MC){ if (reweightMC){ //if not, keep wRun1 and wRun2 = 1.0 treeRun1->SetBranchAddress(Form("weight2D_%s",weightBranch.c_str()), &wRun1); treeRun2->SetBranchAddress(Form("weight2D_%s",weightBranch.c_str()), &wRun2); } } else if (sWeight){ treeRun1->SetBranchAddress("N_Bplus_sw", &wRun1); treeRun2->SetBranchAddress("N_Bplus_sw", &wRun2); } std::cout << "[INFO]\t\tAll variables linked and histograms created!" << std::endl; unsigned int N_Run1 = treeRun1->GetEntries(); unsigned int N_Run2 = treeRun2->GetEntries(); std::cout << std::endl; std::cout << "= = = = = = = = = = = = = = = = " << std::endl; std::cout << std::endl; std::cout << "[INFO]\t\tStart looping over dataset of Run 1" << std::endl; std::cout << "[INFO]\t\tTotal of " << N_Run1 << " events!" << std::endl; //fill Run1 histograms: for(unsigned int i = 0; i < N_Run1; i++){ treeRun1->GetEntry(i); if(i !=0 && i%1000 == 0)std::cout << "[LOOP]\t\tRun 1: Event [" << i + 1 << " / " << N_Run1 << "]" << std::endl; for(unsigned int tt = 0; tt < N; tt++){ histosRun1[tt]->Fill(nTracksRun1[tt], wRun1); } } std::cout << std::endl; std::cout << "= = = = = = = = = = = = = = = = " << std::endl; std::cout << std::endl; std::cout << "[INFO]\t\tStart looping over dataset of Run 2" << std::endl; std::cout << "[INFO]\t\tTotal of " << N_Run2 << " events!" << std::endl; //fill Run2 histograms: for(unsigned int ii = 0; ii < N_Run2; ii++){ treeRun2->GetEntry(ii); if(MC && !reweightMC)wRun2 = 1.; if(ii !=0 && ii%1000 == 0)std::cout << "[LOOP]\t\tRun 2: Event [" << ii + 1 << " / " << N_Run2 << "]" << std::endl; for(unsigned int tt = 0; tt < N; tt++){ histosRun2[tt]->Fill(nTracksRun2[tt], wRun2); } } //normalize all histograms: for(unsigned int tt = 0; tt < N; tt++){ //histosRun1[tt]->Sumw2(); //histosRun2[tt]->Sumw2(); histosRun1[tt]->Scale(1. / N_Run1); histosRun2[tt]->Scale(1. / N_Run2); } std::cout << std::endl; std::cout << "= = = = = = = = = = = = = = = = " << std::endl; std::cout << std::endl; std::cout << "[INFO]\t\tSave histograms to file!" << std::endl; //create new file for these comparison plots: TFile * fOutput = NULL; if(Kst2Kpluspi0Merged) fOutput = new TFile(Form("%s/ComparePlots/%s%s%s.root", path_to_output_KplusPizero.c_str(), TheDecay.c_str(), MC ? "_MC" : "", sWeight ? "" : "_nosWeight"), "RECREATE"); else if(Kst2Kpluspi0Resolved) fOutput = new TFile(Form("%s/ComparePlots/%s%s%s.root", path_to_output_KplusPizero.c_str(), TheDecay.c_str(), MC ? "_MC" : "", sWeight ? "" : "_nosWeight"), "RECREATE"); else if(Kst2Kspiplus){ if(SplitDDandLL) fOutput = new TFile(Form("%s/ComparePlots/%s%s%s%s.root", path_to_output_KshortPiplus.c_str(), TheDecay.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", MC ? "_MC" : "", sWeight ? "" : "_nosWeight"), "RECREATE"); else fOutput = new TFile(Form("%s/ComparePlots/%s%s%s%s.root", path_to_output_KshortPiplus.c_str(), TheDecay.c_str(), KshortDecaysInVelo ? "_LL" : "_DD", MC ? "_MC" : "", sWeight ? "" : "_nosWeight"), "RECREATE"); } else return 0; if(fOutput == NULL){ coutERROR("Initializing of output file was not successful. Exit program!"); return 0; } TCanvas * c1; float maxBinContent = 0.; //plot Run1 and Run2 histograms into the same canvas and save to TFile for(unsigned int tt = 0; tt < N; tt++){ maxBinContent = 0.; for(int bin = 1; bin <= histosRun1[tt]->GetNbinsX(); bin++){ if(maxBinContent < histosRun1[tt]->GetBinContent(bin))maxBinContent = histosRun1[tt]->GetBinContent(bin); } for(int bin = 1; bin <= histosRun2[tt]->GetNbinsX(); bin++){ if(maxBinContent < histosRun2[tt]->GetBinContent(bin))maxBinContent = histosRun2[tt]->GetBinContent(bin); } c1 = new TCanvas("c1", "c1"); c1->Clear(); c1->SetName(TrackTypes.at(tt).c_str()); c1->SetTitle(TrackTypes.at(tt).c_str()); histosRun1[tt]->GetYaxis()->SetRangeUser(0, maxBinContent * 1.1); histosRun1[tt]->Draw("E1"); histosRun2[tt]->Draw("E1SAME"); c1->BuildLegend(0.6, 0.7, 0.9, 0.9); fOutput->cd(); c1->Write("",TObject::kWriteDelete); c1->Close(); } fOutput->Close(); return 1; } ///////////////////////////////////////////////////// /// /// comparison of the angles between (2D-)weighted and non-weighted PHSP MC /// ///////////////////////////////////////////////////// int compareAnglesInPHSP(int year = 2011, bool sWeight = true, bool b2Dweighted = true, bool KshortDecayInVelo = true, std::string weightBranch = firstMCweight){ gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); //put both magnet polarities into one TChain TChain * treePHSP = new TChain("DecayTreeTruthMatched"); if(Kst2Kpluspi0Resolved){ treePHSP->Add(Form("%s/data/PHSP/%i_KplusPi0ResolvedPHSP_BDTinput%s.root", path_to_output_KplusPizero.c_str(), year, sWeight ? "" : "_nosWeight")); } else if(Kst2Kspiplus){ treePHSP->Add(Form("%s/data/PHSP/%i_KshortPiplusPHSP%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), year, SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "", sWeight ? "" : "_nosWeight")); } int N = treePHSP->GetEntries(); if(N == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/PHSP/%i_%sPHSP%s_BDTinput.root", year, TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "")) << std::endl; return 0; } //deactivate all branches exept the one of intrest! treePHSP->SetBranchStatus("*",0); treePHSP->SetBranchStatus("B_plus_ThetaK",1); treePHSP->SetBranchStatus("B_plus_ThetaL",1); treePHSP->SetBranchStatus("B_plus_Phi",1); treePHSP->SetBranchStatus(Form("weight_%s",weightBranch.c_str()),1); treePHSP->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); double angle[3];//ctk, ctl, phi; double w, w2d; treePHSP->SetBranchAddress("B_plus_ThetaK",&angle[0]); treePHSP->SetBranchAddress("B_plus_ThetaL",&angle[1]); treePHSP->SetBranchAddress("B_plus_Phi",&angle[2]); treePHSP->SetBranchAddress(Form("weight_%s",weightBranch.c_str()),&w); treePHSP->SetBranchAddress(Form("weight2D_%s",weightBranch.c_str()),&w2d); //initialize histograms int bins = 100; double xLow[3] = {-1., -1., -TMath::Pi()}; double xHigh[3] = {+1., +1., +TMath::Pi()}; std::string theName[3] = {"cos(#theta_{K})", "cos(#theta_{L})", "#phi"}; std::string leName[3] = {"ctk", "ctl", "phi"}; TH1D * hRatio[3]; TH1D * hWeighted[3]; TH1D * hNoWeight[3]; for(int h = 0; h < 3; h++){ hRatio[h] = new TH1D(Form("hRatio_%s", leName[h].c_str()), Form("Ratio weighted to non-weighted (%s)", theName[h].c_str()), bins, xLow[h], xHigh[h]); hWeighted[h] = new TH1D(Form("hWeighted_%s", leName[h].c_str()), Form("%sWeighted distribution of %s", (b2Dweighted ? "2D-" : ""), theName[h].c_str()), bins, xLow[h], xHigh[h]); hNoWeight[h] = new TH1D(Form("hNoWeight_%s", leName[h].c_str()), Form("Non-weighted distribution of %s", theName[h].c_str()), bins, xLow[h], xHigh[h]); } //loop over events and save to histograms for(int i = 0; i < N; i++){ if(i%10000==0 && i != 0)std::cout << "Loading data event " << i << " / " << N << std::endl; treePHSP->GetEntry(i); for(int a = 0; a < 3; a++){ if(a == 0 || a == 1){ //convert theta to cos(theta) angle[a] = TMath::Cos(angle[a]); } hRatio[a] ->Fill(angle[a], b2Dweighted ? w2d : w); hWeighted[a]->Fill(angle[a], b2Dweighted ? w2d : w); hNoWeight[a]->Fill(angle[a], 1.0); } } double varMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double varMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double ratioMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double ratioMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double val, weival, ratioval; for(int h = 0; h < 3; h++){ //make ratio: hRatio[h]->Divide(hNoWeight[h]); //set correct ranges for the histograms: for(int bin = 1; bin <= bins; bin++){ val = hNoWeight[h]->GetBinContent(bin); weival = hWeighted[h]->GetBinContent(bin); ratioval = hRatio[h] ->GetBinContent(bin); if(varMax[h] <= val) varMax[h] = val; if(varMax[h] <= weival) varMax[h] = weival; if(ratioMax[h] <= ratioval)ratioMax[h] = ratioval; if(varMin[h] >= val) varMin[h] = val; if(varMin[h] >= weival) varMin[h] = weival; if(ratioMin[h] >= ratioval)ratioMin[h] = ratioval; } varMax[h] *= 1.1; if(varMin[h] < 0)varMin[h] *= 1.1; else varMin[h] = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(ratioMax[h] > 3.)ratioMax[h] = 3.; if(ratioMax[h] < 2.)ratioMax[h] = 2.; ratioMax[h] *= 1.1; //configurables for plotting float lowerPlotHeight = 0.6; //create two pads into one canvas TCanvas * theCanvas = new TCanvas(Form("theCanvas%s", leName[h].c_str()), Form("ratio and superposition of %s" , theName[h].c_str())); float textsize = gStyle->GetTextSize(); TPad * pad1 = new TPad(Form("pad1%s", leName[h].c_str()), "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad * pad2 = new TPad(Form("pad2%s", leName[h].c_str()), "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hRatio[h]->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hRatio[h]->GetXaxis()->SetLabelSize(0.0);//don't print labels hRatio[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hRatio[h]->GetXaxis()->SetTickLength(hRatio[h]->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hRatio[h]->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hRatio[h]->GetYaxis()->SetTitle("ratio (#omega / 1.0)"); hRatio[h]->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hRatio[h]->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hRatio[h]->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.5); hRatio[h]->Draw("E1"); TLine * unityline = new TLine(xLow[h], 1, xHigh[h], 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hNoWeight[h]->GetXaxis()->SetTitleOffset(1.05); hNoWeight[h]->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hNoWeight[h]->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hNoWeight[h]->GetXaxis()->SetTickLength (hRatio[h]->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hNoWeight[h]->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hNoWeight[h]->GetXaxis()->SetTitle(theName[h].c_str()); hNoWeight[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hNoWeight[h]->GetYaxis()->SetRangeUser(varMin[h], varMax[h]); hNoWeight[h]->GetYaxis()->SetTitle("events"); hNoWeight[h]->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hNoWeight[h]->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hNoWeight[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hNoWeight[h]->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hNoWeight[h]->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hNoWeight[h]->Draw("E1"); hWeighted[h]->SetLineColor(2); hWeighted[h]->SetMarkerColor(2); hWeighted[h]->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.4; float LegendYposition = 0.3; TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); leg->AddEntry(hWeighted[h],Form("%sweighted PHSP MC",(b2Dweighted ? "2#upoint1D-" : "")), "lpe"); leg->AddEntry(hNoWeight[h],"non-weighted PHSP MC", "lpe"); leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "simulation", 1, 1/lowerPlotHeight); if (Kst2Kspiplus)theCanvas->Print(Form("%s/ComparePlots/%i_%s%s_Comparison%sWeights_%s%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), (b2Dweighted ? "2D" : ""), leName[h].c_str(), sWeight ? "" : "_nosWeight")); else theCanvas->Print(Form("%s/ComparePlots/%i_%s_Comparison%sWeights_%s%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (b2Dweighted ? "2D" : ""), leName[h].c_str(), sWeight ? "" : "_nosWeight")); theCanvas->Close(); delete theCanvas; delete hNoWeight[h]; delete hWeighted[h]; delete hRatio[h]; } delete treePHSP; return 1; } int compareAllAnglesInPHSP(int Run = 1){ bool b2Dweights = true; std::vectoryears; if(Run == 1){ years.push_back(2011); years.push_back(2012); } if(Run == 2){ years.push_back(2015); years.push_back(2016); years.push_back(2017); years.push_back(2018); } for(int y = 0; y < years.size(); y++){ if(compareAnglesInPHSP(years.at(y), true, b2Dweights, false, firstMCweight) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + (Kst2Kspiplus && SplitDDandLL ? " (DD tracks)" : "")); return 0; } if(Kst2Kspiplus && SplitDDandLL){ if(compareAnglesInPHSP(years.at(y), true, b2Dweights, true, firstMCweight) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + " (LL tracks)"); return 0; } } } return 1; } ///////////////////////////////////////////////////// /// /// comparison of the angles between (2D-)weighted and non-weighted signal MC /// ///////////////////////////////////////////////////// int compareAnglesInMC(int year = 2011, bool sWeight = true, bool b2Dweighted = true, bool KshortDecayInVelo = true, std::string weightBranch = firstMCweight){ gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); //put both magnet polarities into one TChain TChain * treeMC = new TChain("DecayTreeTruthMatched"); if(Kst2Kpluspi0Resolved){ treeMC->Add(Form("%s/data/MC/%i_KplusPi0Resolved_BDTinput%s.root", path_to_output_KplusPizero.c_str(), year, sWeight ? "" : "_nosWeight")); } else if(Kst2Kspiplus){ treeMC->Add(Form("%s/data/MC/%i_KshortPiplus%s_BDTinput%s.root", path_to_output_KshortPiplus.c_str(), year, SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "", sWeight ? "" : "_nosWeight")); } int N = treeMC->GetEntries(); if(N == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/MC/%i_%s%s_BDTinput.root", year, TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "")) << std::endl; return 0; } //deactivate all branches exept the one of intrest! treeMC->SetBranchStatus("*",0); treeMC->SetBranchStatus("B_plus_ThetaK",1); treeMC->SetBranchStatus("B_plus_ThetaL",1); treeMC->SetBranchStatus("B_plus_Phi",1); treeMC->SetBranchStatus(Form("weight_%s",weightBranch.c_str()),1); treeMC->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); double angle[3];//ctk, ctl, phi; double w, w2d; treeMC->SetBranchAddress("B_plus_ThetaK",&angle[0]); treeMC->SetBranchAddress("B_plus_ThetaL",&angle[1]); treeMC->SetBranchAddress("B_plus_Phi",&angle[2]); treeMC->SetBranchAddress(Form("weight_%s",weightBranch.c_str()),&w); treeMC->SetBranchAddress(Form("weight2D_%s",weightBranch.c_str()),&w2d); //initialize histograms int bins = 100; double xLow[3] = {-1., -1., -TMath::Pi()}; double xHigh[3] = {+1., +1., +TMath::Pi()}; std::string theName[3] = {"cos(#theta_{K})", "cos(#theta_{L})", "#phi"}; std::string leName[3] = {"ctk", "ctl", "phi"}; TH1D * hRatio[3]; TH1D * hWeighted[3]; TH1D * hNoWeight[3]; for(int h = 0; h < 3; h++){ hRatio[h] = new TH1D(Form("hRatio_%s", leName[h].c_str()), Form("Ratio weighted to non-weighted (%s)", theName[h].c_str()), bins, xLow[h], xHigh[h]); hWeighted[h] = new TH1D(Form("hWeighted_%s", leName[h].c_str()), Form("%sre-weighted distribution of %s", (b2Dweighted ? "2D-" : ""), theName[h].c_str()), bins, xLow[h], xHigh[h]); hNoWeight[h] = new TH1D(Form("hNoWeight_%s", leName[h].c_str()), Form("Non-weighted distribution of %s", theName[h].c_str()), bins, xLow[h], xHigh[h]); } //loop over events and save to histograms for(int i = 0; i < N; i++){ if(i%10000==0 && i != 0)std::cout << "Loading data event " << i << " / " << N << std::endl; treeMC->GetEntry(i); for(int a = 0; a < 3; a++){ if(a == 0 || a == 1){ //convert theta to cos(theta) angle[a] = TMath::Cos(angle[a]); } hRatio[a] ->Fill(angle[a], b2Dweighted ? w2d : w); hWeighted[a]->Fill(angle[a], b2Dweighted ? w2d : w); hNoWeight[a]->Fill(angle[a], 1.0); } } double varMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double varMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double ratioMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double ratioMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double val, weival, ratioval; for(int h = 0; h < 3; h++){ //make ratio: hRatio[h]->Divide(hNoWeight[h]); //set correct ranges for the histograms: for(int bin = 1; bin <= bins; bin++){ val = hNoWeight[h]->GetBinContent(bin); weival = hWeighted[h]->GetBinContent(bin); ratioval = hRatio[h] ->GetBinContent(bin); if(varMax[h] <= val) varMax[h] = val; if(varMax[h] <= weival) varMax[h] = weival; if(ratioMax[h] <= ratioval)ratioMax[h] = ratioval; if(varMin[h] >= val) varMin[h] = val; if(varMin[h] >= weival) varMin[h] = weival; if(ratioMin[h] >= ratioval)ratioMin[h] = ratioval; } varMax[h] *= 1.1; if(varMin[h] < 0)varMin[h] *= 1.1; else varMin[h] = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(ratioMax[h] > 3.)ratioMax[h] = 3.; if(ratioMax[h] < 2.)ratioMax[h] = 2.; ratioMax[h] *= 1.1; //configurables for plotting float lowerPlotHeight = 0.6; //create two pads into one canvas TCanvas * theCanvas = new TCanvas(Form("theCanvas%s", leName[h].c_str()), Form("ratio and superposition of %s" , theName[h].c_str())); float textsize = gStyle->GetTextSize(); TPad * pad1 = new TPad(Form("pad1%s", leName[h].c_str()), "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad * pad2 = new TPad(Form("pad2%s", leName[h].c_str()), "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hRatio[h]->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hRatio[h]->GetXaxis()->SetLabelSize(0.0);//don't print labels hRatio[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hRatio[h]->GetXaxis()->SetTickLength(hRatio[h]->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hRatio[h]->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hRatio[h]->GetYaxis()->SetTitle("ratio (#omega / 1.0)"); hRatio[h]->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hRatio[h]->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hRatio[h]->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.5); hRatio[h]->Draw("E1"); TLine * unityline = new TLine(xLow[h], 1, xHigh[h], 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hNoWeight[h]->GetXaxis()->SetTitleOffset(1.05); hNoWeight[h]->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hNoWeight[h]->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hNoWeight[h]->GetXaxis()->SetTickLength (hRatio[h]->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hNoWeight[h]->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hNoWeight[h]->GetXaxis()->SetTitle(theName[h].c_str()); hNoWeight[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hNoWeight[h]->GetYaxis()->SetRangeUser(varMin[h], varMax[h]); hNoWeight[h]->GetYaxis()->SetTitle("events"); hNoWeight[h]->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hNoWeight[h]->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hNoWeight[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hNoWeight[h]->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hNoWeight[h]->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hNoWeight[h]->Draw("E1"); hWeighted[h]->SetLineColor(2); hWeighted[h]->SetMarkerColor(2); hWeighted[h]->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.4; float LegendYposition = 0.3; TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); leg->AddEntry(hWeighted[h],Form("%sweighted signal MC",(b2Dweighted ? "2#upoint1D-" : "")), "lpe"); leg->AddEntry(hNoWeight[h],"non-weighted signal MC", "lpe"); leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "simulation", 1, 1/lowerPlotHeight); if (Kst2Kspiplus)theCanvas->Print(Form("%s/ComparePlots/%i_%s%s_Comparison_SignalMC%sWeights_%s%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), (b2Dweighted ? "2D" : ""), leName[h].c_str(), sWeight ? "" : "_nosWeight")); else theCanvas->Print(Form("%s/ComparePlots/%i_%s_Comparison_SignalMC%sWeights_%s%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (b2Dweighted ? "2D" : ""), leName[h].c_str(), sWeight ? "" : "_nosWeight")); theCanvas->Close(); delete theCanvas; delete hNoWeight[h]; delete hWeighted[h]; delete hRatio[h]; } delete treeMC; return 1; } int compareAllAnglesInMC(int Run = 1){ bool b2Dweights = true; std::vectoryears = yearsVectorInt(true,false,false,Run); for(int y = 0; y < years.size(); y++){ if(compareAnglesInMC(years.at(y), true, b2Dweights, false, firstMCweight) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + (Kst2Kspiplus && SplitDDandLL ? " (DD tracks)" : "")); return 0; } if(Kst2Kspiplus && SplitDDandLL){ if(compareAnglesInMC(years.at(y), true, b2Dweights, true, firstMCweight) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + " (LL tracks)"); return 0; } } } return 1; } ///////////////////////////////////////////////////// /// /// comparison of the angles in PHSP MC before and after the BDT cut /// ///////////////////////////////////////////////////// int compareAnglesInPHSPbeforeAndAfterBDTcut(int year = 2011, bool bweighted = true, bool b2Dweighted = true, bool KshortDecayInVelo = true, std::string weightBranch = firstMCweight){ gStyle -> SetOptStat(0); gROOT->SetBatch(kTRUE); LHCbStyle(); bool NormalizedRatio = false; std::string weighzzz = ""; if(bweighted){ weighzzz = "weighted"; } if(b2Dweighted){ bweighted = true; weighzzz = "2*1D-weighted"; } //put both magnet polarities into one TChain TChain * treePHSP[2]; treePHSP[0] = new TChain("DecayTreeTruthMatched"); treePHSP[1] = new TChain("SelectionOutput"); if(Kst2Kpluspi0Resolved){ treePHSP[0]->Add(Form("%s/data/PHSP/%i_KplusPi0ResolvedPHSP_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treePHSP[1]->Add(Form("%s/data/PHSP/KplusPi0Resolved_PHSP_BDToutputSelection_Run%i_%i.root", path_to_output_KplusPizero.c_str(), (year > 2012 ? 2 : 1), year)); } else if(Kst2Kspiplus){ treePHSP[0]->Add(Form("%s/data/PHSP/%i_KshortPiplusPHSP%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); treePHSP[1]->Add(Form("%s/data/PHSP/KshortPiplus%s_PHSP_BDToutputSelection_Run%i_%i.root", path_to_output_KshortPiplus.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), (year > 2012 ? 2 : 1), year)); } int Nb = treePHSP[0]->GetEntries(); int Na = treePHSP[1]->GetEntries(); if(Nb == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/PHSP/%i_%sPHSP%s_BDTinput.root", year, TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "")) << std::endl; return 0; } if(Na == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/PHSP/%s%sPHSP_BDToutputSelection_Run%i_%i.root", TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), (year > 2012 ? 2 : 1), year) << std::endl; return 0; } double angle[3][2];//ctk, ctl, phi; double w[2], w2d[2]; for(int i = 0; i < 2; i++){ //deactivate all branches exept the one of intrest! treePHSP[i]->SetBranchStatus("*",0); treePHSP[i]->SetBranchStatus("B_plus_ThetaK",1); treePHSP[i]->SetBranchStatus("B_plus_ThetaL",1); treePHSP[i]->SetBranchStatus("B_plus_Phi",1); treePHSP[i]->SetBranchStatus(Form("weight_%s",weightBranch.c_str()),1); treePHSP[i]->SetBranchStatus(Form("weight2D_%s",weightBranch.c_str()),1); treePHSP[i]->SetBranchAddress("B_plus_ThetaK",&angle[0][i]); treePHSP[i]->SetBranchAddress("B_plus_ThetaL",&angle[1][i]); treePHSP[i]->SetBranchAddress("B_plus_Phi",&angle[2][i]); treePHSP[i]->SetBranchAddress(Form("weight_%s",weightBranch.c_str()),&w[i]); treePHSP[i]->SetBranchAddress(Form("weight2D_%s",weightBranch.c_str()),&w2d[i]); } //initialize histograms int bins = 40;//100; double xLow[3] = {-1., -1., -TMath::Pi()}; double xHigh[3] = {+1., +1., +TMath::Pi()}; std::string theName[3] = {"cos(#theta_{K})", "cos(#theta_{L})", "#phi"}; std::string leName[3] = {"ctk", "ctl", "phi"}; TH1D * hRatio[3]; TH1D * hBefore[3]; TH1D * hAfter[3]; for(int h = 0; h < 3; h++){ hRatio [h] = new TH1D(Form("hRatio_%s" , leName[h].c_str()), Form("Ratio of %s after/before%s", theName[h].c_str(), (bweighted ? (" ("+weighzzz+")").c_str() : "")), bins, xLow[h], xHigh[h]); hBefore[h] = new TH1D(Form("hBefore_%s", leName[h].c_str()), Form("%s before BDT%s", theName[h].c_str(), (bweighted ? (" ("+weighzzz+")").c_str() : "")), bins, xLow[h], xHigh[h]); hAfter [h] = new TH1D(Form("hAfter_%s" , leName[h].c_str()), Form("%s after BDT%s", theName[h].c_str(), (bweighted ? (" ("+weighzzz+")").c_str() : "")), bins, xLow[h], xHigh[h]); hRatio [h]->Sumw2(); hBefore[h]->Sumw2(); hAfter [h]->Sumw2(); } //loop over events and save to histograms for(int i = 0; i < Na; i++){ if(i%10000==0 && i != 0)std::cout << "Loading data event " << i << " / " << Na << std::endl; treePHSP[1]->GetEntry(i); for(int a = 0; a < 3; a++){ if(a == 0 || a == 1){ //convert theta to cos(theta) angle[a][1] = TMath::Cos(angle[a][1]); } hRatio[a]->Fill(angle[a][1], bweighted ? (b2Dweighted ? w2d[1] : w[1]) : 1.); hAfter[a]->Fill(angle[a][1], bweighted ? (b2Dweighted ? w2d[1] : w[1]) : 1.); } } //loop over events and save to histograms for(int i = 0; i < Nb; i++){ if(i%10000==0 && i != 0)std::cout << "Loading data event " << i << " / " << Nb << std::endl; treePHSP[0]->GetEntry(i); for(int a = 0; a < 3; a++){ if(a == 0 || a == 1){ //convert theta to cos(theta) angle[a][0] = TMath::Cos(angle[a][0]); } hBefore[a]->Fill(angle[a][0], bweighted ? (b2Dweighted ? w2d[0] : w[0]) : 1.); } } double varMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double varMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double ratioMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double ratioMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double valb, vala, ratioval; for(int h = 0; h < 3; h++){ if(NormalizedRatio) hRatio [h]->Scale(hBefore[h]->Integral()/hRatio[h]->Integral()); //make ratio: hRatio[h]->Divide(hBefore[h]); //set correct ranges for the histograms: for(int bin = 1; bin <= bins; bin++){ valb = hBefore[h]->GetBinContent(bin); vala = hAfter[h] ->GetBinContent(bin); ratioval = hRatio[h] ->GetBinContent(bin); if(varMax[h] <= vala) varMax[h] = vala; if(varMax[h] <= valb) varMax[h] = valb; if(ratioMax[h] <= ratioval)ratioMax[h] = ratioval; if(varMin[h] >= vala) varMin[h] = vala; if(varMin[h] >= valb) varMin[h] = valb; if(ratioMin[h] >= ratioval)ratioMin[h] = ratioval; } varMax[h] *= 1.1; if(varMin[h] < 0)varMin[h] *= 1.1; else varMin[h] = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(ratioMax[h] > 3.)ratioMax[h] = 3.; if(ratioMax[h] < 2.)ratioMax[h] = 2.; ratioMax[h] *= 1.1; //configurables for plotting float lowerPlotHeight = 0.6; //create two pads into one canvas TCanvas * theCanvas = new TCanvas(Form("theCanvas%s", leName[h].c_str()), Form("ratio and superposition of %s" , theName[h].c_str())); float textsize = gStyle->GetTextSize(); TPad * pad1 = new TPad(Form("pad1%s", leName[h].c_str()), "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad * pad2 = new TPad(Form("pad2%s", leName[h].c_str()), "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hRatio[h]->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hRatio[h]->GetXaxis()->SetLabelSize(0.0);//don't print labels hRatio[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hRatio[h]->GetXaxis()->SetTickLength(hRatio[h]->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hRatio[h]->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hRatio[h]->GetYaxis()->SetTitle("ratio"); hRatio[h]->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hRatio[h]->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hRatio[h]->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); if(NormalizedRatio) hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.5); else hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.0); hRatio[h]->Draw("E1"); TLine * unityline = new TLine(xLow[h], 1, xHigh[h], 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); if(NormalizedRatio) unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hBefore[h]->GetXaxis()->SetTitleOffset(1.05); hBefore[h]->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hBefore[h]->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hBefore[h]->GetXaxis()->SetTickLength (hRatio[h]->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hBefore[h]->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hBefore[h]->GetXaxis()->SetTitle(theName[h].c_str()); hBefore[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hBefore[h]->GetYaxis()->SetRangeUser(varMin[h], varMax[h]); hBefore[h]->GetYaxis()->SetTitle("events"); hBefore[h]->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hBefore[h]->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hBefore[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hBefore[h]->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hBefore[h]->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hBefore[h]->Draw("E1"); hAfter[h]->SetLineColor(2); hAfter[h]->SetMarkerColor(2); hAfter[h]->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.4; float LegendYposition = 0.3; TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); leg->AddEntry(hAfter[h],"After BDT cut", "lpe"); leg->AddEntry(hBefore[h],"Before BDT cut", "lpe"); leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "simulation", 1, 1/lowerPlotHeight); if (Kst2Kspiplus)theCanvas->Print(Form("%s/ComparePlots/%i_%s%s_Comparison%sBeforeAndAfterBDTcut_%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), (b2Dweighted ? "2D" : ""), leName[h].c_str())); else theCanvas->Print(Form("%s/ComparePlots/%i_%s_Comparison%sBeforeAndAfterBDTcut_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), (b2Dweighted ? "2D" : ""), leName[h].c_str())); theCanvas->Close(); delete theCanvas; delete hAfter [h]; delete hBefore[h]; delete hRatio [h]; } delete treePHSP[0]; delete treePHSP[1]; return 1; } int compareAllPHSPAnglesBeforeAndAfterBDT(int Run = 1){ bool bWeights = true; bool b2Dweights = true; std::vectoryears = yearsVectorInt(true,false,true,Run); for(int y = 0; y < years.size(); y++){ if(compareAnglesInPHSPbeforeAndAfterBDTcut(years.at(y), bWeights, b2Dweights, false) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + (Kst2Kspiplus && SplitDDandLL ? " (DD tracks)" : "") ); return 0; } if(Kst2Kspiplus && SplitDDandLL){ if(compareAnglesInPHSPbeforeAndAfterBDTcut(years.at(y), bWeights, b2Dweights, true) == 0){ coutERROR("Failed to compare angles for " + to_string(years.at(y)) + " (LL tracks)" ); return 0; } } } return 1; } ///////////////////////////////////////////////////// /// /// comparison of nTracks and B_plus_PT between signal and reference channel MC /// ///////////////////////////////////////////////////// int compareNTracksAndBplusPT(int year = 2011, bool KshortDecayInVelo = true){ gROOT->SetBatch(kTRUE); gStyle -> SetOptStat(0); LHCbStyle(); bool NormalizedRatio = true; if(year > 2012){ std::cout << "No Reference MC for Run II available. Abort!" << std::endl; return 0; } //put both magnet polarities into one TChain TChain * treeMC[2]; treeMC[0] = new TChain("DecayTreeTruthMatched"); treeMC[1] = new TChain("DecayTreeTruthMatched"); if(Kst2Kpluspi0Resolved){ treeMC[0]->Add(Form("%s/data/MC/%i_KplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); treeMC[1]->Add(Form("%s/data/MC/%i_RefKplusPi0Resolved_BDTinput.root", path_to_output_KplusPizero.c_str(), year)); } else if(Kst2Kspiplus){ treeMC[0]->Add(Form("%s/data/MC/%i_KshortPiplus%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); treeMC[1]->Add(Form("%s/data/MC/%i_KshortPiplusRef%s_BDTinput.root", path_to_output_KshortPiplus.c_str(), year, (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""))); } int N[2]; N[0] = treeMC[0]->GetEntries(); N[1] = treeMC[1]->GetEntries(); if(N[0] == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/MC/%i_%s%s_BDTinput.root", year, TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "")) << std::endl; return 0; } if(N[1] == 0){ std::cout << Form("[ERROR]\t\tNo events found in file data/MC/%i_%sRef%s_BDTinput.root", year, TheDecay.c_str(), (Kst2Kspiplus && SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : "")) << std::endl; return 0; } const int nVars = 2; double var[nVars][2];//nTracks, B_plus_PT; int varNtracks[2]; std::string theName[nVars] = {"nTracks", "p_{T}(B^{+})"}; std::string leName[nVars] = {"nTracks", "B_plus_PT"}; double xLow[nVars] = {-0.5 , 0.}; double xHigh[nVars] = {599.5, 60000.}; for(int i = 0; i < 2; i++){ //deactivate all branches exept the one of intrest! treeMC[i]->SetBranchStatus("*",0); treeMC[i]->SetBranchStatus("nTracks",1); treeMC[i]->SetBranchStatus(UseDTF ? "B_plus_PT_DTF" : "B_plus_PT",1); treeMC[i]->SetBranchAddress("nTracks",&varNtracks[i]); treeMC[i]->SetBranchAddress(UseDTF ? "B_plus_PT_DTF" : "B_plus_PT",&var[1][i]); } //initialize histograms int bins = 100; TH1D * hRatio[nVars]; TH1D * hSignal[nVars]; TH1D * hRefere[nVars]; for(int h = 0; h < nVars; h++){ hRatio [h] = new TH1D(Form("hRatio_%s" , leName[h].c_str()), Form("Ratio of %s signal/ref", theName[h].c_str()), bins, xLow[h], xHigh[h]); hSignal[h] = new TH1D(Form("hSignal_%s", leName[h].c_str()), Form("%s (Signal)", theName[h].c_str()), bins, xLow[h], xHigh[h]); hRefere[h] = new TH1D(Form("hRefere_%s", leName[h].c_str()), Form("%s (Ref)" , theName[h].c_str()), bins, xLow[h], xHigh[h]); hRatio [h]->Sumw2(); hSignal[h]->Sumw2(); hRefere[h]->Sumw2(); } //loop over events and save to histograms for(int n = 0; n < 2; n++){ for(int i = 0; i < N[n]; i++){ if(i%1000==0 && i != 0)std::cout << "Loading data event " << i << " / " << N[n] << std::endl; treeMC[n]->GetEntry(i); for(int v = 0; v < nVars; v++){ if(v == 0){ //use int link to variable (only nTracks) if(n == 0){ hRatio [v]->Fill(varNtracks[n], 1.); hSignal[v]->Fill(varNtracks[n], 1.); } else{ hRefere[v]->Fill(varNtracks[n], 1.); } } else{ //use double link to variable if(n == 0){ hRatio [v]->Fill(var[v][n], 1.); hSignal[v]->Fill(var[v][n], 1.); } else{ hRefere[v]->Fill(var[v][n], 1.); } } } } } double varMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double varMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double ratioMax[3] = {-1.0e8,-1.0e8,-1.0e8}; double ratioMin[3] = {+1.0e8,+1.0e8,+1.0e8}; double valb, vala, ratioval; for(int h = 0; h < nVars; h++){ if(NormalizedRatio){ hSignal[h]->Scale(1./hSignal[h]->Integral()); hRefere[h]->Scale(1./hRefere[h]->Integral()); hRatio [h]->Scale(1./hRatio[h] ->Integral()); } //make ratio: hRatio[h]->Divide(hRefere[h]); //set correct ranges for the histograms: for(int bin = 1; bin <= bins; bin++){ valb = hRefere[h]->GetBinContent(bin); vala = hSignal[h]->GetBinContent(bin); ratioval = hRatio[h] ->GetBinContent(bin); if(varMax[h] <= vala) varMax[h] = vala; if(varMax[h] <= valb) varMax[h] = valb; if(ratioMax[h] <= ratioval)ratioMax[h] = ratioval; if(varMin[h] >= vala) varMin[h] = vala; if(varMin[h] >= valb) varMin[h] = valb; if(ratioMin[h] >= ratioval)ratioMin[h] = ratioval; } varMax[h] *= 1.1; if(varMin[h] < 0)varMin[h] *= 1.1; else varMin[h] = 0.001; //if minimum is positve, set minimum to just above 0 to remove label if(ratioMax[h] > 3.)ratioMax[h] = 3.; if(ratioMax[h] < 2.)ratioMax[h] = 2.; ratioMax[h] *= 1.1; //configurables for plotting float lowerPlotHeight = 0.6; //create two pads into one canvas TCanvas * theCanvas = new TCanvas(Form("theCanvas%s", leName[h].c_str()), Form("ratio and superposition of %s" , theName[h].c_str())); float textsize = gStyle->GetTextSize(); TPad * pad1 = new TPad(Form("pad1%s", leName[h].c_str()), "ratio",0.0,lowerPlotHeight,1.0,1.0,0); TPad * pad2 = new TPad(Form("pad2%s", leName[h].c_str()), "superposition",0.0,0.0,1.0,lowerPlotHeight,0); pad1->Draw(); pad2->Draw(); //modifiy pad for main plot pad1->Clear(); pad1->SetBorderSize (0); pad1->SetBottomMargin(1e-6); pad1->SetTopMargin(pad1->GetTopMargin() / ( 1 - lowerPlotHeight) ); pad1->cd(); //some axis-modifications on the main plot TGaxis::SetExponentOffset(1e+9,1e+9,"y");//offset = pad size * 1e+7 hRatio[h]->GetXaxis()->SetNoExponent(); //<-- spoils MaxDigits settings, so don't use it on other axis hRatio[h]->GetXaxis()->SetLabelSize(0.0);//don't print labels hRatio[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hRatio[h]->GetXaxis()->SetTickLength(hRatio[h]->GetXaxis()->GetTickLength()/(1-lowerPlotHeight)); hRatio[h]->GetXaxis()->SetNdivisions(gStyle->GetNdivisions("X")); hRatio[h]->GetYaxis()->SetTitle("ratio"); hRatio[h]->GetYaxis()->SetTitleSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetLabelSize(textsize/(1-lowerPlotHeight)); hRatio[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hRatio[h]->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y")); hRatio[h]->GetYaxis()->SetTitleOffset(1.06*(1-lowerPlotHeight)); if(NormalizedRatio) hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.5); else hRatio[h]->GetYaxis()->SetRangeUser(0.5, 1.0); hRatio[h]->Draw("E1"); TLine * unityline = new TLine(xLow[h], 1, xHigh[h], 1); unityline->SetLineStyle(2); unityline->SetLineColor(4); if(NormalizedRatio) unityline->Draw("SAME"); pad2->Clear(); pad2->SetBorderSize (0); pad2->SetTopMargin (1e-6); pad2->SetBottomMargin(pad2->GetBottomMargin() / lowerPlotHeight ); pad2->cd(); TGaxis::SetExponentOffset(1e+9,1e+9,"x");//offset = pad size * 1e+7 hRefere[h]->GetXaxis()->SetTitleOffset(1.05); hRefere[h]->GetXaxis()->SetTitleSize (textsize/lowerPlotHeight); hRefere[h]->GetXaxis()->SetLabelSize (textsize/lowerPlotHeight); hRefere[h]->GetXaxis()->SetTickLength (hRatio[h]->GetXaxis()->GetTickLength()/(lowerPlotHeight/(1-lowerPlotHeight))); hRefere[h]->GetXaxis()->SetNdivisions (gStyle->GetNdivisions("X")); hRefere[h]->GetXaxis()->SetTitle(theName[h].c_str()); hRefere[h]->GetXaxis()->SetRangeUser(xLow[h], xHigh[h]); hRefere[h]->GetYaxis()->SetRangeUser(varMin[h], varMax[h]); hRefere[h]->GetYaxis()->SetTitle("events"); hRefere[h]->GetYaxis()->SetLabelSize (textsize/lowerPlotHeight); hRefere[h]->GetYaxis()->SetTitleSize (textsize/lowerPlotHeight); hRefere[h]->GetYaxis()->SetTickLength(hRatio[h]->GetYaxis()->GetTickLength()); hRefere[h]->GetYaxis()->SetNdivisions (gStyle->GetNdivisions("Y")); hRefere[h]->GetYaxis()->SetTitleOffset(1.06*lowerPlotHeight); hRefere[h]->Draw("E1"); hSignal[h]->SetLineColor(2); hSignal[h]->SetMarkerColor(2); hSignal[h]->Draw("E1SAME"); //Legend and position... float LegendXposition = 0.65; float LegendYposition = 0.35; TLegend * leg = new TLegend(LegendXposition,LegendYposition,LegendXposition + 0.25, LegendYposition + 0.18); leg->AddEntry(hSignal[h],"Signal", "lpe"); leg->AddEntry(hRefere[h],"Referenz", "lpe"); leg->SetTextSize(0.04/lowerPlotHeight); // works fine leg->Draw("same"); addLHCbtag(LegendXposition, LegendYposition + 0.27, "simulation", 1, 1/lowerPlotHeight); if (Kst2Kspiplus)theCanvas->Print(Form("%s/ComparePlots/%i_%s%s_Comparison_Signal_vs_Ref_%s.eps", path_to_output_KshortPiplus.c_str(), year, TheDecay.c_str(), (SplitDDandLL ? (KshortDecayInVelo ? "_LL" : "_DD") : ""), leName[h].c_str())); else theCanvas->Print(Form("%s/ComparePlots/%i_%s_Comparison_Signal_vs_Ref_%s.eps", path_to_output_KplusPizero.c_str(), year, TheDecay.c_str(), leName[h].c_str())); theCanvas->Close(); delete theCanvas; delete hSignal [h]; delete hRefere[h]; delete hRatio [h]; } delete treeMC[0]; delete treeMC[1]; std::cout << "ALL GOOD" << std::endl; return 1; } int compareAllNtracksAndBplusPT(int Run = 1){ std::vectoryears = yearsVectorInt(true,false,false,Run); for(int y = 0; y < years.size(); y++){ if(compareNTracksAndBplusPT(years.at(y), false) == 0){ coutERROR("Failed to compare nTracks and B_plus_PT for " + to_string(years.at(y)) + (Kst2Kspiplus && SplitDDandLL ? " (DD tracks)" : "") ); return 0; } if(Kst2Kspiplus && SplitDDandLL){ if(compareNTracksAndBplusPT(years.at(y), true) == 0){ coutERROR("Failed to compare nTracks and B_plus_PT for " + to_string(years.at(y)) + " (LL tracks)"); return 0; } } } return 1; } ///////////////////////////////////////////////////// /// /// comparison Kplus and Kshort /// ///////////////////////////////////////////////////// int compareAllKplusKshort(bool sWeightKplus = false,bool sWeightKshort = true, bool bWeighted = true, bool b2DWeighted = false, int Run = 1, bool KshortDecayInVelo = true, std::string weightBranch = "nTracks"){ checkRun(Run); bool save2file = true; int nYear = (Run == 1 ? 2011 : 2015); //#TODO somehow 2011 throws out a segfault while(nYear < (Run == 1 ? 2013 : 2018)){ //Global compareVariablesKplusKshort(nYear, "nTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "nLongTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "nVeloTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "nTTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "nUpstreamTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "nDownstreamTracks", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); ///B+ compareVariablesKplusKshort(nYear, (UseDTF?"B_plus_PT_DTF":"B_plus_PT"), sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "B_plus_DIRA_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 1, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "B_plus_OWNPV_CHI2", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 1, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "B_plus_FD_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "B_plus_IP_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "B_plus_IPCHI2_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 1, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, (UseDTF ? "B_plus_ETA_DTF":"B_plus_ETA"), sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); /// K* compareVariablesKplusKshort(nYear, (UseDTF ? "K_star_plus_PT_DTF":"K_star_plus_PT"), sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, (UseDTF ? "K_star_plus_ETA_DTF":"K_star_plus_ETA"), sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "K_star_plus_IPCHI2_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 0, 0, save2file, KshortDecayInVelo, weightBranch); /// mu compareVariablesKplusKshort(nYear, "mu_plus_IPCHI2_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 1, 0, save2file, KshortDecayInVelo, weightBranch); compareVariablesKplusKshort(nYear, "mu_minus_IPCHI2_OWNPV", sWeightKplus, sWeightKshort, bWeighted, b2DWeighted, 1, 0, save2file, KshortDecayInVelo, weightBranch); nYear++; } return 1; } int compareAllKplusAllRunsAndWeights(bool bWeighted = true, bool b2DWeighted = false){ if (compareAllKplusKshort (true, true, bWeighted, b2DWeighted, 1, true) ==0) return 0; if (compareAllKplusKshort (true, true, bWeighted, b2DWeighted, 1, false) ==0) return 0; // if (compareAllKplusKshort (true, false, bWeighted, b2DWeighted, 1)==0) return 0; // if (compareAllKplusKshort (false, true, bWeighted, b2DWeighted, 1)==0) return 0; if (compareAllKplusKshort (false, false, bWeighted, b2DWeighted, 1, true) ==0) return 0; if (compareAllKplusKshort (false, false, bWeighted, b2DWeighted, 1, false) ==0) return 0; if (compareAllKplusKshort (true, true, bWeighted, b2DWeighted, 2)==0) return 0; if (compareAllKplusKshort (true, true, bWeighted, b2DWeighted, 2)==0) return 0; // if (compareAllKplusKshort (true, false, bWeighted, b2DWeighted, 2)==0) return 0; // if (compareAllKplusKshort (false, true, bWeighted, b2DWeighted, 2)==0) return 0; if (compareAllKplusKshort (false, false, bWeighted, b2DWeighted, 2, true) ==0) return 0; if (compareAllKplusKshort (false, false, bWeighted, b2DWeighted, 2, false) ==0) return 0; return 1; }