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.

646 lines
25 KiB

  1. #include "../GlobalFunctions.hh"
  2. using namespace std;
  3. using namespace RooFit ;
  4. class factor{
  5. private:
  6. public:
  7. string Channel;
  8. bool MagUp;
  9. Int_t year;
  10. Int_t nEvents;
  11. Double_t OtherScale;
  12. factor(){
  13. Channel = "";
  14. MagUp = false;
  15. nEvents = 0;
  16. OtherScale = 1.0;
  17. } //empty constructor
  18. factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp); //default constructor with no other scales
  19. factor(string Channel_tmp, bool MagUp_tmp, Int_t year, Int_t nEvents_tmp, Double_t OtherScale_tmp); //default constructor
  20. ~factor(); //destuctor
  21. };
  22. factor::factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp){
  23. Channel = Channel_tmp;
  24. MagUp = MagUp_tmp;
  25. year = year_tmp;
  26. nEvents = nEvents_tmp;
  27. OtherScale = 1.0;
  28. return;
  29. }
  30. factor::factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp, Double_t OtherScale_tmp){
  31. Channel = Channel_tmp;
  32. MagUp = MagUp_tmp;
  33. year = year_tmp;
  34. nEvents = nEvents_tmp;
  35. OtherScale = OtherScale_tmp;
  36. return;
  37. }
  38. factor::~factor(){
  39. Channel = "";
  40. MagUp = false;
  41. year = 0;
  42. nEvents = 0;
  43. OtherScale = 1.0;
  44. return;
  45. }
  46. class oneChannelFactors{ //factors just for one channel, including the lenght, for easier handling
  47. private:
  48. public:
  49. string Channel = "";
  50. vector<factor> factorsVec;
  51. int VecSize = 0;
  52. oneChannelFactors(){
  53. Channel = "";
  54. VecSize = 0;
  55. factorsVec.clear();
  56. } //empty constructor
  57. oneChannelFactors(vector<factor> factorsVec_tmp); //default constructor
  58. ~oneChannelFactors(); //destuctor
  59. };
  60. oneChannelFactors::~oneChannelFactors(){
  61. factorsVec.empty();
  62. Channel = "";
  63. VecSize = 0;
  64. }
  65. oneChannelFactors::oneChannelFactors(vector<factor> factorsVec_tmp){
  66. Channel = factorsVec_tmp.at(0).Channel; //todo, check if they are all the same
  67. factorsVec = factorsVec_tmp;
  68. VecSize = factorsVec_tmp.size();
  69. return;
  70. }
  71. class allFactors{
  72. private:
  73. public:
  74. vector<oneChannelFactors> factorsChannelVec;
  75. int NoChannels = 0;
  76. allFactors(){
  77. NoChannels = 0;
  78. factorsChannelVec.clear();
  79. } //empty constructor
  80. allFactors(int Run, bool RefChan); //default constructor
  81. ~allFactors(); //destuctor
  82. };
  83. allFactors::allFactors(int Run, bool RefChan){
  84. oneChannelFactors one_channel_factors_tmp;
  85. factor factor_tmp;
  86. vector<factor> factorsVec_tmp;
  87. if (!RefChan){
  88. //--------------------------------------------------------------------
  89. // KplusPi0
  90. //--------------------------------------------------------------------
  91. //Run I
  92. if (Run == 1){
  93. factor_tmp = factor("KplusPi0", false, 2011, 507551 );
  94. factorsVec_tmp.push_back(factor_tmp);
  95. factor_tmp = factor("KplusPi0", true, 2011, 502787 );
  96. factorsVec_tmp.push_back(factor_tmp);
  97. factor_tmp = factor("KplusPi0", false, 2012, 514015 );
  98. factorsVec_tmp.push_back(factor_tmp);
  99. factor_tmp = factor("KplusPi0", true, 2012, 500458 );
  100. factorsVec_tmp.push_back(factor_tmp);
  101. }
  102. // Run II
  103. if (Run == 2){
  104. factor_tmp = factor("KplusPi0", false, 2015, 500320 );
  105. factorsVec_tmp.push_back(factor_tmp);
  106. factor_tmp = factor("KplusPi0", true, 2015, 507272 );
  107. factorsVec_tmp.push_back(factor_tmp);
  108. factor_tmp = factor("KplusPi0", false, 2016, 999419 );
  109. factorsVec_tmp.push_back(factor_tmp);
  110. factor_tmp = factor("KplusPi0", true, 2016, 1000151 );
  111. factorsVec_tmp.push_back(factor_tmp);
  112. }
  113. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  114. factorsChannelVec.push_back(one_channel_factors_tmp);
  115. factorsVec_tmp.clear();
  116. //--------------------------------------------------------------------
  117. // B0toKstMuMu
  118. //--------------------------------------------------------------------
  119. //Run I
  120. if (Run == 1){
  121. factor_tmp = factor("B0toKstMuMu", false, 2011, 525851, 1.5 );
  122. factorsVec_tmp.push_back(factor_tmp);
  123. factor_tmp = factor("B0toKstMuMu", true, 2011, 506402, 1.5 );
  124. factorsVec_tmp.push_back(factor_tmp);
  125. factor_tmp = factor("B0toKstMuMu", false, 2012, 257748, 1.5 );
  126. factorsVec_tmp.push_back(factor_tmp);
  127. factor_tmp = factor("B0toKstMuMu", true, 2012, 260000, 1.5 );
  128. factorsVec_tmp.push_back(factor_tmp);
  129. }
  130. // Run II
  131. if (Run == 2){
  132. factor_tmp = factor("B0toKstMuMu", false, 2015, 502704, 1.5* 13.0/(13.0-4.0) );
  133. factorsVec_tmp.push_back(factor_tmp);
  134. factor_tmp = factor("B0toKstMuMu", true, 2015, 503254, 1.5* 12.0/(12.0-1.0) );
  135. factorsVec_tmp.push_back(factor_tmp);
  136. factor_tmp = factor("B0toKstMuMu", false, 2016, 657410, 1.5* 5.0/(5.0-4.0) );
  137. factorsVec_tmp.push_back(factor_tmp);
  138. factor_tmp = factor("B0toKstMuMu", true, 2016, 707852, 1.5* 5.0/(5.0-1.0) );
  139. factorsVec_tmp.push_back(factor_tmp);
  140. }
  141. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  142. factorsChannelVec.push_back(one_channel_factors_tmp);
  143. factorsVec_tmp.clear();
  144. }
  145. else{
  146. //--------------------------------------------------------------------
  147. // RefKplusPi0
  148. //--------------------------------------------------------------------
  149. //Run I
  150. if (Run == 1){
  151. factor_tmp = factor("RefKplusPi0", false, 2011, 1011831 );
  152. factorsVec_tmp.push_back(factor_tmp);
  153. factor_tmp = factor("RefKplusPi0", true, 2011, 1007920 );
  154. factorsVec_tmp.push_back(factor_tmp);
  155. factor_tmp = factor("RefKplusPi0", false, 2012, 1003888 );
  156. factorsVec_tmp.push_back(factor_tmp);
  157. factor_tmp = factor("RefKplusPi0", true, 2012, 1000278 );
  158. factorsVec_tmp.push_back(factor_tmp);
  159. }
  160. // Run II
  161. if (Run == 2){
  162. factor_tmp = factor("RefKplusPi0", false, 2015, -1 );
  163. factorsVec_tmp.push_back(factor_tmp);
  164. factor_tmp = factor("RefKplusPi0", true, 2015, -1 );
  165. factorsVec_tmp.push_back(factor_tmp);
  166. factor_tmp = factor("RefKplusPi0", false, 2016, -1 );
  167. factorsVec_tmp.push_back(factor_tmp);
  168. factor_tmp = factor("RefKplusPi0", true, 2016, -1 );
  169. factorsVec_tmp.push_back(factor_tmp);
  170. }
  171. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  172. factorsChannelVec.push_back(one_channel_factors_tmp);
  173. factorsVec_tmp.clear();
  174. //--------------------------------------------------------------------
  175. // B0toKstJpsi
  176. //--------------------------------------------------------------------
  177. //Run I
  178. if (Run == 1){
  179. factor_tmp = factor("B0toKstJpsi", false, 2011, 3081998, 1.5 );
  180. factorsVec_tmp.push_back(factor_tmp);
  181. factor_tmp = factor("B0toKstJpsi", true, 2011, 3076566, 1.5 * 13.0/(13.0-1.0) );
  182. factorsVec_tmp.push_back(factor_tmp);
  183. factor_tmp = factor("B0toKstJpsi", false, 2012, 4435958, 1.5 * 15.0/(15.0-1.0) );
  184. factorsVec_tmp.push_back(factor_tmp);
  185. factor_tmp = factor("B0toKstJpsi", true, 2012, 4425822, 1.5 );
  186. factorsVec_tmp.push_back(factor_tmp);
  187. }
  188. // Run II
  189. if (Run == 2){
  190. factor_tmp = factor("B0toKstJpsi", false, 2015, 874037 , 1.5 );
  191. factorsVec_tmp.push_back(factor_tmp);
  192. factor_tmp = factor("B0toKstJpsi", true, 2015, 502444 , 1.5 );
  193. factorsVec_tmp.push_back(factor_tmp);
  194. factor_tmp = factor("B0toKstJpsi", false, 2016, 5033743 , 1.5*125.0/(125.0-2.0) );
  195. factorsVec_tmp.push_back(factor_tmp);
  196. factor_tmp = factor("B0toKstJpsi", true, 2016, 4991624 , 1.5*133.0/(133.0-2.0) );
  197. factorsVec_tmp.push_back(factor_tmp);
  198. }
  199. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  200. factorsChannelVec.push_back(one_channel_factors_tmp);
  201. factorsVec_tmp.clear();
  202. //--------------------------------------------------------------------
  203. // BtoXJpsi
  204. //--------------------------------------------------------------------
  205. //Run I
  206. if (Run == 1){
  207. factor_tmp = factor("BtoXJpsi", false, 2011, -1);//2508491);
  208. factorsVec_tmp.push_back(factor_tmp);
  209. factor_tmp = factor("BtoXJpsi", true, 2011,-1);// 2514495);
  210. factorsVec_tmp.push_back(factor_tmp);
  211. factor_tmp = factor("BtoXJpsi", false, 2012, -1);//2504990);
  212. factorsVec_tmp.push_back(factor_tmp);
  213. factor_tmp = factor("BtoXJpsi", true, 2012,-1);// 2535488);
  214. factorsVec_tmp.push_back(factor_tmp);
  215. }
  216. // Run II
  217. if (Run == 2){
  218. factor_tmp = factor("BtoXJpsi", false, 2015, -1);
  219. factorsVec_tmp.push_back(factor_tmp);
  220. factor_tmp = factor("BtoXJpsi", true, 2015, -1 );
  221. factorsVec_tmp.push_back(factor_tmp);
  222. factor_tmp = factor("BtoXJpsi", false, 2016, 5090001 );
  223. factorsVec_tmp.push_back(factor_tmp);
  224. factor_tmp = factor("BtoXJpsi", true, 2016, 6055765 );
  225. factorsVec_tmp.push_back(factor_tmp);
  226. }
  227. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  228. factorsChannelVec.push_back(one_channel_factors_tmp);
  229. factorsVec_tmp.clear();
  230. //--------------------------------------------------------------------
  231. // BtoK1MuMu
  232. //--------------------------------------------------------------------
  233. /*
  234. //Run I
  235. if (Run == 1){
  236. factor_tmp = factor("BtoK1MuMu", false, 2011, 1038809 );
  237. factorsVec_tmp.push_back(factor_tmp);
  238. factor_tmp = factor("BtoK1MuMu", true, 2011, 1027740 );
  239. factorsVec_tmp.push_back(factor_tmp);
  240. factor_tmp = factor("BtoK1MuMu", false, 2012, 2003930 );
  241. factorsVec_tmp.push_back(factor_tmp);
  242. factor_tmp = factor("BtoK1MuMu", true, 2012, 2008883 );
  243. factorsVec_tmp.push_back(factor_tmp);
  244. }
  245. // Run II
  246. if (Run == 2){
  247. factor_tmp = factor("BtoK1MuMu", false, 2015, -1 );
  248. factorsVec_tmp.push_back(factor_tmp);
  249. factor_tmp = factor("BtoK1MuMu", true, 2015, -1 );
  250. factorsVec_tmp.push_back(factor_tmp);
  251. factor_tmp = factor("BtoK1MuMu", false, 2016, -1 );
  252. factorsVec_tmp.push_back(factor_tmp);
  253. factor_tmp = factor("BtoK1MuMu", true, 2016, -1 );
  254. factorsVec_tmp.push_back(factor_tmp);
  255. }
  256. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  257. factorsChannelVec.push_back(one_channel_factors_tmp);
  258. factorsVec_tmp.clear();
  259. */
  260. //--------------------------------------------------------------------
  261. // BtoK1Jpsi
  262. //--------------------------------------------------------------------
  263. //Run I
  264. if (Run == 1){
  265. factor_tmp = factor("BtoK1Jpsi", false, 2011, -1 );
  266. factorsVec_tmp.push_back(factor_tmp);
  267. factor_tmp = factor("BtoK1Jpsi", true, 2011, -1 );
  268. factorsVec_tmp.push_back(factor_tmp);
  269. factor_tmp = factor("BtoK1Jpsi", false, 2012, 250249, 2.0 );
  270. factorsVec_tmp.push_back(factor_tmp);
  271. factor_tmp = factor("BtoK1Jpsi", true, 2012, 265250, 2.0 );
  272. factorsVec_tmp.push_back(factor_tmp);
  273. }
  274. // Run II
  275. if (Run == 2){
  276. factor_tmp = factor("BtoK1Jpsi", false, 2015, -1 );
  277. factorsVec_tmp.push_back(factor_tmp);
  278. factor_tmp = factor("BtoK1Jpsi", true, 2015, -1 );
  279. factorsVec_tmp.push_back(factor_tmp);
  280. factor_tmp = factor("BtoK1Jpsi", false, 2016, -1 );
  281. factorsVec_tmp.push_back(factor_tmp);
  282. factor_tmp = factor("BtoK1Jpsi", true, 2016, -1 );
  283. factorsVec_tmp.push_back(factor_tmp);
  284. }
  285. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  286. factorsChannelVec.push_back(one_channel_factors_tmp);
  287. factorsVec_tmp.clear();
  288. }
  289. //--------------------------------------------------------------------
  290. // PHSP
  291. //--------------------------------------------------------------------
  292. /*
  293. //Run I
  294. if (Run == 1){
  295. factor_tmp = factor("PHSP", false, 2011, 94529 );
  296. factorsVec_tmp.push_back(factor_tmp);
  297. factor_tmp = factor("PHSP", true, 2011, 91600 );
  298. factorsVec_tmp.push_back(factor_tmp);
  299. factor_tmp = factor("PHSP", false, 2012, 175028 );
  300. factorsVec_tmp.push_back(factor_tmp);
  301. factor_tmp = factor("PHSP", true, 2012, 203760 );
  302. factorsVec_tmp.push_back(factor_tmp);
  303. }
  304. // Run II
  305. if (Run == 2){
  306. factor_tmp = factor("PHSP", false, 2015, 76712 );
  307. factorsVec_tmp.push_back(factor_tmp);
  308. factor_tmp = factor("PHSP", true, 2015, 72037 );
  309. factorsVec_tmp.push_back(factor_tmp);
  310. factor_tmp = factor("PHSP", false, 2016, 214587 );
  311. factorsVec_tmp.push_back(factor_tmp);
  312. factor_tmp = factor("PHSP", true, 2016, 216923 );
  313. factorsVec_tmp.push_back(factor_tmp);
  314. }
  315. one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
  316. factorsChannelVec.push_back(one_channel_factors_tmp);
  317. factorsVec_tmp.clear();
  318. */
  319. NoChannels = factorsChannelVec.size();
  320. }
  321. allFactors::~allFactors(){
  322. factorsChannelVec.empty();
  323. NoChannels = 0;
  324. }
  325. //void allFactors::print(){ //TODO
  326. /*
  327. cout << "[INFO]\t\tUsing " << NoVariables << " variables." << endl;
  328. cout << "[INFO]\t\tBranchName \t\t LaTeXName \t\t Unit \t\t DataType" << endl;
  329. for (vector<MVA_def>::iterator tracksIter1 = AllVariables.begin(); tracksIter1 !=AllVariables.end();++tracksIter1){
  330. cout<< "[INFO]\t\t" << (*tracksIter1).ReaderName << "\t\t" << (*tracksIter1).LaTeXName << "\t\t" << (*tracksIter1).Unit << "\t\t" << (*tracksIter1).DataType << endl;
  331. }
  332. */
  333. //}
  334. oneChannelFactors SignalFactors(int Run =1){
  335. factor factorSig;
  336. vector<factor> factorsSigVec;
  337. //--------------------------------------------------------------------
  338. // KplusPi0
  339. //--------------------------------------------------------------------
  340. //Run I
  341. if (Run ==1){
  342. factorSig = factor("KplusPi0", false, 2011, 507551 );
  343. factorsSigVec.push_back(factorSig);
  344. factorSig = factor("KplusPi0", true, 2011, 502787 );
  345. factorsSigVec.push_back(factorSig);
  346. factorSig = factor("KplusPi0", false, 2012, 514015 );
  347. factorsSigVec.push_back(factorSig);
  348. factorSig = factor("KplusPi0", true, 2012, 500458 );
  349. factorsSigVec.push_back(factorSig);
  350. }
  351. // Run II
  352. else{
  353. factorSig = factor("KplusPi0", false, 2015, 500320 );
  354. factorsSigVec.push_back(factorSig);
  355. factorSig = factor("KplusPi0", true, 2015, 507272 );
  356. factorsSigVec.push_back(factorSig);
  357. factorSig = factor("KplusPi0", false, 2016, 999419 );
  358. factorsSigVec.push_back(factorSig);
  359. factorSig = factor("KplusPi0", true, 2016, 1000151 );
  360. factorsSigVec.push_back(factorSig);
  361. }
  362. return oneChannelFactors(factorsSigVec);
  363. }
  364. oneChannelFactors SignalRefFactors(int Run =1){
  365. factor factorSig;
  366. vector<factor> factorsSigVec;
  367. //--------------------------------------------------------------------
  368. // RefKplusPi0
  369. //--------------------------------------------------------------------
  370. //Run I
  371. if (Run ==1){
  372. factorSig = factor("RefKplusPi0", false, 2011, 1011831 );
  373. factorsSigVec.push_back(factorSig);
  374. factorSig = factor("RefKplusPi0", true, 2011, 1007920 );
  375. factorsSigVec.push_back(factorSig);
  376. factorSig = factor("RefKplusPi0", false, 2012, 1003888 );
  377. factorsSigVec.push_back(factorSig);
  378. factorSig = factor("RefKplusPi0", true, 2012, 1000278 );
  379. factorsSigVec.push_back(factorSig);
  380. }
  381. // Run II
  382. else{
  383. factorSig = factor("RefKplusPi0", false, 2015, -1 );
  384. factorsSigVec.push_back(factorSig);
  385. factorSig = factor("RefKplusPi0", true, 2015, -1 );
  386. factorsSigVec.push_back(factorSig);
  387. factorSig = factor("RefKplusPi0", false, 2016, -1 );
  388. factorsSigVec.push_back(factorSig);
  389. factorSig = factor("RefKplusPi0", true, 2016, -1 );
  390. factorsSigVec.push_back(factorSig);
  391. }
  392. return oneChannelFactors(factorsSigVec);
  393. }
  394. string HistName(string channel, int year, bool MagUp, bool preselected, bool TM){
  395. if (preselected) return channel + "_KGammaGammaMuMu_mass_after_preselection_" + (TM ? "TM_" : "") + to_string(year) + (MagUp ? "MagUp" : "MagDown");
  396. else return channel + "_KGammaGammaMuMu_mass_before_preselection_" + (TM ? "TM_" : "") + to_string(year) + (MagUp ? "MagUp" : "MagDown");
  397. }
  398. void designCanvas(TCanvas* canvas){
  399. canvas->SetRightMargin(0.04);
  400. canvas->SetTopMargin(0.04);
  401. canvas->SetLeftMargin(0.12);
  402. canvas->SetBottomMargin(0.12);
  403. return;
  404. }
  405. void designPlots(TH1F *hist, int color){
  406. hist->SetLineWidth(2);
  407. hist->SetLineColor(color);
  408. hist->GetYaxis()->SetTitleOffset(1.7);
  409. hist->GetXaxis()->SetTitleOffset(1.0);
  410. hist->SetTitle("");
  411. }
  412. //the function to loop over all events and merge them into one file; apply cut-based selection while merging
  413. int PlotMasses(int Run =1, bool RefChan=true, bool TruthMatched = false, bool Stripped = false) {
  414. if (!Kst2Kpluspi0Resolved){
  415. cout << "Only applicable for KplusPi0 channel! Fix GlobalFunctions.hh" << endl;
  416. return 0;
  417. }
  418. if (Stripped && TruthMatched){
  419. cout << "[ERROR]\t Stripped data cannot be truthmatched, setting TruthMatched to false" << endl;
  420. TruthMatched = false;
  421. }
  422. TFile *tmpFile = 0;
  423. // TFile *outputFile = new TFile(Form("%s/data/MC/tmp%s.root",path_to_output_KplusPizero.c_str(), (smallSample ? "_small":"")),"RECREATE");
  424. TFile *outputFile = new TFile(Form("%s/data/MC/pi0Resolved_background_histos%s.root",path_to_output_KplusPizero.c_str(), (smallSample ? "_small":"")),"RECREATE");
  425. //std::vector<TH1F*> StrippedMasses;
  426. //std::vector<TH1F*> PreselectedMasses;
  427. TH1F *tmp = new TH1F("tmp" , "tmp", 100, cut_B_plus_M_low, cut_B_plus_M_high);
  428. //tmp variables
  429. string decay = "";
  430. string year_str = "";
  431. //Data
  432. allFactors ChannelFactors = allFactors(Run, RefChan); //the boolean is just to differentiate it form the defaul constructor
  433. factor fac = factor();
  434. oneChannelFactors SigFac = SignalFactors(Run);
  435. oneChannelFactors SigRefFac = SignalRefFactors(Run);
  436. Double_t scaling_factor = 0.0;
  437. TTree * treeMC, *treeMCold;
  438. //if (TruthMatched) treeMC = new TTree("DecayTreeTruthMatched");
  439. //else treeMC = new TTree("DecayTree");
  440. TCanvas* CanvasPreselectedVec[2][2]; //Create 8 canvases for each year and polarity
  441. TPaveText *legend[2][2];
  442. //This would be so much nicer in python...
  443. gStyle->SetOptStat(0);
  444. for (int c = 0; c < 2; c++){
  445. CanvasPreselectedVec[0][c] = new TCanvas(Form("cPD%i", (Run==1) ? 2011+c : 2015+c), "", 10,10,600,600);
  446. CanvasPreselectedVec[1][c] = new TCanvas(Form("cPU%i",(Run==1) ? 2011+c : 2015+c), "", 10,10,600,600);
  447. designCanvas(CanvasPreselectedVec[0][c]);
  448. designCanvas(CanvasPreselectedVec[1][c]);
  449. CanvasPreselectedVec[0][c]->SetName( Form("BkgPresel_%idown", (Run==1) ? 2011+c : 2015+c) );
  450. CanvasPreselectedVec[1][c]->SetName( Form("BkgPresel_%iup", (Run==1) ? 2011+c : 2015+c) );
  451. legend[0][c] =new TPaveText ( 0.68 , ( RefChan ? 0.7 : 0.8), 0.93, 0.93, "NDC");
  452. legend[0][c]->SetFillColor(kWhite);
  453. legend[1][c] =new TPaveText ( 0.68 , ( RefChan ? 0.7 : 0.8), 0.93, 0.93, "NDC");
  454. legend[1][c]->SetFillColor(kWhite);
  455. }
  456. //I'm pretty sure there is a nicer way to do that, but 9 mod year-2009 gets 1,0,3,2
  457. oneChannelFactors facIter;
  458. //for (auto i : ChannelFactors.factorsChannelVec){ //Loop over decay channels
  459. for (int ch = 0; ch < ChannelFactors.NoChannels; ch++){ //Loop over decay channels: better to have a number for colors and saving the histograms
  460. facIter = ChannelFactors.factorsChannelVec.at(ch);
  461. decay = facIter.Channel;
  462. cout << decay << endl;
  463. //cout << ChannelFactors.NoChannels << endl;
  464. for (int pos = 0; pos < facIter.VecSize; pos++ ){ //Loop over years and polarities in given decay channel
  465. //get the mass histograms
  466. fac = facIter.factorsVec.at(pos);
  467. year_str = to_string(fac.year);
  468. if (fac.nEvents == -1) continue;
  469. if (TruthMatched){
  470. tmpFile = new TFile(Form("%s/data/MC/%s/%s%s/%s%s_pi0Resolved%s.root",path_to_output_KplusPizero.c_str(),
  471. fac.Channel.c_str(), year_str.c_str(), fac.MagUp ? "up" : "down", year_str.c_str(),fac.MagUp ? "up" : "down",(smallSample ? "_small":"")));
  472. if (TruthMatched) treeMCold = (TTree *)tmpFile->Get("DecayTreeTruthMatched");
  473. else treeMCold = (TTree *)tmpFile->Get("DecayTree");
  474. treeMCold->SetBranchStatus("*",0);
  475. treeMCold->SetBranchStatus("B_plus_DTF_M",1);
  476. outputFile->cd();
  477. treeMC = treeMCold->CloneTree();
  478. treeMC->Draw(Form("B_plus_DTF_M>>tmp%i",pos), Form("B_plus_DTF_M>%f && B_plus_DTF_M<%f", cut_B_plus_M_low, cut_B_plus_M_high) );
  479. tmp = (TH1F *)gDirectory->Get(Form("tmp%i",pos));
  480. }
  481. else{
  482. tmpFile = new TFile(Form("%s/data/MC/%s/%s%s/%s%s_pi0Resolved_histos%s.root",path_to_output_KplusPizero.c_str(),
  483. fac.Channel.c_str(), year_str.c_str(), fac.MagUp ? "up" : "down", year_str.c_str(),fac.MagUp ? "up" : "down",(smallSample ? "_small":"")),"READ");
  484. if (Stripped) tmp = (TH1F *) tmpFile->Get("h_KGammaGammaMuMu_mass_before_preselection")->Clone();
  485. else tmp = (TH1F *) tmpFile->Get("h_KGammaGammaMuMu_mass_after_preselection")->Clone();
  486. }
  487. //Calcualte the needed scale
  488. if (RefChan) scaling_factor = double((SigRefFac.factorsVec.at(pos)).nEvents)/double(fac.nEvents);
  489. else scaling_factor = double((SigFac.factorsVec.at(pos)).nEvents)/double(fac.nEvents);
  490. scaling_factor = scaling_factor*fac.OtherScale;
  491. cout << fac.year << (fac.MagUp ? "up " : "down") << "\t Scaling factor: " << scaling_factor << endl;
  492. tmp->Scale(scaling_factor);
  493. cout << "\t\tIntegral: " << tmp->Integral() << endl;
  494. //Save the scaled histograms
  495. outputFile->cd();
  496. tmp ->SetName(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
  497. tmp ->SetTitle(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
  498. designPlots(tmp,ch+1);
  499. tmp->Write(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
  500. CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->cd(); //boolean is dangerous there but f* it
  501. legend[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->AddText(decay.c_str());
  502. ((TText*)legend[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->GetListOfLines()->Last())->SetTextColor(ch+1);
  503. if ( fac.Channel == "KplusPi0" || fac.Channel == "RefKplusPi0" ){
  504. tmp->DrawCopy();
  505. }
  506. else{
  507. tmp->DrawCopy("same");
  508. }
  509. CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Modified();
  510. CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Update();
  511. //CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Write();
  512. tmpFile->Close();
  513. }
  514. }
  515. cout << "Drawing legend " << endl;
  516. //Draw legends
  517. for (int c = 0; c < 2; c++){
  518. CanvasPreselectedVec[0][c]->cd();
  519. legend[0][c]->Draw();
  520. CanvasPreselectedVec[1][c]->cd();
  521. legend[1][c]->Draw();
  522. }
  523. cout << "Saving histos " << endl;
  524. for (int c = 0; c < 2; c++){
  525. CanvasPreselectedVec[0][c]->SaveAs( Form("%s/data/MC/BackgroundComparisons/BkgSamples_%s_%idown%s%s.pdf",path_to_output_KplusPizero.c_str(),
  526. (Stripped ? "Stripped" : "Preselected"), (Run==1) ? 2011+c : 2015+c, RefChan ? "_Ref" : "", TruthMatched ? "_TM" : "") ,"jpg");
  527. CanvasPreselectedVec[1][c]->SaveAs( Form("%s/data/MC/BackgroundComparisons/BkgSamples_%s_%iup%s%s.pdf", path_to_output_KplusPizero.c_str(),
  528. (Stripped ? "Stripped" : "Preselected"), (Run==1) ? 2011+c : 2015+c, RefChan ? "_Ref" : "", TruthMatched ? "_TM" : "") ,"jpg");
  529. }
  530. CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Write();
  531. outputFile->Close();
  532. return 1;
  533. }
  534. int PlotAllMasses(){
  535. if (PlotMasses(1,0,0,0) == 0) return 0;
  536. if (PlotMasses(1,0,0,1) == 0) return 0;
  537. if (PlotMasses(1,1,0,0) == 0) return 0;
  538. if (PlotMasses(1,1,0,1) == 0) return 0;
  539. if (PlotMasses(2,0,0,0) == 0) return 0;
  540. if (PlotMasses(2,0,0,1) == 0) return 0;
  541. return 1;
  542. }