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.

1342 lines
54 KiB

  1. #include "../GlobalFunctions.hh"
  2. #include "../Paths.hpp"
  3. #include <algorithm> //Finding stuff in a vector
  4. //////////////////////////////////////////////////////////////////////
  5. /// sWeightSelection()
  6. /// loops over all .root-files created by BDT selection. More kinematic, PID and
  7. /// some more cuts are applied and saved in new file.
  8. ///
  9. int sWeightSelection(bool useOld = false, std::string year = "2011", std::string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false) {
  10. TFile* input = 0;
  11. TFile* output_new = 0;
  12. TFile* output_old = 0;
  13. TTree *tree;
  14. if (PHSP) MC = true; //phase-space is always MC
  15. string input_path = GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,false);
  16. coutDebug("input_path: " + input_path);
  17. string output_new_path = GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,false);
  18. replace(output_new_path,".root","_tmp.root");
  19. string output_old_path = GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,false);
  20. replace(output_old_path,".root","_old.root");
  21. input = new TFile(input_path.c_str(),"UPDATE");
  22. output_new = new TFile(output_new_path.c_str(),"RECREATE");
  23. output_old = new TFile(output_old_path.c_str(),useOld ? "UPDATE" : "RECREATE");
  24. if (useOld) tree = (TTree*)output_old->Get("DecayTree");
  25. else tree = (TTree*)input->Get("DecayTree");
  26. tree->SetBranchStatus("*",1);
  27. //copy old tree into a backup
  28. output_old->cd();
  29. TTree *cpTree = tree->CloneTree();
  30. if (!cpTree) coutERROR("Tree not cloned!");
  31. else coutDebug("Tree copied!");
  32. cpTree->Write("",TObject::kOverwrite); //copy old trees into a backup; prevent duplicate writting
  33. if (!useOld) output_old->Close();
  34. vector<std::string> Cuts;
  35. // Kst2Kpluspi0Resolved Cuts
  36. if(Kst2Kpluspi0Resolved){
  37. //don't copy old cone variables
  38. tree->SetBranchStatus("*_1.00",0);
  39. tree->SetBranchStatus("*_0.90",0);
  40. tree->SetBranchStatus("*_0.80",0);
  41. tree->SetBranchStatus("*_0.70",0);
  42. tree->SetBranchStatus("*_0.60",0);
  43. tree->SetBranchStatus("*_0.50",0);
  44. Cuts.push_back("K_plus_ProbNNk > 0.25");
  45. //Cuts.push_back("gamma1_PT_DTF < 4000");
  46. //Cuts.push_back("gamma2_PT_DTF < 4000");
  47. //Cuts.push_back("log(1.0-B_plus_DIRA_OWNPV) > -20");
  48. }
  49. // Kst2Kpluspi0Merged cuts
  50. if(Kst2Kpluspi0Merged){
  51. //don't copy old cone variables
  52. tree->SetBranchStatus("*_1.00",0);
  53. tree->SetBranchStatus("*_0.90",0);
  54. tree->SetBranchStatus("*_0.80",0);
  55. tree->SetBranchStatus("*_0.70",0);
  56. tree->SetBranchStatus("*_0.60",0);
  57. tree->SetBranchStatus("*_0.50",0);
  58. //#TODO
  59. }
  60. // Kst2Kspiplus cuts
  61. if(Kst2Kspiplus){
  62. //#TODO
  63. }
  64. std::string AllCuts = "";
  65. if (Cuts.size()==0){
  66. cout << "[ERROR]\t No cuts selected, nothing to do." << endl;
  67. return 0;
  68. }
  69. AllCuts = AllCuts + *Cuts.begin();
  70. cout << "[INFO]\t\t Appling cuts for year " << year << ":" << endl;
  71. cout << "\t\t\t" << AllCuts << endl;
  72. for (vector<std::string>::iterator t = Cuts.begin()+1;
  73. t != Cuts.end();
  74. ++t){
  75. AllCuts = AllCuts + " && " + *t ;
  76. cout << "\t\t\t" << *t << endl;
  77. }
  78. Cuts.clear();
  79. TTree* NewTree = tree->CopyTree( AllCuts.c_str() );
  80. output_new->cd();
  81. NewTree->Write();
  82. input->cd();
  83. NewTree->Write("",TObject::kOverwrite);
  84. if (useOld) output_old->Close();
  85. input->Close();
  86. output_new->Close();
  87. cout << "[INFO]\t\t New tree created." << endl;
  88. return 1;
  89. }
  90. Int_t sWeightSelectionAllData(Int_t Run = 1, bool useOld = false) {
  91. for (auto& year : yearsData(Run)){
  92. if ( sWeightSelection(useOld, year,"down", false, false, false) == 0) return 0;
  93. if ( sWeightSelection(useOld, year, "up", false, false, false) == 0) return 0;
  94. }
  95. return 1;
  96. }
  97. Int_t sWeightSelectionAllMC(Int_t Run = 1, bool useOld = false) {
  98. for (auto& year : yearsMC(false, false, Run)){
  99. if ( sWeightSelection(useOld, year, "down", true, false, false) == 0) return 0;
  100. if ( sWeightSelection(useOld, year, "up", true, false, false) == 0) return 0;
  101. }
  102. return 1;
  103. }
  104. Int_t sWeightSelectionAllPHSP(Int_t Run = 1, bool useOld = false) {
  105. for (auto& year : yearsMC(false, true, Run)){
  106. if ( sWeightSelection(useOld, year, "down", true, false, true) == 0) return 0;
  107. if ( sWeightSelection(useOld, year, "up", true, false, true) == 0) return 0;
  108. }
  109. return 1;
  110. }
  111. Int_t sWeightSelectionAllRefChannel(Int_t Run = 1, bool useOld = false) {
  112. for (auto& year : yearsMC(true,false, Run)){
  113. if ( sWeightSelection(useOld, year, "down", true, true, false) == 0) return 0;
  114. if ( sWeightSelection(useOld, year, "up", true, true, false) == 0) return 0;
  115. }
  116. return 1;
  117. }
  118. Int_t sWeightSelectionAll(Int_t Run = 1, bool useOld = false) {
  119. if (sWeightSelectionAllData(Run,useOld)==0) return 0;
  120. if (sWeightSelectionAllMC(Run,useOld)==0) return 0;
  121. if (sWeightSelectionAllRefChannel(Run,useOld)==0) return 0;
  122. if (sWeightSelectionAllPHSP(Run,useOld)==0) return 0;
  123. return 1;
  124. }
  125. int copyForFit(std::string year = "2011", std::string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false) {
  126. if (PHSP) MC = true; //phase-space is always MC
  127. TChain* tree;
  128. if(Kst2Kpluspi0Resolved){
  129. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  130. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  131. }
  132. //Kst2Kpluspi0Merged case
  133. if(Kst2Kpluspi0Merged){
  134. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  135. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  136. }
  137. //Kst2Kspiplus case
  138. if(Kst2Kspiplus){
  139. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  140. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample).c_str());
  141. }
  142. string output_path = GetInputFile(year,magnet,true,MC,ReferenceChannel,PHSP,false);
  143. replace(output_path,".root","_StripForFit.root");
  144. // cout << output_path << endl;
  145. if(tree->GetEntries() == 0){
  146. //If it complains while running, it's just trying to read also from David's preselected files
  147. std::cout << std::endl << "[ERROR]\t\tNo entries found in TTree from tfile " + GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,smallSample)+". Exit program!" << std::endl;
  148. std::cout << std::endl << "[ERROR]\t\tExit program!" << std::endl;
  149. return 0;
  150. }
  151. TFile *output = new TFile(output_path.c_str(),"RECREATE");
  152. //Get B mass
  153. Double_t B_plus_M;
  154. Double_t B_plus_M_DTF;
  155. Double_t B_plus_MERR_DTF;
  156. Float_t f_B_plus_M_DTF[100];
  157. Float_t f_B_plus_MERR_DTF[100];
  158. tree->SetBranchStatus("*",0);
  159. tree->SetBranchStatus("B_plus_M",1);
  160. tree->SetBranchStatus("B_plus_DTF_M",1);
  161. tree->SetBranchStatus("B_plus_DTF_MERR",1);
  162. tree -> SetBranchAddress( "B_plus_M" , &B_plus_M);
  163. tree -> SetBranchAddress( "B_plus_DTF_M" , &f_B_plus_M_DTF);
  164. tree -> SetBranchAddress( "B_plus_DTF_MERR" , &f_B_plus_MERR_DTF);
  165. //Get Q2
  166. tree->SetBranchStatus("mu_minus_PX",1);
  167. tree->SetBranchStatus("mu_minus_PY",1);
  168. tree->SetBranchStatus("mu_minus_PZ",1);
  169. tree->SetBranchStatus("mu_minus_PE",1);
  170. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_0_PX",1);
  171. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_0_PY",1);
  172. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_0_PZ",1);
  173. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_0_PE",1);
  174. tree->SetBranchStatus("mu_plus_PX",1);
  175. tree->SetBranchStatus("mu_plus_PY",1);
  176. tree->SetBranchStatus("mu_plus_PZ",1);
  177. tree->SetBranchStatus("mu_plus_PE",1);
  178. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_PX",1);
  179. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_PY",1);
  180. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_PZ",1);
  181. tree->SetBranchStatus("B_plus_DTF_J_psi_1S_muminus_PE",1);
  182. if (Kst2Kspiplus)tree->SetBranchStatus("B_plus_DTF_Kst_892_plus_piplus_ID",1);
  183. else tree->SetBranchStatus("B_plus_DTF_Kst_892_plus_Kplus_ID",1);
  184. Double_t mu_minus_PX = 0.;
  185. Double_t mu_minus_PY = 0.;
  186. Double_t mu_minus_PZ = 0.;
  187. Double_t mu_minus_PE = 0.;
  188. Float_t f_mu_minus_PX_DTF[100];
  189. Float_t f_mu_minus_PY_DTF[100];
  190. Float_t f_mu_minus_PZ_DTF[100];
  191. Float_t f_mu_minus_PE_DTF[100];
  192. Double_t mu_minus_PX_DTF = 0.;
  193. Double_t mu_minus_PY_DTF = 0.;
  194. Double_t mu_minus_PZ_DTF = 0.;
  195. Double_t mu_minus_PE_DTF = 0.;
  196. ///mu+
  197. Double_t mu_plus_PX = 0.;
  198. Double_t mu_plus_PY = 0.;
  199. Double_t mu_plus_PZ = 0.;
  200. Double_t mu_plus_PE = 0.;
  201. Float_t f_mu_plus_PX_DTF[100];
  202. Float_t f_mu_plus_PY_DTF[100];
  203. Float_t f_mu_plus_PZ_DTF[100];
  204. Float_t f_mu_plus_PE_DTF[100];
  205. Double_t mu_plus_PX_DTF = 0.;
  206. Double_t mu_plus_PY_DTF = 0.;
  207. Double_t mu_plus_PZ_DTF = 0.;
  208. Double_t mu_plus_PE_DTF = 0.;
  209. tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
  210. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PX" , &f_mu_minus_PX_DTF );
  211. tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
  212. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PY" , &f_mu_minus_PY_DTF );
  213. tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
  214. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PZ" , &f_mu_minus_PZ_DTF );
  215. tree -> SetBranchAddress( "mu_minus_PE" , &mu_minus_PE );
  216. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PE" , &f_mu_minus_PE_DTF );
  217. tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
  218. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PX" , &f_mu_plus_PX_DTF );
  219. tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
  220. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PY" , &f_mu_plus_PY_DTF );
  221. tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
  222. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PZ" , &f_mu_plus_PZ_DTF );
  223. tree -> SetBranchAddress( "mu_plus_PE" , &mu_plus_PE );
  224. tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PE" , &f_mu_plus_PE_DTF );
  225. // Get Bplus charge to assign muplus and muminus correctly
  226. // Not really necessary, but why not
  227. //Not available for nonDTF at the moment!!!
  228. bool IsBplus = true;
  229. Double_t f_K_plus_ID_DTF[100];
  230. Double_t f_pi_plus_ID_DTF[100];
  231. if (Kst2Kspiplus) tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_ID" , &f_pi_plus_ID_DTF );
  232. else tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_Kplus_ID" , &f_K_plus_ID_DTF );
  233. //Define new branches
  234. TTree * NewTree = tree->CloneTree(0);
  235. NewTree->Branch("B_plus_M_DTF", &B_plus_M_DTF, "B_plus_M_DTF/D");
  236. NewTree->Branch("B_plus_MERR_DTF", &B_plus_MERR_DTF, "B_plus_MERR_DTF/D");
  237. unsigned int nDiMuonMassBin = 0;
  238. NewTree->Branch("nDiMuonMassBin", &nDiMuonMassBin, "nDiMuonMassBin/I");
  239. Double_t dQ2;
  240. NewTree->Branch("Q2", &dQ2, "dQ2/D");
  241. unsigned int Is_Phi_JPsi_Psi2S = 0;
  242. NewTree->Branch("Is_Phi_JPsi_Psi2S", &Is_Phi_JPsi_Psi2S, "Is_Phi_JPsi_Psi2S/I");
  243. //Define binning in DiMuon mass^2:
  244. //bin# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
  245. 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
  246. for(int i = 0; i < 19; i++)f_BinBoundaries[i] *= 1e6; //in (MeV/c2)^2
  247. //phi -resonance: bin #2
  248. //jpsi -resonance: bin #9
  249. //psi2s-resonance: bin #12
  250. TLorentzVector LorVec_mu_minus;
  251. TLorentzVector LorVec_mu_plus;
  252. TLorentzVector LorVec_DiMuon;
  253. // Kst2Kpluspi0Resolved Cuts
  254. if(Kst2Kpluspi0Resolved){
  255. //don't copy old cone variables
  256. for (int evt = 0; evt < tree->GetEntries(); evt++){
  257. tree->GetEntry(evt);
  258. bool IsBplus = true;
  259. B_plus_M_DTF = (Double_t) f_B_plus_M_DTF[0];
  260. B_plus_MERR_DTF = (Double_t) f_B_plus_MERR_DTF[0];
  261. if (UseDTF && B_plus_M_DTF<cut_B_plus_M_low) continue;
  262. if (UseDTF && B_plus_M_DTF>cut_B_plus_M_high) continue;
  263. if (!UseDTF && B_plus_M<cut_B_plus_M_low) continue;
  264. if (!UseDTF && B_plus_M>cut_B_plus_M_high) continue;
  265. // --------- Get Q2 bin --------- //
  266. nDiMuonMassBin = 0;
  267. Is_Phi_JPsi_Psi2S = 0;
  268. if(Kst2Kspiplus) IsBplus = f_pi_plus_ID_DTF[0] > 0;
  269. else IsBplus = f_K_plus_ID_DTF[0] > 0;
  270. if(IsBplus){
  271. mu_minus_PX_DTF = (Double_t) f_mu_plus_PX_DTF[0];
  272. mu_minus_PY_DTF = (Double_t) f_mu_plus_PY_DTF[0];
  273. mu_minus_PZ_DTF = (Double_t) f_mu_plus_PZ_DTF[0];
  274. mu_minus_PE_DTF = (Double_t) f_mu_plus_PE_DTF[0];
  275. mu_plus_PX_DTF = (Double_t) f_mu_minus_PX_DTF[0];
  276. mu_plus_PY_DTF = (Double_t) f_mu_minus_PY_DTF[0];
  277. mu_plus_PZ_DTF = (Double_t) f_mu_minus_PZ_DTF[0];
  278. mu_plus_PE_DTF = (Double_t) f_mu_minus_PE_DTF[0];
  279. }
  280. else{
  281. mu_plus_PX_DTF = (Double_t) f_mu_plus_PX_DTF[0];
  282. mu_plus_PY_DTF = (Double_t) f_mu_plus_PY_DTF[0];
  283. mu_plus_PZ_DTF = (Double_t) f_mu_plus_PZ_DTF[0];
  284. mu_plus_PE_DTF = (Double_t) f_mu_plus_PE_DTF[0];
  285. mu_minus_PX_DTF = (Double_t) f_mu_minus_PX_DTF[0];
  286. mu_minus_PY_DTF = (Double_t) f_mu_minus_PY_DTF[0];
  287. mu_minus_PZ_DTF = (Double_t) f_mu_minus_PZ_DTF[0];
  288. mu_minus_PE_DTF = (Double_t) f_mu_minus_PE_DTF[0];
  289. }
  290. if (UseDTF){
  291. if (UsePDGmIn4Dvectors){
  292. LorVec_mu_minus.SetXYZM (mu_minus_PX_DTF, mu_minus_PY_DTF, mu_minus_PZ_DTF, PDGMASS.MU);
  293. LorVec_mu_plus.SetXYZM (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, PDGMASS.MU);
  294. }
  295. else{
  296. LorVec_mu_minus.SetPxPyPzE (mu_minus_PX_DTF, mu_minus_PY_DTF, mu_minus_PZ_DTF, mu_minus_PE_DTF);
  297. LorVec_mu_plus.SetPxPyPzE (mu_plus_PX_DTF, mu_plus_PY_DTF, mu_plus_PZ_DTF, mu_minus_PE_DTF);
  298. }
  299. }
  300. else{
  301. if (UsePDGmIn4Dvectors){
  302. LorVec_mu_minus.SetXYZM (mu_minus_PX, mu_minus_PY, mu_minus_PZ, PDGMASS.MU);
  303. LorVec_mu_plus.SetXYZM (mu_plus_PX, mu_plus_PY, mu_plus_PZ, PDGMASS.MU);
  304. }
  305. else{
  306. LorVec_mu_minus.SetPxPyPzE (mu_minus_PX, mu_minus_PY, mu_minus_PZ, mu_minus_PE);
  307. LorVec_mu_plus.SetPxPyPzE (mu_plus_PX, mu_plus_PY, mu_plus_PZ, mu_plus_PE);
  308. }
  309. }
  310. LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
  311. dQ2 = LorVec_DiMuon.M2();
  312. Is_Phi_JPsi_Psi2S = 0;
  313. //if(dQ2< f_BinBoundaries[0] || dQ2 > f_BinBoundaries[18])continue;
  314. while(dQ2 >= f_BinBoundaries[nDiMuonMassBin]){
  315. nDiMuonMassBin++;
  316. }
  317. if(nDiMuonMassBin == 2 || nDiMuonMassBin == 9 || nDiMuonMassBin == 12){
  318. Is_Phi_JPsi_Psi2S = 1;
  319. }
  320. ///////////////////////////////////////
  321. NewTree->Fill();
  322. }
  323. }
  324. // Kst2Kspiplus cuts
  325. if(Kst2Kspiplus){
  326. //#TODO
  327. }
  328. output->cd();
  329. NewTree->Write("",TObject::kWriteDelete);
  330. output->Close();
  331. cout << "[INFO]\t\t New tree created." << endl;
  332. return 1;
  333. }
  334. int copyForFitAllData(){
  335. for (auto& year : yearsData(12)){
  336. if (copyForFit(year,"down",false,false,false)==0) return 0;
  337. if (copyForFit(year,"up", false,false,false)==0) return 0;
  338. }
  339. return 1;
  340. }
  341. int copyForFitAllSig(){
  342. for (auto& year : yearsMC(false,false,12)){
  343. if (copyForFit(year,"down",true,false,false)==0) return 0;
  344. if (copyForFit(year,"up", true,false,false)==0) return 0;
  345. }
  346. return 1;
  347. }
  348. int copyForFitAllRef(){
  349. for (auto& year : yearsMC(true,false,12)){
  350. if (copyForFit(year,"down",true,true,false)==0) return 0;
  351. if (copyForFit(year,"up", true,true,false)==0) return 0;
  352. }
  353. return 1;
  354. }
  355. int copyForFitAllPHSP(){
  356. for (auto& year : yearsMC(false,true,12)){
  357. if (copyForFit(year,"down",true,false,false)==0) return 0;
  358. if (copyForFit(year,"up", true,false,false)==0) return 0;
  359. }
  360. return 1;
  361. }
  362. int eventType(bool ReferenceChannel = false, bool PHSP = false){
  363. if (ReferenceChannel && PHSP) return 0;
  364. if(Kst2Kspiplus){
  365. if(ReferenceChannel) return 12145102;
  366. else if (PHSP) return 12115179;
  367. else return 12115102;
  368. }
  369. if(Kst2Kpluspi0Resolved){
  370. if(ReferenceChannel) return 12143401;
  371. else if (PHSP) return 12113446;
  372. else return 12113100;
  373. }
  374. return 0;
  375. }
  376. string eventTypeStr(bool ReferenceChannel = false, bool PHSP = false){
  377. if (ReferenceChannel && PHSP) return 0;
  378. if(Kst2Kspiplus){
  379. if(ReferenceChannel) return "12145102";
  380. else if (PHSP) return "12115179";
  381. else return "12115102";
  382. }
  383. if(Kst2Kpluspi0Resolved){
  384. if(ReferenceChannel) return "12143401";
  385. else if (PHSP) return "12113446";
  386. else return "12113100";
  387. }
  388. return 0;
  389. }
  390. int copyForPID(std::string year = "2011", std::string magnet = "down", bool ReferenceChannel = false, bool PHSP = false) {
  391. cout << "[INFO]\t\tCopy tuple for PID checks: " << year << magnet << endl;
  392. TChain* tree = new TChain();
  393. if(Kst2Kpluspi0Resolved){
  394. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  395. tree->Add(GetInputFile(year,magnet,false,true,ReferenceChannel,PHSP,smallSample).c_str());
  396. }
  397. //Kst2Kpluspi0Merged case
  398. if(Kst2Kpluspi0Merged){
  399. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  400. tree->Add(GetInputFile(year,magnet,false,true,ReferenceChannel,PHSP,smallSample).c_str());
  401. }
  402. //Kst2Kspiplus case
  403. if(Kst2Kspiplus){
  404. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  405. tree->Add(GetInputFile(year,magnet,false,true,ReferenceChannel,PHSP,smallSample).c_str());
  406. }
  407. if(tree->GetEntries() > 0){
  408. std::cout << "[LOAD]\t\tSuccessfully loaded original TTree with " << tree->GetEntries() << " entries." << std::endl;
  409. }
  410. else
  411. return 0;
  412. string output_path = "";
  413. if(Kst2Kpluspi0Resolved)output_path = "/home/lhcb/kopecna/public/PID/Bu_Kstmumu_Kpi0_gammagamma_"+year+magnet+"_"+eventTypeStr(ReferenceChannel,PHSP)+".root";
  414. if(Kst2Kspiplus) output_path = "/home/he/dgerick/Public/PID/Bu_Kstmumu_KSpi_pipi_" +year+magnet+"_"+eventTypeStr(ReferenceChannel,PHSP)+".root";
  415. if(ReferenceChannel) replace(output_path,"mumu","Jpsi_mumu");
  416. TFile *output = new TFile(output_path.c_str(),"RECREATE");
  417. ///////////////////////////////////////
  418. // Get particle variables //
  419. ///////////////////////////////////////
  420. // ----- K+pi0 ----- //
  421. Double_t K_plus_P; //Kst_0_K_0
  422. Double_t K_plus_PT;
  423. Int_t K_plus_TRUEID;
  424. Double_t K_plus_PIDe;
  425. Double_t K_plus_PIDmu;
  426. Double_t K_plus_PIDK;
  427. Double_t K_plus_PIDp;
  428. Double_t K_plus_ProbNNe;
  429. Double_t K_plus_ProbNNmu;
  430. Double_t K_plus_ProbNNk;
  431. Double_t K_plus_ProbNNp;
  432. Double_t K_plus_ProbNNpi;
  433. Double_t pi_zero_P; //Kst_0_Pi0_0
  434. Double_t pi_zero_PT;
  435. Int_t pi_zero_TRUEID;
  436. Double_t pi_zero_M;
  437. Double_t pi_zero_isPhoton;
  438. Double_t pi_zero_isNotH;
  439. Double_t pi_zero_isNotE;
  440. Double_t Gamma_0_P; //Pi0_0_Gamma_0
  441. Double_t Gamma_0_PT;
  442. Int_t Gamma_0_TRUEID;
  443. Double_t Gamma_0_isPhoton;
  444. Double_t Gamma_0_isNotH;
  445. Double_t Gamma_0_isNotE;
  446. Double_t Gamma_1_P; //Pi0_0_Gamma_1
  447. Double_t Gamma_1_PT;
  448. Int_t Gamma_1_TRUEID;
  449. Double_t Gamma_1_isPhoton;
  450. Double_t Gamma_1_isNotH;
  451. Double_t Gamma_1_isNotE;
  452. // ----- Kspi+ ----- //
  453. Double_t K_short_P; //Kst_0_K_0
  454. Double_t K_short_PT;
  455. Int_t K_short_TRUEID;
  456. Double_t pi_plus_P; //Kst_0_Pi_0
  457. Double_t pi_plus_PT;
  458. Int_t pi_plus_TRUEID;
  459. Double_t pi_plus_PIDe;
  460. Double_t pi_plus_PIDmu;
  461. Double_t pi_plus_PIDK;
  462. Double_t pi_plus_PIDp;
  463. Double_t pi_plus_ProbNNe;
  464. Double_t pi_plus_ProbNNmu;
  465. Double_t pi_plus_ProbNNk;
  466. Double_t pi_plus_ProbNNp;
  467. Double_t pi_plus_ProbNNpi;
  468. Double_t Ks_pi_plus_P; //Ks_0_Pi_0
  469. Double_t Ks_pi_plus_PT;
  470. Int_t Ks_pi_plus_TRUEID;
  471. Double_t Ks_pi_plus_PIDe;
  472. Double_t Ks_pi_plus_PIDmu;
  473. Double_t Ks_pi_plus_PIDK;
  474. Double_t Ks_pi_plus_PIDp;
  475. Double_t Ks_pi_plus_ProbNNe;
  476. Double_t Ks_pi_plus_ProbNNmu;
  477. Double_t Ks_pi_plus_ProbNNk;
  478. Double_t Ks_pi_plus_ProbNNp;
  479. Double_t Ks_pi_plus_ProbNNpi;
  480. Double_t Ks_pi_minus_P; //Ks_0_Pi_1
  481. Double_t Ks_pi_minus_PT;
  482. Int_t Ks_pi_minus_TRUEID;
  483. Double_t Ks_pi_minus_PIDe;
  484. Double_t Ks_pi_minus_PIDmu;
  485. Double_t Ks_pi_minus_PIDK;
  486. Double_t Ks_pi_minus_PIDp;
  487. Double_t Ks_pi_minus_ProbNNe;
  488. Double_t Ks_pi_minus_ProbNNmu;
  489. Double_t Ks_pi_minus_ProbNNk;
  490. Double_t Ks_pi_minus_ProbNNp;
  491. Double_t Ks_pi_minus_ProbNNpi;
  492. // ---- mumu ----- //
  493. Double_t mu_plus_P; //B_0_Mu_0
  494. Double_t mu_plus_PT;
  495. Int_t mu_plus_TRUEID;
  496. Double_t mu_plus_PIDe;
  497. Double_t mu_plus_PIDmu;
  498. Double_t mu_plus_PIDK;
  499. Double_t mu_plus_PIDp;
  500. Double_t mu_plus_ProbNNe;
  501. Double_t mu_plus_ProbNNmu;
  502. Double_t mu_plus_ProbNNk;
  503. Double_t mu_plus_ProbNNp;
  504. Double_t mu_plus_ProbNNpi;
  505. Double_t mu_minus_P; //B_0_Mu_1
  506. Double_t mu_minus_PT;
  507. Int_t mu_minus_TRUEID;
  508. Double_t mu_minus_PIDe;
  509. Double_t mu_minus_PIDmu;
  510. Double_t mu_minus_PIDK;
  511. Double_t mu_minus_PIDp;
  512. Double_t mu_minus_ProbNNe;
  513. Double_t mu_minus_ProbNNmu;
  514. Double_t mu_minus_ProbNNk;
  515. Double_t mu_minus_ProbNNp;
  516. Double_t mu_minus_ProbNNpi;
  517. ///////////////////////////////////////
  518. // Load branches //
  519. ///////////////////////////////////////
  520. tree->SetBranchStatus("*",0);
  521. // ----- K+pi0 ----- //
  522. if(Kst2Kpluspi0Resolved){
  523. tree->SetBranchStatus("K_plus_P",1); //Kst_0_K_0
  524. tree->SetBranchStatus("K_plus_PT",1);
  525. tree->SetBranchStatus("K_plus_TRUEID",1);
  526. tree->SetBranchStatus("K_plus_PIDe",1);
  527. tree->SetBranchStatus("K_plus_PIDmu",1);
  528. tree->SetBranchStatus("K_plus_PIDK",1);
  529. tree->SetBranchStatus("K_plus_PIDp",1);
  530. tree->SetBranchStatus("K_plus_ProbNNe",1);
  531. tree->SetBranchStatus("K_plus_ProbNNmu",1);
  532. tree->SetBranchStatus("K_plus_ProbNNk",1);
  533. tree->SetBranchStatus("K_plus_ProbNNp",1);
  534. tree->SetBranchStatus("K_plus_ProbNNpi",1);
  535. tree->SetBranchAddress("K_plus_P",&K_plus_P); //Kst_0_K_0
  536. tree->SetBranchAddress("K_plus_PT",&K_plus_PT);
  537. tree->SetBranchAddress("K_plus_TRUEID",&K_plus_TRUEID);
  538. tree->SetBranchAddress("K_plus_PIDe",&K_plus_PIDe);
  539. tree->SetBranchAddress("K_plus_PIDmu",&K_plus_PIDmu);
  540. tree->SetBranchAddress("K_plus_PIDK",&K_plus_PIDK);
  541. tree->SetBranchAddress("K_plus_PIDp",&K_plus_PIDp);
  542. tree->SetBranchAddress("K_plus_ProbNNe",&K_plus_ProbNNe);
  543. tree->SetBranchAddress("K_plus_ProbNNmu",&K_plus_ProbNNmu);
  544. tree->SetBranchAddress("K_plus_ProbNNk",&K_plus_ProbNNk);
  545. tree->SetBranchAddress("K_plus_ProbNNp",&K_plus_ProbNNp);
  546. tree->SetBranchAddress("K_plus_ProbNNpi",&K_plus_ProbNNpi);
  547. tree->SetBranchStatus("pi_zero_resolved_P",1); //Kst_0_Pi0_0
  548. tree->SetBranchStatus("pi_zero_resolved_PT",1);
  549. tree->SetBranchStatus("pi_zero_resolved_TRUEID",1);
  550. tree->SetBranchStatus("pi_zero_resolved_M",1);
  551. //tree->SetBranchStatus("pi_zero_resolved_isPhoton",1);
  552. //tree->SetBranchStatus("pi_zero_resolved_isNotH",1);
  553. //tree->SetBranchStatus("pi_zero_resolved_isNotE",1);
  554. tree->SetBranchAddress("pi_zero_resolved_P",&pi_zero_P); //Kst_0_Pi0_0
  555. tree->SetBranchAddress("pi_zero_resolved_PT",&pi_zero_PT);
  556. tree->SetBranchAddress("pi_zero_resolved_TRUEID",&pi_zero_TRUEID);
  557. tree->SetBranchAddress("pi_zero_resolved_M",&pi_zero_M);
  558. //tree->SetBranchAddress("pi_zero_resolved_isPhoton",&pi_zero_isPhoton);
  559. //tree->SetBranchAddress("pi_zero_resolved_isNotH",&pi_zero_isNotH);
  560. //tree->SetBranchAddress("pi_zero_resolved_isNotE",&pi_zero_isNotE);
  561. tree->SetBranchStatus("gamma1_P",1); //Pi0_0_Gamma_0
  562. tree->SetBranchStatus("gamma1_PT",1);
  563. tree->SetBranchStatus("gamma1_TRUEID",1);
  564. //tree->SetBranchStatus("gamma1_isPhoton",1);
  565. //tree->SetBranchStatus("gamma1_isNotH",1);
  566. //tree->SetBranchStatus("gamma1_isNotE",1);
  567. tree->SetBranchStatus("gamma2_P",1); //Pi0_0_Gamma_1
  568. tree->SetBranchStatus("gamma2_PT",1);
  569. tree->SetBranchStatus("gamma2_TRUEID",1);
  570. //tree->SetBranchStatus("gamma2_isPhoton",1);
  571. //tree->SetBranchStatus("gamma2_isNotH",1);
  572. //tree->SetBranchStatus("gamma2_isNotE",1);
  573. tree->SetBranchAddress("gamma1_P",&Gamma_0_P); //Pi0_0_Gamma_0
  574. tree->SetBranchAddress("gamma1_PT",&Gamma_0_PT);
  575. tree->SetBranchAddress("gamma1_TRUEID",&Gamma_0_TRUEID);
  576. //tree->SetBranchAddress("gamma1_isPhoton",&Gamma_0_isPhoton);
  577. //tree->SetBranchAddress("gamma1_isNotH",&Gamma_0_isNotH);
  578. //tree->SetBranchAddress("gamma1_isNotE",&Gamma_0_isNotE);
  579. tree->SetBranchAddress("gamma2_P",&Gamma_1_P); //Pi0_0_Gamma_1
  580. tree->SetBranchAddress("gamma2_PT",&Gamma_1_PT);
  581. tree->SetBranchAddress("gamma2_TRUEID",&Gamma_1_TRUEID);
  582. //tree->SetBranchAddress("gamma2_isPhoton",&Gamma_1_isPhoton);
  583. //tree->SetBranchAddress("gamma2_isNotH",&Gamma_1_isNotH);
  584. //tree->SetBranchAddress("gamma2_isNotE",&Gamma_1_isNotE);
  585. }
  586. // ----- Kspi+ ----- //
  587. if(Kst2Kspiplus){
  588. tree->SetBranchStatus("K_short_P",1); //Kst_0_K_0
  589. tree->SetBranchStatus("K_short_PT",1);
  590. tree->SetBranchStatus("K_short_TRUEID",1);
  591. tree->SetBranchStatus("pi_plus_P",1); //Kst_0_Pi_0
  592. tree->SetBranchStatus("pi_plus_PT",1);
  593. tree->SetBranchStatus("pi_plus_TRUEID",1);
  594. tree->SetBranchStatus("pi_plus_PIDe",1);
  595. tree->SetBranchStatus("pi_plus_PIDmu",1);
  596. tree->SetBranchStatus("pi_plus_PIDK",1);
  597. tree->SetBranchStatus("pi_plus_PIDp",1);
  598. tree->SetBranchStatus("pi_plus_ProbNNe",1);
  599. tree->SetBranchStatus("pi_plus_ProbNNmu",1);
  600. tree->SetBranchStatus("pi_plus_ProbNNk",1);
  601. tree->SetBranchStatus("pi_plus_ProbNNp",1);
  602. tree->SetBranchStatus("pi_plus_ProbNNpi",1);
  603. tree->SetBranchStatus("Ks_pi_plus_P",1); //Ks_0_Pi_0
  604. tree->SetBranchStatus("Ks_pi_plus_PT",1);
  605. tree->SetBranchStatus("Ks_pi_plus_TRUEID",1);
  606. tree->SetBranchStatus("Ks_pi_plus_PIDe",1);
  607. tree->SetBranchStatus("Ks_pi_plus_PIDmu",1);
  608. tree->SetBranchStatus("Ks_pi_plus_PIDK",1);
  609. tree->SetBranchStatus("Ks_pi_plus_PIDp",1);
  610. tree->SetBranchStatus("Ks_pi_plus_ProbNNe",1);
  611. tree->SetBranchStatus("Ks_pi_plus_ProbNNmu",1);
  612. tree->SetBranchStatus("Ks_pi_plus_ProbNNk",1);
  613. tree->SetBranchStatus("Ks_pi_plus_ProbNNp",1);
  614. tree->SetBranchStatus("Ks_pi_plus_ProbNNpi",1);
  615. tree->SetBranchStatus("Ks_pi_minus_P",1); //Ks_0_Pi_1
  616. tree->SetBranchStatus("Ks_pi_minus_PT",1);
  617. tree->SetBranchStatus("Ks_pi_minus_TRUEID",1);
  618. tree->SetBranchStatus("Ks_pi_minus_PIDe",1);
  619. tree->SetBranchStatus("Ks_pi_minus_PIDmu",1);
  620. tree->SetBranchStatus("Ks_pi_minus_PIDK",1);
  621. tree->SetBranchStatus("Ks_pi_minus_PIDp",1);
  622. tree->SetBranchStatus("Ks_pi_minus_ProbNNe",1);
  623. tree->SetBranchStatus("Ks_pi_minus_ProbNNmu",1);
  624. tree->SetBranchStatus("Ks_pi_minus_ProbNNk",1);
  625. tree->SetBranchStatus("Ks_pi_minus_ProbNNp",1);
  626. tree->SetBranchStatus("Ks_pi_minus_ProbNNpi",1);
  627. tree->SetBranchAddress("K_short_P",&K_short_P); //Kst_0_K_0
  628. tree->SetBranchAddress("K_short_PT",&K_short_PT);
  629. tree->SetBranchAddress("K_short_TRUEID",&K_short_TRUEID);;
  630. tree->SetBranchAddress("pi_plus_P",&pi_plus_P); //Kst_0_Pi_0
  631. tree->SetBranchAddress("pi_plus_PT",&pi_plus_PT);
  632. tree->SetBranchAddress("pi_plus_TRUEID",&pi_plus_TRUEID);
  633. tree->SetBranchAddress("pi_plus_PIDe",&pi_plus_PIDe);
  634. tree->SetBranchAddress("pi_plus_PIDmu",&pi_plus_PIDmu);
  635. tree->SetBranchAddress("pi_plus_PIDK",&pi_plus_PIDK);
  636. tree->SetBranchAddress("pi_plus_PIDp",&pi_plus_PIDp);
  637. tree->SetBranchAddress("pi_plus_ProbNNe",&pi_plus_ProbNNe);
  638. tree->SetBranchAddress("pi_plus_ProbNNmu",&pi_plus_ProbNNmu);
  639. tree->SetBranchAddress("pi_plus_ProbNNk",&pi_plus_ProbNNk);
  640. tree->SetBranchAddress("pi_plus_ProbNNp",&pi_plus_ProbNNp);
  641. tree->SetBranchAddress("pi_plus_ProbNNpi",&pi_plus_ProbNNpi);
  642. tree->SetBranchAddress("Ks_pi_plus_P",&Ks_pi_plus_P); //Ks_0_Pi_0
  643. tree->SetBranchAddress("Ks_pi_plus_PT",&Ks_pi_plus_PT);
  644. tree->SetBranchAddress("Ks_pi_plus_TRUEID",&Ks_pi_plus_TRUEID);
  645. tree->SetBranchAddress("Ks_pi_plus_PIDe",&Ks_pi_plus_PIDe);
  646. tree->SetBranchAddress("Ks_pi_plus_PIDmu",&Ks_pi_plus_PIDmu);
  647. tree->SetBranchAddress("Ks_pi_plus_PIDK",&Ks_pi_plus_PIDK);
  648. tree->SetBranchAddress("Ks_pi_plus_PIDp",&Ks_pi_plus_PIDp);
  649. tree->SetBranchAddress("Ks_pi_plus_ProbNNe",&Ks_pi_plus_ProbNNe);
  650. tree->SetBranchAddress("Ks_pi_plus_ProbNNmu",&Ks_pi_plus_ProbNNmu);
  651. tree->SetBranchAddress("Ks_pi_plus_ProbNNk",&Ks_pi_plus_ProbNNk);
  652. tree->SetBranchAddress("Ks_pi_plus_ProbNNp",&Ks_pi_plus_ProbNNp);
  653. tree->SetBranchAddress("Ks_pi_plus_ProbNNpi",&Ks_pi_plus_ProbNNpi);
  654. tree->SetBranchAddress("Ks_pi_minus_P",&Ks_pi_minus_P); //Ks_0_Pi_1
  655. tree->SetBranchAddress("Ks_pi_minus_PT",&Ks_pi_minus_PT);
  656. tree->SetBranchAddress("Ks_pi_minus_TRUEID",&Ks_pi_minus_TRUEID);
  657. tree->SetBranchAddress("Ks_pi_minus_PIDe",&Ks_pi_minus_PIDe);
  658. tree->SetBranchAddress("Ks_pi_minus_PIDmu",&Ks_pi_minus_PIDmu);
  659. tree->SetBranchAddress("Ks_pi_minus_PIDK",&Ks_pi_minus_PIDK);
  660. tree->SetBranchAddress("Ks_pi_minus_PIDp",&Ks_pi_minus_PIDp);
  661. tree->SetBranchAddress("Ks_pi_minus_ProbNNe",&Ks_pi_minus_ProbNNe);
  662. tree->SetBranchAddress("Ks_pi_minus_ProbNNmu",&Ks_pi_minus_ProbNNmu);
  663. tree->SetBranchAddress("Ks_pi_minus_ProbNNk",&Ks_pi_minus_ProbNNk);
  664. tree->SetBranchAddress("Ks_pi_minus_ProbNNp",&Ks_pi_minus_ProbNNp);
  665. tree->SetBranchAddress("Ks_pi_minus_ProbNNpi",&Ks_pi_minus_ProbNNpi);
  666. }
  667. // ---- mumu ----- //
  668. tree->SetBranchStatus("mu_plus_P",1); //B_0_Mu_0
  669. tree->SetBranchStatus("mu_plus_PT",1);
  670. tree->SetBranchStatus("mu_plus_TRUEID",1);
  671. tree->SetBranchStatus("mu_plus_PIDe",1);
  672. tree->SetBranchStatus("mu_plus_PIDmu",1);
  673. tree->SetBranchStatus("mu_plus_PIDK",1);
  674. tree->SetBranchStatus("mu_plus_PIDp",1);
  675. tree->SetBranchStatus("mu_plus_ProbNNe",1);
  676. tree->SetBranchStatus("mu_plus_ProbNNmu",1);
  677. tree->SetBranchStatus("mu_plus_ProbNNk",1);
  678. tree->SetBranchStatus("mu_plus_ProbNNp",1);
  679. tree->SetBranchStatus("mu_plus_ProbNNpi",1);
  680. tree->SetBranchStatus("mu_minus_P",1); //B_0_Mu_1
  681. tree->SetBranchStatus("mu_minus_PT",1);
  682. tree->SetBranchStatus("mu_minus_TRUEID",1);
  683. tree->SetBranchStatus("mu_minus_PIDe",1);
  684. tree->SetBranchStatus("mu_minus_PIDmu",1);
  685. tree->SetBranchStatus("mu_minus_PIDK",1);
  686. tree->SetBranchStatus("mu_minus_PIDp",1);
  687. tree->SetBranchStatus("mu_minus_ProbNNe",1);
  688. tree->SetBranchStatus("mu_minus_ProbNNmu",1);
  689. tree->SetBranchStatus("mu_minus_ProbNNk",1);
  690. tree->SetBranchStatus("mu_minus_ProbNNp",1);
  691. tree->SetBranchStatus("mu_minus_ProbNNpi",1);
  692. tree->SetBranchAddress("mu_plus_P",&mu_plus_P); //B_0_Mu_0
  693. tree->SetBranchAddress("mu_plus_PT",&mu_plus_PT);
  694. tree->SetBranchAddress("mu_plus_TRUEID",&mu_plus_TRUEID);
  695. tree->SetBranchAddress("mu_plus_PIDe",&mu_plus_PIDe);
  696. tree->SetBranchAddress("mu_plus_PIDmu",&mu_plus_PIDmu);
  697. tree->SetBranchAddress("mu_plus_PIDK",&mu_plus_PIDK);
  698. tree->SetBranchAddress("mu_plus_PIDp",&mu_plus_PIDp);
  699. tree->SetBranchAddress("mu_plus_ProbNNe",&mu_plus_ProbNNe);
  700. tree->SetBranchAddress("mu_plus_ProbNNmu",&mu_plus_ProbNNmu);
  701. tree->SetBranchAddress("mu_plus_ProbNNk",&mu_plus_ProbNNk);
  702. tree->SetBranchAddress("mu_plus_ProbNNp",&mu_plus_ProbNNp);
  703. tree->SetBranchAddress("mu_plus_ProbNNpi",&mu_plus_ProbNNpi);
  704. tree->SetBranchAddress("mu_minus_P",&mu_minus_P); //B_0_Mu_1
  705. tree->SetBranchAddress("mu_minus_PT",&mu_minus_PT);
  706. tree->SetBranchAddress("mu_minus_TRUEID",&mu_minus_TRUEID);
  707. tree->SetBranchAddress("mu_minus_PIDe",&mu_minus_PIDe);
  708. tree->SetBranchAddress("mu_minus_PIDmu",&mu_minus_PIDmu);
  709. tree->SetBranchAddress("mu_minus_PIDK",&mu_minus_PIDK);
  710. tree->SetBranchAddress("mu_minus_PIDp",&mu_minus_PIDp);
  711. tree->SetBranchAddress("mu_minus_ProbNNe",&mu_minus_ProbNNe);
  712. tree->SetBranchAddress("mu_minus_ProbNNmu",&mu_minus_ProbNNmu);
  713. tree->SetBranchAddress("mu_minus_ProbNNk",&mu_minus_ProbNNk);
  714. tree->SetBranchAddress("mu_minus_ProbNNp",&mu_minus_ProbNNp);
  715. tree->SetBranchAddress("mu_minus_ProbNNpi",&mu_minus_ProbNNpi);
  716. ///////////////////////////////////////
  717. // Define new branches //
  718. ///////////////////////////////////////
  719. TTree * NewTree = new TTree("DecayTree", "DecayTree");
  720. // ----- K+pi0 ----- //
  721. if(Kst2Kpluspi0Resolved){
  722. NewTree->Branch("Kst_0_K_0_P",&K_plus_P,"Kst_0_K_0_P/D"); //Kst_0_K_0
  723. NewTree->Branch("Kst_0_K_0_PT",&K_plus_PT,"Kst_0_K_0_PT/D");
  724. NewTree->Branch("Kst_0_K_0_TRUEID",&K_plus_TRUEID,"Kst_0_K_0_TRUEID/I");
  725. NewTree->Branch("Kst_0_K_0_PIDe",&K_plus_PIDe,"Kst_0_K_0_PIDe/D");
  726. NewTree->Branch("Kst_0_K_0_PIDmu",&K_plus_PIDmu,"Kst_0_K_0_PIDmu/D");
  727. NewTree->Branch("Kst_0_K_0_PIDK",&K_plus_PIDK,"Kst_0_K_0_PIDK/D");
  728. NewTree->Branch("Kst_0_K_0_PIDp",&K_plus_PIDp,"Kst_0_K_0_PIDp/D");
  729. NewTree->Branch("Kst_0_K_0_ProbNNe",&K_plus_ProbNNe,"Kst_0_K_0_ProbNNe/D");
  730. NewTree->Branch("Kst_0_K_0_ProbNNmu",&K_plus_ProbNNmu,"Kst_0_K_0_ProbNNmu/D");
  731. NewTree->Branch("Kst_0_K_0_ProbNNk",&K_plus_ProbNNk,"Kst_0_K_0_ProbNNk/D");
  732. NewTree->Branch("Kst_0_K_0_ProbNNp",&K_plus_ProbNNp,"Kst_0_K_0_ProbNNp/D");
  733. NewTree->Branch("Kst_0_K_0_ProbNNpi",&K_plus_ProbNNpi,"Kst_0_K_0_ProbNNpi/D");
  734. NewTree->Branch("Kst_0_Pi0_0_P",&pi_zero_P,"Kst_0_Pi0_0_P/D"); //Kst_0_Pi0_0
  735. NewTree->Branch("Kst_0_Pi0_0_PT",&pi_zero_PT,"Kst_0_Pi0_0_PT/D");
  736. NewTree->Branch("Kst_0_Pi0_0_TRUEID",&pi_zero_TRUEID,"Kst_0_Pi0_0_TRUEID/I");
  737. NewTree->Branch("Kst_0_Pi0_0_M",&pi_zero_M,"Kst_0_Pi0_0_M/D");
  738. //NewTree->Branch("Kst_0_Pi0_0_isPhoton",&pi_zero_isPhoton,"Kst_0_Pi0_0_isPhoton/D");
  739. //NewTree->Branch("Kst_0_Pi0_0_isNotH",&pi_zero_isNotH,"Kst_0_Pi0_0_isNotH/D");
  740. //NewTree->Branch("Kst_0_Pi0_0_isNotE",&pi_zero_isNotE,"Kst_0_Pi0_0_isNotE/D");
  741. NewTree->Branch("Pi0_0_Gamma_0_P",&Gamma_0_P,"Pi0_0_Gamma_0_P/D"); //Pi0_0_Gamma_0
  742. NewTree->Branch("Pi0_0_Gamma_0_PT",&Gamma_0_PT,"Pi0_0_Gamma_0_PT/D");
  743. NewTree->Branch("Pi0_0_Gamma_0_TRUEID",&Gamma_0_TRUEID,"Pi0_0_Gamma_0_TRUEID/I");
  744. //NewTree->Branch("Pi0_0_Gamma_0_isPhoton",&Gamma_0_isPhoton,"Pi0_0_Gamma_0_isPhoton/D");
  745. //NewTree->Branch("Pi0_0_Gamma_0_isNotH",&Gamma_0_isNotH,"Pi0_0_Gamma_0_isNotH/D");
  746. //NewTree->Branch("Pi0_0_Gamma_0_isNotE",&Gamma_0_isNotE,"Pi0_0_Gamma_0_isNotE/D");
  747. NewTree->Branch("Pi0_0_Gamma_1_P",&Gamma_1_P,"Pi0_0_Gamma_1_P/D"); //Pi0_0_Gamma_1
  748. NewTree->Branch("Pi0_0_Gamma_1_PT",&Gamma_1_PT,"Pi0_0_Gamma_1_PT/D");
  749. NewTree->Branch("Pi0_0_Gamma_1_TRUEID",&Gamma_1_TRUEID,"Pi0_0_Gamma_1_TRUEID/I");
  750. //NewTree->Branch("Pi0_0_Gamma_1_isPhoton",&Gamma_1_isPhoton,"Pi0_0_Gamma_1_isPhoton/D");
  751. //NewTree->Branch("Pi0_0_Gamma_1_isNotH",&Gamma_1_isNotH,"Pi0_0_Gamma_1_isNotH/D");
  752. //NewTree->Branch("Pi0_0_Gamma_1_isNotE",&Gamma_1_isNotE,"Pi0_0_Gamma_1_isNotE/D");
  753. }
  754. // ----- Kspi+ ----- //
  755. if(Kst2Kspiplus){
  756. NewTree->Branch("Kst_0_K_0_P",&K_short_P,"Kst_0_K_0_P/D"); //Kst_0_K_0
  757. NewTree->Branch("Kst_0_K_0_PT",&K_short_PT,"Kst_0_K_0_PT/D");
  758. NewTree->Branch("Kst_0_K_0_TRUEID",&K_short_TRUEID,"Kst_0_K_0_TRUEID/I");
  759. NewTree->Branch("Kst_0_Pi_0_P",&pi_plus_P,"Kst_0_Pi_0_P/D"); //Kst_0_Pi_0
  760. NewTree->Branch("Kst_0_Pi_0_PT",&pi_plus_PT,"Kst_0_Pi_0_PT/D");
  761. NewTree->Branch("Kst_0_Pi_0_TRUEID",&pi_plus_TRUEID,"Kst_0_Pi_0_TRUEID/I");
  762. NewTree->Branch("Kst_0_Pi_0_PIDe",&pi_plus_PIDe,"Kst_0_Pi_0_PIDe/D");
  763. NewTree->Branch("Kst_0_Pi_0_PIDmu",&pi_plus_PIDmu,"Kst_0_Pi_0_PIDmu/D");
  764. NewTree->Branch("Kst_0_Pi_0_PIDK",&pi_plus_PIDK,"Kst_0_Pi_0_PIDK/D");
  765. NewTree->Branch("Kst_0_Pi_0_PIDp",&pi_plus_PIDp,"Kst_0_Pi_0_PIDp/D");
  766. NewTree->Branch("Kst_0_Pi_0_ProbNNe",&pi_plus_ProbNNe,"Kst_0_Pi_0_ProbNNe/D");
  767. NewTree->Branch("Kst_0_Pi_0_ProbNNmu",&pi_plus_ProbNNmu,"Kst_0_Pi_0_ProbNNmu/D");
  768. NewTree->Branch("Kst_0_Pi_0_ProbNNk",&pi_plus_ProbNNk,"Kst_0_Pi_0_ProbNNk/D");
  769. NewTree->Branch("Kst_0_Pi_0_ProbNNp",&pi_plus_ProbNNp,"Kst_0_Pi_0_ProbNNp/D");
  770. NewTree->Branch("Kst_0_Pi_0_ProbNNpi",&pi_plus_ProbNNpi,"Kst_0_Pi_0_ProbNNpi/D");
  771. NewTree->Branch("K_0_Pi_0_P",&Ks_pi_plus_P,"K_0_Pi_0_P/D"); //Ks_0_Pi_0
  772. NewTree->Branch("K_0_Pi_0_PT",&Ks_pi_plus_PT,"K_0_Pi_0_PT/D");
  773. NewTree->Branch("K_0_Pi_0_TRUEID",&Ks_pi_plus_TRUEID,"K_0_Pi_0_TRUEID/I");
  774. NewTree->Branch("K_0_Pi_0_PIDe",&Ks_pi_plus_PIDe,"K_0_Pi_0_PIDe/D");
  775. NewTree->Branch("K_0_Pi_0_PIDmu",&Ks_pi_plus_PIDmu,"K_0_Pi_0_PIDmu/D");
  776. NewTree->Branch("K_0_Pi_0_PIDK",&Ks_pi_plus_PIDK,"K_0_Pi_0_PIDK/D");
  777. NewTree->Branch("K_0_Pi_0_PIDp",&Ks_pi_plus_PIDp,"K_0_Pi_0_PIDp/D");
  778. NewTree->Branch("K_0_Pi_0_ProbNNe",&Ks_pi_plus_ProbNNe,"K_0_Pi_0_ProbNNe/D");
  779. NewTree->Branch("K_0_Pi_0_ProbNNmu",&Ks_pi_plus_ProbNNmu,"K_0_Pi_0_ProbNNmu/D");
  780. NewTree->Branch("K_0_Pi_0_ProbNNk",&Ks_pi_plus_ProbNNk,"K_0_Pi_0_ProbNNk/D");
  781. NewTree->Branch("K_0_Pi_0_ProbNNp",&Ks_pi_plus_ProbNNp,"K_0_Pi_0_ProbNNp/D");
  782. NewTree->Branch("K_0_Pi_0_ProbNNpi",&Ks_pi_plus_ProbNNpi,"K_0_Pi_0_ProbNNpi/D");
  783. NewTree->Branch("K_0_Pi_1_P",&Ks_pi_minus_P,"K_0_Pi_1_P/D"); //Ks_0_Pi_1
  784. NewTree->Branch("K_0_Pi_1_PT",&Ks_pi_minus_PT,"K_0_Pi_1_PT/D");
  785. NewTree->Branch("K_0_Pi_1_TRUEID",&Ks_pi_minus_TRUEID,"K_0_Pi_1_TRUEID/I");
  786. NewTree->Branch("K_0_Pi_1_PIDe",&Ks_pi_minus_PIDe,"K_0_Pi_1_PIDe/D");
  787. NewTree->Branch("K_0_Pi_1_PIDmu",&Ks_pi_minus_PIDmu,"K_0_Pi_1_PIDmu/D");
  788. NewTree->Branch("K_0_Pi_1_PIDK",&Ks_pi_minus_PIDK,"K_0_Pi_1_PIDK/D");
  789. NewTree->Branch("K_0_Pi_1_PIDp",&Ks_pi_minus_PIDp,"K_0_Pi_1_PIDp/D");
  790. NewTree->Branch("K_0_Pi_1_ProbNNe",&Ks_pi_minus_ProbNNe,"K_0_Pi_1_ProbNNe/D");
  791. NewTree->Branch("K_0_Pi_1_ProbNNmu",&Ks_pi_minus_ProbNNmu,"K_0_Pi_1_ProbNNmu/D");
  792. NewTree->Branch("K_0_Pi_1_ProbNNk",&Ks_pi_minus_ProbNNk,"K_0_Pi_1_ProbNNk/D");
  793. NewTree->Branch("K_0_Pi_1_ProbNNp",&Ks_pi_minus_ProbNNp,"K_0_Pi_1_ProbNNp/D");
  794. NewTree->Branch("K_0_Pi_1_ProbNNpi",&Ks_pi_minus_ProbNNpi,"K_0_Pi_1_ProbNNpi/D");
  795. }
  796. // ---- mumu ----- //
  797. if (ReferenceChannel){
  798. NewTree->Branch("Jpsi_0_Mu_0_P",&mu_plus_P,"Jpsi_0_Mu_0_P/D"); //Jpsi_0_Mu_0
  799. NewTree->Branch("Jpsi_0_Mu_0_PT",&mu_plus_PT,"Jpsi_0_Mu_0_PT/D");
  800. NewTree->Branch("Jpsi_0_Mu_0_TRUEID",&mu_plus_TRUEID,"Jpsi_0_Mu_0_TRUEID/I");
  801. NewTree->Branch("Jpsi_0_Mu_0_PIDe",&mu_plus_PIDe,"Jpsi_0_Mu_0_PIDe/D");
  802. NewTree->Branch("Jpsi_0_Mu_0_PIDmu",&mu_plus_PIDmu,"Jpsi_0_Mu_0_PIDmu/D");
  803. NewTree->Branch("Jpsi_0_Mu_0_PIDK",&mu_plus_PIDK,"Jpsi_0_Mu_0_PIDK/D");
  804. NewTree->Branch("Jpsi_0_Mu_0_PIDp",&mu_plus_PIDp,"Jpsi_0_Mu_0_PIDp/D");
  805. NewTree->Branch("Jpsi_0_Mu_0_ProbNNe",&mu_plus_ProbNNe,"Jpsi_0_Mu_0_ProbNNe/D");
  806. NewTree->Branch("Jpsi_0_Mu_0_ProbNNmu",&mu_plus_ProbNNmu,"Jpsi_0_Mu_0_ProbNNmu/D");
  807. NewTree->Branch("Jpsi_0_Mu_0_ProbNNk",&mu_plus_ProbNNk,"Jpsi_0_Mu_0_ProbNNk/D");
  808. NewTree->Branch("Jpsi_0_Mu_0_ProbNNp",&mu_plus_ProbNNp,"Jpsi_0_Mu_0_ProbNNp/D");
  809. NewTree->Branch("Jpsi_0_Mu_0_ProbNNpi",&mu_plus_ProbNNpi,"Jpsi_0_Mu_0_ProbNNpi/D");
  810. NewTree->Branch("Jpsi_0_Mu_1_P",&mu_minus_P,"Jpsi_0_Mu_1_P/D"); //Jpsi_0_Mu_1
  811. NewTree->Branch("Jpsi_0_Mu_1_PT",&mu_minus_PT,"Jpsi_0_Mu_1_PT/D");
  812. NewTree->Branch("Jpsi_0_Mu_1_TRUEID",&mu_minus_TRUEID,"Jpsi_0_Mu_1_TRUEID/I");
  813. NewTree->Branch("Jpsi_0_Mu_1_PIDe",&mu_minus_PIDe,"Jpsi_0_Mu_1_PIDe/D");
  814. NewTree->Branch("Jpsi_0_Mu_1_PIDmu",&mu_minus_PIDmu,"Jpsi_0_Mu_1_PIDmu/D");
  815. NewTree->Branch("Jpsi_0_Mu_1_PIDK",&mu_minus_PIDK,"Jpsi_0_Mu_1_PIDK/D");
  816. NewTree->Branch("Jpsi_0_Mu_1_PIDp",&mu_minus_PIDp,"Jpsi_0_Mu_1_PIDp/D");
  817. NewTree->Branch("Jpsi_0_Mu_1_ProbNNe",&mu_minus_ProbNNe,"Jpsi_0_Mu_1_ProbNNe/D");
  818. NewTree->Branch("Jpsi_0_Mu_1_ProbNNmu",&mu_minus_ProbNNmu,"Jpsi_0_Mu_1_ProbNNmu/D");
  819. NewTree->Branch("Jpsi_0_Mu_1_ProbNNk",&mu_minus_ProbNNk,"Jpsi_0_Mu_1_ProbNNk/D");
  820. NewTree->Branch("Jpsi_0_Mu_1_ProbNNp",&mu_minus_ProbNNp,"Jpsi_0_Mu_1_ProbNNp/D");
  821. NewTree->Branch("Jpsi_0_Mu_1_ProbNNpi",&mu_minus_ProbNNpi,"Jpsi_0_Mu_1_ProbNNpi/D");
  822. }
  823. else{
  824. NewTree->Branch("B_0_Mu_0_P",&mu_plus_P,"B_0_Mu_0_P/D"); //B_0_Mu_0
  825. NewTree->Branch("B_0_Mu_0_PT",&mu_plus_PT,"B_0_Mu_0_PT/D");
  826. NewTree->Branch("B_0_Mu_0_TRUEID",&mu_plus_TRUEID,"B_0_Mu_0_TRUEID/I");
  827. NewTree->Branch("B_0_Mu_0_PIDe",&mu_plus_PIDe,"B_0_Mu_0_PIDe/D");
  828. NewTree->Branch("B_0_Mu_0_PIDmu",&mu_plus_PIDmu,"B_0_Mu_0_PIDmu/D");
  829. NewTree->Branch("B_0_Mu_0_PIDK",&mu_plus_PIDK,"B_0_Mu_0_PIDK/D");
  830. NewTree->Branch("B_0_Mu_0_PIDp",&mu_plus_PIDp,"B_0_Mu_0_PIDp/D");
  831. NewTree->Branch("B_0_Mu_0_ProbNNe",&mu_plus_ProbNNe,"B_0_Mu_0_ProbNNe/D");
  832. NewTree->Branch("B_0_Mu_0_ProbNNmu",&mu_plus_ProbNNmu,"B_0_Mu_0_ProbNNmu/D");
  833. NewTree->Branch("B_0_Mu_0_ProbNNk",&mu_plus_ProbNNk,"B_0_Mu_0_ProbNNk/D");
  834. NewTree->Branch("B_0_Mu_0_ProbNNp",&mu_plus_ProbNNp,"B_0_Mu_0_ProbNNp/D");
  835. NewTree->Branch("B_0_Mu_0_ProbNNpi",&mu_plus_ProbNNpi,"B_0_Mu_0_ProbNNpi/D");
  836. NewTree->Branch("B_0_Mu_1_P",&mu_minus_P,"B_0_Mu_1_P/D"); //B_0_Mu_1
  837. NewTree->Branch("B_0_Mu_1_PT",&mu_minus_PT,"B_0_Mu_1_PT/D");
  838. NewTree->Branch("B_0_Mu_1_TRUEID",&mu_minus_TRUEID,"B_0_Mu_1_TRUEID/I");
  839. NewTree->Branch("B_0_Mu_1_PIDe",&mu_minus_PIDe,"B_0_Mu_1_PIDe/D");
  840. NewTree->Branch("B_0_Mu_1_PIDmu",&mu_minus_PIDmu,"B_0_Mu_1_PIDmu/D");
  841. NewTree->Branch("B_0_Mu_1_PIDK",&mu_minus_PIDK,"B_0_Mu_1_PIDK/D");
  842. NewTree->Branch("B_0_Mu_1_PIDp",&mu_minus_PIDp,"B_0_Mu_1_PIDp/D");
  843. NewTree->Branch("B_0_Mu_1_ProbNNe",&mu_minus_ProbNNe,"B_0_Mu_1_ProbNNe/D");
  844. NewTree->Branch("B_0_Mu_1_ProbNNmu",&mu_minus_ProbNNmu,"B_0_Mu_1_ProbNNmu/D");
  845. NewTree->Branch("B_0_Mu_1_ProbNNk",&mu_minus_ProbNNk,"B_0_Mu_1_ProbNNk/D");
  846. NewTree->Branch("B_0_Mu_1_ProbNNp",&mu_minus_ProbNNp,"B_0_Mu_1_ProbNNp/D");
  847. NewTree->Branch("B_0_Mu_1_ProbNNpi",&mu_minus_ProbNNpi,"B_0_Mu_1_ProbNNpi/D");
  848. }
  849. for (int evt = 0; evt < tree->GetEntries(); evt++){
  850. tree->GetEntry(evt);
  851. NewTree->Fill();
  852. }
  853. output->cd();
  854. NewTree->Write("",TObject::kWriteDelete);
  855. string dict_path = Kst2Kspiplus ? "/home/he/dgerick/Public/PID/ForDict.txt" : "/home/lhcb/kopecna/public/PID/ForDict.txt";
  856. ofstream myfile;
  857. myfile.open (dict_path,ios::app);
  858. myfile << eventTypeStr(ReferenceChannel,PHSP) << ":[\"" << year << "\",\"" << magnet << "\", " << NewTree->GetEntries() <<"]," << endl;
  859. output->Close();
  860. cout << "[INFO]\t\t New tree created and saved to file." << endl;
  861. return 1;
  862. }
  863. int copyForPIDAllSig(){
  864. for (auto& year : yearsMC(false, false,12)){
  865. if (copyForPID(year,"down",false,false)==0) return 0;
  866. if (copyForPID(year,"up", false,false)==0) return 0;
  867. }
  868. return 1;
  869. }
  870. int copyForPIDAllRef(){
  871. for (auto& year : yearsMC(true, false,12)){
  872. if (copyForPID(year,"down",true,false)==0) return 0;
  873. if (copyForPID(year,"up", true,false)==0) return 0;
  874. }
  875. return 1;
  876. }
  877. int copySameRunNumber(int year1 = 2018, int year2 = 2020, std::string mag = "down") {
  878. //put both magnet polarities into one TChain
  879. string tupleName = Kst2Kpluspi0Resolved ? "b2KstKpi0mumuResolvedTuple/DecayTree" : "b2KstKs0pimumu_Tuple/DecayTree";
  880. TChain * treeData1 = new TChain(tupleName.c_str());
  881. TChain * treeData2 = new TChain(tupleName.c_str());
  882. if (year1 < 2019)
  883. treeData1->Add(Form("%s/data/%i%s/%i*_B2Kstmumu*.root", path_to_output_KshortPiplus.c_str(), year1, mag.c_str(), year1));
  884. else
  885. treeData1->Add(Form("%s/data/%i%s/%i*_B2Kstmumu*_validation.root", Kst2Kpluspi0Resolved ? path_to_output_KplusPizero.c_str() : path_to_output_KshortPiplus.c_str(), year1, mag.c_str(), year1));
  886. if (year2 < 2019)
  887. treeData2->Add(Form("%s/data/%i%s/%i*_B2Kstmumu*.root", path_to_output_KshortPiplus.c_str(), year2, mag.c_str(), year2));
  888. else
  889. treeData2->Add(Form("%s/data/%i%s/%i*_B2Kstmumu*_validation.root", Kst2Kpluspi0Resolved ? path_to_output_KplusPizero.c_str() : path_to_output_KshortPiplus.c_str(), year2, mag.c_str(), year2));
  890. if(treeData1->GetEntries() == 0){
  891. std::cout << "[ERROR]\tNo entries found in ntuple for year " << year1 << std::endl;
  892. return 0;
  893. }
  894. if(treeData2->GetEntries() == 0){
  895. std::cout << "[ERROR]\tNo entries found in ntuple for year " << year2 << std::endl;
  896. return 0;
  897. }
  898. UInt_t runNumber1 = 0;
  899. UInt_t runNumber2 = 0;
  900. treeData1->SetBranchStatus("*",1);
  901. treeData1->SetBranchStatus("runNumber",1);
  902. treeData1->SetBranchAddress("runNumber",&runNumber1);
  903. treeData2->SetBranchStatus("*",1);
  904. treeData2->SetBranchStatus("runNumber",1);
  905. treeData2->SetBranchAddress("runNumber",&runNumber2);
  906. std::vector<int>vRunNumber;
  907. std::vector<int>vRunNumber1;
  908. std::vector<int>vRunNumber2;
  909. /*
  910. for (int evt1 = 0; evt1 < treeData1->GetEntries(); evt1++){
  911. treeData1->GetEntry(evt1);
  912. vRunNumber1.push_back(runNumber1);
  913. }
  914. */
  915. for (int evt2 = 0; evt2< treeData2->GetEntries(); evt2++){
  916. treeData2->GetEntry(evt2);
  917. vRunNumber.push_back(runNumber2);
  918. }
  919. /*
  920. std::sort(vRunNumber1.begin(), vRunNumber1.end());
  921. auto last1 = std::unique(vRunNumber1.begin(), vRunNumber1.end());
  922. vRunNumber1.erase(last1, vRunNumber1.end());
  923. for (std::vector<int>::const_iterator i = vRunNumber1.begin(); i != vRunNumber1.end(); ++i){
  924. cout << *i << endl;
  925. }
  926. cout << "First vector" << endl;
  927. std::sort(vRunNumber2.begin(), vRunNumber2.end());
  928. auto last2 = std::unique(vRunNumber2.begin(), vRunNumber2.end());
  929. vRunNumber2.erase(last2, vRunNumber2.end());
  930. for (std::vector<int>::const_iterator ii = vRunNumber2.begin(); ii != vRunNumber2.end(); ++ii){
  931. cout << *ii << endl;
  932. }
  933. cout << "Second vector" << endl;
  934. for (int i = 0; i < vRunNumber1.size(); i++){
  935. for (int ii = 0; ii < vRunNumber2.size(); ii++){
  936. if ( vRunNumber1[i] == vRunNumber2[ii]){
  937. vRunNumber.push_back(vRunNumber1[i]);
  938. cout << vRunNumber1[i] << endl;
  939. continue;
  940. }
  941. }
  942. }
  943. */
  944. std::sort(vRunNumber.begin(), vRunNumber.end());
  945. auto last = std::unique(vRunNumber.begin(), vRunNumber.end());
  946. vRunNumber.erase(last, vRunNumber.end());
  947. cout << "Loop to get the run numbers done" << endl;
  948. /*
  949. TTree * NewTree1 = new TTree(tupleName.c_str(),tupleName.c_str());
  950. for (int evt = 0; evt < treeData1->GetEntries(); evt++){
  951. treeData1->GetEntry(evt);
  952. for(unsigned rn = 0; rn < vRunNumber.size(); rn++){
  953. if (runNumber1 == vRunNumber.at(rn)){
  954. NewTree1->Fill();
  955. continue;
  956. }
  957. }
  958. }
  959. cout << "Loop to get the first tree done" << endl;
  960. TTree * NewTree2 = new TTree(tupleName.c_str(),tupleName.c_str());
  961. for (int evt = 0; evt < treeData2->GetEntries(); evt++){
  962. treeData2->GetEntry(evt);
  963. for(unsigned rn = 0; rn < vRunNumber.size(); rn++){
  964. if (runNumber2 == vRunNumber.at(rn)){
  965. NewTree2->Fill();
  966. continue;
  967. }
  968. }
  969. cout << evt << endl;
  970. }
  971. */
  972. if (vRunNumber.size() ==0) return 0;
  973. std::string AllCuts = "runNumber== " + to_string(vRunNumber.at(0));
  974. cout << "[INFO]\t\t Appling cuts:" << AllCuts << endl;
  975. for (vector<int>::iterator t = vRunNumber.begin()+1;
  976. t != vRunNumber.end();
  977. ++t){
  978. AllCuts = AllCuts + " || runNumber== " + to_string(*t) ;
  979. cout << "\t\t\t" << " || runNumber== " << *t << endl;
  980. }
  981. cout << "Start copying the trees" << endl;
  982. TTree* NewTree1 = treeData1->CopyTree( AllCuts.c_str() );
  983. TTree* NewTree2 = treeData2->CopyTree( AllCuts.c_str() );
  984. cout << "Copying the trees done" << endl;
  985. TFile *output1, *output2;
  986. if (year1 < 2019)
  987. output1 = new TFile(Form("%s/data/%i%s/%i%i*_B2Kstmumu*_runNumberSame.root", path_to_output_KshortPiplus.c_str(), year1, mag.c_str(), year1, year2),"RECREATE");
  988. else
  989. output1 = new TFile(Form("%s/data/%i%s/%i%i*_B2Kstmumu*_validation_runNumberSame.root", Kst2Kpluspi0Resolved ? path_to_output_KplusPizero.c_str() : path_to_output_KshortPiplus.c_str(), year1, mag.c_str(), year1, year2),"RECREATE");
  990. if (year2 < 2019)
  991. output2 = new TFile(Form("%s/data/%i%s/%i%i*_B2Kstmumu*_runNumberSame.root", path_to_output_KshortPiplus.c_str(), year2, mag.c_str(), year1, year2),"RECREATE");
  992. else
  993. output2 = new TFile(Form("%s/data/%i%s/%i%i*_B2Kstmumu*_validation_runNumberSame.root", Kst2Kpluspi0Resolved ? path_to_output_KplusPizero.c_str() : path_to_output_KshortPiplus.c_str(), year2, mag.c_str(), year1, year2),"RECREATE");
  994. output1->cd();
  995. NewTree1->Write("",TObject::kWriteDelete);
  996. output2->cd();
  997. NewTree2->Write("",TObject::kWriteDelete);
  998. output1->Close();
  999. output2->Close();
  1000. cout << "[INFO]\t\t New tree created and saved to file." << endl;
  1001. return 1;
  1002. }
  1003. int copyForL0Efficiency(int year = 2011, string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false){
  1004. //Load all files
  1005. TChain* tree = 0;
  1006. //Reference channel and PHSP are both MC data
  1007. if(ReferenceChannel)MC = true;
  1008. if(PHSP)MC = true;
  1009. if(ReferenceChannel && PHSP){
  1010. std::cout << "[WARNING]\tCannot set boolean of reference channel and phase-space MC at the same time! Process Reference Channel!" << std::endl;
  1011. PHSP = false;
  1012. }
  1013. if(Kst2Kpluspi0Resolved){
  1014. tree=new TChain("b2KstKpi0mumuResolvedTuple/DecayTree");
  1015. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,false).c_str());
  1016. }
  1017. //Kst2Kpluspi0Merged case
  1018. if(Kst2Kpluspi0Merged){
  1019. tree=new TChain("b2KstKpi0mumuMergedTuple/DecayTree");
  1020. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,false).c_str());
  1021. }
  1022. //Kst2Kspiplus case
  1023. if(Kst2Kspiplus){
  1024. tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
  1025. tree->Add(GetInputFile(year,magnet,false,MC,ReferenceChannel,PHSP,false).c_str());
  1026. }
  1027. int N = tree->GetEntries();
  1028. coutDebug("Old files contain " + to_string(N) + " events.");
  1029. if(N == 0){
  1030. coutERROR("Tree has no entries. Exit!");
  1031. return 0;
  1032. }
  1033. //Disable all branches
  1034. tree->SetBranchStatus("*",0);
  1035. //activate needed branches
  1036. tree->SetBranchStatus("mu_plus_PT",1) ;
  1037. tree->SetBranchStatus("mu_minus_PT",1) ;
  1038. tree->SetBranchStatus("mu_plus_ProbNNmu",1) ;
  1039. tree->SetBranchStatus("mu_minus_ProbNNmu",1) ;
  1040. tree->SetBranchStatus("mu_plus_PIDmu",1) ;
  1041. tree->SetBranchStatus("mu_minus_PIDmu",1) ;
  1042. tree->SetBranchStatus("nSPDHits",1) ;
  1043. if (MC){
  1044. tree->SetBranchStatus("mu_plus_TRUEPT",1) ;
  1045. tree->SetBranchStatus("mu_minus_TRUEPT",1) ;
  1046. }
  1047. tree->SetBranchStatus("B_plus_L0MuonDecision_TOS",1) ;
  1048. tree->SetBranchStatus("B_plus_L0Global_TIS",1);
  1049. if (year > 2012) tree->SetBranchStatus("B_plus_L0DiMuonDecision_TOS",1) ;
  1050. //open output file
  1051. string output_path = GetInputFile(year, magnet,true,MC,ReferenceChannel,PHSP,false);
  1052. replace(output_path,".root","_L0Muon.root");
  1053. TFile *output = new TFile(output_path.c_str(),"RECREATE");
  1054. output->cd();
  1055. TTree* newTree = tree->CopyTree("B_plus_L0Global_TIS==1");
  1056. if (newTree->GetEntries()==0) coutERROR("Failed while coping!");
  1057. newTree->Write("",TObject::kOverwrite);
  1058. delete newTree;
  1059. output->Close();
  1060. return 1;
  1061. //TODO: delete pointers
  1062. }
  1063. int copyForL0Efficiency(string year = "2011", string magnet = "down", bool MC = false, bool ReferenceChannel = false, bool PHSP = false){
  1064. return copyForL0Efficiency(stoi(year),magnet,MC,ReferenceChannel,PHSP);
  1065. }
  1066. int copyForL0EfficiencyData(int Run){
  1067. for (auto& year : yearsData(Run)){
  1068. if (copyForL0Efficiency(year,"up",false, false, false)==0) return 0;
  1069. if (copyForL0Efficiency(year,"down",false, false, false)==0) return 0;
  1070. }
  1071. return 1;
  1072. }
  1073. int copyForL0EfficiencyMC(int Run){
  1074. for (auto& year : yearsMC(false,false,Run)){
  1075. if (copyForL0Efficiency(year,"up",true, false, false)==0) return 0;
  1076. if (copyForL0Efficiency(year,"down",true, false, false)==0) return 0;
  1077. }
  1078. return 1;
  1079. }
  1080. int copyForL0EfficiencyRefMC(int Run){
  1081. for (auto& year : yearsMC(true,false,Run)){
  1082. if (copyForL0Efficiency(year,"up",false, true, false)==0) return 0;
  1083. if (copyForL0Efficiency(year,"down",false, true, false)==0) return 0;
  1084. }
  1085. return 1;
  1086. }
  1087. int copyForL0EfficiencyPHSP(int Run){
  1088. for (auto& year : yearsMC(false,true,Run)){
  1089. if (copyForL0Efficiency(year,"up",false, false, true)==0) return 0;
  1090. if (copyForL0Efficiency(year,"down",false, false, true)==0) return 0;
  1091. }
  1092. return 1;
  1093. }
  1094. int copyForL0EfficiencyAll(int Run){
  1095. if (copyForL0EfficiencyData(Run)==0) return 0;
  1096. if (copyForL0EfficiencyMC(Run)==0) return 0;
  1097. if (copyForL0EfficiencyRefMC(Run)==0) return 0;
  1098. if (copyForL0EfficiencyPHSP(Run)==0) return 0;
  1099. return 1;
  1100. }