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.

2649 lines
128 KiB

  1. //offline selection of BDT variables for B+->Kst+mumu
  2. //david gerick
  3. #include "GlobalFunctions.hh"
  4. #include "Utils.hpp"
  5. #include "Paths.hpp"
  6. using namespace std;
  7. using namespace RooFit ;
  8. //////////////////////////////////////////////////////////////////////
  9. /// preSelection()
  10. /// loops over all .root-files created by subjobs in ganga and converts into one tree. trigger, kinematic, PID and
  11. /// some more cuts are applied. Q^2-Binning applied, Kshort becomes extra branch for decay inside or outside of
  12. /// VELO. histograms of inv. mass distributions are created and saved in separate .root-file
  13. ///
  14. /// runAllYearsAndMagPol()
  15. /// preSelection is executed for 2011 + 2012 as well as MagUp and MagDown of the decay
  16. ///
  17. /// runAllSignalData()
  18. /// all data for this decay is evaluated
  19. ///
  20. /// runAllSignalMC()
  21. /// runs all MC files for the signal channel
  22. ///
  23. /// runAllRefMC()
  24. /// same as above but for reference channel
  25. ///
  26. /// runComplete()
  27. /// every available data for all three (sub)decays is evaluated, data and MC for signal and reference channel
  28. ///
  29. /// getTCKs()
  30. /// return the exact events numbers for every MagDown and MagUp, Year and TCK configuration
  31. ///
  32. /// plotHistos()
  33. /// Selected histograms generated in the preSelection() function are plotted and nicely formatted before
  34. /// saved as .eps file
  35. int copyDataForTMVA(std::string year = "2011", std::string magnet = "down") {
  36. string string_input = GetInputFile(year,magnet,true,false,false,false,smallSample);
  37. TChain* tree = new TChain("DecayTree");
  38. tree->Add(string_input.c_str());
  39. string output_path = string_input;
  40. replace(output_path,".root","_tmp.root");
  41. if(tree->GetEntries() == 0){
  42. //If it complains while running, it's just trying to read also from David's preselected files
  43. coutERROR("No entries found in TTree from tfile " + string_input + ". Exit program!");
  44. coutERROR("Exit program!");
  45. return 0;
  46. }
  47. TFile *output = new TFile(output_path.c_str(),"RECREATE");
  48. tree->SetBranchStatus("*",1);
  49. TTree * NewTree = tree->CloneTree(0);
  50. bool TMedBKGCAT = true;
  51. bool TMed_noPi0 = true;
  52. bool TMed = true;
  53. bool TM_gammas = true;
  54. NewTree->Branch("TMedBKGCAT", &TMedBKGCAT, "TMedBKGCAT/b");
  55. NewTree->Branch("TMed_noPi0", &TMed_noPi0, "TMed_noPi0/b");
  56. NewTree->Branch("TMed", &TMed, "TMed/b");
  57. NewTree->Branch("TM_gammas", &TM_gammas, "TM_gammas/b");
  58. for (int evt = 0; evt < tree->GetEntries(); evt++){
  59. tree->GetEntry(evt);
  60. TMedBKGCAT = true;
  61. TMed_noPi0 = true;
  62. TMed = true;
  63. TM_gammas = true;
  64. NewTree->Fill();
  65. }
  66. output->cd();
  67. NewTree->Write("",TObject::kWriteDelete);
  68. output->Close();
  69. cout << "[INFO]\t\t New tree created." << endl;
  70. //careful, possibly leaky (wouldnẗ life be so much easier if one could just change ROOT tree on the spot...
  71. string command = "mv " + string_input + " ";
  72. replace(string_input,".root","_backup.root");
  73. command += string_input;
  74. system(command.c_str());
  75. replace(string_input,"_backup.root",".root");
  76. command = "mv " + output_path + " " + string_input;
  77. system(command.c_str());
  78. return 1;
  79. }
  80. int copyDataForTMVAAll(int Run = 1){
  81. for (auto& year : yearsData(Run)){
  82. if (copyDataForTMVA(year,"down") ==0) return 0;
  83. if (copyDataForTMVA(year,"up") ==0) return 0;
  84. }
  85. return 1;
  86. }
  87. //the function to loop over all events and merge them into one file; apply cut-based selection while merging
  88. int preSelection(string year = "2011", string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false, bool B0 = false, bool K1 = false, bool Inc = false) {
  89. TChain* tree = 0;
  90. //Reference channel and PHSP are both MC data
  91. if(ReferenceChannel)MC = true;
  92. if(PHSP)MC = true;
  93. if(K1)MC = true;
  94. if(Inc)MC = true;
  95. if(ReferenceChannel && PHSP){
  96. coutWarning("Cannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!");
  97. PHSP = false;
  98. }
  99. //Kst2Kpluspi0Resolved case
  100. if(Kst2Kpluspi0Resolved){
  101. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  102. if (B0 || K1 || Inc){
  103. tree->Add(GetInputFileBkg(year,magnet,false,ReferenceChannel,B0, K1, Inc).c_str());
  104. coutDebug("Adding " + GetInputFileBkg(year,magnet,false,ReferenceChannel,B0, K1, Inc));
  105. }
  106. else{
  107. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  108. coutDebug("Adding " + GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample));
  109. }
  110. }
  111. //Kst2Kpluspi0Merged case
  112. if(Kst2Kpluspi0Merged){
  113. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  114. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  115. cout << "[DEBUG]\t\t Openning " << GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str() << endl;
  116. }
  117. //Kst2Kspiplus case
  118. if(Kst2Kspiplus){
  119. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  120. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  121. }
  122. int N = tree->GetEntries();
  123. cout << "Old files contain " << N << " events" << endl;
  124. if(N == 0){
  125. coutERROR("Tree has no entries. Exit!");
  126. return 0;
  127. }
  128. //Disable all branches
  129. tree->SetBranchStatus("*",0);
  130. //activate needed branches
  131. tree->SetBranchStatus("B_plus_*Decision*",1) ;
  132. tree->SetBranchStatus("*PID*",1) ;
  133. tree->SetBranchStatus("*ProbNN*",1) ;
  134. //tree->SetBranchStatus("*GhostProb",1) ;
  135. tree->SetBranchStatus("nCandidate",1) ;
  136. tree->SetBranchStatus("*Tracks",1) ;
  137. tree->SetBranchStatus("nVeloClusters", 1) ;
  138. tree->SetBranchStatus("nTTClusters", 1) ;
  139. tree->SetBranchStatus("nITClusters", 1) ;
  140. tree->SetBranchStatus("nOTClusters", 1) ;
  141. tree->SetBranchStatus("nSPDHits", 1) ;
  142. tree->SetBranchStatus("nPV",1) ;
  143. tree->SetBranchStatus("eventNumber",1) ;
  144. tree->SetBranchStatus("runNumber",1) ;
  145. tree->SetBranchStatus("GpsTime",1) ;
  146. tree->SetBranchStatus("EventInSequence",1) ;
  147. tree->SetBranchStatus("totCandidates",1) ;
  148. tree->SetBranchStatus("Polarity",1) ;
  149. //keep the TCKinfo for KS (2012early/late) samples:
  150. if(Kst2Kspiplus)// && year == "2012" && PHSP)
  151. tree->SetBranchStatus("HLT1TCK", 1);
  152. //activate cone variables
  153. if(IsDST(year,MC,ReferenceChannel,PHSP) || Inc || (B0 && ReferenceChannel) || K1 ){
  154. tree->SetBranchStatus("*_cp*",1);
  155. tree->SetBranchStatus("*deltaEta*",1);
  156. tree->SetBranchStatus("*deltaPhi*",1);
  157. tree->SetBranchStatus("*cmult*",1);
  158. tree->SetBranchStatus("*pxasy*",1);
  159. tree->SetBranchStatus("*pyasy*",1);
  160. tree->SetBranchStatus("*pzasy*",1);
  161. tree->SetBranchStatus("*ptasy*",1);
  162. tree->SetBranchStatus("*pasy*",1);
  163. }
  164. tree->SetBranchStatus("*M",1) ;
  165. tree->SetBranchStatus("*MERR",1) ;
  166. tree->SetBranchStatus("*MM",1) ;
  167. tree->SetBranchStatus("*MMERR",1) ;
  168. tree->SetBranchStatus( "*P", 1 );
  169. tree->SetBranchStatus( "*PX", 1 );
  170. tree->SetBranchStatus( "*PY", 1);
  171. tree->SetBranchStatus( "*PZ", 1);
  172. tree->SetBranchStatus( "*PE", 1);
  173. tree->SetBranchStatus( "*PT", 1 );
  174. tree->SetBranchStatus( "*TAU", 1 );
  175. tree->SetBranchStatus( "*ETA", 1 ); //This should be fixed now
  176. tree->SetBranchStatus( "*PHI", 1 );
  177. tree->SetBranchStatus( "*FD*", 1 );
  178. tree->SetBranchStatus( "*IP*", 1 );
  179. tree->SetBranchStatus( "*IPCHI2_OWNPV", 1 );
  180. tree->SetBranchStatus( "*FDCHI2_OWNPV",1 );
  181. tree->SetBranchStatus( "*OWNPV*", 1 );
  182. tree->SetBranchStatus( "*DIRA_OWNPV",1);
  183. tree->SetBranchStatus( "*ENDVERTEX_CHI2",1 );
  184. tree->SetBranchStatus( "*PV_Z*",1 );
  185. tree->SetBranchStatus( "*ENDVERTEX*",1 );
  186. tree->SetBranchStatus( "*DOCA*",1 ); //This should be fixed now
  187. tree->SetBranchStatus( "*TRACK_CHI2NDOF",1) ;
  188. tree->SetBranchStatus( "*TRACK_Type",1) ;
  189. tree->SetBranchStatus( "*chi2",1 );
  190. tree->SetBranchStatus( "*nDOF",1 );
  191. tree->SetBranchStatus( "*status",1 );
  192. tree->SetBranchStatus( "*ctau",1 );
  193. tree->SetBranchStatus( "*isMuon",1 );
  194. tree->SetBranchStatus( "*hasRich",1 );
  195. tree->SetBranchStatus( "*PID*",1 );
  196. tree->SetBranchStatus( "*_ID",1 );
  197. tree->SetBranchStatus( "*Phi",1 );
  198. tree->SetBranchStatus( "*ThetaL",1 );
  199. tree->SetBranchStatus( "*ThetaK",1 );
  200. if(MC){
  201. tree->SetBranchStatus("*TRUE*",1) ;
  202. tree->SetBranchStatus("*BKGCAT",1) ;
  203. tree->SetBranchStatus("*MOTHER_ID",1) ;
  204. tree->SetBranchStatus( "*CosTheta", 1 );
  205. }
  206. if (Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  207. tree->SetBranchStatus("gamma*ProbNN*",0) ; //Turn off gamma ProbNN
  208. tree->SetBranchStatus("*_CL",1);
  209. tree->SetBranchStatus("gamma*CaloHypo_E",1); //possibly use for tests, doesn't hurt to include it
  210. tree->SetBranchStatus("gamma*CaloHypo_X",1);
  211. tree->SetBranchStatus("gamma*CaloHypo_Y",1);
  212. tree->SetBranchStatus("gamma*CaloHypo_Z",1);
  213. }
  214. //DTF convergence
  215. if(UseDTF){
  216. tree->SetBranchStatus("B_plus_DTF_status",1);
  217. tree->SetBranchStatus("B_plus_DTF_chi2",1);
  218. }
  219. //define variables
  220. ULong64_t nEventNumber;
  221. Int_t nSubSetNumber; //split the subset into three subsets for BDT test&training, obtimization, application
  222. TLorentzVector LorVec_B_plus;
  223. TLorentzVector LorVec_K_star_plus;
  224. TLorentzVector LorVec_K_plus;
  225. TLorentzVector LorVec_pi_zero_merged;
  226. TLorentzVector LorVec_pi_zero_resolved;
  227. TLorentzVector LorVec_K_short;
  228. TLorentzVector LorVec_pi_plus;
  229. TLorentzVector LorVec_KS_pi_plus;
  230. TLorentzVector LorVec_KS_pi_minus;
  231. TLorentzVector LorVec_mu_minus;
  232. TLorentzVector LorVec_mu_plus;
  233. TLorentzVector LorVec_gamma1;
  234. TLorentzVector LorVec_gamma2;
  235. TLorentzVector LorVec_DiGamma;
  236. //potentially misIDed particles:
  237. TLorentzVector LorVec_pi_plus_MisIDed;
  238. TLorentzVector LorVec_mu_plus_MisIDed;
  239. TLorentzVector LorVec_B_plus_From_DoubleMisIDed;
  240. TLorentzVector LorVec_Jpsi_From_DoubleMisIDed;
  241. TLorentzVector LorVec_K_star_plus_From_DoubleMisIDed;
  242. //recombined particles:
  243. TLorentzVector LorVec_DiMuon;
  244. TLorentzVector LorVec_KaonPion;
  245. TLorentzVector LorVec_ReconB;
  246. TLorentzVector LorVec_ReconBPiZero;
  247. TLorentzVector LorVec_KshortMuMu;
  248. TLorentzVector LorVec_KplusMuMu;
  249. ///B+
  250. Double_t B_plus_M = 0.;
  251. Double_t B_plus_MM = 0.;
  252. Double_t B_plus_PX = 0.;
  253. Double_t B_plus_PY = 0.;
  254. Double_t B_plus_PZ = 0.;
  255. Double_t B_plus_PE = 0.;
  256. Double_t B_plus_PT = 0.;
  257. Float_t f_B_plus_M_DTF[100];
  258. Float_t f_B_plus_MERR_DTF[100];
  259. Double_t B_plus_M_DTF = 0.;
  260. Double_t B_plus_MERR_DTF = 0.;
  261. Double_t B_plus_P_DTF = 0.;
  262. Double_t B_plus_PX_DTF = 0.;
  263. Double_t B_plus_PY_DTF = 0.;
  264. Double_t B_plus_PZ_DTF = 0.;
  265. Double_t B_plus_PE_DTF = 0.;
  266. Double_t B_plus_PT_DTF = 0.;
  267. Double_t B_plus_ETA_DTF = 0.;
  268. Double_t B_plus_PHI_DTF = 0.;
  269. ///K*+
  270. Double_t K_star_plus_M = 0.;
  271. Double_t K_star_plus_MM = 0.;
  272. Double_t K_star_plus_PX = 0.;
  273. Double_t K_star_plus_PY = 0.;
  274. Double_t K_star_plus_PZ = 0.;
  275. Double_t K_star_plus_PE = 0.;
  276. Double_t K_star_plus_PT = 0.;
  277. Float_t f_K_star_plus_M_DTF[100];
  278. Double_t K_star_plus_M_DTF = 0.;
  279. Double_t K_star_plus_P_DTF = 0.;
  280. Double_t K_star_plus_PX_DTF = 0.;
  281. Double_t K_star_plus_PY_DTF = 0.;
  282. Double_t K_star_plus_PZ_DTF = 0.;
  283. Double_t K_star_plus_PE_DTF = 0.;
  284. Double_t K_star_plus_PT_DTF = 0.;
  285. Double_t K_star_plus_ETA_DTF= 0.;
  286. Double_t K_star_plus_PHI_DTF= 0.;
  287. ///K+
  288. Double_t K_plus_PX = 0.;
  289. Double_t K_plus_PY = 0.;
  290. Double_t K_plus_PZ = 0.;
  291. Double_t K_plus_PE = 0.;
  292. Double_t K_plus_PT = 0.;
  293. Float_t f_K_plus_PX_DTF[100];
  294. Float_t f_K_plus_PY_DTF[100];
  295. Float_t f_K_plus_PZ_DTF[100];
  296. Float_t f_K_plus_PE_DTF[100];
  297. Float_t f_K_plus_ID_DTF[100];
  298. Double_t K_plus_M_DTF = 0.; //Just pdg mass
  299. Double_t K_plus_P_DTF = 0.;
  300. Double_t K_plus_PX_DTF = 0.;
  301. Double_t K_plus_PY_DTF = 0.;
  302. Double_t K_plus_PZ_DTF = 0.;
  303. Double_t K_plus_PE_DTF = 0.;
  304. Double_t K_plus_PT_DTF = 0.;
  305. Double_t K_plus_ETA_DTF= 0.;
  306. Double_t K_plus_PHI_DTF= 0.;
  307. Int_t K_plus_ID_DTF = 0;
  308. Double_t K_plus_ProbNNk = 0.;
  309. ///pi0 (merged)
  310. Double_t pi_zero_merged_M = 0.;
  311. Double_t pi_zero_merged_PX = 0.;
  312. Double_t pi_zero_merged_PY = 0.;
  313. Double_t pi_zero_merged_PZ = 0.;
  314. Double_t pi_zero_merged_PE = 0.;
  315. Double_t pi_zero_merged_PT = 0.;
  316. ///pi0 (resolved)
  317. Double_t pi_zero_resolved_M = 0.;
  318. Double_t pi_zero_resolved_PX = 0.;
  319. Double_t pi_zero_resolved_PY = 0.;
  320. Double_t pi_zero_resolved_PZ = 0.;
  321. Double_t pi_zero_resolved_PE = 0.;
  322. Double_t pi_zero_resolved_PT = 0.;
  323. Float_t f_pi_zero_resolved_M_DTF[100];
  324. Double_t pi_zero_resolved_M_DTF = 0.;
  325. Double_t pi_zero_resolved_P_DTF = 0.;
  326. Double_t pi_zero_resolved_PX_DTF = 0.;
  327. Double_t pi_zero_resolved_PY_DTF = 0.;
  328. Double_t pi_zero_resolved_PZ_DTF = 0.;
  329. Double_t pi_zero_resolved_PT_DTF = 0.;
  330. Double_t pi_zero_resolved_PE_DTF = 0.;
  331. Double_t pi_zero_resolved_ETA_DTF = 0.;
  332. Double_t pi_zero_resolved_PHI_DTF = 0.;
  333. ///Kshort
  334. Double_t K_short_PX = 0.;
  335. Double_t K_short_PY = 0.;
  336. Double_t K_short_PZ = 0.;
  337. Double_t K_short_PE = 0.;
  338. Double_t K_short_PT = 0.;
  339. Float_t f_K_short_M_DTF[100];
  340. Double_t K_short_M_DTF = 0.;
  341. Double_t K_short_PT_DTF = 0.;
  342. Double_t K_short_ETA_DTF = 0.;
  343. Double_t K_short_PHI_DTF = 0.;
  344. ///pi+ (KS)
  345. Double_t Ks_pi_plus_PX = 0.;
  346. Double_t Ks_pi_plus_PY = 0.;
  347. Double_t Ks_pi_plus_PZ = 0.;
  348. Double_t Ks_pi_plus_PE = 0.;
  349. Double_t Ks_pi_plus_PT = 0.;
  350. Float_t f_Ks_pi_plus_PX_DTF[100];
  351. Float_t f_Ks_pi_plus_PY_DTF[100];
  352. Float_t f_Ks_pi_plus_PZ_DTF[100];
  353. Float_t f_Ks_pi_plus_PE_DTF[100];
  354. Float_t f_Ks_pi_plus_ID_DTF[100];
  355. Double_t Ks_pi_plus_PX_DTF = 0.;
  356. Double_t Ks_pi_plus_PY_DTF = 0.;
  357. Double_t Ks_pi_plus_PZ_DTF = 0.;
  358. Double_t Ks_pi_plus_PE_DTF = 0.;
  359. Double_t Ks_pi_plus_PT_DTF = 0.;
  360. Double_t Ks_pi_plus_ETA_DTF = 0.;
  361. Double_t Ks_pi_plus_PHI_DTF = 0.;
  362. Int_t Ks_pi_plus_ID_DTF = 0;
  363. ///pi- (KS)
  364. Double_t Ks_pi_minus_PX = 0.;
  365. Double_t Ks_pi_minus_PY = 0.;
  366. Double_t Ks_pi_minus_PZ = 0.;
  367. Double_t Ks_pi_minus_PE = 0.;
  368. Double_t Ks_pi_minus_PT = 0.;
  369. Float_t f_Ks_pi_minus_PX_DTF[100];
  370. Float_t f_Ks_pi_minus_PY_DTF[100];
  371. Float_t f_Ks_pi_minus_PZ_DTF[100];
  372. Float_t f_Ks_pi_minus_PE_DTF[100];
  373. Float_t f_Ks_pi_minus_ID_DTF[100];
  374. Double_t Ks_pi_minus_PX_DTF = 0.;
  375. Double_t Ks_pi_minus_PY_DTF = 0.;
  376. Double_t Ks_pi_minus_PZ_DTF = 0.;
  377. Double_t Ks_pi_minus_PE_DTF = 0.;
  378. Double_t Ks_pi_minus_PT_DTF = 0.;
  379. Double_t Ks_pi_minus_ETA_DTF = 0.;
  380. Double_t Ks_pi_minus_PHI_DTF = 0.;
  381. Int_t Ks_pi_minus_ID_DTF = 0;
  382. ///pi+
  383. Double_t pi_plus_PX = 0.;
  384. Double_t pi_plus_PY = 0.;
  385. Double_t pi_plus_PZ = 0.;
  386. Double_t pi_plus_PE = 0.;
  387. Double_t pi_plus_PT = 0.;
  388. Float_t f_pi_plus_PX_DTF[100];
  389. Float_t f_pi_plus_PY_DTF[100];
  390. Float_t f_pi_plus_PZ_DTF[100];
  391. Float_t f_pi_plus_PE_DTF[100];
  392. Float_t f_pi_plus_ID_DTF[100];
  393. Double_t pi_plus_PX_DTF = 0.;
  394. Double_t pi_plus_PY_DTF = 0.;
  395. Double_t pi_plus_PZ_DTF = 0.;
  396. Double_t pi_plus_PE_DTF = 0.;
  397. Double_t pi_plus_PT_DTF = 0.;
  398. Double_t pi_plus_ETA_DTF= 0.;
  399. Double_t pi_plus_PHI_DTF= 0.;
  400. Int_t pi_plus_ID_DTF = 0;
  401. ///mu-
  402. Double_t mu_minus_PX = 0.;
  403. Double_t mu_minus_PY = 0.;
  404. Double_t mu_minus_PZ = 0.;
  405. Double_t mu_minus_PE = 0.;
  406. Double_t mu_minus_PT = 0.;
  407. Float_t f_mu_minus_PX_DTF[100];
  408. Float_t f_mu_minus_PY_DTF[100];
  409. Float_t f_mu_minus_PZ_DTF[100];
  410. Float_t f_mu_minus_PE_DTF[100];
  411. Float_t f_mu_minus_ID_DTF[100];
  412. Double_t mu_minus_M_DTF = 0.;
  413. Double_t mu_minus_P_DTF = 0.;
  414. Double_t mu_minus_PX_DTF = 0.;
  415. Double_t mu_minus_PY_DTF = 0.;
  416. Double_t mu_minus_PZ_DTF = 0.;
  417. Double_t mu_minus_PE_DTF = 0.;
  418. Double_t mu_minus_PT_DTF = 0.;
  419. Double_t mu_minus_ETA_DTF= 0.;
  420. Double_t mu_minus_PHI_DTF= 0.;
  421. Int_t mu_minus_ID_DTF = 0;
  422. ///mu+
  423. Double_t mu_plus_PX = 0.;
  424. Double_t mu_plus_PY = 0.;
  425. Double_t mu_plus_PZ = 0.;
  426. Double_t mu_plus_PE = 0.;
  427. Double_t mu_plus_PT = 0.;
  428. Float_t f_mu_plus_PX_DTF[100];
  429. Float_t f_mu_plus_PY_DTF[100];
  430. Float_t f_mu_plus_PZ_DTF[100];
  431. Float_t f_mu_plus_PE_DTF[100];
  432. Float_t f_mu_plus_ID_DTF[100];
  433. Double_t mu_plus_M_DTF = 0.;
  434. Double_t mu_plus_P_DTF = 0.;
  435. Double_t mu_plus_PX_DTF = 0.;
  436. Double_t mu_plus_PY_DTF = 0.;
  437. Double_t mu_plus_PZ_DTF = 0.;
  438. Double_t mu_plus_PE_DTF = 0.;
  439. Double_t mu_plus_PT_DTF = 0.;
  440. Double_t mu_plus_ETA_DTF= 0.;
  441. Double_t mu_plus_PHI_DTF= 0.;
  442. Int_t mu_plus_ID_DTF = 0;
  443. ///gamma1
  444. Double_t gamma1_PX = 0.;
  445. Double_t gamma1_PY = 0.;
  446. Double_t gamma1_PZ = 0.;
  447. Double_t gamma1_PE = 0.;
  448. Double_t gamma1_PT = 0.;
  449. Float_t f_gamma1_PX_DTF[100];
  450. Float_t f_gamma1_PY_DTF[100];
  451. Float_t f_gamma1_PZ_DTF[100];
  452. Float_t f_gamma1_PE_DTF[100];
  453. Float_t f_gamma1_ID_DTF[100];
  454. Double_t gamma1_M_DTF = 0.;
  455. Double_t gamma1_P_DTF = 0.;
  456. Double_t gamma1_PX_DTF = 0.;
  457. Double_t gamma1_PY_DTF = 0.;
  458. Double_t gamma1_PZ_DTF = 0.;
  459. Double_t gamma1_PE_DTF = 0.;
  460. Double_t gamma1_PT_DTF = 0.;
  461. Double_t gamma1_ETA_DTF= 0.;
  462. Double_t gamma1_PHI_DTF= 0.;
  463. Int_t gamma1_ID_DTF = 0;
  464. ///gamma2
  465. Double_t gamma2_PX = 0.;
  466. Double_t gamma2_PY = 0.;
  467. Double_t gamma2_PZ = 0.;
  468. Double_t gamma2_PE = 0.;
  469. Double_t gamma2_PT = 0.;
  470. Float_t f_gamma2_PX_DTF[100];
  471. Float_t f_gamma2_PY_DTF[100];
  472. Float_t f_gamma2_PZ_DTF[100];
  473. Float_t f_gamma2_PE_DTF[100];
  474. Float_t f_gamma2_ID_DTF[100];
  475. Double_t gamma2_M_DTF = 0.;
  476. Double_t gamma2_P_DTF = 0.;
  477. Double_t gamma2_PX_DTF = 0.;
  478. Double_t gamma2_PY_DTF = 0.;
  479. Double_t gamma2_PZ_DTF = 0.;
  480. Double_t gamma2_PE_DTF = 0.;
  481. Double_t gamma2_PT_DTF = 0.;
  482. Double_t gamma2_ETA_DTF= 0.;
  483. Double_t gamma2_PHI_DTF= 0.;
  484. Int_t gamma2_ID_DTF = 0;
  485. //vertex quality:
  486. Double_t B_plus_DIRA_OWNPV = 0.;
  487. Double_t B_plus_FDCHI2_OWNPV = 0.;
  488. Double_t B_plus_IPCHI2_OWNPV = 0.;
  489. Double_t K_star_plus_IPCHI2_OWNPV = 0.;
  490. Double_t mu_plus_IPCHI2_OWNPV = 0.;
  491. Double_t mu_minus_IPCHI2_OWNPV = 0.;
  492. Double_t K_star_plus_FDCHI2_OWNPV = 0.;
  493. //particle identification
  494. Double_t K_plus_PIDK = 0.;
  495. Double_t pi_plus_PIDK = 0.;
  496. Double_t mu_plus_ProbNNmu = 0.;
  497. Double_t mu_minus_ProbNNmu = 0.;
  498. //track type variables
  499. Int_t Ks_pi_plus_TRACK_Type;
  500. Int_t Ks_pi_minus_TRACK_Type;
  501. //confidence level
  502. Double_t gamma1_CL = 0.;
  503. Double_t gamma2_CL = 0.;
  504. //Angles
  505. Double_t ctl = 0.;
  506. Double_t ctk = 0.;
  507. Double_t phi = 0.;
  508. //trigger lines
  509. //L0
  510. Bool_t B_plus_L0MuonDecision_TOS = false;
  511. //HLT1
  512. Bool_t B_plus_Hlt1TrackAllL0Decision_TOS = false;
  513. Bool_t B_plus_Hlt1TrackMuonDecision_TOS = false;
  514. //HLT2
  515. Bool_t B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS = false;
  516. Bool_t B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS = false;
  517. Bool_t B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS = false;
  518. Bool_t B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS = false;
  519. Bool_t B_plus_Hlt2Topo2BodyBBDTDecision_TOS = false;
  520. Bool_t B_plus_Hlt2Topo3BodyBBDTDecision_TOS = false;
  521. // Bool_t B_plus_Hlt2SingleMuonDecision_TOS = false;
  522. Bool_t B_plus_Hlt2DiMuonDetachedDecision_TOS = false;
  523. //isMuon variables
  524. Bool_t mu_minus_isMuon = false;
  525. Bool_t mu_plus_isMuon = false;
  526. //hasRich variables
  527. Bool_t pi_plus_hasRich = false;
  528. Bool_t K_plus_hasRich = false;
  529. //DTF status
  530. Float_t B_plus_DTF_status[100];
  531. Float_t B_plus_DTF_chi2[100];
  532. ///////////////////////////////////////
  533. /// LINK VARIABLES TO BRANCHES
  534. ///////////////////////////////////////
  535. //event numbers
  536. tree -> SetBranchAddress( "eventNumber" , &nEventNumber );
  537. //trigger decisions
  538. tree -> SetBranchAddress( "B_plus_L0MuonDecision_TOS" , &B_plus_L0MuonDecision_TOS );
  539. if(year == "2011" || year == "2012"){
  540. tree -> SetBranchAddress( "B_plus_Hlt1TrackAllL0Decision_TOS" , &B_plus_Hlt1TrackAllL0Decision_TOS );
  541. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS" , &B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS );
  542. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS" , &B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS );
  543. tree -> SetBranchAddress( "B_plus_Hlt2Topo2BodyBBDTDecision_TOS" , &B_plus_Hlt2Topo2BodyBBDTDecision_TOS );
  544. tree -> SetBranchAddress( "B_plus_Hlt2Topo3BodyBBDTDecision_TOS" , &B_plus_Hlt2Topo3BodyBBDTDecision_TOS );
  545. }
  546. else if(year == "2015" || year == "2016" || year == "2017" || year == "2018"){
  547. tree -> SetBranchAddress( "B_plus_Hlt1TrackMVADecision_TOS" , &B_plus_Hlt1TrackAllL0Decision_TOS );
  548. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu2BodyDecision_TOS" , &B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS );
  549. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu3BodyDecision_TOS" , &B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS );
  550. tree -> SetBranchAddress( "B_plus_Hlt2Topo2BodyDecision_TOS" , &B_plus_Hlt2Topo2BodyBBDTDecision_TOS );
  551. tree -> SetBranchAddress( "B_plus_Hlt2Topo3BodyDecision_TOS" , &B_plus_Hlt2Topo3BodyBBDTDecision_TOS );
  552. if(year == "2016" || year == "2017" || year == "2018"){ //found to be FALSE for all 2015 data
  553. tree -> SetBranchAddress( "B_plus_Hlt2TopoMuMu2BodyDecision_TOS" , &B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS );
  554. tree -> SetBranchAddress( "B_plus_Hlt2TopoMuMu3BodyDecision_TOS" , &B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS );
  555. }
  556. }
  557. else{
  558. coutERROR("Incorrect year given for the assosiation of HLT1 lines with branches! Year given: " + year);
  559. return 0;
  560. }
  561. tree -> SetBranchAddress( "B_plus_Hlt1TrackMuonDecision_TOS" , &B_plus_Hlt1TrackMuonDecision_TOS );
  562. // tree -> SetBranchAddress( "B_plus_Hlt2SingleMuonDecision_TOS" , &B_plus_Hlt2SingleMuonDecision_TOS );
  563. tree -> SetBranchAddress( "B_plus_Hlt2DiMuonDetachedDecision_TOS" , &B_plus_Hlt2DiMuonDetachedDecision_TOS );
  564. //particle identification (PID)
  565. tree -> SetBranchAddress( "mu_minus_isMuon", &mu_minus_isMuon );
  566. tree -> SetBranchAddress( "mu_plus_isMuon", &mu_plus_isMuon );
  567. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  568. tree -> SetBranchAddress( "K_plus_hasRich", &K_plus_hasRich );
  569. if(UsePIDgen && PHSP){ //TODO add '&& MC' and '&& ReferenceChannel' once the PIDgen tuples are available for these sets
  570. tree -> SetBranchAddress( "K_plus_PIDK_corr", &K_plus_PIDK );
  571. tree -> SetBranchAddress( "K_plus_ProbNNk", &K_plus_ProbNNk );
  572. tree -> SetBranchAddress( "mu_plus_ProbNNmu_corr", &mu_plus_ProbNNmu );
  573. tree -> SetBranchAddress( "mu_minus_ProbNNmu_corr", &mu_minus_ProbNNmu );
  574. }
  575. else{
  576. //tree -> SetBranchAddress( "K_plus_PIDK", &K_plus_PIDK ); replaced by probNN
  577. tree -> SetBranchAddress( "K_plus_ProbNNk", &K_plus_ProbNNk );
  578. tree -> SetBranchAddress( "mu_plus_ProbNNmu", &mu_plus_ProbNNmu );
  579. tree -> SetBranchAddress( "mu_minus_ProbNNmu", &mu_minus_ProbNNmu );
  580. }
  581. }
  582. if(Kst2Kspiplus){
  583. tree -> SetBranchAddress( "pi_plus_hasRich", &pi_plus_hasRich );
  584. if(UsePIDgen && PHSP){ //TODO add '&& MC' and '&& ReferenceChannel' once the PIDgen tuples are available for these sets
  585. tree -> SetBranchAddress( "pi_plus_PIDK_corr", &pi_plus_PIDK );
  586. tree -> SetBranchAddress( "mu_plus_ProbNNmu_corr", &mu_plus_ProbNNmu );
  587. tree -> SetBranchAddress( "mu_minus_ProbNNmu_corr", &mu_minus_ProbNNmu );
  588. }
  589. else{
  590. tree -> SetBranchAddress( "pi_plus_PIDK", &pi_plus_PIDK );
  591. tree -> SetBranchAddress( "mu_plus_ProbNNmu", &mu_plus_ProbNNmu );
  592. tree -> SetBranchAddress( "mu_minus_ProbNNmu", &mu_minus_ProbNNmu );
  593. }
  594. }
  595. //particle masses and momenta
  596. tree -> SetBranchAddress( "B_plus_M" , &B_plus_M );
  597. tree -> SetBranchAddress( "B_plus_MM" , &B_plus_MM );
  598. tree -> SetBranchAddress( "B_plus_PX" , &B_plus_PX );
  599. tree -> SetBranchAddress( "B_plus_PY" , &B_plus_PY );
  600. tree -> SetBranchAddress( "B_plus_PZ" , &B_plus_PZ );
  601. tree -> SetBranchAddress( "B_plus_PE" , &B_plus_PE );
  602. tree -> SetBranchAddress( "B_plus_PT" , &B_plus_PT );
  603. tree -> SetBranchAddress( "B_plus_DTF_M" , &f_B_plus_M_DTF);
  604. tree -> SetBranchAddress( "B_plus_DTF_MERR", &f_B_plus_MERR_DTF);
  605. tree -> SetBranchAddress( "K_star_plus_M" , &K_star_plus_M );
  606. tree -> SetBranchAddress( "K_star_plus_MM" , &K_star_plus_MM );
  607. tree -> SetBranchAddress( "K_star_plus_PX" , &K_star_plus_PX );
  608. tree -> SetBranchAddress( "K_star_plus_PY" , &K_star_plus_PY );
  609. tree -> SetBranchAddress( "K_star_plus_PZ" , &K_star_plus_PZ );
  610. tree -> SetBranchAddress( "K_star_plus_PE" , &K_star_plus_PE );
  611. tree -> SetBranchAddress( "K_star_plus_PT" , &K_star_plus_PT );
  612. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_M" , &f_K_star_plus_M_DTF );
  613. if(Kst2Kpluspi0Merged){
  614. tree -> SetBranchAddress( "pi_zero_merged_PX" , &pi_zero_merged_PX );
  615. tree -> SetBranchAddress( "pi_zero_merged_PY" , &pi_zero_merged_PY );
  616. tree -> SetBranchAddress( "pi_zero_merged_PZ" , &pi_zero_merged_PZ );
  617. tree -> SetBranchAddress( "pi_zero_merged_PE" , &pi_zero_merged_PE );
  618. tree -> SetBranchAddress( "pi_zero_merged_PT" , &pi_zero_merged_PT );
  619. tree -> SetBranchAddress( "pi_zero_merged_M" , &pi_zero_merged_M );
  620. }
  621. if(Kst2Kpluspi0Resolved){
  622. tree -> SetBranchAddress( "pi_zero_resolved_PX" , &pi_zero_resolved_PX );
  623. tree -> SetBranchAddress( "pi_zero_resolved_PY" , &pi_zero_resolved_PY );
  624. tree -> SetBranchAddress( "pi_zero_resolved_PZ" , &pi_zero_resolved_PZ );
  625. tree -> SetBranchAddress( "pi_zero_resolved_PE" , &pi_zero_resolved_PE );
  626. tree -> SetBranchAddress( "pi_zero_resolved_PT" , &pi_zero_resolved_PT );
  627. tree -> SetBranchAddress( "pi_zero_resolved_M" , &pi_zero_resolved_M );
  628. tree -> SetBranchAddress( "B_plus_DTF_pi0_M" , &f_pi_zero_resolved_M_DTF );
  629. tree -> SetBranchAddress( "gamma1_PX" , &gamma1_PX );
  630. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_0_PX" , &f_gamma1_PX_DTF );
  631. tree -> SetBranchAddress( "gamma1_PY" , &gamma1_PY );
  632. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_0_PY" , &f_gamma1_PY_DTF );
  633. tree -> SetBranchAddress( "gamma1_PZ" , &gamma1_PZ );
  634. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_0_PZ" , &f_gamma1_PZ_DTF );
  635. tree -> SetBranchAddress( "gamma1_PE" , &gamma1_PE );
  636. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_0_PE" , &f_gamma1_PE_DTF );
  637. tree -> SetBranchAddress( "gamma1_PT" , &gamma1_PT );
  638. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_0_ID" , &f_gamma1_ID_DTF );
  639. tree -> SetBranchAddress( "gamma2_PX" , &gamma2_PX );
  640. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_PX" , &f_gamma2_PX_DTF );
  641. tree -> SetBranchAddress( "gamma2_PY" , &gamma2_PY );
  642. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_PY" , &f_gamma2_PY_DTF );
  643. tree -> SetBranchAddress( "gamma2_PZ" , &gamma2_PZ );
  644. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_PZ" , &f_gamma2_PZ_DTF );
  645. tree -> SetBranchAddress( "gamma2_PE" , &gamma2_PE );
  646. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_PE" , &f_gamma2_PE_DTF );
  647. tree -> SetBranchAddress( "gamma2_PT" , &gamma2_PT );
  648. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_pi0_gamma_ID" , &f_gamma2_ID_DTF );
  649. tree -> SetBranchAddress( "gamma1_CL" , &gamma1_CL );
  650. tree -> SetBranchAddress( "gamma2_CL" , &gamma2_CL );
  651. }
  652. if(Kst2Kpluspi0Merged || Kst2Kpluspi0Resolved){
  653. tree -> SetBranchAddress( "K_plus_PX" , &K_plus_PX );
  654. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_PX" , &f_K_plus_PX_DTF );
  655. tree -> SetBranchAddress( "K_plus_PY" , &K_plus_PY );
  656. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_PY" , &f_K_plus_PY_DTF );
  657. tree -> SetBranchAddress( "K_plus_PZ" , &K_plus_PZ );
  658. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_PZ" , &f_K_plus_PZ_DTF );
  659. tree -> SetBranchAddress( "K_plus_PE" , &K_plus_PE );
  660. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_PE" , &f_K_plus_PE_DTF );
  661. tree -> SetBranchAddress( "K_plus_PT" , &K_plus_PT );
  662. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_ID" , &f_K_plus_ID_DTF );
  663. }
  664. if(Kst2Kspiplus){
  665. tree -> SetBranchAddress( "K_short_PX" , &K_short_PX );
  666. tree -> SetBranchAddress( "K_short_PY" , &K_short_PY );
  667. tree -> SetBranchAddress( "K_short_PZ" , &K_short_PZ );
  668. tree -> SetBranchAddress( "K_short_PE" , &K_short_PE );
  669. tree -> SetBranchAddress( "K_short_PT" , &K_short_PT );
  670. tree -> SetBranchAddress( "B_plus_DTF_KS0_M" , &f_K_short_M_DTF );
  671. tree -> SetBranchAddress( "pi_plus_PX" , &pi_plus_PX );
  672. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PX" , &f_pi_plus_PX_DTF );
  673. tree -> SetBranchAddress( "pi_plus_PY" , &pi_plus_PY );
  674. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PY" , &f_pi_plus_PY_DTF );
  675. tree -> SetBranchAddress( "pi_plus_PZ" , &pi_plus_PZ );
  676. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PZ" , &f_pi_plus_PZ_DTF );
  677. tree -> SetBranchAddress( "pi_plus_PE" , &pi_plus_PE );
  678. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PE" , &f_pi_plus_PE_DTF );
  679. tree -> SetBranchAddress( "pi_plus_PT" , &pi_plus_PT );
  680. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_ID" , &f_pi_plus_ID_DTF );
  681. tree -> SetBranchAddress( "Ks_pi_minus_PX" , &Ks_pi_minus_PX );
  682. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PX" , &f_Ks_pi_minus_PX_DTF );
  683. tree -> SetBranchAddress( "Ks_pi_minus_PY" , &Ks_pi_minus_PY );
  684. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PY" , &f_Ks_pi_minus_PY_DTF );
  685. tree -> SetBranchAddress( "Ks_pi_minus_PZ" , &Ks_pi_minus_PZ );
  686. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PZ" , &f_Ks_pi_minus_PZ_DTF );
  687. tree -> SetBranchAddress( "Ks_pi_minus_PE" , &Ks_pi_minus_PE );
  688. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PE" , &f_Ks_pi_minus_PE_DTF );
  689. tree -> SetBranchAddress( "Ks_pi_minus_PT" , &Ks_pi_minus_PT );
  690. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_ID" , &f_Ks_pi_minus_ID_DTF );
  691. tree -> SetBranchAddress( "Ks_pi_plus_PX" , &Ks_pi_plus_PX );
  692. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PX" , &f_Ks_pi_plus_PX_DTF );
  693. tree -> SetBranchAddress( "Ks_pi_plus_PY" , &Ks_pi_plus_PY );
  694. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PY" , &f_Ks_pi_plus_PY_DTF );
  695. tree -> SetBranchAddress( "Ks_pi_plus_PZ" , &Ks_pi_plus_PZ );
  696. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PZ" , &f_Ks_pi_plus_PZ_DTF );
  697. tree -> SetBranchAddress( "Ks_pi_plus_PE" , &Ks_pi_plus_PE );
  698. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PE" , &f_Ks_pi_plus_PE_DTF );
  699. tree -> SetBranchAddress( "Ks_pi_plus_PT" , &Ks_pi_plus_PT );
  700. tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_ID" , &f_Ks_pi_plus_ID_DTF );
  701. }
  702. tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
  703. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PX" , &f_mu_minus_PX_DTF );
  704. tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
  705. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PY" , &f_mu_minus_PY_DTF );
  706. tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
  707. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PZ" , &f_mu_minus_PZ_DTF );
  708. tree -> SetBranchAddress( "mu_minus_PE" , &mu_minus_PE );
  709. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PE" , &f_mu_minus_PE_DTF );
  710. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_ID" , &f_mu_minus_ID_DTF );
  711. tree -> SetBranchAddress( "mu_minus_PT" , &mu_minus_PT );
  712. tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
  713. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PX" , &f_mu_plus_PX_DTF );
  714. tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
  715. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PY" , &f_mu_plus_PY_DTF );
  716. tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
  717. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PZ" , &f_mu_plus_PZ_DTF );
  718. tree -> SetBranchAddress( "mu_plus_PE" , &mu_plus_PE );
  719. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PE" , &f_mu_plus_PE_DTF );
  720. tree -> SetBranchAddress( "mu_plus_PT" , &mu_plus_PT );
  721. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_ID" , &f_mu_plus_ID_DTF );
  722. tree -> SetBranchAddress( "B_plus_DTF_status", &B_plus_DTF_status);
  723. tree -> SetBranchAddress( "B_plus_DTF_chi2", &B_plus_DTF_chi2);
  724. tree -> SetBranchAddress( "B_plus_DIRA_OWNPV" , &B_plus_DIRA_OWNPV );
  725. tree -> SetBranchAddress( "B_plus_FDCHI2_OWNPV" , &B_plus_FDCHI2_OWNPV );
  726. tree -> SetBranchAddress( "B_plus_IPCHI2_OWNPV" , &B_plus_IPCHI2_OWNPV );
  727. tree -> SetBranchAddress( "K_star_plus_IPCHI2_OWNPV" , &K_star_plus_IPCHI2_OWNPV );
  728. tree -> SetBranchAddress( "mu_plus_IPCHI2_OWNPV" , &mu_plus_IPCHI2_OWNPV );
  729. tree -> SetBranchAddress( "mu_minus_IPCHI2_OWNPV" , &mu_minus_IPCHI2_OWNPV );
  730. tree -> SetBranchAddress( "K_star_plus_FDCHI2_OWNPV" , &K_star_plus_FDCHI2_OWNPV );
  731. //Angles
  732. tree -> SetBranchAddress( "B_plus_ThetaL", &ctl);
  733. tree -> SetBranchAddress( "B_plus_ThetaK", &ctk);
  734. tree -> SetBranchAddress( "B_plus_Phi", &phi);
  735. //track types
  736. if(Kst2Kspiplus){
  737. tree -> SetBranchAddress( "Ks_pi_plus_TRACK_Type" , &Ks_pi_plus_TRACK_Type );
  738. tree -> SetBranchAddress( "Ks_pi_minus_TRACK_Type" , &Ks_pi_minus_TRACK_Type );
  739. }
  740. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  741. //Create output file
  742. TFile* output = 0;
  743. TFile* histos = 0;
  744. // Kst2Kpluspi0Resolved case
  745. if(Kst2Kpluspi0Resolved){
  746. if (B0 || K1 || Inc){
  747. output = new TFile(GetInputFileBkg(year,magnet,true,ReferenceChannel,B0,K1,Inc).c_str(),"RECREATE");
  748. histos = new TFile(GetHistosFileBkg(year,magnet,ReferenceChannel,B0,K1,Inc).c_str(),"RECREATE");
  749. }
  750. else{
  751. output = new TFile(GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  752. histos = new TFile(GetHistosFile(year,magnet,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  753. }
  754. }
  755. // Kst2Kpluspi0Merged case
  756. if(Kst2Kpluspi0Merged){
  757. output = new TFile(GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  758. histos = new TFile(GetHistosFile(year,magnet,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  759. }
  760. // Kst2Kspiplus case
  761. if(Kst2Kspiplus){
  762. output = new TFile(GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  763. histos = new TFile(GetHistosFile(year,magnet,MC,ReferenceChannel,PHSP,smallSample).c_str(),"RECREATE");
  764. }
  765. output->cd();
  766. TTree * summary_tree = tree->CloneTree(0);
  767. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  768. int nCounterTrigger = 0;
  769. int nCounterKinematic = 0;
  770. int nCounterPrV = 0;
  771. int nCounterPoV = 0;
  772. int nCounterPID = 0;
  773. int nCounterJpsiResonance = 0;
  774. int nCounterKstarMassWindow = 0;
  775. int nCounterB0KsmumuMass = 0;
  776. int nCounterDiMuonMassInQ2Range = 0;
  777. int n_DoubleMisID = 0;
  778. histos->cd();
  779. TH1 * h_JpsiMass = new TH1D("h_DiMuonMass" , "mass spectra of combined muons", 250, 0, 5000);
  780. h_JpsiMass->GetXaxis()->SetTitle("DiMuonMass [MeV]");
  781. h_JpsiMass->GetYaxis()->SetTitle("Counts / 20MeV");
  782. TH1 * h_JpsiMassCut = new TH1D("h_DiMuonMassw/oResonances" , "mass spectra of combined muons after resonance cut", 250, 0, 5000);
  783. h_JpsiMassCut->GetXaxis()->SetTitle("DiMuonMass [MeV]");
  784. h_JpsiMassCut->GetYaxis()->SetTitle("Counts / 20MeV");
  785. TH1 * h_JpsiMassResonance = new TH1D("h_DiMuonMassOnlyJpsiResonance" , "mass spectra of combined muons inside the Jpsi band", 75, 2500, 4000);
  786. h_JpsiMassResonance->GetXaxis()->SetTitle("DiMuonMass [MeV]");
  787. h_JpsiMassResonance->GetYaxis()->SetTitle("Counts / 20MeV");
  788. TH1 * h_Psi2sMassResonance = new TH1D("h_DiMuonMassOnlyPsi2Resonance" , "mass spectra of combined muons inside the Psi2 band", 75, 2500, 4000);
  789. h_Psi2sMassResonance->GetXaxis()->SetTitle("DiMuonMass [MeV]");
  790. h_Psi2sMassResonance->GetYaxis()->SetTitle("Counts / 20MeV");
  791. TH1 * h_CharmoniumResonance = new TH1D("h_DiMuonMassCharmoniumResonance" , "mass spectra of combined muons inside the charmonium bands", 75, 2500, 4000);
  792. h_CharmoniumResonance->GetXaxis()->SetTitle("DiMuonMass [MeV]");
  793. h_CharmoniumResonance->GetYaxis()->SetTitle("Counts / 20MeV");
  794. TH1 * h_BplusMass_B02KsmumuMass = new TH1D("h_BplusMass_B02KsmumuMass" , "mass spectra of reconstructed B0 from KS and di-muon", 175, 3500, 6000);
  795. h_BplusMass_B02KsmumuMass->GetXaxis()->SetTitle("Reconstructed B0 mass [MeV]");
  796. h_BplusMass_B02KsmumuMass->GetYaxis()->SetTitle("Counts / 20MeV");
  797. TH1 * h_BplusMass_DTF = new TH1D("h_BplusMass_DTF" , "Mass spectra from DTF", 125, 4500, 7000);
  798. h_BplusMass_DTF->GetXaxis()->SetTitle("B^{+} Mass from DTF [MeV]");
  799. h_BplusMass_DTF->GetYaxis()->SetTitle("Counts / 20MeV");
  800. TH2 * h_BplusMass_DiMuonMass = new TH2D("h_BplusMass_DiMuonMass" , "2D mass plot after pre-selection", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  801. h_BplusMass_DiMuonMass->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  802. h_BplusMass_DiMuonMass->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  803. TH2 * h_BplusMass_DiMuonMassRaw = new TH2D("h_BplusMass_DiMuonMassRaw" , "2D mass plot after stripping", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  804. h_BplusMass_DiMuonMassRaw->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  805. h_BplusMass_DiMuonMassRaw->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  806. TH2 * h_BplusMass_DiMuonMassDD = new TH2D("h_BplusMass_DiMuonMassDD" , "2D mass plot after pre-selection (DD tracks)", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  807. h_BplusMass_DiMuonMassDD->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  808. h_BplusMass_DiMuonMassDD->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  809. TH2 * h_BplusMass_DiMuonMassRawDD = new TH2D("h_BplusMass_DiMuonMassRawDD" , "2D mass plot after stripping (DD tracks)", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  810. h_BplusMass_DiMuonMassRawDD->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  811. h_BplusMass_DiMuonMassRawDD->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  812. TH2 * h_BplusMass_DiMuonMassLL = new TH2D("h_BplusMass_DiMuonMassLL" , "2D mass plot after pre-selection (LL tracks)", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  813. h_BplusMass_DiMuonMassLL->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  814. h_BplusMass_DiMuonMassLL->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  815. TH2 * h_BplusMass_DiMuonMassRawLL = new TH2D("h_BplusMass_DiMuonMassRawLL" , "2D mass plot after stripping (LL tracks)", 150 ,get_cut_B_plus_M_low(year), cut_B_plus_M_high, 150, 1000., 4500.);
  816. h_BplusMass_DiMuonMassRawLL->GetXaxis()->SetTitle("B^{+} mass [MeV]");
  817. h_BplusMass_DiMuonMassRawLL->GetYaxis()->SetTitle("#mu^{+}#mu^{-} mass [MeV]");
  818. TH1 * h_ReconstructBmassInCharmoniumResonance = new TH1D("h_K*JpsiMassInCharmoniumResonance" , "mass spectra of K* and Jpsi inside the charmonium bands", 75, 5000, 6500);
  819. h_ReconstructBmassInCharmoniumResonance->GetXaxis()->SetTitle("K*JpsiMass [MeV]");
  820. h_ReconstructBmassInCharmoniumResonance->GetYaxis()->SetTitle("Counts / 20MeV");
  821. TH1 * h_ReconstructBmassOffResonance = new TH1D("h_K*JpsiMassOutsideOffCharmoniumResonance" , "mass spectra of K* and DiMuon without the charmonium bands", 75, 5000, 6500);
  822. h_ReconstructBmassOffResonance->GetXaxis()->SetTitle("K*mumuMass [MeV]");
  823. h_ReconstructBmassOffResonance->GetYaxis()->SetTitle("Counts / 20MeV");
  824. TH1 * h_KstarMass = new TH1D("h_KstarMass" , "mass spectra of combined kaon and pion", 90, 500, 1400);
  825. h_KstarMass->GetXaxis()->SetTitle("KstarMass [MeV]");
  826. h_KstarMass->GetYaxis()->SetTitle("Counts / 10MeV");
  827. TH1 * h_KstarMasscut = new TH1D("h_KstarMassIn100MeV window" , "mass spectra of combined kaon and pion in 100MeV window", 90, 500, 1400);
  828. h_KstarMasscut->GetXaxis()->SetTitle("KstarMass [MeV]");
  829. h_KstarMasscut->GetYaxis()->SetTitle("Counts / 10MeV");
  830. TH2 * h_KstarMass2D = new TH2D("h_KstarMass2D" , "mass spectrum of Kstarplus", 90, 500, 1400, 90, 500, 1400);
  831. h_KstarMass2D->GetXaxis()->SetTitle("mass from tree [MeV]");
  832. h_KstarMass2D->GetYaxis()->SetTitle("mass from K and pi [MeV]");
  833. TH2 * h_diMuonReconstructedBMass2D = new TH2D("h_diMuonReconstructedBMass2D" , "mass spectrum of dimuon vs B+candidates", 150, 5000, 6500, 150, 2500, 4000);
  834. TH2 * h_diMuonReconstructedBMass2DFixPiZero = new TH2D("h_diMuonReconstructedBMass2DFixPiZero" , "mass spectrum of dimuon vs B+candidates with fixed m_{#pi^0}", 150, 5000, 6500, 150, 2500, 4000);
  835. h_diMuonReconstructedBMass2D->GetYaxis()->SetTitle("m_{#mu#mu} [MeV]");
  836. if (Kst2Kspiplus)
  837. h_diMuonReconstructedBMass2D->GetXaxis()->SetTitle("m_{K_{s}#pi^{+}#mu#mu} [MeV]");
  838. else{
  839. if (Kst2Kpluspi0Merged)
  840. h_diMuonReconstructedBMass2D->GetXaxis()->SetTitle("m_{K_{+}#pi^{0}#mu#mu} [MeV]");
  841. else
  842. h_diMuonReconstructedBMass2D->GetXaxis()->SetTitle("m_{K_{+}#gamma#gamma#mu#mu} [MeV]");
  843. h_diMuonReconstructedBMass2DFixPiZero->GetXaxis()->SetTitle("m_{K_{+}#pi^{0}#mu#mu} [MeV]");
  844. }
  845. //effect of PID cut on angular distribution
  846. TH1 * h_BeforePIDcuts_ctl = new TH1D("h_BeforePIDcuts_ctl" , "cos(#theta_{L}) before PID cuts; cos(#theta_{L}); entries", 100, -1., +1.);
  847. TH1 * h_BeforePIDcuts_ctk = new TH1D("h_BeforePIDcuts_ctk" , "cos(#theta_{K}) before PID cuts; cos(#theta_{K}); entries", 100, -1., +1.);
  848. TH1 * h_BeforePIDcuts_phi = new TH1D("h_BeforePIDcuts_phi" , "#phi before PID cuts; #phi (rad.); entries", 100, -TMath::Pi(), +TMath::Pi());
  849. TH1 * h_AfterPIDcuts_ctl = new TH1D("h_AfterPIDcuts_ctl" , "cos(#theta_{L}) after PID cuts; cos(#theta_{L}); entries", 100, -1., +1.);
  850. TH1 * h_AfterPIDcuts_ctk = new TH1D("h_AfterPIDcuts_ctk" , "cos(#theta_{K}) after PID cuts; cos(#theta_{K}); entries", 100, -1., +1.);
  851. TH1 * h_AfterPIDcuts_phi = new TH1D("h_AfterPIDcuts_phi" , "#phi after PID cuts; #phi (rad.); entries", 100, -TMath::Pi(), +TMath::Pi());
  852. /// K_s pi+
  853. TH2 * h_KshortDaughters = new TH2D("h_KshortDaughters" , "track types of the Kshort daughter pions", 10, -0.5, 9.5, 10, -0.5, 9.5);
  854. h_KshortDaughters->GetXaxis()->SetTitle("pi minus");
  855. h_KshortDaughters->GetYaxis()->SetTitle("pi plus");
  856. TH2 * h_BplusM_vs_BplusM_DoubleMisIDed = new TH2D("h_BplusM_vs_BplusM_DoubleMisIDed" , "comparison of B+ mass versus B+ mass (mu+ and pi+ double misIDed", 100, 5000, 6000, 100, 5000, 6000);
  857. h_BplusM_vs_BplusM_DoubleMisIDed->GetXaxis()->SetTitle("B_plus_M [MeV]");
  858. h_BplusM_vs_BplusM_DoubleMisIDed->GetYaxis()->SetTitle("B_plus_M (double misIDed) [MeV]");
  859. TH2 * h_BplusM_vs_JpsiM_DoubleMisIDed = new TH2D("h_BplusM_vs_JpsiM_DoubleMisIDed" , "overlay of J_psi mass and B+ mass (both mu+ and pi+ double misIDed", 50, 5000, 6000, 200, 0, 4000);
  860. h_BplusM_vs_JpsiM_DoubleMisIDed->GetXaxis()->SetTitle("B_plus_M (double misIDed) [MeV]");
  861. h_BplusM_vs_JpsiM_DoubleMisIDed->GetYaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  862. TH2 * h_KstarM_vs_JpsiM_DoubleMisIDed = new TH2D("h_KstarM_vs_JpsiM_DoubleMisIDed" , "overlay of J_psi mass and K*+ mass (both mu+ and pi+ double misIDed", 125, 500, 3000, 200, 0, 4000);
  863. h_KstarM_vs_JpsiM_DoubleMisIDed->GetXaxis()->SetTitle("K_star_mass (double misIDed) [MeV]");
  864. h_KstarM_vs_JpsiM_DoubleMisIDed->GetYaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  865. TH1 * h_Jpsi_Spectrum_MisIDed_Muon = new TH1D("h_Jpsi_Spectrum_MisIDed_Muon" , "Invariant mass of Jpsi with a pion misIDed as a muon", 200, 0, 4000);
  866. h_Jpsi_Spectrum_MisIDed_Muon->GetXaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  867. h_Jpsi_Spectrum_MisIDed_Muon->GetYaxis()->SetTitle("Candidates/20MeV");
  868. TH1 * h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon = new TH1D("h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon" , "Invariant mass of Jpsi with a pion misIDed as a muon (Veto Resonant DiMuons)", 200, 0, 4000);
  869. h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon->GetXaxis()->SetTitle("J_psi_M (double misIDed) [MeV]");
  870. h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon->GetYaxis()->SetTitle("Candidates/20MeV");
  871. TH1 * h_Q2_Spectrum_MisIDed_Muon = new TH1D("h_Q2_Spectrum_MisIDed_Muon" , "Q2 of non-resonant DiMuons with a pion misIDed as a muon", 100, 0, 20);
  872. h_Q2_Spectrum_MisIDed_Muon->GetXaxis()->SetTitle("Q2 (double misIDed) [GeV^{2}]");
  873. h_Q2_Spectrum_MisIDed_Muon->GetYaxis()->SetTitle("Candidates / 0.2 GeV^{2}");
  874. /// K+ pi0
  875. TH1 * h_pi0_resolved_candidates_M = new TH1D("h_pi0_resolved_candidates_M" , "#pi^{0} resolved mass spectra", 70, 100, 170);
  876. h_pi0_resolved_candidates_M->GetXaxis()->SetTitle("#pi^{0} resolved mass [MeV]");
  877. h_pi0_resolved_candidates_M->GetYaxis()->SetTitle("Candidates/1MeV");
  878. TH1 * h_pi0_merged_candidates_M = new TH1D("h_pi0_merged_candidates_M" , "#pi^{0} merged mass spectra", 70, 100, 170);
  879. h_pi0_merged_candidates_M->GetXaxis()->SetTitle("#pi^{0} merged mass [MeV]");
  880. h_pi0_merged_candidates_M->GetYaxis()->SetTitle("Candidates/1MeV");
  881. TH1 * h_pi0_merged_candidates_pT = new TH1D("h_pi0_merged_candidates_pT" , "p_{T} spectra of merged pion", 100, 0, 20000);
  882. h_pi0_merged_candidates_pT->GetXaxis()->SetTitle("p_{T} (#pi^{0} merged) [MeV]");
  883. h_pi0_merged_candidates_pT->GetYaxis()->SetTitle("Candidates/200MeV");
  884. TH1 * h_pi0_resolved_candidates_pT = new TH1D("h_pi0_resolved_candidates_pT" , "p_{T} spectra of resolved pion", 100, 0, 20000);
  885. h_pi0_resolved_candidates_pT->GetXaxis()->SetTitle("p_{T} (#pi^{0} resolved) [MeV]");
  886. h_pi0_resolved_candidates_pT->GetYaxis()->SetTitle("Candidates/200MeV");
  887. TH1 * h_KGammaGammaMuMu_mass_before_preselection = new TH1D("h_KGammaGammaMuMu_mass_before_preselection" , "m_{K#gamma#gamma#mu#mu before}", 100, get_cut_B_plus_M_low(year), cut_B_plus_M_high);
  888. h_KGammaGammaMuMu_mass_before_preselection->GetXaxis()->SetTitle("m_{K#gamma#gamma#mu#mu} [MeV] before");
  889. h_KGammaGammaMuMu_mass_before_preselection->GetYaxis()->SetTitle(Form("Counts / %.2fMeV", TMath::Abs(cut_B_plus_M_high - get_cut_B_plus_M_low(year))/100));
  890. TH1 * h_KGammaGammaMuMu_mass_after_preselection= new TH1D("h_KGammaGammaMuMu_mass_after_preselection" , "m_{K#gamma#gamma#mu#mu after}", 100, get_cut_B_plus_M_low(year), cut_B_plus_M_high);
  891. h_KGammaGammaMuMu_mass_after_preselection->GetXaxis()->SetTitle("m_{K#gamma#gamma#mu#mu} [MeV] after");
  892. h_KGammaGammaMuMu_mass_after_preselection->GetYaxis()->SetTitle(Form("Counts / %.2fMeV", TMath::Abs(cut_B_plus_M_high - get_cut_B_plus_M_low(year))/100));
  893. TH1 * h_KPiMuMu_KGammaGammaMuMu_mass= new TH1D("h_KPiMuMu_KGammaGammaMuMu_mass" , "m_{K#pi_{0}#mu#mu}", 100, get_cut_B_plus_M_low(year), cut_B_plus_M_high);
  894. h_KPiMuMu_KGammaGammaMuMu_mass->GetXaxis()->SetTitle("m_{K#pi_{0}#mu#mu}[MeV]");
  895. h_KPiMuMu_KGammaGammaMuMu_mass->GetYaxis()->SetTitle(Form("Counts / %.2fMeV", TMath::Abs(cut_B_plus_M_high - get_cut_B_plus_M_low(year))/100));
  896. TH2 * h_pi0Mass2D = new TH2D("h_pi0Mass2D" , "mass spectrum of #pi^{0} ", 70, 100, 170, 70, 100, 170);
  897. h_pi0Mass2D->GetXaxis()->SetTitle("mass from tree [MeV]");
  898. h_pi0Mass2D->GetYaxis()->SetTitle("mass from #gamma #gamma [MeV]");
  899. //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  900. //Define binning in DiMuon mass^2:
  901. //bin# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
  902. float f_BinBoundaries[19] = {0.1, 0.98, 1.1, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 11.0, 11.75, 12.5, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0}; //in (GeV/c2)^2
  903. for(int i = 0; i < 19; i++)f_BinBoundaries[i] *= 1e6; //in (MeV/c2)^2
  904. //phi -resonance: bin #2
  905. //jpsi -resonance: bin #9
  906. //psi2s-resonance: bin #12
  907. unsigned int nDiMuonMassBin = 0;
  908. summary_tree->Branch("nDiMuonMassBin", &nDiMuonMassBin, "nDiMuonMassBin/I");
  909. Double_t dQ2;
  910. summary_tree->Branch("Q2", &dQ2, "dQ2/D");
  911. unsigned int Is_Phi_JPsi_Psi2S = 0;
  912. summary_tree->Branch("Is_Phi_JPsi_Psi2S", &Is_Phi_JPsi_Psi2S, "Is_Phi_JPsi_Psi2S/I");
  913. //generate subsets for BDT training, etc. corresponding to the eventnumber
  914. //modulus(3) of the eventnumber
  915. summary_tree->Branch("nSubSetNumber", &nSubSetNumber, "nSubSetNumber/I");
  916. //check, whether the Kshort Decays within the velo
  917. //this requires both Kshort daughter pions to be tracktype 3
  918. unsigned int nKshortDecayInVeLo = 0;
  919. if(Kst2Kspiplus){
  920. summary_tree->Branch("KshortDecayInVeLo", &nKshortDecayInVeLo, "nKshortDecayInVeLo/I");
  921. }
  922. //save invariant masses of certain combinations into TBranches
  923. Double_t dDiMuonM;
  924. summary_tree->Branch("DiMuonInvMass", &dDiMuonM, "dDiMuonM/D");
  925. Double_t dKshortMuMuM;
  926. if(Kst2Kspiplus)summary_tree->Branch("KshortMuonsInvMass", &dKshortMuMuM, "dKshortMuMuM/D");
  927. Double_t dKaonPionM;
  928. summary_tree->Branch("KaonPionInvMass", &dKaonPionM, "dKaonPionM/D");
  929. Double_t dReconstructedBM;
  930. summary_tree->Branch("BplusInvMass", &dReconstructedBM, "dReconstructedBM/D");
  931. Double_t dJpsiMisIDed_M;
  932. if(Kst2Kspiplus)summary_tree->Branch("JpsiMisIDedM", &dJpsiMisIDed_M, "JpsiMisIDedM/D");
  933. Double_t dReconstructedBMFixPiZero = 0;
  934. if (Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){ //Add B+ mass with fixed pi0 mass
  935. summary_tree->Branch("BplusInvMass_fixPiZero", &dReconstructedBMFixPiZero, "dReconstructedBMFixPiZero/D");
  936. }
  937. //Branch with gamma gamma angle
  938. Double_t open_angle = 0.;
  939. if (Kst2Kpluspi0Resolved){
  940. summary_tree->Branch("open_angle", &open_angle, "open_angle/D");
  941. }
  942. //get same name branches with pTasymmetry in cones
  943. //for the muDST of the data and Run 2 MC, the conept is gotton from the RELINFO tupletools
  944. //while for Run 1 MC (which is full DST) the conept is determined properly by the default tool and created for multiple cone angles
  945. Double_t B_plus_ConeDeltaETA, B_plus_ConeP, B_plus_ConePasym, B_plus_ConePT, B_plus_ConePTasym;
  946. //create new branches for all trees with the 'new' cone variables! this is needed for the TMVA such that they have the same name
  947. summary_tree->Branch("B_plus_NEW_ConeDeltaETA", &B_plus_ConeDeltaETA, "B_plus_ConeDeltaETA/D");
  948. summary_tree->Branch("B_plus_NEW_ConeP", &B_plus_ConeP, "B_plus_ConeP/D");
  949. summary_tree->Branch("B_plus_NEW_ConePasym", &B_plus_ConePasym, "B_plus_ConePasym/D");
  950. summary_tree->Branch("B_plus_NEW_ConePT", &B_plus_ConePT, "B_plus_ConePT/D");
  951. summary_tree->Branch("B_plus_NEW_ConePTasym", &B_plus_ConePTasym, "B_plus_ConePTasym/D");
  952. //Rename DTF branches and save them
  953. summary_tree->Branch("B_plus_M_DTF", &B_plus_M_DTF, "B_plus_M_DTF/D");
  954. summary_tree->Branch("B_plus_MERR_DTF", &B_plus_MERR_DTF, "B_plus_MERR_DTF/D");
  955. summary_tree->Branch("B_plus_P_DTF", &B_plus_P_DTF, "B_plus_P_DTF/D");
  956. summary_tree->Branch("B_plus_PX_DTF", &B_plus_PX_DTF, "B_plus_PX_DTF/D");
  957. summary_tree->Branch("B_plus_PY_DTF", &B_plus_PY_DTF, "B_plus_PY_DTF/D");
  958. summary_tree->Branch("B_plus_PZ_DTF", &B_plus_PZ_DTF, "B_plus_PZ_DTF/D");
  959. summary_tree->Branch("B_plus_PE_DTF", &B_plus_PE_DTF, "B_plus_PE_DTF/D");
  960. summary_tree->Branch("B_plus_PT_DTF", &B_plus_PT_DTF, "B_plus_PT_DTF/D");
  961. summary_tree->Branch("B_plus_ETA_DTF", &B_plus_ETA_DTF, "B_plus_ETA_DTF/D");
  962. summary_tree->Branch("B_plus_PHI_DTF", &B_plus_PHI_DTF, "B_plus_PHI_DTF/D");
  963. summary_tree->Branch("K_star_plus_M_DTF", &K_star_plus_M_DTF, "K_star_plus_M_DTF/D");
  964. summary_tree->Branch("K_star_plus_P_DTF", &K_star_plus_P_DTF, "K_star_plus_P_DTF/D");
  965. summary_tree->Branch("K_star_plus_PX_DTF", &K_star_plus_PX_DTF, "K_star_plus_PX_DTF/D");
  966. summary_tree->Branch("K_star_plus_PY_DTF", &K_star_plus_PY_DTF, "K_star_plus_PY_DTF/D");
  967. summary_tree->Branch("K_star_plus_PZ_DTF", &K_star_plus_PZ_DTF, "K_star_plus_PZ_DTF/D");
  968. summary_tree->Branch("K_star_plus_PE_DTF", &K_star_plus_PE_DTF, "K_star_plus_PE_DTF/D");
  969. summary_tree->Branch("K_star_plus_PT_DTF", &K_star_plus_PT_DTF, "K_star_plus_PT_DTF/D");
  970. summary_tree->Branch("K_star_plus_ETA_DTF", &K_star_plus_ETA_DTF,"K_star_plus_ETA_DTF/D");
  971. summary_tree->Branch("K_star_plus_PHI_DTF", &K_star_plus_PHI_DTF,"K_star_plus_PHI_DTF/D");
  972. summary_tree->Branch("mu_plus_M_DTF", &mu_plus_M_DTF, "mu_plus_M_DTF/D");
  973. summary_tree->Branch("mu_plus_P_DTF", &mu_plus_P_DTF, "mu_plus_P_DTF/D");
  974. summary_tree->Branch("mu_plus_PX_DTF", &mu_plus_PX_DTF, "mu_plus_PX_DTF/D");
  975. summary_tree->Branch("mu_plus_PY_DTF", &mu_plus_PY_DTF, "mu_plus_PY_DTF/D");
  976. summary_tree->Branch("mu_plus_PZ_DTF", &mu_plus_PZ_DTF, "mu_plus_PZ_DTF/D");
  977. summary_tree->Branch("mu_plus_PE_DTF", &mu_plus_PE_DTF, "mu_plus_PE_DTF/D");
  978. summary_tree->Branch("mu_plus_PT_DTF", &mu_plus_PT_DTF, "mu_plus_PT_DTF/D");
  979. summary_tree->Branch("mu_plus_ETA_DTF", &mu_plus_ETA_DTF, "mu_plus_ETA_DTF/D");
  980. summary_tree->Branch("mu_plus_PHI_DTF", &mu_plus_PHI_DTF, "mu_plus_PHI_DTF/D");
  981. summary_tree->Branch("mu_plus_ID_DTF", &mu_plus_ID_DTF, "mu_plus_ID_DTF/I");
  982. summary_tree->Branch("mu_minus_M_DTF", &mu_minus_M_DTF, "mu_minus_M_DTF/D");
  983. summary_tree->Branch("mu_minus_P_DTF", &mu_minus_P_DTF, "mu_minus_P_DTF/D");
  984. summary_tree->Branch("mu_minus_PX_DTF", &mu_minus_PX_DTF, "mu_minus_PX_DTF/D");
  985. summary_tree->Branch("mu_minus_PY_DTF", &mu_minus_PY_DTF, "mu_minus_PY_DTF/D");
  986. summary_tree->Branch("mu_minus_PZ_DTF", &mu_minus_PZ_DTF, "mu_minus_PZ_DTF/D");
  987. summary_tree->Branch("mu_minus_PE_DTF", &mu_minus_PE_DTF, "mu_minus_PE_DTF/D");
  988. summary_tree->Branch("mu_minus_PT_DTF", &mu_minus_PT_DTF, "mu_minus_PT_DTF/D");
  989. summary_tree->Branch("mu_minus_ETA_DTF", &mu_minus_ETA_DTF, "mu_minus_ETA_DTF/D");
  990. summary_tree->Branch("mu_minus_PHI_DTF", &mu_minus_PHI_DTF, "mu_minus_PHI_DTF/D");
  991. summary_tree->Branch("mu_minus_ID_DTF", &mu_minus_ID_DTF, "mu_minus_ID_DTF/I");
  992. if (Kst2Kpluspi0Resolved){
  993. summary_tree->Branch("pi_zero_resolved_M_DTF", &pi_zero_resolved_M_DTF, "pi_zero_resolved_M_DTF/D");
  994. summary_tree->Branch("pi_zero_resolved_P_DTF", &pi_zero_resolved_P_DTF, "pi_zero_resolved_P_DTF/D");
  995. summary_tree->Branch("pi_zero_resolved_PX_DTF", &pi_zero_resolved_PX_DTF, "pi_zero_resolved_PX_DTF/D");
  996. summary_tree->Branch("pi_zero_resolved_PY_DTF", &pi_zero_resolved_PY_DTF, "pi_zero_resolved_PY_DTF/D");
  997. summary_tree->Branch("pi_zero_resolved_PZ_DTF", &pi_zero_resolved_PZ_DTF, "pi_zero_resolved_PZ_DTF/D");
  998. summary_tree->Branch("pi_zero_resolved_PE_DTF", &pi_zero_resolved_PE_DTF, "pi_zero_resolved_PE_DTF/D");
  999. summary_tree->Branch("pi_zero_resolved_PT_DTF", &pi_zero_resolved_PT_DTF, "pi_zero_resolved_PT_DTF/D");
  1000. summary_tree->Branch("pi_zero_resolved_ETA_DTF", &pi_zero_resolved_ETA_DTF, "pi_zero_resolved_ETA_DTF/D");
  1001. summary_tree->Branch("pi_zero_resolved_PHI_DTF", &pi_zero_resolved_PHI_DTF, "pi_zero_resolved_PHI_DTF/D");
  1002. summary_tree->Branch("K_plus_M_DTF", &K_plus_M_DTF, "K_plus_M_DTF/D");
  1003. summary_tree->Branch("K_plus_P_DTF", &K_plus_P_DTF, "K_plus_P_DTF/D");
  1004. summary_tree->Branch("K_plus_PX_DTF", &K_plus_PX_DTF, "K_plus_PX_DTF/D");
  1005. summary_tree->Branch("K_plus_PY_DTF", &K_plus_PY_DTF, "K_plus_PY_DTF/D");
  1006. summary_tree->Branch("K_plus_PZ_DTF", &K_plus_PZ_DTF, "K_plus_PZ_DTF/D");
  1007. summary_tree->Branch("K_plus_PE_DTF", &K_plus_PE_DTF, "K_plus_PE_DTF/D");
  1008. summary_tree->Branch("K_plus_PT_DTF", &K_plus_PT_DTF, "K_plus_PT_DTF/D");
  1009. summary_tree->Branch("K_plus_ETA_DTF", &K_plus_ETA_DTF, "K_plus_ETA_DTF/D");
  1010. summary_tree->Branch("K_plus_PHI_DTF", &K_plus_PHI_DTF, "K_plus_PHI_DTF/D");
  1011. summary_tree->Branch("K_plus_ID_DTF", &K_plus_ID_DTF, "K_plus_ID_DTF/I");
  1012. summary_tree->Branch("gamma1_M_DTF", &gamma1_M_DTF, "gamma1_M_DTF/D");
  1013. summary_tree->Branch("gamma1_P_DTF", &gamma1_P_DTF, "gamma1_P_DTF/D");
  1014. summary_tree->Branch("gamma1_PX_DTF", &gamma1_PX_DTF, "gamma1_PX_DTF/D");
  1015. summary_tree->Branch("gamma1_PY_DTF", &gamma1_PY_DTF, "gamma1_PY_DTF/D");
  1016. summary_tree->Branch("gamma1_PZ_DTF", &gamma1_PZ_DTF, "gamma1_PZ_DTF/D");
  1017. summary_tree->Branch("gamma1_PE_DTF", &gamma1_PE_DTF, "gamma1_PE_DTF/D");
  1018. summary_tree->Branch("gamma1_PT_DTF", &gamma1_PT_DTF, "gamma1_PT_DTF/D");
  1019. summary_tree->Branch("gamma1_ETA_DTF", &gamma1_ETA_DTF, "gamma1_ETA_DTF/D");
  1020. summary_tree->Branch("gamma1_PHI_DTF", &gamma1_PHI_DTF, "gamma1_PHI_DTF/D");
  1021. summary_tree->Branch("gamma1_ID_DTF", &gamma1_ID_DTF, "gamma1_ID_DTF/I");
  1022. summary_tree->Branch("gamma2_M_DTF", &gamma2_M_DTF, "gamma2_M_DTF/D");
  1023. summary_tree->Branch("gamma2_P_DTF", &gamma2_P_DTF, "gamma2_P_DTF/D");
  1024. summary_tree->Branch("gamma2_PX_DTF", &gamma2_PX_DTF, "gamma2_PX_DTF/D");
  1025. summary_tree->Branch("gamma2_PY_DTF", &gamma2_PY_DTF, "gamma2_PY_DTF/D");
  1026. summary_tree->Branch("gamma2_PZ_DTF", &gamma2_PZ_DTF, "gamma2_PZ_DTF/D");
  1027. summary_tree->Branch("gamma2_PE_DTF", &gamma2_PE_DTF, "gamma2_PE_DTF/D");
  1028. summary_tree->Branch("gamma2_PT_DTF", &gamma2_PT_DTF, "gamma2_PT_DTF/D");
  1029. summary_tree->Branch("gamma2_ETA_DTF", &gamma2_ETA_DTF, "gamma2_ETA_DTF/D");
  1030. summary_tree->Branch("gamma2_PHI_DTF", &gamma2_PHI_DTF, "gamma2_PHI_DTF/D");
  1031. summary_tree->Branch("gamma2_ID_DTF", &gamma2_ID_DTF, "gamma2_ID_DTF/I");
  1032. }
  1033. if(Kst2Kspiplus){
  1034. summary_tree->Branch("K_short_M_DTF", &K_short_M_DTF, "K_short_M_DTF/D");
  1035. summary_tree->Branch("K_short_PT_DTF", &K_short_PT_DTF, "K_short_PT_DTF/D");
  1036. summary_tree->Branch("K_short_ETA_DTF", &K_short_ETA_DTF, "K_short_ETA_DTF/D");
  1037. summary_tree->Branch("K_short_PHI_DTF", &K_short_PHI_DTF, "K_short_PHI_DTF/D");
  1038. summary_tree->Branch("pi_plus_PX_DTF", &pi_plus_PX_DTF, "pi_plus_PX_DTF/D");
  1039. summary_tree->Branch("pi_plus_PY_DTF", &pi_plus_PY_DTF, "pi_plus_PY_DTF/D");
  1040. summary_tree->Branch("pi_plus_PZ_DTF", &pi_plus_PZ_DTF, "pi_plus_PZ_DTF/D");
  1041. summary_tree->Branch("pi_plus_PT_DTF", &pi_plus_PT_DTF, "pi_plus_PT_DTF/D");
  1042. summary_tree->Branch("pi_plus_ETA_DTF", &pi_plus_ETA_DTF, "pi_plus_ETA_DTF/D");
  1043. summary_tree->Branch("pi_plus_PHI_DTF", &pi_plus_PHI_DTF, "pi_plus_PHI_DTF/D");
  1044. summary_tree->Branch("pi_plus_PE_DTF", &pi_plus_PE_DTF, "pi_plus_PE_DTF/D");
  1045. summary_tree->Branch("pi_plus_ID_DTF", &pi_plus_ID_DTF, "pi_plus_ID_DTF/I");
  1046. summary_tree->Branch("Ks_pi_plus_PX_DTF", &Ks_pi_plus_PX_DTF, "Ks_pi_plus_PX_DTF/D");
  1047. summary_tree->Branch("Ks_pi_plus_PY_DTF", &Ks_pi_plus_PY_DTF, "Ks_pi_plus_PY_DTF/D");
  1048. summary_tree->Branch("Ks_pi_plus_PZ_DTF", &Ks_pi_plus_PZ_DTF, "Ks_pi_plus_PZ_DTF/D");
  1049. summary_tree->Branch("Ks_pi_plus_PT_DTF", &Ks_pi_plus_PT_DTF, "Ks_pi_plus_PT_DTF/D");
  1050. summary_tree->Branch("Ks_pi_plus_ETA_DTF", &Ks_pi_plus_ETA_DTF, "Ks_pi_plus_ETA_DTF/D");
  1051. summary_tree->Branch("Ks_pi_plus_PHI_DTF", &Ks_pi_plus_PHI_DTF, "Ks_pi_plus_PHI_DTF/D");
  1052. summary_tree->Branch("Ks_pi_plus_PE_DTF", &Ks_pi_plus_PE_DTF, "Ks_pi_plus_PE_DTF/D");
  1053. summary_tree->Branch("Ks_pi_plus_ID_DTF", &Ks_pi_plus_ID_DTF, "Ks_pi_plus_ID_DTF/I");
  1054. summary_tree->Branch("Ks_pi_minus_PX_DTF", &Ks_pi_minus_PX_DTF, "Ks_pi_minus_PX_DTF/D");
  1055. summary_tree->Branch("Ks_pi_minus_PY_DTF", &Ks_pi_minus_PY_DTF, "Ks_pi_minus_PY_DTF/D");
  1056. summary_tree->Branch("Ks_pi_minus_PZ_DTF", &Ks_pi_minus_PZ_DTF, "Ks_pi_minus_PZ_DTF/D");
  1057. summary_tree->Branch("Ks_pi_minus_PT_DTF", &Ks_pi_minus_PT_DTF, "Ks_pi_minus_PT_DTF/D");
  1058. summary_tree->Branch("Ks_pi_minus_ETA_DTF", &Ks_pi_minus_ETA_DTF, "Ks_pi_minus_ETA_DTF/D");
  1059. summary_tree->Branch("Ks_pi_minus_PHI_DTF", &Ks_pi_minus_PHI_DTF, "Ks_pi_minus_PHI_DTF/D");
  1060. summary_tree->Branch("Ks_pi_minus_PE_DTF", &Ks_pi_minus_PE_DTF, "Ks_pi_minus_PE_DTF/D");
  1061. summary_tree->Branch("Ks_pi_minus_ID_DTF", &Ks_pi_minus_ID_DTF, "Ks_pi_minus_ID_DTF/I");
  1062. }
  1063. //link variables according to MC or data for all cone variables
  1064. if (IsDST(year,MC,ReferenceChannel, PHSP) || (MC && B0 && ReferenceChannel) ){
  1065. tree -> SetBranchAddress( "B_plus_deltaEta_1.00" , &B_plus_ConeDeltaETA );
  1066. tree -> SetBranchAddress( "B_plus_cp_1.00" , &B_plus_ConeP );
  1067. tree -> SetBranchAddress( "B_plus_pasy_1.00" , &B_plus_ConePasym );
  1068. tree -> SetBranchAddress( "B_plus_cpt_1.00" , &B_plus_ConePT );
  1069. tree -> SetBranchAddress( "B_plus_ptasy_1.00" , &B_plus_ConePTasym );
  1070. }
  1071. else{
  1072. tree -> SetBranchAddress( "B_plus_CONEDELTAETA" , &B_plus_ConeDeltaETA );
  1073. tree -> SetBranchAddress( "B_plus_CONEP" , &B_plus_ConeP );
  1074. tree -> SetBranchAddress( "B_plus_CONEPASYM" , &B_plus_ConePasym );
  1075. tree -> SetBranchAddress( "B_plus_CONEPT" , &B_plus_ConePT );
  1076. tree -> SetBranchAddress( "B_plus_CONEPTASYM" , &B_plus_ConePTasym );
  1077. }
  1078. bool IsBplus = true;
  1079. ///////////////////////////////////////////////////////////////////////////
  1080. ///
  1081. /// loop over events
  1082. ///
  1083. ///////////////////////////////////////////////////////////////////////////
  1084. for(int i=0; i< N; i++){
  1085. //output the different counters!
  1086. if ((0ul == (i % 10000ul) || i + 1 == N) && i != 0) {
  1087. cout << "Read event " << i << "/" << N
  1088. << ": tTRG true: " << nCounterTrigger << "/" << i //events passed trigger cut
  1089. << " In K*+ mass: " << nCounterKstarMassWindow << "/" << i //events passed K* mass cut
  1090. << " kinematics: " << nCounterKinematic << "/" << i //events passed kinematics cut
  1091. << " PID: " << nCounterPID << "/" << i //events passed PID cuts
  1092. << " Q2 Range: " << nCounterDiMuonMassInQ2Range << "/" << i //events passed Q^2 cut
  1093. << " not Jpsi: " << nCounterJpsiResonance << "/" << i //events passed trigger cut
  1094. << " B02Ksmm: " << nCounterB0KsmumuMass << "/" << nCounterDiMuonMassInQ2Range //events passed trigger cut
  1095. << endl;
  1096. }
  1097. tree->GetEntry(i);
  1098. //If use DTF, check for convergence and kill the loop at an early stage
  1099. if (UseDTF && B_plus_DTF_status[0] > cut_DTF_status) continue;
  1100. if (UseDTF && B_plus_DTF_chi2[0] > cut_DTF_chi2) continue; //Sanity check on chi2
  1101. //use variable to use consistent pion and muon daugthers for the complex conjugated cases (B-)
  1102. //Correlation between B+ and muons/pions:
  1103. //B_plus_ID mu_minus_ID mu_plus_ID KS_piplus_ID KS_piminus_ID
  1104. //+521 +13 -13 +211 -211
  1105. //-521 -13 +13 -211 +211
  1106. //in DTF only final state particles are assign an ID, therefore, use the charged daughter of K*+ (i.e. K+ or pi+) for identification
  1107. //B+ ID > 0 <==> K+/pi+ ID > 0
  1108. if(Kst2Kspiplus)IsBplus = f_pi_plus_ID_DTF[0] > 0;
  1109. else IsBplus = f_K_plus_ID_DTF[0] > 0;
  1110. //convert Float_t (arrays) to Double_t
  1111. //momenta
  1112. if(Kst2Kspiplus){
  1113. pi_plus_PX_DTF = (Double_t) f_pi_plus_PX_DTF[0];
  1114. pi_plus_PY_DTF = (Double_t) f_pi_plus_PY_DTF[0];
  1115. pi_plus_PZ_DTF = (Double_t) f_pi_plus_PZ_DTF[0];
  1116. pi_plus_PE_DTF = (Double_t) f_pi_plus_PE_DTF[0];
  1117. pi_plus_ID_DTF = std::round(f_pi_plus_ID_DTF[0]);
  1118. if(IsBplus){
  1119. Ks_pi_minus_PX_DTF = (Double_t) f_Ks_pi_plus_PX_DTF[0];
  1120. Ks_pi_minus_PY_DTF = (Double_t) f_Ks_pi_plus_PY_DTF[0];
  1121. Ks_pi_minus_PZ_DTF = (Double_t) f_Ks_pi_plus_PZ_DTF[0];
  1122. Ks_pi_minus_PE_DTF = (Double_t) f_Ks_pi_plus_PE_DTF[0];
  1123. Ks_pi_minus_ID_DTF = std::round(f_Ks_pi_plus_ID_DTF[0]);
  1124. Ks_pi_plus_PX_DTF = (Double_t) f_Ks_pi_minus_PX_DTF[0];
  1125. Ks_pi_plus_PY_DTF = (Double_t) f_Ks_pi_minus_PY_DTF[0];
  1126. Ks_pi_plus_PZ_DTF = (Double_t) f_Ks_pi_minus_PZ_DTF[0];
  1127. Ks_pi_plus_PE_DTF = (Double_t) f_Ks_pi_minus_PE_DTF[0];
  1128. Ks_pi_plus_ID_DTF = std::round(f_Ks_pi_minus_ID_DTF[0]);
  1129. }
  1130. else{
  1131. Ks_pi_plus_PX_DTF = (Double_t) f_Ks_pi_plus_PX_DTF[0];
  1132. Ks_pi_plus_PY_DTF = (Double_t) f_Ks_pi_plus_PY_DTF[0];
  1133. Ks_pi_plus_PZ_DTF = (Double_t) f_Ks_pi_plus_PZ_DTF[0];
  1134. Ks_pi_plus_PE_DTF = (Double_t) f_Ks_pi_plus_PE_DTF[0];
  1135. Ks_pi_plus_ID_DTF = std::round(f_Ks_pi_plus_ID_DTF[0]);
  1136. Ks_pi_minus_PX_DTF = (Double_t) f_Ks_pi_minus_PX_DTF[0];
  1137. Ks_pi_minus_PY_DTF = (Double_t) f_Ks_pi_minus_PY_DTF[0];
  1138. Ks_pi_minus_PZ_DTF = (Double_t) f_Ks_pi_minus_PZ_DTF[0];
  1139. Ks_pi_minus_PE_DTF = (Double_t) f_Ks_pi_minus_PE_DTF[0];
  1140. Ks_pi_minus_ID_DTF = std::round(f_Ks_pi_minus_ID_DTF[0]);
  1141. }
  1142. }
  1143. if(Kst2Kpluspi0Resolved){
  1144. K_plus_PX_DTF = (Double_t) f_K_plus_PX_DTF[0];
  1145. K_plus_PY_DTF = (Double_t) f_K_plus_PY_DTF[0];
  1146. K_plus_PZ_DTF = (Double_t) f_K_plus_PZ_DTF[0];
  1147. K_plus_PE_DTF = (Double_t) f_K_plus_PE_DTF[0];
  1148. K_plus_ID_DTF = std::round(f_K_plus_ID_DTF[0]);
  1149. gamma1_PX_DTF = (Double_t) f_gamma1_PX_DTF[0];
  1150. gamma1_PY_DTF = (Double_t) f_gamma1_PY_DTF[0];
  1151. gamma1_PZ_DTF = (Double_t) f_gamma1_PZ_DTF[0];
  1152. gamma1_PE_DTF = (Double_t) f_gamma1_PE_DTF[0];
  1153. gamma1_ID_DTF = std::round(f_gamma1_ID_DTF[0]);
  1154. gamma2_PX_DTF = (Double_t) f_gamma2_PX_DTF[0];
  1155. gamma2_PY_DTF = (Double_t) f_gamma2_PY_DTF[0];
  1156. gamma2_PZ_DTF = (Double_t) f_gamma2_PZ_DTF[0];
  1157. gamma2_PE_DTF = (Double_t) f_gamma2_PE_DTF[0];
  1158. gamma2_ID_DTF = std::round(f_gamma2_ID_DTF[0]);
  1159. }
  1160. if(IsBplus){
  1161. mu_minus_PX_DTF = (Double_t) f_mu_plus_PX_DTF[0];
  1162. mu_minus_PY_DTF = (Double_t) f_mu_plus_PY_DTF[0];
  1163. mu_minus_PZ_DTF = (Double_t) f_mu_plus_PZ_DTF[0];
  1164. mu_minus_PE_DTF = (Double_t) f_mu_plus_PE_DTF[0];
  1165. mu_minus_ID_DTF = std::round(f_mu_plus_ID_DTF[0]);
  1166. mu_plus_PX_DTF = (Double_t) f_mu_minus_PX_DTF[0];
  1167. mu_plus_PY_DTF = (Double_t) f_mu_minus_PY_DTF[0];
  1168. mu_plus_PZ_DTF = (Double_t) f_mu_minus_PZ_DTF[0];
  1169. mu_plus_PE_DTF = (Double_t) f_mu_minus_PE_DTF[0];
  1170. mu_plus_ID_DTF = std::round(f_mu_minus_ID_DTF[0]);
  1171. }
  1172. else{
  1173. mu_plus_PX_DTF = (Double_t) f_mu_plus_PX_DTF[0];
  1174. mu_plus_PY_DTF = (Double_t) f_mu_plus_PY_DTF[0];
  1175. mu_plus_PZ_DTF = (Double_t) f_mu_plus_PZ_DTF[0];
  1176. mu_plus_PE_DTF = (Double_t) f_mu_plus_PE_DTF[0];
  1177. mu_plus_ID_DTF = std::round(f_mu_plus_ID_DTF[0]);
  1178. mu_minus_PX_DTF = (Double_t) f_mu_minus_PX_DTF[0];
  1179. mu_minus_PY_DTF = (Double_t) f_mu_minus_PY_DTF[0];
  1180. mu_minus_PZ_DTF = (Double_t) f_mu_minus_PZ_DTF[0];
  1181. mu_minus_PE_DTF = (Double_t) f_mu_minus_PE_DTF[0];
  1182. mu_minus_ID_DTF = std::round(f_mu_minus_ID_DTF[0]);
  1183. }
  1184. //convert masses Float_t to Double_t
  1185. B_plus_M_DTF = (Double_t) f_B_plus_M_DTF[0];
  1186. B_plus_MERR_DTF = (Double_t) f_B_plus_MERR_DTF[0];
  1187. K_star_plus_M_DTF = (Double_t) f_K_star_plus_M_DTF[0];
  1188. if(Kst2Kspiplus){
  1189. K_short_M_DTF = (Double_t) f_K_short_M_DTF[0];
  1190. }
  1191. if(Kst2Kpluspi0Resolved){
  1192. pi_zero_resolved_M_DTF = (Double_t) f_pi_zero_resolved_M_DTF[0];
  1193. }
  1194. //define the Lorentz vectors
  1195. if(UseDTF){ //start useDTF for LorentzVectors
  1196. if(UsePDGmIn4Dvectors){
  1197. LorVec_mu_minus.SetXYZM (mu_minus_PX_DTF, mu_minus_PY_DTF, mu_minus_PZ_DTF, PDGMASS.MU);
  1198. LorVec_mu_plus.SetXYZM (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, PDGMASS.MU);
  1199. if(Kst2Kspiplus){
  1200. /// Ks, pi+
  1201. LorVec_pi_plus.SetXYZM (pi_plus_PX_DTF, pi_plus_PY_DTF, pi_plus_PZ_DTF, PDGMASS.PI_PLUS);
  1202. LorVec_KS_pi_plus.SetXYZM (Ks_pi_plus_PX_DTF, Ks_pi_plus_PY_DTF, Ks_pi_plus_PZ_DTF, PDGMASS.PI_PLUS);
  1203. LorVec_KS_pi_minus.SetXYZM (Ks_pi_minus_PX_DTF, Ks_pi_minus_PY_DTF, Ks_pi_minus_PZ_DTF, PDGMASS.PI_PLUS);
  1204. LorVec_pi_plus_MisIDed.SetXYZM (pi_plus_PX_DTF, pi_plus_PY_DTF, pi_plus_PZ_DTF, PDGMASS.MU);
  1205. LorVec_mu_plus_MisIDed.SetXYZM (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, PDGMASS.PI_PLUS);
  1206. }
  1207. else{
  1208. /// K+, pi0
  1209. LorVec_K_plus.SetXYZM (K_plus_PX_DTF, K_plus_PY_DTF, K_plus_PZ_DTF, PDGMASS.K_PLUS);
  1210. LorVec_gamma1.SetXYZM (gamma1_PX_DTF, gamma1_PY_DTF, gamma1_PZ_DTF, PDGMASS.GAMMA);
  1211. LorVec_gamma2.SetXYZM (gamma2_PX_DTF, gamma2_PY_DTF, gamma2_PZ_DTF, PDGMASS.GAMMA);
  1212. }
  1213. }
  1214. else{
  1215. LorVec_mu_minus.SetPxPyPzE (mu_minus_PX_DTF, mu_minus_PY_DTF, mu_minus_PZ_DTF, mu_minus_PE_DTF);
  1216. LorVec_mu_plus.SetPxPyPzE (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, mu_plus_PE_DTF);
  1217. if(Kst2Kspiplus){
  1218. /// Ks, pi+
  1219. LorVec_pi_plus.SetPxPyPzE (pi_plus_PX_DTF, pi_plus_PY_DTF, pi_plus_PZ_DTF, pi_plus_PE_DTF);
  1220. LorVec_KS_pi_plus.SetPxPyPzE (Ks_pi_plus_PX_DTF, Ks_pi_plus_PY_DTF, Ks_pi_plus_PZ_DTF, Ks_pi_plus_PE_DTF);
  1221. LorVec_KS_pi_minus.SetPxPyPzE (Ks_pi_minus_PX_DTF, Ks_pi_minus_PY_DTF, Ks_pi_minus_PZ_DTF, Ks_pi_minus_PE_DTF);
  1222. LorVec_pi_plus_MisIDed.SetXYZM (pi_plus_PX_DTF, pi_plus_PY_DTF, pi_plus_PZ_DTF, PDGMASS.MU);
  1223. LorVec_mu_plus_MisIDed.SetXYZM (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, PDGMASS.PI_PLUS);
  1224. }
  1225. else{
  1226. /// K+, pi0
  1227. LorVec_K_plus.SetPxPyPzE (K_plus_PX_DTF, K_plus_PY_DTF, K_plus_PZ_DTF, K_plus_PE_DTF);
  1228. LorVec_gamma1.SetPxPyPzE (gamma1_PX_DTF, gamma1_PY_DTF, gamma1_PZ_DTF, gamma1_PE_DTF);
  1229. LorVec_gamma2.SetPxPyPzE (gamma2_PX_DTF, gamma2_PY_DTF, gamma2_PZ_DTF, gamma2_PE_DTF);
  1230. }
  1231. }
  1232. //directly recombine the non-stable particles for later use (K*+ not really needed/used for Kst2Kspiplus)
  1233. if(Kst2Kspiplus){
  1234. LorVec_K_short = LorVec_KS_pi_plus + LorVec_KS_pi_minus;
  1235. LorVec_KaonPion = LorVec_K_short + LorVec_pi_plus;
  1236. }
  1237. if(Kst2Kpluspi0Resolved){
  1238. LorVec_DiGamma = LorVec_gamma1 + LorVec_gamma2;
  1239. LorVec_pi_zero_resolved = LorVec_DiGamma;
  1240. LorVec_KaonPion = LorVec_K_plus + LorVec_pi_zero_resolved;
  1241. }
  1242. LorVec_K_star_plus = LorVec_KaonPion;
  1243. LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
  1244. LorVec_B_plus = LorVec_K_star_plus + LorVec_DiMuon;
  1245. //determine transvers momenta PT for all particles:
  1246. B_plus_P_DTF = LorVec_B_plus.P();
  1247. B_plus_PX_DTF = LorVec_B_plus.Px();
  1248. B_plus_PY_DTF = LorVec_B_plus.Py();
  1249. B_plus_PZ_DTF = LorVec_B_plus.Pz();
  1250. B_plus_PT_DTF = LorVec_B_plus.Pt();
  1251. B_plus_PE_DTF = LorVec_B_plus.E();
  1252. B_plus_ETA_DTF = LorVec_B_plus.Eta();
  1253. B_plus_PHI_DTF = LorVec_B_plus.Phi();
  1254. K_star_plus_M_DTF = LorVec_K_star_plus.M();
  1255. K_star_plus_P_DTF = LorVec_K_star_plus.P();
  1256. K_star_plus_PX_DTF = LorVec_K_star_plus.Px();
  1257. K_star_plus_PY_DTF = LorVec_K_star_plus.Py();
  1258. K_star_plus_PZ_DTF = LorVec_K_star_plus.Pz();
  1259. K_star_plus_PT_DTF = LorVec_K_star_plus.Pt();
  1260. K_star_plus_PE_DTF = LorVec_K_star_plus.E();
  1261. K_star_plus_ETA_DTF = LorVec_K_star_plus.Eta();
  1262. K_star_plus_PHI_DTF = LorVec_K_star_plus.Phi();
  1263. mu_plus_P_DTF = LorVec_mu_plus.P();
  1264. mu_plus_M_DTF = LorVec_mu_plus.M();
  1265. mu_plus_PT_DTF = LorVec_mu_plus.Pt();
  1266. mu_plus_ETA_DTF = LorVec_mu_plus.Eta();
  1267. mu_plus_PHI_DTF = LorVec_mu_plus.Phi();
  1268. mu_minus_P_DTF = LorVec_mu_minus.P();
  1269. mu_minus_M_DTF = LorVec_mu_minus.M();
  1270. mu_minus_PT_DTF = LorVec_mu_minus.Pt();
  1271. mu_minus_ETA_DTF = LorVec_mu_minus.Eta();
  1272. mu_minus_PHI_DTF = LorVec_mu_minus.Phi();
  1273. if(Kst2Kspiplus){
  1274. K_short_PT_DTF = LorVec_K_short.Pt();
  1275. K_short_ETA_DTF = LorVec_K_short.Eta();
  1276. K_short_PHI_DTF = LorVec_K_short.Phi();
  1277. Ks_pi_plus_PT_DTF = LorVec_KS_pi_plus.Pt();
  1278. Ks_pi_plus_ETA_DTF = LorVec_KS_pi_plus.Eta();
  1279. Ks_pi_plus_PHI_DTF = LorVec_KS_pi_plus.Phi();
  1280. Ks_pi_minus_PT_DTF = LorVec_KS_pi_minus.Pt();
  1281. Ks_pi_minus_ETA_DTF = LorVec_KS_pi_minus.Eta();
  1282. Ks_pi_minus_PHI_DTF = LorVec_KS_pi_minus.Phi();
  1283. pi_plus_PT_DTF = LorVec_pi_plus.Pt();
  1284. pi_plus_ETA_DTF = LorVec_pi_plus.Eta();
  1285. pi_plus_PHI_DTF = LorVec_pi_plus.Phi();
  1286. }
  1287. if(Kst2Kpluspi0Resolved){
  1288. K_plus_P_DTF = LorVec_K_plus.P();
  1289. K_plus_M_DTF = LorVec_K_plus.M();
  1290. K_plus_PT_DTF = LorVec_K_plus.Pt();
  1291. K_plus_ETA_DTF = LorVec_K_plus.Eta();
  1292. K_plus_PHI_DTF = LorVec_K_plus.Phi();
  1293. pi_zero_resolved_P_DTF = LorVec_pi_zero_resolved.P();
  1294. pi_zero_resolved_PX_DTF = LorVec_pi_zero_resolved.Px();
  1295. pi_zero_resolved_PY_DTF = LorVec_pi_zero_resolved.Py();
  1296. pi_zero_resolved_PZ_DTF = LorVec_pi_zero_resolved.Pz();
  1297. pi_zero_resolved_PT_DTF = LorVec_pi_zero_resolved.Pt();
  1298. pi_zero_resolved_PE_DTF = LorVec_pi_zero_resolved.E();
  1299. pi_zero_resolved_ETA_DTF= LorVec_pi_zero_resolved.Eta();
  1300. pi_zero_resolved_PHI_DTF= LorVec_pi_zero_resolved.Phi();
  1301. gamma1_M_DTF = LorVec_gamma1.M();
  1302. gamma1_P_DTF = LorVec_gamma1.P();
  1303. gamma1_PT_DTF = LorVec_gamma1.Pt();
  1304. gamma1_ETA_DTF = LorVec_gamma1.Eta();
  1305. gamma1_PHI_DTF = LorVec_gamma1.Phi();
  1306. gamma2_M_DTF = LorVec_gamma2.M();
  1307. gamma2_P_DTF = LorVec_gamma2.P();
  1308. gamma2_PT_DTF = LorVec_gamma2.Pt();
  1309. gamma2_ETA_DTF = LorVec_gamma2.Eta();
  1310. gamma2_PHI_DTF = LorVec_gamma2.Phi();
  1311. }
  1312. } //end useDTF for LorentzVectors
  1313. else{ //NON-DTF variables
  1314. if(UsePDGmIn4Dvectors){ //USE PDG masses
  1315. LorVec_B_plus.SetXYZM (B_plus_PX, B_plus_PY, B_plus_PZ, PDGMASS.B_PLUS);
  1316. LorVec_K_star_plus.SetXYZM (K_star_plus_PX, K_star_plus_PY, K_star_plus_PZ, PDGMASS.K_STAR_PLUS);
  1317. LorVec_mu_minus.SetXYZM (mu_minus_PX, mu_minus_PY, mu_minus_PZ, PDGMASS.MU);
  1318. LorVec_mu_plus.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.MU);
  1319. if(Kst2Kspiplus){
  1320. /// Ks, pi+
  1321. LorVec_K_short.SetXYZM (K_short_PX, K_short_PY, K_short_PZ, PDGMASS.K_SHORT);
  1322. LorVec_pi_plus.SetXYZM (pi_plus_PX, pi_plus_PY, pi_plus_PZ, PDGMASS.PI_PLUS);
  1323. LorVec_KS_pi_plus.SetXYZM (Ks_pi_plus_PX, Ks_pi_plus_PY, Ks_pi_plus_PZ, PDGMASS.PI_PLUS);
  1324. LorVec_KS_pi_minus.SetXYZM (Ks_pi_minus_PX, Ks_pi_minus_PY, Ks_pi_minus_PZ, PDGMASS.PI_PLUS);
  1325. LorVec_pi_plus_MisIDed.SetXYZM (pi_plus_PX, pi_plus_PY, pi_plus_PZ, PDGMASS.MU);
  1326. LorVec_mu_plus_MisIDed.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.PI_PLUS);
  1327. }
  1328. else{
  1329. /// K+, pi0
  1330. LorVec_K_plus.SetXYZM (K_plus_PX, K_plus_PY, K_plus_PZ, PDGMASS.K_PLUS);
  1331. LorVec_pi_zero_merged.SetXYZM (pi_zero_merged_PX, pi_zero_merged_PY, pi_zero_merged_PZ, PDGMASS.PI_ZERO);
  1332. LorVec_pi_zero_resolved.SetXYZM (pi_zero_resolved_PX, pi_zero_resolved_PY, pi_zero_resolved_PZ, PDGMASS.PI_ZERO);
  1333. LorVec_gamma1.SetXYZM (gamma1_PX, gamma1_PY, gamma1_PZ, PDGMASS.GAMMA);
  1334. LorVec_gamma2.SetXYZM (gamma2_PX, gamma2_PY, gamma2_PZ, PDGMASS.GAMMA);
  1335. }
  1336. }
  1337. else{
  1338. LorVec_B_plus.SetPxPyPzE (B_plus_PX, B_plus_PY, B_plus_PZ, B_plus_PE);
  1339. LorVec_K_star_plus.SetPxPyPzE (K_star_plus_PX, K_star_plus_PY, K_star_plus_PZ, K_star_plus_PE);
  1340. LorVec_mu_minus.SetPxPyPzE (mu_minus_PX, mu_minus_PY, mu_minus_PZ, mu_minus_PE);
  1341. LorVec_mu_plus.SetPxPyPzE (mu_plus_PX, mu_plus_PY, mu_plus_PZ, mu_plus_PE);
  1342. if(Kst2Kspiplus){
  1343. /// Ks, pi+
  1344. LorVec_K_short.SetPxPyPzE (K_short_PX, K_short_PY, K_short_PZ, K_short_PE);
  1345. LorVec_pi_plus.SetPxPyPzE (pi_plus_PX, pi_plus_PY, pi_plus_PZ, pi_plus_PE);
  1346. LorVec_KS_pi_plus.SetPxPyPzE (Ks_pi_plus_PX, Ks_pi_plus_PY, Ks_pi_plus_PZ, Ks_pi_plus_PE);
  1347. LorVec_KS_pi_minus.SetPxPyPzE (Ks_pi_minus_PX, Ks_pi_minus_PY, Ks_pi_minus_PZ, Ks_pi_minus_PE);
  1348. LorVec_pi_plus_MisIDed.SetXYZM (pi_plus_PX, pi_plus_PY, pi_plus_PZ, PDGMASS.MU);
  1349. LorVec_mu_plus_MisIDed.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.PI_PLUS);
  1350. }
  1351. else{
  1352. /// K+, pi0
  1353. LorVec_K_plus.SetPxPyPzE (K_plus_PX, K_plus_PY, K_plus_PZ, K_plus_PE);
  1354. LorVec_pi_zero_merged.SetPxPyPzE (pi_zero_merged_PX, pi_zero_merged_PY, pi_zero_merged_PZ, pi_zero_merged_PE);
  1355. LorVec_pi_zero_resolved.SetPxPyPzE (pi_zero_resolved_PX, pi_zero_resolved_PY, pi_zero_resolved_PZ, pi_zero_resolved_PE);
  1356. LorVec_gamma1.SetPxPyPzE (gamma1_PX, gamma1_PY, gamma1_PZ, gamma1_PE);
  1357. LorVec_gamma2.SetPxPyPzE (gamma2_PX, gamma2_PY, gamma2_PZ, gamma2_PE);
  1358. }
  1359. }
  1360. //Recombination of 'Parent'-Particles
  1361. LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
  1362. if(Kst2Kspiplus){
  1363. LorVec_KaonPion = LorVec_K_short + LorVec_pi_plus;
  1364. }
  1365. if(Kst2Kpluspi0Merged){
  1366. LorVec_KaonPion = LorVec_K_plus + LorVec_pi_zero_merged;
  1367. }
  1368. if(Kst2Kpluspi0Resolved){
  1369. LorVec_DiGamma = LorVec_gamma1 + LorVec_gamma2;
  1370. LorVec_KaonPion = LorVec_K_plus + LorVec_DiGamma;
  1371. }
  1372. }
  1373. //Recombination of Particles
  1374. if(Kst2Kspiplus){
  1375. LorVec_KshortMuMu = LorVec_K_short + LorVec_DiMuon;
  1376. }
  1377. if(Kst2Kpluspi0Merged){
  1378. LorVec_KplusMuMu = LorVec_K_plus+ LorVec_DiMuon;
  1379. }
  1380. if(Kst2Kpluspi0Resolved){
  1381. LorVec_KplusMuMu = LorVec_K_plus+ LorVec_DiMuon;
  1382. LorVec_ReconBPiZero = LorVec_DiMuon + LorVec_K_plus + LorVec_pi_zero_resolved;
  1383. dReconstructedBMFixPiZero = LorVec_ReconBPiZero.M();
  1384. open_angle =LorVec_gamma1.Angle(LorVec_gamma2.Vect());
  1385. }
  1386. LorVec_K_star_plus = LorVec_KaonPion;
  1387. LorVec_ReconB = LorVec_DiMuon + LorVec_K_star_plus;
  1388. //double misIDed
  1389. if(Kst2Kspiplus){
  1390. LorVec_K_star_plus_From_DoubleMisIDed = LorVec_K_short + LorVec_mu_plus_MisIDed;
  1391. LorVec_Jpsi_From_DoubleMisIDed = LorVec_pi_plus_MisIDed + LorVec_mu_minus;
  1392. LorVec_B_plus_From_DoubleMisIDed = LorVec_Jpsi_From_DoubleMisIDed + LorVec_K_star_plus_From_DoubleMisIDed;
  1393. }
  1394. //save masses to doubles!
  1395. dDiMuonM = LorVec_DiMuon.M();
  1396. dKaonPionM = LorVec_KaonPion.M();
  1397. dReconstructedBM = LorVec_ReconB.M();
  1398. if(Kst2Kspiplus) dKshortMuMuM = LorVec_KshortMuMu.M();
  1399. //LL (Kshort decays inside the velo)
  1400. if(Kst2Kspiplus){
  1401. h_KshortDaughters->Fill(Ks_pi_minus_TRACK_Type, Ks_pi_plus_TRACK_Type);
  1402. if(Ks_pi_minus_TRACK_Type == 3 && Ks_pi_plus_TRACK_Type == 3){
  1403. nKshortDecayInVeLo = 1;
  1404. }
  1405. //DD (Kshort leaves velo)
  1406. else nKshortDecayInVeLo = 0;
  1407. if(nKshortDecayInVeLo)//cut on pion daughter PT for LL tracks!
  1408. if(Ks_pi_plus_PT < 250. || Ks_pi_minus_PT < 250.)
  1409. continue;
  1410. }
  1411. h_BplusMass_DiMuonMassRaw->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1412. if(Kst2Kspiplus){
  1413. if(nKshortDecayInVeLo == 0)h_BplusMass_DiMuonMassRawDD->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1414. else h_BplusMass_DiMuonMassRawLL->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1415. }
  1416. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1417. //trigger selection
  1418. //L0 stage
  1419. if(B_plus_L0MuonDecision_TOS == 0) continue;
  1420. //HLT 1 stage
  1421. if((B_plus_Hlt1TrackAllL0Decision_TOS == 0) && (B_plus_Hlt1TrackMuonDecision_TOS == 0)) continue;
  1422. //HLT2 stage
  1423. if((B_plus_Hlt2Topo2BodyBBDTDecision_TOS == 0) &&
  1424. (B_plus_Hlt2Topo3BodyBBDTDecision_TOS == 0) &&
  1425. (B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS == 0) &&
  1426. (B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS == 0) &&
  1427. //(B_plus_Hlt2SingleMuonDecision_TOS== 0) && //remove SingleMuon from selection, since its exclusive yield is 1% and pre-scaling messes up data/MC agreement
  1428. (B_plus_Hlt2DiMuonDetachedDecision_TOS== 0) &&
  1429. (B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS == 0) &&
  1430. (B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS == 0)
  1431. ) continue;
  1432. nCounterTrigger++;
  1433. //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1434. //some mass plots
  1435. h_KstarMass2D->Fill(K_star_plus_M, LorVec_KaonPion.M());
  1436. h_KstarMass->Fill(LorVec_KaonPion.M());
  1437. if (Kst2Kpluspi0Merged){
  1438. h_KGammaGammaMuMu_mass_before_preselection->Fill(dReconstructedBM);
  1439. h_pi0_merged_candidates_pT->Fill(LorVec_pi_zero_merged.Perp());
  1440. h_pi0_merged_candidates_M->Fill(LorVec_pi_zero_merged.M());
  1441. }
  1442. if (Kst2Kpluspi0Resolved){
  1443. h_pi0_resolved_candidates_pT->Fill(LorVec_pi_zero_resolved.Perp());
  1444. h_KGammaGammaMuMu_mass_before_preselection->Fill(dReconstructedBM);
  1445. h_pi0_resolved_candidates_M->Fill(LorVec_DiGamma.M());
  1446. h_pi0Mass2D->Fill(pi_zero_resolved_M,LorVec_DiGamma.M());
  1447. }
  1448. h_KstarMass2D->Fill(K_star_plus_M, LorVec_KaonPion.M());
  1449. h_KstarMass->Fill(LorVec_KaonPion.M());
  1450. //mass cuts
  1451. if(TMath::Abs((UseDTF ? K_star_plus_M_DTF : K_star_plus_M) - PDGMASS.K_STAR_PLUS) > K_star_plus_mass_difference) continue; //remove non-resonant K+pi
  1452. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1453. if((UseDTF ? LorVec_K_star_plus.Pt() : K_star_plus_PT) < cut_K_star_plus_pT)continue;
  1454. //if(TMath::Abs(LorVec_KaonPion.M() - PDGMASS.K_STAR_PLUS) > 150) continue; //remove non-resonant K+pi
  1455. }
  1456. h_KstarMasscut->Fill(LorVec_KaonPion.M());
  1457. nCounterKstarMassWindow++;
  1458. if((UseDTF ? B_plus_M_DTF : B_plus_M) < get_cut_B_plus_M_low(year) || (UseDTF ? B_plus_M_DTF : B_plus_M) > cut_B_plus_M_high)continue;
  1459. //Check for non-DTF mass to allign with the older stripping
  1460. if (Kst2Kpluspi0Resolved){
  1461. if(B_plus_M < cut_B_plus_M_low_basic) continue;
  1462. }
  1463. //kinematic cuts
  1464. if(LorVec_B_plus.Theta() <= cut_kin_Theta_low || LorVec_B_plus.Theta() >= cut_kin_Theta_up)continue;
  1465. if(LorVec_K_star_plus.Theta() <= cut_kin_Theta_low || LorVec_K_star_plus.Theta() >= cut_kin_Theta_up)continue;
  1466. if(LorVec_mu_minus.Theta() <= cut_kin_Theta_low || LorVec_mu_minus.Theta() >= cut_kin_Theta_up)continue;
  1467. if(LorVec_mu_plus.Theta() <= cut_kin_Theta_low || LorVec_mu_plus.Theta() >= cut_kin_Theta_up)continue;
  1468. /// newly added
  1469. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1470. if ((UseDTF ? LorVec_B_plus.Pt() : B_plus_PT) < cut_B_plus_pT) continue;
  1471. if (B_plus_DIRA_OWNPV < cut_B_plus_DIRA) continue;
  1472. }
  1473. if(Kst2Kspiplus){
  1474. if(LorVec_K_short.Theta() <= cut_kin_Theta_low || LorVec_K_short.Theta() >= cut_kin_Theta_up)continue;
  1475. if(LorVec_pi_plus.Theta() <= cut_kin_Theta_low || LorVec_pi_plus.Theta() >= cut_kin_Theta_up)continue;
  1476. if(LorVec_KS_pi_plus.Theta() <= cut_kin_Theta_low || LorVec_KS_pi_plus.Theta() >= cut_kin_Theta_up)continue;
  1477. if(LorVec_KS_pi_minus.Theta() <= cut_kin_Theta_low || LorVec_KS_pi_minus.Theta() >= cut_kin_Theta_up)continue;
  1478. }
  1479. if(Kst2Kpluspi0Merged){
  1480. if(LorVec_K_plus.Theta() <= cut_kin_Theta_low || LorVec_K_plus.Theta() >= cut_kin_Theta_up)continue;
  1481. if(LorVec_pi_zero_merged.Theta() <= cut_kin_Theta_low || LorVec_pi_zero_merged.Theta() >= cut_kin_Theta_up)continue;
  1482. if((UseDTF ? LorVec_K_plus.Pt() : K_plus_PT) < 1350) continue;
  1483. }
  1484. if(Kst2Kpluspi0Resolved){
  1485. if(LorVec_K_plus.Theta() <= cut_kin_Theta_low || LorVec_K_plus.Theta() >= cut_kin_Theta_up)continue;
  1486. if(LorVec_pi_zero_resolved.Theta() <= cut_kin_Theta_low || LorVec_pi_zero_resolved.Theta() >= cut_kin_Theta_up)continue;
  1487. }
  1488. if(LorVec_mu_minus.Angle(LorVec_mu_plus.Vect()) <= cut_muon_angle)continue;
  1489. if(Kst2Kspiplus){
  1490. // if(LorVec_K_short.Angle(LorVec_pi_plus.Vect()) <= cut_muon_angle)continue;
  1491. if(LorVec_pi_plus.Angle(LorVec_KS_pi_minus.Vect()) <= cut_muon_angle)continue;
  1492. if(LorVec_pi_plus.Angle(LorVec_KS_pi_plus.Vect()) <= cut_muon_angle)continue;
  1493. if(LorVec_KS_pi_plus.Angle(LorVec_KS_pi_minus.Vect()) <= cut_muon_angle)continue;
  1494. }
  1495. if(Kst2Kpluspi0Merged)if(LorVec_K_plus.Angle(LorVec_pi_zero_merged.Vect()) <= cut_muon_angle)continue;
  1496. if(Kst2Kpluspi0Resolved)if(LorVec_K_plus.Angle(LorVec_pi_zero_resolved.Vect()) <= cut_muon_angle)continue;
  1497. /// newly added
  1498. if(Kst2Kpluspi0Merged)if((UseDTF ? LorVec_pi_zero_merged.Pt() : pi_zero_merged_PT) < cut_pi_zero_PT)continue;
  1499. if(Kst2Kpluspi0Resolved)if((UseDTF ? LorVec_pi_zero_resolved.Pt() : pi_zero_resolved_PT) < cut_pi_zero_PT)continue;
  1500. /// newly added
  1501. //flight distance cuts
  1502. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1503. if (B_plus_FDCHI2_OWNPV < cut_B_plus_FDCHI2) continue;
  1504. if ((!Inc && !K1 && !B0 ) && K_star_plus_FDCHI2_OWNPV < cut_K_star_plus_FDCHI2) continue;
  1505. }
  1506. nCounterKinematic++;
  1507. //primary vertex cut
  1508. if (B_plus_IPCHI2_OWNPV < cut_IPCHI2_OWNPV_low)continue;
  1509. if (K_star_plus_IPCHI2_OWNPV < cut_IPCHI2_OWNPV_low)continue;
  1510. if (mu_plus_IPCHI2_OWNPV < cut_muon_IPCHI2_OWNPV_low)continue;
  1511. if (mu_minus_IPCHI2_OWNPV < cut_muon_IPCHI2_OWNPV_low)continue;
  1512. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged)if (B_plus_IPCHI2_OWNPV > cut_IPCHI2_OWNPV_high)continue;
  1513. nCounterPrV++;
  1514. /// newly added
  1515. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1516. if (B_plus_ConePTasym < cut_B_plus_ConePTasym)continue;
  1517. }
  1518. //position vertex cuts?
  1519. nCounterPoV++;
  1520. h_BeforePIDcuts_ctl->Fill(TMath::Cos(ctl));
  1521. h_BeforePIDcuts_ctk->Fill(TMath::Cos(ctk));
  1522. h_BeforePIDcuts_phi->Fill(phi);
  1523. //muon cuts
  1524. if(!mu_plus_isMuon || !mu_minus_isMuon)continue;
  1525. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1526. if (LorVec_DiMuon.M() > cut_DiMuon_M) continue; //Should be in stripping already
  1527. }
  1528. //particle ID
  1529. if(mu_minus_ProbNNmu <= cut_muon_ProbNNmu)continue;
  1530. if(mu_plus_ProbNNmu <= cut_muon_ProbNNmu)continue;
  1531. if(Kst2Kspiplus){
  1532. if(!pi_plus_hasRich)continue;
  1533. //if(pi_plus_PIDK >= 25)continue;
  1534. }
  1535. if(Kst2Kpluspi0Merged){
  1536. if(!K_plus_hasRich)continue;
  1537. if(K_plus_ProbNNk <= cut_K_plus_ProbNNk)continue;
  1538. }
  1539. if(Kst2Kpluspi0Resolved){
  1540. if(!K_plus_hasRich)continue;
  1541. if(K_plus_ProbNNk <= cut_K_plus_ProbNNk)continue;
  1542. if(gamma1_CL <= cut_gamma_CL)continue;
  1543. if(gamma2_CL <= cut_gamma_CL)continue;
  1544. }
  1545. h_AfterPIDcuts_ctl->Fill(TMath::Cos(ctl));
  1546. h_AfterPIDcuts_ctk->Fill(TMath::Cos(ctk));
  1547. h_AfterPIDcuts_phi->Fill(phi);
  1548. nCounterPID++;
  1549. h_JpsiMass->Fill(LorVec_DiMuon.M());
  1550. //only keep events inside q2 region
  1551. if(LorVec_DiMuon.M2() < f_BinBoundaries[0] || LorVec_DiMuon.M2() > f_BinBoundaries[18])continue;
  1552. nCounterDiMuonMassInQ2Range++;
  1553. h_diMuonReconstructedBMass2D->Fill(dReconstructedBM,dDiMuonM);
  1554. if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
  1555. h_diMuonReconstructedBMass2DFixPiZero->Fill(dReconstructedBMFixPiZero,dDiMuonM);
  1556. }
  1557. if (Kst2Kpluspi0Merged){
  1558. h_KGammaGammaMuMu_mass_after_preselection->Fill(dReconstructedBM);
  1559. }
  1560. if (Kst2Kpluspi0Resolved){
  1561. h_KGammaGammaMuMu_mass_after_preselection->Fill(dReconstructedBM);
  1562. h_KPiMuMu_KGammaGammaMuMu_mass->Fill(dReconstructedBMFixPiZero);
  1563. }
  1564. h_BplusMass_B02KsmumuMass->Fill(LorVec_KshortMuMu.M());
  1565. if(Kst2Kspiplus){ //B0 veto
  1566. if(TMath::Abs(LorVec_KshortMuMu.M() - PDGMASS.B_ZERO) < 50){
  1567. //h_BplusMass_B02KsmumuMass->Fill(B_plus_M);
  1568. nCounterB0KsmumuMass++;
  1569. continue;
  1570. }
  1571. }
  1572. ///////////////////////////////////////
  1573. ///////////////////////////////////////
  1574. ///////////////////////////////////////
  1575. nDiMuonMassBin = 0;
  1576. Is_Phi_JPsi_Psi2S = 0;
  1577. while(LorVec_DiMuon.M2() >= f_BinBoundaries[nDiMuonMassBin]){
  1578. nDiMuonMassBin++;
  1579. }
  1580. if(nDiMuonMassBin == 2){
  1581. Is_Phi_JPsi_Psi2S = 1;
  1582. }
  1583. else if(nDiMuonMassBin == 9){
  1584. h_JpsiMassResonance->Fill(LorVec_DiMuon.M());
  1585. h_CharmoniumResonance->Fill(LorVec_DiMuon.M());
  1586. h_ReconstructBmassInCharmoniumResonance->Fill(LorVec_ReconB.M());
  1587. Is_Phi_JPsi_Psi2S = 1;
  1588. }
  1589. else if(nDiMuonMassBin == 12){
  1590. h_Psi2sMassResonance->Fill(LorVec_DiMuon.M());
  1591. h_CharmoniumResonance->Fill(LorVec_DiMuon.M());
  1592. h_ReconstructBmassInCharmoniumResonance->Fill(LorVec_ReconB.M());
  1593. Is_Phi_JPsi_Psi2S = 1;
  1594. }
  1595. else{
  1596. h_JpsiMassCut->Fill(LorVec_DiMuon.M());
  1597. h_ReconstructBmassOffResonance->Fill(LorVec_ReconB.M());
  1598. nCounterJpsiResonance++;
  1599. }
  1600. /*if((LorVec_DiMuon.M2() < 8e6 || LorVec_DiMuon.M2() > 11e6) && (LorVec_DiMuon.M2() < 12.5e6 || LorVec_DiMuon.M2() > 15e6) && (LorVec_DiMuon.M2() < 0.98e6 || LorVec_DiMuon.M2() > 1.1e6)){
  1601. h_JpsiMassCut->Fill(LorVec_DiMuon.M());
  1602. nCounterJpsiResonance++;
  1603. }*/
  1604. ///////////////////////////////////////
  1605. if(Kst2Kpluspi0Merged || Kst2Kpluspi0Resolved){
  1606. // if (nDiMuonMassBin == 9 || nDiMuonMassBin == 12) continue;
  1607. nCounterB0KsmumuMass++;
  1608. //h_BplusMass_B02KsmumuMass->Fill(B_plus_M);
  1609. }
  1610. ///very soft cuts to ensure a more even distribution for the BDT training:
  1611. if(Kst2Kspiplus){
  1612. if((UseDTF ? LorVec_B_plus.Pt() : B_plus_PT) > 55000.)continue;
  1613. if((UseDTF ? LorVec_K_short.Pt() : K_short_PT) > (nKshortDecayInVeLo == 1 ? 9000. : 14000.))continue;
  1614. if(TMath::Log(B_plus_IPCHI2_OWNPV) < -8.)continue;
  1615. }
  1616. //get subset number from modulus(3) of the eventnumber
  1617. //range 0 to 2
  1618. nSubSetNumber = nEventNumber % 3;
  1619. //plot the double misIDed reconstructed mass distributions for Kshort Channel:
  1620. if(Kst2Kspiplus){
  1621. dJpsiMisIDed_M = LorVec_Jpsi_From_DoubleMisIDed.M();
  1622. h_Jpsi_Spectrum_MisIDed_Muon->Fill(dJpsiMisIDed_M);
  1623. h_BplusM_vs_BplusM_DoubleMisIDed->Fill(LorVec_B_plus_From_DoubleMisIDed.M(), dReconstructedBM);
  1624. h_BplusM_vs_JpsiM_DoubleMisIDed->Fill(LorVec_B_plus_From_DoubleMisIDed.M(), dJpsiMisIDed_M);
  1625. h_KstarM_vs_JpsiM_DoubleMisIDed->Fill(LorVec_K_star_plus_From_DoubleMisIDed.M(), dJpsiMisIDed_M);
  1626. if(nDiMuonMassBin != 2 && nDiMuonMassBin != 9 && nDiMuonMassBin != 12){
  1627. h_Q2_Spectrum_MisIDed_Muon->Fill(LorVec_Jpsi_From_DoubleMisIDed.M2() * 1e-6);
  1628. h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon->Fill(dJpsiMisIDed_M);
  1629. }
  1630. }
  1631. //remove double mis-identified events:
  1632. if(Kst2Kspiplus){
  1633. if(TMath::Abs(dJpsiMisIDed_M - PDGMASS.J_PSI) < 50 && TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) < 30){
  1634. n_DoubleMisID++;
  1635. continue;
  1636. }
  1637. }
  1638. //plot for 2D histos
  1639. h_BplusMass_DiMuonMass->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1640. if(Kst2Kspiplus){
  1641. if(nKshortDecayInVeLo == 1)h_BplusMass_DiMuonMassLL->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1642. else h_BplusMass_DiMuonMassDD->Fill(UseDTF ? B_plus_M_DTF : B_plus_M, dDiMuonM);
  1643. }
  1644. dQ2 = LorVec_DiMuon.M2();
  1645. //---------------------------------------------------------------------------------
  1646. summary_tree->Fill();
  1647. }
  1648. output->cd();
  1649. coutInfo("Remove " + to_string(n_DoubleMisID)+ " double mis-IDed events");
  1650. coutInfo("Save " + to_string(summary_tree->GetEntries())+ " events to new file!");
  1651. summary_tree->Write("",TObject::kWriteDelete);
  1652. output->Close();
  1653. coutInfo("Save quality histograms to seperate file!");
  1654. histos->cd();
  1655. h_JpsiMass->Write("",TObject::kWriteDelete);
  1656. h_JpsiMassCut->Write("",TObject::kWriteDelete);
  1657. h_JpsiMassResonance->Write("",TObject::kWriteDelete);
  1658. h_Psi2sMassResonance->Write("",TObject::kWriteDelete);
  1659. h_CharmoniumResonance->Write("",TObject::kWriteDelete);
  1660. h_ReconstructBmassInCharmoniumResonance->Write("",TObject::kWriteDelete);
  1661. h_ReconstructBmassOffResonance->Write("",TObject::kWriteDelete);
  1662. h_KstarMass->Write("",TObject::kWriteDelete);
  1663. h_KstarMasscut->Write("",TObject::kWriteDelete);
  1664. h_KstarMass2D->Write("",TObject::kWriteDelete);
  1665. h_BplusMass_B02KsmumuMass->Write("",TObject::kWriteDelete);
  1666. h_KshortDaughters->Write("",TObject::kWriteDelete);
  1667. h_Jpsi_Spectrum_MisIDed_Muon->Write("",TObject::kWriteDelete);
  1668. h_Jpsi_Spectrum_ResonantVeto_MisIDed_Muon->Write("",TObject::kWriteDelete);
  1669. h_Q2_Spectrum_MisIDed_Muon->Write("",TObject::kWriteDelete);
  1670. h_BplusM_vs_BplusM_DoubleMisIDed->Write("",TObject::kWriteDelete);
  1671. h_BplusM_vs_JpsiM_DoubleMisIDed->Write("",TObject::kWriteDelete);
  1672. h_KstarM_vs_JpsiM_DoubleMisIDed->Write("",TObject::kWriteDelete);
  1673. h_pi0_merged_candidates_M->Write("",TObject::kWriteDelete);
  1674. h_pi0_resolved_candidates_M->Write("",TObject::kWriteDelete);
  1675. h_pi0_merged_candidates_pT->Write("",TObject::kWriteDelete);
  1676. h_pi0_resolved_candidates_pT->Write("",TObject::kWriteDelete);
  1677. h_KGammaGammaMuMu_mass_before_preselection->Write("",TObject::kWriteDelete);
  1678. h_KGammaGammaMuMu_mass_after_preselection->Write("",TObject::kWriteDelete);
  1679. h_KPiMuMu_KGammaGammaMuMu_mass->Write("",TObject::kWriteDelete);
  1680. h_pi0Mass2D->Write("",TObject::kWriteDelete);
  1681. h_diMuonReconstructedBMass2D->Write("",TObject::kWriteDelete);
  1682. h_diMuonReconstructedBMass2DFixPiZero->Write("",TObject::kWriteDelete);
  1683. h_BplusMass_DiMuonMass->Write("",TObject::kWriteDelete);
  1684. h_BplusMass_DiMuonMassDD->Write("",TObject::kWriteDelete);
  1685. h_BplusMass_DiMuonMassLL->Write("",TObject::kWriteDelete);
  1686. h_BplusMass_DiMuonMassRaw->Write("",TObject::kWriteDelete);
  1687. h_BplusMass_DiMuonMassRawDD->Write("",TObject::kWriteDelete);
  1688. h_BplusMass_DiMuonMassRawLL->Write("",TObject::kWriteDelete);
  1689. h_BeforePIDcuts_ctl->Write("",TObject::kWriteDelete);
  1690. h_BeforePIDcuts_ctk->Write("",TObject::kWriteDelete);
  1691. h_BeforePIDcuts_phi->Write("",TObject::kWriteDelete);
  1692. h_AfterPIDcuts_ctl->Write("",TObject::kWriteDelete);
  1693. h_AfterPIDcuts_ctk->Write("",TObject::kWriteDelete);
  1694. h_AfterPIDcuts_phi->Write("",TObject::kWriteDelete);
  1695. histos->Close();
  1696. coutInfo("All done for " + year + " " + magnet + string(MC ? (PHSP ? " (PHSP)" : (ReferenceChannel ? " (RefMC) " : " (MC)") ) : "") + "!");
  1697. delete output;
  1698. delete histos;
  1699. //Add TM branches for TMVA running
  1700. if(!MC) copyDataForTMVA(year,magnet);
  1701. return 1;
  1702. }
  1703. //run multiple or all functions:
  1704. int runAllYearsAndMagPol(bool MC = false, bool ReferenceChannel = false, bool PHSP = false, bool B0 = false, bool K1 = false, bool Inc = false, Int_t Run = 1){
  1705. std::vector<string> years = yearsVector(MC,ReferenceChannel,PHSP,Run);
  1706. string Magnets[] = {"down", "up"};
  1707. for(unsigned int y = 0; y < years.size(); y++){ //loop over all years
  1708. for(string & magnet : Magnets){ //loop over both magnet polaritys
  1709. if(preSelection(years.at(y), magnet, MC, ReferenceChannel, PHSP, B0, K1, Inc) == 0){
  1710. coutERROR("Failed for " + years.at(y) + " " + magnet);
  1711. return 0;
  1712. }
  1713. }
  1714. }
  1715. return 1;
  1716. }
  1717. //signal channels
  1718. int runAllSignalData(Int_t Run = 1){
  1719. if(runAllYearsAndMagPol(false, false, false, false, false, false, Run) == 0){
  1720. coutERROR("Failed for signal data sample of decay " + TheDecay + "!");
  1721. return 0;
  1722. }
  1723. coutInfo("All signal data for decay " + TheDecay + " successfully processed!!");
  1724. return 1;
  1725. }
  1726. int runAllSignalMC(Int_t Run = 1){
  1727. if(runAllYearsAndMagPol(true, false, false, false, false, false, Run) == 0){
  1728. coutERROR("Failed for signal MC sample of decay " + TheDecay + "!");
  1729. return 0;
  1730. }
  1731. coutInfo("All signal MC for decay " + TheDecay + " successfully processed!!");
  1732. return 1;
  1733. }
  1734. //reference MC channels
  1735. int runAllRefMC(Int_t Run = 1){
  1736. if(runAllYearsAndMagPol(true, true, false, false, false, false, Run) == 0){
  1737. coutERROR("Failed for reference MC sample of decay " + TheDecay + "!");
  1738. return 0;
  1739. }
  1740. coutInfo("All reference MC for decay " + TheDecay + " successfully processed!!");
  1741. return 1;
  1742. }
  1743. //reference MC channels
  1744. int runAllPHSPMC(Int_t Run = 1){
  1745. if(runAllYearsAndMagPol(true, false, true, false, false, false, Run) == 0){
  1746. coutERROR("Failed for PSHP MC sample of decay " + TheDecay + "!" );
  1747. return 0;
  1748. }
  1749. coutInfo("All PHSP MC for decay " + TheDecay +" successfully processed!!" );
  1750. return 1;
  1751. }
  1752. //B0toKst MC channels
  1753. int runAllB0MC(Int_t Run = 1, bool ReferenceChannel = false){
  1754. //BtoXMuMu not available at the moment, set ReferenceChannel to true
  1755. if(runAllYearsAndMagPol(true, ReferenceChannel, false, true, false, false, Run) == 0){
  1756. coutERROR("Failed for inclusive MC sample of decay " + TheDecay + "!" );
  1757. // return 0;
  1758. }
  1759. coutInfo("All inclusive MC for decay " + TheDecay +" successfully processed!!" );
  1760. return 1;
  1761. }
  1762. //BtoK1mumu MC channels
  1763. int runAllK1MC(bool ReferenceChannel = false){
  1764. if(preSelection("2012" , "down", true, ReferenceChannel, false, false, true, false) == 0){
  1765. coutERROR("Failed for K1 MC sample of decay " + TheDecay + "!" );
  1766. return 0; // Easier than specifying only 2012 available
  1767. }
  1768. if(preSelection("2012" , "up", true, ReferenceChannel, false, false, true, false) == 0){
  1769. coutERROR("Failed for K1 MC sample of decay " + TheDecay + "!" );
  1770. return 0; // Easier than specifying only 2012 available
  1771. }
  1772. coutInfo("All K1 MC for decay " + TheDecay +" successfully processed!!" );
  1773. return 1;
  1774. }
  1775. //Inclusive MC channels
  1776. int runAllIncMC(Int_t Run = 1){
  1777. //BtoXMuMu not available at the moment, set ReferenceChannel to true
  1778. bool ReferenceChannel = true;
  1779. string Magnets[] = {"down", "up"};
  1780. for(auto yr: yearsInc(Run)){ //loop over all years
  1781. for(string & magnet : Magnets){ //loop over both magnet polaritys
  1782. if(preSelection(yr, magnet, true, ReferenceChannel, false, false, false, true) == 0){
  1783. coutERROR("Failed for " + yr + " " + magnet);
  1784. return 0;
  1785. }
  1786. }
  1787. }
  1788. coutInfo("All inclusive MC for decay " + TheDecay +" successfully processed!!" );
  1789. return 1;
  1790. }
  1791. //All background MC channels
  1792. int runAllBkgMC(){
  1793. runAllB0MC(1,0);
  1794. runAllB0MC(1,1);
  1795. runAllB0MC(2,0);
  1796. runAllB0MC(2,1);
  1797. runAllK1MC(0); //only 2012 available
  1798. runAllK1MC(1); //only 2012 available
  1799. runAllIncMC(12);
  1800. coutInfo("All inclusive MC for decay " + TheDecay +" successfully processed!!" );
  1801. return 1;
  1802. }
  1803. int getTCKs(string year = "2011", string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false) {
  1804. gStyle -> SetOptStat(0);
  1805. LHCbStyle();
  1806. gROOT->SetBatch(kTRUE);
  1807. TChain* tree = nullptr;
  1808. if(ReferenceChannel)MC = true;
  1809. if(PHSP)MC = true;
  1810. if(ReferenceChannel && PHSP){
  1811. coutWarning("Cannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!");
  1812. PHSP = false;
  1813. }
  1814. //Kst2Kpluspi0Resolved case
  1815. if(Kst2Kpluspi0Resolved){
  1816. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  1817. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1818. }
  1819. //Kst2Kpluspi0Merged case
  1820. if(Kst2Kpluspi0Merged){
  1821. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  1822. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1823. }
  1824. //Kst2Kspiplus case
  1825. if(Kst2Kspiplus){
  1826. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  1827. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1828. }
  1829. if(tree == nullptr){
  1830. coutERROR("No files found!");
  1831. return 0;
  1832. }
  1833. int N = tree->GetEntries();
  1834. if(N == 0)coutERROR("No events found in file!");
  1835. else coutInfo("Old files contain " + to_string(N)+ " events");
  1836. //Disable all branches
  1837. tree->SetBranchStatus("*",0);
  1838. //activate needed branch
  1839. UInt_t HLT1TCK;
  1840. tree->SetBranchStatus("HLT1TCK",1);
  1841. tree->SetBranchAddress("HLT1TCK", &HLT1TCK);
  1842. coutInfo("Get Min and Max from HLT1TCK branch");
  1843. Double_t HLT1TCKMin = tree->GetMinimum("HLT1TCK");
  1844. Double_t HLT1TCKMax = tree->GetMaximum("HLT1TCK");
  1845. UInt_t runNumber;
  1846. tree->SetBranchStatus("runNumber",1);
  1847. tree->SetBranchAddress("runNumber", &runNumber);
  1848. coutInfo("Get Min and Max from runNumber branch");
  1849. Double_t runNumberMin = tree->GetMinimum("runNumber");
  1850. Double_t runNumberMax = tree->GetMaximum("runNumber");
  1851. TCanvas * cRunNumberTCKs = new TCanvas("RunNumberTCKs", "RunNumberTCKs");
  1852. cRunNumberTCKs->cd();
  1853. TH2D * hRunNumberTCK = new TH2D(Form("%s_RunNumber_vs_TCKs_used_%s%s", TheDecay.c_str(), year.c_str(), magnet.c_str()),Form("%s: RunNumber vs. TCKs used in %s%s", TheDecay.c_str(), year.c_str(), magnet.c_str()), 100, runNumberMin, runNumberMax, 100, HLT1TCKMin, HLT1TCKMax);
  1854. //vector to count total number of each TCK. Index 0 is the sum of all TCKs, so should be equal to number of events
  1855. std::vector<Int_t>TCKcounts;
  1856. std::vector<UInt_t>FoundTCKs;
  1857. coutInfo("Start loop over " + to_string(N) + " events!");
  1858. //Fill in the first entry
  1859. tree->GetEntry(0);
  1860. hRunNumberTCK->Fill(runNumber, HLT1TCK);
  1861. FoundTCKs.push_back(HLT1TCK);
  1862. TCKcounts.push_back(1);
  1863. //Check for different TCKs in a loop
  1864. for(int ev = 1; ev < N; ev++){
  1865. tree->GetEntry(ev);
  1866. hRunNumberTCK->Fill(runNumber, HLT1TCK);
  1867. if(ev%100000 == 0)std::cout << Form("[COUNTER]\t\t %i / %i", ev, N) << std::endl;
  1868. unsigned int TCKindex = 0;
  1869. //If the TCK is different to all previous TCKs, fill it into FoundTCKs
  1870. while(FoundTCKs.at(TCKindex) != HLT1TCK){
  1871. TCKindex++;
  1872. if(FoundTCKs.size() == TCKindex){
  1873. FoundTCKs.push_back(HLT1TCK);
  1874. TCKcounts.push_back(0);
  1875. TCKindex--;
  1876. break;
  1877. }
  1878. }
  1879. //Add count to a given TCK
  1880. TCKcounts.at(TCKindex)++;
  1881. }
  1882. if(TCKcounts.size() != FoundTCKs.size()){
  1883. coutERROR("Number of found TCKs and number of counters is not equal! Exit program...");
  1884. return 0;
  1885. }
  1886. unsigned int i = 1;//, j = 0;
  1887. Int_t TmpTCKcount, TmpFoundTCK;
  1888. // order TCKs in order (says David)
  1889. while(i < TCKcounts.size()){
  1890. unsigned int j = i;
  1891. while(FoundTCKs.at(j) < FoundTCKs.at(j - 1)){
  1892. TmpFoundTCK = FoundTCKs.at(j);
  1893. FoundTCKs.at(j) = FoundTCKs.at(j - 1);
  1894. FoundTCKs.at(j - 1) = TmpFoundTCK;
  1895. TmpTCKcount = TCKcounts.at(j);
  1896. TCKcounts.at(j) = TCKcounts.at(j - 1);
  1897. TCKcounts.at(j - 1) = TmpTCKcount;
  1898. j--;
  1899. if(j ==0)break;
  1900. }
  1901. i++;
  1902. }
  1903. bool print_latex = true;
  1904. if(print_latex)
  1905. std::cout << year << " " << magnet;
  1906. else{
  1907. coutInfo("Number of events of each used TCKs in " + year + " " + magnet +":");
  1908. std::cout << "[INFO]" << std::endl;
  1909. coutInfo("TCK\tEvtCounter\tPercentage");
  1910. std::cout << "[INFO]" << std::endl;
  1911. }
  1912. for(unsigned int index = 0; index < TCKcounts.size(); index++){
  1913. //std::cout << Form("[INFO]\t\t%d \t\t%d\t\t%.2f", FoundTCKs.at(index), TCKcounts.at(index), 100./N*TCKcounts.at(index)) << std::endl;
  1914. if(print_latex)
  1915. std::cout << "\t&" << hex << FoundTCKs.at(index) << "\t&" << dec << TCKcounts.at(index) << "\t&" << std::setprecision(2) << std::fixed << 100./N*TCKcounts.at(index) << "\\\\" << std::endl;
  1916. else
  1917. std::cout << "[INFO]" << hex << FoundTCKs.at(index) << "\t" << dec << TCKcounts.at(index) << "\t" << 100./N*TCKcounts.at(index) << std::endl;
  1918. }
  1919. std::cout << "[INFO]" << std::endl;
  1920. TCanvas * cTCKs = new TCanvas("TCKs", "TCKs");
  1921. TH1D * hTCKs = new TH1D(Form("%s_TCKs_used_%s%s", TheDecay.c_str(), year.c_str(), magnet.c_str()),Form("%s: TCKs used in %s%s", TheDecay.c_str(), year.c_str(), magnet.c_str()), TCKcounts.size(), 0, TCKcounts.size());
  1922. //Label TCK bins with TCK
  1923. for(unsigned bin = 0; bin < TCKcounts.size(); bin++){
  1924. for(int counts = 0; counts < TCKcounts.at(bin); counts++){
  1925. hTCKs->Fill(bin);
  1926. }
  1927. hTCKs->GetXaxis()->SetBinLabel(bin + 1, Form("%x", FoundTCKs.at(bin)));
  1928. //hTCKs->GetXaxis()->ChangeLabel(bin + 1, 45., -1., -1, -1, -1, Form("%i", FoundTCKs.at(bin)));
  1929. }
  1930. //Save the TCK histograms
  1931. gStyle->SetOptStat(0);
  1932. string suffix = "";
  1933. if(MC){
  1934. if(PHSP)suffix.append("_PHSP");
  1935. else if(ReferenceChannel)suffix.append("_Ref");
  1936. else suffix.append("_MC");
  1937. }
  1938. cTCKs->cd();
  1939. hTCKs->GetXaxis()->SetTitle("TCKid");
  1940. hTCKs->GetYaxis()->SetTitle("Events / TCK");
  1941. hTCKs->SetMarkerStyle(kFullCircle);
  1942. hTCKs->Draw("PE");
  1943. cTCKs->SaveAs(Form("%s/TCKinfo/TCKs%s%s%s%s.eps",thePath.c_str(),TheDecay.c_str(),year.c_str(),magnet.c_str(),suffix.c_str()));
  1944. cTCKs->SaveAs(Form("%s/TCKinfo/TCKs%s%s%s%s.root",thePath.c_str(),TheDecay.c_str(),year.c_str(),magnet.c_str(),suffix.c_str()));
  1945. cRunNumberTCKs->cd();
  1946. hRunNumberTCK->GetYaxis()->SetTitle("TCKid");
  1947. hRunNumberTCK->GetXaxis()->SetTitle("RunNumber");
  1948. hRunNumberTCK->Draw("COLZ");
  1949. cRunNumberTCKs->SaveAs(Form("%s/TCKinfo/RunNumberTCKs%s%s%s%s.eps",thePath.c_str(),TheDecay.c_str(),year.c_str(),magnet.c_str(),suffix.c_str()));
  1950. cRunNumberTCKs->SaveAs(Form("%s/TCKinfo/RunNumberTCKs%s%s%s%s.root",thePath.c_str(),TheDecay.c_str(),year.c_str(),magnet.c_str(),suffix.c_str()));
  1951. return 1;
  1952. }
  1953. int ExclusiveTriggerLineSelection(string year = "2011", string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false) {
  1954. gStyle -> SetOptStat(0);
  1955. LHCbStyle();
  1956. gROOT->SetBatch(kTRUE);
  1957. TChain* tree = nullptr;
  1958. if(ReferenceChannel)MC = true;
  1959. if(PHSP)MC = true;
  1960. if(ReferenceChannel && PHSP){
  1961. coutWarning("Cannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!");
  1962. PHSP = false;
  1963. }
  1964. //Kst2Kpluspi0Resolved case
  1965. if(Kst2Kpluspi0Resolved){
  1966. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  1967. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1968. }
  1969. //Kst2Kpluspi0Merged case
  1970. if(Kst2Kpluspi0Merged){
  1971. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  1972. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1973. }
  1974. //Kst2Kspiplus case
  1975. if(Kst2Kspiplus){
  1976. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  1977. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  1978. }
  1979. if(tree == nullptr){
  1980. coutERROR("No files found!");
  1981. return 0;
  1982. }
  1983. int N = tree->GetEntries();
  1984. if(N == 0)coutERROR("No events found in file!");
  1985. else coutInfo("Old files contain " + to_string(N)+ " events");
  1986. //Disable all branches
  1987. tree->SetBranchStatus("*",0);
  1988. //activate needed branch
  1989. //L0
  1990. Bool_t B_plus_L0MuonDecision_TOS = false;
  1991. //HLT1
  1992. Bool_t B_plus_Hlt1TrackAllL0Decision_TOS = false;
  1993. Bool_t B_plus_Hlt1TrackMuonDecision_TOS = false;
  1994. //HLT2
  1995. Bool_t B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS = false;
  1996. Bool_t B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS = false;
  1997. Bool_t B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS = false;
  1998. Bool_t B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS = false;
  1999. Bool_t B_plus_Hlt2Topo2BodyBBDTDecision_TOS = false;
  2000. Bool_t B_plus_Hlt2Topo3BodyBBDTDecision_TOS = false;
  2001. Bool_t B_plus_Hlt2SingleMuonDecision_TOS = false;
  2002. Bool_t B_plus_Hlt2DiMuonDetachedDecision_TOS = false;
  2003. tree -> SetBranchAddress( "B_plus_L0MuonDecision_TOS" , &B_plus_L0MuonDecision_TOS );
  2004. if(year == "2011" || year == "2012"){
  2005. tree -> SetBranchAddress( "B_plus_Hlt1TrackAllL0Decision_TOS" , &B_plus_Hlt1TrackAllL0Decision_TOS );
  2006. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS" , &B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS );
  2007. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS" , &B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS );
  2008. tree -> SetBranchAddress( "B_plus_Hlt2Topo2BodyBBDTDecision_TOS" , &B_plus_Hlt2Topo2BodyBBDTDecision_TOS );
  2009. tree -> SetBranchAddress( "B_plus_Hlt2Topo3BodyBBDTDecision_TOS" , &B_plus_Hlt2Topo3BodyBBDTDecision_TOS );
  2010. }
  2011. else if(year == "2015" || year == "2016" || year == "2017" || year == "2018"){
  2012. tree -> SetBranchAddress( "B_plus_Hlt1TrackMVADecision_TOS" , &B_plus_Hlt1TrackAllL0Decision_TOS );
  2013. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu2BodyDecision_TOS" , &B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS );
  2014. tree -> SetBranchAddress( "B_plus_Hlt2TopoMu3BodyDecision_TOS" , &B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS );
  2015. tree -> SetBranchAddress( "B_plus_Hlt2Topo2BodyDecision_TOS" , &B_plus_Hlt2Topo2BodyBBDTDecision_TOS );
  2016. tree -> SetBranchAddress( "B_plus_Hlt2Topo3BodyDecision_TOS" , &B_plus_Hlt2Topo3BodyBBDTDecision_TOS );
  2017. if(year == "2016" || year == "2017" || year == "2018"){ //found to be FALSE for all 2015 data
  2018. tree -> SetBranchAddress( "B_plus_Hlt2TopoMuMu2BodyDecision_TOS" , &B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS );
  2019. tree -> SetBranchAddress( "B_plus_Hlt2TopoMuMu3BodyDecision_TOS" , &B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS );
  2020. }
  2021. }
  2022. else{
  2023. coutERROR("Incorrect year given for the assosiation of HLT1 lines with branches! Year given: " + year);
  2024. return 0;
  2025. }
  2026. tree -> SetBranchAddress( "B_plus_Hlt1TrackMuonDecision_TOS" , &B_plus_Hlt1TrackMuonDecision_TOS );
  2027. tree -> SetBranchAddress( "B_plus_Hlt2SingleMuonDecision_TOS" , &B_plus_Hlt2SingleMuonDecision_TOS );
  2028. tree -> SetBranchAddress( "B_plus_Hlt2DiMuonDetachedDecision_TOS" , &B_plus_Hlt2DiMuonDetachedDecision_TOS );
  2029. //count exclusive trigger decisions:
  2030. Int_t ex_Hlt1TrackAllL0 = 0,
  2031. ex_Hlt1TrackMuon = 0;
  2032. Int_t ex_Hlt2SingleMuon = 0,
  2033. ex_Hlt2DiMuonDetached = 0,
  2034. ex_Hlt2TopoMu2Body = 0,
  2035. ex_Hlt2TopoMu3Body = 0,
  2036. ex_Hlt2Topo2Body = 0,
  2037. ex_Hlt2Topo3Body = 0,
  2038. ex_Hlt2TopoMuMu2Body = 0,
  2039. ex_Hlt2TopoMuMu3Body = 0;
  2040. coutInfo("Start loop over " +to_string(N)+ " events!");
  2041. for(int ev = 0; ev < N; ev++){
  2042. tree->GetEntry(ev);
  2043. if(ev%100000 == 0)std::cout << Form("[COUNTER]\t\t %i / %i", ev, N) << std::endl;
  2044. //HLT1
  2045. if(B_plus_Hlt1TrackAllL0Decision_TOS && !B_plus_Hlt1TrackMuonDecision_TOS)
  2046. ex_Hlt1TrackAllL0++;
  2047. if(!B_plus_Hlt1TrackAllL0Decision_TOS && B_plus_Hlt1TrackMuonDecision_TOS)
  2048. ex_Hlt1TrackMuon++;
  2049. //HLT2
  2050. if(B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2051. ex_Hlt2SingleMuon++;
  2052. else if(!B_plus_Hlt2SingleMuonDecision_TOS && B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2053. ex_Hlt2DiMuonDetached++;
  2054. else if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2055. ex_Hlt2TopoMu2Body++;
  2056. else if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2057. ex_Hlt2TopoMu3Body++;
  2058. else if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2059. ex_Hlt2Topo2Body++;
  2060. else if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2061. ex_Hlt2Topo3Body++;
  2062. else if(year == "2016" || year == "2017" || year == "2018"){
  2063. if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2064. ex_Hlt2TopoMuMu2Body++;
  2065. else if(!B_plus_Hlt2SingleMuonDecision_TOS && !B_plus_Hlt2DiMuonDetachedDecision_TOS && !B_plus_Hlt2TopoMu2BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMu3BodyBBDTDecision_TOS && !B_plus_Hlt2Topo2BodyBBDTDecision_TOS && !B_plus_Hlt2Topo3BodyBBDTDecision_TOS && !B_plus_Hlt2TopoMuMu2BodyBBDTDecision_TOS && B_plus_Hlt2TopoMuMu3BodyBBDTDecision_TOS)
  2066. ex_Hlt2TopoMuMu3Body++;
  2067. }
  2068. }
  2069. bool print_latex = true;
  2070. std::cout << std::endl;
  2071. std::cout << year << " " << magnet << ":" << std::endl;
  2072. std::cout << "Trigger line\texclusive events\tpercentage" << std::endl;
  2073. std::cout << "HLT1" << std::endl;
  2074. std::cout << "Hlt1TrackAllL0\t\t" << (print_latex ? " &" : "") << ex_Hlt1TrackAllL0 << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt1TrackAllL0 / N << std::endl;
  2075. std::cout << "Hlt1TrackMuon\t\t" << (print_latex ? " &" : "") << ex_Hlt1TrackMuon << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt1TrackMuon / N << std::endl;
  2076. std::cout << "HLT2" << std::endl;
  2077. std::cout << "Hlt2SingleMuon\t\t" << (print_latex ? " &" : "") << ex_Hlt2SingleMuon << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2SingleMuon / N << std::endl;
  2078. std::cout << "Hlt2DiMuonDetached\t" << (print_latex ? " &" : "") << ex_Hlt2DiMuonDetached << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2DiMuonDetached / N << std::endl;
  2079. std::cout << "Hlt2TopoMu2Body\t\t" << (print_latex ? " &" : "") << ex_Hlt2TopoMu2Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2TopoMu2Body / N << std::endl;
  2080. std::cout << "Hlt2TopoMu3Body\t\t" << (print_latex ? " &" : "") << ex_Hlt2TopoMu3Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2TopoMu3Body / N << std::endl;
  2081. std::cout << "Hlt2Topo2Body\t\t" << (print_latex ? " &" : "") << ex_Hlt2Topo2Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2Topo2Body / N << std::endl;
  2082. std::cout << "Hlt2Topo3Body\t\t" << (print_latex ? " &" : "") << ex_Hlt2Topo3Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2Topo3Body / N << std::endl;
  2083. std::cout << "Hlt2TopoMuMu2Body\t" << (print_latex ? " &" : "") << ex_Hlt2TopoMuMu2Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2TopoMuMu2Body / N << std::endl;
  2084. std::cout << "Hlt2TopoMuMu3Body\t" << (print_latex ? " &" : "") << ex_Hlt2TopoMuMu3Body << "\t" << (print_latex ? " &" : "") << 100.0 * ex_Hlt2TopoMuMu3Body / N << std::endl;
  2085. return 1;
  2086. }
  2087. Int_t plotHistos(string year = "2011", string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false){
  2088. //Reference channel and PHSP are both MC data
  2089. if(ReferenceChannel)MC = true;
  2090. if(PHSP)MC = true;
  2091. if(ReferenceChannel && PHSP){
  2092. coutWarning("Cannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!");
  2093. PHSP = false;
  2094. }
  2095. gStyle -> SetOptStat(0);
  2096. LHCbStyle();
  2097. TFile * histos = nullptr;
  2098. if(Kst2Kpluspi0Resolved){
  2099. if(!MC)histos = new TFile(Form("%s/data/%s%s/%s%s_pi0Resolved_histos.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2100. else{
  2101. if(ReferenceChannel)histos = new TFile(Form("%s/data/MC/RefKplusPi0Resolved/%s%s/%s%s_pi0Resolved_histos.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2102. else if(PHSP)histos = new TFile(Form("%s/data/PHSP/KplusPi0Resolved/%s%s/%s%s_pi0Resolved_histos.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2103. else histos = new TFile(Form("%s/data/MC/KplusPi0Resolved/%s%s/%s%s_pi0Resolved_histos.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2104. }
  2105. }
  2106. if(Kst2Kspiplus){
  2107. if(!MC)histos = new TFile(Form("%s/data/%s%s/%s%s_piplus_histos.root",path_to_output_KshortPiplus.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2108. else{
  2109. if(ReferenceChannel)histos = new TFile(Form("%s/data/MC/RefKshortPiplus/%s%s/%s%s_piplus_histos.root",path_to_output_KshortPiplus.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2110. else if(PHSP)histos = new TFile(Form("%s/data/PHSP/KshortPiplus/%s%s/%s%s_piplus_histos.root",path_to_output_KshortPiplus.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2111. else histos = new TFile(Form("%s/data/MC/KshortPiplus/%s%s/%s%s_piplus_histos.root",path_to_output_KshortPiplus.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str()),"OPEN");
  2112. }
  2113. }
  2114. if(histos == nullptr){
  2115. coutERROR("File with histograms not found or opened! Exit...");
  2116. return 0;
  2117. }
  2118. TCanvas * c1 = new TCanvas("c1", "c1");
  2119. c1->cd();
  2120. TH2D * h_KstarM_vs_JpsiM_DoubleMisIDed = nullptr;
  2121. h_KstarM_vs_JpsiM_DoubleMisIDed = (TH2D * ) histos->Get("h_KstarM_vs_JpsiM_DoubleMisIDed");
  2122. if(h_KstarM_vs_JpsiM_DoubleMisIDed == nullptr){
  2123. coutERROR("Histogram 'h_KstarM_vs_JpsiM_DoubleMisIDed' not found file! Exit...");
  2124. return 0;
  2125. }
  2126. h_KstarM_vs_JpsiM_DoubleMisIDed->GetXaxis()->SetTitle((UseDTF ? "m([#mu^{+}]_{#pi^{+}}K_{S}^{0})" : "m([#mu^{+}]_{#pi^{+}}#pi^{-}#pi^{+})"));
  2127. h_KstarM_vs_JpsiM_DoubleMisIDed->GetYaxis()->SetTitle("m([#pi^{+}]_{#mu^{+}}#mu^{-})");
  2128. h_KstarM_vs_JpsiM_DoubleMisIDed->Draw("COLZ");
  2129. //insert veto-region as overlay:
  2130. Float_t xLow = PDGMASS.K_STAR_PLUS - 30.;
  2131. Float_t xHigh = PDGMASS.K_STAR_PLUS + 30.;
  2132. Float_t yLow = PDGMASS.J_PSI - 50.;
  2133. Float_t yHigh = PDGMASS.J_PSI + 50.;
  2134. TGraphErrors * box = new TGraphErrors();
  2135. box->SetPoint(0, PDGMASS.K_STAR_PLUS, PDGMASS.J_PSI);
  2136. box->SetPointError(0, 30., 50.);
  2137. box->SetFillColor(kRed);
  2138. box->SetFillStyle(3445);
  2139. box->Draw("2SAME");
  2140. TLine * boxframe[4];
  2141. boxframe[0] = new TLine(xLow, yLow, xHigh, yLow);
  2142. boxframe[1] = new TLine(xHigh, yLow, xHigh, yHigh);
  2143. boxframe[2] = new TLine(xHigh, yHigh, xLow, yHigh);
  2144. boxframe[3] = new TLine(xLow, yHigh, xLow, yLow);
  2145. for(int i = 0; i < 4; i++){
  2146. boxframe[i]->SetLineWidth(2);
  2147. boxframe[i]->SetLineColor(kRed);
  2148. boxframe[i]->Draw("SAME");
  2149. }
  2150. c1->Print(Form("%s/PreSelectionPlots/%s_%s%s%s%s%s_DoubleMisID_2Dplot.eps",
  2151. thePath.c_str(),
  2152. TheDecay.c_str(),
  2153. year.c_str(),
  2154. magnet.c_str(),
  2155. (MC ? "_MC" : ""),
  2156. (ReferenceChannel ? "_Ref" : ""),
  2157. (PHSP ? "_PHSP" : "")));
  2158. TCanvas * c2 = new TCanvas("c2", "c2");
  2159. c2->cd();
  2160. TH1D * h_BplusMass_B02KsmumuMass = nullptr;
  2161. h_BplusMass_B02KsmumuMass = (TH1D * ) histos->Get("h_BplusMass_B02KsmumuMass");
  2162. if(h_BplusMass_B02KsmumuMass == nullptr){
  2163. coutERROR("Histogram 'h_BplusMass_B02KsmumuMass' not found file! Exit...");
  2164. return 0;
  2165. }
  2166. h_BplusMass_B02KsmumuMass->GetXaxis()->SetTitle((UseDTF ? "m(K_{S}^{0}#mu^{+}#mu^{-})" : "m(#pi^{-}#pi^{+}#mu^{+}#mu^{-})"));
  2167. h_BplusMass_B02KsmumuMass->GetYaxis()->SetTitle("candidates / 20MeV");
  2168. Float_t MaxContent = -1.;
  2169. for(int b = 1; b <= h_BplusMass_B02KsmumuMass->GetXaxis()->GetNbins(); b++){
  2170. if(h_BplusMass_B02KsmumuMass->GetBinContent(b) > MaxContent)MaxContent = h_BplusMass_B02KsmumuMass->GetBinContent(b);
  2171. }
  2172. h_BplusMass_B02KsmumuMass->GetYaxis()->SetRangeUser(0, MaxContent * 1.2);
  2173. h_BplusMass_B02KsmumuMass->Draw();
  2174. TGraphErrors * box2 = new TGraphErrors();
  2175. box2->SetPoint(0, PDGMASS.B_ZERO, MaxContent * 0.6);
  2176. box2->SetPointError(0, 50., MaxContent * 0.6);
  2177. box2->SetFillColor(kRed);
  2178. box2->SetFillStyle(3445);
  2179. box2->Draw("2SAME");
  2180. TLine * vetoframe[2];
  2181. vetoframe[0] = new TLine(PDGMASS.B_ZERO - 50., 0., PDGMASS.B_ZERO - 50., MaxContent * 1.2);
  2182. vetoframe[1] = new TLine(PDGMASS.B_ZERO + 50., 0., PDGMASS.B_ZERO + 50., MaxContent * 1.2);
  2183. for(int i = 0; i < 2; i++){
  2184. vetoframe[i]->SetLineWidth(2);
  2185. vetoframe[i]->SetLineColor(kRed);
  2186. vetoframe[i]->Draw("SAME");
  2187. }
  2188. c2->Print(Form("%s/PreSelectionPlots/%s_%s%s%s%s%s_B0plusRandomPion.eps",
  2189. thePath.c_str(),
  2190. TheDecay.c_str(),
  2191. year.c_str(),
  2192. magnet.c_str(),
  2193. (MC ? "_MC" : ""),
  2194. (ReferenceChannel ? "_Ref" : ""),
  2195. (PHSP ? "_PHSP" : "")));
  2196. return 1;
  2197. }
  2198. void compare_PIDgen_Eventnumbers(int year = 2011, string magnet = "down"){
  2199. string subDecay = Kst2Kspiplus ? "KshortPiplus" : "KplusPi0Resolved";
  2200. TChain * treePIDgen, * tree;
  2201. if(Kst2Kspiplus){
  2202. treePIDgen = new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  2203. tree = new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  2204. }
  2205. else{
  2206. treePIDgen = new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  2207. tree = new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  2208. }
  2209. treePIDgen->Add((path_to_data + "/data/PHSP/" + subDecay + "/" + std::to_string(year) + magnet + "/*B2KstmumuPIDgen_*.root").c_str());
  2210. tree ->Add((path_to_data + "/data/PHSP/" + subDecay + "/" + std::to_string(year) + magnet + "/*B2Kstmumu_*.root").c_str());
  2211. std::cout << "------------------------------------" << std::endl;
  2212. std::cout << "----" << year << " " << magnet << "----" << std::endl;
  2213. std::cout << "------------------------------------" << std::endl;
  2214. std::cout << "PIDgen tuple entries=" << treePIDgen->GetEntries() << std::endl;
  2215. std::cout << "Normal tuple entries=" << tree ->GetEntries() << std::endl;
  2216. std::cout << "------------------------------------" << std::endl;
  2217. }