282 lines
12 KiB
C++
282 lines
12 KiB
C++
|
//efficiency check of double misID filter in B+->Kst+mumu
|
||
|
//david gerick
|
||
|
|
||
|
|
||
|
#include "GlobalFunctions.hh"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace RooFit ;
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
/// DoubleMisIDcheck()
|
||
|
/// fake the double-misID of pi+ and mu+ and see how many would pass the double-misID filter from the preselection
|
||
|
///
|
||
|
///
|
||
|
///
|
||
|
|
||
|
int checkDoubleMisIDvetoEff(std::string year = "2011", std::string magnet = "down", bool PreSelAndTM = true) {
|
||
|
|
||
|
TChain* tree = 0;
|
||
|
|
||
|
//Kst2Kpluspi0 case
|
||
|
if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
|
||
|
std::cout << "[ERROR]\t\tNo double misID possible in pi0 channel!" << std::endl;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//Kst2Kspiplus case
|
||
|
if(Kst2Kspiplus){
|
||
|
if(PreSelAndTM){
|
||
|
tree=new TChain("DecayTreeTruthMatched");
|
||
|
tree->Add(GetInputFile(year,magnet,true,true,true,false,false).c_str());
|
||
|
}
|
||
|
else{
|
||
|
tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
|
||
|
tree->Add(GetInputFile(year,magnet,false,true,true,false,false).c_str());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int N = tree->GetEntries();
|
||
|
cout << "Old files contain " << N << " events" << endl;
|
||
|
|
||
|
if(N == 0){
|
||
|
std::cout << "[ERROR]\t\tTree has no entries. Exit!" << std::endl;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//Disable all branches
|
||
|
tree->SetBranchStatus("*",0);
|
||
|
|
||
|
tree->SetBranchStatus( "*PX", 1 );
|
||
|
tree->SetBranchStatus( "*PY", 1);
|
||
|
tree->SetBranchStatus( "*PZ", 1);
|
||
|
tree->SetBranchStatus( "*PE", 1);
|
||
|
|
||
|
//define variables
|
||
|
TLorentzVector LorVec_B_plus;
|
||
|
TLorentzVector LorVec_K_star_plus;
|
||
|
TLorentzVector LorVec_K_short;
|
||
|
TLorentzVector LorVec_pi_plus;
|
||
|
TLorentzVector LorVec_KS_pi_plus;
|
||
|
TLorentzVector LorVec_KS_pi_minus;
|
||
|
TLorentzVector LorVec_mu_minus;
|
||
|
TLorentzVector LorVec_mu_plus;
|
||
|
|
||
|
//potentially misIDed particles:
|
||
|
TLorentzVector LorVec_pi_plus_MisIDed;
|
||
|
TLorentzVector LorVec_mu_plus_MisIDed;
|
||
|
TLorentzVector LorVec_B_plus_From_DoubleMisIDed;
|
||
|
TLorentzVector LorVec_Jpsi_From_DoubleMisIDed;
|
||
|
TLorentzVector LorVec_K_star_plus_From_DoubleMisIDed;
|
||
|
|
||
|
//recombined particles:
|
||
|
TLorentzVector LorVec_DiMuon;
|
||
|
TLorentzVector LorVec_KaonPion;
|
||
|
TLorentzVector LorVec_ReconB;
|
||
|
TLorentzVector LorVec_KshortMuMu;
|
||
|
|
||
|
///B+
|
||
|
Double_t B_plus_PX = 0.;
|
||
|
Double_t B_plus_PY = 0.;
|
||
|
Double_t B_plus_PZ = 0.;
|
||
|
Double_t B_plus_PE = 0.;
|
||
|
|
||
|
///K*+
|
||
|
Double_t K_star_plus_PX = 0.;
|
||
|
Double_t K_star_plus_PY = 0.;
|
||
|
Double_t K_star_plus_PZ = 0.;
|
||
|
Double_t K_star_plus_PE = 0.;
|
||
|
|
||
|
///Kshort
|
||
|
Double_t K_short_PX = 0.;
|
||
|
Double_t K_short_PY = 0.;
|
||
|
Double_t K_short_PZ = 0.;
|
||
|
Double_t K_short_PE = 0.;
|
||
|
|
||
|
///pi+ (KS)
|
||
|
Double_t Ks_pi_plus_PX = 0.;
|
||
|
Double_t Ks_pi_plus_PY = 0.;
|
||
|
Double_t Ks_pi_plus_PZ = 0.;
|
||
|
Double_t Ks_pi_plus_PE = 0.;
|
||
|
|
||
|
Float_t f_Ks_pi_plus_PX_DTF[100];
|
||
|
Float_t f_Ks_pi_plus_PY_DTF[100];
|
||
|
Float_t f_Ks_pi_plus_PZ_DTF[100];
|
||
|
Float_t f_Ks_pi_plus_PE_DTF[100];
|
||
|
|
||
|
///pi- (KS)
|
||
|
Double_t Ks_pi_minus_PX = 0.;
|
||
|
Double_t Ks_pi_minus_PY = 0.;
|
||
|
Double_t Ks_pi_minus_PZ = 0.;
|
||
|
Double_t Ks_pi_minus_PE = 0.;
|
||
|
|
||
|
Float_t f_Ks_pi_minus_PX_DTF[100];
|
||
|
Float_t f_Ks_pi_minus_PY_DTF[100];
|
||
|
Float_t f_Ks_pi_minus_PZ_DTF[100];
|
||
|
Float_t f_Ks_pi_minus_PE_DTF[100];
|
||
|
|
||
|
///pi+
|
||
|
Double_t pi_plus_PX = 0.;
|
||
|
Double_t pi_plus_PY = 0.;
|
||
|
Double_t pi_plus_PZ = 0.;
|
||
|
Double_t pi_plus_PE = 0.;
|
||
|
|
||
|
Float_t f_pi_plus_PX_DTF[100];
|
||
|
Float_t f_pi_plus_PY_DTF[100];
|
||
|
Float_t f_pi_plus_PZ_DTF[100];
|
||
|
Float_t f_pi_plus_PE_DTF[100];
|
||
|
|
||
|
///mu-
|
||
|
Double_t mu_minus_PX = 0.;
|
||
|
Double_t mu_minus_PY = 0.;
|
||
|
Double_t mu_minus_PZ = 0.;
|
||
|
Double_t mu_minus_PE = 0.;
|
||
|
|
||
|
Float_t f_mu_minus_PX_DTF[100];
|
||
|
Float_t f_mu_minus_PY_DTF[100];
|
||
|
Float_t f_mu_minus_PZ_DTF[100];
|
||
|
Float_t f_mu_minus_PE_DTF[100];
|
||
|
|
||
|
///mu+
|
||
|
Double_t mu_plus_PX = 0.;
|
||
|
Double_t mu_plus_PY = 0.;
|
||
|
Double_t mu_plus_PZ = 0.;
|
||
|
Double_t mu_plus_PE = 0.;
|
||
|
|
||
|
Float_t f_mu_plus_PX_DTF[100];
|
||
|
Float_t f_mu_plus_PY_DTF[100];
|
||
|
Float_t f_mu_plus_PZ_DTF[100];
|
||
|
Float_t f_mu_plus_PE_DTF[100];
|
||
|
|
||
|
///////////////////////////////////////
|
||
|
/// LINK VARIABLES TO BRANCHES
|
||
|
///////////////////////////////////////
|
||
|
|
||
|
|
||
|
//particle masses and momenta
|
||
|
tree -> SetBranchAddress( "B_plus_PX" , &B_plus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_PY" , &B_plus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_PZ" , &B_plus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_PE" , &B_plus_PE );
|
||
|
|
||
|
tree -> SetBranchAddress( "K_star_plus_PX" , &K_star_plus_PX );
|
||
|
tree -> SetBranchAddress( "K_star_plus_PY" , &K_star_plus_PY );
|
||
|
tree -> SetBranchAddress( "K_star_plus_PZ" , &K_star_plus_PZ );
|
||
|
tree -> SetBranchAddress( "K_star_plus_PE" , &K_star_plus_PE );
|
||
|
|
||
|
tree -> SetBranchAddress( "K_short_PX" , &K_short_PX );
|
||
|
tree -> SetBranchAddress( "K_short_PY" , &K_short_PY );
|
||
|
tree -> SetBranchAddress( "K_short_PZ" , &K_short_PZ );
|
||
|
tree -> SetBranchAddress( "K_short_PE" , &K_short_PE );
|
||
|
|
||
|
tree -> SetBranchAddress( "pi_plus_PX" , &pi_plus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PX" , &f_pi_plus_PX_DTF );
|
||
|
tree -> SetBranchAddress( "pi_plus_PY" , &pi_plus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PY" , &f_pi_plus_PY_DTF );
|
||
|
tree -> SetBranchAddress( "pi_plus_PZ" , &pi_plus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PZ" , &f_pi_plus_PZ_DTF );
|
||
|
tree -> SetBranchAddress( "pi_plus_PE" , &pi_plus_PE );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PE" , &f_pi_plus_PE_DTF );
|
||
|
|
||
|
tree -> SetBranchAddress( "Ks_pi_minus_PX" , &Ks_pi_minus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PX" , &f_Ks_pi_minus_PX_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_minus_PY" , &Ks_pi_minus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PY" , &f_Ks_pi_minus_PY_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_minus_PZ" , &Ks_pi_minus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PZ" , &f_Ks_pi_minus_PZ_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_minus_PE" , &Ks_pi_minus_PE );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PE" , &f_Ks_pi_minus_PE_DTF );
|
||
|
|
||
|
tree -> SetBranchAddress( "Ks_pi_plus_PX" , &Ks_pi_plus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PX" , &f_Ks_pi_plus_PX_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_plus_PY" , &Ks_pi_plus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PY" , &f_Ks_pi_plus_PY_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_plus_PZ" , &Ks_pi_plus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PZ" , &f_Ks_pi_plus_PZ_DTF );
|
||
|
tree -> SetBranchAddress( "Ks_pi_plus_PE" , &Ks_pi_plus_PE );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PE" , &f_Ks_pi_plus_PE_DTF );
|
||
|
|
||
|
tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PX" , &f_mu_minus_PX_DTF );
|
||
|
tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PY" , &f_mu_minus_PY_DTF );
|
||
|
tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PZ" , &f_mu_minus_PZ_DTF );
|
||
|
tree -> SetBranchAddress( "mu_minus_PE" , &mu_minus_PE );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PE" , &f_mu_minus_PE_DTF );
|
||
|
|
||
|
tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PX" , &f_mu_plus_PX_DTF );
|
||
|
tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PY" , &f_mu_plus_PY_DTF );
|
||
|
tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PZ" , &f_mu_plus_PZ_DTF );
|
||
|
tree -> SetBranchAddress( "mu_plus_PE" , &mu_plus_PE );
|
||
|
tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PE" , &f_mu_plus_PE_DTF );
|
||
|
|
||
|
int n_DoubleMisID = 0;
|
||
|
|
||
|
bool IsBplus = true;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
///
|
||
|
/// loop over events
|
||
|
///
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
for(int i=0; i< N; i++){
|
||
|
|
||
|
//output the different counters!
|
||
|
if ((0ul == (i % 10000ul) || i + 1 == N) && i != 0)
|
||
|
cout << "Read event " << i << "/" << N << std::endl;
|
||
|
tree->GetEntry(i);
|
||
|
|
||
|
//define the Lorentz vectors
|
||
|
if(UseDTF){ //start useDTF for LorentzVectors
|
||
|
LorVec_mu_minus.SetPxPyPzE (f_mu_minus_PX_DTF[0], f_mu_minus_PY_DTF[0], f_mu_minus_PZ_DTF[0], f_mu_minus_PE_DTF[0]);
|
||
|
LorVec_mu_plus.SetPxPyPzE (f_mu_plus_PX_DTF[0], f_mu_plus_PY_DTF[0], f_mu_plus_PZ_DTF[0], f_mu_plus_PE_DTF[0]);
|
||
|
LorVec_pi_plus.SetPxPyPzE (f_pi_plus_PX_DTF[0], f_pi_plus_PY_DTF[0], f_pi_plus_PZ_DTF[0], f_pi_plus_PE_DTF[0]);
|
||
|
LorVec_KS_pi_plus.SetPxPyPzE (f_Ks_pi_plus_PX_DTF[0], f_Ks_pi_plus_PY_DTF[0], f_Ks_pi_plus_PZ_DTF[0], f_Ks_pi_plus_PE_DTF[0]);
|
||
|
LorVec_KS_pi_minus.SetPxPyPzE (f_Ks_pi_minus_PX_DTF[0], f_Ks_pi_minus_PY_DTF[0], f_Ks_pi_minus_PZ_DTF[0], f_Ks_pi_minus_PE_DTF[0]);
|
||
|
LorVec_pi_plus_MisIDed.SetXYZM (f_pi_plus_PX_DTF[0], f_pi_plus_PY_DTF[0], f_pi_plus_PZ_DTF[0], PDGMASS.MU);
|
||
|
LorVec_mu_plus_MisIDed.SetXYZM (f_mu_plus_PX_DTF[0], f_mu_plus_PY_DTF[0], f_mu_plus_PZ_DTF[0], PDGMASS.PI_PLUS);
|
||
|
LorVec_K_short = LorVec_KS_pi_plus + LorVec_KS_pi_minus;
|
||
|
}
|
||
|
else{
|
||
|
std::cout << "[ERROR]\tTest not implemented for non-DTF variables" << std::endl;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
|
||
|
LorVec_KaonPion = LorVec_K_short + LorVec_pi_plus;
|
||
|
|
||
|
LorVec_K_star_plus = LorVec_KaonPion;
|
||
|
LorVec_ReconB = LorVec_DiMuon + LorVec_K_star_plus;
|
||
|
|
||
|
//double misIDed
|
||
|
if(Kst2Kspiplus){
|
||
|
LorVec_K_star_plus_From_DoubleMisIDed = LorVec_K_short + LorVec_mu_plus_MisIDed;
|
||
|
LorVec_Jpsi_From_DoubleMisIDed = LorVec_pi_plus_MisIDed + LorVec_mu_minus;
|
||
|
LorVec_B_plus_From_DoubleMisIDed = LorVec_Jpsi_From_DoubleMisIDed + LorVec_K_star_plus_From_DoubleMisIDed;
|
||
|
}
|
||
|
|
||
|
//remove double mis-identified events:
|
||
|
if(Kst2Kspiplus){
|
||
|
if(TMath::Abs(LorVec_Jpsi_From_DoubleMisIDed.M() - PDGMASS.J_PSI) > 50 && TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) > 30)
|
||
|
if(TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) < 100)
|
||
|
if( LorVec_Jpsi_From_DoubleMisIDed.M2() > 0.1e6
|
||
|
&& (LorVec_Jpsi_From_DoubleMisIDed.M2() < 0.98e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 1.1e6)
|
||
|
&& (LorVec_Jpsi_From_DoubleMisIDed.M2() < 8.68e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 10.09e6)
|
||
|
&& (LorVec_Jpsi_From_DoubleMisIDed.M2() < 12.9e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 14.4e6)
|
||
|
&& LorVec_Jpsi_From_DoubleMisIDed.M2() < 19.0e6)
|
||
|
n_DoubleMisID++;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
std::cout << "[INFO]\t\tThe double-misID veto was passed by " << n_DoubleMisID << " events. Out of " << N << ". Making the vetoes efficiency = " << 1. * n_DoubleMisID / N << std::endl;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|