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.

2625 lines
124 KiB

  1. //Renata Kopecna
  2. #include <bu2kstarmumu_plotter.hh>
  3. #include <TH1D.h>
  4. #include <TLegend.h>
  5. #include <TColor.h>
  6. #include <TROOT.h>
  7. #include <TGaxis.h>
  8. #include <TStyle.h>
  9. #include <constants.hh>
  10. #include <design.hh>
  11. #include <funcs.hh>
  12. #include <integrals.hh>
  13. #include <helpers.hh>
  14. #include <event.hh>
  15. #include <spdlog.h>
  16. //possible TODO when bored: This could be shortened even further, but I cannot be bothered at the moment
  17. //Bkg plots were very flat resulting in the plots sometimes having too large minimum, so set manualy now
  18. const double minBkg = 0.0;
  19. using namespace fcnc;
  20. bu2kstarmumu_plotter::bu2kstarmumu_plotter(options* o):
  21. opts(o)
  22. {
  23. gROOT->SetStyle("Plain");
  24. TPad foo;
  25. const int NRGBs = 5;
  26. const int NCont = 250;
  27. double stops[NRGBs] = { 0.00, 0.45, 0.60, 0.74, 1.00 };
  28. double red[NRGBs] = { 0.00, 0.00, 0.52, 1.00, 0.41 };
  29. double green[NRGBs] = { 0.00, 0.61, 1.00, 0.35, 0.00 };
  30. double blue[NRGBs] = { 0.68, 1.00, 0.12, 0.00, 0.00 };
  31. TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
  32. gStyle->SetNumberContours(NCont);
  33. gStyle->SetLabelFont(132, "xyz");
  34. gStyle->SetTitleFont(132, "xyz");
  35. gStyle->SetLegendFont(132);
  36. gStyle->SetStatFont(132);
  37. gStyle->SetEndErrorSize(10.0); //Sets the lenght of the tiny bars at the end of error bars
  38. //by default draw pulls underneath the 1D projections:
  39. this->pulls = true;
  40. };
  41. bu2kstarmumu_plotter::~bu2kstarmumu_plotter()
  42. {
  43. };
  44. int bu2kstarmumu_plotter::plot_data(bu2kstarmumu_pdf* prob, bu2kstarmumu_parameters* params, std::vector<event>* events, std::string prefix, std::string postfix, bool signalregion){
  45. //Calls plot_m, plot_mkpi and plot_angle
  46. if(events->size() == 0){
  47. spdlog::error("Cannot plot empty event histograms!");
  48. return 404;
  49. }
  50. spdlog::debug("Plotting of projections started.");
  51. prob->update_cached_normalization(params);
  52. spdlog::trace("Normalization updated.");
  53. output = new TFile((opts->plot_folder+"projections_" + opts->name + ".root").c_str(), "UPDATE");
  54. spdlog::debug("Created file " + std::string(output->GetPath()));
  55. std::string logstr = std::string("log_")+postfix;
  56. spdlog::trace("TFile created.");
  57. //m(B)
  58. if(!opts->only_angles && !opts->only_mkpi){
  59. spdlog::debug("Plotting B mass.");
  60. plot_m(prob, params, events, prefix, postfix, false, false);
  61. plot_m(prob, params, events, prefix, logstr , true, false);
  62. }
  63. //m(Kpi)
  64. if (opts->fit_mkpi || opts->use_mkpi){
  65. plot_mkpi(prob, params, events, prefix, postfix, signalregion, false, false);
  66. }
  67. //angles
  68. if(!opts->only_Bmass && !opts->only_mass2DFit && !opts->only_mkpi){
  69. spdlog::debug("Plotting angles.");
  70. plot_angle(prob, params, events, prefix, postfix, signalregion, "ctl", false);
  71. plot_angle(prob, params, events, prefix, postfix, signalregion, "ctk", false);
  72. plot_angle(prob, params, events, prefix, postfix, signalregion, "phi", false);
  73. }
  74. output->Close();
  75. delete output;
  76. return 0;
  77. };
  78. //Few functions making pretty TH1Ds
  79. int design_pdfLine(TH1D *pdf, Color_t lineColor, Style_t lineStyle){
  80. pdf->SetLineWidth(2.0);
  81. pdf->SetLineColor(lineColor);
  82. pdf->SetLineStyle(lineStyle);
  83. pdf->GetXaxis()->SetNoExponent(kTRUE);
  84. return 0;
  85. }
  86. int design_pdfLine(TH1D *pdf, Color_t lineColor, Style_t lineStyle, int lineWidth){
  87. pdf->SetLineWidth(lineWidth);
  88. pdf->SetLineColor(lineColor);
  89. pdf->SetLineStyle(lineStyle);
  90. pdf->GetXaxis()->SetNoExponent(kTRUE);
  91. return 0;
  92. }
  93. int design_plot(TH1D *plot, int markerStyle, bool printC){
  94. plot->SetMarkerStyle(markerStyle);
  95. plot->SetMarkerSize(printC ? 1.0 : 2.0);
  96. plot->GetXaxis()->SetNoExponent(kTRUE);
  97. return 0;
  98. }
  99. TLatex *design_TLatex(double texsizelarge, double texsizesmall, double pullHeight, double pos,
  100. bool pulls, std::string plot_label, std::string q2_label){
  101. TLatex *tex = getPrettyTex(texsizelarge,11);
  102. if(pulls) tex->SetTextSize(texsizelarge/(1 - pullHeight));
  103. tex->DrawLatexNDC(pos,(pulls ? (0.8 - pullHeight)/(1 - pullHeight) : 0.8),plot_label.c_str());
  104. if(PLOT_THISTHESIS_TAG){
  105. tex->DrawLatexNDC(0.7,(pulls ? (0.82 - pullHeight)/(1 - pullHeight) : 0.82),THISTHESIS_TAG.c_str());
  106. }
  107. tex->SetTextSize(texsizesmall);
  108. if(pulls) tex->SetTextSize(texsizesmall/(1 - pullHeight));
  109. tex->DrawLatexNDC(pos,(pulls ? (0.74 - pullHeight)/(1 - pullHeight) : 0.74),q2_label.c_str());
  110. return tex;
  111. }
  112. int bu2kstarmumu_plotter::design_pdf(TH1D *pdf, Color_t lineColor, Color_t fillColor,
  113. int fillStyle, double eff_pullHeight, bool doPull){
  114. pdf->SetLineWidth(2.0);
  115. pdf->SetLineColor(lineColor);
  116. pdf->SetFillStyle(fillStyle);
  117. pdf->SetFillColor(fillColor);
  118. pdf->GetXaxis()->SetNoExponent(kTRUE);
  119. if(doPull){
  120. Float_t textsize = gStyle->GetTextSize();
  121. design_pull_basic(pdf, textsize, eff_pullHeight);
  122. pdf->GetXaxis()->SetTickLength(pdf->GetXaxis()->GetTickLength()/eff_pullHeight);
  123. pdf->GetXaxis()->SetTitle("");
  124. pdf->GetXaxis()->SetLabelSize(0.0);//don't print labels
  125. pdf->GetYaxis()->SetNdivisions(gStyle->GetNdivisions("Y"));
  126. }
  127. return 0;
  128. }
  129. //Plot (log) mass
  130. void bu2kstarmumu_plotter::plot_m(bu2kstarmumu_pdf* prob, bu2kstarmumu_parameters* params, std::vector<event>* events, std::string prefix, std::string postfix, bool logarithmic, bool printC)
  131. {
  132. unsigned int m_bins = opts->plots_m_bins;
  133. double m_min = params->m_b.get_min();
  134. double m_max = params->m_b.get_max();
  135. double fsig = params->f_sig();
  136. if (opts->extended_ml){
  137. fsig = params->n_sig()/(params->n_sig()+params->n_bkg());
  138. }
  139. TCanvas *m_canvas = nullptr;
  140. std::string m_canvas_name = "Bplus Likelihood Analysis: #it{m}(#it" +latex_decay(opts->DTF) +") mass projection";
  141. if(printC) m_canvas = new TCanvas(("m_"+postfix).c_str(), m_canvas_name.c_str()) ;
  142. else m_canvas = new TCanvas(("m_"+postfix).c_str(), m_canvas_name.c_str(),1600,1200);
  143. const double pullHeight = 0.27;
  144. const double pullFrameRange = 6.5;
  145. TPad *pad1 = new TPad("pad1", "plot",0.0,pullHeight,1.0,1.0,0);
  146. TPad *pad2 = new TPad("pad2", "pull",0.0,0.0,1.0,pullHeight,0);
  147. if(this->pulls){
  148. pad1->Draw();
  149. pad2->Draw();
  150. pad1->SetLogy(logarithmic);
  151. pad1->SetBorderSize (0);
  152. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  153. pad1->SetTickx();
  154. pad1->SetTicky();
  155. pad1->cd();
  156. }
  157. else{
  158. m_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  159. m_canvas->SetLogy(logarithmic);
  160. m_canvas->SetTickx();
  161. m_canvas->SetTicky();
  162. }
  163. std::ostringstream sout;
  164. sout << ";#it{m}(" + latex_decay(opts->DTF) + ") ["+MeVc()+"];" << EVENTS_TAG << " / " << std::setprecision(2) << (m_max-m_min)/m_bins << " "+MeVc()+"";
  165. TH1D* m_plot_sig = new TH1D("msig", sout.str().c_str(), m_bins, m_min, m_max);
  166. TH1D* m_plot_bkg = new TH1D("mbkg", sout.str().c_str(), m_bins, m_min, m_max);
  167. TH1D* m_plot = new TH1D("m", sout.str().c_str(), m_bins, m_min, m_max);
  168. m_plot->Sumw2();
  169. std::ostringstream spulls;
  170. spulls << ";#it{m}(" + latex_decay(opts->DTF) + ") ["+MeVc()+"];" + latex_pull();
  171. TH1D* m_pulls = new TH1D("mpulls", spulls.str().c_str(), m_bins, m_min, m_max);
  172. spdlog::trace("Filling the histograms with {0:d} events.", events->size());
  173. double nevents = 0.0;
  174. for (auto evt: *events){
  175. double weight = 1.0;
  176. if(opts->weighted_fit) weight = evt.weight;
  177. if(evt.event_type == 0) m_plot_sig->Fill(evt.m, weight);
  178. else m_plot_bkg->Fill(evt.m, weight);
  179. m_plot->Fill(evt.m, weight);
  180. nevents += weight;
  181. }
  182. spdlog::trace("Filled.");
  183. const int bin_ratio = 20;
  184. unsigned int pdf_bins = m_bins*bin_ratio;
  185. if (pdf_bins == 0) spdlog::critical("No PDF bins!");
  186. double dm = (m_max-m_min)/pdf_bins;
  187. TH1D* pdf_sig = new TH1D("pdf_sig", sout.str().c_str(), pdf_bins, m_min, m_max);
  188. TH1D* pdf_bkg = new TH1D("pdf_bkg", sout.str().c_str(), pdf_bins, m_min, m_max);
  189. TH1D* pdf_tot = new TH1D("pdf_tot", sout.str().c_str(), pdf_bins, m_min, m_max);
  190. spdlog::trace("Getting parameter values...");
  191. double m_b = params->m_b();
  192. double m_scale = params->m_scale();
  193. double f_res = params->m_res_1();
  194. double sigma_1 = params->m_sigma_1();
  195. double sigma_2 = params->m_sigma_2();
  196. double alpha_1 = opts->crystalball || opts->twotailedcrystalball ? params->alpha_1() : 0.;
  197. double alpha_2 = opts->crystalball || opts->twotailedcrystalball ? params->alpha_2() : 0.;
  198. double n_1 = opts->crystalball || opts->twotailedcrystalball ? params->n_1() : 0.;
  199. double n_2 = opts->crystalball || opts->twotailedcrystalball ? params->n_2() : 0.;
  200. double prob_sig = 0.0, prob_bkg = 0.0, from = 0.0, to = 0.0;
  201. double integral1 = 1.0, integral2 = 1.0;
  202. spdlog::trace("Integrating...");
  203. if(opts->crystalball){
  204. integral1 = integrate_crystalball(m_b, m_scale*sigma_1, alpha_1, n_1, m_min, m_max);
  205. integral2 = integrate_crystalball(m_b, m_scale*sigma_2, alpha_2, n_2, m_min, m_max);
  206. }
  207. else if(opts->twotailedcrystalball){
  208. integral1 = integrate_twotailedcrystalball(m_b, m_scale*sigma_1, alpha_1, alpha_2, n_1, n_2, m_min, m_max);
  209. }
  210. else{
  211. integral1 = integrate_gauss(m_scale*sigma_1, m_b, m_min, m_max);
  212. integral2 = integrate_gauss(m_scale*sigma_2, m_b, m_min, m_max);
  213. }
  214. if (isnan(integral1) || isnan(integral2)){
  215. spdlog::critical("integral1 is NaN");
  216. return;
  217. }
  218. spdlog::trace("Getting signal prob...");
  219. for (unsigned int i = 0; i < pdf_bins; i++){
  220. from = m_min + i*dm;
  221. to = m_min + (i+1)*dm;
  222. prob_sig = 0.0;
  223. if (opts->crystalball){
  224. prob_sig = integrate_crystalball(m_b, m_scale*sigma_1, alpha_1, n_1, from, to) / integral1;
  225. if (f_res != 1.0){
  226. prob_sig *= f_res;
  227. prob_sig += (1.0-f_res)
  228. * integrate_crystalball(m_b, m_scale*sigma_2, alpha_2, n_2, from, to) / integral2;
  229. }
  230. }
  231. else if(opts->twotailedcrystalball){
  232. prob_sig = integrate_twotailedcrystalball(m_b, m_scale*sigma_1, alpha_1, alpha_2, n_1, n_2, from, to) / integral1;
  233. }
  234. else{
  235. prob_sig = integrate_gauss(m_scale*sigma_1, m_b, from, to) / integral1;
  236. if (f_res != 1.0){
  237. prob_sig *= f_res;
  238. prob_sig += (1.0 - f_res)
  239. * integrate_gauss(m_scale*sigma_2, m_b, from, to) / integral2;
  240. }
  241. }
  242. if (isnan(prob_sig)){
  243. spdlog::critical("prob_sig is nan");
  244. spdlog::critical("pdf bin {0:d}, edges: {1:f}-{2:f}", i, pdf_sig->GetBinLowEdge(i+1), pdf_sig->GetBinLowEdge(i+2));
  245. return;
  246. }
  247. pdf_sig->SetBinContent(i+1, prob_sig);
  248. prob_bkg = prob->integral_m_bkg_prob(params, from, to);
  249. if (isnan(prob_bkg)){
  250. spdlog::error("prob_bkg is nan");
  251. spdlog::error("pdf bin {0:d}, edges: {1:f}-{2:f}", i, from, to);
  252. spdlog::error("Setting prob_bkg to ZERO!");
  253. prob_bkg = 0;
  254. }
  255. pdf_bkg->SetBinContent(i+1, prob_bkg);
  256. }
  257. pdf_sig->Scale(nevents * fsig * double(pdf_bins) / double(m_bins));
  258. pdf_bkg->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(m_bins));
  259. pdf_tot->Add(pdf_sig, pdf_bkg);
  260. spdlog::trace("Making the plots pretty...");
  261. double maxpdf = (pdf_tot->GetMaximum() > m_plot->GetMaximum() ? pdf_tot->GetMaximum() : m_plot->GetMaximum());
  262. if(this->pulls){
  263. if (logarithmic) pdf_sig->SetMinimum(0.1001);
  264. else pdf_sig->SetMinimum(0.001);
  265. }
  266. else{ //no pull distributions
  267. if (logarithmic) pdf_sig->SetMinimum(0.1);
  268. else pdf_sig->SetMinimum(0.0);
  269. }
  270. pdf_sig->SetMaximum(1.45*maxpdf);
  271. pdf_bkg->SetTitleSize(0.06, "XY");
  272. pdf_bkg->SetLabelSize(0.05, "XY");
  273. pdf_bkg->SetTitleOffset(0.9, "XY");
  274. pdf_bkg->GetXaxis()->SetNoExponent(kTRUE);
  275. TGaxis::SetMaxDigits(3);
  276. design_pdf(pdf_sig, kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  277. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  278. design_pdf(pdf_bkg, kOrange+10, kOrange+8, 3354, 1-pullHeight, pdf_sig->Integral() <= 0.0 );
  279. if(pdf_sig->Integral() > 0.0){
  280. pdf_bkg->Draw("hist same C");
  281. }
  282. else{
  283. pdf_bkg->SetMaximum(1.45*maxpdf);
  284. pdf_bkg->SetMinimum(minBkg);
  285. pdf_bkg->Draw("hist C");
  286. }
  287. design_pdfLine(pdf_tot,kBlack,2.0);
  288. pdf_tot->Draw("hist same C");
  289. design_plot(m_plot,20,printC);
  290. m_plot->Draw("same e1");
  291. if (m_plot_bkg->Integral() != 0){
  292. design_pdfLine(m_plot_sig,4,kSolid);
  293. m_plot_sig->Draw("esame");
  294. design_pdfLine(m_plot_bkg,2,kSolid);
  295. if (params->f_sig() != 1.0) m_plot_bkg->Draw("esame");
  296. }
  297. //draw legend
  298. spdlog::trace("Drawing legend...");
  299. TLegend* m_leg = new TLegend(0.675,0.45,0.875,0.65);
  300. m_leg->SetBorderSize(0);
  301. m_leg->SetTextFont(132);
  302. m_leg->SetFillColor(0);
  303. m_leg->AddEntry(m_plot, "data", "le");
  304. m_leg->AddEntry(pdf_tot, "total PDF", "l");
  305. m_leg->AddEntry(pdf_sig, "signal PDF", "l");
  306. m_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  307. //m_leg->Draw();
  308. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.47,
  309. this->pulls, opts->plot_label, opts->q2_label);
  310. if(this->pulls){
  311. spdlog::trace("Drawing pulls...");
  312. assert(pdf_bins == m_bins*bin_ratio);
  313. //calculate pulls from fit and data points:
  314. for(UInt_t b = 1; b <= m_bins; b++){
  315. double p;
  316. if(m_plot->GetBinError(b) == 0) p = 0.;
  317. else{
  318. if(bin_ratio == 1){
  319. p = (m_plot->GetBinContent(b) - pdf_tot->GetBinContent(b))/m_plot->GetBinError(b);
  320. }
  321. //for odd ratio, take central bin from pdf w.r.t to m_bin:
  322. else if(bin_ratio%2 != 0){
  323. p = (m_plot->GetBinContent(b) - pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2))/m_plot->GetBinError(b);
  324. }
  325. //else, average the two central bins from pdf w.r.t. to angle_bin:
  326. else{
  327. p = (m_plot->GetBinContent(b) - (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2. ) / m_plot->GetBinError(b); //take central of 10 pdfbins
  328. }
  329. }
  330. m_pulls->SetBinContent(b, p);
  331. }
  332. pad2->Clear();
  333. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  334. pad2->SetTickx();
  335. pad2->cd();
  336. design_pull(m_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  337. m_pulls->Draw();
  338. //add two 3-sigma lines:
  339. TLine * lUp = threeSigmaLine(m_min, m_max, true);
  340. TLine * lLow = threeSigmaLine(m_min, m_max, false);
  341. lUp->Draw("same");
  342. lLow->Draw("same");
  343. }
  344. std::string mname = prefix + "m_" + postfix;
  345. spdlog::debug("Writting into " + mname);
  346. saveTCanvas(m_canvas,mname,opts->getAllPlotTypes());
  347. output->cd();
  348. m_canvas->Write();
  349. delete m_plot;
  350. delete m_plot_sig;
  351. delete m_plot_bkg;
  352. delete pdf_sig;
  353. delete pdf_bkg;
  354. delete pdf_tot;
  355. delete m_pulls;
  356. delete m_canvas;
  357. delete tex;
  358. };
  359. void bu2kstarmumu_plotter::plot_mkpi(bu2kstarmumu_pdf* prob, bu2kstarmumu_parameters* params, std::vector<event>* events, std::string prefix, std::string postfix, bool signalregion, bool logarithmic, bool printC)
  360. {
  361. double ma = params->m_b() - B_MASS_TIGHT_WINDOW;
  362. double mb = params->m_b() + B_MASS_TIGHT_WINDOW;
  363. double fsig = params->f_sig();
  364. if(opts->extended_ml){
  365. fsig = params->n_sig() / (params->n_sig()+params->n_bkg());
  366. }
  367. if(signalregion){
  368. double rsig = prob->integral_m_sig_prob(params, ma, mb);
  369. double rbkg = prob->integral_m_bkg_prob(params, ma, mb);
  370. fsig = fsig*rsig/(fsig*rsig + (1.0-fsig)*rbkg);
  371. }
  372. unsigned int mkpi_bins = opts->plots_mkpi_bins;
  373. double mkpi_min = opts->mkpi_min/1.0e+3;
  374. double mkpi_max = opts->mkpi_max/1.0e+3;
  375. TCanvas *mkpi_canvas = nullptr;
  376. std::string mkpi_canvas_name = "B plus Likelihood Analysis: #it{m}(#it"+ latex_Kst_decay(opts->DTF) +") ["+GeVc()+"]";
  377. if(printC){
  378. mkpi_canvas = new TCanvas(("mkpi_"+postfix).c_str(), mkpi_canvas_name.c_str());
  379. }
  380. else{
  381. mkpi_canvas = new TCanvas(("mkpi_"+postfix).c_str(), mkpi_canvas_name.c_str(),1600,1200) ;
  382. }
  383. const double pullHeight = 0.27;
  384. const double pullFrameRange = 6.5;
  385. TPad *pad1 = new TPad("pad1", "plot",0.0,pullHeight,1.0,1.0,0);
  386. TPad *pad2 = new TPad("pad2", "pull",0.0,0.0,1.0,pullHeight,0);
  387. if(this->pulls){
  388. pad1->Draw();
  389. pad2->Draw();
  390. pad1->SetLogy(logarithmic);
  391. pad1->SetBorderSize (0);
  392. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  393. pad1->SetTickx();
  394. pad1->SetTicky();
  395. pad1->cd();
  396. }
  397. else{
  398. mkpi_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  399. mkpi_canvas->SetTickx();
  400. mkpi_canvas->SetTicky();
  401. }
  402. std::ostringstream sout;
  403. sout << ";#it{m}(#it{K}^{+}#pi^{-}) ["+GeVc()+"];" << EVENTS_TAG << " / " << std::setprecision(2) << (mkpi_max-mkpi_min)/mkpi_bins << " GeV^{2}/#it{c}^{4}";
  404. TH1D* mkpi_plot_sig = new TH1D("mkpi_sig", sout.str().c_str(), mkpi_bins, mkpi_min, mkpi_max);
  405. TH1D* mkpi_plot_bkg = new TH1D("mkpi_bkg", sout.str().c_str(), mkpi_bins, mkpi_min, mkpi_max);
  406. TH1D* mkpi_plot = new TH1D("mkpi", sout.str().c_str(), mkpi_bins, mkpi_min, mkpi_max);
  407. mkpi_plot->Sumw2();
  408. std::string spulls = ";#it{m}("+ latex_Kst_decay(opts->DTF) +") ["+GeVc()+"];" + latex_pull();
  409. TH1D* mkpi_pulls = new TH1D("mkpipulls", spulls.c_str(), mkpi_bins, mkpi_min, mkpi_max);
  410. double nevents = 0.0;
  411. for (auto evt: *events){
  412. if (!signalregion || (evt.m > ma && evt.m < mb)){
  413. double weight = 1.0;
  414. double mkpi = evt.mkpi/1.0e+3;
  415. if (opts->weighted_fit){
  416. weight = evt.weight;
  417. mkpi_plot->Fill(mkpi, weight);
  418. }
  419. else mkpi_plot->Fill(mkpi);
  420. if(evt.event_type == 0) mkpi_plot_sig->Fill(mkpi, weight);
  421. else mkpi_plot_bkg->Fill(mkpi, weight);
  422. nevents += weight;
  423. }
  424. }
  425. const UInt_t bin_ratio = PLOT_NBINS_RATIO;
  426. unsigned int pdf_bins = mkpi_bins*bin_ratio;
  427. double dm = (mkpi_max-mkpi_min)/pdf_bins;
  428. TH1D* pdf_sig = new TH1D("pdf_sig", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  429. TH1D* pdf_swave = new TH1D("pdf_swave", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  430. TH1D* pdf_pwave = new TH1D("pdf_pwave", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  431. TH1D* pdf_interference = new TH1D("pdf_interference", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  432. TH1D* pdf_bkg = new TH1D("pdf_bkg", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  433. TH1D* pdf_tot = new TH1D("pdf_tot", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  434. double gammakstar = params->gammakstar();
  435. double mkstar = params->mkstar();
  436. double asphase = params->asphase();
  437. double a = params->a();
  438. double r = params->r();
  439. double R = params->R();
  440. double gammakstarplus = params->gammakstarplus();
  441. double mkstarplus = params->mkstarplus();
  442. double gammaf800 = params->gammaf800();
  443. double mf800 = params->mf800();
  444. double f800mag = params->f800mag();
  445. double f800phase = params->f800phase();
  446. double normbkg=0.0;
  447. std::vector<double> ch_mkpi(5, 0.0);
  448. ch_mkpi.at(0) = params->cbkgmkpi0();
  449. ch_mkpi.at(1) = params->cbkgmkpi1();
  450. ch_mkpi.at(2) = params->cbkgmkpi2();
  451. ch_mkpi.at(3) = params->cbkgmkpi3();
  452. ch_mkpi.at(4) = params->cbkgmkpi4();
  453. std::vector<double> poly_mkpi(ch_mkpi.size(), 0.0);
  454. chebyshev_to_poly(ch_mkpi, poly_mkpi);
  455. std::vector<double> poly_corr_mkpi(ch_mkpi.size(), 0.0);
  456. correct_poly(poly_mkpi, poly_corr_mkpi, mkpi_min, mkpi_max);
  457. if (opts->mkpi_threshold){
  458. normbkg = fcnc::int_threshold(mkpi_min, mkpi_max, 0.633, params->nthreshold());
  459. }
  460. else{
  461. for (unsigned int i=0; i<poly_mkpi.size(); i++){
  462. normbkg += poly_corr_mkpi.at(i)*(pow(mkpi_max,i+1)-pow(mkpi_min,i+1))/(i+1.0);
  463. }
  464. }
  465. double q2 = params->eff_q2();
  466. double rangednormkstarplus, rangednormkstar;
  467. if (opts->simple_mkpi){
  468. rangednormkstarplus = int_mkpi_simple_kstarzero_amp_squared(mkpi_min, mkpi_max, q2,
  469. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus);
  470. rangednormkstar = int_mkpi_simple_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar);
  471. }
  472. else if(opts->isobar){
  473. rangednormkstarplus = int_mkpi_kstarzero_isobar_amp_squared(mkpi_min, mkpi_max, q2,
  474. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  475. rangednormkstar = int_mkpi_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar, R);
  476. }
  477. else{
  478. rangednormkstarplus = int_mkpi_kstarzero_lass_amp_squared(mkpi_min, mkpi_max, q2, asphase, a, r, gammakstarplus, mkstarplus, R);
  479. rangednormkstar = int_mkpi_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar, R);
  480. }
  481. double sxi1, sxi2, sxi3, sxi4, sxi5, sxi6;
  482. //weighted fit and fit without acceptance
  483. if (opts->use_angular_acc)prob->swave_integrated_fj_chebyshev(sxi1, sxi2, sxi3, sxi4, sxi5, sxi6, q2);
  484. else prob->swave_integrated_fj_noacc(sxi1, sxi2, sxi3, sxi4, sxi5, sxi6);
  485. double xi1, xi2, xi3, xi4, xi5, xi6, xi7, xi8, xi9, xi10, xi11, xi12;
  486. if (opts->use_angular_acc){
  487. prob->integrated_fj_chebyshev(xi1, xi2, xi3, xi4, xi5, xi6,
  488. xi7, xi8, xi9, xi10, xi11, xi12, q2);
  489. }
  490. else{//weighted fit and fit without acceptance
  491. prob->integrated_fj_noacc(xi1, xi2, xi3, xi4, xi5, xi6,
  492. xi7, xi8, xi9, xi10, xi11, xi12);
  493. }
  494. double s1s = params->J1s();
  495. double s1c = params->J1c();
  496. double s2s = params->J2s();
  497. double s2c = params->J2c();
  498. double s3 = params->J3();
  499. double s4 = params->J4();
  500. double s5 = params->J5();
  501. double s6s = params->J6s();
  502. double s6c = params->J6c();
  503. double s7 = params->J7();
  504. double s8 = params->J8();
  505. double s9 = params->J9();
  506. double fs = params->FS();
  507. double ss1 = params->SS1();
  508. double ss2 = params->SS2();
  509. double ss3 = params->SS3();
  510. double ss4 = params->SS4();
  511. double ss5 = params->SS5();
  512. double norm =
  513. (1-fs)*(xi1*s1s + xi2*s1c + xi3*s2s + xi4*s2c + xi5*s3 + xi6*s4
  514. + xi7*s5 + xi8*s6s + xi9*s6c + xi10*s7 + xi11*s8 + xi12*s9)
  515. +(sxi1*fs + sxi2*ss1 + sxi3*ss2 + sxi4*ss3 + sxi5*ss4 + sxi6*ss5);
  516. double A = (xi1*s1s + xi2*s1c + xi3*s2s + xi4*s2c + xi5*s3 + xi6*s4
  517. + xi7*s5 + xi8*s6s + xi9*s6c + xi10*s7 + xi11*s8 + xi12*s9)/norm;
  518. double B = sxi1/norm;
  519. double C = (sxi2*ss1 + sxi3*ss2 + sxi4*ss3)/norm;
  520. double D = (sxi5*ss4 + sxi6*ss5)/norm;
  521. double prob_bkg = 0.0, from = 0.0, to = 0.0;
  522. for (unsigned int i = 0; i < pdf_bins; i++){
  523. from = mkpi_min + i*dm;
  524. to = mkpi_min + (i+1)*dm;
  525. double swavesq, pwavesq;
  526. std::complex<double> stimespwave;
  527. if (opts->simple_mkpi){
  528. swavesq = fcnc::int_mkpi_simple_kstarzero_amp_squared(from, to, q2,
  529. f800mag, f800phase, gammaf800, mf800,
  530. gammakstarplus, mkstarplus);
  531. pwavesq = fcnc::int_mkpi_simple_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar);
  532. stimespwave = fcnc::int_mkpi_simple_bw_kstar_amp_bar_kstarzero_amp(from, to, q2,
  533. gammakstar, mkstar, asphase,
  534. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus);
  535. }
  536. else if (opts->isobar){
  537. swavesq = fcnc::int_mkpi_kstarzero_isobar_amp_squared(from, to, q2,
  538. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  539. pwavesq = fcnc::int_mkpi_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar, R);
  540. stimespwave = fcnc::int_mkpi_bw_kstar_amp_bar_kstarzero_isobar_amp(from, to, q2,
  541. gammakstar, mkstar, asphase,
  542. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  543. }
  544. else{//nominal lass
  545. swavesq = fcnc::int_mkpi_kstarzero_lass_amp_squared(from, to, q2, asphase, a, r, gammakstarplus, mkstarplus, R);
  546. pwavesq = fcnc::int_mkpi_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar, R);
  547. stimespwave = fcnc::int_mkpi_bw_kstar_amp_bar_kstarzero_lass_amp(from, to, q2,
  548. gammakstar, mkstar,
  549. asphase, a, r, gammakstarplus, mkstarplus, R);
  550. }
  551. prob_bkg = 0.0;
  552. if (opts->mkpi_threshold){
  553. prob_bkg = fcnc::int_threshold(from, to, 0.633, params->nthreshold());
  554. }
  555. else{
  556. for (unsigned int i=0; i<ch_mkpi.size(); i++) prob_bkg += poly_corr_mkpi.at(i)*integrate_x_to_n(from, to, i);
  557. }
  558. prob_bkg /= normbkg;
  559. double pwave = A*pwavesq/(rangednormkstar);
  560. double swave = B*swavesq/(rangednormkstarplus);
  561. double interference = C*(stimespwave.real()/sqrt(rangednormkstarplus)/sqrt(rangednormkstar))
  562. + D*(stimespwave.imag()/sqrt(rangednormkstarplus)/sqrt(rangednormkstar));
  563. pdf_sig->SetBinContent(i+1, (1.0-fs)*pwave + fs*swave + interference);
  564. pdf_bkg->SetBinContent(i+1, prob_bkg);
  565. pdf_swave->SetBinContent(i+1, swave);
  566. pdf_pwave->SetBinContent(i+1, pwave);
  567. pdf_interference->SetBinContent(i+1, interference);
  568. pdf_tot->SetBinContent(i+1,
  569. fsig*((1.0-fs)*pwave + fs*swave + interference)
  570. + (1.0-fsig)*prob_bkg);
  571. }
  572. pdf_sig ->Scale(nevents * fsig * double(pdf_bins) / double(mkpi_bins));
  573. pdf_swave->Scale(nevents * fs*fsig * double(pdf_bins) / double(mkpi_bins));
  574. pdf_pwave->Scale(nevents * (1.0-fs)*fsig * double(pdf_bins) / double(mkpi_bins));
  575. pdf_interference->Scale(nevents * fsig * double(pdf_bins) / double(mkpi_bins));
  576. pdf_bkg ->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(mkpi_bins));
  577. pdf_tot ->Scale(nevents * double(pdf_bins) / double(mkpi_bins));
  578. double maxpdf = (pdf_tot->GetMaximum() > mkpi_plot->GetMaximum() ? pdf_tot->GetMaximum() : mkpi_plot->GetMaximum());
  579. if(this->pulls){
  580. if (logarithmic) pdf_sig->SetMinimum(0.1001);
  581. else pdf_sig->SetMinimum(0.001);
  582. }
  583. else{ //no pull distributions
  584. if (logarithmic) pdf_sig->SetMinimum(0.1);
  585. else pdf_sig->SetMinimum(0.0);
  586. }
  587. pdf_sig->SetMaximum(1.45*maxpdf);
  588. design_pdf(pdf_sig,kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  589. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  590. design_pdf(pdf_bkg,kOrange+10,kOrange+8, 3354, 1-pullHeight,pdf_sig->Integral() <= 0.0 );
  591. if(pdf_sig->Integral() > 0.0){
  592. pdf_bkg->Draw("hist same C");
  593. }
  594. else{
  595. pdf_bkg->SetMaximum(1.45*maxpdf);
  596. pdf_bkg->SetMinimum(0.5);
  597. pdf_bkg->Draw("hist C");
  598. }
  599. design_pdfLine(pdf_pwave, pWaveColor, kDashed);
  600. if(opts->swave) pdf_pwave->Draw("hist same C");
  601. design_pdfLine(pdf_swave, sWaveColor, kDotted);
  602. if(opts->swave) pdf_swave->Draw("hist same C");
  603. design_pdfLine(pdf_interference, psInterferenceColor, kDashDotted);
  604. if(opts->swave) pdf_interference->Draw("hist same C");
  605. design_pdfLine(pdf_tot, kBlack, kSolid);
  606. pdf_tot->Draw("hist same C");
  607. design_plot(mkpi_plot, 20, printC);
  608. design_pdfLine(mkpi_plot, kBlack, kSolid, 1.0);
  609. mkpi_plot->Draw("same e1");
  610. //draw legend
  611. TLegend* mkpi_leg = new TLegend(0.675,0.45,0.875,0.65);
  612. mkpi_leg->SetBorderSize(0);
  613. mkpi_leg->SetTextFont(132);
  614. mkpi_leg->SetFillColor(0);
  615. mkpi_leg->AddEntry(mkpi_plot, "data", "le");
  616. mkpi_leg->AddEntry(pdf_tot, "total PDF", "l");
  617. mkpi_leg->AddEntry(pdf_sig, "signal PDF", "l");
  618. mkpi_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  619. if(opts->swave){
  620. mkpi_leg->AddEntry(pdf_pwave, "P-wave PDF", "l");
  621. mkpi_leg->AddEntry(pdf_swave, "S-wave PDF", "l");
  622. mkpi_leg->AddEntry(pdf_interference, "interference PDF", "l");
  623. }
  624. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.67,
  625. this->pulls, opts->plot_label,opts->q2_label);
  626. if(this->pulls){
  627. assert(pdf_bins == mkpi_bins*bin_ratio);
  628. //calculate pulls from fit and data points:
  629. for(UInt_t b = 1; b <= mkpi_bins; b++){
  630. double p;
  631. if(mkpi_plot->GetBinError(b) == 0){
  632. p = 0.;
  633. }
  634. else{
  635. if(bin_ratio == 1){
  636. p = (mkpi_plot->GetBinContent(b) - pdf_tot->GetBinContent(b))/mkpi_plot->GetBinError(b);
  637. }
  638. //for odd ratio, take central bin from pdf w.r.t to m_bin:
  639. else if(bin_ratio%2 != 0){
  640. p = (mkpi_plot->GetBinContent(b) - pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2))/mkpi_plot->GetBinError(b);
  641. }
  642. //else, average the two central bins from pdf w.r.t. to angle_bin:
  643. else{
  644. p = (mkpi_plot->GetBinContent(b) - (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2. ) / mkpi_plot->GetBinError(b); //take central of 10 pdfbins
  645. }
  646. }
  647. mkpi_pulls->SetBinContent(b, p);
  648. }
  649. pad2->Clear();
  650. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  651. pad2->SetTickx();
  652. pad2->cd();
  653. design_pull(mkpi_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  654. mkpi_pulls->Draw();
  655. //add two 3-sigma lines:
  656. TLine * lUp = threeSigmaLine(mkpi_min, mkpi_max, true);
  657. TLine * lLow = threeSigmaLine(mkpi_min, mkpi_max, false);
  658. lUp->Draw("same");
  659. lLow->Draw("same");
  660. }
  661. std::string mkpiname = prefix + "mkpi_" + postfix;
  662. saveTCanvas(mkpi_canvas, mkpiname, opts->getAllPlotTypes());
  663. output->cd();
  664. mkpi_canvas->Write();
  665. delete mkpi_plot;
  666. delete mkpi_plot_sig;
  667. delete mkpi_plot_bkg;
  668. delete pdf_sig;
  669. delete pdf_swave;
  670. delete pdf_pwave;
  671. delete pdf_interference;
  672. delete pdf_bkg;
  673. delete pdf_tot;
  674. delete mkpi_pulls;
  675. delete mkpi_canvas;
  676. delete tex;
  677. };
  678. void bu2kstarmumu_plotter::plot_angle(bu2kstarmumu_pdf* prob, bu2kstarmumu_parameters* params, std::vector<event>* events, std::string prefix, std::string postfix, bool signalregion, std::string angle, bool printC){ //signal region: plots only stuff within B_MASS_TIGHT_WINDOW MeV B mass window
  679. bool is_ctl = false, is_ctk = false, is_phi = false;
  680. std::string angle_name = latex_angle(angle, is_ctl, is_ctk, is_phi);
  681. spdlog::debug("angle:{0:s}\tctl:{1:d}\tctk:{2:d}\tphi:{3:d}",angle, is_ctl, is_ctk, is_phi);
  682. if(!is_ctl && !is_ctk && !is_phi)spdlog::error("Invalid angle name is given: " + angle);
  683. assert(is_ctl || is_ctk || is_phi);
  684. double ma = params->m_b() - B_MASS_TIGHT_WINDOW;
  685. double mb = params->m_b() + B_MASS_TIGHT_WINDOW;
  686. double fsig = params->f_sig();
  687. if(opts->extended_ml) fsig = params->n_sig() / (params->n_sig()+params->n_bkg());
  688. if (signalregion){
  689. double rsig = prob->integral_m_sig_prob(params, ma, mb);
  690. double rbkg = prob->integral_m_bkg_prob(params, ma, mb);
  691. fsig = fsig*rsig/(fsig*rsig + (1.0-fsig)*rbkg);
  692. }
  693. unsigned int angle_bins = 0;
  694. double angle_min = 0.;
  695. double angle_max = 0.;
  696. if(is_ctl){
  697. angle_bins = opts->plots_costhetal_bins;
  698. angle_min = opts->ctl_min;
  699. angle_max = opts->ctl_max;
  700. if(!opts->full_angular && opts->folding != 0) angle_bins /= 2;
  701. }
  702. else if(is_ctk){
  703. angle_bins = opts->plots_costhetak_bins;
  704. angle_min = opts->ctk_min;
  705. angle_max = opts->ctk_max;
  706. }
  707. else if(is_phi){
  708. angle_bins = opts->plots_phi_bins;
  709. angle_min = opts->phi_min;
  710. angle_max = opts->phi_max;
  711. if(!opts->full_angular) angle_bins /= 2;
  712. }
  713. assert(angle_min != 0. || angle_max != 0.);
  714. TCanvas *angle_canvas = nullptr;
  715. if(printC) angle_canvas = new TCanvas((angle+"_"+postfix).c_str(), ("B+ Likelihood Analysis: "+angle_name+" projection").c_str());
  716. else angle_canvas = new TCanvas((angle+"_"+postfix).c_str(), ("B+ Likelihood Analysis: "+angle_name+" projection").c_str(),1600,1200);
  717. const double pullHeight = 0.27;
  718. const double pullFrameRange = 6.5;
  719. TPad *pad1 = new TPad(("pad1_"+angle).c_str(), "plot",0.0,pullHeight,1.0,1.0,0);
  720. TPad *pad2 = new TPad(("pad2_"+angle).c_str(), "pull",0.0,0.0,1.0,pullHeight,0);
  721. if(this->pulls){
  722. pad1->Draw();
  723. pad2->Draw();
  724. pad1->SetBorderSize (0);
  725. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  726. pad1->SetTickx();
  727. pad1->SetTicky();
  728. pad1->cd();
  729. }
  730. else{
  731. angle_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  732. angle_canvas->SetTickx();
  733. angle_canvas->SetTicky();
  734. }
  735. std::ostringstream sout;
  736. sout << ";" << angle_name << ";" << EVENTS_TAG << " / " << std::setprecision(2) << (angle_max-angle_min)/angle_bins;
  737. TH1D* angle_plot_sig = new TH1D((angle+"_sig").c_str(), sout.str().c_str(), angle_bins, angle_min, angle_max);
  738. TH1D* angle_plot_bkg = new TH1D((angle+"_bkg").c_str(), sout.str().c_str(), angle_bins, angle_min, angle_max);
  739. TH1D* angle_plot = new TH1D((angle+"_plot").c_str(), sout.str().c_str(), angle_bins, angle_min, angle_max);
  740. angle_plot->Sumw2();
  741. std::ostringstream spulls;
  742. spulls << ";" << angle_name << ";" + latex_pull();
  743. TH1D* angle_pulls = new TH1D((angle+"_pulls").c_str(), spulls.str().c_str(), angle_bins, angle_min, angle_max);
  744. TH1D* angle_averaged = new TH1D((angle+"_averaged").c_str(), (angle+"_averaged").c_str(), angle_bins, angle_min, angle_max);
  745. bool sWeighted = false;
  746. double nevents = 0.0;
  747. for (auto evt: *events){
  748. if (!signalregion || (evt.m > ma && evt.m < mb)){
  749. double weight = 1.0, value = -100.0;
  750. if (opts->weighted_fit){
  751. weight = evt.weight;
  752. }
  753. if(evt.sweight != 1.0){
  754. sWeighted = true;
  755. weight *= evt.sweight;
  756. }
  757. if (is_phi)value = evt.phi;
  758. else if (is_ctk)value = evt.costhetak;
  759. else if (is_ctl)value = evt.costhetal;
  760. else return;
  761. if (evt.event_type == 0) angle_plot_sig->Fill(value, weight);
  762. else angle_plot_bkg->Fill(value, weight);
  763. angle_plot->Fill(value, weight);
  764. nevents += weight;
  765. }
  766. }
  767. if(sWeighted) fsig = 1.0;
  768. const UInt_t bin_ratio = PLOT_NBINS_RATIO/2;
  769. unsigned int pdf_bins = angle_bins * bin_ratio;
  770. double dangle = (angle_max-angle_min)/pdf_bins;
  771. TH1D* pdf_sig = new TH1D((angle+"_pdf_sig").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  772. TH1D* pdf_swave = new TH1D((angle+"_pdf_swave").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  773. TH1D* pdf_pwave = new TH1D((angle+"_pdf_pwave").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  774. TH1D* pdf_interference = new TH1D((angle+"_pdf_interference").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  775. TH1D* pdf_bkg = new TH1D((angle+"_pdf_bkg").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  776. TH1D* pdf_tot = new TH1D((angle+"_pdf_tot").c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  777. double prob_sig=0.0, prob_bkg=0.0, prob_pwave=0.0, prob_swave=0.0, prob_interference=0.0;
  778. double ctk_from = 0.0, ctk_to = 0.0, ctl_from=0.0, ctl_to=0.0, phi_from=0.0, phi_to=0.0;
  779. const double q2 = params->eff_q2();
  780. const double j1s = params->J1s();
  781. const double j1c = params->J1c();
  782. const double j2s = params->J2s();
  783. const double j2c = params->J2c();
  784. const double j3 = params->J3();
  785. const double j4 = params->J4();
  786. const double j5 = params->J5();
  787. const double j6s = params->J6s();
  788. const double j6c = params->J6c();
  789. const double j7 = params->J7();
  790. const double j8 = params->J8();
  791. const double j9 = params->J9();
  792. double f1=0.0, f2=0.0, f3=0.0, f4=0.0, f5=0.0, f6=0.0,
  793. f7=0.0, f8=0.0, f9=0.0, f10=0.0, f11=0.0, f12=0.0;
  794. for (unsigned int i = 0; i < pdf_bins; i++){
  795. if(is_ctk){
  796. ctk_from = angle_min + i*dangle;
  797. ctk_to = angle_min + (i+1)*dangle;
  798. ctl_from = opts->ctl_min;
  799. ctl_to = opts->ctl_max;
  800. phi_from = opts->phi_min;
  801. phi_to = opts->phi_max;
  802. }
  803. else if(is_ctl){
  804. ctk_from = opts->ctk_min;
  805. ctk_to = opts->ctk_max;
  806. ctl_from = angle_min + i*dangle;
  807. ctl_to = angle_min + (i+1)*dangle;
  808. phi_from = opts->phi_min;
  809. phi_to = opts->phi_max;
  810. }
  811. else if(is_phi){
  812. ctk_from = opts->ctk_min;
  813. ctk_to = opts->ctk_max;
  814. ctl_from = opts->ctl_min;
  815. ctl_to = opts->ctl_max;
  816. phi_from = angle_min + i*dangle;
  817. phi_to = angle_min + (i+1)*dangle;
  818. }
  819. else return;
  820. if (opts->full_angular){
  821. if (opts->use_angular_acc){
  822. prob->integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  823. f1, f2, f3, f4, f5, f6,
  824. f7, f8, f9, f10, f11, f12, q2);
  825. }
  826. else{
  827. prob->integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  828. f1, f2, f3, f4, f5, f6,
  829. f7, f8, f9, f10, f11, f12);
  830. }
  831. prob_sig = (f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  832. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)/prob->fnorm_sig;
  833. prob_pwave = prob_sig;
  834. if (opts->swave){
  835. const double fs = params->FS();
  836. const double js1 = params->SS1();
  837. const double js2 = params->SS2();
  838. const double js3 = params->SS3();
  839. const double js4 = params->SS4();
  840. const double js5 = params->SS5();
  841. double fs1=0.0, fs2=0.0, fs3=0.0, fs4=0.0, fs5=0.0, fs6=0.0;
  842. if (opts->use_angular_acc)
  843. prob->swave_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  844. fs1, fs2, fs3, fs4, fs5, fs6, q2);
  845. else
  846. prob->swave_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  847. fs1, fs2, fs3, fs4, fs5, fs6);
  848. prob_sig = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  849. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)
  850. +(fs1*fs + fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5))/prob->fnorm_sig;
  851. prob_pwave = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  852. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9))/prob->fnorm_sig;
  853. prob_swave = fs1*fs/prob->fnorm_sig;
  854. prob_interference = (fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5)/prob->fnorm_sig;
  855. }
  856. }
  857. else {
  858. if (opts->use_angular_acc){
  859. prob->folded_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  860. f1, f2, f3, f4, f5, f6,
  861. f7, f8, f9, f10, f11, f12, q2);
  862. }
  863. else{
  864. prob->folded_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  865. f1, f2, f3, f4, f5, f6,
  866. f7, f8, f9, f10, f11, f12);
  867. }
  868. //Calculated probability for all foldings
  869. //non-active coefficients are return 0 by 'folded'-functions in the lines above!
  870. prob_sig = (f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  871. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)/prob->fnorm_sig;
  872. prob_pwave = prob_sig;
  873. if(opts->swave){
  874. const double fs = params->FS();
  875. const double js1 = params->SS1();
  876. const double js2 = params->SS2();
  877. const double js3 = params->SS3();
  878. const double js4 = params->SS4();
  879. const double js5 = params->SS5();
  880. double fs1=0.0, fs2=0.0, fs3=0.0, fs4=0.0, fs5=0.0, fs6=0.0;
  881. if (opts->use_angular_acc){
  882. prob->folded_swave_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  883. fs1, fs2, fs3, fs4, fs5, fs6, q2);
  884. }
  885. else{
  886. prob->folded_swave_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  887. fs1, fs2, fs3, fs4, fs5, fs6);
  888. }
  889. prob_sig = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  890. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)
  891. +(fs1*fs + fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5))/prob->fnorm_sig;
  892. prob_pwave = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  893. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9))/prob->fnorm_sig;
  894. prob_swave = fs1*fs/prob->fnorm_sig;
  895. prob_interference = (fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5)/prob->fnorm_sig;
  896. }
  897. }
  898. pdf_sig->SetBinContent(i+1, prob_sig);
  899. pdf_interference->SetBinContent(i+1, prob_interference);
  900. pdf_pwave->SetBinContent(i+1, prob_pwave);
  901. pdf_swave->SetBinContent(i+1, prob_swave);
  902. if(opts->use_angular_acc && opts->use_weighted_bkg){
  903. if(opts->fit_full_angular_bkg && !opts->flat_bkg && !opts->full_angular){
  904. double pi = TMath::Pi();
  905. if(opts->folding == 0){
  906. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  907. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from-pi, phi_to-pi, q2)) /prob->fnorm_bkg;
  908. }
  909. else if(opts->folding == 1){
  910. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  911. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from, q2)
  912. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, pi-phi_to, pi-phi_from, q2)
  913. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -pi+phi_from, -pi+phi_to, q2)) /prob->fnorm_bkg;
  914. }
  915. else if(opts->folding == 2){
  916. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  917. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from, q2)
  918. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  919. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -phi_to, -phi_from, q2)) /prob->fnorm_bkg;
  920. }
  921. else if(opts->folding == 3){
  922. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  923. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  924. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)
  925. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  926. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)) /prob->fnorm_bkg;
  927. }
  928. else{ //when phi_from < 0.0 and phi_to > 0.0:
  929. assert(phi_to > phi_from);
  930. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  931. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  932. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi, q2)
  933. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  934. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  935. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, ctk_from, ctk_to, pi - phi_to, pi, q2)) /prob->fnorm_bkg;
  936. }
  937. }
  938. else if(opts->folding == 4){
  939. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  940. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  941. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)
  942. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to, q2)
  943. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)) /prob->fnorm_bkg;
  944. }
  945. else{ //when phi_from < 0.0 and phi_to > 0.0:
  946. assert(phi_to > phi_from);
  947. prob_bkg = (prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  948. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  949. + prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi, q2)
  950. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to, q2)
  951. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, -pi, -pi - phi_from, q2)
  952. + prob->integral_bkg_chebyshev(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, pi - phi_to, pi, q2)) /prob->fnorm_bkg;
  953. }
  954. }
  955. }
  956. else{
  957. prob_bkg = prob->integral_bkg_chebyshev(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2) /prob->fnorm_bkg;
  958. }
  959. }
  960. else{
  961. if(opts->fit_full_angular_bkg && !opts->flat_bkg && !opts->full_angular){
  962. if(opts->folding == 0){
  963. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  964. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from-MY_PI, phi_to-MY_PI)) /prob->fnorm_bkg;
  965. }
  966. else if(opts->folding == 1){
  967. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  968. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from)
  969. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, MY_PI-phi_to, MY_PI-phi_from)
  970. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -MY_PI+phi_from, -MY_PI+phi_to)) /prob->fnorm_bkg;
  971. }
  972. else if(opts->folding == 2){
  973. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  974. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from)
  975. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  976. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -phi_to, -phi_from)) /prob->fnorm_bkg;
  977. }
  978. else if(opts->folding == 3){
  979. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  980. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  981. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -MY_PI - phi_to : MY_PI - phi_to), (phi_to < 0.0 ? -MY_PI - phi_from : MY_PI - phi_from))
  982. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  983. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, (phi_from < 0.0 ? -MY_PI - phi_to : MY_PI - phi_to), (phi_to < 0.0 ? -MY_PI - phi_from : MY_PI - phi_from))) /prob->fnorm_bkg;
  984. }
  985. else{ //when phi_from < 0.0 and phi_to > 0.0:
  986. assert(phi_to > phi_from);
  987. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  988. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, -MY_PI, -MY_PI - phi_from)
  989. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, MY_PI - phi_to, MY_PI)
  990. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  991. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, -MY_PI, -MY_PI - phi_from)
  992. + prob->integral_bkg(params, -ctl_to, -ctl_from, ctk_from, ctk_to, MY_PI - phi_to, MY_PI)) /prob->fnorm_bkg;
  993. }
  994. }
  995. else if(opts->folding == 4){
  996. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  997. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  998. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -MY_PI - phi_to : MY_PI - phi_to), (phi_to < 0.0 ? -MY_PI - phi_from : MY_PI - phi_from))
  999. + prob->integral_bkg(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to)
  1000. + prob->integral_bkg(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, (phi_from < 0.0 ? -MY_PI - phi_to : MY_PI - phi_to), (phi_to < 0.0 ? -MY_PI - phi_from : MY_PI - phi_from))) /prob->fnorm_bkg;
  1001. }
  1002. else{ //when phi_from < 0.0 and phi_to > 0.0:
  1003. assert(phi_to > phi_from);
  1004. prob_bkg = (prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  1005. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, -MY_PI, -MY_PI - phi_from)
  1006. + prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, MY_PI - phi_to, MY_PI)
  1007. + prob->integral_bkg(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to)
  1008. + prob->integral_bkg(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, -MY_PI, -MY_PI - phi_from)
  1009. + prob->integral_bkg(params, -ctl_to, -ctl_from, -ctk_to, -ctk_from, MY_PI - phi_to, MY_PI)) /prob->fnorm_bkg;
  1010. }
  1011. }
  1012. }
  1013. else{
  1014. prob_bkg = prob->integral_bkg(params, ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to) /prob->fnorm_bkg;
  1015. }
  1016. }
  1017. pdf_bkg->SetBinContent(i+1, prob_bkg);
  1018. }
  1019. pdf_sig->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  1020. pdf_pwave->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  1021. pdf_swave->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  1022. pdf_interference->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  1023. pdf_bkg->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(angle_bins));
  1024. pdf_tot->Add(pdf_sig, pdf_bkg);
  1025. double maxpdf = (pdf_tot->GetMaximum() > angle_plot->GetMaximum() ? pdf_tot->GetMaximum() : angle_plot->GetMaximum());
  1026. if(this->pulls) pdf_sig->SetMinimum(0.1001);
  1027. else pdf_sig->SetMinimum(0.0);
  1028. pdf_sig->SetMaximum(1.45*maxpdf);
  1029. pdf_sig->SetTitleSize(0.06, "XY");
  1030. pdf_sig->SetLabelSize(0.05, "XY");
  1031. pdf_sig->SetTitleOffset(0.9, "XY");
  1032. pdf_sig->GetXaxis()->SetNoExponent(kTRUE);
  1033. TGaxis::SetMaxDigits(3);
  1034. spdlog::debug("Designing PDF...");
  1035. design_pdf(pdf_sig, kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  1036. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  1037. design_pdf(pdf_bkg,kOrange+10,kOrange+8, 3354, 1-pullHeight,pdf_sig->Integral() <= 0.0 );
  1038. if(pdf_sig->Integral() > 0.0){
  1039. pdf_bkg->Draw("hist same C");
  1040. }
  1041. else{
  1042. pdf_bkg->SetMinimum(minBkg);
  1043. pdf_bkg->SetMaximum(1.45*maxpdf);
  1044. pdf_bkg->Draw("hist C");
  1045. }
  1046. /////
  1047. spdlog::debug("Designing PDF lines...");
  1048. design_pdfLine(pdf_pwave, pWaveColor, kDashed);
  1049. if(opts->swave) pdf_pwave->Draw("hist same C");
  1050. design_pdfLine(pdf_swave, sWaveColor, kDotted);
  1051. if(opts->swave) pdf_swave->Draw("hist same C");
  1052. design_pdfLine(pdf_interference, psInterferenceColor, kDashDotted);
  1053. if(opts->swave) pdf_interference->Draw("hist same C");
  1054. design_pdfLine(pdf_tot, kBlack, kSolid);
  1055. pdf_tot->Draw("hist same C");
  1056. design_plot(angle_plot,20,printC);
  1057. design_pdfLine(angle_plot,kBlack,kSolid,1.0);
  1058. angle_plot->Draw("same e1");
  1059. if (false && angle_plot_bkg->Integral() != 0){
  1060. angle_plot_sig->SetLineColor(4);
  1061. angle_plot_sig->GetXaxis()->SetNoExponent(kTRUE);
  1062. angle_plot_sig->Draw("esame");
  1063. angle_plot_bkg->SetLineColor(2);
  1064. angle_plot_bkg->GetXaxis()->SetNoExponent(kTRUE);
  1065. if (params->f_sig() != 1.0)
  1066. angle_plot_bkg->Draw("esame");
  1067. }
  1068. TLegend* angle_leg = new TLegend(0.675,0.45,0.875,0.65);
  1069. angle_leg->SetBorderSize(0);
  1070. angle_leg->SetTextFont(132);
  1071. angle_leg->SetFillColor(0);
  1072. angle_leg->AddEntry(angle_plot, "data", "le");
  1073. angle_leg->AddEntry(pdf_tot, "total PDF", "l");
  1074. angle_leg->AddEntry(pdf_sig, "signal PDF", "l");
  1075. angle_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  1076. if(opts->swave){
  1077. angle_leg->AddEntry(pdf_pwave, "P-wave PDF", "l");
  1078. angle_leg->AddEntry(pdf_swave, "S-wave PDF", "l");
  1079. angle_leg->AddEntry(pdf_interference, "interference PDF", "l");
  1080. }
  1081. //angle_leg->Draw("same");
  1082. spdlog::debug("plotter: getting a TLatex...");
  1083. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.47,
  1084. this->pulls, opts->plot_label,opts->q2_label);
  1085. assert(pdf_bins == angle_bins*bin_ratio);
  1086. assert(bin_ratio >= 1);
  1087. //calculate pulls from fit and data points:
  1088. spdlog::debug("plotter: calculate pulls from fit and data points");
  1089. for(UInt_t b = 1; b <= angle_bins; b++){
  1090. double p;
  1091. if(bin_ratio == 1){
  1092. p = pdf_tot->GetBinContent(b);
  1093. }
  1094. //for odd ratio, take central bin from pdf w.r.t to angle_bin:
  1095. else if(bin_ratio%2 != 0){
  1096. p = pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2);
  1097. }
  1098. //else, average the two central bins from pdf w.r.t. to angle_bin:
  1099. else{
  1100. p = (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2.; //take central of 10 pdfbins
  1101. }
  1102. angle_averaged->SetBinContent(b, p);
  1103. if(angle_plot->GetBinError(b) == 0){
  1104. angle_pulls->SetBinContent(b, 0.0);
  1105. }
  1106. else{
  1107. angle_pulls->SetBinContent(b, (angle_plot->GetBinContent(b) - p)/angle_plot->GetBinError(b));
  1108. }
  1109. }
  1110. Double_t angle_chi2 = 0.0;
  1111. Int_t angle_ndf = 0, angle_Good = 0;
  1112. spdlog::debug("plotter: plotting chi2");
  1113. if(opts->plot_chi2){
  1114. angle_averaged->Chi2TestX(angle_plot, angle_chi2, angle_ndf, angle_Good, "WW");
  1115. tex->SetTextColor(kBlack);
  1116. tex->DrawLatexNDC(0.5,(this->pulls ? (0.85 - pullHeight)/(1 - pullHeight) : 0.85),("#chi^{2}: "+std::to_string(angle_chi2 / angle_ndf)).c_str());
  1117. }
  1118. if(this->pulls){
  1119. spdlog::debug("plotter: Designing pulls...");
  1120. pad2->Clear();
  1121. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  1122. pad2->SetTickx();
  1123. pad2->cd();
  1124. design_pull(angle_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  1125. angle_pulls->Draw();
  1126. //add two 3-sigma lines:
  1127. TLine * lUp = threeSigmaLine(angle_min, angle_max, true);
  1128. TLine * lLow = threeSigmaLine(angle_min, angle_max, false);
  1129. lUp->Draw("same");
  1130. lLow->Draw("same");
  1131. }
  1132. spdlog::debug("plotter: Saving...");
  1133. std::string anglename = prefix + angle + "_" + postfix;
  1134. saveTCanvas(angle_canvas,anglename,opts->getAllPlotTypes());
  1135. output->cd();
  1136. angle_canvas->Write();
  1137. spdlog::debug("plotter: Deleting stuff");
  1138. delete angle_plot;
  1139. delete angle_plot_sig;
  1140. delete angle_plot_bkg;
  1141. delete angle_pulls;
  1142. delete angle_averaged;
  1143. delete pdf_sig;
  1144. delete pdf_pwave;
  1145. delete pdf_swave;
  1146. delete pdf_interference;
  1147. delete pdf_bkg;
  1148. delete pdf_tot;
  1149. delete angle_canvas;
  1150. };
  1151. void bu2kstarmumu_plotter::plot_added_pdfs(std::vector<bu2kstarmumu_pdf*> * probs,
  1152. std::vector<bu2kstarmumu_parameters*> * params,
  1153. std::vector<std::vector<event>* > * events,
  1154. std::string prefix, std::string postfix,
  1155. bool signalregion){
  1156. if (probs->size() != params->size()){
  1157. spdlog::critical("probs size != params size!\t {0:d} \t != \t {1:d}", probs->size(), params->size());
  1158. assert(0);
  1159. }
  1160. if (probs->size() != events->size()){
  1161. spdlog::critical("probs size != events size!\t {0:d} \t != \t {1:d}", probs->size(), events->size());
  1162. assert(0);
  1163. }
  1164. for(UInt_t e = 0; e < events->size(); e++){
  1165. if(events->at(e)->size() == 0){
  1166. spdlog::error("Cannot plot empty event histograms! Events for PDF {0:d} are empty!", e);
  1167. return;
  1168. }
  1169. probs->at(e)->update_cached_normalization(params->at(e));
  1170. }
  1171. output = new TFile((prefix +"projections_addedPDFS" + opts->name + ".root").c_str(), "UPDATE");
  1172. std::string logstr = std::string("log_")+postfix;
  1173. //m(B)
  1174. if(!opts->only_angles && !opts->only_mkpi){
  1175. plot_m_added_pdfs(probs, params, events, prefix, postfix, false, false);
  1176. plot_m_added_pdfs(probs, params, events, prefix, logstr , true, false);
  1177. }
  1178. //m(Kpi)
  1179. if (opts->fit_mkpi || opts->use_mkpi){
  1180. plot_mkpi_added_pdfs(probs, params, events, prefix, postfix, signalregion, false, false);
  1181. }
  1182. //angles
  1183. if(!opts->only_Bmass && !opts->only_mass2DFit && !opts->only_mkpi){
  1184. plot_angle_added_pdfs(probs, params, events, prefix, postfix, signalregion, "ctl", false);
  1185. plot_angle_added_pdfs(probs, params, events, prefix, postfix, signalregion, "ctk", false);
  1186. plot_angle_added_pdfs(probs, params, events, prefix, postfix, signalregion, "phi", false);
  1187. }
  1188. output->Close();
  1189. delete output;
  1190. };
  1191. void bu2kstarmumu_plotter::plot_m_added_pdfs(std::vector<bu2kstarmumu_pdf*> * probs, std::vector<bu2kstarmumu_parameters*> * params, std::vector<std::vector<event>*> * events, std::string prefix, std::string postfix, bool logarithmic, bool printC){
  1192. unsigned int m_bins = opts->plots_m_bins;
  1193. double m_min = params->at(0)->m_b.get_min();
  1194. double m_max = params->at(0)->m_b.get_max();
  1195. spdlog::debug("Mass range: {0:f} - {1:f}", m_min, m_max);
  1196. //create canvas
  1197. TCanvas *m_canvas = nullptr;
  1198. std::string m_canvas_name = "Bplus Likelihood Analysis: #it{m}(#it" +latex_decay(opts->DTF) +") mass projection";
  1199. if(printC) m_canvas = new TCanvas(("m_"+postfix).c_str(), m_canvas_name.c_str());
  1200. else m_canvas = new TCanvas(("m_"+postfix).c_str(), m_canvas_name.c_str(),1600,1200);
  1201. const double pullHeight = 0.27;
  1202. const double pullFrameRange = 6.5;
  1203. TPad *pad1 = new TPad("pad1", "plot",0.0,pullHeight,1.0,1.0,0);
  1204. TPad *pad2 = new TPad("pad2", "pull",0.0,0.0,1.0,pullHeight,0);
  1205. if(this->pulls){
  1206. pad1->Draw();
  1207. pad2->Draw();
  1208. pad1->SetLogy(logarithmic);
  1209. pad1->SetBorderSize (0);
  1210. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  1211. pad1->SetTickx();
  1212. pad1->SetTicky();
  1213. pad1->cd();
  1214. }
  1215. else{
  1216. m_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  1217. m_canvas->SetLogy(logarithmic);
  1218. m_canvas->SetTickx();
  1219. m_canvas->SetTicky();
  1220. }
  1221. //create histograms
  1222. std::ostringstream sout;
  1223. sout << ";#it{m}(" + latex_decay(opts->DTF) + ") ["+MeVc()+"];" << EVENTS_TAG << " / " << std::setprecision(2) << (m_max-m_min)/m_bins << " "+MeVc()+"";
  1224. std::string spulls = ";#it{m}(" + latex_decay(opts->DTF) + ") ["+MeVc()+"];" + latex_pull();
  1225. const UInt_t bin_ratio = PLOT_NBINS_RATIO;
  1226. unsigned int pdf_bins = m_bins*bin_ratio;
  1227. double dm = (m_max-m_min)/pdf_bins;
  1228. TH1D* m_plot = new TH1D("m", sout.str().c_str(), m_bins, m_min, m_max);
  1229. TH1D* m_pulls = new TH1D("mpulls", spulls.c_str(), m_bins, m_min, m_max);
  1230. TH1D* pdf_sig = new TH1D("pdf_sig", sout.str().c_str(), pdf_bins, m_min, m_max);
  1231. TH1D* pdf_bkg = new TH1D("pdf_bkg", sout.str().c_str(), pdf_bins, m_min, m_max);
  1232. TH1D* pdf_tot = new TH1D("pdf_tot", sout.str().c_str(), pdf_bins, m_min, m_max);
  1233. m_plot->Sumw2();
  1234. //loop over all PDFs
  1235. for(UInt_t k = 0; k < params->size(); k++){
  1236. double fsig = params->at(k)->f_sig();
  1237. if (opts->extended_ml){
  1238. fsig = params->at(k)->n_sig()/(params->at(k)->n_sig()+params->at(k)->n_bkg());
  1239. }
  1240. TH1D* tmp_m = new TH1D(("tmp_m"+std::to_string(k)).c_str(), sout.str().c_str(), m_bins, m_min, m_max);
  1241. TH1D* tmp_sig = new TH1D(("tmp_sig"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, m_min, m_max);
  1242. TH1D* tmp_bkg = new TH1D(("tmp_bkg"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, m_min, m_max);
  1243. TH1D* tmp_tot = new TH1D(("tmp_tot"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, m_min, m_max);
  1244. double nevents = 0.0;
  1245. for (unsigned int i = 0; i < events->at(k)->size(); i++)
  1246. {
  1247. double weight = 1.0;
  1248. if (opts->weighted_fit) weight = events->at(k)->at(i).weight;
  1249. tmp_m->Fill(events->at(k)->at(i).m, weight);
  1250. nevents += weight;
  1251. }
  1252. double m_b = params->at(k)->m_b();
  1253. double m_scale = params->at(k)->m_scale();
  1254. double f_res = params->at(k)->m_res_1();
  1255. double sigma_1 = params->at(k)->m_sigma_1();
  1256. double sigma_2 = params->at(k)->m_sigma_2();
  1257. double alpha_1 = opts->crystalball || opts->twotailedcrystalball ? params->at(k)->alpha_1() : 0.;
  1258. double alpha_2 = opts->crystalball || opts->twotailedcrystalball ? params->at(k)->alpha_2() : 0.;
  1259. double n_1 = opts->crystalball || opts->twotailedcrystalball ? params->at(k)->n_1() : 0.;
  1260. double n_2 = opts->crystalball || opts->twotailedcrystalball ? params->at(k)->n_2() : 0.;
  1261. double prob_sig = 0.0, prob_bkg = 0.0, from = 0.0, to = 0.0;
  1262. double integral1 = 1.0, integral2 = 2.0;
  1263. if(opts->crystalball){
  1264. integral1 = integrate_crystalball(m_b, m_scale*sigma_1, alpha_1, n_1, m_min, m_max);
  1265. integral2 = integrate_crystalball(m_b, m_scale*sigma_2, alpha_2, n_2, m_min, m_max);
  1266. }
  1267. else if(opts->twotailedcrystalball){
  1268. integral1 = integrate_twotailedcrystalball(m_b, m_scale*sigma_1, alpha_1, alpha_2, n_1, n_2, m_min, m_max);
  1269. }
  1270. else{
  1271. integral1 = integrate_gauss(m_scale*sigma_1, m_b, m_min, m_max);
  1272. integral2 = integrate_gauss(m_scale*sigma_2, m_b, m_min, m_max);
  1273. }
  1274. for (unsigned int i = 0; i < pdf_bins; i++){
  1275. from = m_min + i*dm;
  1276. to = m_min + (i+1)*dm;
  1277. prob_sig = 0.0;
  1278. if (opts->crystalball){
  1279. prob_sig = integrate_crystalball(m_b, m_scale*sigma_1, alpha_1, n_1, from, to) / integral1;
  1280. if (f_res != 1.0){
  1281. prob_sig *= f_res;
  1282. prob_sig += (1.0-f_res)
  1283. * integrate_crystalball(m_b, m_scale*sigma_2, alpha_2, n_2, from, to) / integral2;
  1284. }
  1285. }
  1286. else if(opts->twotailedcrystalball){
  1287. prob_sig = integrate_twotailedcrystalball(m_b, m_scale*sigma_1, alpha_1, alpha_2, n_1, n_2, from, to) / integral1;
  1288. }
  1289. else{
  1290. prob_sig = integrate_gauss(m_scale*sigma_1, m_b, from, to) / integral1;
  1291. if (f_res != 1.0){
  1292. prob_sig *= f_res;
  1293. prob_sig += (1.0 - f_res)
  1294. * integrate_gauss(m_scale*sigma_2, m_b, from, to) / integral2;
  1295. }
  1296. }
  1297. tmp_sig->SetBinContent(i+1, prob_sig);
  1298. prob_bkg = probs->at(k)->integral_m_bkg_prob(params->at(k), from, to);
  1299. tmp_bkg->SetBinContent(i+1, prob_bkg);
  1300. }
  1301. tmp_sig->Scale(nevents * fsig * double(pdf_bins) / double(m_bins));
  1302. tmp_bkg->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(m_bins));
  1303. tmp_tot->Add(tmp_sig, tmp_bkg);
  1304. m_plot->Add(tmp_m);
  1305. pdf_sig->Add(tmp_sig);
  1306. pdf_bkg->Add(tmp_bkg);
  1307. pdf_tot->Add(tmp_tot);
  1308. delete tmp_m;
  1309. delete tmp_sig;
  1310. delete tmp_bkg;
  1311. delete tmp_tot;
  1312. }
  1313. double maxpdf= (pdf_tot->GetMaximum() > m_plot->GetMaximum() ? pdf_tot->GetMaximum() : m_plot->GetMaximum());
  1314. if(this->pulls){
  1315. if (logarithmic) pdf_sig->SetMinimum(0.1001);
  1316. else pdf_sig->SetMinimum(0.001);
  1317. }
  1318. else{ //no pull distributions
  1319. if (logarithmic) pdf_sig->SetMinimum(0.1);
  1320. else pdf_sig->SetMinimum(0.0);
  1321. }
  1322. pdf_sig->SetMaximum(1.45*maxpdf);
  1323. pdf_bkg->SetTitleSize(0.06, "XY");
  1324. pdf_bkg->SetLabelSize(0.05, "XY");
  1325. pdf_bkg->SetTitleOffset(0.9, "XY");
  1326. pdf_bkg->GetXaxis()->SetNoExponent(kTRUE);
  1327. TGaxis::SetMaxDigits(3); //TODO: check
  1328. design_pdf(pdf_sig,kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  1329. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  1330. design_pdf(pdf_bkg,kOrange+10,kOrange+8, 3354, 1-pullHeight,pdf_sig->Integral() <= 0.0 );
  1331. if(pdf_sig->Integral() > 0.0){
  1332. pdf_bkg->Draw("hist same C");
  1333. }
  1334. else{
  1335. pdf_bkg->SetMaximum(1.45*maxpdf);
  1336. pdf_bkg->SetMinimum(minBkg);
  1337. pdf_bkg->Draw("hist C");
  1338. }
  1339. pdf_tot->SetFillStyle(0);
  1340. design_pdfLine(pdf_tot,kBlack,kSolid,2.0);
  1341. pdf_tot->Draw("hist same C");
  1342. design_plot(m_plot, 20, printC);
  1343. design_pdfLine(m_plot,kBlack,kSolid,1.0);
  1344. m_plot->Draw("same e1");
  1345. //draw legend
  1346. TLegend* m_leg = new TLegend(0.675,0.45,0.875,0.65);
  1347. m_leg->SetBorderSize(0);
  1348. m_leg->SetTextFont(132);
  1349. m_leg->SetFillColor(0);
  1350. m_leg->AddEntry(m_plot, "data", "le");
  1351. m_leg->AddEntry(pdf_tot, "total PDF", "l");
  1352. m_leg->AddEntry(pdf_sig, "signal PDF", "l");
  1353. m_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  1354. //m_leg->Draw();
  1355. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.47,
  1356. this->pulls, opts->plot_label,opts->q2_label);
  1357. assert(pdf_bins == m_bins*bin_ratio);
  1358. assert(bin_ratio >= 1);
  1359. if(this->pulls){
  1360. //calculate pulls from fit and data points:
  1361. for(UInt_t b = 1; b <= m_bins; b++){
  1362. double p;
  1363. if(bin_ratio == 1){
  1364. p = pdf_tot->GetBinContent(b);
  1365. }
  1366. //for odd ratio, take central bin from pdf w.r.t to m_bin:
  1367. else if(bin_ratio%2 != 0){
  1368. p = pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2);
  1369. }
  1370. //else, average the two central bins from pdf w.r.t. to angle_bin:
  1371. else{
  1372. p = (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2.; //take central of 10 pdfbins
  1373. }
  1374. if(m_plot->GetBinError(b) == 0) m_pulls->SetBinContent(b, 0.0);
  1375. else m_pulls->SetBinContent(b, (m_plot->GetBinContent(b) - p)/m_plot->GetBinError(b));
  1376. }
  1377. pad2->Clear();
  1378. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  1379. pad2->SetTickx();
  1380. pad2->cd();
  1381. design_pull(m_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  1382. m_pulls->Draw();
  1383. //add two 3-sigma lines:
  1384. TLine * lUp = threeSigmaLine(m_min, m_max, true);
  1385. TLine * lLow = threeSigmaLine(m_min, m_max, false);
  1386. lUp->Draw("same");
  1387. lLow->Draw("same");
  1388. }
  1389. std::string mname = prefix + "m_" + postfix + "_AllPDFs";
  1390. saveTCanvas(m_canvas,mname,opts->getAllPlotTypes());
  1391. output->cd();
  1392. m_canvas->Write();
  1393. delete m_plot;
  1394. delete pdf_sig;
  1395. delete pdf_bkg;
  1396. delete pdf_tot;
  1397. delete m_pulls;
  1398. delete m_canvas;
  1399. delete tex;
  1400. }
  1401. void bu2kstarmumu_plotter::plot_mkpi_added_pdfs(std::vector<bu2kstarmumu_pdf*> * probs, std::vector<bu2kstarmumu_parameters*> * params, std::vector<std::vector<event>*> * events, std::string prefix, std::string postfix, bool signalregion, bool logarithmic, bool printC){
  1402. unsigned int mkpi_bins = opts->plots_m_bins;
  1403. double mkpi_min = opts->mkpi_min/1.0e+3;//0.7959*0.7959;//(0.892-0.100)*(0.892-0.100);//opts->m_min;
  1404. double mkpi_max = opts->mkpi_max/1.0e+3;//0.9959*0.9959;//(0.892+0.100)*(0.892+0.100);//opts->m_max;
  1405. TCanvas *mkpi_canvas = nullptr;
  1406. std::string mpki_canvas_name = "B plus Likelihood Analysis: #it{m}(#it"+ latex_Kst_decay(opts->DTF) +") ["+GeVc()+"]";
  1407. if(printC)mkpi_canvas = new TCanvas(("mkpi_"+postfix).c_str(), mpki_canvas_name.c_str());
  1408. else mkpi_canvas = new TCanvas(("mkpi_"+postfix).c_str(), mpki_canvas_name.c_str(),1600,1200);
  1409. const double pullHeight = 0.27;
  1410. const double pullFrameRange = 6.5;
  1411. TPad *pad1 = new TPad("pad1", "plot",0.0,pullHeight,1.0,1.0,0);
  1412. TPad *pad2 = new TPad("pad2", "pull",0.0,0.0,1.0,pullHeight,0);
  1413. if(this->pulls){
  1414. pad1->Draw();
  1415. pad2->Draw();
  1416. pad1->SetLogy(logarithmic);
  1417. pad1->SetBorderSize (0);
  1418. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  1419. pad1->SetTickx();
  1420. pad1->SetTicky();
  1421. pad1->cd();
  1422. }
  1423. else{
  1424. mkpi_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  1425. mkpi_canvas->SetTickx();
  1426. mkpi_canvas->SetTicky();
  1427. }
  1428. std::ostringstream sout;
  1429. sout << ";#it{m}(#it{K}^{+}#pi^{-}) ["+GeVc()+"];" << EVENTS_TAG << " / " << std::setprecision(2) << (mkpi_max-mkpi_min)/mkpi_bins << " GeV^{2}/#it{c}^{4}";
  1430. std::string spulls = ";#it{m}("+ latex_Kst_decay(opts->DTF) +") ["+MeVc()+"];" + latex_pull();
  1431. const UInt_t bin_ratio = PLOT_NBINS_RATIO;
  1432. unsigned int pdf_bins = mkpi_bins*bin_ratio;
  1433. double dm = (mkpi_max-mkpi_min)/pdf_bins;
  1434. TH1D* mkpi_plot = new TH1D("m", sout.str().c_str(), mkpi_bins, mkpi_min, mkpi_max);
  1435. TH1D* mkpi_pulls= new TH1D("mkpipulls", spulls.c_str(), mkpi_bins, mkpi_min, mkpi_max);
  1436. TH1D* pdf_sig = new TH1D("pdf_sig", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1437. TH1D* pdf_swave = new TH1D("pdf_swave", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1438. TH1D* pdf_pwave = new TH1D("pdf_pwave", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1439. TH1D* pdf_interference = new TH1D("pdf_interference", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1440. TH1D* pdf_bkg = new TH1D("pdf_bkg", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1441. TH1D* pdf_tot = new TH1D("pdf_tot", sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1442. mkpi_plot->Sumw2();
  1443. for(UInt_t k = 0; k < params->size(); k++){
  1444. double ma = params->at(k)->m_b() - B_MASS_TIGHT_WINDOW;
  1445. double mb = params->at(k)->m_b() + B_MASS_TIGHT_WINDOW;
  1446. double fsig = params->at(k)->f_sig();
  1447. if(opts->extended_ml){
  1448. fsig = params->at(k)->n_sig() / (params->at(k)->n_sig()+params->at(k)->n_bkg());
  1449. }
  1450. if(signalregion){
  1451. double rsig = probs->at(k)->integral_m_sig_prob(params->at(k), ma, mb);
  1452. double rbkg = probs->at(k)->integral_m_bkg_prob(params->at(k), ma, mb);
  1453. fsig = fsig*rsig/(fsig*rsig + (1.0-fsig)*rbkg);
  1454. }
  1455. TH1D* tmp_mkpi = new TH1D(("tmp_mkpi"+std::to_string(k)).c_str(), sout.str().c_str(), mkpi_bins, mkpi_min, mkpi_max);
  1456. TH1D* tmp_sig = new TH1D(("tmp_sig"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1457. TH1D* tmp_swave = new TH1D(("tmp_swave"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1458. TH1D* tmp_pwave = new TH1D(("tmp_pwave"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1459. TH1D* tmp_interference = new TH1D(("tmp_interference"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1460. TH1D* tmp_bkg = new TH1D(("tmp_bkg"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1461. TH1D* tmp_tot = new TH1D(("tmp_tot"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, mkpi_min, mkpi_max);
  1462. double nevents = 0.0;
  1463. for (unsigned int i = 0; i < events->at(k)->size(); i++){
  1464. if (!signalregion || (events->at(k)->at(i).m > ma && events->at(k)->at(i).m < mb)){
  1465. double weight = 1.0;
  1466. double mkpi = events->at(k)->at(i).mkpi/1.0e+3;
  1467. if (opts->weighted_fit) weight = events->at(k)->at(i).weight;
  1468. tmp_mkpi->Fill(mkpi, weight);
  1469. nevents += weight;
  1470. }
  1471. }
  1472. double gammakstar = params->at(k)->gammakstar();
  1473. double mkstar = params->at(k)->mkstar();
  1474. double asphase = params->at(k)->asphase();
  1475. double a = params->at(k)->a();
  1476. double r = params->at(k)->r();
  1477. double R = params->at(k)->R();
  1478. double gammakstarplus = params->at(k)->gammakstarplus();
  1479. double mkstarplus = params->at(k)->mkstarplus();
  1480. double gammaf800 = params->at(k)->gammaf800();
  1481. double mf800 = params->at(k)->mf800();
  1482. double f800mag = params->at(k)->f800mag();
  1483. double f800phase = params->at(k)->f800phase();
  1484. double normbkg=0.0;
  1485. std::vector<double> ch_mkpi(5, 0.0);
  1486. ch_mkpi.at(0) = params->at(k)->cbkgmkpi0();
  1487. ch_mkpi.at(1) = params->at(k)->cbkgmkpi1();
  1488. ch_mkpi.at(2) = params->at(k)->cbkgmkpi2();
  1489. ch_mkpi.at(3) = params->at(k)->cbkgmkpi3();
  1490. ch_mkpi.at(4) = params->at(k)->cbkgmkpi4();
  1491. std::vector<double> poly_mkpi(ch_mkpi.size(), 0.0);
  1492. chebyshev_to_poly(ch_mkpi, poly_mkpi);
  1493. std::vector<double> poly_corr_mkpi(ch_mkpi.size(), 0.0);
  1494. correct_poly(poly_mkpi, poly_corr_mkpi, mkpi_min, mkpi_max);
  1495. if (opts->mkpi_threshold){
  1496. normbkg = fcnc::int_threshold(mkpi_min, mkpi_max, 0.633, params->at(k)->nthreshold());
  1497. }
  1498. else{
  1499. for (unsigned int i=0; i<poly_mkpi.size(); i++){
  1500. normbkg += poly_corr_mkpi.at(i)*(pow(mkpi_max,i+1)-pow(mkpi_min,i+1))/(i+1.0);
  1501. }
  1502. }
  1503. double q2 = params->at(k)->eff_q2();
  1504. double rangednormkstarplus, rangednormkstar;
  1505. if (opts->simple_mkpi){
  1506. rangednormkstarplus = int_mkpi_simple_kstarzero_amp_squared(mkpi_min, mkpi_max, q2,
  1507. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus);
  1508. rangednormkstar = int_mkpi_simple_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar);
  1509. }
  1510. else if(opts->isobar){
  1511. rangednormkstarplus = int_mkpi_kstarzero_isobar_amp_squared(mkpi_min, mkpi_max, q2,
  1512. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  1513. rangednormkstar = int_mkpi_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar, R);
  1514. }
  1515. else{
  1516. rangednormkstarplus = int_mkpi_kstarzero_lass_amp_squared(mkpi_min, mkpi_max, q2, asphase, a, r, gammakstarplus, mkstarplus, R);
  1517. rangednormkstar = int_mkpi_bw_kstar_amp_squared(mkpi_min, mkpi_max, q2, gammakstar, mkstar, R);
  1518. }
  1519. double sxi1, sxi2, sxi3, sxi4, sxi5, sxi6;
  1520. if (opts->use_angular_acc){
  1521. probs->at(k)->swave_integrated_fj_chebyshev(sxi1, sxi2, sxi3, sxi4, sxi5, sxi6, q2);
  1522. }
  1523. else{//weighted fit and fit without acceptance
  1524. probs->at(k)->swave_integrated_fj_noacc(sxi1, sxi2, sxi3, sxi4, sxi5, sxi6);
  1525. }
  1526. double xi1, xi2, xi3, xi4, xi5, xi6,
  1527. xi7, xi8, xi9, xi10, xi11, xi12;
  1528. //double q2 = peffq2->get_value();
  1529. if (opts->use_angular_acc){
  1530. probs->at(k)->integrated_fj_chebyshev(xi1, xi2, xi3, xi4, xi5, xi6,
  1531. xi7, xi8, xi9, xi10, xi11, xi12, q2);
  1532. }
  1533. else{//weighted fit and fit without acceptance
  1534. probs->at(k)->integrated_fj_noacc(xi1, xi2, xi3, xi4, xi5, xi6,
  1535. xi7, xi8, xi9, xi10, xi11, xi12);
  1536. }
  1537. double s1s = params->at(k)->J1s();
  1538. double s1c = params->at(k)->J1c();
  1539. double s2s = params->at(k)->J2s();
  1540. double s2c = params->at(k)->J2c();
  1541. double s3 = params->at(k)->J3();
  1542. double s4 = params->at(k)->J4();
  1543. double s5 = params->at(k)->J5();
  1544. double s6s = params->at(k)->J6s();
  1545. double s6c = params->at(k)->J6c();
  1546. double s7 = params->at(k)->J7();
  1547. double s8 = params->at(k)->J8();
  1548. double s9 = params->at(k)->J9();
  1549. double fs = params->at(k)->FS();
  1550. double ss1 = params->at(k)->SS1();
  1551. double ss2 = params->at(k)->SS2();
  1552. double ss3 = params->at(k)->SS3();
  1553. double ss4 = params->at(k)->SS4();
  1554. double ss5 = params->at(k)->SS5();
  1555. double norm =
  1556. (1-fs)*(xi1*s1s + xi2*s1c + xi3*s2s + xi4*s2c + xi5*s3 + xi6*s4
  1557. + xi7*s5 + xi8*s6s + xi9*s6c + xi10*s7 + xi11*s8 + xi12*s9)
  1558. +(sxi1*fs + sxi2*ss1 + sxi3*ss2 + sxi4*ss3 + sxi5*ss4 + sxi6*ss5);
  1559. double A = (xi1*s1s + xi2*s1c + xi3*s2s + xi4*s2c + xi5*s3 + xi6*s4
  1560. + xi7*s5 + xi8*s6s + xi9*s6c + xi10*s7 + xi11*s8 + xi12*s9)/norm;
  1561. double B = sxi1/norm;
  1562. double C = (sxi2*ss1 + sxi3*ss2 + sxi4*ss3)/norm;
  1563. double D = (sxi5*ss4 + sxi6*ss5)/norm;
  1564. double prob_bkg = 0.0, from = 0.0, to = 0.0;
  1565. for (unsigned int i = 0; i < pdf_bins; i++){
  1566. from = mkpi_min + i*dm;
  1567. to = mkpi_min + (i+1)*dm;
  1568. double swavesq, pwavesq;
  1569. std::complex<double> stimespwave;
  1570. if (opts->simple_mkpi){
  1571. swavesq = fcnc::int_mkpi_simple_kstarzero_amp_squared(from, to, q2,
  1572. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus);
  1573. pwavesq = fcnc::int_mkpi_simple_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar);
  1574. stimespwave = fcnc::int_mkpi_simple_bw_kstar_amp_bar_kstarzero_amp(from, to, q2,
  1575. gammakstar, mkstar, asphase,
  1576. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus);
  1577. }
  1578. else if (opts->isobar){
  1579. swavesq = fcnc::int_mkpi_kstarzero_isobar_amp_squared(from, to, q2,
  1580. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  1581. pwavesq = fcnc::int_mkpi_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar, R);
  1582. stimespwave = fcnc::int_mkpi_bw_kstar_amp_bar_kstarzero_isobar_amp(from, to, q2,
  1583. gammakstar, mkstar, asphase,
  1584. f800mag, f800phase, gammaf800, mf800, gammakstarplus, mkstarplus, R);
  1585. }
  1586. else{//nominal lass
  1587. swavesq = fcnc::int_mkpi_kstarzero_lass_amp_squared(from, to, q2, asphase, a, r, gammakstarplus, mkstarplus, R);
  1588. pwavesq = fcnc::int_mkpi_bw_kstar_amp_squared(from, to, q2, gammakstar, mkstar, R);
  1589. stimespwave = fcnc::int_mkpi_bw_kstar_amp_bar_kstarzero_lass_amp(from, to, q2,
  1590. gammakstar, mkstar,
  1591. asphase, a, r, gammakstarplus, mkstarplus, R);
  1592. }
  1593. prob_bkg = 0.0;
  1594. if (opts->mkpi_threshold){
  1595. prob_bkg = fcnc::int_threshold(from, to, 0.633, params->at(k)->nthreshold());
  1596. }
  1597. else{
  1598. for (unsigned int i=0; i<ch_mkpi.size(); i++){
  1599. prob_bkg += poly_corr_mkpi.at(i)*(pow(to,i+1)-pow(from,i+1))/(i+1.0);
  1600. }
  1601. }
  1602. prob_bkg /= normbkg;
  1603. double pwave = A*pwavesq/(rangednormkstar);
  1604. double swave = B*swavesq/(rangednormkstarplus);
  1605. //double swave = probswave;
  1606. //double interference = 0.0;
  1607. double interference = C*(stimespwave.real()/sqrt(rangednormkstarplus)/sqrt(rangednormkstar))
  1608. + D*(stimespwave.imag()/sqrt(rangednormkstarplus)/sqrt(rangednormkstar));
  1609. tmp_sig->SetBinContent(i+1, (1.0-fs)*pwave + fs*swave + interference);
  1610. tmp_bkg->SetBinContent(i+1, prob_bkg);
  1611. tmp_swave->SetBinContent(i+1, swave);
  1612. tmp_pwave->SetBinContent(i+1, pwave);
  1613. tmp_interference->SetBinContent(i+1, interference);
  1614. tmp_tot->SetBinContent(i+1,
  1615. fsig*((1.0-fs)*pwave + fs*swave + interference)
  1616. + (1.0-fsig)*prob_bkg);
  1617. }
  1618. tmp_sig->Scale(nevents * fsig * double(pdf_bins) / double(mkpi_bins));
  1619. tmp_swave->Scale(nevents * fs*fsig * double(pdf_bins) / double(mkpi_bins));
  1620. tmp_pwave->Scale(nevents * (1.0-fs)*fsig * double(pdf_bins) / double(mkpi_bins));
  1621. tmp_interference->Scale(nevents * fsig * double(pdf_bins) / double(mkpi_bins));
  1622. tmp_bkg->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(mkpi_bins));
  1623. tmp_tot->Scale(nevents * double(pdf_bins) / double(mkpi_bins));
  1624. mkpi_plot->Add(tmp_mkpi);
  1625. pdf_sig->Add(tmp_sig);
  1626. pdf_swave->Add(tmp_swave);
  1627. pdf_pwave->Add(tmp_pwave);
  1628. pdf_interference->Add(tmp_interference);
  1629. pdf_bkg->Add(tmp_bkg);
  1630. pdf_tot->Add(tmp_tot);
  1631. delete tmp_mkpi;
  1632. delete tmp_sig;
  1633. delete tmp_swave;
  1634. delete tmp_pwave;
  1635. delete tmp_interference;
  1636. delete tmp_bkg;
  1637. delete tmp_tot;
  1638. }
  1639. double maxpdf = (pdf_tot->GetMaximum() > mkpi_plot->GetMaximum() ? pdf_tot->GetMaximum() : mkpi_plot->GetMaximum());
  1640. if(this->pulls){
  1641. if (logarithmic) pdf_sig->SetMinimum(0.1001);
  1642. else pdf_sig->SetMinimum(0.001);
  1643. }
  1644. else{ //no pull distributions
  1645. if (logarithmic) pdf_sig->SetMinimum(0.1);
  1646. else pdf_sig->SetMinimum(0.0);
  1647. }
  1648. pdf_sig->SetMaximum(1.45*maxpdf);
  1649. design_pdf(pdf_sig,kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  1650. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  1651. design_pdf(pdf_bkg,kOrange+10,kOrange+8, 3354, 1-pullHeight,pdf_sig->Integral() <= 0.0 );
  1652. if(pdf_sig->Integral() > 0.0){
  1653. pdf_bkg->Draw("hist same C");
  1654. }
  1655. else{
  1656. pdf_bkg->SetMaximum(1.45*maxpdf);
  1657. pdf_bkg->SetMinimum(minBkg);
  1658. pdf_bkg->Draw("hist C");
  1659. }
  1660. if(opts->swave){
  1661. design_pdfLine(pdf_pwave, pWaveColor, kDashed);
  1662. pdf_pwave->Draw("hist same C");
  1663. design_pdfLine(pdf_swave, sWaveColor, kDotted);
  1664. pdf_swave->Draw("hist same C");
  1665. design_pdfLine(pdf_interference, psInterferenceColor, kDashDotted);
  1666. pdf_interference->Draw("hist same C");
  1667. }
  1668. design_pdfLine(pdf_tot, kBlack, kSolid);
  1669. pdf_tot->Draw("hist same C");
  1670. design_plot(mkpi_plot, 20, printC);
  1671. mkpi_plot->Draw("same e1");
  1672. //draw legend
  1673. TLegend* mkpi_leg = new TLegend(0.675,0.45,0.875,0.65);
  1674. mkpi_leg->SetBorderSize(0);
  1675. mkpi_leg->SetTextFont(132);
  1676. mkpi_leg->SetFillColor(0);
  1677. mkpi_leg->AddEntry(mkpi_plot, "data", "le");
  1678. mkpi_leg->AddEntry(pdf_tot, "total PDF", "l");
  1679. mkpi_leg->AddEntry(pdf_sig, "signal PDF", "l");
  1680. mkpi_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  1681. if(opts->swave){
  1682. mkpi_leg->AddEntry(pdf_pwave, "P-wave PDF", "l");
  1683. mkpi_leg->AddEntry(pdf_swave, "S-wave PDF", "l");
  1684. mkpi_leg->AddEntry(pdf_interference, "interference PDF", "l");
  1685. }
  1686. //mkpi_leg->Draw();
  1687. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.47,
  1688. this->pulls, opts->plot_label,opts->q2_label);
  1689. if(this->pulls){
  1690. assert(pdf_bins == mkpi_bins*bin_ratio);
  1691. //calculate pulls from fit and data points:
  1692. for(UInt_t b = 1; b <= mkpi_bins; b++){
  1693. double p;
  1694. if(mkpi_plot->GetBinError(b) == 0){
  1695. p = 0.;
  1696. }
  1697. else{
  1698. if(bin_ratio == 1){
  1699. p = (mkpi_plot->GetBinContent(b) - pdf_tot->GetBinContent(b))/mkpi_plot->GetBinError(b);
  1700. }
  1701. //for odd ratio, take central bin from pdf w.r.t to m_bin:
  1702. else if(bin_ratio%2 != 0){
  1703. p = (mkpi_plot->GetBinContent(b) - pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2))/mkpi_plot->GetBinError(b);
  1704. }
  1705. //else, average the two central bins from pdf w.r.t. to angle_bin:
  1706. else{
  1707. p = (mkpi_plot->GetBinContent(b) - (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2. ) / mkpi_plot->GetBinError(b); //take central of 10 pdfbins
  1708. }
  1709. }
  1710. mkpi_pulls->SetBinContent(b, p);
  1711. }
  1712. pad2->Clear();
  1713. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  1714. pad2->SetTickx();
  1715. pad2->cd();
  1716. design_pull(mkpi_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  1717. mkpi_pulls->Draw();
  1718. //add two 3-sigma lines:
  1719. TLine * lUp = threeSigmaLine(mkpi_min, mkpi_max, true);
  1720. TLine * lLow = threeSigmaLine(mkpi_min, mkpi_max, false);
  1721. lUp->Draw("same");
  1722. lLow->Draw("same");
  1723. }
  1724. std::string mkpiname = prefix + "mkpi_" + postfix + "_AllPDFs";
  1725. saveTCanvas(mkpi_canvas, mkpiname, opts->getAllPlotTypes());
  1726. output->cd();
  1727. mkpi_canvas->Write();
  1728. delete mkpi_plot;
  1729. delete pdf_sig;
  1730. delete pdf_swave;
  1731. delete pdf_pwave;
  1732. delete pdf_interference;
  1733. delete pdf_bkg;
  1734. delete pdf_tot;
  1735. delete mkpi_pulls;
  1736. delete mkpi_canvas;
  1737. delete tex;
  1738. }
  1739. void bu2kstarmumu_plotter::plot_angle_added_pdfs(std::vector<bu2kstarmumu_pdf*> * probs, std::vector<bu2kstarmumu_parameters*> * params, std::vector<std::vector<event>*> * events, std::string prefix, std::string postfix, bool signalregion, std::string angle, bool printC){
  1740. bool is_ctl = false, is_ctk = false, is_phi = false;
  1741. std::string angle_name = latex_angle(angle, is_ctl, is_ctk, is_phi);
  1742. if(!is_ctl && !is_ctk && !is_phi) spdlog::error("Invalid angle name is given: " + angle );
  1743. assert(is_ctl || is_ctk || is_phi);
  1744. unsigned int angle_bins = 0;
  1745. double angle_min = 0.;
  1746. double angle_max = 0.;
  1747. if(is_ctl){
  1748. angle_bins = opts->plots_costhetal_bins;
  1749. angle_min = opts->ctl_min;
  1750. angle_max = opts->ctl_max;
  1751. if(!opts->full_angular && opts->folding != 0)
  1752. angle_bins /= 2;
  1753. }
  1754. else if(is_ctk){
  1755. angle_bins = opts->plots_costhetak_bins;
  1756. angle_min = opts->ctk_min;
  1757. angle_max = opts->ctk_max;
  1758. }
  1759. else if(is_phi){
  1760. angle_bins = opts->plots_phi_bins;
  1761. angle_min = opts->phi_min;
  1762. angle_max = opts->phi_max;
  1763. if(!opts->full_angular)
  1764. angle_bins /= 2;
  1765. }
  1766. assert(angle_min != 0. || angle_max != 0.);
  1767. TCanvas *angle_canvas = nullptr;
  1768. if(printC){
  1769. angle_canvas = new TCanvas((angle+"_"+postfix).c_str(), ("B+ Likelihood Analysis: "+angle_name+" projection").c_str());
  1770. }
  1771. else{
  1772. angle_canvas = new TCanvas((angle+"_"+postfix).c_str(), ("B+ Likelihood Analysis: "+angle_name+" projection").c_str(),1600,1200);
  1773. }
  1774. const double pullHeight = 0.27;
  1775. const double pullFrameRange = 6.5;
  1776. TPad *pad1 = new TPad(("pad1_"+angle).c_str(), "plot",0.0,pullHeight,1.0,1.0,0);
  1777. TPad *pad2 = new TPad(("pad2_"+angle).c_str(), "pull",0.0,0.0,1.0,pullHeight,0);
  1778. if(this->pulls){
  1779. pad1->Draw();
  1780. pad2->Draw();
  1781. pad1->SetBorderSize (0);
  1782. pad1->SetMargin(0.125,0.1,1e-6,0.1/ (1 - pullHeight));
  1783. pad1->SetTickx();
  1784. pad1->SetTicky();
  1785. pad1->cd();
  1786. }
  1787. else{
  1788. angle_canvas->cd()->SetMargin(0.125,0.1,0.125,0.1);
  1789. angle_canvas->SetTickx();
  1790. angle_canvas->SetTicky();
  1791. }
  1792. std::ostringstream sout;
  1793. sout << ";" << angle_name << ";" << EVENTS_TAG << " / " << std::setprecision(2) << (angle_max-angle_min)/angle_bins;
  1794. std::ostringstream spulls;
  1795. spulls << ";" << angle_name << ";" + latex_pull();
  1796. TH1D* angle_pulls = new TH1D("angle_pulls", spulls.str().c_str(), angle_bins, angle_min, angle_max);
  1797. const UInt_t bin_ratio = PLOT_NBINS_RATIO/2;
  1798. unsigned int pdf_bins = angle_bins * bin_ratio;
  1799. double dangle = (angle_max-angle_min)/pdf_bins;
  1800. TH1D* angle_plot = new TH1D("m", sout.str().c_str(), angle_bins, angle_min, angle_max);
  1801. TH1D* pdf_sig = new TH1D("pdf_sig", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1802. TH1D* pdf_swave = new TH1D("pdf_swave", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1803. TH1D* pdf_pwave = new TH1D("pdf_pwave", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1804. TH1D* pdf_interference = new TH1D("pdf_interference", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1805. TH1D* pdf_bkg = new TH1D("pdf_bkg", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1806. TH1D* pdf_tot = new TH1D("pdf_tot", sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1807. double prob_sig=0.0, prob_bkg=0.0, prob_pwave=0.0, prob_swave=0.0, prob_interference=0.0;
  1808. double ctk_from = 0.0, ctk_to = 0.0, ctl_from=0.0, ctl_to=0.0, phi_from=0.0, phi_to=0.0;
  1809. angle_plot->Sumw2();
  1810. for(UInt_t k = 0; k < params->size(); k++){
  1811. TH1D* tmp_angle = new TH1D(("tmp_angle"+std::to_string(k)).c_str(), sout.str().c_str(), angle_bins, angle_min, angle_max);
  1812. TH1D* tmp_sig = new TH1D(("tmp_sig"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1813. TH1D* tmp_swave = new TH1D(("tmp_swave"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1814. TH1D* tmp_pwave = new TH1D(("tmp_pwave"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1815. TH1D* tmp_interference = new TH1D(("tmp_interference"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1816. TH1D* tmp_bkg = new TH1D(("tmp_bkg"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1817. TH1D* tmp_tot = new TH1D(("tmp_tot"+std::to_string(k)).c_str(), sout.str().c_str(), pdf_bins, angle_min, angle_max);
  1818. double ma = params->at(k)->m_b() - B_MASS_TIGHT_WINDOW;
  1819. double mb = params->at(k)->m_b() + B_MASS_TIGHT_WINDOW;
  1820. double fsig = params->at(k)->f_sig();
  1821. if(opts->extended_ml){
  1822. fsig = params->at(k)->n_sig() / (params->at(k)->n_sig()+params->at(k)->n_bkg());
  1823. }
  1824. if (signalregion){
  1825. double rsig = probs->at(k)->integral_m_sig_prob(params->at(k), ma, mb);
  1826. double rbkg = probs->at(k)->integral_m_bkg_prob(params->at(k), ma, mb);
  1827. fsig = fsig*rsig/(fsig*rsig + (1.0-fsig)*rbkg);
  1828. }
  1829. double nevents = 0.0;
  1830. for (unsigned int i = 0; i < events->at(k)->size(); i++){
  1831. if (!signalregion || (events->at(k)->at(i).m > ma && events->at(k)->at(i).m < mb)){
  1832. double weight = 1.0, value = -100.0;
  1833. if (opts->weighted_fit)
  1834. weight = events->at(k)->at(i).weight;
  1835. if(is_phi)value = events->at(k)->at(i).phi;
  1836. else if (is_ctk)value = events->at(k)->at(i).costhetak;
  1837. else if (is_ctl)value = events->at(k)->at(i).costhetal;
  1838. else return;
  1839. tmp_angle->Fill(value, weight);
  1840. nevents += weight;
  1841. }
  1842. }
  1843. const double q2 = params->at(k)->eff_q2();
  1844. const double j1s = params->at(k)->J1s();
  1845. const double j1c = params->at(k)->J1c();
  1846. const double j2s = params->at(k)->J2s();
  1847. const double j2c = params->at(k)->J2c();
  1848. const double j3 = params->at(k)->J3();
  1849. const double j4 = params->at(k)->J4();
  1850. const double j5 = params->at(k)->J5();
  1851. const double j6s = params->at(k)->J6s();
  1852. const double j6c = params->at(k)->J6c();
  1853. const double j7 = params->at(k)->J7();
  1854. const double j8 = params->at(k)->J8();
  1855. const double j9 = params->at(k)->J9();
  1856. double f1=0.0, f2=0.0, f3=0.0, f4=0.0, f5=0.0, f6=0.0,
  1857. f7=0.0, f8=0.0, f9=0.0, f10=0.0, f11=0.0, f12=0.0;
  1858. for (unsigned int i = 0; i < pdf_bins; i++){
  1859. if(is_ctk){
  1860. ctk_from = angle_min + i*dangle;
  1861. ctk_to = angle_min + (i+1)*dangle;
  1862. ctl_from = opts->ctl_min;
  1863. ctl_to = opts->ctl_max;
  1864. phi_from = opts->phi_min;
  1865. phi_to = opts->phi_max;
  1866. }
  1867. else if(is_ctl){
  1868. ctk_from = opts->ctk_min;
  1869. ctk_to = opts->ctk_max;
  1870. ctl_from = angle_min + i*dangle;
  1871. ctl_to = angle_min + (i+1)*dangle;
  1872. phi_from = opts->phi_min;
  1873. phi_to = opts->phi_max;
  1874. }
  1875. else if(is_phi){
  1876. ctk_from = opts->ctk_min;
  1877. ctk_to = opts->ctk_max;
  1878. ctl_from = opts->ctl_min;
  1879. ctl_to = opts->ctl_max;
  1880. phi_from = angle_min + i*dangle;
  1881. phi_to = angle_min + (i+1)*dangle;
  1882. }
  1883. else return;
  1884. if (opts->full_angular){
  1885. if (opts->use_angular_acc){
  1886. probs->at(k)->integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1887. f1, f2, f3, f4, f5, f6,
  1888. f7, f8, f9, f10, f11, f12, q2);
  1889. }
  1890. else{
  1891. probs->at(k)->integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1892. f1, f2, f3, f4, f5, f6,
  1893. f7, f8, f9, f10, f11, f12);
  1894. }
  1895. prob_sig = (f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1896. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)/probs->at(k)->fnorm_sig;
  1897. prob_pwave = prob_sig;
  1898. if (opts->swave){
  1899. const double fs = params->at(k)->FS();
  1900. const double js1 = params->at(k)->SS1();
  1901. const double js2 = params->at(k)->SS2();
  1902. const double js3 = params->at(k)->SS3();
  1903. const double js4 = params->at(k)->SS4();
  1904. const double js5 = params->at(k)->SS5();
  1905. double fs1=0.0, fs2=0.0, fs3=0.0, fs4=0.0, fs5=0.0, fs6=0.0;
  1906. if (opts->use_angular_acc)
  1907. probs->at(k)->swave_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1908. fs1, fs2, fs3, fs4, fs5, fs6, q2);
  1909. else
  1910. probs->at(k)->swave_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1911. fs1, fs2, fs3, fs4, fs5, fs6);
  1912. prob_sig = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1913. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)
  1914. +(fs1*fs + fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5))/probs->at(k)->fnorm_sig;
  1915. prob_pwave = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1916. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9))/probs->at(k)->fnorm_sig;
  1917. prob_swave = fs1*fs/probs->at(k)->fnorm_sig;
  1918. prob_interference = (fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5)/probs->at(k)->fnorm_sig;
  1919. }
  1920. }
  1921. else { //folding
  1922. if (opts->use_angular_acc) probs->at(k)->folded_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1923. f1, f2, f3, f4, f5, f6,
  1924. f7, f8, f9, f10, f11, f12, q2);
  1925. else probs->at(k)->folded_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1926. f1, f2, f3, f4, f5, f6,
  1927. f7, f8, f9, f10, f11, f12);
  1928. //Calculated probability for all foldings
  1929. //non-active coefficients are return 0 by 'folded'-functions in the lines above!
  1930. prob_sig = (f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1931. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)/probs->at(k)->fnorm_sig;
  1932. prob_pwave = prob_sig;
  1933. if(opts->swave){
  1934. const double fs = params->at(k)->FS();
  1935. const double js1 = params->at(k)->SS1();
  1936. const double js2 = params->at(k)->SS2();
  1937. const double js3 = params->at(k)->SS3();
  1938. const double js4 = params->at(k)->SS4();
  1939. const double js5 = params->at(k)->SS5();
  1940. double fs1=0.0, fs2=0.0, fs3=0.0, fs4=0.0, fs5=0.0, fs6=0.0;
  1941. if (opts->use_angular_acc)
  1942. probs->at(k)->folded_swave_integrated_fj_chebyshev(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1943. fs1, fs2, fs3, fs4, fs5, fs6, q2);
  1944. else
  1945. probs->at(k)->folded_swave_integrated_fj_noacc(ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to,
  1946. fs1, fs2, fs3, fs4, fs5, fs6);
  1947. prob_sig = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1948. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9)
  1949. +(fs1*fs + fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5))/probs->at(k)->fnorm_sig;
  1950. prob_pwave = ((1-fs)*(f1*j1s + f2*j1c + f3*j2s + f4*j2c + f5*j3 + f6*j4
  1951. + f7*j5 + f8*j6s + f9*j6c + f10*j7 + f11*j8 + f12*j9))/probs->at(k)->fnorm_sig;
  1952. prob_swave = fs1*fs/probs->at(k)->fnorm_sig;
  1953. prob_interference = (fs2*js1 + fs3*js2 + fs4*js3 + fs5*js4 + fs6*js5)/probs->at(k)->fnorm_sig;
  1954. }
  1955. }
  1956. tmp_sig->SetBinContent(i+1, prob_sig);
  1957. tmp_interference->SetBinContent(i+1, prob_interference);
  1958. tmp_pwave->SetBinContent(i+1, prob_pwave);
  1959. if (opts->swave) tmp_swave->SetBinContent(i+1, prob_swave);
  1960. if(opts->use_angular_acc && opts->use_weighted_bkg){
  1961. if(opts->fit_full_angular_bkg && !opts->flat_bkg && !opts->full_angular){
  1962. double pi = TMath::Pi();
  1963. if(opts->folding == 0){
  1964. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1965. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from-pi, phi_to-pi, q2)) /probs->at(k)->fnorm_bkg;
  1966. }
  1967. else if(opts->folding == 1){
  1968. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1969. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from, q2)
  1970. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, pi-phi_to, pi-phi_from, q2)
  1971. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -pi+phi_from, -pi+phi_to, q2)) /probs->at(k)->fnorm_bkg;
  1972. }
  1973. else if(opts->folding == 2){
  1974. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1975. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from, q2)
  1976. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  1977. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -phi_to, -phi_from, q2)) /probs->at(k)->fnorm_bkg;
  1978. }
  1979. else if(opts->folding == 3){
  1980. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  1981. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1982. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)
  1983. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  1984. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)) /probs->at(k)->fnorm_bkg;
  1985. }
  1986. else{ //when phi_from < 0.0 and phi_to > 0.0:
  1987. assert(phi_to > phi_from);
  1988. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1989. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  1990. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi, q2)
  1991. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to, q2)
  1992. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  1993. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, pi - phi_to, pi, q2)) /probs->at(k)->fnorm_bkg;
  1994. }
  1995. }
  1996. else if(opts->folding == 4){
  1997. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  1998. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  1999. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)
  2000. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to, q2)
  2001. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from), q2)) /probs->at(k)->fnorm_bkg;
  2002. }
  2003. else{ //when phi_from < 0.0 and phi_to > 0.0:
  2004. assert(phi_to > phi_from);
  2005. prob_bkg = (probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2)
  2006. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from, q2)
  2007. + probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi, q2)
  2008. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to, q2)
  2009. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, -pi, -pi - phi_from, q2)
  2010. + probs->at(k)->integral_bkg_chebyshev(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, pi - phi_to, pi, q2)) /probs->at(k)->fnorm_bkg;
  2011. }
  2012. }
  2013. }
  2014. else{
  2015. prob_bkg = probs->at(k)->integral_bkg_chebyshev(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to, q2) /probs->at(k)->fnorm_bkg;
  2016. }
  2017. }
  2018. else{
  2019. if(opts->fit_full_angular_bkg && !opts->flat_bkg && !opts->full_angular){
  2020. double pi = TMath::Pi();
  2021. if(opts->folding == 0){
  2022. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2023. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from-pi, phi_to-pi)) /probs->at(k)->fnorm_bkg;
  2024. }
  2025. else if(opts->folding == 1){
  2026. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2027. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from)
  2028. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, pi-phi_to, pi-phi_from)
  2029. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -pi+phi_from, -pi+phi_to)) /probs->at(k)->fnorm_bkg;
  2030. }
  2031. else if(opts->folding == 2){
  2032. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2033. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -phi_to, -phi_from)
  2034. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  2035. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -phi_to, -phi_from)) /probs->at(k)->fnorm_bkg;
  2036. }
  2037. else if(opts->folding == 3){
  2038. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  2039. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2040. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from))
  2041. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  2042. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from))) /probs->at(k)->fnorm_bkg;
  2043. }
  2044. else{ //when phi_from < 0.0 and phi_to > 0.0:
  2045. assert(phi_to > phi_from);
  2046. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2047. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from)
  2048. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi)
  2049. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, phi_from, phi_to)
  2050. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, -pi, -pi - phi_from)
  2051. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, ctk_from, ctk_to, pi - phi_to, pi)) /probs->at(k)->fnorm_bkg;
  2052. }
  2053. }
  2054. else if(opts->folding == 4){
  2055. if((phi_from <= 0.0 && phi_to <= 0.0) || (phi_from >= 0.0 && phi_to >= 0.0)){
  2056. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2057. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from))
  2058. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to)
  2059. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, (phi_from < 0.0 ? -pi - phi_to : pi - phi_to), (phi_to < 0.0 ? -pi - phi_from : pi - phi_from))) /probs->at(k)->fnorm_bkg;
  2060. }
  2061. else{ //when phi_from < 0.0 and phi_to > 0.0:
  2062. assert(phi_to > phi_from);
  2063. prob_bkg = (probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to)
  2064. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, -pi, -pi - phi_from)
  2065. + probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, pi - phi_to, pi)
  2066. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, phi_from, phi_to)
  2067. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, -pi, -pi - phi_from)
  2068. + probs->at(k)->integral_bkg(params->at(k), -ctl_to, -ctl_from, -ctk_to, -ctk_from, pi - phi_to, pi)) /probs->at(k)->fnorm_bkg;
  2069. }
  2070. }
  2071. }
  2072. else{
  2073. prob_bkg = probs->at(k)->integral_bkg(params->at(k), ctl_from, ctl_to, ctk_from, ctk_to, phi_from, phi_to) /probs->at(k)->fnorm_bkg;
  2074. }
  2075. }
  2076. tmp_bkg->SetBinContent(i+1, prob_bkg);
  2077. }
  2078. tmp_sig->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  2079. tmp_pwave->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  2080. if (opts->swave) tmp_swave->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  2081. tmp_interference->Scale(nevents * fsig * double(pdf_bins) / double(angle_bins));
  2082. tmp_bkg->Scale(nevents * (1.0-fsig) * double(pdf_bins) / double(angle_bins));
  2083. tmp_tot->Add(tmp_sig, tmp_bkg);
  2084. angle_plot->Add(tmp_angle);
  2085. pdf_sig->Add(tmp_sig);
  2086. if (opts->swave) pdf_swave->Add(tmp_swave);
  2087. pdf_pwave->Add(tmp_pwave);
  2088. pdf_interference->Add(tmp_interference);
  2089. pdf_bkg->Add(tmp_bkg);
  2090. pdf_tot->Add(tmp_tot);
  2091. delete tmp_angle;
  2092. delete tmp_sig;
  2093. delete tmp_swave;
  2094. delete tmp_pwave;
  2095. delete tmp_interference;
  2096. delete tmp_bkg;
  2097. delete tmp_tot;
  2098. }
  2099. double maxpdf = (pdf_tot->GetMaximum() > angle_plot->GetMaximum() ? pdf_tot->GetMaximum() : angle_plot->GetMaximum());
  2100. if(this->pulls) pdf_sig->SetMinimum(0.1001);
  2101. else pdf_sig->SetMinimum(0.0);
  2102. pdf_sig->SetMaximum(1.45*maxpdf);
  2103. pdf_sig->SetTitleSize(0.06, "XY");
  2104. pdf_sig->SetLabelSize(0.05, "XY");
  2105. pdf_sig->SetTitleOffset(0.9, "XY");
  2106. pdf_sig->GetXaxis()->SetNoExponent(kTRUE);
  2107. TGaxis::SetMaxDigits(3);
  2108. design_pdf(pdf_sig,kAzure, kAzure-5, 1001, 1-pullHeight, this->pulls);
  2109. if(pdf_sig->Integral() > 0.0) pdf_sig->Draw("hist C");
  2110. design_pdf(pdf_bkg,kOrange+10,kOrange+8, 3354, 1-pullHeight,pdf_sig->Integral() <= 0.0 );
  2111. if(pdf_sig->Integral() > 0.0){
  2112. pdf_bkg->Draw("hist same C");
  2113. }
  2114. else{
  2115. pdf_bkg->SetMaximum(1.45*maxpdf);
  2116. pdf_bkg->SetMinimum(minBkg);
  2117. pdf_bkg->Draw("hist C");
  2118. }
  2119. /////
  2120. design_pdfLine(pdf_pwave, pWaveColor, kDashed);
  2121. if(opts->swave) pdf_pwave->Draw("hist same C");
  2122. design_pdfLine(pdf_swave, sWaveColor, kDotted);
  2123. if(opts->swave) pdf_swave->Draw("hist same C");
  2124. design_pdfLine(pdf_interference, psInterferenceColor, kDashDotted);
  2125. if(opts->swave) pdf_interference->Draw("hist same C");
  2126. design_pdfLine(pdf_tot, kBlack, kSolid);
  2127. pdf_tot->Draw("hist same C");
  2128. design_plot(angle_plot, 20, printC);
  2129. angle_plot->Draw("same e1");
  2130. TLegend* angle_leg = new TLegend(0.675,0.45,0.875,0.65);
  2131. angle_leg->SetBorderSize(0);
  2132. angle_leg->SetTextFont(132);
  2133. angle_leg->SetFillColor(0);
  2134. angle_leg->AddEntry(angle_plot, "data", "le");
  2135. angle_leg->AddEntry(pdf_tot, "total PDF", "l");
  2136. angle_leg->AddEntry(pdf_sig, "signal PDF", "l");
  2137. angle_leg->AddEntry(pdf_bkg, "bkg PDF", "l");
  2138. if(opts->swave){
  2139. angle_leg->AddEntry(pdf_pwave, "P-wave PDF", "l");
  2140. angle_leg->AddEntry(pdf_swave, "S-wave PDF", "l");
  2141. angle_leg->AddEntry(pdf_interference, "interference PDF", "l");
  2142. }
  2143. //angle_leg->Draw("same");
  2144. TLatex *tex = design_TLatex(texsizelarge,texsizesmall, pullHeight, 0.47,
  2145. this->pulls, opts->plot_label,opts->q2_label);
  2146. if(this->pulls){
  2147. assert(pdf_bins == angle_bins*bin_ratio);
  2148. //calculate pulls from fit and data points:
  2149. for(UInt_t b = 1; b <= angle_bins; b++){
  2150. double p;
  2151. if(angle_plot->GetBinError(b) == 0)
  2152. p = 0.;
  2153. else{
  2154. if(bin_ratio == 1){
  2155. p = (angle_plot->GetBinContent(b) - pdf_tot->GetBinContent(b))/angle_plot->GetBinError(b);
  2156. }
  2157. //for odd ratio, take central bin from pdf w.r.t to angle_bin:
  2158. else if(bin_ratio%2 != 0){
  2159. p = (angle_plot->GetBinContent(b) - pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2))/angle_plot->GetBinError(b);
  2160. }
  2161. //else, average the two central bins from pdf w.r.t. to angle_bin:
  2162. else{
  2163. p = (angle_plot->GetBinContent(b) - (pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2)+pdf_tot->GetBinContent(b*bin_ratio - bin_ratio/2 + 1))/2. ) / angle_plot->GetBinError(b); //take central of 10 pdfbins
  2164. }
  2165. }
  2166. angle_pulls->SetBinContent(b, p);
  2167. }
  2168. pad2->Clear();
  2169. pad2->SetMargin(0.125,0.1,0.125/ pullHeight, 1e-6);
  2170. pad2->SetTickx();
  2171. pad2->cd();
  2172. design_pull(angle_pulls, kBlack,kGray+2,pullHeight,pullFrameRange);
  2173. angle_pulls->Draw();
  2174. //add two 3-sigma lines:
  2175. TLine * lUp = threeSigmaLine(angle_min, angle_max, true);
  2176. TLine * lLow = threeSigmaLine(angle_min, angle_max, false);
  2177. lUp->Draw("same");
  2178. lLow->Draw("same");
  2179. }
  2180. std::string anglename = prefix + angle + "_" + postfix+ "_AllPDFs";
  2181. saveTCanvas(angle_canvas, anglename, opts->getAllPlotTypes());
  2182. output->cd();
  2183. angle_canvas->Write();
  2184. delete angle_plot;
  2185. delete angle_pulls;
  2186. delete pdf_sig;
  2187. delete pdf_pwave;
  2188. delete pdf_swave;
  2189. delete pdf_interference;
  2190. delete pdf_bkg;
  2191. delete pdf_tot;
  2192. delete angle_canvas;
  2193. delete tex;
  2194. }
  2195. void bu2kstarmumu_plotter::SetPulls(bool drawpulls){
  2196. this->pulls = drawpulls;
  2197. }
  2198. int bu2kstarmumu_plotter::plotYieldInQ2(bool fixRange, std::vector<parameters*> fitParams[], std::vector<pdf *> pdf[], int nPDFs, std::vector<UInt_t>nEvts[], std::string prefix, std::string plotName){
  2199. // CMS [1 - 8.68], [10.09 - 12.86], [14.18 - 19.00]
  2200. double CMS_X[3] = {4.84, 11.475, 16.59};
  2201. double CMS_EX[3] = {3.84, 1.385, 2.41};
  2202. double CMS_Y[3] = {2.7, 4.1, 5.6};
  2203. double CMS_EY[3] = {0.0, 0.0, 0.0};
  2204. double CMS_sig[3] = {22.1,25.9,45.1};
  2205. double CMS_sig_E[3] = {8.1,6.3,8.0};
  2206. double CMS_bkg[3] = {49.0,14.0,20.0};
  2207. double CMS_bkg_E[3] = {0.0,0.0,0.0};
  2208. TGraphErrors *graphSignificanceCMS = new TGraphErrors(3,CMS_X,CMS_Y,CMS_EX,CMS_EY);
  2209. //Not used, but keep it in case
  2210. TGraphErrors *graphSigCMS = new TGraphErrors(3,CMS_X,CMS_sig,CMS_EX,CMS_sig_E);
  2211. TGraphErrors *graphBkgCMS = new TGraphErrors(3,CMS_X,CMS_bkg,CMS_EX,CMS_bkg_E);
  2212. graphSigCMS->SetTitle("SigCMS");
  2213. graphBkgCMS->SetTitle("BkgCMS");
  2214. //Protection against the 1.1-6.0 bin
  2215. const int nBins = opts->get_nQ2bins()==5 ? 4 : opts->get_nQ2bins();
  2216. double bkg_yield_tot[nBins];
  2217. double sig_yield_tot[nBins];
  2218. for (int n = 0; n < nPDFs; n++){
  2219. TGraphErrors *tmpSig = new TGraphErrors();
  2220. TGraphErrors *tmpBkg = new TGraphErrors();
  2221. TGraphErrors *tmpSignificance = new TGraphErrors();
  2222. for (int b = 0; b < nBins; b++){
  2223. double binCenter = bin_center_q2(opts,b);
  2224. double binError = bin_halfWidth_q2(opts,b);
  2225. //TODO: add couts
  2226. //First get the measured mean
  2227. double measured_m =((fcnc::bu2kstarmumu_parameters *)fitParams[b].at(n))->m_b.get_value();
  2228. //Then get the fraction of signal
  2229. double f_sig =((fcnc::bu2kstarmumu_parameters *)fitParams[b].at(n))->f_sig.get_value();
  2230. //If fixed window, use B_MASS_TIGHT_WINDOW
  2231. //Otherwise use 2*sigma //TODO: for now only one sigma
  2232. double window = 0.0;
  2233. if (fixRange) window = B_MASS_TIGHT_WINDOW;
  2234. else window = 2*((fcnc::bu2kstarmumu_parameters *)fitParams[b].at(n))->m_sigma_1.get_value();
  2235. //Get the probabilities
  2236. double sig_prob = ((fcnc::bu2kstarmumu_pdf*) pdf[b].at(n))->integral_m_sig_prob((fcnc::bu2kstarmumu_parameters*)fitParams[b].at(n),measured_m-window, measured_m+window);
  2237. double bkg_prob = ((fcnc::bu2kstarmumu_pdf*) pdf[b].at(n))->integral_m_bkg_prob((fcnc::bu2kstarmumu_parameters*)fitParams[b].at(n),measured_m-window, measured_m+window);
  2238. double bkg_yield = bkg_prob * nEvts[b].at(n)*(1.0-f_sig);
  2239. double sig_yield = sig_prob * nEvts[b].at(n)*f_sig;
  2240. bkg_yield_tot[b] += bkg_yield;
  2241. sig_yield_tot[b] += sig_yield;
  2242. spdlog::debug("Bkg yield: {0:f}", bkg_yield);
  2243. spdlog::debug("Sig yield: {0:f}", sig_yield);
  2244. //TODO: add yield errors!
  2245. double significance = sig_yield/sqrt(sig_yield+bkg_yield);
  2246. //Signal
  2247. tmpSig->SetPoint(tmpSig->GetN(), binCenter, sig_yield);
  2248. tmpSig->SetPointError(tmpSig->GetN()-1, binError, 0.0);
  2249. //Background
  2250. tmpBkg->SetPoint(tmpBkg->GetN(), binCenter, bkg_yield);
  2251. tmpBkg->SetPointError(tmpBkg->GetN()-1, binError, 0.0);
  2252. //Significance
  2253. tmpSignificance->SetPoint(tmpSignificance->GetN(), binCenter, significance);
  2254. tmpSignificance->SetPointError(tmpSignificance->GetN()-1,binError,0.0);
  2255. }
  2256. std::string tmpPlotName = prefix+ plotName + "_significance_Run" + std::to_string(n+1);
  2257. //TODO: n+1 is run, so this should be fixed to pdf_idx
  2258. design_YieldInQ2(n+1, tmpSig, tmpBkg, tmpSignificance, graphSignificanceCMS, fixRange, tmpPlotName,opts->getAllPlotTypes());
  2259. design_SignificanceInQ2(n+1,tmpSignificance,graphSignificanceCMS,fixRange, std::string(tmpPlotName+"_noYields"),opts->getAllPlotTypes());
  2260. }
  2261. //Make a Run 1+2 plot
  2262. TGraphErrors *totSig = new TGraphErrors();
  2263. TGraphErrors *totBkg = new TGraphErrors();
  2264. TGraphErrors *totSignificance = new TGraphErrors();
  2265. for (int b = 0; b < nBins; b++){
  2266. double significance = sig_yield_tot[b]/sqrt( sig_yield_tot[b]+ bkg_yield_tot[b]);
  2267. double binCenter = bin_center_q2(opts,b);
  2268. double binError = bin_halfWidth_q2(opts,b);
  2269. //Signal
  2270. totSig->SetPoint(totSig->GetN(), binCenter, sig_yield_tot[b]);
  2271. totSig->SetPointError(totSig->GetN()-1, binError, 0.0);
  2272. //Background
  2273. totBkg->SetPoint(totBkg->GetN(), binCenter, bkg_yield_tot[b]);
  2274. totBkg->SetPointError(totBkg->GetN()-1, binError, 0.0);
  2275. //Significance
  2276. totSignificance->SetPoint(totSignificance->GetN(), binCenter, significance);
  2277. totSignificance->SetPointError(totSignificance->GetN()-1,binError,0.0);
  2278. }
  2279. std::string tmpPlotName = prefix+ plotName + "_significance_Run" + std::to_string(12);
  2280. design_YieldInQ2(12, totSig, totBkg, totSignificance, graphSignificanceCMS, fixRange, tmpPlotName,opts->getAllPlotTypes());
  2281. design_SignificanceInQ2(12, graphSignificanceCMS, graphSignificanceCMS, fixRange, std::string(tmpPlotName+"_noYields"),opts->getAllPlotTypes());
  2282. return 0;
  2283. }