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.

348 lines
14 KiB

  1. //Makes pretty yield (after the MVA cut) plots and tables
  2. //Renata Kopecna
  3. #include "GlobalFunctions.hh"
  4. #include "Paths.hpp"
  5. #include "MassFit.cpp"
  6. #include "Utils.hpp"
  7. #include "Design.hpp"
  8. class YieldInfo{
  9. public:
  10. double sigYield;
  11. double sigYieldErr;
  12. double bkgYield;
  13. double bkgYieldErr;
  14. double significance;
  15. YieldInfo(){ //default constructor
  16. sigYield = 0;
  17. sigYieldErr = 0;
  18. bkgYield = 0;
  19. bkgYieldErr = 0;
  20. significance = 0;
  21. }
  22. void addYield(YieldInfo addInfo){
  23. sigYield += addInfo.sigYield;
  24. sigYieldErr += addInfo.sigYieldErr;
  25. bkgYield += addInfo.bkgYield;
  26. bkgYieldErr += addInfo.bkgYieldErr;
  27. significance = sigYield ==0 ? 0 : sigYield/sqrt(sigYield+bkgYield);
  28. }
  29. ~YieldInfo(); //destuctor
  30. };
  31. YieldInfo::~YieldInfo(){//destuctor
  32. }
  33. double getValueFromTGraph(string name, TFile *fitFile, double TMVAcut){
  34. //Read the expected yields and significances
  35. TGraphErrors *graph = (TGraphErrors*)fitFile->Get(name.c_str());
  36. return graph->Eval(TMVAcut);
  37. }
  38. bool yieldComparison(int Run, double TMVAcut){
  39. //Takes the expected signal+background yield and significance as well as the actuall yield and significance a couts it per Run
  40. bool fixedMassRegion = true;
  41. //Read the expected yields and significances
  42. TFile *yield = new TFile(GetBDTScanFile("2011","both",Run,false,false,true).c_str(),"READ");
  43. double expectSigYield = getValueFromTGraph("sigYield",yield,TMVAcut);
  44. double expectBkgYield = getValueFromTGraph("bkgYield_fromAllEvts",yield,TMVAcut);
  45. double expectSignificance = getValueFromTGraph("significance_fromAllEvts",yield,TMVAcut);
  46. basicYieldFit("2011",Run,
  47. false,false,false,true,
  48. true,"OneCB","SingleExponential", true,
  49. false, false,
  50. TMVAcut, fixedMassRegion, false, true);
  51. //Load the file from fitting
  52. TFile *fitFile = new TFile(GetMassFitFile("2011", Run,
  53. false, false, false, true,
  54. true, "OneCB", "SingleExponential", true,
  55. false, false,
  56. TMVAcut, fixedMassRegion, true).c_str(),"OPEN");
  57. double sigYield = getSigYield(fitFile);
  58. double sigYieldErr = getSigYieldErr(fitFile);
  59. double bkgYield = getBkgYield(fitFile);
  60. double bkgYieldErr = getBkgYieldErr(fitFile);
  61. double significance = sigYield / sqrt(sigYield+bkgYield);
  62. cout << "\\begin{table}[hbt!]" << endl;
  63. cout << "\\centering" << endl;
  64. cout << "\\begin{tabular}{l|l|l}" << endl;
  65. cout << "Run " << Run << " & Expected & Fitted \\\\ \\hline" << endl;
  66. cout << "Signal &" << expectSigYield << " & " << sigYield << "$\\pm$" << sigYieldErr << "\\\\" << endl;
  67. cout << "Background &" << expectBkgYield << " & " << bkgYield << "$\\pm$" << bkgYieldErr << "\\\\" << endl;
  68. cout << "S/sqrt(S+B) &"<< expectSignificance << " & " << significance << endl;
  69. cout << "\\end{tabular}" << endl;
  70. cout << "\\end{table}" << endl;
  71. return 1;
  72. }
  73. YieldInfo yieldInQ2(int Run, double TMVAcut, int nBin, bool doFit){
  74. //Fits the B mass in diffrent Q2 bins and plots the yields and background
  75. bool fixedMassRegion = true;
  76. if (doFit) massFit("2011", "both", Run, false,
  77. true,true,false,false,true,
  78. true,"OneCB","SingleExponential", true,
  79. false, false,
  80. TMVAcut, false,
  81. fixedMassRegion, false,
  82. false, false, false,
  83. "q2_binned_fit", nBin,
  84. true,
  85. false, false, "",
  86. false, "", gammaTMdefault, false);
  87. //Load the file from fitting
  88. TFile *fitFile = new TFile(GetMassFitFile("2011", "both", Run, false,
  89. true,true,false,false,true,
  90. true,"OneCB","SingleExponential", true,
  91. false, false,
  92. TMVAcut, false,
  93. fixedMassRegion, false,
  94. "q2_binned_fit", nBin,
  95. true,
  96. false, false, "",
  97. false, "", gammaTMdefault, false).c_str(),"OPEN");
  98. YieldInfo YI;
  99. //Faster to read erything than check million ifs
  100. YI.sigYield = getSigYield(fitFile);
  101. YI.sigYieldErr = getSigYieldErr(fitFile);
  102. YI.bkgYield = getBkgYield(fitFile);
  103. YI.bkgYieldErr = getBkgYieldErr(fitFile);
  104. if (YI.sigYield == 0) YI.significance =0;
  105. else YI.significance = YI.sigYield / sqrt( YI.sigYield+ YI.bkgYield);
  106. return YI;
  107. }
  108. bool plotYieldInQ2(bool fixRange){
  109. TMefficiencyClass extraVar = TMefficiencyClass("q2_binned_fit");
  110. int nBins = extraVar.Bins;
  111. double binCenter = 0;
  112. double binError = 0;
  113. if (nBins ==0){
  114. coutERROR("Wrong variable used!");
  115. return 0; //I'm feeling adventerous
  116. }
  117. TGraphErrors *graphSig_1 = new TGraphErrors();
  118. TGraphErrors *graphBkg_1 = new TGraphErrors();
  119. TGraphErrors *graphSignificance_1 = new TGraphErrors();
  120. TGraphErrors *graphSig_2 = new TGraphErrors();
  121. TGraphErrors *graphBkg_2 = new TGraphErrors();
  122. TGraphErrors *graphSignificance_2 = new TGraphErrors();
  123. TGraphErrors *graphSig = new TGraphErrors();
  124. TGraphErrors *graphBkg = new TGraphErrors();
  125. TGraphErrors *graphSignificance = new TGraphErrors();
  126. // CMS [1 - 8.68], [10.09 - 12.86], [14.18 - 19.00]
  127. double CMS_X[3] = {4.84, 11.475, 16.59};
  128. double CMS_EX[3] = {3.84, 1.385, 2.41};
  129. double CMS_Y[3] = {2.7, 4.1, 5.6};
  130. double CMS_EY[3] = {0.0, 0.0, 0.0};
  131. double CMS_sig[3] = {22.1,25.9,45.1};
  132. double CMS_sig_E[3] = {8.1,6.3,8.0};
  133. double CMS_bkg[3] = {49.0,14.0,20.0};
  134. double CMS_bkg_E[3] = {0.0,0.0,0.0};
  135. TGraphErrors *graphSignificanceCMS = new TGraphErrors(3,CMS_X,CMS_Y,CMS_EX,CMS_EY);
  136. TGraphErrors *graphSigCMS = new TGraphErrors(3,CMS_X,CMS_sig,CMS_EX,CMS_sig_E);
  137. TGraphErrors *graphBkgCMS = new TGraphErrors(3,CMS_X,CMS_bkg,CMS_EX,CMS_bkg_E);
  138. bool doFit = true;
  139. vector <double> binBoundaries = extraVar.isEquidistant ? extraVar.binEdgesEquidistant : extraVar.binEdges;
  140. for (int bin = 0; bin < nBins; bin++){
  141. YieldInfo YI_1 = yieldInQ2(1, getTMVAcut(1),bin,doFit);
  142. YieldInfo YI_2 = yieldInQ2(2, getTMVAcut(2),bin,doFit);
  143. YieldInfo YI_tmp = YI_1;
  144. YI_tmp.addYield(YI_2);
  145. binCenter = (binBoundaries.at(bin+1)+binBoundaries.at(bin))/2.0e6;
  146. binError = (binBoundaries.at(bin+1)-binBoundaries.at(bin))/2.0e6;
  147. coutDebug("Bin center " + to_string(binCenter));
  148. coutDebug("Bin error " + to_string(binError));
  149. //Signal
  150. graphSig_1->SetPoint(graphSig_1->GetN(), binCenter, YI_1.sigYield);
  151. graphSig_1->SetPointError(graphSig_1->GetN()-1, binError, YI_1.sigYieldErr);
  152. graphSig_2->SetPoint(graphSig_2->GetN(), binCenter, YI_2.sigYield);
  153. graphSig_2->SetPointError(graphSig_2->GetN()-1, binError, YI_2.sigYieldErr);
  154. graphSig->SetPoint(graphSig->GetN(), binCenter, YI_tmp.sigYield);
  155. graphSig->SetPointError(graphSig->GetN()-1, binError, YI_tmp.sigYieldErr);
  156. //Background
  157. graphBkg_1->SetPoint(graphBkg_1->GetN(), binCenter, YI_1.bkgYield);
  158. graphBkg_1->SetPointError(graphBkg_1->GetN()-1, binError, YI_1.bkgYieldErr);
  159. graphBkg_2->SetPoint(graphBkg_2->GetN(), binCenter, YI_2.bkgYield);
  160. graphBkg_2->SetPointError(graphBkg_2->GetN()-1, binError, YI_2.bkgYieldErr);
  161. graphBkg->SetPoint(graphBkg->GetN(), binCenter, YI_tmp.bkgYield);
  162. graphBkg->SetPointError(graphBkg->GetN()-1, binError, YI_tmp.bkgYieldErr);
  163. //Significance
  164. graphSignificance_1->SetPoint(graphSignificance_1->GetN(), binCenter, YI_1.significance);
  165. graphSignificance_1->SetPointError(graphSignificance_1->GetN()-1,binError,0);
  166. graphSignificance_2->SetPoint(graphSignificance_2->GetN(), binCenter, YI_2.significance);
  167. graphSignificance_2->SetPointError(graphSignificance_2->GetN()-1,binError,0);
  168. graphSignificance->SetPoint(graphSignificance->GetN(), binCenter, YI_tmp.significance);
  169. graphSignificance->SetPointError(graphSignificance->GetN()-1,binError,0);
  170. }
  171. design_YieldInQ2(1, graphSig_1, graphBkg_1, graphSignificance_1, graphSignificanceCMS, fixRange);
  172. design_YieldInQ2(2, graphSig_2, graphBkg_2, graphSignificance_2, graphSignificanceCMS, fixRange);
  173. design_YieldInQ2(12, graphSig, graphBkg, graphSignificance, graphSignificanceCMS, fixRange);
  174. design_SignificanceInQ2(1,graphSignificance_1,graphSignificanceCMS,fixRange);
  175. design_SignificanceInQ2(2,graphSignificance_2,graphSignificanceCMS,fixRange);
  176. design_SignificanceInQ2(12,graphSignificance,graphSignificanceCMS,fixRange);
  177. return true;
  178. }
  179. bool ApplyCut(int Run, bool MC, bool Reference, bool PHSP, double TMVAcut){
  180. bool UseLowQ2Range = false;
  181. coutInfo("Staring to select signal events only for Run " + to_string(Run) + string(MC ? " MC" : " data") + string(Reference ? " Reference" : "") + string(PHSP? " PHSP" :"") + " at MVA reponse " + to_string(TMVAcut));
  182. bool onlyMuMu = MC && (!Reference && !PHSP);
  183. TChain *tree = get_BDT_TChain("2011",Run,MC,Reference && MC,PHSP,false,false);
  184. string cut = getFinalCut(MC, true, false,"", gammaTMdefault,
  185. onlyMuMu, Reference, false, UseLowQ2Range,
  186. false, TMefficiencyClass(), -1, TMVAcut, true);
  187. coutDebug("Cut: " + cut);
  188. string outputPath = GetFinalOutputFile(Run, MC, Reference, PHSP, false, UseLowQ2Range);
  189. coutDebug("Writting into new file " + outputPath);
  190. TFile *newFile = new TFile(outputPath.c_str(),"RECREATE");
  191. TTree *newTree = tree->CopyTree(cut.c_str(),"", tree->GetEntries());
  192. newFile->cd();
  193. newTree->Write("", TObject::kWriteDelete);
  194. newFile->Close();
  195. coutInfo("Done writting new file.");
  196. return 1;
  197. }
  198. bool ApplyCutPerYear(int Run, bool MC, bool Reference, bool PHSP, double TMVAcut){
  199. bool UseLowQ2Range = false;
  200. coutInfo("Staring to select signal events only for Run " + to_string(Run) + string(MC ? " MC" : " data") + string(Reference ? " Reference" : "") + string(PHSP? " PHSP" :"") + " at MVA reponse " + to_string(TMVAcut));
  201. bool onlyMuMu = MC && (!Reference && !PHSP);
  202. for(auto &year: yearsVector(MC,Reference,PHSP,Run)){
  203. TChain *tree = get_BDT_TChain(year,0,MC,Reference && MC,PHSP,false,false);
  204. string cut = getFinalCut(MC,true,false,"",gammaTMdefault,
  205. onlyMuMu,Reference,false,UseLowQ2Range,
  206. false,TMefficiencyClass(),-1,TMVAcut,true);
  207. coutDebug("Cut: " + cut);
  208. string outputPath = GetFinalOutputFile(year,Run, MC, Reference, PHSP, false, UseLowQ2Range);
  209. coutDebug("Writting into new file " + outputPath);
  210. TFile *newFile = new TFile(outputPath.c_str(),"RECREATE");
  211. TTree *newTree = tree->CopyTree(cut.c_str(),"", tree->GetEntries());
  212. newFile->cd();
  213. newTree->Write("", TObject::kWriteDelete);
  214. newFile->Close();
  215. coutInfo("Done writting new file.");
  216. }
  217. return 1;
  218. }
  219. bool ApplyCutToAll(int Run, double TMVAcut){
  220. if (!ApplyCut(Run, false, false, false, TMVAcut)) return 0;
  221. if (!ApplyCut(Run, true, false, false, TMVAcut)) return 0;
  222. if (!ApplyCut(Run, true, true, false, TMVAcut)) return 0;
  223. if (!ApplyCut(Run, true, false, true, TMVAcut)) return 0;
  224. return 1;
  225. }
  226. bool ApplyCutPerYearAll(int Run, double TMVAcut){
  227. if (!ApplyCutPerYear(Run, false, false, false, TMVAcut)) return 0;
  228. if (!ApplyCutPerYear(Run, true, false, false, TMVAcut)) return 0;
  229. if (!ApplyCutPerYear(Run, true, true, false, TMVAcut)) return 0;
  230. if (!ApplyCutPerYear(Run, true, false, true, TMVAcut)) return 0;
  231. return 1;
  232. }
  233. bool ApplyCutPerYearAll(int Run){
  234. ApplyCutPerYearAll(Run,getTMVAcut(Run));
  235. return 1;
  236. }
  237. bool printYileds(bool Rare){
  238. string filePath;
  239. int entries = 0;
  240. //Print number of events passing stripping
  241. string sCut = getMuMucut();
  242. cout << "Trigger and online";
  243. for (auto& year : yearsData(12)){
  244. filePath = returnFileAddress(year,getRunID(year),"up",false,false,false,false,false,false);
  245. TChain *T = new TChain(treeName(false,false).c_str());
  246. T->Add(filePath.c_str());
  247. replace(filePath,"up","down");
  248. T->Add(filePath.c_str());
  249. if (Rare){
  250. TH1F *tmp1 = new TH1F("tmp1","tmp1",1002,-1.0,100.0);
  251. replace(sCut,"Q2","(J_psi_M**2)");
  252. T->Draw("J_psi_M >> tmp1", sCut.c_str());
  253. entries = tmp1->GetEntries();
  254. }
  255. else entries = T->GetEntries();
  256. cout << "\t& " << entries ;
  257. T->Clear();
  258. }
  259. cout << "\\\\" << endl;
  260. //Print number of events passing preselection
  261. cout << "Cut-based selection";
  262. for (auto& year : yearsData(12)){
  263. filePath = returnFileAddress(year,getRunID(year),"both",true,false,false,false,false,false);
  264. TFile *file = TFile::Open(filePath.c_str());
  265. TTree *tree = (TTree*)file->Get(treeName(false,true).c_str());
  266. if (Rare){
  267. TH1F *tmp2 = new TH1F("tmp2","tmp2",1002,-1.0,100.0);
  268. tree->Draw("Q2 >> tmp2", sCut.c_str());
  269. entries = tmp2->GetEntries();
  270. }
  271. else entries = tree->GetEntries();
  272. cout << "\t& " << entries ;
  273. tree->Clear();
  274. file->Close();
  275. }
  276. cout << "\\\\" << endl;
  277. //Print number of events passing BDT for (auto& year : yearsData(12)){
  278. cout << "MVA selection";
  279. for (auto& year : yearsData(12)){
  280. filePath = returnFileAddress(year,getRunID(year),"both",true,true,false,false,false,false);
  281. TFile *file = TFile::Open(filePath.c_str());
  282. TTree *tree = (TTree*)file->Get(treeName(false,true).c_str());
  283. if (Rare){
  284. TH1F *tmp3 = new TH1F("tmp3","tmp3",1002,-1.0,100.0);
  285. tree->Draw("Q2 >> tmp3", sCut.c_str());
  286. entries = tmp3->GetEntries();
  287. }
  288. else entries = tree->GetEntries();
  289. cout << "\t& " << entries ;
  290. tree->Clear();
  291. file->Close();
  292. }
  293. cout << "\\\\" << endl;
  294. return true;
  295. }