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.

781 lines
26 KiB

  1. //Renata Kopecna
  2. #include "tests.hh"
  3. #include <spdlog.h>
  4. #include <integrals.hh>
  5. //TODO: go through what is needed
  6. #include <complex>
  7. #include <string>
  8. #include <vector>
  9. #include <iostream>
  10. #include <fstream>
  11. #include <TMath.h>
  12. #include <TLegend.h>
  13. #include <TH2D.h>
  14. #include <TRandom3.h>
  15. #include <TStyle.h>
  16. #include <TCanvas.h>
  17. #include <TFile.h>
  18. #include <TTree.h>
  19. #include <Math/SpecFuncMathCore.h>
  20. #include <Math/SpecFuncMathMore.h>
  21. #include <Math/Vector3D.h>
  22. #include <Math/Boost.h>
  23. #include <TMatrixDSym.h>
  24. #include <TVectorD.h>
  25. #include <TDecompChol.h>
  26. #include <TDecompBK.h>
  27. #include <TMatrixD.h>
  28. #include <Math/GSLIntegrator.h>
  29. #include <funcs.hh>
  30. #include <event.hh>
  31. namespace fcnc {
  32. void test_integrals(){
  33. spdlog::debug("Starting Test");
  34. //sin test
  35. unsigned int nbins=100;
  36. for (unsigned int i = 0; i < nbins; i++)
  37. {
  38. double x = -1.0 + 2.0*i/double(nbins);
  39. double a = integral_x_to_n_times_sin_x_2(x, 0);
  40. double b = 0.5*(x-0.5*sin(2.0*x));
  41. if (fabs(a-b) > 1.0e-8)
  42. {
  43. std::cout << a;
  44. std::cout << " != ";
  45. std::cout << b;
  46. std::cout << std::endl;
  47. }
  48. }
  49. for (unsigned int i = 0; i < nbins; i++)
  50. {
  51. double x = -1.0 + 2.0*i/double(nbins);
  52. double a = integral_x_to_n_times_sin_x_2(x, 1);
  53. double b = -(2*x*sin(2*x)+cos(2*x)-2*x*x)/8;
  54. if (fabs(a-b) > 1.0e-8)
  55. {
  56. std::cout << a;
  57. std::cout << " != ";
  58. std::cout << b;
  59. std::cout << std::endl;
  60. }
  61. }
  62. for (unsigned int i = 0; i < nbins; i++)
  63. {
  64. double x = -1.0 + 2.0*i/double(nbins);
  65. double a = integral_x_to_n_times_sin_x_2(x, 2);
  66. double b = -((6*x*x-3)*sin(2*x)+6*x*cos(2*x)-4*x*x*x)/24;
  67. if (fabs(a-b) > 1.0e-8)
  68. {
  69. std::cout << a;
  70. std::cout << " != ";
  71. std::cout << b;
  72. std::cout << std::endl;
  73. }
  74. }
  75. for (unsigned int i = 0; i < nbins; i++)
  76. {
  77. double x = -1.0 + 2.0*i/double(nbins);
  78. double a = integral_x_to_n_times_sin_x_2(x, 3);
  79. double b = -((4*x*x*x-6*x)*sin(2*x)+(6*x*x-3)*cos(2*x)-2*x*x*x*x)/16;
  80. if (fabs(a-b) > 1.0e-8)
  81. {
  82. std::cout << a;
  83. std::cout << " != ";
  84. std::cout << b;
  85. std::cout << std::endl;
  86. }
  87. }
  88. for (unsigned int i = 0; i < nbins; i++)
  89. {
  90. double x = -1.0 + 2.0*i/double(nbins);
  91. double a = integral_x_to_n_times_sin_x_2(x, 1);
  92. double b = -(2*x*sin(2*x)+cos(2*x)-2*x*x)/8;
  93. if (fabs(a-b) > 1.0e-8)
  94. {
  95. std::cout << a;
  96. std::cout << " != ";
  97. std::cout << b;
  98. std::cout << std::endl;
  99. }
  100. }
  101. //cos test
  102. for (unsigned int i = 0; i < nbins; i++)
  103. {
  104. double x = -1.0 + 2.0*i/double(nbins);
  105. double a = integral_x_to_n_times_cos_x_2(x, 0);
  106. double b = (sin(2.0*x)*0.5+x)*0.5;
  107. if (fabs(a-b) > 1.0e-8)
  108. {
  109. std::cout << a;
  110. std::cout << " != ";
  111. std::cout << b;
  112. std::cout << std::endl;
  113. }
  114. }
  115. std::vector<double> res;
  116. chebyshev(0.43, 13, res);
  117. for (unsigned int i = 0; i < 14; i++)
  118. {
  119. if (fabs(res.at(i) - chebyshev(0.43,i)) > 1.0e-8){
  120. spdlog::debug("CHEBYSHEV: {0:f} != {1:f}", res.at(i), chebyshev(0.43,i));
  121. }
  122. }
  123. legendre(0.43, 13, res);
  124. for (unsigned int i = 0; i < 14; i++)
  125. {
  126. if (fabs(res.at(i) - ROOT::Math::legendre(i, 0.43)) > 1.0e-8){
  127. spdlog::debug("LEGENDREPOLY {0:d}: {1:f} != {2:f}", i, res.at(i), ROOT::Math::legendre(i, 0.43));
  128. }
  129. }
  130. spdlog::debug("Finished Test");
  131. }
  132. void test_legendre()
  133. {
  134. spdlog::debug("Starting Test");
  135. TRandom3 rnd;
  136. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200);
  137. canvas->cd();
  138. unsigned int nbins = 200;
  139. TH1D * data = new TH1D("data", "data", nbins, -1.0, 1.0);
  140. for (unsigned int i =0; i<200000; i++){
  141. data->Fill(rnd.Gaus(0.0,0.5));
  142. bool finished = false;
  143. double x;
  144. while (!finished){
  145. x = rnd.Rndm();
  146. if (rnd.Rndm() < x){
  147. x = x*2.0-1.0;
  148. finished = true;
  149. }
  150. }
  151. data->Fill(x);
  152. }
  153. //data->FillRandom("gaus", 200000);
  154. data->Draw("e");
  155. unsigned int n = 20;
  156. std::vector<double> l;
  157. double dv = 2.0/nbins;
  158. std::vector<double> coeffs(n+1, 0.0);
  159. for (unsigned int j=0; j<nbins; j++) {
  160. double x = -1.0 + (j+0.5)*2.0/nbins;
  161. //orthonormal_legendre(x, n, l);
  162. legendre(x, n, l);
  163. double y = data->GetBinContent(j+1);
  164. for (unsigned int i = 0; i<n+1; i++){
  165. coeffs.at(i) += y*l.at(i) * dv * (0.5*(2.0*i+1.0));
  166. }
  167. }
  168. for (unsigned int i = 0; i<n+1; i++){
  169. spdlog::debug("coefficient {0:d} = {1:f}", i, coeffs.at(i));
  170. }
  171. TH1D * interpol = new TH1D("inter", "inter", nbins, -1.0, 1.0);
  172. for (unsigned int j=0; j<nbins; j++){
  173. double x = -1.0 + (j+0.5)*2.0/nbins;
  174. //orthonormal_legendre(x, n, l);
  175. legendre(x, n, l);
  176. double y = 0.0;
  177. for (unsigned int i = 0; i<n+1; i++){
  178. y += coeffs.at(i) * l.at(i);
  179. }
  180. interpol->SetBinContent(j+1, y);
  181. }
  182. interpol->SetLineColor(2);
  183. interpol->Draw("same l");
  184. TH1D * pol1d = new TH1D("pol1d", "pol1d", nbins, -1.0, 1.0);
  185. std::vector<double> poly_coeffs;
  186. for (unsigned int i=0; i<n+1; i++){
  187. spdlog::debug("Poly Coefficient {0:d} = {1:f}", i, poly_coeffs.at(i));
  188. }
  189. for (unsigned int j=0; j<nbins; j++) {
  190. double x = -1.0 + (j+0.5)*2.0/nbins;
  191. double y = 0.0;
  192. for (unsigned int i = 0; i<n+1; i++){
  193. y += poly_coeffs.at(i) * pow(x, int(i));
  194. }
  195. pol1d->SetBinContent(j+1, y);
  196. }
  197. pol1d->SetLineColor(3);
  198. pol1d->SetLineStyle(2);
  199. pol1d->Draw("same l");
  200. canvas->Update();
  201. canvas->Print("legendre.eps", "eps");
  202. delete data;
  203. delete interpol;
  204. delete pol1d;
  205. delete canvas;
  206. }
  207. void test_legendre_2pi()
  208. {
  209. TRandom3 rnd;
  210. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ;
  211. canvas->cd();
  212. unsigned int nbins = 200;
  213. TH1D * data = new TH1D("data", "data", nbins, -TMath::Pi(), TMath::Pi());
  214. for (unsigned int i =0; i<200000; i++)
  215. {
  216. data->Fill(rnd.Gaus(0.0,0.5));
  217. bool finished = false;
  218. double x;
  219. while (!finished)
  220. {
  221. x = rnd.Rndm();
  222. if (rnd.Rndm() < x)
  223. {
  224. x = x*2.0*TMath::Pi()-TMath::Pi();
  225. finished = true;
  226. }
  227. }
  228. data->Fill(x);
  229. }
  230. //data->FillRandom("gaus", 200000);
  231. data->Draw("e");
  232. unsigned int n = 20;
  233. std::vector<double> l;
  234. double dv = 2.0/nbins;
  235. std::vector<double> coeffs(n+1, 0.0);
  236. for (unsigned int j=0; j<nbins; j++)
  237. {
  238. double x = -1.0 + (j+0.5)*2.0/nbins; //this transforms correctly to -1...+1
  239. //orthonormal_legendre(x, n, l);
  240. legendre(x, n, l);
  241. double y = data->GetBinContent(j+1);
  242. for (unsigned int i = 0; i<n+1; i++)
  243. coeffs.at(i) += y*l.at(i) * dv * (0.5*(2.0*i+1.0));
  244. }
  245. for (unsigned int i = 0; i<n+1; i++){
  246. spdlog::debug("coefficient {0:d} = {1:f}", i, coeffs.at(i));
  247. }
  248. TH1D * interpol = new TH1D("inter", "inter", nbins, -TMath::Pi(), +TMath::Pi());
  249. for (unsigned int j=0; j<nbins; j++)
  250. {
  251. double x = -1.0 + (j+0.5)*2.0/nbins;
  252. //double x = (-1.0 + (j+0.5)*2.0/nbins) / TMath::Pi();
  253. //double x = -TMath::Pi() + (j+0.5)*2.0*TMath::Pi()/nbins;
  254. //orthonormal_legendre(x, n, l);
  255. legendre(x, n, l);
  256. double y = 0.0;
  257. for (unsigned int i = 0; i<n+1; i++){
  258. y += coeffs.at(i) * l.at(i);
  259. }
  260. interpol->SetBinContent(j+1, y);
  261. }
  262. interpol->SetLineColor(2);
  263. interpol->Draw("same l");
  264. TH1D * pol1d = new TH1D("pol1d", "pol1d", nbins, -TMath::Pi(), +TMath::Pi());
  265. std::vector<double> poly_coeffs;
  266. for (unsigned int i=0; i<n+1; i++){
  267. spdlog::debug("Poly Coefficient {0:d} = {1:f}", i, poly_coeffs.at(i));
  268. }
  269. for (unsigned int j=0; j<nbins; j++)
  270. {
  271. double x = -1.0 + (j+0.5)*2.0/nbins;
  272. //double x = (-1.0 + (j+0.5)*2.0/nbins)/TMath::Pi();
  273. //double x = xc/TMath::Pi();
  274. double y = 0.0;
  275. for (unsigned int i = 0; i<n+1; i++){
  276. y += poly_coeffs.at(i) * pow(x, int(i));
  277. }
  278. pol1d->SetBinContent(j+1, y);
  279. }
  280. pol1d->SetLineColor(3);
  281. pol1d->SetLineStyle(2);
  282. pol1d->Draw("same l");
  283. canvas->Update();
  284. canvas->Print("legendre2pi.eps", "eps");
  285. delete data;
  286. delete interpol;
  287. delete pol1d;
  288. delete canvas;
  289. }
  290. void test_chebyshev()
  291. {
  292. TRandom3 rnd;
  293. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ;
  294. canvas->cd();
  295. unsigned int nbins = 200;
  296. TH1D * data = new TH1D("data", "data", nbins, -1.0, 1.0);
  297. for (unsigned int i =0; i<200000; i++)
  298. {
  299. data->Fill(rnd.Gaus(0.0,0.5));
  300. bool finished = false;
  301. double x;
  302. while (!finished)
  303. {
  304. x = rnd.Rndm();
  305. if (rnd.Rndm() < x)
  306. {
  307. x = x*2.0-1.0;
  308. finished = true;
  309. }
  310. }
  311. data->Fill(x);
  312. }
  313. //data->FillRandom("gaus", 200000);
  314. data->Draw("e");
  315. unsigned int n = 20;
  316. std::vector<double> l;
  317. double dv = 2.0/nbins;
  318. std::vector<double> coeffs(n+1, 0.0);
  319. for (unsigned int j=0; j<nbins; j++)
  320. {
  321. double x = -1.0 + (j+0.5)*2.0/nbins;
  322. chebyshev(x, n, l);
  323. double y = data->GetBinContent(j+1);
  324. for (unsigned int i = 0; i<n+1; i++){
  325. coeffs.at(i) += y*l.at(i) * dv / sqrt(1-x*x) / (i==0 ? TMath::Pi() : 0.5*TMath::Pi() );
  326. }
  327. }
  328. for (unsigned int i = 0; i<n+1; i++){
  329. spdlog::debug("coefficient {0:d} = {1:f}", i, coeffs.at(i));
  330. }
  331. TH1D * interpol = new TH1D("inter", "inter", nbins, -1.0, 1.0);
  332. for (unsigned int j=0; j<nbins; j++)
  333. {
  334. double x = -1.0 + (j+0.5)*2.0/nbins;
  335. chebyshev(x, n, l);
  336. double y = 0.0;
  337. for (unsigned int i = 0; i<n+1; i++){
  338. y += coeffs.at(i) * l.at(i);
  339. }
  340. interpol->SetBinContent(j+1, y);
  341. }
  342. interpol->SetLineColor(2);
  343. interpol->Draw("same l");
  344. canvas->Update();
  345. canvas->Print("chebyshev.eps", "eps");
  346. delete data;
  347. delete interpol;
  348. //delete pol1d;
  349. delete canvas;
  350. }
  351. void test_legendre_2d()
  352. {
  353. gStyle->SetPalette(1);
  354. TRandom3 rnd;
  355. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ;
  356. canvas->cd();
  357. unsigned int nbins = 200;
  358. TH2D * data = new TH2D("data", "data", nbins, -1.0, 1.0, nbins, -1.0, 1.0);
  359. for (unsigned int i =0; i<1000000; i++)
  360. {
  361. //double r = rnd.Gaus(0.7,0.2);
  362. //double phi = rnd.Rndm() * 2.0 * TMath::Pi();
  363. //data->Fill(fabs(r)*cos(phi),fabs(r)*sin(phi));
  364. data->Fill(rnd.Gaus(-0.1,0.3), rnd.Gaus(-0.1,0.3));
  365. data->Fill(rnd.Gaus(0.5,0.3), rnd.Gaus(0.5,0.3));
  366. }
  367. //data->FillRandom("gaus", 200000);
  368. data->Draw("colz");
  369. canvas->Update();
  370. canvas->Print("2d.eps", "eps");
  371. unsigned int n = 10;
  372. std::vector<double> legendre_x, legendre_y;
  373. double dv = 2.0/nbins*2.0/nbins;
  374. std::vector< std::vector<double > > coeffs(n+1, std::vector<double >(n+1, 0.0));
  375. for (unsigned int i=0; i<nbins; i++)
  376. {
  377. double x = -1.0 + (i+0.5)*2.0/nbins;
  378. for (unsigned int j=0; j<nbins; j++)
  379. {
  380. double y = -1.0 + (j+0.5)*2.0/nbins;
  381. double z = data->GetBinContent(i+1,j+1);
  382. //orthonormal_legendre(x, n, legendre_x);
  383. //orthonormal_legendre(y, n, legendre_y);
  384. legendre(x, n, legendre_x);
  385. legendre(y, n, legendre_y);
  386. for (unsigned int l = 0; l<n+1; l++)
  387. for (unsigned int m = 0; m<n+1; m++)
  388. coeffs.at(l).at(m) += z*legendre_x.at(l)*legendre_y.at(m)*dv* (0.5*(2.0*l+1.0)) * (0.5*(2.0*m+1.0));
  389. }
  390. }
  391. for (unsigned int l = 0; l<n+1; l++)
  392. for (unsigned int m = 0; m<n+1; m++)
  393. spdlog::debug("coefficient ({0:d}, {1:d}) = {2:d}", l, m, coeffs.at(l).at(m));
  394. TH2D * interpol = new TH2D("inter", "inter", nbins, -1.0, 1.0, nbins, -1.0, 1.0);
  395. for (unsigned int i=0; i<nbins; i++)
  396. {
  397. double x = -1.0 + (i+0.5)*2.0/nbins;
  398. for (unsigned int j=0; j<nbins; j++)
  399. {
  400. double y = -1.0 + (j+0.5)*2.0/nbins;
  401. //orthonormal_legendre(x, n, legendre_x);
  402. //orthonormal_legendre(y, n, legendre_y);
  403. legendre(x, n, legendre_x);
  404. legendre(y, n, legendre_y);
  405. double z = 0.0;
  406. for (unsigned int l = 0; l<n+1; l++)
  407. for (unsigned int m = 0; m<n+1; m++)
  408. z += coeffs.at(l).at(m)*legendre_x.at(l)*legendre_y.at(m);
  409. interpol->SetBinContent(i+1, j+1, z);
  410. }
  411. }
  412. //calculate chi^2
  413. double chi2 = 0.0;
  414. for (unsigned int i=0; i<nbins; i++)
  415. {
  416. for (unsigned int j=0; j<nbins; j++)
  417. {
  418. double d = data->GetBinContent(i+1, j+1);
  419. double dd = data->GetBinError(i+1, j+1);
  420. double f = interpol->GetBinContent(i+1, j+1);
  421. if (dd != 0.0)
  422. chi2 += (d-f)*(d-f)/dd/dd;
  423. }
  424. }
  425. spdlog::debug("Found a chi^2 of {0:f with {1:d} bins.", chi2, nbins*nbins);
  426. //cleanup
  427. interpol->Draw("colz");
  428. canvas->Update();
  429. canvas->Print("2dinter.eps", "eps");
  430. delete data;
  431. delete interpol;
  432. delete canvas;
  433. }
  434. /** This function tests the different versions of the complex error function.
  435. * Unfortunately the complex error function is not yet in the standard c library.
  436. **/
  437. void test_errf()
  438. {
  439. gStyle->SetPalette(1);
  440. unsigned int divisions=1000;
  441. double min=-10.0;
  442. double max=+10.0;
  443. TH2D* real_1 = new TH2D("real_1", "real part", divisions, min, max, divisions, min, max);
  444. real_1->SetMinimum(-20.0);
  445. real_1->SetMaximum(+20.0);
  446. TH2D* imaginary_1 = new TH2D("imaginary_1", "imaginary part", divisions, min, max, divisions, min, max);
  447. imaginary_1->SetMinimum(-20.0);
  448. imaginary_1->SetMaximum(+20.0);
  449. TH2D* real_2 = new TH2D("real_2", "real part", divisions, min, max, divisions, min, max);
  450. TH2D* imaginary_2 = new TH2D("imaginary_2", "imaginary part", divisions, min, max, divisions, min, max);
  451. TH2D* real_3 = new TH2D("real_3", "real part", divisions, min, max, divisions, min, max);
  452. TH2D* imaginary_3 = new TH2D("imaginary_3", "imaginary part", divisions, min, max, divisions, min, max);
  453. double r, i;
  454. std::complex<double> result, arg;
  455. for (unsigned int re = 0; re < divisions; re++)
  456. for (unsigned int im = 0; im < divisions; im++)
  457. {
  458. r = min + (max - min)/divisions*re;
  459. i = min + (max - min)/divisions*im;
  460. arg = std::complex<double>(r, i);
  461. result = 1.0-cErrF(arg);
  462. //if (!std::isnan(result.real()))
  463. real_1->SetBinContent(re, im, result.real());
  464. imaginary_1->SetBinContent(re, im, result.imag());
  465. result = 1.0-cErrF_2(arg);
  466. //if (!std::isnan(result.real()))
  467. real_2->SetBinContent(re, im, result.real());
  468. imaginary_2->SetBinContent(re, im, result.imag());
  469. result = 1.0-cErrF_3(arg);
  470. //if (!std::isnan(result.real()))
  471. real_3->SetBinContent(re, im, result.real());
  472. imaginary_3->SetBinContent(re, im, result.imag());
  473. }
  474. TCanvas *canvas_1 = new TCanvas("canvas_1", "canvas 1",1600,1200) ;
  475. canvas_1->Divide(2,1);
  476. canvas_1->cd(1);
  477. real_1->Draw("COLZ");
  478. canvas_1->cd(2);
  479. imaginary_1->Draw("COLZ");
  480. canvas_1->Update();
  481. canvas_1->Print("error_1.eps", "eps");
  482. TCanvas *canvas_2 = new TCanvas("canvas_2", "canvas 2",1600,1200) ;
  483. canvas_2->Divide(2,1);
  484. canvas_2->cd(1);
  485. real_2->Draw("COLZ");
  486. canvas_2->cd(2);
  487. imaginary_2->Draw("COLZ");
  488. canvas_2->Update();
  489. canvas_2->Print("error_2.eps", "eps");
  490. TCanvas *canvas_3 = new TCanvas("canvas_3", "canvas 3",1600,1200) ;
  491. canvas_3->Divide(2,1);
  492. canvas_3->cd(1);
  493. real_3->Draw("COLZ");
  494. canvas_3->cd(2);
  495. imaginary_3->Draw("COLZ");
  496. canvas_3->Update();
  497. canvas_3->Print("error_3.eps", "eps");
  498. TH2D* real_12 = new TH2D((*real_1) / (*real_2));
  499. TH2D* imaginary_12 = new TH2D((*imaginary_1) / (*imaginary_2));
  500. TCanvas *canvas_12 = new TCanvas("canvas_12", "canvas 1 - 2",1600,1200) ;
  501. canvas_12->Divide(2,1);
  502. canvas_12->cd(1);
  503. real_12->Draw("COLZ");
  504. canvas_12->cd(2);
  505. imaginary_12->Draw("COLZ");
  506. canvas_12->Update();
  507. canvas_12->Print("error_1_over_2.eps", "eps");
  508. TH2D* real_23 = new TH2D((*real_2) / (*real_3));
  509. TH2D* imaginary_23 = new TH2D((*imaginary_2) / (*imaginary_3));
  510. TCanvas *canvas_23 = new TCanvas("canvas_23", "canvas 1 - 2",1600,1200) ;
  511. canvas_23->Divide(2,1);
  512. canvas_23->cd(1);
  513. real_23->Draw("COLZ");
  514. canvas_23->cd(2);
  515. imaginary_23->Draw("COLZ");
  516. canvas_23->Update();
  517. canvas_23->Print("error_2_over_3.eps", "eps");
  518. TH2D* real_13 = new TH2D((*real_1) / (*real_3));
  519. TH2D* imaginary_13 = new TH2D((*imaginary_1) / (*imaginary_3));
  520. TCanvas *canvas_13 = new TCanvas("canvas_13", "canvas 1 - 2",1600,1200) ;
  521. canvas_13->Divide(2,1);
  522. canvas_13->cd(1);
  523. real_13->Draw("COLZ");
  524. canvas_13->cd(2);
  525. imaginary_13->Draw("COLZ");
  526. canvas_13->Update();
  527. canvas_13->Print("error_1_over_3.eps", "eps");
  528. }
  529. void test_convolutions()
  530. {
  531. gStyle->SetPalette(1);
  532. gStyle->SetOptFit(0);
  533. gStyle->SetOptStat(0);
  534. unsigned int divisions=1000;
  535. double min=-TMath::Pi();
  536. double max=+2.0*TMath::Pi();
  537. TH1D* conv_sin = new TH1D("conv_sin", "", divisions, min, max);
  538. TH1D* conv_cos = new TH1D("conv_cos", "", divisions, min, max);
  539. TH1D* conv_sin_2 = new TH1D("conv_sin_2", "", divisions, min, max);
  540. TH1D* conv_cos_2 = new TH1D("conv_cos_2", "", divisions, min, max);
  541. TH1D* conv_2_sin = new TH1D("conv_2_sin", "", divisions, min, max);
  542. TH1D* conv_2_cos = new TH1D("conv_2_cos", "", divisions, min, max);
  543. TH1D* conv_cos_2_sin = new TH1D("conv_cos_2_sin", "", divisions, min, max);
  544. TH1D* conv_sin_3 = new TH1D("conv_sin_3", "", divisions, min, max);
  545. TH1D* conv_2_sin_sin = new TH1D("conv_2_sin_sin", "", divisions, min, max);
  546. double sigma = 0.03;
  547. for (unsigned int i = 0; i < divisions; i++)
  548. {
  549. double angle = min+(max - min)/double(divisions)*i;
  550. conv_sin->SetBinContent(i+1, convoluted_sin(angle, sigma));
  551. conv_cos->SetBinContent(i+1, convoluted_cos(angle, sigma));
  552. conv_sin_2->SetBinContent(i+1, convoluted_sin_2(angle, sigma));
  553. conv_cos_2->SetBinContent(i+1, convoluted_cos_2(angle, sigma));
  554. conv_2_sin->SetBinContent(i+1, convoluted_2_sin(angle, sigma));
  555. conv_2_cos->SetBinContent(i+1, convoluted_2_cos(angle, sigma));
  556. conv_cos_2_sin->SetBinContent(i+1, convoluted_cos_2_sin(angle, sigma));
  557. conv_sin_3->SetBinContent(i+1, convoluted_sin_3(angle, sigma));
  558. //std::cout << convoluted_sin_3(angle, sigma) << std::endl;
  559. conv_2_sin_sin->SetBinContent(i+1, convoluted_2_sin_sin(angle, sigma));
  560. }
  561. conv_sin->SetLineColor(2);
  562. conv_cos->SetLineColor(3);
  563. conv_sin_2->SetLineColor(4);
  564. conv_cos_2->SetLineColor(5);
  565. conv_2_sin->SetLineColor(6);
  566. conv_2_cos->SetLineColor(7);
  567. conv_cos_2_sin->SetLineColor(8);
  568. conv_sin_3->SetLineColor(9);
  569. conv_2_sin_sin->SetLineColor(15);
  570. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ;
  571. canvas->cd();
  572. conv_sin->SetMinimum(-1.0);
  573. conv_sin->SetMaximum(1.0);
  574. conv_sin->Draw();
  575. conv_cos->Draw("same");
  576. conv_sin_2->Draw("same");
  577. conv_cos_2->Draw("same");
  578. conv_2_sin->Draw("same");
  579. conv_2_cos->Draw("same");
  580. conv_cos_2_sin->Draw("same");
  581. conv_sin_3->Draw("same");
  582. conv_2_sin_sin->Draw("same");
  583. TLegend* conv_legend = new TLegend(0.7,0.6,0.9,0.9);
  584. conv_legend->AddEntry(conv_sin, "sin #Theta", "L");
  585. conv_legend->AddEntry(conv_cos, "cos #Theta", "L");
  586. conv_legend->AddEntry(conv_sin_2, "sin #Theta^{2}", "L");
  587. conv_legend->AddEntry(conv_cos_2, "cos #Theta^{2}", "L");
  588. conv_legend->AddEntry(conv_2_sin, "sin 2#Theta", "L");
  589. conv_legend->AddEntry(conv_2_cos, "cos 2#Theta", "L");
  590. conv_legend->AddEntry(conv_cos_2_sin, "cos #Theta^{2} sin #Theta", "L");
  591. conv_legend->AddEntry(conv_sin_3, "sin #Theta ^{3}", "L");
  592. conv_legend->AddEntry(conv_2_sin_sin, "sin 2#Theta sin #Theta", "L");
  593. conv_legend->Draw();
  594. canvas->Print("convolutions.eps", "eps");
  595. delete conv_sin;
  596. delete conv_cos;
  597. delete conv_sin_2;
  598. delete conv_cos_2;
  599. delete conv_2_sin;
  600. delete conv_2_cos;
  601. delete conv_cos_2_sin;
  602. delete conv_sin_3;
  603. delete conv_2_sin_sin;
  604. delete canvas;
  605. TH1D* conv_cos_2_a = new TH1D("conv_cos_2_a", "", divisions, -1.0, +1.0);
  606. TH1D* conv_cos_2_b = new TH1D("conv_cos_2_b", "", divisions, -1.0, +1.0);
  607. TH1D* conv_cos_2_c = new TH1D("conv_cos_2_c", "", divisions, -1.0, +1.0);
  608. TH1D* conv_cos_2_d = new TH1D("conv_cos_2_d", "", divisions, -1.0, +1.0);
  609. TH1D* conv_cos_2_e = new TH1D("conv_cos_2_e", "", divisions, -1.0, +1.0);
  610. conv_cos_2_a->SetMinimum(-1.0);
  611. conv_cos_2_a->SetMaximum(1.0);
  612. for (unsigned int i = 0; i < divisions; i++)
  613. {
  614. double cos_theta = -1.0 + 2.0/divisions*(i+0.5);
  615. double angle = acos(cos_theta);
  616. conv_cos_2_a->SetBinContent(i+1, cos_theta*cos_theta);
  617. conv_cos_2_b->SetBinContent(i+1, convoluted_cos_2(angle, sigma));
  618. conv_cos_2_c->SetBinContent(i+1, convoluted_cos_2(angle, sigma)
  619. +convoluted_cos_2(-angle, sigma)
  620. +convoluted_cos_2(2.0*TMath::Pi()-angle, sigma));
  621. conv_cos_2_d->SetBinContent(i+1,1.0/sin(angle)*convoluted_cos_2_sin(angle, sigma));
  622. conv_cos_2_e->SetBinContent(i+1,1.0/sin(angle)*(convoluted_cos_2_sin(angle, sigma)
  623. +convoluted_cos_2_sin(-angle, sigma)
  624. +convoluted_cos_2_sin(2.0*TMath::Pi()-angle, sigma)
  625. ));
  626. }
  627. TCanvas *canvas2 = new TCanvas("canvas2", "canvas",1600,1200);
  628. canvas2->cd();
  629. conv_cos_2_b->SetLineColor(2);
  630. conv_cos_2_c->SetLineColor(3);
  631. conv_cos_2_d->SetLineColor(4);
  632. conv_cos_2_e->SetLineColor(5);
  633. conv_cos_2_a->Draw();
  634. conv_cos_2_b->Draw("same");
  635. conv_cos_2_c->Draw("same");
  636. conv_cos_2_d->Draw("same");
  637. conv_cos_2_e->Draw("same");
  638. canvas2->Print("overcos.eps", "eps");
  639. delete conv_cos_2_a;
  640. delete conv_cos_2_b;
  641. delete conv_cos_2_c;
  642. delete conv_cos_2_d;
  643. delete conv_cos_2_e;
  644. delete canvas2;
  645. }
  646. void test_int_convolutions()
  647. {
  648. gStyle->SetPalette(1);
  649. gStyle->SetOptFit(0);
  650. gStyle->SetOptStat(0);
  651. unsigned int divisions=1000;
  652. double min=-TMath::Pi();
  653. double max=+2.0*TMath::Pi();
  654. TH1D* conv_sin = new TH1D("conv_sin", "", divisions, min, max);
  655. TH1D* conv_cos = new TH1D("conv_cos", "", divisions, min, max);
  656. TH1D* conv_sin_2 = new TH1D("conv_sin_2", "", divisions, min, max);
  657. TH1D* conv_cos_2 = new TH1D("conv_cos_2", "", divisions, min, max);
  658. TH1D* conv_2_sin = new TH1D("conv_2_sin", "", divisions, min, max);
  659. TH1D* conv_2_cos = new TH1D("conv_2_cos", "", divisions, min, max);
  660. TH1D* conv_cos_2_sin = new TH1D("conv_cos_2_sin", "", divisions, min, max);
  661. TH1D* conv_sin_3 = new TH1D("conv_sin_3", "", divisions, min, max);
  662. TH1D* conv_2_sin_sin = new TH1D("conv_2_sin_sin", "", divisions, min, max);
  663. double sigma = 0.03;
  664. for (unsigned int i = 0; i < divisions; i++)
  665. {
  666. double angle = min+(max - min)/double(divisions)*i;
  667. conv_sin->SetBinContent(i+1, int_convoluted_sin(angle, sigma)-int_convoluted_sin(min, sigma));
  668. // conv_cos->SetBinContent(i+1, convoluted_cos(angle, sigma));
  669. conv_sin_2->SetBinContent(i+1, int_convoluted_sin_2(angle, sigma) - int_convoluted_sin_2(min, sigma));
  670. // conv_cos_2->SetBinContent(i+1, convoluted_cos_2(angle, sigma));
  671. conv_2_sin->SetBinContent(i+1, int_convoluted_2_sin(angle, sigma)-int_convoluted_2_sin(min, sigma));
  672. // conv_2_cos->SetBinContent(i+1, convoluted_2_cos(angle, sigma));
  673. conv_cos_2_sin->SetBinContent(i+1, int_convoluted_cos_2_sin(angle, sigma) - int_convoluted_cos_2_sin(min, sigma));
  674. conv_sin_3->SetBinContent(i+1, int_convoluted_sin_3(angle, sigma)-int_convoluted_sin_3(min, sigma));
  675. conv_2_sin_sin->SetBinContent(i+1, int_convoluted_2_sin_sin(angle, sigma) - int_convoluted_2_sin_sin(min, sigma));
  676. }
  677. conv_sin->SetLineColor(2);
  678. conv_cos->SetLineColor(3);
  679. conv_sin_2->SetLineColor(4);
  680. conv_cos_2->SetLineColor(5);
  681. conv_2_sin->SetLineColor(6);
  682. conv_2_cos->SetLineColor(7);
  683. conv_cos_2_sin->SetLineColor(8);
  684. conv_sin_3->SetLineColor(9);
  685. conv_2_sin_sin->SetLineColor(15);
  686. TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ;
  687. canvas->cd();
  688. conv_sin->SetMinimum(-0.5);
  689. conv_sin->SetMaximum(3.0);
  690. conv_sin->Draw();
  691. // conv_cos->Draw("same");
  692. conv_sin_2->Draw("same");
  693. // conv_cos_2->Draw("same");
  694. conv_2_sin->Draw("same");
  695. // conv_2_cos->Draw("same");
  696. conv_cos_2_sin->Draw("same");
  697. conv_sin_3->Draw("same");
  698. conv_2_sin_sin->Draw("same");
  699. TLegend* conv_legend = new TLegend(0.7,0.6,0.9,0.9);
  700. conv_legend->AddEntry(conv_sin, "sin #Theta", "L");
  701. conv_legend->AddEntry(conv_cos, "cos #Theta", "L");
  702. conv_legend->AddEntry(conv_sin_2, "sin #Theta^{2}", "L");
  703. conv_legend->AddEntry(conv_cos_2, "cos #Theta^{2}", "L");
  704. conv_legend->AddEntry(conv_2_sin, "sin 2#Theta", "L");
  705. conv_legend->AddEntry(conv_2_cos, "cos 2#Theta", "L");
  706. conv_legend->AddEntry(conv_cos_2_sin, "cos #Theta^{2} sin #Theta", "L");
  707. conv_legend->AddEntry(conv_sin_3, "sin #Theta ^{3}", "L");
  708. conv_legend->AddEntry(conv_2_sin_sin, "sin 2#Theta sin #Theta", "L");
  709. conv_legend->Draw();
  710. canvas->Print("int_convolutions.eps", "eps");
  711. delete conv_sin;
  712. delete conv_cos;
  713. delete conv_sin_2;
  714. delete conv_cos_2;
  715. delete conv_2_sin;
  716. delete conv_2_cos;
  717. delete conv_cos_2_sin;
  718. delete conv_sin_3;
  719. delete conv_2_sin_sin;
  720. delete canvas;
  721. }
  722. }