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

  1. //efficiency check of double misID filter in B+->Kst+mumu
  2. //david gerick
  3. #include "GlobalFunctions.hh"
  4. using namespace std;
  5. using namespace RooFit ;
  6. //////////////////////////////////////////////////////////////////////
  7. /// DoubleMisIDcheck()
  8. /// fake the double-misID of pi+ and mu+ and see how many would pass the double-misID filter from the preselection
  9. ///
  10. ///
  11. ///
  12. int checkDoubleMisIDvetoEff(std::string year = "2011", std::string magnet = "down", bool PreSelAndTM = true) {
  13. TChain* tree = 0;
  14. //Kst2Kpluspi0 case
  15. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  16. std::cout << "[ERROR]\t\tNo double misID possible in pi0 channel!" << std::endl;
  17. return 0;
  18. }
  19. //Kst2Kspiplus case
  20. if(Kst2Kspiplus){
  21. if(PreSelAndTM){
  22. tree=new TChain("DecayTreeTruthMatched");
  23. tree->Add(GetInputFile(year,magnet,true,true,true,false,false).c_str());
  24. }
  25. else{
  26. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  27. tree->Add(GetInputFile(year,magnet,false,true,true,false,false).c_str());
  28. }
  29. }
  30. int N = tree->GetEntries();
  31. cout << "Old files contain " << N << " events" << endl;
  32. if(N == 0){
  33. std::cout << "[ERROR]\t\tTree has no entries. Exit!" << std::endl;
  34. return 0;
  35. }
  36. //Disable all branches
  37. tree->SetBranchStatus("*",0);
  38. tree->SetBranchStatus( "*PX", 1 );
  39. tree->SetBranchStatus( "*PY", 1);
  40. tree->SetBranchStatus( "*PZ", 1);
  41. tree->SetBranchStatus( "*PE", 1);
  42. //define variables
  43. TLorentzVector LorVec_B_plus;
  44. TLorentzVector LorVec_K_star_plus;
  45. TLorentzVector LorVec_K_short;
  46. TLorentzVector LorVec_pi_plus;
  47. TLorentzVector LorVec_KS_pi_plus;
  48. TLorentzVector LorVec_KS_pi_minus;
  49. TLorentzVector LorVec_mu_minus;
  50. TLorentzVector LorVec_mu_plus;
  51. //potentially misIDed particles:
  52. TLorentzVector LorVec_pi_plus_MisIDed;
  53. TLorentzVector LorVec_mu_plus_MisIDed;
  54. TLorentzVector LorVec_B_plus_From_DoubleMisIDed;
  55. TLorentzVector LorVec_Jpsi_From_DoubleMisIDed;
  56. TLorentzVector LorVec_K_star_plus_From_DoubleMisIDed;
  57. //recombined particles:
  58. TLorentzVector LorVec_DiMuon;
  59. TLorentzVector LorVec_KaonPion;
  60. TLorentzVector LorVec_ReconB;
  61. TLorentzVector LorVec_KshortMuMu;
  62. ///B+
  63. Double_t B_plus_PX = 0.;
  64. Double_t B_plus_PY = 0.;
  65. Double_t B_plus_PZ = 0.;
  66. Double_t B_plus_PE = 0.;
  67. ///K*+
  68. Double_t K_star_plus_PX = 0.;
  69. Double_t K_star_plus_PY = 0.;
  70. Double_t K_star_plus_PZ = 0.;
  71. Double_t K_star_plus_PE = 0.;
  72. ///Kshort
  73. Double_t K_short_PX = 0.;
  74. Double_t K_short_PY = 0.;
  75. Double_t K_short_PZ = 0.;
  76. Double_t K_short_PE = 0.;
  77. ///pi+ (KS)
  78. Double_t Ks_pi_plus_PX = 0.;
  79. Double_t Ks_pi_plus_PY = 0.;
  80. Double_t Ks_pi_plus_PZ = 0.;
  81. Double_t Ks_pi_plus_PE = 0.;
  82. Float_t f_Ks_pi_plus_PX_DTF[100];
  83. Float_t f_Ks_pi_plus_PY_DTF[100];
  84. Float_t f_Ks_pi_plus_PZ_DTF[100];
  85. Float_t f_Ks_pi_plus_PE_DTF[100];
  86. ///pi- (KS)
  87. Double_t Ks_pi_minus_PX = 0.;
  88. Double_t Ks_pi_minus_PY = 0.;
  89. Double_t Ks_pi_minus_PZ = 0.;
  90. Double_t Ks_pi_minus_PE = 0.;
  91. Float_t f_Ks_pi_minus_PX_DTF[100];
  92. Float_t f_Ks_pi_minus_PY_DTF[100];
  93. Float_t f_Ks_pi_minus_PZ_DTF[100];
  94. Float_t f_Ks_pi_minus_PE_DTF[100];
  95. ///pi+
  96. Double_t pi_plus_PX = 0.;
  97. Double_t pi_plus_PY = 0.;
  98. Double_t pi_plus_PZ = 0.;
  99. Double_t pi_plus_PE = 0.;
  100. Float_t f_pi_plus_PX_DTF[100];
  101. Float_t f_pi_plus_PY_DTF[100];
  102. Float_t f_pi_plus_PZ_DTF[100];
  103. Float_t f_pi_plus_PE_DTF[100];
  104. ///mu-
  105. Double_t mu_minus_PX = 0.;
  106. Double_t mu_minus_PY = 0.;
  107. Double_t mu_minus_PZ = 0.;
  108. Double_t mu_minus_PE = 0.;
  109. Float_t f_mu_minus_PX_DTF[100];
  110. Float_t f_mu_minus_PY_DTF[100];
  111. Float_t f_mu_minus_PZ_DTF[100];
  112. Float_t f_mu_minus_PE_DTF[100];
  113. ///mu+
  114. Double_t mu_plus_PX = 0.;
  115. Double_t mu_plus_PY = 0.;
  116. Double_t mu_plus_PZ = 0.;
  117. Double_t mu_plus_PE = 0.;
  118. Float_t f_mu_plus_PX_DTF[100];
  119. Float_t f_mu_plus_PY_DTF[100];
  120. Float_t f_mu_plus_PZ_DTF[100];
  121. Float_t f_mu_plus_PE_DTF[100];
  122. ///////////////////////////////////////
  123. /// LINK VARIABLES TO BRANCHES
  124. ///////////////////////////////////////
  125. //particle masses and momenta
  126. tree -> SetBranchAddress( "B_plus_PX" , &B_plus_PX );
  127. tree -> SetBranchAddress( "B_plus_PY" , &B_plus_PY );
  128. tree -> SetBranchAddress( "B_plus_PZ" , &B_plus_PZ );
  129. tree -> SetBranchAddress( "B_plus_PE" , &B_plus_PE );
  130. tree -> SetBranchAddress( "K_star_plus_PX" , &K_star_plus_PX );
  131. tree -> SetBranchAddress( "K_star_plus_PY" , &K_star_plus_PY );
  132. tree -> SetBranchAddress( "K_star_plus_PZ" , &K_star_plus_PZ );
  133. tree -> SetBranchAddress( "K_star_plus_PE" , &K_star_plus_PE );
  134. tree -> SetBranchAddress( "K_short_PX" , &K_short_PX );
  135. tree -> SetBranchAddress( "K_short_PY" , &K_short_PY );
  136. tree -> SetBranchAddress( "K_short_PZ" , &K_short_PZ );
  137. tree -> SetBranchAddress( "K_short_PE" , &K_short_PE );
  138. tree -> SetBranchAddress( "pi_plus_PX" , &pi_plus_PX );
  139. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PX" , &f_pi_plus_PX_DTF );
  140. tree -> SetBranchAddress( "pi_plus_PY" , &pi_plus_PY );
  141. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PY" , &f_pi_plus_PY_DTF );
  142. tree -> SetBranchAddress( "pi_plus_PZ" , &pi_plus_PZ );
  143. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PZ" , &f_pi_plus_PZ_DTF );
  144. tree -> SetBranchAddress( "pi_plus_PE" , &pi_plus_PE );
  145. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PE" , &f_pi_plus_PE_DTF );
  146. tree -> SetBranchAddress( "Ks_pi_minus_PX" , &Ks_pi_minus_PX );
  147. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PX" , &f_Ks_pi_minus_PX_DTF );
  148. tree -> SetBranchAddress( "Ks_pi_minus_PY" , &Ks_pi_minus_PY );
  149. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PY" , &f_Ks_pi_minus_PY_DTF );
  150. tree -> SetBranchAddress( "Ks_pi_minus_PZ" , &Ks_pi_minus_PZ );
  151. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PZ" , &f_Ks_pi_minus_PZ_DTF );
  152. tree -> SetBranchAddress( "Ks_pi_minus_PE" , &Ks_pi_minus_PE );
  153. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PE" , &f_Ks_pi_minus_PE_DTF );
  154. tree -> SetBranchAddress( "Ks_pi_plus_PX" , &Ks_pi_plus_PX );
  155. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PX" , &f_Ks_pi_plus_PX_DTF );
  156. tree -> SetBranchAddress( "Ks_pi_plus_PY" , &Ks_pi_plus_PY );
  157. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PY" , &f_Ks_pi_plus_PY_DTF );
  158. tree -> SetBranchAddress( "Ks_pi_plus_PZ" , &Ks_pi_plus_PZ );
  159. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PZ" , &f_Ks_pi_plus_PZ_DTF );
  160. tree -> SetBranchAddress( "Ks_pi_plus_PE" , &Ks_pi_plus_PE );
  161. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PE" , &f_Ks_pi_plus_PE_DTF );
  162. tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
  163. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PX" , &f_mu_minus_PX_DTF );
  164. tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
  165. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PY" , &f_mu_minus_PY_DTF );
  166. tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
  167. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PZ" , &f_mu_minus_PZ_DTF );
  168. tree -> SetBranchAddress( "mu_minus_PE" , &mu_minus_PE );
  169. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PE" , &f_mu_minus_PE_DTF );
  170. tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
  171. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PX" , &f_mu_plus_PX_DTF );
  172. tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
  173. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PY" , &f_mu_plus_PY_DTF );
  174. tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
  175. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PZ" , &f_mu_plus_PZ_DTF );
  176. tree -> SetBranchAddress( "mu_plus_PE" , &mu_plus_PE );
  177. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PE" , &f_mu_plus_PE_DTF );
  178. int n_DoubleMisID = 0;
  179. bool IsBplus = true;
  180. ///////////////////////////////////////////////////////////////////////////
  181. ///
  182. /// loop over events
  183. ///
  184. ///////////////////////////////////////////////////////////////////////////
  185. for(int i=0; i< N; i++){
  186. //output the different counters!
  187. if ((0ul == (i % 10000ul) || i + 1 == N) && i != 0)
  188. cout << "Read event " << i << "/" << N << std::endl;
  189. tree->GetEntry(i);
  190. //define the Lorentz vectors
  191. if(UseDTF){ //start useDTF for LorentzVectors
  192. 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]);
  193. 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]);
  194. 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]);
  195. 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]);
  196. 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]);
  197. 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);
  198. 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);
  199. LorVec_K_short = LorVec_KS_pi_plus + LorVec_KS_pi_minus;
  200. }
  201. else{
  202. std::cout << "[ERROR]\tTest not implemented for non-DTF variables" << std::endl;
  203. return 0;
  204. }
  205. LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
  206. LorVec_KaonPion = LorVec_K_short + LorVec_pi_plus;
  207. LorVec_K_star_plus = LorVec_KaonPion;
  208. LorVec_ReconB = LorVec_DiMuon + LorVec_K_star_plus;
  209. //double misIDed
  210. if(Kst2Kspiplus){
  211. LorVec_K_star_plus_From_DoubleMisIDed = LorVec_K_short + LorVec_mu_plus_MisIDed;
  212. LorVec_Jpsi_From_DoubleMisIDed = LorVec_pi_plus_MisIDed + LorVec_mu_minus;
  213. LorVec_B_plus_From_DoubleMisIDed = LorVec_Jpsi_From_DoubleMisIDed + LorVec_K_star_plus_From_DoubleMisIDed;
  214. }
  215. //remove double mis-identified events:
  216. if(Kst2Kspiplus){
  217. 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)
  218. if(TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) < 100)
  219. if( LorVec_Jpsi_From_DoubleMisIDed.M2() > 0.1e6
  220. && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 0.98e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 1.1e6)
  221. && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 8.68e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 10.09e6)
  222. && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 12.9e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 14.4e6)
  223. && LorVec_Jpsi_From_DoubleMisIDed.M2() < 19.0e6)
  224. n_DoubleMisID++;
  225. continue;
  226. }
  227. }
  228. 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;
  229. return 1;
  230. }