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.

240 lines
11 KiB

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 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. #include "hlt1_decision_analysis.h"
  38. #include "bdt_classification.h"
  39. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Exclusive B2CC Bu To Kp Mu Mu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  40. int new_analysis_bu2jpsikplus()
  41. {
  42. const char *analysis_name = "BuToJpsiKplus";
  43. const char *data_tree_name = "Hlt2B2CC_BuToJpsiKplus_JpsiToMuMu_Detached";
  44. const char *sim_tree_name = "BuToKpMuMu_noPID";
  45. const char *end_state_mass_literal = "m(K^{+}#mu^{+}#mu^{-})";
  46. const bool retrain_bdt = false;
  47. TChain *data_chain = new TChain(TString::Format("%s/DecayTree", data_tree_name));
  48. data_chain->Add("/auto/data/pfeiffer/inclusive_detached_dilepton/data_samples/b2cc_turbo_superliaison_collision23_butojpsikplus_turbopass_magdown_v0r0p6205916.root");
  49. FourVect *l14v_data = FourVect::Init(data_chain, "muplus");
  50. FourVect *l24v_data = FourVect::Init(data_chain, "muminus");
  51. FourVect *hp4v_data = FourVect::Init(data_chain, "Kplus");
  52. Bool_t muplus_ISMUON, muminus_ISMUON, Hlt1TrackMVADecision, Hlt1TwoTrackMVADecision;
  53. Double_t Kplus_PID_K;
  54. data_chain->SetBranchAddress("muplus_ISMUON", &muplus_ISMUON);
  55. data_chain->SetBranchAddress("muminus_ISMUON", &muminus_ISMUON);
  56. data_chain->SetBranchAddress("Hlt1TrackMVADecision", &Hlt1TrackMVADecision);
  57. data_chain->SetBranchAddress("Hlt1TwoTrackMVADecision", &Hlt1TwoTrackMVADecision);
  58. data_chain->SetBranchAddress("Kplus_PID_K", &Kplus_PID_K);
  59. TChain *sim_chain = new TChain(TString::Format("%s/DecayTree", sim_tree_name));
  60. sim_chain->Add("/auto/data/pfeiffer/inclusive_detached_dilepton/MC/rd_btoxll_simulation_turbo_v0r0p6657752_BuToKpMuMu_12143001_magdown.root");
  61. FourVect *l14v_sim = FourVect::Init(sim_chain, "L1");
  62. FourVect *l24v_sim = FourVect::Init(sim_chain, "L2");
  63. FourVect *hp4v_sim = FourVect::Init(sim_chain, "K");
  64. Int_t B_BKGCAT, L1_TRUEID, L2_TRUEID, Hp_TRUEID;
  65. sim_chain->SetBranchAddress("L1_TRUEID", &L1_TRUEID);
  66. sim_chain->SetBranchAddress("L2_TRUEID", &L2_TRUEID);
  67. sim_chain->SetBranchAddress("K_TRUEID", &Hp_TRUEID);
  68. sim_chain->SetBranchAddress("B_BKGCAT", &B_BKGCAT);
  69. Double_t B_Mass_jpsi_var, B_Mass_psi2s_var, B_Mass_sim_var;
  70. TString B_Mass_jpsi_var_name = "B_Mass_jpsi_var";
  71. TString B_Mass_psi2s_var_name = "B_Mass_psi2s_var";
  72. TString B_Mass_sim_var_name = "B_Mass_sim_var";
  73. TTree *tree_B_Mass_jpsi = new TTree("tree_B_Mass_jpsi", TString::Format("B Mass, J/#psi Mode (%s)", analysis_name));
  74. TTree *tree_B_Mass_psi2s = new TTree("tree_B_Mass_psi2s", TString::Format("B Mass, #psi(2S) Mode (%s)", analysis_name));
  75. TTree *tree_B_Mass_sim = new TTree("tree_B_Mass_sim", TString::Format("B Mass, Simualted (%s_noPID)", analysis_name));
  76. tree_B_Mass_jpsi->Branch(B_Mass_jpsi_var_name, &B_Mass_jpsi_var);
  77. tree_B_Mass_psi2s->Branch(B_Mass_psi2s_var_name, &B_Mass_psi2s_var);
  78. tree_B_Mass_sim->Branch(B_Mass_sim_var_name, &B_Mass_sim_var);
  79. TH1D *h1_B_Mass_unf = new TH1D("h1_B_Mass_unf", TString::Format("B Mass (%s), Unfiltered", data_tree_name), B_MASS_HIST_BINS, B_MASS_VAR_MIN, B_MASS_VAR_MAX);
  80. TH1D *h1_dimuon_mass = new TH1D("h1_dimuon_mass", TString::Format("#mu#mu Mass (%s)", data_tree_name), B_MASS_HIST_BINS, 2890., 3890.);
  81. TH1D *h1_B_Mass_sim_unf = new TH1D("h1_B_Mass_sim_unf", TString::Format("B Mass, Simualted (%s), Unfiltered", sim_tree_name), B_MASS_HIST_BINS, B_MASS_VAR_MIN, B_MASS_VAR_MAX);
  82. TH2D *h2_Hlt1_flags_B_Mass = new TH2D("h2_Hlt1_flags_B_Mass", "Hlt1 Decision vs B Mass", 50, 5100, 5400, 13, 1., 14.);
  83. TH2D *h2_Hlt1_flags_excl_B_Mass = new TH2D("h2_Hlt1_flags_excl_B_Mass", "Excl Hlt1 Decision vs B Mass", 50, 5100, 5400, 13, 1., 14.);
  84. h1_B_Mass_unf->GetXaxis()->SetTitle(end_state_mass_literal);
  85. h1_B_Mass_sim_unf->GetXaxis()->SetTitle(end_state_mass_literal);
  86. h2_Hlt1_flags_B_Mass->GetXaxis()->SetTitle(end_state_mass_literal);
  87. h2_Hlt1_flags_excl_B_Mass->GetXaxis()->SetTitle(end_state_mass_literal);
  88. // ConnectHlt1Decisions(data_chain, h2_Hlt1_flags_B_Mass, h2_Hlt1_flags_excl_B_Mass);
  89. // auto hlt1_decision_histos = CreateHlt1DecisionHistos(analysis_name);
  90. // std::map<std::string, int> exclusive_hits{};
  91. unsigned int data_entries = data_chain->GetEntries();
  92. unsigned int sim_entries = sim_chain->GetEntries();
  93. for (unsigned int i = 0; i < sim_entries; i++)
  94. {
  95. sim_chain->GetEntry(i);
  96. Double_t reconstructed_B_Mass = (hp4v_sim->LorentzVector() + l14v_sim->LorentzVector() + l24v_sim->LorentzVector()).M();
  97. h1_B_Mass_sim_unf->Fill(reconstructed_B_Mass);
  98. if (B_BKGCAT == 0 && TMath::Abs(L1_TRUEID) == PID_MUON && L2_TRUEID == -L1_TRUEID && TMath::Abs(Hp_TRUEID) == PID_KAON)
  99. {
  100. B_Mass_sim_var = reconstructed_B_Mass;
  101. tree_B_Mass_sim->Fill();
  102. }
  103. PrintProgress(TString::Format("%s SIG Collection", analysis_name), sim_entries, 10000, i);
  104. }
  105. std::cout << "# Starting evaluation of data." << std::endl;
  106. for (unsigned int i = 0; i < data_entries; i++)
  107. {
  108. data_chain->GetEntry(i);
  109. TLorentzVector dimuon = l14v_data->LorentzVector() + l24v_data->LorentzVector();
  110. Double_t reconstructed_B_Mass = (hp4v_data->LorentzVector() + dimuon).M();
  111. // if (TMath::Abs(dimuon.M() - JPSI_MASS) < 100.)
  112. // {
  113. // CheckHlt1Decisioins(h2_Hlt1_flags_B_Mass, h2_Hlt1_flags_excl_B_Mass, exclusive_hits, reconstructed_B_Mass);
  114. // FillHlt1DecisionHistos(hlt1_decision_histos, reconstructed_B_Mass);
  115. // }
  116. h1_B_Mass_unf->Fill(reconstructed_B_Mass);
  117. if (muplus_ISMUON && muminus_ISMUON && Kplus_PID_K > -3 && (Hlt1TrackMVADecision || Hlt1TwoTrackMVADecision))
  118. {
  119. h1_dimuon_mass->Fill(dimuon.M());
  120. if (TMath::Abs(dimuon.M() - JPSI_MASS) < 100.)
  121. {
  122. B_Mass_jpsi_var = reconstructed_B_Mass;
  123. tree_B_Mass_jpsi->Fill();
  124. }
  125. else if (TMath::Abs(dimuon.M() - PSI2S_MASS) < 100.)
  126. {
  127. B_Mass_psi2s_var = reconstructed_B_Mass;
  128. tree_B_Mass_psi2s->Fill();
  129. }
  130. }
  131. PrintProgress(TString::Format("%s BDT Evaluation", analysis_name), data_entries, 10000, i);
  132. }
  133. DrawInDefaultCanvas(h1_B_Mass_unf, analysis_name, 0.1);
  134. DrawInDefaultCanvas(h1_B_Mass_sim_unf, analysis_name, 0.1);
  135. DrawInDefaultCanvas(h1_dimuon_mass, analysis_name, 0.1);
  136. auto roofit_hist_sim = CreateRooDataSetAndFitCB(tree_B_Mass_sim, B_Mass_sim_var_name, end_state_mass_literal, false, false, ShapeParamters{});
  137. auto roofit_hist_jpsi_fitsum = CreateRooDataSetAndFitCB(tree_B_Mass_jpsi, B_Mass_jpsi_var_name, end_state_mass_literal, true, true, roofit_hist_sim.shape_parameters, false, 5150., 5460.);
  138. roofit_hist_sim.shape_parameters.sigma_lr = roofit_hist_jpsi_fitsum.shape_parameters.sigma_lr;
  139. //auto roofit_hist_psi2s_fitsum = CreateRooDataSetAndFitCB(tree_B_Mass_psi2s, B_Mass_psi2s_var_name, end_state_mass_literal, true, true, roofit_hist_sim.shape_parameters, true, 5140., 5460.);
  140. DrawInDefaultCanvas(roofit_hist_jpsi_fitsum, analysis_name);
  141. //DrawInDefaultCanvas(roofit_hist_psi2s_fitsum, analysis_name);
  142. DrawInDefaultCanvas(roofit_hist_sim, analysis_name);
  143. // DrawHlt1DecisionHistos(analysis_name, hlt1_decision_histos);
  144. //auto signal_ratio = DivWithErr(roofit_hist_psi2s_fitsum.signal_yield.first, roofit_hist_psi2s_fitsum.signal_yield.second, roofit_hist_jpsi_fitsum.signal_yield.first, roofit_hist_jpsi_fitsum.signal_yield.second);
  145. std::time_t t = std::time(nullptr);
  146. std::tm tm = *std::localtime(&t);
  147. ofstream res_file;
  148. res_file.open(TString::Format("%s_results.txt", analysis_name).Data(), ios::out | ios::trunc);
  149. auto jpsi_sigobkg = DivWithErr(roofit_hist_jpsi_fitsum.signal_yield.first, roofit_hist_jpsi_fitsum.signal_yield.second, roofit_hist_jpsi_fitsum.background_yield.first, roofit_hist_jpsi_fitsum.background_yield.second);
  150. // auto psi2s_sigobkg = DivWithErr(roofit_hist_psi2s_fitsum.signal_yield.first, roofit_hist_psi2s_fitsum.signal_yield.second, roofit_hist_psi2s_fitsum.background_yield.first, roofit_hist_psi2s_fitsum.background_yield.second);
  151. auto mumu_br_frac = DivWithErr(BRF_JPSI_MUMU_VAL, BRF_JPSI_MUMU_ERR, BRF_PSI2S_MUMU_VAL, BRF_PSI2S_MUMU_ERR);
  152. res_file << "#### " << analysis_name << " @ " << std::put_time(&tm, "%c") << " ####" << std::endl;
  153. res_file << "J/Psi Mode: " << ErrToStr(roofit_hist_jpsi_fitsum.signal_yield, 0) << " / " << ErrToStr(roofit_hist_jpsi_fitsum.background_yield, 0) << std::endl;
  154. res_file << " Sig/Bkg: " << ErrToStr(jpsi_sigobkg, 2) << std::endl;
  155. // res_file << "Psi(2S) Mode: " << ErrToStr(roofit_hist_psi2s_fitsum.signal_yield, 0) << " / " << ErrToStr(roofit_hist_psi2s_fitsum.background_yield, 0) << std::endl;
  156. //res_file << " Sig/Bkg: " << ErrToStr(psi2s_sigobkg, 2) << std::endl;
  157. // res_file << "Mode Yield Ratio: " << ErrToStr(signal_ratio, 3) << std::endl;
  158. // res_file << "Rel Br Frac MuMu: " << ErrToStr(mumu_br_frac, 3) << std::endl;
  159. // auto br_frac = MultWithErr(signal_ratio.first, signal_ratio.second, mumu_br_frac.first, mumu_br_frac.second);
  160. // res_file << "Rel Br Frac: " << ErrToStr(br_frac, 3) << std::endl << std::endl;
  161. res_file << "Params from Sim:" << std::endl << roofit_hist_sim.shape_parameters.ToString() << std::endl;
  162. for (const auto &par : roofit_hist_sim.fitted_params)
  163. {
  164. res_file << par.ToString(true).c_str() << std::endl;
  165. }
  166. res_file << std::endl << "Fitted Parameters: J/PSI" << std::endl << std::endl;
  167. for (const auto &par : roofit_hist_jpsi_fitsum.fitted_params)
  168. {
  169. res_file << par.ToString(true).c_str() << std::endl;
  170. }
  171. // res_file << std::endl << "Fitted Parameters: PSI(2S)" << std::endl << std::endl;
  172. // for (const auto &par : roofit_hist_psi2s_fitsum.fitted_params)
  173. // {
  174. // res_file << par.ToString(true).c_str() << std::endl;
  175. // }
  176. auto print_table = [&res_file](std::string name, std::pair<double, double> sig, std::pair<double, double> bkg)
  177. {
  178. res_file << std::endl;
  179. res_file << "# " << name << std::endl;
  180. res_file << "\\begin{tabular}{c|c}" << std::endl;
  181. res_file << "$N_{Sig}$ & $N_{Bkg}$\\\\\\hline" << std::endl;
  182. res_file << TString::Format("$%.0f \\pm %.0f$ & $%.0f \\pm %.0f$", sig.first, sig.second, bkg.first, bkg.second).Data() << std::endl;
  183. res_file << "\\end{tabular}" << std::endl;
  184. };
  185. print_table("J/psi", roofit_hist_jpsi_fitsum.signal_yield, roofit_hist_jpsi_fitsum.background_yield);
  186. // print_table("psi(2S)", roofit_hist_psi2s_fitsum.signal_yield, roofit_hist_psi2s_fitsum.background_yield);
  187. res_file.close();
  188. return 0;
  189. }