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.
 
 
 
 

281 lines
12 KiB

//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;
}