ROOT Analysis for the Inclusive Detachted Dilepton Trigger Lines
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.

255 lines
10 KiB

7 months ago
7 months ago
  1. #include <string>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <filesystem>
  6. #include <string_view>
  7. #include "TH1D.h"
  8. #include "TH2D.h"
  9. #include "THStack.h"
  10. #include "TGraph.h"
  11. #include "TTree.h"
  12. #include "TChain.h"
  13. #include "TFile.h"
  14. #include "TCanvas.h"
  15. #include "TROOT.h"
  16. #include "TStyle.h"
  17. #include "TColor.h"
  18. #include "TLorentzVector.h"
  19. #include "TRandom3.h"
  20. #include "TLegend.h"
  21. #include "RooDataHist.h"
  22. #include "RooRealVar.h"
  23. #include "RooPlot.h"
  24. #include "RooGaussian.h"
  25. #include "RooExponential.h"
  26. #include "RooRealConstant.h"
  27. #include "RooAddPdf.h"
  28. #include "RooFitResult.h"
  29. #include "RooProduct.h"
  30. #include "RooCrystalBall.h"
  31. #include "RooBreitWigner.h"
  32. #include "RooArgSet.h"
  33. #include "RooFFTConvPdf.h"
  34. #include "RooNovosibirsk.h"
  35. #include "constants.h"
  36. #include "basic_analysis.h"
  37. int mapmc_b02hphmmumu()
  38. {
  39. const char *sim_tree_name = "B0ToHpHmMuMu_noPID";
  40. TChain *sim_chain = new TChain(TString::Format("%s/DecayTree", sim_tree_name));
  41. sim_chain->Add("/auto/data/pfeiffer/inclusive_detached_dilepton/MC/rd_btoxll_simulation_fullstream_v0r0p6671378_B0ToKpPimMuMu_11144002_magdown.root");
  42. FourVect *l14v_sim = FourVect::Init(sim_chain, "L1");
  43. FourVect *l24v_sim = FourVect::Init(sim_chain, "L2");
  44. FourVect *hp4v_sim = FourVect::Init(sim_chain, "Hp");
  45. FourVect *hm4v_sim = FourVect::Init(sim_chain, "Hm");
  46. Int_t B_BKGCAT, L1_TRUEID, L2_TRUEID, Hp_TRUEID, Hm_TRUEID;
  47. sim_chain->SetBranchAddress("L1_TRUEID", &L1_TRUEID);
  48. sim_chain->SetBranchAddress("L2_TRUEID", &L2_TRUEID);
  49. sim_chain->SetBranchAddress("Hp_TRUEID", &Hp_TRUEID);
  50. sim_chain->SetBranchAddress("Hm_TRUEID", &Hm_TRUEID);
  51. sim_chain->SetBranchAddress("B0_BKGCAT", &B_BKGCAT);
  52. Float_t B0_PT_in, B0_BPVFDCHI2_in, B0_BPVDIRA_in, Jpsi_BPVIPCHI2_in, Jpsi_PT_in,
  53. Hp_BPVIPCHI2_in, Hp_PT_in, Hm_BPVIPCHI2_in, Hm_PT_in, L1_BPVIPCHI2_in, L2_BPVIPCHI2_in;
  54. Double_t Hp_PROBNN_K_in, Hm_PROBNN_K_in;
  55. sim_chain->SetBranchAddress("B0_PT", &B0_PT_in);
  56. sim_chain->SetBranchAddress("B0_BPVFDCHI2", &B0_BPVFDCHI2_in);
  57. sim_chain->SetBranchAddress("B0_BPVDIRA", &B0_BPVDIRA_in);
  58. sim_chain->SetBranchAddress("Jpsi_BPVIPCHI2", &Jpsi_BPVIPCHI2_in);
  59. sim_chain->SetBranchAddress("Jpsi_PT", &Jpsi_PT_in);
  60. sim_chain->SetBranchAddress("Hp_BPVIPCHI2", &Hp_BPVIPCHI2_in);
  61. sim_chain->SetBranchAddress("Hp_PT", &Hp_PT_in);
  62. sim_chain->SetBranchAddress("Hm_BPVIPCHI2", &Hm_BPVIPCHI2_in);
  63. sim_chain->SetBranchAddress("Hm_PT", &Hm_PT_in);
  64. sim_chain->SetBranchAddress("L1_BPVIPCHI2", &L1_BPVIPCHI2_in);
  65. sim_chain->SetBranchAddress("L2_BPVIPCHI2", &L2_BPVIPCHI2_in);
  66. sim_chain->SetBranchAddress("Hp_PROBNN_K", &Hp_PROBNN_K_in);
  67. sim_chain->SetBranchAddress("Hm_PROBNN_K", &Hm_PROBNN_K_in);
  68. TTree *output_tree = new TTree("DecayTree", "DecayTree");
  69. Float_t B0_PT_out, B0_BPVFDCHI2_out, B0_BPVDIRA_out, Jpsi_BPVIPCHI2_out, Jpsi_PT_out,
  70. Kplus_BPVIPCHI2_out, Kplus_PT_out, piminus_BPVIPCHI2_out, piminus_PT_out, muplus_BPVIPCHI2_out, muminus_BPVIPCHI2_out,
  71. B0_PX_out, B0_PY_out, B0_PZ_out, B0_ENERGY_out,
  72. muplus_PX_out, muplus_PY_out, muplus_PZ_out, muplus_ENERGY_out,
  73. muminus_PX_out, muminus_PY_out, muminus_PZ_out, muminus_ENERGY_out,
  74. Kplus_PX_out, Kplus_PY_out, Kplus_PZ_out, Kplus_ENERGY_out,
  75. piminus_PX_out, piminus_PY_out, piminus_PZ_out, piminus_ENERGY_out;
  76. Double_t Kplus_PROBNN_K_out, piminus_PROBNN_K_out, B0_M_out, muplus_M_out, muminus_M_out, Kplus_M_out, piminus_M_out;
  77. Int_t muplus_ID_out, muminus_ID_out, Kplus_ID_out, piminus_ID_out;
  78. output_tree->Branch("B0_PT", &B0_PT_out, "B0_PT/F");
  79. output_tree->Branch("B0_BPVFDCHI2", &B0_BPVFDCHI2_out, "B0_BPVFDCHI2/F");
  80. output_tree->Branch("B0_BPVDIRA", &B0_BPVDIRA_out, "B0_BPVDIRA/F");
  81. output_tree->Branch("B0_PX", &B0_PX_out, "0_PX/F");
  82. output_tree->Branch("B0_PY", &B0_PY_out, "0_PY/F");
  83. output_tree->Branch("B0_PZ", &B0_PZ_out, "0_PZ/F");
  84. output_tree->Branch("B0_ENERGY", &B0_ENERGY_out, "B0_ENERGY/F");
  85. output_tree->Branch("B0_M", &B0_M_out, "B0_M/D");
  86. output_tree->Branch("Jpsi_BPVIPCHI2", &Jpsi_BPVIPCHI2_out, "Jpsi_BPVIPCHI2/F");
  87. output_tree->Branch("Jpsi_PT", &Jpsi_PT_out, "Jpsi_PT/F");
  88. output_tree->Branch("Kplus_BPVIPCHI2", &Kplus_BPVIPCHI2_out, "Kplus_BPVIPCHI2/F");
  89. output_tree->Branch("Kplus_PROBNN_K", &Kplus_PROBNN_K_out, "Kplus_PROBNN_K/D");
  90. output_tree->Branch("Kplus_PT", &Kplus_PT_out, "Kplus_PT/F");
  91. output_tree->Branch("Kplus_PX", &Kplus_PX_out, "Kplus_PX/F");
  92. output_tree->Branch("Kplus_PY", &Kplus_PY_out, "Kplus_PY/F");
  93. output_tree->Branch("Kplus_PZ", &Kplus_PZ_out, "Kplus_PZ/F");
  94. output_tree->Branch("Kplus_ENERGY", &Kplus_ENERGY_out, "Kplus_ENERGY/F");
  95. output_tree->Branch("Kplus_M", &Kplus_M_out, "Kplus_M/D");
  96. output_tree->Branch("Kplus_ID", &Kplus_ID_out, "Kplus_ID/I");
  97. output_tree->Branch("piminus_BPVIPCHI2", &piminus_BPVIPCHI2_out, "piminus_BPVIPCHI2/F");
  98. output_tree->Branch("piminus_PROBNN_K", &piminus_PROBNN_K_out, "piminus_PROBNN_K/D");
  99. output_tree->Branch("piminus_PT", &piminus_PT_out, "piminus_PT/F");
  100. output_tree->Branch("piminus_PX", &piminus_PX_out, "piminus_PX/F");
  101. output_tree->Branch("piminus_PY", &piminus_PY_out, "piminus_PY/F");
  102. output_tree->Branch("piminus_PZ", &piminus_PZ_out, "piminus_PZ/F");
  103. output_tree->Branch("piminus_ENERGY", &piminus_ENERGY_out, "piminus_ENERGY/F");
  104. output_tree->Branch("piminus_M", &piminus_M_out, "piminus_M/D");
  105. output_tree->Branch("piminus_ID", &piminus_ID_out, "piminus_ID/I");
  106. output_tree->Branch("muminus_BPVIPCHI2", &muminus_BPVIPCHI2_out, "muminus_BPVIPCHI2/F");
  107. output_tree->Branch("muminus_PX", &muminus_PX_out, "muminus_PX/F");
  108. output_tree->Branch("muminus_PY", &muminus_PY_out, "muminus_PY/F");
  109. output_tree->Branch("muminus_PZ", &muminus_PZ_out, "muminus_PZ/F");
  110. output_tree->Branch("muminus_ENERGY", &muminus_ENERGY_out, "muminus_ENERGY/F");
  111. output_tree->Branch("muminus_M", &muminus_M_out, "muminus_M/D");
  112. output_tree->Branch("muminus_ID", &muminus_ID_out, "muminus_ID/I");
  113. output_tree->Branch("muplus_BPVIPCHI2", &muplus_BPVIPCHI2_out, "muplus_BPVIPCHI2/F");
  114. output_tree->Branch("muplus_PX", &muplus_PX_out, "muplus_PX/F");
  115. output_tree->Branch("muplus_PY", &muplus_PY_out, "muplus_PY/F");
  116. output_tree->Branch("muplus_PZ", &muplus_PZ_out, "muplus_PZ/F");
  117. output_tree->Branch("muplus_ENERGY", &muplus_ENERGY_out, "muplus_ENERGY/F");
  118. output_tree->Branch("muplus_M", &muplus_M_out, "muplus_M/D");
  119. output_tree->Branch("muplus_ID", &muplus_ID_out, "muplus_ID/I");
  120. unsigned int sim_entries = sim_chain->GetEntries();
  121. for (unsigned int i = 0; i < sim_entries; i++)
  122. {
  123. sim_chain->GetEntry(i);
  124. if (B_BKGCAT == 30 && TMath::Abs(L1_TRUEID) == PID_MUON && L2_TRUEID == -L1_TRUEID && ((TMath::Abs(Hp_TRUEID) == PID_KAON && TMath::Abs(Hm_TRUEID) == PID_PION) || (TMath::Abs(Hp_TRUEID) == PID_PION && TMath::Abs(Hm_TRUEID) == PID_KAON)))
  125. {
  126. B0_PT_out = B0_PT_in;
  127. B0_BPVFDCHI2_out = B0_BPVFDCHI2_in;
  128. B0_BPVDIRA_out = B0_BPVDIRA_in;
  129. Jpsi_BPVIPCHI2_out = Jpsi_BPVIPCHI2_in;
  130. Jpsi_PT_out = Jpsi_PT_in;
  131. muminus_BPVIPCHI2_out = L1_BPVIPCHI2_in;
  132. muminus_ID_out = L1_TRUEID;
  133. auto muminus_lv = l14v_sim->LorentzVector();
  134. muminus_PX_out = muminus_lv.Px();
  135. muminus_PY_out = muminus_lv.Py();
  136. muminus_PZ_out = muminus_lv.Pz();
  137. muminus_ENERGY_out = muminus_lv.E();
  138. muminus_M_out = muminus_lv.M();
  139. muplus_BPVIPCHI2_out = L2_BPVIPCHI2_in;
  140. muplus_ID_out = L2_TRUEID;
  141. auto muplus_lv = l24v_sim->LorentzVector();
  142. muplus_PX_out = muplus_lv.Px();
  143. muplus_PY_out = muplus_lv.Py();
  144. muplus_PZ_out = muplus_lv.Pz();
  145. muplus_ENERGY_out = muplus_lv.E();
  146. muplus_M_out = muplus_lv.M();
  147. if (TMath::Abs(Hp_TRUEID) == PID_KAON && TMath::Abs(Hm_TRUEID) == PID_PION)
  148. {
  149. Kplus_BPVIPCHI2_out = Hp_BPVIPCHI2_in;
  150. Kplus_PT_out = Hp_PT_in;
  151. Kplus_PROBNN_K_out = Hp_PROBNN_K_in;
  152. Kplus_ID_out = Hp_TRUEID;
  153. piminus_BPVIPCHI2_out = Hm_BPVIPCHI2_in;
  154. piminus_PT_out = Hm_PT_in;
  155. piminus_PROBNN_K_out = Hm_PROBNN_K_in;
  156. piminus_ID_out = Hm_TRUEID;
  157. auto Kplus_lv = hp4v_sim->LorentzVector(K_MASS);
  158. auto piminus_lv = hm4v_sim->LorentzVector();
  159. Kplus_PX_out = Kplus_lv.Px();
  160. Kplus_PY_out = Kplus_lv.Py();
  161. Kplus_PZ_out = Kplus_lv.Pz();
  162. Kplus_ENERGY_out = Kplus_lv.E();
  163. Kplus_M_out = Kplus_lv.M();
  164. piminus_PX_out = piminus_lv.Px();
  165. piminus_PY_out = piminus_lv.Py();
  166. piminus_PZ_out = piminus_lv.Pz();
  167. piminus_ENERGY_out = piminus_lv.E();
  168. piminus_M_out = piminus_lv.M();
  169. auto B0_lv = muminus_lv + muplus_lv + Kplus_lv + piminus_lv;
  170. B0_PX_out = B0_lv.Px();
  171. B0_PY_out = B0_lv.Py();
  172. B0_PZ_out = B0_lv.Pz();
  173. B0_ENERGY_out = B0_lv.E();
  174. B0_M_out = B0_lv.M();
  175. }
  176. else if (TMath::Abs(Hp_TRUEID) == PID_PION && TMath::Abs(Hm_TRUEID) == PID_KAON)
  177. {
  178. Kplus_BPVIPCHI2_out = Hm_BPVIPCHI2_in;
  179. Kplus_PT_out = Hm_PROBNN_K_in;
  180. Kplus_PROBNN_K_out = Hm_PROBNN_K_in;
  181. Kplus_ID_out = Hm_TRUEID;
  182. piminus_BPVIPCHI2_out = Hp_BPVIPCHI2_in;
  183. piminus_PT_out = Hp_PT_in;
  184. piminus_PROBNN_K_out = Hp_PROBNN_K_in;
  185. piminus_ID_out = Hp_TRUEID;
  186. auto Kplus_lv = hm4v_sim->LorentzVector(K_MASS);
  187. auto piminus_lv = hp4v_sim->LorentzVector();
  188. Kplus_PX_out = Kplus_lv.Px();
  189. Kplus_PY_out = Kplus_lv.Py();
  190. Kplus_PZ_out = Kplus_lv.Pz();
  191. Kplus_ENERGY_out = Kplus_lv.E();
  192. Kplus_M_out = Kplus_lv.M();
  193. piminus_PX_out = piminus_lv.Px();
  194. piminus_PY_out = piminus_lv.Py();
  195. piminus_PZ_out = piminus_lv.Pz();
  196. piminus_ENERGY_out = piminus_lv.E();
  197. piminus_M_out = piminus_lv.M();
  198. auto B0_lv = muminus_lv + muplus_lv + Kplus_lv + piminus_lv;
  199. B0_PX_out = B0_lv.Px();
  200. B0_PY_out = B0_lv.Py();
  201. B0_PZ_out = B0_lv.Pz();
  202. B0_ENERGY_out = B0_lv.E();
  203. B0_M_out = B0_lv.M();
  204. }
  205. output_tree->Fill();
  206. }
  207. PrintProgress(TString::Format("%s Mapping", sim_tree_name), sim_entries, 10000, i);
  208. }
  209. TFile* output_file = TFile::Open("/auto/data/pfeiffer/inclusive_detached_dilepton/MC/B0ToHpHmMuMu_mapped_mc.root", "RECREATE");
  210. output_file->cd();
  211. output_file->mkdir("B0ToHpHmMuMu_noPID_mapped/");
  212. output_file->cd("B0ToHpHmMuMu_noPID_mapped/");
  213. output_tree->SetDirectory(gDirectory);
  214. output_tree->Write();
  215. output_file->Close();
  216. return 0;
  217. }