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.

182 lines
8.0 KiB

  1. #include <cstdlib>
  2. #include <vector>
  3. #include <iostream>
  4. #include <map>
  5. #include <string>
  6. #include "TChain.h"
  7. #include "TFile.h"
  8. #include "TMath.h"
  9. #include "TTree.h"
  10. #include "TString.h"
  11. #include "TSystem.h"
  12. #include "TROOT.h"
  13. #include "TStopwatch.h"
  14. #include "../GlobalFunctions.hh"
  15. #include "../HeidelbergFitter/LHCbStyle.h"
  16. using namespace std;
  17. //////////////////////////////////////////////////////
  18. /// GetDoubleMissIDs()
  19. /// creates J_psi mass spectra from the non-resonant selected events after the BDT cut,
  20. /// with the mu+ and pi+ double mis-identified
  21. Int_t GetDoubleMissIDs(bool AfterBDTcut = true, Int_t Run = 1){
  22. if(!Kst2Kspiplus){
  23. std::cout << "[ERROR]\t\tDouble mis-identification only possible in Kshort Piplus subdecay!" << std::endl;
  24. return 0;
  25. }
  26. TChain* tree = NULL;
  27. if(AfterBDTcut){
  28. tree = new TChain("SelectionOutput");
  29. tree->Add(Form("%s/data/%s_BDToutput.root",path_to_data.c_str(),TheDecay.c_str()));
  30. }
  31. else {
  32. tree = new TChain("DecayTree");
  33. if(Run == 1 || Run == 12){
  34. tree->Add(Form("%s/data/2011_%s_DD_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  35. tree->Add(Form("%s/data/2011_%s_LL_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  36. tree->Add(Form("%s/data/2012_%s_DD_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  37. tree->Add(Form("%s/data/2012_%s_LL_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  38. }
  39. if(Run == 2 || Run == 12){
  40. tree->Add(Form("%s/data/2015_%s_DD_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  41. tree->Add(Form("%s/data/2015_%s_LL_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  42. tree->Add(Form("%s/data/2016_%s_DD_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  43. tree->Add(Form("%s/data/2016_%s_LL_BDTinput.root",path_to_data.c_str(),TheDecay.c_str()));
  44. }
  45. }
  46. Int_t N = tree->GetEntries();
  47. if(N == 0){
  48. std::cout << "[ERROR]\t\tNo events found for tree in given files!" << std::endl;
  49. return 0;
  50. }
  51. std::cout << "[INFO]\t\tTree loaded: Seeing " << N << " events!" << std::endl;
  52. TLorentzVector LorVec_mu_minus;
  53. TLorentzVector LorVec_mu_plus;
  54. TLorentzVector LorVec_pi_plus;
  55. TLorentzVector LorVec_K_short;
  56. TLorentzVector LorVec_pi_plus_MisIDed;
  57. TLorentzVector LorVec_mu_plus_MisIDed;
  58. TLorentzVector LorVec_B_plus_From_DoubleMisIDed;
  59. TLorentzVector LorVec_Jpsi_From_DoubleMisIDed;
  60. TLorentzVector LorVec_K_star_plus_From_DoubleMisIDed;
  61. Double_t pi_plus_PX = 0.;
  62. Double_t pi_plus_PY = 0.;
  63. Double_t pi_plus_PZ = 0.;
  64. Double_t mu_minus_PX = 0.;
  65. Double_t mu_minus_PY = 0.;
  66. Double_t mu_minus_PZ = 0.;
  67. Double_t mu_plus_PX = 0.;
  68. Double_t mu_plus_PY = 0.;
  69. Double_t mu_plus_PZ = 0.;
  70. Double_t K_short_PX = 0.;
  71. Double_t K_short_PY = 0.;
  72. Double_t K_short_PZ = 0.;
  73. tree -> SetBranchAddress( "pi_plus_PX" , &pi_plus_PX );
  74. tree -> SetBranchAddress( "pi_plus_PY" , &pi_plus_PY );
  75. tree -> SetBranchAddress( "pi_plus_PZ" , &pi_plus_PZ );
  76. tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
  77. tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
  78. tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
  79. tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
  80. tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
  81. tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
  82. tree -> SetBranchAddress( "K_short_PX" , &K_short_PX );
  83. tree -> SetBranchAddress( "K_short_PY" , &K_short_PY );
  84. tree -> SetBranchAddress( "K_short_PZ" , &K_short_PZ );
  85. Double_t dReconstructedBM;
  86. tree->Branch("BplusInvMass", &dReconstructedBM, "dReconstructedBM/D");
  87. std::cout << "[INFO]\t\tVariables created and linked to branches!" << std::endl;
  88. TH2 * h_BplusM_vs_BplusM_DoubleMisIDed = new TH2D("h_BplusM_vs_BplusM_DoubleMisIDed" , "comparison of B+ mass versus B+ mass (mu+ and pi+ double misIDed", 100, 5000, 6000, 100, 5000, 6000);
  89. h_BplusM_vs_BplusM_DoubleMisIDed->GetXaxis()->SetTitle("B_plus_M [MeV]");
  90. h_BplusM_vs_BplusM_DoubleMisIDed->GetYaxis()->SetTitle("B_plus_M (double misIDed) [MeV]");
  91. TH2 * h_BplusM_vs_JpsiM_DoubleMisIDed = new TH2D("h_BplusM_vs_JpsiM_DoubleMisIDed" , "overlay of J_psi mass and B+ mass (both mu+ and pi+ double misIDed", 50, 5000, 6000, 200, 0, 4000);
  92. h_BplusM_vs_JpsiM_DoubleMisIDed->GetXaxis()->SetTitle("B_plus_M (double misIDed) [MeV]");
  93. h_BplusM_vs_JpsiM_DoubleMisIDed->GetYaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  94. TH1 * h_Jpsi_Spectrum_MisIDed_Muon = new TH1D("h_Jpsi_Spectrum_MisIDed_Muon" , "Invariant mass of Jpsi with a pion misIDed as a muon", 200, 0, 4000);
  95. h_Jpsi_Spectrum_MisIDed_Muon->GetXaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  96. h_Jpsi_Spectrum_MisIDed_Muon->GetYaxis()->SetTitle("Candidates/20MeV");
  97. TH2 * h_JpsiM_vs_KstplusM_MisIDed_Muon = new TH2D("h_Jpsi_vs_Kstarplus_InvMass" , "m(Jpsi) with pi+ misIDed as a mu+ and K_star_plus with mu+ misIDed as a pi+", 100, 0, 4000, 100, 600, 2600);
  98. h_JpsiM_vs_KstplusM_MisIDed_Muon->GetXaxis()->SetTitle("J_psi_M (double misIDed) [40MeV]");
  99. h_JpsiM_vs_KstplusM_MisIDed_Muon->GetYaxis()->SetTitle("K_star_plus_M (double misIDed) [20MeV]");
  100. TH1 * h_Q2_Spectrum_MisIDed_Muon = new TH1D("h_Q2_Spectrum_MisIDed_Muon" , "Q2 of non-resonant DiMuons with a pion misIDed as a muon", 100, 0, 20);
  101. h_Q2_Spectrum_MisIDed_Muon->GetXaxis()->SetTitle("Q2 (double misIDed) [GeV^{2}]");
  102. h_Q2_Spectrum_MisIDed_Muon->GetYaxis()->SetTitle("Candidates / 0.2 GeV^{2}");
  103. std::cout << "[INFO]\t\tHistograms initialized!" << std::endl;
  104. ///////////////////////////////////////////////////////////////////////////
  105. ///
  106. /// loop over events
  107. ///
  108. ///////////////////////////////////////////////////////////////////////////
  109. for(int i=0; i< N; i++){
  110. tree->GetEntry(i);
  111. //define the Lorentz vectors
  112. LorVec_mu_minus.SetXYZM (mu_minus_PX, mu_minus_PY, mu_minus_PZ, PDGMASS.MU);
  113. LorVec_mu_plus.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.MU);
  114. LorVec_pi_plus.SetXYZM (pi_plus_PX, pi_plus_PY, pi_plus_PZ, PDGMASS.PI_PLUS);
  115. LorVec_K_short.SetXYZM (K_short_PX, K_short_PY, K_short_PZ, PDGMASS.K_SHORT);
  116. LorVec_pi_plus_MisIDed.SetXYZM (pi_plus_PX, pi_plus_PY, pi_plus_PZ, PDGMASS.MU);
  117. LorVec_mu_plus_MisIDed.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.PI_PLUS);
  118. LorVec_K_star_plus_From_DoubleMisIDed = LorVec_K_short + LorVec_mu_plus_MisIDed;
  119. LorVec_Jpsi_From_DoubleMisIDed = LorVec_pi_plus_MisIDed + LorVec_mu_minus;
  120. LorVec_B_plus_From_DoubleMisIDed = LorVec_Jpsi_From_DoubleMisIDed + LorVec_K_star_plus_From_DoubleMisIDed;
  121. Double_t dJpsiMisIDed_M = LorVec_Jpsi_From_DoubleMisIDed.M();
  122. h_Jpsi_Spectrum_MisIDed_Muon->Fill(dJpsiMisIDed_M);
  123. h_BplusM_vs_BplusM_DoubleMisIDed->Fill(LorVec_B_plus_From_DoubleMisIDed.M(), dReconstructedBM);
  124. h_BplusM_vs_JpsiM_DoubleMisIDed->Fill(LorVec_B_plus_From_DoubleMisIDed.M(), dJpsiMisIDed_M);
  125. h_Q2_Spectrum_MisIDed_Muon->Fill(LorVec_Jpsi_From_DoubleMisIDed.M2() * 1e-6);
  126. h_JpsiM_vs_KstplusM_MisIDed_Muon->Fill(dJpsiMisIDed_M, LorVec_K_star_plus_From_DoubleMisIDed.M());
  127. }
  128. std::cout << "[INFO]\t\tHistograms filled! Save to file:" << std::endl;
  129. TFile * f = new TFile(Form("%s/data/%s_MisIDs_%s.root",path_to_data.c_str(),TheDecay.c_str(), AfterBDTcut ? "AfterBDTcut" : "BeforeBDTcut"), "RECREATE");
  130. f->cd();
  131. h_Jpsi_Spectrum_MisIDed_Muon->Write("",TObject::kWriteDelete);
  132. h_JpsiM_vs_KstplusM_MisIDed_Muon->Write("",TObject::kWriteDelete);
  133. h_Q2_Spectrum_MisIDed_Muon->Write("",TObject::kWriteDelete);
  134. h_BplusM_vs_BplusM_DoubleMisIDed->Write("",TObject::kWriteDelete);
  135. h_BplusM_vs_JpsiM_DoubleMisIDed->Write("",TObject::kWriteDelete);
  136. f->Close();
  137. std::cout << "[INFO]\t\tFinished!" << std::endl;
  138. return 1;
  139. }