Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

3684 lines
177 KiB

//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 <algorithm> // 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;
vector<int>years = 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";
vector<int>years = 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;
vector<int>years = 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<std::string> 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<int> 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::vector<int>years;
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::vector<int>years = 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::vector<int>years = 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::vector<int>years = 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;
}