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.
 
 
 
 

708 lines
35 KiB

//Truth matching of MC data for the decay B+->Kst+mumu
//david gerick
//Renata Kopecna
#include "GlobalFunctions.hh"
#include "Design.hpp"
#include "MassFit.hpp"
#include "Paths.hpp"
#include "TMsource.cpp"
bool FixParameters = false;
using namespace std;
using namespace RooFit ;
//////////////////////////////////////////////////////
/// MCtruth()
/// compares the particleID of all reconstructed particles in the chain with the trueID
/// ID-check of the (grand)mother particles will be performed!
///
/// TruthMatchAll()
/// run the MCtruth() for all four configurations of 2011/2012 and down/up
///
/// PlotTruthMatchingEfficienciesToPDF()
/// Take the four TGraphErrors from the TFile, plot them nicely into canvases and print it to pdf files in a dedicated folder!
///
/// PlotAllTruthMatchingEfficienciesToPDF()
/// The function name explains it all ;)
///
Double_t YieldBeforeTruthMatching = 0., YieldAfterTruthMatching = 0.;
Double_t YieldBeforeTruthMatchingErr = 0., YieldAfterTruthMatchingErr = 0.;
//1: passed gammas (both), 2: one passed, one converted, 3: both converted, 4: one passed, one random, 5: one converted, one random, 6: both failed
int passGammas(gamma_IDs gamma1, gamma_IDs gamma2, counters *counter,
bool B_plus_TM, bool K_star_plus_TM, bool pi_zero_TM, bool gamma_TM, bool gamma_TM_full){
bool pass1 = gamma1.isGammaTrue(counter,gamma_TM,gamma_TM_full,pi_zero_TM,K_star_plus_TM,B_plus_TM);
bool pass2 = gamma2.isGammaTrue(counter,gamma_TM,gamma_TM_full,pi_zero_TM,K_star_plus_TM,B_plus_TM);
bool conv1 = gamma1.isGammaConversion(counter,gamma_TM,pi_zero_TM,K_star_plus_TM);
bool conv2 = gamma2.isGammaConversion(counter,gamma_TM,pi_zero_TM,K_star_plus_TM);
if (pass1 && pass2){
coutDebug("Both gammas passed.");
return 1;
}
else{
if (pass1 || pass2){
if (conv1 || conv2){
coutDebug("One gamma passed, one is converted.");
return 2;
}
else{
coutDebug("One gamma passed, one is random.");
return 4;
}
}
else{
if (conv1 && conv2){
coutDebug("Both gammas are converted.");
return 3;
}
else{
if (conv1 || conv2){
coutDebug("One gamma is converted, one is random.");
return 5;
}
else{
coutDebug("Both gammas failed.");
return 6;
}
}
}
}
}
bool passAllTM(B_plus_IDs B_plus,K_star_IDs K_star,J_psi_IDs J_psi,mu_IDs mu_plus, mu_IDs mu_minus,
K_plus_IDs K_plus,pi_zero_IDs pi_zero,
K_short_IDs K_short,pi_plus_IDs pi_plus,Ks_pi_IDs Ks_pi_plus, Ks_pi_IDs Ks_pi_minus,
counters *counter,double pi_zero_resolved_M, double B_plus_M,
TH1D *h_pi0_mismatched_mass,TH1D *h_Bplus_M_pi0mismatched, TH1D *h_Bplus_M_noPi0Constr,TH1D *h_pi0_resolved_mass,TH1D *h_Bplus_M_pi0random,
bool B_plus_TM, bool K_star_plus_TM, bool K_plus_TM, bool pi_zero_TM, bool mu_TM, bool J_psi_TM, bool pi_zero_TM_full ){
if(!B_plus.isBplus(counter,B_plus_TM)) return false;
coutDebug("B+:\t passed");
if (!K_star.isKstar(counter,K_star_plus_TM, B_plus_TM))return false;
coutDebug("K*:\t passed");
if (!J_psi.isJpsi(counter,J_psi_TM, B_plus_TM))return false;
coutDebug("J/psi:\t passed");
if (!mu_plus.isMu(counter, mu_TM, J_psi_TM, B_plus_TM))return false;
coutDebug("Mu+:\t passed");
if (!mu_minus.isMu(counter, mu_TM, J_psi_TM, B_plus_TM))return false;
coutDebug("Mu-:\t passed");
if (Kst2Kspiplus){
if (!K_short.isKshort(counter)) return false;
if (!pi_plus.isPiPlus(counter)) return false;
if (!Ks_pi_plus.isKsPi(counter)) return false;
if (!Ks_pi_minus.isKsPi(counter)) return false;
}
else if (Kst2Kpluspi0Resolved){
if (!K_plus.isKplus(counter, K_plus_TM, K_star_plus_TM, B_plus_TM))return false;
coutDebug("K+:\t passed");
h_Bplus_M_noPi0Constr->Fill(B_plus_M);
if (pi_zero_TM_full){
if (!pi_zero.isPi0(counter, pi_zero_TM, K_star_plus_TM, B_plus_TM, pi_zero_resolved_M, B_plus_M, h_pi0_mismatched_mass, h_Bplus_M_pi0mismatched, h_pi0_resolved_mass)){
h_Bplus_M_pi0random->Fill(B_plus_M);
return false;
}
else coutDebug("pi0:\t passed");
}
}
return true;
}
Int_t MCtruth(string year = "2011", string magnet = "down", bool ReferenceChannel = false, bool PHSP = false, bool B0 = false, bool K1 = false, bool Inc = false) {
gSystem->Load("./Design_cpp.so");
if(ReferenceChannel && PHSP){
coutWarning("Cannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!");
PHSP = false;
}
//Load MC data from preselected TFile
TChain * treeMC = new TChain("DecayTree");
string string_input = "";
if (B0 || K1 || Inc) string_input = GetInputFileBkg(year, magnet, true, ReferenceChannel, B0, K1, Inc);
else string_input = GetInputFile(year,magnet,true,true,ReferenceChannel,PHSP,false);
treeMC->Add(string_input.c_str());
//Save TMed data
string string_output = "";
if (B0 || K1 || Inc) string_output = GetInputFileBkg(year, magnet, true, ReferenceChannel, B0, K1, Inc);
else string_output = GetInputFile(year,magnet,true,true,ReferenceChannel,PHSP,false);
replace(string_output,".root","_TM.root");
TFile * outputFile = outputFile = new TFile(string_output.c_str(), "RECREATE");
Int_t nEvents = treeMC->GetEntries();
if (nEvents==0){
coutERROR("No events in the tree! Exit.");
return 0;
}
//BKGCAT branch
Int_t BKGCAT = -10;
B_plus_IDs B_plus_ID;
K_star_IDs K_star_ID;
J_psi_IDs J_psi_ID(ReferenceChannel);
mu_IDs mu_plus_ID(ReferenceChannel);
mu_IDs mu_minus_ID(ReferenceChannel);
K_plus_IDs K_plus_ID;
pi_zero_IDs pi_zero_ID;
gamma_IDs gamma1_ID;
gamma_IDs gamma2_ID;
K_short_IDs K_short_ID;
pi_plus_IDs pi_plus_ID;
Ks_pi_IDs Ks_pi_plus_ID;
Ks_pi_IDs Ks_pi_minus_ID;
//link variables to branches
if(UseBKGCAT){
treeMC -> SetBranchAddress( "B_plus_BKGCAT" , &BKGCAT );
}
if (Kst2Kpluspi0Resolved){//I need control plots to check pi0 TM and so on
treeMC -> SetBranchAddress( "B_plus_TRUEID" , &B_plus_ID.B_plus_TRUEID );
treeMC -> SetBranchAddress( "K_star_plus_TRUEID" , &K_star_ID.K_star_plus_TRUEID );
treeMC -> SetBranchAddress( "mu_plus_TRUEID" , &mu_plus_ID.mu_TRUEID );
treeMC -> SetBranchAddress( "mu_minus_TRUEID" , &mu_minus_ID.mu_TRUEID );
treeMC -> SetBranchAddress( "K_star_plus_MC_MOTHER_ID" , &K_star_ID.K_star_plus_MOTHER_ID );
treeMC -> SetBranchAddress( "mu_plus_MC_MOTHER_ID" , &mu_plus_ID.mu_MOTHER_ID );
treeMC -> SetBranchAddress( "mu_minus_MC_MOTHER_ID" , &mu_minus_ID.mu_MOTHER_ID );
treeMC -> SetBranchAddress( "mu_plus_MC_GD_MOTHER_ID" , &mu_plus_ID.mu_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "mu_minus_MC_GD_MOTHER_ID" , &mu_minus_ID.mu_GD_MOTHER_ID );
if(Kst2Kpluspi0Resolved){
treeMC -> SetBranchAddress( "B_plus_BKGCAT" , &BKGCAT );
treeMC -> SetBranchAddress( "K_plus_TRUEID" , &K_plus_ID.K_plus_TRUEID );
treeMC -> SetBranchAddress( "pi_zero_resolved_TRUEID" , &pi_zero_ID.pi_zero_TRUEID );
treeMC -> SetBranchAddress( "gamma1_TRUEID" , &gamma1_ID.gamma_TRUEID );
treeMC -> SetBranchAddress( "gamma2_TRUEID" , &gamma2_ID.gamma_TRUEID );
treeMC -> SetBranchAddress( "K_plus_MC_MOTHER_ID" , &K_plus_ID.K_plus_MOTHER_ID );
treeMC -> SetBranchAddress( "pi_zero_resolved_MC_MOTHER_ID", &pi_zero_ID.pi_zero_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma1_MC_MOTHER_ID" , &gamma1_ID.gamma_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma2_MC_MOTHER_ID" , &gamma2_ID.gamma_MOTHER_ID );
treeMC -> SetBranchAddress( "K_plus_MC_GD_MOTHER_ID" , &K_plus_ID.K_plus_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "pi_zero_resolved_MC_GD_MOTHER_ID", &pi_zero_ID.pi_zero_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma1_MC_GD_MOTHER_ID" , &gamma1_ID.gamma_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma2_MC_GD_MOTHER_ID" , &gamma2_ID.gamma_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma1_MC_GD_GD_MOTHER_ID" , &gamma1_ID.gamma_GD_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "gamma2_MC_GD_GD_MOTHER_ID" , &gamma2_ID.gamma_GD_GD_MOTHER_ID );
}
if(Kst2Kspiplus){
treeMC -> SetBranchAddress( "K_short_TRUEID" , &K_short_ID.K_short_TRUEID );
treeMC -> SetBranchAddress( "pi_plus_TRUEID" , &pi_plus_ID.pi_plus_TRUEID );
treeMC -> SetBranchAddress( "Ks_pi_plus_TRUEID" , &Ks_pi_plus_ID.Ks_pi_TRUEID );
treeMC -> SetBranchAddress( "Ks_pi_minus_TRUEID" , &Ks_pi_minus_ID.Ks_pi_TRUEID );
treeMC -> SetBranchAddress( "K_short_MC_MOTHER_ID" , &K_short_ID.K_short_MOTHER_ID );
treeMC -> SetBranchAddress( "pi_plus_MC_MOTHER_ID" , &pi_plus_ID.pi_plus_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_plus_MC_MOTHER_ID" , &Ks_pi_plus_ID.Ks_pi_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_minus_MC_MOTHER_ID" ,&Ks_pi_minus_ID.Ks_pi_MOTHER_ID );
treeMC -> SetBranchAddress( "K_short_MC_GD_MOTHER_ID" , &K_short_ID.K_short_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "pi_plus_MC_GD_MOTHER_ID" , &pi_plus_ID.pi_plus_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_plus_MC_GD_MOTHER_ID" , &Ks_pi_plus_ID.Ks_pi_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_minus_MC_GD_MOTHER_ID" , &Ks_pi_minus_ID.Ks_pi_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_plus_MC_GD_GD_MOTHER_ID" , &Ks_pi_plus_ID.Ks_pi_GD_GD_MOTHER_ID );
treeMC -> SetBranchAddress( "Ks_pi_minus_MC_GD_GD_MOTHER_ID" , &Ks_pi_minus_ID.Ks_pi_GD_GD_MOTHER_ID );
}
treeMC -> SetBranchAddress( "J_psi_TRUEID" , &J_psi_ID.J_psi_TRUEID );
treeMC -> SetBranchAddress( "J_psi_MC_MOTHER_ID" , &J_psi_ID.J_psi_MOTHER_ID );
}
Int_t TRUE_events = 0;
//counter for BKGCAT:
Int_t BKGCAT_VETO[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Int_t BKGCAT_TRUE[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//control plots for pi0
Double_t pi_zero_resolved_M = 0.0;
if (Kst2Kpluspi0Resolved) treeMC -> SetBranchAddress( "pi_zero_resolved_M" , &pi_zero_resolved_M );
//Use either B mass from tuple or from DTF
Double_t B_plus_M;
UseDTF ? treeMC->SetBranchStatus( "B_plus_M_DTF", 1) : treeMC->SetBranchStatus( "B_plus_M", 1);
UseDTF ? treeMC->SetBranchAddress("B_plus_M_DTF", &B_plus_M): treeMC->SetBranchAddress("B_plus_M", &B_plus_M);
//Control pi0 histograms
TH1D * h_pi0_resolved_mass = generalHistogram("h_pi0_resolved_mass" , "m_{#pi^{0}} resolved", 70, 100, 170, "m_{pi^{0}} resolved [MeV]", "Counts / 1MeV", kBlue);
TH1D * h_pi0_mismatched_mass= generalHistogram("h_pi0_mismatched_mass" , "m_{#pi^{0}} IDed as gamma", 70, 100, 170, "m_{pi^{0}}[MeV] MisIDed", "Counts / 1MeV", kRed);
//Control B+ mass for pi0 correctly/wrong/no matched
TH1D * h_Bplus_M_pi0mismatched= BmassHistogram("", "m_{B^{+}}, #pi^{0} not #pi^{0}", "m_{B^{+}}[MeV] mismatched #pi^{0}",kRed);
TH1D * h_Bplus_M_pi0random = BmassHistogram("h_Bplus_M_pi0random", "m_{B^{+}}, #pi^{0} random", "m_{B^{+}}[MeV] random #pi^{0}",kBlue);
TH1D * h_Bplus_M_noPi0Constr = BmassHistogram("h_Bplus_M_noPi0Constr", "m_{B^{+}}, no #pi^{0} TM", "m_{B^{+}}[MeV], no #pi^{0} TM",kBlack);
TH1D * h_Bplus_M_TM_BKGCAT = BmassHistogram("h_Bplus_M_TM_BKGCAT", "m_{B^{+}} TMed", "m_{B^{+}}[MeV] TMed(BKG CAT)",kGreen+2);
TH1D * h_Bplus_M_TMed = BmassHistogram("h_Bplus_M_TMed", "m_{B^{+}} TMed", "m_{B^{+}}[MeV] TMed",kGreen+2);
TH1D * h_Bplus_M_TMed_noPi0 = BmassHistogram("h_Bplus_M_TMed_noPi0", "m_{B^{+}} TMed, no #pi^{0}", "m_{B^{+}}[MeV] TMed, no #pi^{0}",kGreen+2);
TH1D * h_Bplus_M_TMed_noPi0_noBplus = BmassHistogram("h_Bplus_M_TMed_noPi0_noBplus", "m_{B^{+}} TMed, no #pi^{0}, B^{+}", "m_{B^{+}}[MeV] TMed, no #pi^{0}, B^{+}",kGreen+2);
TH1D * h_Bplus_M_TMed_noPi0_noKst_noBplus= BmassHistogram("h_Bplus_M_TMed_noPi0_noKst_noBplus", "m_{B^{+}} TMed, no #pi^{0}, K^{*}, B^{+}", "m_{B^{+}}[MeV] TMed, no #pi^{0}, K^{*}, B^{+}",kGreen+2);
TH1D * h_Bplus_M_notTM_BKGCAT = BmassHistogram("h_Bplus_M_notTM_BKGCAT", "m_{B^{+}} not TMed", "m_{B^{+}}[MeV] not TMed(BKG CAT)",kRed);
TH1D * h_Bplus_M_notTMed = BmassHistogram("h_Bplus_M_notTMed", "m_{B^{+}} not TMed", "m_{B^{+}}[MeV] not TMed",kRed);
TH1D * h_Bplus_M_notTMed_noPi0 = BmassHistogram("h_Bplus_M_notTMed_noPi0", "m_{B^{+}} not TMed, no #pi^{0}", "m_{B^{+}}[MeV] not TMed, no #pi^{0}",kRed);
TH1D * h_Bplus_M_notTMed_noPi0_noBplus = BmassHistogram("h_Bplus_M_notTMed_noPi0_noBplus", "m_{B^{+}} not TMed, no #pi^{0}, B^{+},", "m_{B^{+}}[MeV] not TMed, no #pi^{0}, B^{+}",kRed);
TH1D * h_Bplus_M_notTMed_noPi0_noKst_noBplus= BmassHistogram("h_Bplus_M_notTMed_noPi0_noKst_noBplus", "m_{B^{+}} not TMed, no #pi^{0}, K^{*}, B^{+}", "m_{B^{+}}[MeV] not TMed, no #pi^{0}, K^{*}, B^{+}",kRed);
TH1D * h_Bplus_M_all = BmassHistogram("h_Bplus_M_all", "m_{B^{+}} ", "m_{B^{+}}[MeV] preSel", kBlack);
//TMP empty histogram (filled when running over not pi0 TM)
TH1D * h_Bplus_M_tmp = BmassHistogram("h_Bplus_M_tmp", "m_{B^{+}}", "m_{B^{+}}[MeV]",kBlack);
//control PID plots
TH1D * h_B_plus_TRUEID = new TH1D("h_B_plus_TRUEID", "B^{+} TRUEID", 100000, -1, 99999);
TH1D * h_K_star_plus_TRUEID = new TH1D("h_K_star_plus_TRUEID", "K^{*+} TRUEID", 100000, -1, 99999);
TH1D * h_K_plus_TRUEID = new TH1D("h_K_plus_TRUEID", "K^{+} TRUEID", 100000, -1, 99999);
TH1D * h_pi_zero_TRUEID = new TH1D("h_pi_zero_TRUEID", "#pi^{0} TRUEID", 100000, -1, 99999);
TH1D * h_gamma_TRUEID = new TH1D("h_gamma_TRUEID", "#gamma TRUEID", 100000, -1, 99999);
TTree * treeTruthMatched = treeMC->CloneTree(0);
treeTruthMatched->SetName("DecayTreeTruthMatched");
//If needed to save the eents into a new file (when adding branches such as TMed), uncomment
//TMed branch //0: didn't pass TM,1: passed TM
Int_t iTMed = -1;
treeTruthMatched->Branch("TMed", &iTMed, "iTMed/I");
Int_t iTMedBKGCAT = -1;
treeTruthMatched->Branch("TMedBKGCAT", &iTMedBKGCAT, "iTMedBKGCAT/I");
Int_t iTMed_noPi0 = -1;
if (!KshortChannel) treeTruthMatched->Branch("TMed_noPi0", &iTMed_noPi0, "iTMed_noPi0/I");
Int_t iTMed_noPi0_noBplus = -1;
if (!KshortChannel) treeTruthMatched->Branch("TMed_noPi0_noBplus", &iTMed_noPi0_noBplus, "iTMed_noPi0_noBplus/I");
Int_t iTMed_noPi0_noKst_noBplus = -1;
if (!KshortChannel) treeTruthMatched->Branch("TMed_noPi0_noKst_noBplus", &iTMed_noPi0_noKst_noBplus, "iTMed_noPi0_noKst_noBplus/I");
//1: passed gammas (both), 2: one passed, one converted, 3: both converted, 4: one passed, one random, 5: one converted, one random, 6: both failed
Int_t TM_gammas = -1;
if (!KshortChannel) treeTruthMatched->Branch("TM_gammas", &TM_gammas, "TM_gammas/I");
Int_t TM_gammas_noPi0 = -1;
if (!KshortChannel) treeTruthMatched->Branch("TM_gammas_noPi0", &TM_gammas_noPi0, "TM_gammas_noPi0/I");
Int_t TM_gammas_noPi0_noBplus = -1;
if (!KshortChannel) treeTruthMatched->Branch("TM_gammas_noPi0_noBplus", &TM_gammas_noPi0_noBplus, "TM_gammas_noPi0_noBplus/I");
Int_t TM_gammas_noPi0_noKst_noBplus= -1;
if (!KshortChannel) treeTruthMatched->Branch("TM_gammas_noPi0_noKst_noBplus", &TM_gammas_noPi0_noKst_noBplus, "TM_gammas_noPi0_noKst_noBplus/I");
//initialize VETO counters
counters veto_counters;
counters veto_counters_noPi0;
counters veto_counters_noPi0_noBplus;
counters veto_counters_noPi0_noKst_noBplus;
//MC loop
coutInfo("Truth matching of " + to_string(nEvents) + " MC events for " + year + magnet + ".");
for(int i = 0; i < nEvents; i++){
if(i%2000==0 && i != 0)coutDebug("Loading MC event "+to_string(i) +" / " +to_string(nEvents));
treeMC->GetEntry(i);
h_Bplus_M_all->Fill(B_plus_M);
//Check the BKGCAT category and fill control histograms
if (isBKGCAT(BKGCAT,ReferenceChannel)){
BKGCAT_TRUE[BKGCAT/10]++;
iTMedBKGCAT = 1;
TRUE_events++;
h_Bplus_M_TM_BKGCAT->Fill(B_plus_M);
}
else{
BKGCAT_VETO[BKGCAT/10]++;
iTMedBKGCAT = 0;
h_Bplus_M_notTM_BKGCAT->Fill(B_plus_M);
}
//======================================
//check all particles for correct TRUEID
//======================================
if (B0 || K1){
//TODO
}
else{
if (Inc){
h_B_plus_TRUEID ->Fill(TMath::Abs(B_plus_ID.B_plus_TRUEID));
h_K_star_plus_TRUEID->Fill(TMath::Abs(K_star_ID.K_star_plus_TRUEID));
h_K_plus_TRUEID ->Fill(TMath::Abs(K_plus_ID.K_plus_TRUEID));
h_pi_zero_TRUEID ->Fill(TMath::Abs(pi_zero_ID.pi_zero_TRUEID));
}
iTMed = passAllTM(B_plus_ID,K_star_ID,J_psi_ID,mu_plus_ID,mu_minus_ID,
K_plus_ID,pi_zero_ID,
K_short_ID,pi_plus_ID,Ks_pi_plus_ID,Ks_pi_minus_ID,
&veto_counters, pi_zero_resolved_M, B_plus_M,
h_pi0_mismatched_mass,h_Bplus_M_pi0mismatched, h_Bplus_M_noPi0Constr, h_pi0_resolved_mass, h_Bplus_M_pi0random,
true, true, true, true, true, true, true);
iTMed_noPi0 = passAllTM(B_plus_ID,K_star_ID,J_psi_ID,mu_plus_ID,mu_minus_ID,
K_plus_ID,pi_zero_ID,
K_short_ID,pi_plus_ID,Ks_pi_plus_ID,Ks_pi_minus_ID,
&veto_counters_noPi0, pi_zero_resolved_M, B_plus_M,
h_pi0_mismatched_mass,h_Bplus_M_pi0mismatched, h_Bplus_M_tmp, h_pi0_resolved_mass, h_Bplus_M_tmp,
true, true, true, false, true, true, false);
iTMed_noPi0_noBplus = passAllTM(B_plus_ID,K_star_ID,J_psi_ID,mu_plus_ID,mu_minus_ID,
K_plus_ID,pi_zero_ID,
K_short_ID,pi_plus_ID,Ks_pi_plus_ID,Ks_pi_minus_ID,
&veto_counters_noPi0_noBplus, pi_zero_resolved_M, B_plus_M,
h_pi0_mismatched_mass,h_Bplus_M_pi0mismatched, h_Bplus_M_tmp, h_pi0_resolved_mass, h_Bplus_M_tmp,
false, true, true, false, true, true, true);
iTMed_noPi0_noKst_noBplus= passAllTM(B_plus_ID,K_star_ID,J_psi_ID,mu_plus_ID,mu_minus_ID,
K_plus_ID,pi_zero_ID,
K_short_ID,pi_plus_ID,Ks_pi_plus_ID,Ks_pi_minus_ID,
&veto_counters_noPi0_noKst_noBplus, pi_zero_resolved_M, B_plus_M,
h_pi0_mismatched_mass,h_Bplus_M_pi0mismatched, h_Bplus_M_tmp, h_pi0_resolved_mass, h_Bplus_M_tmp,
false, false, true, false, true, true, true);
}
if (Kst2Kpluspi0Resolved){
TM_gammas = passGammas(gamma1_ID,gamma2_ID,&veto_counters, true,true,true,true,true);
TM_gammas_noPi0 = passGammas(gamma1_ID,gamma2_ID,&veto_counters, true,true,false,true,true);
TM_gammas_noPi0_noBplus = passGammas(gamma1_ID,gamma2_ID,&veto_counters, false,true,false,true,true);
TM_gammas_noPi0_noKst_noBplus =passGammas(gamma1_ID,gamma2_ID,&veto_counters, false,false,false,true,true);
}
if (iTMed) h_Bplus_M_TMed->Fill(B_plus_M);
else h_Bplus_M_notTMed->Fill(B_plus_M);
if (iTMed_noPi0) h_Bplus_M_TMed_noPi0->Fill(B_plus_M);
else h_Bplus_M_notTMed_noPi0->Fill(B_plus_M);
if (iTMed_noPi0_noBplus) h_Bplus_M_TMed_noPi0_noBplus->Fill(B_plus_M);
else h_Bplus_M_notTMed_noPi0_noBplus->Fill(B_plus_M);
if (iTMed_noPi0_noKst_noBplus) h_Bplus_M_TMed_noPi0_noKst_noBplus->Fill(B_plus_M);
else h_Bplus_M_notTMed_noPi0_noKst_noBplus->Fill(B_plus_M);
treeTruthMatched->Fill();
}//loop over events end
//output truthmatching results
coutInfo("Resulting TruthMatching data: " + to_string(TRUE_events) + "/" + to_string(nEvents) + " are found to be correctly reconstructed!" );
coutInfo("For the sample: " + year + " " + magnet + ":\t" + (ReferenceChannel ? "JpsiChannel" : (PHSP ? "PHSP" : "Signal")) + " MC events" );
coutInfo("The following BKGCAT have been found in the sample:" );
coutInfo("BKGCAT\tAccepted\tRejected\tTotal");
for(int i = 0; i < 20; i++){
if(BKGCAT_VETO[i] != 0 || BKGCAT_TRUE[i] != 0){
coutInfo(to_string(i*10) + "\t" + to_string(BKGCAT_TRUE[i]) + "\t\t" + to_string(BKGCAT_VETO[i]) + "\t\t" + to_string(BKGCAT_TRUE[i]+BKGCAT_VETO[i]) );
}
}
veto_counters.printCounters(B0,K1);
veto_counters_noPi0.printCounters(false,false);
veto_counters_noPi0_noBplus.printCounters(false,false);
veto_counters_noPi0_noKst_noBplus.printCounters(false,false);
if(!outputFile->IsOpen()){
coutERROR("ile was not opened succesfully!");
return 0;
}
outputFile->cd();
treeTruthMatched->Write("",TObject::kWriteDelete);
if (Kst2Kpluspi0Resolved){
//Save hists into a file
string path = GetInputFile(year,magnet,true,true,ReferenceChannel,PHSP, false);
replace(path,".root", "_TMcontrolPlots.root");
TFile *controlHists = new TFile(path.c_str(),"RECREATE");
gROOT->SetBatch(kTRUE);
controlHists->cd();
h_Bplus_M_pi0mismatched->Write("",TObject::kWriteDelete);
h_Bplus_M_pi0random->Write("",TObject::kWriteDelete);
h_Bplus_M_noPi0Constr->Write("",TObject::kWriteDelete);
h_Bplus_M_TM_BKGCAT->Write("",TObject::kWriteDelete);
h_Bplus_M_notTM_BKGCAT->Write("",TObject::kWriteDelete);
h_Bplus_M_TMed->Write("",TObject::kWriteDelete);
h_Bplus_M_notTMed->Write("",TObject::kWriteDelete);
h_Bplus_M_TMed_noPi0->Write("",TObject::kWriteDelete);
h_Bplus_M_notTMed_noPi0->Write("",TObject::kWriteDelete);
h_Bplus_M_TMed_noPi0_noBplus->Write("",TObject::kWriteDelete);
h_Bplus_M_notTMed_noPi0_noBplus->Write("",TObject::kWriteDelete);
h_Bplus_M_TMed_noPi0_noKst_noBplus->Write("",TObject::kWriteDelete);
h_Bplus_M_notTMed_noPi0_noKst_noBplus->Write("",TObject::kWriteDelete);
h_Bplus_M_all->Write("",TObject::kWriteDelete);
if (Inc){
h_B_plus_TRUEID->Write("",TObject::kWriteDelete);
h_K_star_plus_TRUEID->Write("",TObject::kWriteDelete);
h_K_plus_TRUEID->Write("",TObject::kWriteDelete);
h_pi_zero_TRUEID->Write("",TObject::kWriteDelete);
h_gamma_TRUEID->Write("",TObject::kWriteDelete);
}
h_pi0_mismatched_mass->Write("",TObject::kWriteDelete);
h_pi0_resolved_mass->Write("",TObject::kWriteDelete);
//Draw and save
TM_canvas("Check_pi0", h_pi0_resolved_mass,h_pi0_mismatched_mass, h_pi0_mismatched_mass, year,ReferenceChannel,PHSP, B0, K1, Inc);
TM_canvas("BKGCAT", h_Bplus_M_all,h_Bplus_M_TM_BKGCAT, h_Bplus_M_notTM_BKGCAT, year,ReferenceChannel,PHSP, B0, K1, Inc);
TM_canvas("TMed", h_Bplus_M_all,h_Bplus_M_TMed, h_Bplus_M_notTMed, year,ReferenceChannel,PHSP, B0, K1, Inc);
TM_canvas("TMed_noPi0", h_Bplus_M_all,h_Bplus_M_TMed_noPi0, h_Bplus_M_notTMed_noPi0, year,ReferenceChannel,PHSP, B0, K1, Inc);
TM_canvas("TMed_noPi0_noBplus", h_Bplus_M_all,h_Bplus_M_TMed_noPi0_noBplus, h_Bplus_M_notTMed_noPi0_noBplus, year,ReferenceChannel,PHSP, B0, K1, Inc);
TM_canvas("TMed_noPi0_noKst_noBplus", h_Bplus_M_all,h_Bplus_M_TMed_noPi0_noKst_noBplus,h_Bplus_M_notTMed_noPi0_noKst_noBplus, year,ReferenceChannel,PHSP, B0, K1, Inc);
controlHists->Close();
}
delete h_Bplus_M_pi0mismatched;
delete h_Bplus_M_pi0random;
delete h_Bplus_M_noPi0Constr;
delete h_Bplus_M_all;
delete h_Bplus_M_TM_BKGCAT;
delete h_Bplus_M_notTM_BKGCAT;
delete h_Bplus_M_TMed;
delete h_Bplus_M_notTMed;
delete h_Bplus_M_TMed_noPi0;
delete h_Bplus_M_notTMed_noPi0;
delete h_Bplus_M_TMed_noPi0_noBplus;
delete h_Bplus_M_notTMed_noPi0_noBplus;
delete h_Bplus_M_TMed_noPi0_noKst_noBplus;
delete h_Bplus_M_notTMed_noPi0_noKst_noBplus;
delete h_B_plus_TRUEID;
delete h_K_star_plus_TRUEID;
delete h_K_plus_TRUEID;
delete h_pi_zero_TRUEID;
delete h_gamma_TRUEID;
delete h_pi0_mismatched_mass;
delete h_pi0_resolved_mass;
delete treeMC;
delete treeTruthMatched;
outputFile->Close();
string command = "mv " + string_input + " ";
replace(string_input,".root","_TMbackup.root");
command += string_input;
system(command.c_str());
replace(string_input,"_TMbackup.root",".root");
command = "mv " + string_output + " " + string_input;
system(command.c_str());
coutInfo("Finished Truth-Matching for sample: " + year + " " + magnet + " : " + TheDecay + (ReferenceChannel ? " RefMC" : (PHSP ? " PHSP MC" : " ") ) );
return 1;
}
bool restore_from_backup(string year = "2011", string magnet = "down", bool ReferenceChannel = false, bool PHSP = false, bool B0 = false, bool K1 = false, bool Inc = false){
//In case one needs to rerun the TruthMatching
string string_input = "";
if (B0 || K1 || Inc) string_input = GetInputFileBkg(year, magnet, true, ReferenceChannel, B0, K1, Inc);
else string_input = GetInputFile(year,magnet,true,true,ReferenceChannel,PHSP,false);
replace(string_input,".root","_TMbackup.root");
string command = "mv " + string_input + " ";
replace(string_input,"_TMbackup.root",".root");
command += string_input;
coutDebug(command);
system(command.c_str());
coutInfo("Succesfully restored all MC for " + TheDecay + (ReferenceChannel ? " (Reference channel)" : "") + " in year " + year);
return 1;
}
bool restore_allyears_from_backup(int Run = 1, bool Reference = false, bool PHSP = false, bool B0 = false, bool K1 = false, bool Inc = false){
std::vector<string> years = (B0 || K1 || Inc) ? yearsBkgMC(Reference, B0, K1, Inc, Run) : yearsMC(Reference,PHSP,Run);
if (years.empty()){
coutERROR("Invalid Run number given: " + to_string(Run) + ". Exit program!");
return 0;
}
for(unsigned int y = 0; y < years.size(); y++){
if(restore_from_backup(years.at(y),"down", Reference, PHSP, B0, K1, Inc) == 0){
coutERROR("Failed to restore " + years.at(y) + " magnet DOWN for " + TheDecay + getDataTypeTag(true, Reference, PHSP, B0, K1, Inc) + " from backup");
return 0;
}
if(restore_from_backup(years.at(y),"up", Reference, PHSP, B0, K1, Inc) == 0){
coutERROR("Failed to restore " + years.at(y) + " magnet UP for " + TheDecay + getDataTypeTag(true, Reference, PHSP, B0, K1, Inc) +" from backup");
return 0;
}
coutInfo("Sucesfully restored " + years.at(y) + " magnet UP for " + TheDecay + getDataTypeTag(true, Reference, PHSP, B0, K1, Inc) +" from backup");
}
return 1;
}
bool restore_all_from_backup(){
if (restore_allyears_from_backup(12, false, false, false, false, false) ==0){
coutERROR("Failed to restore signal MC from backup!");
return 0;
}
if (restore_allyears_from_backup(12, true, false, false, false, false) ==0){
coutERROR("Failed to restore reference MC from backup!");
return 0;
}
if (restore_allyears_from_backup(12, false, true, false, false, false) ==0){
coutERROR("Failed to restore PHSP MC from backup!");
return 0;
}
coutInfo("Succesfully restored all MC for alls samples!");
return 1;
}
Int_t TruthMatchAllBkg(bool Reference = false, Int_t Run = 1, bool B0 = false, bool K1 = false, bool Inc = false){
std::vector<string> years = yearsBkgMC(Reference,B0,K1,Inc,Run);
if (years.empty()){
coutERROR("Invalid Run number given: " + to_string(Run) + ". Exit program!");
return 0;
}
for(unsigned int y = 0; y < years.size(); y++){
if(MCtruth(years.at(y),"down", Reference, false, B0, K1, Inc) == 0){
coutERROR("Failed to process " + years.at(y) + " magnet DOWN for " + TheDecay+ getDataTypeTag(true, Reference, false, B0, K1, Inc) + " from backup");
return 0;
}
if(MCtruth(years.at(y),"up", Reference, false, B0, K1, Inc) == 0){
coutERROR("Failed to process " + years.at(y) + " magnet UP for " + TheDecay + getDataTypeTag(true, Reference, false, B0, K1, Inc) + " from backup");
return 0;
}
}
coutInfo("Succesfully finished all truth-matching for " + TheDecay + getDataTypeTag(true, Reference, false, B0, K1, Inc) + " in Run" + to_string(Run));
return 1;
}
Int_t TruthMatchAll(bool Reference = false, bool PHSP = false, Int_t Run = 1){
std::vector<string> years = yearsMC(Reference,PHSP,Run);
if (years.empty()){
coutERROR("Invalid Run number given: " + to_string(Run) + ". Exit program!");
return 0;
}
for(unsigned int y = 0; y < years.size(); y++){
if(MCtruth(years.at(y),"down", Reference, PHSP, false, false, false) == 0){
coutERROR("Failed to process " + years.at(y) + " magnet DOWN for " + TheDecay + getDataTypeTag(true, Reference, PHSP, false, false, false) + " from backup");
return 0;
}
if(MCtruth(years.at(y),"up", Reference, PHSP, false, false, false) == 0){
coutERROR("Failed to process " + years.at(y) + " magnet UP for " + TheDecay + getDataTypeTag(true, Reference, PHSP, false, false, false) + " from backup");
return 0;
}
}
coutInfo("Succesfully finished all truth-matching for " + TheDecay + getDataTypeTag(true, Reference, PHSP, false, false, false) + " in Run" + to_string(Run));
return 1;
}
Int_t TruthMatchAllAll(Int_t Run){
if (TruthMatchAll(false, false, Run) ==0) return 0;
if (TruthMatchAll(true, false, Run) ==0) return 0;
if (TruthMatchAll(false, true, Run) ==0) return 0;
return 1;
}
//This is a reliq from the TM issue we had back in the day in DaVinci, not really used now
Int_t CombinePolarityPi0MisID(string year ="2011", bool ReferenceChannel = false, bool PHSP = false){
gROOT->SetBatch(kTRUE);
string filePath = "";
//Define combined TH1 and make it pretty
TH1D * h_Bplus_M_pi0mismatched= new TH1D("h_Bplus_M_pi0mismatched" , "m_{B^{+}}, #pi^{0} not TMed", 100, cut_B_plus_M_low, cut_B_plus_M_high);
TCanvas *canvas_B = new TCanvas("canvas", "#pi^0 TM check", 10,10, 1200,600);
design_canvas_Bmass(canvas_B,"#pi^0 TM check");
int counts = (cut_B_plus_M_high-cut_B_plus_M_low)/100;
design_lines(h_Bplus_M_pi0mismatched,"m_{B^{+}}, #pi^{0} not TMed","Counts / " + to_string(counts)+"MeV",kRed+1);
h_Bplus_M_pi0mismatched->GetYaxis()->SetTitleOffset(0.7);
string Magnets[] = {"down", "up"};
//Loop over polarities and load the histograms
for(string & magnet : Magnets){ //loop over both magnet polaritys
string path = GetInputFile(year,magnet,true,true,ReferenceChannel,PHSP, false);
replace(path,".root", "_TMcontrolPlots.root");
TFile *file = TFile::Open(path.c_str());
TH1D *tmp = (TH1D*)file->Get("h_Bplus_M_pi0mismatched");
h_Bplus_M_pi0mismatched->Add(tmp);
file->Close();
}
//Save the combined TH1 in a canvas
canvas_B->cd();
h_Bplus_M_pi0mismatched->Draw();
filePath = "./../../data/figures/pi0TM/" + year + (ReferenceChannel ? "_Ref":"") + (PHSP ? "_PHSP":"") + "_Bmass";
string adr = filePath + ".eps";
canvas_B->Print(adr.c_str(), "eps");
adr = filePath + ".root";
canvas_B->Print(adr.c_str(), "root");
return 1;
}
//Also obsolete (see one function up)
Int_t CombineYearsPi0MisID(Int_t Run =1, bool ReferenceChannel = false, bool PHSP = false){
gROOT->SetBatch(kTRUE);
string filePath = "";
//Define combined TH1 and make it pretty
TH1D * h_Bplus_M_pi0mismatched= new TH1D("h_Bplus_M_pi0mismatched" , "m_{B^{+}}, #pi^{0} not TMed", 100, cut_B_plus_M_low, cut_B_plus_M_high);
TCanvas *canvas_B = new TCanvas("canvas", "#pi^0 TM check", 10,10, 1200,600);
design_canvas_Bmass(canvas_B,"#pi^0 TM check");
int counts = (cut_B_plus_M_high-cut_B_plus_M_low)/100;
design_lines(h_Bplus_M_pi0mismatched,"m_{B^{+}}, #pi^{0} not TMed","Counts / " + to_string(counts)+"MeV",kRed+1);
h_Bplus_M_pi0mismatched->GetYaxis()->SetTitleOffset(0.7);
//Loop over years and polarities, load the histograms
std::vector<string> years;
if(Run == 1){
years.push_back("2011");
years.push_back("2012");
}
if(Run == 2){
years.push_back("2015");
years.push_back("2016");
if(Use2017 && !ReferenceChannel)years.push_back("2017");
if(Use2018 && !ReferenceChannel)years.push_back("2018");
}
string Magnets[] = {"down", "up"};
for(unsigned int y = 0; y < years.size(); y++){ //loop over all years
for(string & magnet : Magnets){ //loop over both magnet polaritys
string path = GetInputFile(years.at(y),magnet,true,true,ReferenceChannel,PHSP, false);
replace(path,".root", "_TMcontrolPlots.root");
TFile *file = TFile::Open(path.c_str());
TH1D *tmp = (TH1D*)file->Get("h_Bplus_M_pi0mismatched");
h_Bplus_M_pi0mismatched->Add(tmp);
file->Close();
}
}
//Save the combined TH1 in a canvas
canvas_B->cd();
h_Bplus_M_pi0mismatched->Draw();
filePath = "./../../data/figures/pi0TM/Run" + to_string(Run) + (ReferenceChannel ? "_Ref":"") + (PHSP ? "_PHSP":"") + "_Bmass";
string adr = filePath + ".eps";
canvas_B->Print(adr.c_str(), "eps");
adr = filePath + ".root";
canvas_B->Print(adr.c_str(), "root");
return 1;
}