From 76db2c5dacc3e46b056e18118a909a50fd7aa884 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 25 Jun 2025 10:41:10 -0400 Subject: [PATCH 01/40] Added the angular distributions for W1->cs and W2->ud --- PostCutCode/Root/AnalysisWWCR.cxx | 621 +++--------------------------- 1 file changed, 45 insertions(+), 576 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 2c0efc2..41897dd 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -42,6 +42,13 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } +void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist) { + double phi = jet1.Angle(jet2.Vect()); + double cos_phi= cos(phi); + + hist->Fill(cos_phi); +} + void AnalysisWWCR::run() { @@ -54,19 +61,26 @@ void AnalysisWWCR::run() auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - auto cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - auto lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - auto lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - auto lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - auto cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - auto lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - auto lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - auto lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 300, 0, 150); auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 300, 0, 150); + auto h_cos_phi_cs = m_histContainer->get1DHist("h_cos_phi_cs", 300, -1, 1); + auto h_cos_phi_ud = m_histContainer->get1DHist("h_cos_phi_ud", 300, -1, 1); + auto h_cos_phi_cu = m_histContainer->get1DHist("h_cos_phi_cu", 300, -1, 1); + auto h_cos_phi_cd = m_histContainer->get1DHist("h_cos_phi_cd", 300, -1, 1); + auto h_cos_phi_su = m_histContainer->get1DHist("h_cos_phi_su", 300, -1, 1); + auto h_cos_phi_sd = m_histContainer->get1DHist("h_cos_phi_sd", 300, -1, 1); + // Get the trees auto treeCont = std::make_shared(); @@ -86,8 +100,6 @@ void AnalysisWWCR::run() varMember d_23 {tree, "d_23"}; varMember d_34 {tree, "d_34"}; - // varMember> truth_Wp_HS_e {tree, "truth_Wp_HS_e"}; - // reconstructed jets (for flavor tagger score) varMember> recojet_isB {tree, "recojet_isB"}; varMember> recojet_isC {tree, "recojet_isC"}; @@ -100,7 +112,6 @@ void AnalysisWWCR::run() // truth information varMember> truth_Wm_Daugthers_pdg {tree, "truth_Wm_Daugthers_pdg"}; varMember> truth_Wp_Daugthers_pdg {tree, "truth_Wp_Daugthers_pdg"}; - // varMember> truth_flav {tree, "jets_truth"}; // For the new input file varMember> jet_px {tree, "jet_px_corr"}; @@ -122,7 +133,7 @@ void AnalysisWWCR::run() int NdCutd34 = 0; int NdecayCuts = 0; - const int maxPrint = 50; + const int maxPrint = 25; int nPrinted = 0; bool do_debug = true; // Set to false to turn off all debug printing @@ -183,17 +194,6 @@ void AnalysisWWCR::run() } if (flage_toss) continue; - // ****************************** FOR USE WHEN S-TAG IS SEPERATE FROM THE LIGHT TAGS ****************************** - // float jet0_scoreQ = recojet_isU.at(0) < recojet_isD.at(0)? recojet_isD.at(0) :recojet_isU.at(0); - // float jet1_scoreQ = recojet_isU.at(1) < recojet_isD.at(1)? recojet_isD.at(1) :recojet_isU.at(1); - // float jet2_scoreQ = recojet_isU.at(2) < recojet_isD.at(2)? recojet_isD.at(2) :recojet_isU.at(2); - // float jet3_scoreQ = recojet_isU.at(3) < recojet_isD.at(3)? recojet_isD.at(3) :recojet_isU.at(3); - - // std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), recojet_isS.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; - // std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), recojet_isS.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; - // std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), recojet_isS.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; - // std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), recojet_isS.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); @@ -305,47 +305,25 @@ void AnalysisWWCR::run() } int n_c = 0; - // int n_s = 0; int n_l = 0; bool has_invalid_flavor = false; - // ****************************** FOR USE WHEN S-TAG IS SEPERATE FROM THE LIGHT TAGS ****************************** - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) n_c++; // c-tag - // else if (maxScoreIdx[i] == 2) n_s++; // s-tag - // else if (maxScoreIdx[i] == 3) n_l++; // light-tag - // } - for (int i = 0; i < 4; ++i) { - if (maxScoreIdx[i] == 1) n_c++; // c-tag - else if (maxScoreIdx[i] == 2) n_l++; // light-tag + if (maxScoreIdx[i] == 1) n_c++; + else if (maxScoreIdx[i] == 2) n_l++; } if (has_invalid_flavor) continue; - // if (!(n_c == 1 && n_s == 1 && n_l == 2)) continue; if (!(n_c == 1 && n_l == 3)) continue; - nFlavScore++; // Add this as a 3rd bin in cutflow + nFlavScore++; // Start Pairing the jets in W1 and W2 int cJet = -1; - // int sJet = -1; std::vector lJets; - // ****************************** FOR USE WHEN S-TAG IS SEPERATE FROM THE LIGHT TAGS ****************************** - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) cJet = i; - // else if (maxScoreIdx[i] == 2) sJet = i; - // else if (maxScoreIdx[i] == 3) lJets.push_back(i); - // } - - // if (cJet == -1 || sJet == -1 || lJets.size() != 2) { - // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // continue; - // } - for (int i = 0; i < 4; ++i) { if (maxScoreIdx[i] == 1) cJet = i; else if (maxScoreIdx[i] == 2) lJets.push_back(i); @@ -357,11 +335,9 @@ void AnalysisWWCR::run() } // W pair 1: c + s - // std::pair W1_pair = {cJet, sJet}; std::pair W1_pair = {cJet, lJets[0]}; // W pair 2: l + l - // std::pair W2_pair = {lJets[0], lJets[1]}; std::pair W2_pair = {lJets[1], lJets[2]}; if (do_debug && nPrinted < maxPrint) { @@ -371,30 +347,17 @@ void AnalysisWWCR::run() } // calculate the mass - // TLorentzVector cTag_Jet, sTag_Jet, lTag_Jet_0, lTag_Jet_1; TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - // sTag_Jet.SetPxPyPzE(jet_px.at(sJet), jet_py.at(sJet), jet_pz.at(sJet), jet_e.at(sJet)); - // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - // ************* THIS CALCULATES THE MASS WITH THE TRUTH JETS USING THE CHI^2 METHOD ************* - + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** const double m_W_true = 80.379; - // TLorentzVector W1_option1 = cTag_Jet + sTag_Jet; - // TLorentzVector W2_option1 = lTag_Jet_0 + lTag_Jet_1; - - // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_0; - // TLorentzVector W2_option2 = sTag_Jet + lTag_Jet_1; - - // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_1; - // TLorentzVector W2_option3 = sTag_Jet + lTag_Jet_0; - TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; @@ -427,36 +390,28 @@ void AnalysisWWCR::run() h_chi2->Fill(chi2_option3); } - // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - // h_W1_pt->Fill(W1_option1.Pt()); - // h_W2_pt->Fill(W2_option1.Pt()); - // // h_chi2_pt->Fill(chi2_option1); - // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - // h_W1_pt->Fill(W1_option2.Pt()); - // h_W2_pt->Fill(W2_option2.Pt()); - // // h_chi2_pt->Fill(chi2_option2); - // } else { - // h_W1_pt->Fill(W1_option3.Pt()); - // h_W2_pt->Fill(W2_option3.Pt()); - // // h_chi2_pt->Fill(chi2_option3); - // } - - // h_W1_pt->Fill(W1_option1.Pt()); - // h_W2_pt->Fill(W2_option1.Pt()); - - cJet_pt->Fill(cTag_Jet.Pt()); - lJet0_pt->Fill(lTag_Jet_0.Pt()); - lJet1_pt->Fill(lTag_Jet_1.Pt()); - lJet2_pt->Fill(lTag_Jet_2.Pt()); - - cJet_p->Fill(cTag_Jet.P()); - lJet0_p->Fill(lTag_Jet_0.P()); - lJet1_p->Fill(lTag_Jet_1.P()); - lJet2_p->Fill(lTag_Jet_2.P()); + // Calculates the transverse and total momentum for the jets + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + // Calculates the total momentum for W1 and W2 h_W1_p->Fill(W1_option1.P()); h_W2_p->Fill(W2_option1.P()); + // Angles between all the jets is W1_->cs and W2-->ud decay channels + CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_cs); + CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_ud); + CosPhi_Angle(cTag_Jet, lTag_Jet_1, h_cos_phi_cu); + CosPhi_Angle(cTag_Jet, lTag_Jet_2, h_cos_phi_cd); + CosPhi_Angle(lTag_Jet_0, lTag_Jet_1, h_cos_phi_su); + CosPhi_Angle(lTag_Jet_0, lTag_Jet_2, h_cos_phi_sd); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -470,489 +425,6 @@ void AnalysisWWCR::run() } - - - - - - - - - - // Main event loop - // for(int i = 0; i < nEntries; i++) - // { - // treeCont->getEntry(i); - // // Just to store how many events were run over - // countingHist->Fill(1); - // NEvents++; - - // // ROOT::VecOps::RVec* jet_truth = truth_flav(); - - // if(i % 10000 == 0) std::cout<<"Done i: "< j0_flav {recojet_isB.at(0), recojet_isC.at(0), recojet_isS.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; - // // std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), recojet_isS.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; - // // std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), recojet_isS.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; - // // std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), recojet_isS.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - - // float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); - // float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); - // float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); - // float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); - - // std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; - // std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; - // std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; - // std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - - // for (float j0_f : j0_flav) { - // if (std::isnan(j0_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j1_f : j1_flav) { - // if (std::isnan(j1_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j2_f : j2_flav) { - // if (std::isnan(j2_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j3_f : j3_flav) { - // if (std::isnan(j3_f)) { - // flage_toss = true; - // continue; - // } - // } - - // NokFlav++; - - // // cut on the number of electrons - // if (event_nmu() > 2.) continue; - // if (event_nel() > 2.) continue; - // if (muons_p() > 20.) continue; - // if (elecrons_p() > 20.) continue; - - // NleptonCut++; - - // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! - // if ((d_23()<=400.) || (d_23()>=18000.))continue; - // NdCutd123++; - // if ((d_34()<=100.) || (d_34()>=6000.))continue; - // NdCutd34++; - - // std::map> jetFlavScores; - // jetFlavScores[0] = j0_flav; - // jetFlavScores[1] = j1_flav; - // jetFlavScores[2] = j2_flav; - // jetFlavScores[3] = j3_flav; - - // std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; - - // if (do_debug && nPrinted < maxPrint) { - // std::cout << "========== Event " << eventNum << " ==========\n"; - - // // std::cout << "Truth Flavors: " << std::endl; - // // std::cout << "Jet 0 flavor = " << jet0_truth << std::endl; - // // std::cout << "Jet 1 flavor = " << jet1_truth << std::endl; - // // std::cout << "Jet 2 flavor = " << jet2_truth << std::endl; - // // std::cout << "Jet 3 flavor = " << jet3_truth << std::endl; - // // std::cout << " " << std::endl; - - // for (const auto& [jetIdx, flavVec] : jetFlavScores) { - // std::cout << "Jet " << jetIdx << " flavor scores:\n"; - // for (size_t i = 0; i < flavVec.size(); ++i) { - // std::cout << " " << flavLabels[i] << ": "; - // if (std::abs(flavVec[i]) < 1e-6) { - // std::cout << std::scientific << std::setprecision(2) << flavVec[i]; - // } else { - // std::cout << std::fixed << std::setprecision(6) << flavVec[i]; - // } - // std::cout << "\n"; - // } - // std::cout << "\n"; - // std::cout << std::endl; - // } - // std::cout << std::endl; - - // nPrinted++; // Count only after printing all blocks for this event - // } - - // eventNum++; - - // // Get the max flavor scores - // auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); - // auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); - // auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); - // auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); - - // int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); - // int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); - // int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); - // int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); - - // if (do_debug && nPrinted < maxPrint) { - // std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; - // std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; - // std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; - // std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; - // std::cout << " " << std::endl; - // } - - // std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; - - // if (nPrinted < maxPrint) { - // std::cout << "maxScoreIdx: "; - // for (int ScoreIdx : maxScoreIdx) { - // std::cout << ScoreIdx << " "; - // } - // std::cout << std::endl; - // std::cout << " " << std::endl; - // } - - // std::map> jetFlavMaxScore; - // for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ - // jetFlavMaxScore[maxScoreIdx[i]].push_back(i); - // } - - // int n_c = 0; - // // int n_s = 0; - // int n_l = 0; - - // bool has_invalid_flavor = false; - - // // ****************************** FOR USE WHEN S-TAG IS SEPERATE FROM THE LIGHT TAGS ****************************** - // // for (int i = 0; i < 4; ++i) { - // // if (maxScoreIdx[i] == 1) n_c++; // c-tag - // // else if (maxScoreIdx[i] == 2) n_s++; // s-tag - // // else if (maxScoreIdx[i] == 3) n_l++; // light-tag - // // } - - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) n_c++; // c-tag - // else if (maxScoreIdx[i] == 2) n_l++; // light-tag - // } - - // if (has_invalid_flavor) continue; - - // // if (!(n_c == 1 && n_s == 1 && n_l == 2)) continue; - // if (!(n_c == 1 && n_l == 3)) continue; - - // nFlavScore++; // Add this as a 3rd bin in cutflow - - // // Start Pairing the jets in W1 and W2 - // int cJet = -1; - // // int sJet = -1; - // std::vector lJets; - - - // // ****************************** FOR USE WHEN S-TAG IS SEPERATE FROM THE LIGHT TAGS ****************************** - // // for (int i = 0; i < 4; ++i) { - // // if (maxScoreIdx[i] == 1) cJet = i; - // // else if (maxScoreIdx[i] == 2) sJet = i; - // // else if (maxScoreIdx[i] == 3) lJets.push_back(i); - // // } - - // // if (cJet == -1 || sJet == -1 || lJets.size() != 2) { - // // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // // continue; - // // } - - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) cJet = i; - // else if (maxScoreIdx[i] == 2) lJets.push_back(i); - // } - - // if (cJet == -1 || lJets.size() != 3) { - // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // continue; - // } - - // // W pair 1: c + s - // std::pair W1_pair = {cJet, lJets[0]}; - - // // W pair 2: l + l - // std::pair W2_pair = {lJets[1], lJets[2]}; - - // if (do_debug && nPrinted < maxPrint) { - // std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; - // std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; - // std::cout << " " << std::endl; - // } - - // // calculate the mass - // // TLorentzVector cTag_Jet, sTag_Jet, lTag_Jet_0, lTag_Jet_1; - // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; - - // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - // // sTag_Jet.SetPxPyPzE(jet_px.at(sJet), jet_py.at(sJet), jet_py.at(sJet), jet_e.at(sJet)); - - // // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_py.at(lJets[0]), jet_e.at(lJets[0])); - // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - - // // ************* THIS CALCULATES THE MASS WITH THE TRUTH JETS USING THE CHI^2 METHOD ************* - - // const double m_W_true = 80.379; - - // // TLorentzVector W1_option1 = cTag_Jet + sTag_Jet; - // // TLorentzVector W2_option1 = lTag_Jet_0 + lTag_Jet_1; - - // // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_0; - // // TLorentzVector W2_option2 = sTag_Jet + lTag_Jet_1; - - // // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_1; - // // TLorentzVector W2_option3 = sTag_Jet + lTag_Jet_0; - - // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; - - // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; - - // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; - - // double chi2_option1 = - // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - - // double chi2_option2 = - // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - - // double chi2_option3 = - // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - - // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - // h_W1_mass->Fill(W1_option1.M()); - // h_W2_mass->Fill(W2_option1.M()); - // h_chi2->Fill(chi2_option1); - // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - // h_W1_mass->Fill(W1_option2.M()); - // h_W2_mass->Fill(W2_option2.M()); - // h_chi2->Fill(chi2_option2); - // } else { - // h_W1_mass->Fill(W1_option3.M()); - // h_W2_mass->Fill(W2_option3.M()); - // h_chi2->Fill(chi2_option3); - // } - - - // // // **************************** THIS CALCULATES THE MASS WITH THE TRUTH JETS **************************** - // // // Pair the truth jets - // // int nTruth_c = 0; - // // int nTruth_s = 0; - // // int nTruth_u = 0; - // // int nTruth_d = 0; - - // // bool truth_has_invalid_flavor = false; - - // // for (int i = 0; i < 4; ++i) { - // // int flav = jet_truth->at(i); - - // // // PDG flavor codes for quarks and anti-quarks: - // // if (flav == 4 || flav == -4) nTruth_c++; - // // else if (flav == 3 || flav == -3) nTruth_s++; - // // else if (flav == 2 || flav == -2) nTruth_u++; - // // else if (flav == 1 || flav == -1) nTruth_d++; - // // else { - // // truth_has_invalid_flavor = true; - // // break; // stop counting if invalid flavor found - // // } - // // } - - // // if (truth_has_invalid_flavor) continue; - - // // if (!(nTruth_c == 1 && nTruth_s == 1 && nTruth_u == 1 && nTruth_d == 1)) continue; - - // // nFlavScore_truth++; - - // // int cJet_truth = -1; - // // int sJet_truth = -1; - // // int uJet_truth = -1; - // // int dJet_truth = -1; - - // // for (int i = 0; i < 4; ++i) {1 - // // int flav = jet_truth->at(i); - - // // if (flav == 4 || flav == -4) cJet_truth = i; - // // else if (flav == 3 || flav == -3) sJet_truth = i; - // // else if (flav == 2 || flav == -2) uJet_truth = i; - // // else if (flav == 1 || flav == -1) dJet_truth = i; - // // } - - // // if (cJet_truth == -1 || sJet_truth == -1 || uJet_truth == -1 || dJet_truth == -1) { - // // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // // continue; - // // } - - // // // ************* LOOKS AT EVENTS WITH THE PAIRS (U, D, S, C) AND (U, D, C, C) ************* - - // // // if (!((nTruth_c == 1 && nTruth_s == 1 && nTruth_u == 1 && nTruth_d == 1) || - // // // (nTruth_c == 2 && nTruth_u == 1 && nTruth_d == 1))) - // // // continue; - - // // // nFlavScore_truth++; - - // // // int cJet1_truth = -1; - // // // int cJet2_truth = -1; - // // // int sJet_truth = -1; - // // // int uJet_truth = -1; - // // // int dJet_truth = -1; - - // // // int c_count = 0; - - // // // for (int i = 0; i < 4; ++i) { - // // // int flav = jet_truth->at(i); - - // // // if (flav == 4 || flav == -4) { - // // // if (c_count == 0) cJet1_truth = i; - // // // else if (c_count == 1) cJet2_truth = i; - // // // c_count++; - // // // } - // // // else if (flav == 3 || flav == -3) sJet_truth = i; - // // // else if (flav == 2 || flav == -2) uJet_truth = i; - // // // else if (flav == 1 || flav == -1) dJet_truth = i; - // // // } - - // // // if (!( - // // // (c_count == 1 && sJet_truth != -1 && uJet_truth != -1 && dJet_truth != -1) // case 1 - // // // || - // // // (c_count == 2 && uJet_truth != -1 && dJet_truth != -1) // case 2 - // // // )) - // // // { - // // // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // // // continue; - // // // } - - // // // ************************************ END OF EDITS ************************************ - - - // // // W pair 1: c + s - // // std::pair W1_pair_truth = {cJet_truth, sJet_truth}; - - // // // W pair 2: u + d - // // std::pair W2_pair_truth = {uJet_truth, dJet_truth}; - - // // if (do_debug && nPrinted < maxPrint) { - // // std::cout << "W1 pair: Jet " << W1_pair_truth.first << " (c), Jet " << W1_pair_truth.second << " (s)" << std::endl; - // // std::cout << "W2 pair: Jet " << W2_pair_truth.first << " (u), Jet " << W2_pair_truth.second << " (d)" << std::endl; - // // std::cout << " " << std::endl; - // // } - - // // // calculate the mass - // // TLorentzVector cTag_truthJet, sTag_truthJet, uTag_truthJet, dTag_truthJet; - - // // cTag_truthJet.SetPxPyPzE(jet_px.at(cJet_truth), jet_py.at(cJet_truth), jet_py.at(cJet_truth), jet_e.at(cJet_truth)); - // // sTag_truthJet.SetPxPyPzE(jet_px.at(sJet_truth), jet_py.at(sJet_truth), jet_py.at(sJet_truth), jet_e.at(sJet_truth)); - // // uTag_truthJet.SetPxPyPzE(jet_px.at(uJet_truth), jet_py.at(uJet_truth), jet_py.at(uJet_truth), jet_e.at(uJet_truth)); - // // dTag_truthJet.SetPxPyPzE(jet_px.at(dJet_truth), jet_py.at(dJet_truth), jet_py.at(dJet_truth), jet_e.at(dJet_truth)); - - - // // // TLorentzVector W1_truth = cTag_truthJet + sTag_truthJet; - // // // TLorentzVector W2_truth = uTag_truthJet + dTag_truthJet; - - // // // h_W1_truth_mass->Fill(W1_truth.M()); - // // // h_W2_truth_mass->Fill(W2_truth.M()); - - // // // if (do_debug && nPrinted < maxPrint) { - // // // std::cout << "W1 mass: " << W1_truth.M() << " GeV" << std::endl; - // // // std::cout << "W2 mass: " << W2_truth.M() << " GeV" << std::endl; - // // // std::cout << " " << std::endl; - // // // } - - - // // // ************* THIS CALCULATES THE MASS WITH THE TRUTH JETS USING THE CHI^2 METHOD ************* - - // // const double m_W_true = 80.379; - // // // const double sigma_W = 10.0; <-- should this be the mass of W in the chi^2 calculations - - // // TLorentzVector W1_option1 = cTag_truthJet + sTag_truthJet; - // // TLorentzVector W2_option1 = uTag_truthJet + dTag_truthJet; - - // // TLorentzVector W1_option2 = cTag_truthJet + dTag_truthJet; - // // TLorentzVector W2_option2 = uTag_truthJet + sTag_truthJet; - - // // TLorentzVector W1_option3 = cTag_truthJet + uTag_truthJet; - // // TLorentzVector W2_option3 = sTag_truthJet + dTag_truthJet; - - // // // double chi2_option1 = - // // // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)); - - // // // double chi2_option2 = - // // // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)); - - // // double chi2_option1 = - // // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - - // // double chi2_option2 = - // // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - - // // double chi2_option3 = - // // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - - // // // double chi2_option1 = - // // // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (sigma_W * sigma_W); - - // // // double chi2_option2 = - // // // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (sigma_W * sigma_W); - - // // if (chi2_option1 <= chi2_option2) { - // // // Option 1 is chosen - // // h_W1_truth_mass->Fill(W1_option1.M()); - // // h_W2_truth_mass->Fill(W2_option1.M()); - // // h_chi2_truth->Fill(chi2_option1); - // // } else if (chi2_option2 <= chi2_option3) { - // // // Option 2 is chosen - // // h_W1_truth_mass->Fill(W1_option2.M()); - // // h_W2_truth_mass->Fill(W2_option2.M()); - // // h_chi2_truth->Fill(chi2_option2); - // // } else { - // // // Option 2 is chosen - // // h_W1_truth_mass->Fill(W1_option3.M()); - // // h_W2_truth_mass->Fill(W2_option3.M()); - // // h_chi2_truth->Fill(chi2_option3); - // // } - - // // // ************************************ END OF EDITS ************************************ - - - - - // // Fill the histograms - // // truth_W_e->Fill(truth_Wp_HS_e.at(0)); - - // // cutflow histograms - // cutFlowHist->SetBinContent(1, NEvents); - // cutFlowHist->SetBinContent(2, NokFlav); - // cutFlowHist->SetBinContent(3, NjetCut); - // cutFlowHist->SetBinContent(4, NleptonCut); - // cutFlowHist->SetBinContent(5, NdCutd123); - // cutFlowHist->SetBinContent(6, nFlavScore); - // } - std::cout << " " << std::endl; std::cout << "-------------------- Outputs --------------------" << std::endl; std::cout << "Number of events: " << NEvents << std::endl; @@ -961,9 +433,6 @@ void AnalysisWWCR::run() std::cout << "Number of Leptons Cut: " << NleptonCut << std::endl; std::cout << "Number of events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore << std::endl; std::cout << " " << std::endl; - // std::cout << "----------------- Truth Events ------------------" << std::endl; - // std::cout << "Number of truth events: " << NEvents_truth << std::endl; - // std::cout << "Number of truth events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore_truth << std::endl; std::cout << " " << std::endl; std::cout << "Let there be data!" << std::endl; From bbdae2750017c3c2f8339357cec42f5d17a1057e Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 30 Jun 2025 07:50:42 -0400 Subject: [PATCH 02/40] cos(phi) calculations with truth variables --- PostCutCode/Root/AnalysisWWCR.cxx | 593 ++++++++++++++++++------------ 1 file changed, 366 insertions(+), 227 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 41897dd..dd376e5 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -26,6 +26,7 @@ struct QuarkCounter { int n_s = 0; int n_u = 0; int n_d = 0; + int n_b = 0; }; QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { @@ -34,6 +35,7 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { for (size_t i = 0; i < jet_truth->size(); ++i) { int pdg_code = std::abs(jet_truth->at(i)); + if (pdg_code == 5) counter.n_b++; if (pdg_code == 4) counter.n_c++; if (pdg_code == 3) counter.n_s++; if (pdg_code == 2) counter.n_u++; @@ -42,6 +44,41 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } +// struct Reco_wPair { +// TLorentzVector W1; +// TLorentzVector W2; +// double chi2; +// }; + +// Reco_wPair Chi2_wMass(const TLorentzVector& cTag_Jet, +// const TLorentzVector& lTag_Jet_0, +// const TLorentzVector& lTag_Jet_1, +// const TLorentzVector& lTag_Jet_2, +// double m_W_true = 80.379) { + +// // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* +// std::vector> pairings = { +// {cTag_Jet + lTag_Jet_0, lTag_Jet_1 + lTag_Jet_2}, +// {cTag_Jet + lTag_Jet_1, lTag_Jet_0 + lTag_Jet_2}, +// {cTag_Jet + lTag_Jet_2, lTag_Jet_0 + lTag_Jet_1} + +// // {lTag_Jet_1 + lTag_Jet_2, lTag_Jet_1 + lTag_Jet_2}, +// }; + +// Reco_wPair best_result; +// best_result.chi2 = std::numeric_limits::max(); + +// for (const auto& [W1, W2] : pairings) { +// double chi2 = (pow(W1.M() - m_W_true, 2) + pow(W2.M() - m_W_true, 2)) / (m_W_true); + +// if (chi2 < best_result.chi2) { +// best_result = {W1, W2, chi2}; +// } +// } + +// return best_result; +// } + void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist) { double phi = jet1.Angle(jet2.Vect()); double cos_phi= cos(phi); @@ -57,29 +94,46 @@ void AnalysisWWCR::run() // Get the histograms auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); + + // ******************* TRUTH HISTOGRAMS ******************* auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); - auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - - auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - - auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 300, 0, 150); auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 300, 0, 150); - auto h_cos_phi_cs = m_histContainer->get1DHist("h_cos_phi_cs", 300, -1, 1); - auto h_cos_phi_ud = m_histContainer->get1DHist("h_cos_phi_ud", 300, -1, 1); - auto h_cos_phi_cu = m_histContainer->get1DHist("h_cos_phi_cu", 300, -1, 1); - auto h_cos_phi_cd = m_histContainer->get1DHist("h_cos_phi_cd", 300, -1, 1); - auto h_cos_phi_su = m_histContainer->get1DHist("h_cos_phi_su", 300, -1, 1); - auto h_cos_phi_sd = m_histContainer->get1DHist("h_cos_phi_sd", 300, -1, 1); + auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); + auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); + + // auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); + // auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + // auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); + + // auto h_W1_flavor = m_histContainer->get1DHist("h_W1_flavor", 4, 0, 4); + // auto h_W2_flavor = m_histContainer->get1DHist("h_W2_flavor", 4, 0, 4); + + // auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + // auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + // auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + // auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + + // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + + // auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 300, 0, 150); + // auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 300, 0, 150); + + // auto h_cos_phi_c_s = m_histContainer->get1DHist("h_cos_phi_c_s", 150, -1, 1); + // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); + // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); + // auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); + // auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); + + // auto h_W1_cos_phi_l1_l2 = m_histContainer->get1DHist("h_W1_cos_phi_l1_l2", 150, -1, 1); + // auto h_W2_cos_phi_l1_l2 = m_histContainer->get1DHist("h_W2_cos_phi_l1_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -122,6 +176,17 @@ void AnalysisWWCR::run() ROOT::VecOps::RVec* Wm_jet_truth = truth_Wm_Daugthers_pdg(); ROOT::VecOps::RVec* Wp_jet_truth = truth_Wp_Daugthers_pdg(); + varMember> truth_Wm_p {tree, "truth_Wm_Daugthers_p"}; + varMember> truth_Wm_e {tree, "truth_Wm_Daugthers_e"}; + varMember> truth_Wm_theta {tree, "truth_Wm_Daugthers_theta"}; + varMember> truth_Wm_phi {tree, "truth_Wm_Daugthers_phi"}; + + varMember> truth_Wp_p {tree, "truth_Wp_Daugthers_p"}; + varMember> truth_Wp_e {tree, "truth_Wp_Daugthers_e"}; + varMember> truth_Wp_theta {tree, "truth_Wp_Daugthers_theta"}; + varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; + + // Increment for CutFlow int NEvents = 0; int NokFlav = 0; @@ -177,9 +242,9 @@ void AnalysisWWCR::run() bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); if (! ( - (W1_is_cs && W2_is_ud) || - (W1_is_ud && W2_is_ud) || - (W1_is_cs && W2_is_cs) + // (W1_is_cs && W2_is_ud) + (W1_is_ud && W2_is_ud) + // (W1_is_cs && W2_is_cs) )) continue; NdecayCuts++; @@ -188,230 +253,304 @@ void AnalysisWWCR::run() if(event_njet() != 4) continue; NjetCut++; - bool flage_toss = false; - if (recojet_isB.size() == 0){ - flage_toss = true; - } - if (flage_toss) continue; - - float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); - float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); - float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); - float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); - - std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; - std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; - std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; - std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - - for (float j0_f : j0_flav) { - if (std::isnan(j0_f)) { - flage_toss = true; - continue; - } - } - for (float j1_f : j1_flav) { - if (std::isnan(j1_f)) { - flage_toss = true; - continue; - } - } - for (float j2_f : j2_flav) { - if (std::isnan(j2_f)) { - flage_toss = true; - continue; - } - } - for (float j3_f : j3_flav) { - if (std::isnan(j3_f)) { - flage_toss = true; - continue; - } - } - - NokFlav++; - - // cut on the number of electrons - if (event_nmu() > 2.) continue; - if (event_nel() > 2.) continue; - if (muons_p() > 20.) continue; - if (elecrons_p() > 20.) continue; + // ****************************** CALCULATIONS USING TRUTH VARIABLES ****************************** + std::vector truthJets_Wm, truthJets_Wp; - NleptonCut++; + for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { + float p = truth_Wm_p()->at(i); + float e = truth_Wm_e()->at(i); + float theta = truth_Wm_theta()->at(i); + float phi = truth_Wm_phi()->at(i); - // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! - // if ((d_23()<=400.) || (d_23()>=18000.))continue; - // NdCutd123++; - // if ((d_34()<=100.) || (d_34()>=6000.))continue; - // NdCutd34++; + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector lv; - std::map> jetFlavScores; - jetFlavScores[0] = j0_flav; - jetFlavScores[1] = j1_flav; - jetFlavScores[2] = j2_flav; - jetFlavScores[3] = j3_flav; - - std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; - - if (do_debug && nPrinted < maxPrint) { - for (const auto& [jetIdx, flavVec] : jetFlavScores) { - std::cout << "Jet " << jetIdx << " flavor scores:\n"; - for (size_t i = 0; i < flavVec.size(); ++i) { - std::cout << " " << flavLabels[i] << ": "; - if (std::abs(flavVec[i]) < 1e-6) { - std::cout << std::scientific << std::setprecision(2) << flavVec[i]; - } else { - std::cout << std::fixed << std::setprecision(6) << flavVec[i]; - } - std::cout << "\n"; - } - std::cout << std::endl; - } - } - - // Get the max flavor scores - auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); - auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); - auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); - auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); - - int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); - int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); - int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); - int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); - - if (do_debug && nPrinted < maxPrint) { - std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; - std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; - std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; - std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; - std::cout << " " << std::endl; - } - - std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; - - if (nPrinted < maxPrint) { - std::cout << "maxScoreIdx: "; - for (int ScoreIdx : maxScoreIdx) { - std::cout << ScoreIdx << " "; - } - std::cout << std::endl; - std::cout << " " << std::endl; - } - - std::map> jetFlavMaxScore; - for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ - jetFlavMaxScore[maxScoreIdx[i]].push_back(i); + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wm.push_back(lv); } - int n_c = 0; - int n_l = 0; + for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { + float p = truth_Wp_p()->at(i); + float e = truth_Wp_e()->at(i); + float theta = truth_Wp_theta()->at(i); + float phi = truth_Wp_phi()->at(i); - bool has_invalid_flavor = false; + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector lv; - for (int i = 0; i < 4; ++i) { - if (maxScoreIdx[i] == 1) n_c++; - else if (maxScoreIdx[i] == 2) n_l++; + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wp.push_back(lv); } - if (has_invalid_flavor) continue; + if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { + TLorentzVector W1_jet1 = truthJets_Wm[0]; + TLorentzVector W1_jet2 = truthJets_Wm[1]; + TLorentzVector W2_jet1 = truthJets_Wp[0]; + TLorentzVector W2_jet2 = truthJets_Wp[1]; - if (!(n_c == 1 && n_l == 3)) continue; + TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; + TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; - nFlavScore++; + h_W1_mass->Fill(W1_truthJet.M()); + h_W2_mass->Fill(W2_truthJet.M()); - // Start Pairing the jets in W1 and W2 - int cJet = -1; - std::vector lJets; + h_W1_p->Fill(W1_truthJet.P()); + h_W2_p->Fill(W2_truthJet.P()); - for (int i = 0; i < 4; ++i) { - if (maxScoreIdx[i] == 1) cJet = i; - else if (maxScoreIdx[i] == 2) lJets.push_back(i); + CosPhi_Angle(W1_jet1, W1_jet2, h_cos_phi_truth_cs); + CosPhi_Angle(W2_jet1, W2_jet2, h_cos_phi_truth_ud); } - if (cJet == -1 || lJets.size() != 3) { - std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - continue; - } - - // W pair 1: c + s - std::pair W1_pair = {cJet, lJets[0]}; - - // W pair 2: l + l - std::pair W2_pair = {lJets[1], lJets[2]}; - - if (do_debug && nPrinted < maxPrint) { - std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; - std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; - std::cout << " " << std::endl; - } - - // calculate the mass - TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; - - cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + // if (W1_is_cs) h_W1_flavor->Fill(0); // cs + // else if (W1_is_ud) h_W1_flavor->Fill(1); // ud + // else h_W1_flavor->Fill(3); // something else + + // if (W2_is_cs) h_W2_flavor->Fill(0); + // else if (W2_is_ud) h_W2_flavor->Fill(1); + // else h_W2_flavor->Fill(3); + + + // *************************** END OF CALCULATIONS USING TRUTH VARIABLES *************************** + + // bool flage_toss = false; + // if (recojet_isB.size() == 0){ + // flage_toss = true; + // } + // if (flage_toss) continue; + + // float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); + // float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); + // float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); + // float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); + + // std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; + // std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; + // std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; + // std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; + + // for (float j0_f : j0_flav) { + // if (std::isnan(j0_f)) { + // flage_toss = true; + // continue; + // } + // } + // for (float j1_f : j1_flav) { + // if (std::isnan(j1_f)) { + // flage_toss = true; + // continue; + // } + // } + // for (float j2_f : j2_flav) { + // if (std::isnan(j2_f)) { + // flage_toss = true; + // continue; + // } + // } + // for (float j3_f : j3_flav) { + // if (std::isnan(j3_f)) { + // flage_toss = true; + // continue; + // } + // } + + // NokFlav++; + + // // cut on the number of electrons + // if (event_nmu() > 2.) continue; + // if (event_nel() > 2.) continue; + // if (muons_p() > 20.) continue; + // if (elecrons_p() > 20.) continue; + + // NleptonCut++; + + // // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! + // // if ((d_23()<=400.) || (d_23()>=18000.))continue; + // // NdCutd123++; + // // if ((d_34()<=100.) || (d_34()>=6000.))continue; + // // NdCutd34++; + + // std::map> jetFlavScores; + // jetFlavScores[0] = j0_flav; + // jetFlavScores[1] = j1_flav; + // jetFlavScores[2] = j2_flav; + // jetFlavScores[3] = j3_flav; + + // std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; + + // if (do_debug && nPrinted < maxPrint) { + // for (const auto& [jetIdx, flavVec] : jetFlavScores) { + // std::cout << "Jet " << jetIdx << " flavor scores:\n"; + // for (size_t i = 0; i < flavVec.size(); ++i) { + // std::cout << " " << flavLabels[i] << ": "; + // if (std::abs(flavVec[i]) < 1e-6) { + // std::cout << std::scientific << std::setprecision(2) << flavVec[i]; + // } else { + // std::cout << std::fixed << std::setprecision(6) << flavVec[i]; + // } + // std::cout << "\n"; + // } + // std::cout << std::endl; + // } + // } + + // // Get the max flavor scores + // auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); + // auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); + // auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); + // auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); + + // int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); + // int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); + // int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); + // int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); + + // if (do_debug && nPrinted < maxPrint) { + // std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; + // std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; + // std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; + // std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; + // std::cout << " " << std::endl; + // } + + // std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; + + // if (nPrinted < maxPrint) { + // std::cout << "maxScoreIdx: "; + // for (int ScoreIdx : maxScoreIdx) { + // std::cout << ScoreIdx << " "; + // } + // std::cout << std::endl; + // std::cout << " " << std::endl; + // } + + // std::map> jetFlavMaxScore; + // for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ + // jetFlavMaxScore[maxScoreIdx[i]].push_back(i); + // } + + // int n_c = 0; + // int n_l = 0; + // // int n_b = 0; + + // bool has_invalid_flavor = false; + + // for (int i = 0; i < 4; ++i) { + // if (maxScoreIdx[i] == 1) n_c++; + // else if (maxScoreIdx[i] == 2) n_l++; + // } + + // if (has_invalid_flavor) continue; + + // if (!(n_c == 1 && n_l == 3)) continue; + + // nFlavScore++; + + // // Start Pairing the jets in W1 and W2 + // int cJet = -1; + // std::vector lJets; + + // for (int i = 0; i < 4; ++i) { + // if (maxScoreIdx[i] == 1) cJet = i; + // else if (maxScoreIdx[i] == 2) lJets.push_back(i); + // } + + // if (cJet == -1 || lJets.size() != 3) { + // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; + // continue; + // } + + // // W pair 1: c + s and u+d + // std::pair W1_pair = {cJet, lJets[0]}; + // std::pair W2_pair = {lJets[1], lJets[2]}; + + // if (do_debug && nPrinted < maxPrint) { + // std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; + // std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; + // std::cout << " " << std::endl; + // } + + // // calculate the mass + // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + + // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + + // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])) + + + // // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** + // const double m_W_true = 80.379; + + // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; + // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + + // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; + // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + + // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; + // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + + // double chi2_option1 = + // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); + + // double chi2_option2 = + // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); + + // double chi2_option3 = + // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + + // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { + // h_W1_mass->Fill(W1_option1.M()); + // h_W2_mass->Fill(W2_option1.M()); + // h_chi2->Fill(chi2_option1); + // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { + // h_W1_mass->Fill(W1_option2.M()); + // h_W2_mass->Fill(W2_option2.M()); + // h_chi2->Fill(chi2_option2); + // } else { + // h_W1_mass->Fill(W1_option3.M()); + // h_W2_mass->Fill(W2_option3.M()); + // h_chi2->Fill(chi2_option3); + // } + + // // Reco_wPair result = Chi2_wMass(cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2); + // // Reco_wPair result = Chi2_wMass(lTag_Jet_1, lTag_Jet_1, lTag_Jet_1, lTag_Jet_2); + + // // h_W1_mass->Fill(result.W1.M()); + // // h_W2_mass->Fill(result.W2.M()); + // // h_chi2->Fill(result.chi2); - lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); + // h_W1_p->Fill(W1_option1.P()); + // h_W2_p->Fill(W2_option1.P()); - // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** - const double m_W_true = 80.379; - - TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; - - TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; - - TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; - - double chi2_option1 = - (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - - double chi2_option2 = - (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - - double chi2_option3 = - (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - - if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - h_W1_mass->Fill(W1_option1.M()); - h_W2_mass->Fill(W2_option1.M()); - h_chi2->Fill(chi2_option1); - } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - h_W1_mass->Fill(W1_option2.M()); - h_W2_mass->Fill(W2_option2.M()); - h_chi2->Fill(chi2_option2); - } else { - h_W1_mass->Fill(W1_option3.M()); - h_W2_mass->Fill(W2_option3.M()); - h_chi2->Fill(chi2_option3); - } + // // Calculates the transverse and total momentum for the jets + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - // Calculates the transverse and total momentum for the jets - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); - - // Calculates the total momentum for W1 and W2 - h_W1_p->Fill(W1_option1.P()); - h_W2_p->Fill(W2_option1.P()); - - // Angles between all the jets is W1_->cs and W2-->ud decay channels - CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_cs); - CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_ud); - CosPhi_Angle(cTag_Jet, lTag_Jet_1, h_cos_phi_cu); - CosPhi_Angle(cTag_Jet, lTag_Jet_2, h_cos_phi_cd); - CosPhi_Angle(lTag_Jet_0, lTag_Jet_1, h_cos_phi_su); - CosPhi_Angle(lTag_Jet_0, lTag_Jet_2, h_cos_phi_sd); + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); + + // // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + // CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); + // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + // CosPhi_Angle(cTag_Jet, lTag_Jet_1, h_cos_phi_c_l1); + // CosPhi_Angle(cTag_Jet, lTag_Jet_2, h_cos_phi_c_l2); + // CosPhi_Angle(lTag_Jet_0, lTag_Jet_1, h_cos_phi_s_l1); + // CosPhi_Angle(lTag_Jet_0, lTag_Jet_2, h_cos_phi_s_l2); + + // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_W1_cos_phi_l1_l2); + // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_W2_cos_phi_l1_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -435,7 +574,7 @@ void AnalysisWWCR::run() std::cout << " " << std::endl; std::cout << " " << std::endl; - std::cout << "Let there be data!" << std::endl; + std::cout << "Let there be data :)" << std::endl; // end of macro From 7467d6551fb721fb45b90d605ab291b57c082827 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 30 Jun 2025 14:45:41 -0400 Subject: [PATCH 03/40] uncommented the recojets and added all variables to chi2 --- PostCutCode/Root/AnalysisWWCR.cxx | 595 +++++++++++++++++------------- 1 file changed, 334 insertions(+), 261 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index dd376e5..c7638aa 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -9,6 +9,7 @@ #include "TH1F.h" #include "TCanvas.h" +#include using namespace std; @@ -96,37 +97,41 @@ void AnalysisWWCR::run() auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); // ******************* TRUTH HISTOGRAMS ******************* - auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); - auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); + auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); + + auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); + auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); - auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 300, 0, 150); - auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 300, 0, 150); + auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); + auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); - // auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); - // auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); - // auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); + // ******************* RECOJET HISTOGRAMS ******************* + auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); + auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - // auto h_W1_flavor = m_histContainer->get1DHist("h_W1_flavor", 4, 0, 4); - // auto h_W2_flavor = m_histContainer->get1DHist("h_W2_flavor", 4, 0, 4); + auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - // auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - // auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - // auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - // auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); - // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); + auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); - // auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 300, 0, 150); - // auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 300, 0, 150); + auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); + auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - // auto h_cos_phi_c_s = m_histContainer->get1DHist("h_cos_phi_c_s", 150, -1, 1); - // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + auto h_cos_phi_c_s = m_histContainer->get1DHist("h_cos_phi_c_s", 150, -1, 1); + auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); // auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); @@ -236,14 +241,14 @@ void AnalysisWWCR::run() QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); - bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + // bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); - bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); + // bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); if (! ( - // (W1_is_cs && W2_is_ud) - (W1_is_ud && W2_is_ud) + (W1_is_cs && W2_is_ud) + // (W1_is_ud && W2_is_ud) // (W1_is_cs && W2_is_cs) )) continue; @@ -297,253 +302,321 @@ void AnalysisWWCR::run() TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; - h_W1_mass->Fill(W1_truthJet.M()); - h_W2_mass->Fill(W2_truthJet.M()); + h_W1_truth_mass->Fill(W1_truthJet.M()); + h_W2_truth_mass->Fill(W2_truthJet.M()); + + h_W1_truth_p->Fill(W1_truthJet.P()); + h_W2_truth_p->Fill(W2_truthJet.P()); - h_W1_p->Fill(W1_truthJet.P()); - h_W2_p->Fill(W2_truthJet.P()); + h_W1_truth_e->Fill(W1_truthJet.E()); + h_W2_truth_e->Fill(W2_truthJet.E()); CosPhi_Angle(W1_jet1, W1_jet2, h_cos_phi_truth_cs); CosPhi_Angle(W2_jet1, W2_jet2, h_cos_phi_truth_ud); } - // if (W1_is_cs) h_W1_flavor->Fill(0); // cs - // else if (W1_is_ud) h_W1_flavor->Fill(1); // ud - // else h_W1_flavor->Fill(3); // something else + // *************************** END OF CALCULATIONS USING TRUTH VARIABLES *************************** - // if (W2_is_cs) h_W2_flavor->Fill(0); - // else if (W2_is_ud) h_W2_flavor->Fill(1); - // else h_W2_flavor->Fill(3); + bool flage_toss = false; + if (recojet_isB.size() == 0){ + flage_toss = true; + } + if (flage_toss) continue; + + float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); + float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); + float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); + float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); + + std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; + std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; + std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; + std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; + + for (float j0_f : j0_flav) { + if (std::isnan(j0_f)) { + flage_toss = true; + continue; + } + } + for (float j1_f : j1_flav) { + if (std::isnan(j1_f)) { + flage_toss = true; + continue; + } + } + for (float j2_f : j2_flav) { + if (std::isnan(j2_f)) { + flage_toss = true; + continue; + } + } + for (float j3_f : j3_flav) { + if (std::isnan(j3_f)) { + flage_toss = true; + continue; + } + } + NokFlav++; - // *************************** END OF CALCULATIONS USING TRUTH VARIABLES *************************** + // cut on the number of electrons + if (event_nmu() > 2.) continue; + if (event_nel() > 2.) continue; + if (muons_p() > 20.) continue; + if (elecrons_p() > 20.) continue; + + NleptonCut++; + + // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! + // if ((d_23()<=400.) || (d_23()>=18000.))continue; + // NdCutd123++; + // if ((d_34()<=100.) || (d_34()>=6000.))continue; + // NdCutd34++; + + std::map> jetFlavScores; + jetFlavScores[0] = j0_flav; + jetFlavScores[1] = j1_flav; + jetFlavScores[2] = j2_flav; + jetFlavScores[3] = j3_flav; + + std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; + + if (do_debug && nPrinted < maxPrint) { + for (const auto& [jetIdx, flavVec] : jetFlavScores) { + std::cout << "Jet " << jetIdx << " flavor scores:\n"; + for (size_t i = 0; i < flavVec.size(); ++i) { + std::cout << " " << flavLabels[i] << ": "; + if (std::abs(flavVec[i]) < 1e-6) { + std::cout << std::scientific << std::setprecision(2) << flavVec[i]; + } else { + std::cout << std::fixed << std::setprecision(6) << flavVec[i]; + } + std::cout << "\n"; + } + std::cout << std::endl; + } + } + + // Get the max flavor scores + auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); + auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); + auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); + auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); + + int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); + int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); + int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); + int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); + + if (do_debug && nPrinted < maxPrint) { + std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; + std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; + std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; + std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; + std::cout << " " << std::endl; + } + + std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; + + if (nPrinted < maxPrint) { + std::cout << "maxScoreIdx: "; + for (int ScoreIdx : maxScoreIdx) { + std::cout << ScoreIdx << " "; + } + std::cout << std::endl; + std::cout << " " << std::endl; + } + + std::map> jetFlavMaxScore; + for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ + jetFlavMaxScore[maxScoreIdx[i]].push_back(i); + } + + int n_c = 0; + int n_l = 0; + // int n_b = 0; + + bool has_invalid_flavor = false; + + for (int i = 0; i < 4; ++i) { + if (maxScoreIdx[i] == 1) n_c++; + else if (maxScoreIdx[i] == 2) n_l++; + } + + if (has_invalid_flavor) continue; + + if (!(n_c == 1 && n_l == 3)) continue; + + nFlavScore++; + + // Start Pairing the jets in W1 and W2 + int cJet = -1; + std::vector lJets; + + for (int i = 0; i < 4; ++i) { + if (maxScoreIdx[i] == 1) cJet = i; + else if (maxScoreIdx[i] == 2) lJets.push_back(i); + } + + // if (cJet == -1 || lJets.size() != 3) { + // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; + // continue; + + // // continue; + // } + + // Prevent jet reuse: ensure all jet indices are unique + std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; + + if (cJet == -1 || lJets.size() != 3 || uniqueJets.size() < 4) { + if (cJet == lJets[0] && cJet == lJets[1] && cJet == lJets[2] && + lJets[0] == lJets[1] && lJets[0] == lJets[2] && lJets[1] == lJets[2]) { + + std::cerr << "Error: Jet reuse detected or invalid jet assignment!" << std::endl; + continue; - // bool flage_toss = false; - // if (recojet_isB.size() == 0){ - // flage_toss = true; - // } - // if (flage_toss) continue; - - // float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); - // float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); - // float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); - // float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); - - // std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; - // std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; - // std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; - // std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - - // for (float j0_f : j0_flav) { - // if (std::isnan(j0_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j1_f : j1_flav) { - // if (std::isnan(j1_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j2_f : j2_flav) { - // if (std::isnan(j2_f)) { - // flage_toss = true; - // continue; - // } - // } - // for (float j3_f : j3_flav) { - // if (std::isnan(j3_f)) { - // flage_toss = true; - // continue; - // } - // } - - // NokFlav++; - - // // cut on the number of electrons - // if (event_nmu() > 2.) continue; - // if (event_nel() > 2.) continue; - // if (muons_p() > 20.) continue; - // if (elecrons_p() > 20.) continue; - - // NleptonCut++; - - // // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! - // // if ((d_23()<=400.) || (d_23()>=18000.))continue; - // // NdCutd123++; - // // if ((d_34()<=100.) || (d_34()>=6000.))continue; - // // NdCutd34++; - - // std::map> jetFlavScores; - // jetFlavScores[0] = j0_flav; - // jetFlavScores[1] = j1_flav; - // jetFlavScores[2] = j2_flav; - // jetFlavScores[3] = j3_flav; - - // std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; - - // if (do_debug && nPrinted < maxPrint) { - // for (const auto& [jetIdx, flavVec] : jetFlavScores) { - // std::cout << "Jet " << jetIdx << " flavor scores:\n"; - // for (size_t i = 0; i < flavVec.size(); ++i) { - // std::cout << " " << flavLabels[i] << ": "; - // if (std::abs(flavVec[i]) < 1e-6) { - // std::cout << std::scientific << std::setprecision(2) << flavVec[i]; - // } else { - // std::cout << std::fixed << std::setprecision(6) << flavVec[i]; - // } - // std::cout << "\n"; - // } - // std::cout << std::endl; - // } - // } - - // // Get the max flavor scores - // auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); - // auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); - // auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); - // auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); - - // int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); - // int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); - // int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); - // int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); - - // if (do_debug && nPrinted < maxPrint) { - // std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; - // std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; - // std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; - // std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; - // std::cout << " " << std::endl; - // } - - // std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; - - // if (nPrinted < maxPrint) { - // std::cout << "maxScoreIdx: "; - // for (int ScoreIdx : maxScoreIdx) { - // std::cout << ScoreIdx << " "; - // } - // std::cout << std::endl; - // std::cout << " " << std::endl; - // } - - // std::map> jetFlavMaxScore; - // for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ - // jetFlavMaxScore[maxScoreIdx[i]].push_back(i); - // } - - // int n_c = 0; - // int n_l = 0; - // // int n_b = 0; - - // bool has_invalid_flavor = false; - - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) n_c++; - // else if (maxScoreIdx[i] == 2) n_l++; - // } - - // if (has_invalid_flavor) continue; - - // if (!(n_c == 1 && n_l == 3)) continue; - - // nFlavScore++; - - // // Start Pairing the jets in W1 and W2 - // int cJet = -1; - // std::vector lJets; - - // for (int i = 0; i < 4; ++i) { - // if (maxScoreIdx[i] == 1) cJet = i; - // else if (maxScoreIdx[i] == 2) lJets.push_back(i); - // } - - // if (cJet == -1 || lJets.size() != 3) { - // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // continue; - // } - - // // W pair 1: c + s and u+d - // std::pair W1_pair = {cJet, lJets[0]}; - // std::pair W2_pair = {lJets[1], lJets[2]}; - - // if (do_debug && nPrinted < maxPrint) { - // std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; - // std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; - // std::cout << " " << std::endl; - // } - - // // calculate the mass - // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; - - // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - - // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])) + } + } + + // W pair 1: c + s and u+d + std::pair W1_pair = {cJet, lJets[0]}; + std::pair W2_pair = {lJets[1], lJets[2]}; + + if (do_debug && nPrinted < maxPrint) { + std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; + std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; + std::cout << " " << std::endl; + } + + // calculate the mass + TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + + cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + + lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - // // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** - // const double m_W_true = 80.379; - - // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; - - // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; - - // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; - - // double chi2_option1 = - // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - - // double chi2_option2 = - // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - - // double chi2_option3 = - // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - - // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - // h_W1_mass->Fill(W1_option1.M()); - // h_W2_mass->Fill(W2_option1.M()); - // h_chi2->Fill(chi2_option1); - // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - // h_W1_mass->Fill(W1_option2.M()); - // h_W2_mass->Fill(W2_option2.M()); - // h_chi2->Fill(chi2_option2); - // } else { - // h_W1_mass->Fill(W1_option3.M()); - // h_W2_mass->Fill(W2_option3.M()); - // h_chi2->Fill(chi2_option3); - // } - - // // Reco_wPair result = Chi2_wMass(cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2); - // // Reco_wPair result = Chi2_wMass(lTag_Jet_1, lTag_Jet_1, lTag_Jet_1, lTag_Jet_2); - - // // h_W1_mass->Fill(result.W1.M()); - // // h_W2_mass->Fill(result.W2.M()); - // // h_chi2->Fill(result.chi2); - - // h_W1_p->Fill(W1_option1.P()); - // h_W2_p->Fill(W2_option1.P()); - - // // Calculates the transverse and total momentum for the jets - // h_cJet_pt->Fill(cTag_Jet.Pt()); - // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - - // h_cJet_p->Fill(cTag_Jet.P()); - // h_lJet0_p->Fill(lTag_Jet_0.P()); - // h_lJet1_p->Fill(lTag_Jet_1.P()); - // h_lJet2_p->Fill(lTag_Jet_2.P()); - - // // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - // CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); - // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** + const double m_W_true = 80.379; + + TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; + TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + + TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; + TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + + TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; + TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + + double chi2_option1 = + (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); + + double chi2_option2 = + (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); + + double chi2_option3 = + (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + + if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { + h_W1_mass->Fill(W1_option1.M()); + h_W2_mass->Fill(W2_option1.M()); + h_chi2->Fill(chi2_option1); + + h_W1_p->Fill(W1_option1.P()); + h_W2_p->Fill(W2_option1.P()); + + h_W1_e->Fill(W1_option1.E()); + h_W2_e->Fill(W2_option1.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); + CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + + } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { + h_W1_mass->Fill(W1_option2.M()); + h_W2_mass->Fill(W2_option2.M()); + h_chi2->Fill(chi2_option2); + + h_W1_p->Fill(W1_option2.P()); + h_W2_p->Fill(W2_option2.P()); + + h_W1_e->Fill(W1_option2.E()); + h_W2_e->Fill(W2_option2.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); + CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + + } else { + h_W1_mass->Fill(W1_option3.M()); + h_W2_mass->Fill(W2_option3.M()); + h_chi2->Fill(chi2_option3); + + h_W1_p->Fill(W1_option3.P()); + h_W2_p->Fill(W2_option3.P()); + + h_W1_e->Fill(W1_option3.E()); + h_W2_e->Fill(W2_option3.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); + CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + } + + // Reco_wPair result = Chi2_wMass(cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2); + // Reco_wPair result = Chi2_wMass(lTag_Jet_1, lTag_Jet_1, lTag_Jet_1, lTag_Jet_2); + + // h_W1_mass->Fill(result.W1.M()); + // h_W2_mass->Fill(result.W2.M()); + // h_chi2->Fill(result.chi2); + + // h_W1_p->Fill(W1_option1.P()); + // h_W2_p->Fill(W2_option1.P()); + + // Calculates the transverse and total momentum for the jets + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); + + // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + // CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); + // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); // CosPhi_Angle(cTag_Jet, lTag_Jet_1, h_cos_phi_c_l1); // CosPhi_Angle(cTag_Jet, lTag_Jet_2, h_cos_phi_c_l2); // CosPhi_Angle(lTag_Jet_0, lTag_Jet_1, h_cos_phi_s_l1); @@ -574,7 +647,7 @@ void AnalysisWWCR::run() std::cout << " " << std::endl; std::cout << " " << std::endl; - std::cout << "Let there be data :)" << std::endl; + std::cout << "Let there be data ;)" << std::endl; // end of macro From d7eb0d95d47f53f0055da1a01a262b7c7477beac Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 30 Jun 2025 23:15:26 -0400 Subject: [PATCH 04/40] added plots using TCanvas --- PostCutCode/Root/AnalysisWWCR.cxx | 265 +++++++++++++++++++++++++++--- 1 file changed, 238 insertions(+), 27 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index c7638aa..d1c9592 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -9,6 +9,7 @@ #include "TH1F.h" #include "TCanvas.h" +#include "TLegend.h" #include @@ -130,15 +131,12 @@ void AnalysisWWCR::run() auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - auto h_cos_phi_c_s = m_histContainer->get1DHist("h_cos_phi_c_s", 150, -1, 1); + auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); - // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); - // auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); - // auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); - - // auto h_W1_cos_phi_l1_l2 = m_histContainer->get1DHist("h_W1_cos_phi_l1_l2", 150, -1, 1); - // auto h_W2_cos_phi_l1_l2 = m_histContainer->get1DHist("h_W2_cos_phi_l1_l2", 150, -1, 1); + auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); + auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); + auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); + auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -489,7 +487,7 @@ void AnalysisWWCR::run() std::cout << " " << std::endl; } - // calculate the mass + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); @@ -498,8 +496,6 @@ void AnalysisWWCR::run() lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - - // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** const double m_W_true = 80.379; TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; @@ -520,6 +516,9 @@ void AnalysisWWCR::run() double chi2_option3 = (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + // for the cos(phi) angle + TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; + if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { h_W1_mass->Fill(W1_option1.M()); h_W2_mass->Fill(W2_option1.M()); @@ -541,8 +540,11 @@ void AnalysisWWCR::run() h_lJet1_p->Fill(lTag_Jet_1.P()); h_lJet2_p->Fill(lTag_Jet_2.P()); - CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); - CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_0; + + W2_j1 = lTag_Jet_1; + W2_j2 = lTag_Jet_2; } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { h_W1_mass->Fill(W1_option2.M()); @@ -565,8 +567,11 @@ void AnalysisWWCR::run() h_lJet1_p->Fill(lTag_Jet_1.P()); h_lJet2_p->Fill(lTag_Jet_2.P()); - CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); - CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_1; + + W2_j1 = lTag_Jet_0; + W2_j2 = lTag_Jet_2; } else { h_W1_mass->Fill(W1_option3.M()); @@ -589,8 +594,11 @@ void AnalysisWWCR::run() h_lJet1_p->Fill(lTag_Jet_1.P()); h_lJet2_p->Fill(lTag_Jet_2.P()); - CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); - CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_2; + + W2_j1 = lTag_Jet_1; + W2_j2 = lTag_Jet_0; } // Reco_wPair result = Chi2_wMass(cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2); @@ -615,15 +623,12 @@ void AnalysisWWCR::run() // h_lJet2_p->Fill(lTag_Jet_2.P()); // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - // CosPhi_Angle(cTag_Jet, lTag_Jet_0, h_cos_phi_c_s); - // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_cos_phi_l1_l2); - // CosPhi_Angle(cTag_Jet, lTag_Jet_1, h_cos_phi_c_l1); - // CosPhi_Angle(cTag_Jet, lTag_Jet_2, h_cos_phi_c_l2); - // CosPhi_Angle(lTag_Jet_0, lTag_Jet_1, h_cos_phi_s_l1); - // CosPhi_Angle(lTag_Jet_0, lTag_Jet_2, h_cos_phi_s_l2); - - // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_W1_cos_phi_l1_l2); - // CosPhi_Angle(lTag_Jet_1, lTag_Jet_2, h_W2_cos_phi_l1_l2); + CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0); + CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2); + CosPhi_Angle(W1_j1, W2_j1, h_cos_phi_c_l1); + CosPhi_Angle(W1_j1, W2_j2, h_cos_phi_c_l2); + CosPhi_Angle(W1_j2, W2_j1, h_cos_phi_s_l1); + CosPhi_Angle(W1_j2, W2_j2, h_cos_phi_s_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -634,9 +639,179 @@ void AnalysisWWCR::run() cutFlowHist->SetBinContent(6, NdCutd123); cutFlowHist->SetBinContent(7, NdCutd34); cutFlowHist->SetBinContent(8, nFlavScore); - + } + // *************************** COMPARATIVE MASS PLOTS *************************** + TCanvas* c_W1_W2_mass = new TCanvas("c_W1_W2_mass", "Truth Histograms", 1800, 900); + c_W1_W2_mass->Divide(2, 1); + + c_W1_W2_mass->cd(1); + h_W1_truth_mass->Draw(); + h_W1_truth_mass->SetLineColor(kBlue); + h_W1_truth_mass->GetXaxis()->SetTitle("GeV"); + + h_W1_mass->Draw("same"); + h_W1_mass->SetLineColor(kRed); + + TLegend *legend_w1_mass = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_mass->SetTextSize(0.04); + legend_w1_mass->SetBorderSize(0); + legend_w1_mass->SetFillStyle(0); // Transparent background + + legend_w1_mass->AddEntry(h_W1_truth_mass, "w1_truth_mass", "l"); + legend_w1_mass->AddEntry(h_W1_mass, "w1_mass", "l"); + legend_w1_mass->Draw(); + + c_W1_W2_mass->cd(2); + h_W2_truth_mass->Draw(); + h_W2_truth_mass->SetLineColor(kBlue); + h_W2_truth_mass->GetXaxis()->SetTitle("GeV"); + + h_W2_mass->Draw("same"); + h_W2_mass->SetLineColor(kRed); + + TLegend *legend_w2_mass = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_mass->SetTextSize(0.04); + legend_w2_mass->SetBorderSize(0); + legend_w2_mass->SetFillStyle(0); // Transparent background + + legend_w2_mass->AddEntry(h_W2_truth_mass, "w2_truth_mass", "l"); + legend_w2_mass->AddEntry(h_W2_mass, "w2_mass", "l"); + legend_w2_mass->Draw(); + + c_W1_W2_mass->Update(); + c_W1_W2_mass->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_masses.png"); + + + // *************************** COMPARATIVE MOMENTA PLOTS *************************** + TCanvas* c_W1_W2_p = new TCanvas("c_W1_W2_p", "Truth Histograms", 1800, 900); + c_W1_W2_p->Divide(2, 1); + + c_W1_W2_p->cd(1); + h_W1_truth_p->Draw(); + h_W1_truth_p->SetLineColor(kBlue); + h_W1_truth_p->GetXaxis()->SetTitle("GeV"); + + h_W1_p->Draw("same"); + h_W1_p->SetLineColor(kRed); + + TLegend *legend_w1_p = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_p->SetTextSize(0.04); + legend_w1_p->SetBorderSize(0); + legend_w1_p->SetFillStyle(0); // Transparent background + + legend_w1_p->AddEntry(h_W1_truth_p, "w1_truth_p", "l"); + legend_w1_p->AddEntry(h_W1_p, "w1_p", "l"); + legend_w1_p->Draw(); + + c_W1_W2_p->cd(2); + h_W2_truth_p->Draw(); + h_W2_truth_p->SetLineColor(kBlue); + h_W2_truth_p->GetXaxis()->SetTitle("GeV"); + + h_W2_p->Draw("same"); + h_W2_p->SetLineColor(kRed); + + TLegend *legend_w2_p = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_p->SetTextSize(0.04); + legend_w2_p->SetBorderSize(0); + legend_w2_p->SetFillStyle(0); // Transparent background + + legend_w2_p->AddEntry(h_W2_truth_p, "w2_truth_p", "l"); + legend_w2_p->AddEntry(h_W2_p, "w2_p", "l"); + legend_w2_p->Draw(); + + c_W1_W2_p->Update(); + c_W1_W2_p->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_p.png"); + + + // *************************** COMPARATIVE ENERGY PLOTS *************************** + TCanvas* c_W1_W2_e = new TCanvas("c_W1_W2_e", "Truth Histograms", 1800, 900); + c_W1_W2_e->Divide(2, 1); + + c_W1_W2_e->cd(1); + h_W1_truth_e->Draw(); + h_W1_truth_e->SetLineColor(kBlue); + h_W1_truth_e->GetXaxis()->SetTitle("GeV"); + + h_W1_e->Draw("same"); + h_W1_e->SetLineColor(kRed); + + TLegend *legend_w1_e = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_e->SetTextSize(0.04); + legend_w1_e->SetBorderSize(0); + legend_w1_e->SetFillStyle(0); // Transparent background + + legend_w1_e->AddEntry(h_W1_truth_e, "w1_truth_e", "l"); + legend_w1_e->AddEntry(h_W1_e, "w1_e", "l"); + legend_w1_e->Draw(); + + c_W1_W2_e->cd(2); + h_W2_truth_e->Draw(); + h_W2_truth_e->SetLineColor(kBlue); + h_W2_truth_e->GetXaxis()->SetTitle("GeV"); + + h_W2_e->Draw("same"); + h_W2_e->SetLineColor(kRed); + + TLegend *legend_w2_e = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_e->SetTextSize(0.04); + legend_w2_e->SetBorderSize(0); + legend_w2_e->SetFillStyle(0); // Transparent background + + legend_w2_e->AddEntry(h_W2_truth_e, "w2_truth_e", "l"); + legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); + legend_w2_e->Draw(); + + c_W1_W2_e->Update(); + c_W1_W2_e->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_e.png"); + + + // *************************** COMPARATIVE ANGULAR DISTRIBUTIONS PLOTS *************************** + TCanvas* c_angular_dist = new TCanvas("c_angular_dist", "Truth Histograms", 1800, 900); + c_angular_dist->Divide(2, 1); + + c_angular_dist->cd(1); + h_cos_phi_truth_cs->Draw(); + h_cos_phi_truth_cs->SetLineColor(kBlue); + h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + + h_cos_phi_c_l0->Draw("same"); + h_cos_phi_c_l0->SetLineColor(kRed); + + TLegend *legend_w1_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_cos_phi->SetTextSize(0.04); + legend_w1_cos_phi->SetBorderSize(0); + legend_w1_cos_phi->SetFillStyle(0); // Transparent background + + legend_w1_cos_phi->AddEntry(h_cos_phi_truth_cs, "truth cos_phi_cs", "l"); + legend_w1_cos_phi->AddEntry(h_cos_phi_c_l0, "truth cos_phi_c_l0", "l"); + legend_w1_cos_phi->Draw(); + + c_angular_dist->cd(2); + h_cos_phi_truth_ud->Draw(); + h_cos_phi_truth_ud->SetLineColor(kBlue); + h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); + + h_cos_phi_l1_l2->Draw("same"); + h_cos_phi_l1_l2->SetLineColor(kRed); + + TLegend *legend_w2_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_cos_phi->SetTextSize(0.04); + legend_w2_cos_phi->SetBorderSize(0); + legend_w2_cos_phi->SetFillStyle(0); // Transparent background + + legend_w2_cos_phi->AddEntry(h_cos_phi_truth_ud, "truth cos_phi_ud", "l"); + legend_w2_cos_phi->AddEntry(h_cos_phi_l1_l2, "truth cos_phi_l1_l2", "l"); + legend_w2_cos_phi->Draw(); + + c_angular_dist->Update(); + c_angular_dist->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_angular_dist.png"); + + + + std::cout << " " << std::endl; std::cout << "-------------------- Outputs --------------------" << std::endl; std::cout << "Number of events: " << NEvents << std::endl; @@ -650,7 +825,43 @@ void AnalysisWWCR::run() std::cout << "Let there be data ;)" << std::endl; + + + std::cout << " " << std::endl; + std::cout << "-------------------- Outputs --------------------" << std::endl; + std::cout << "Number of events: " << NEvents << std::endl; + std::cout << "Number of events passing W decay cuts: " << NdecayCuts << std::endl; + std::cout << "Number of events w/ 4 jets: " << NjetCut << std::endl; + std::cout << "Number of Leptons Cut: " << NleptonCut << std::endl; + std::cout << "Number of events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore << std::endl; + std::cout << " " << std::endl; + + std::cout << " " << std::endl; + std::cout << "Let there be data ;)" << std::endl; + // end of macro } +// void finalize() { +// auto h_W1_truth_mass = HistContainer->get1DHist("h_W1_truth_mass"); +// auto h_W2_truth_mass = HistContainer->get1DHist("h_W2_truth_mass"); + +// // Create canvas +// TCanvas* c_truth = new TCanvas("c_truth", "Truth Histograms", 1200, 800); +// c_truth->Divide(3, 2); + +// c_truth->cd(1); +// h_W1_truth_mass->Draw(); + +// c_truth->cd(2); +// h_W2_truth_mass->Draw(); + +// // ... draw other histograms on c_truth ... + +// // Save canvas into the output ROOT file +// c_truth->Write(); + +// // Similarly for other canvases +// } + From a6c016d77da1d73272e4be101992aee0ebce1074 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 3 Jul 2025 10:55:43 -0400 Subject: [PATCH 05/40] added the ee correlator calculations --- PostCutCode/Root/AnalysisWWCR.cxx | 434 +++++++----------------------- 1 file changed, 99 insertions(+), 335 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index d1c9592..a46b8dd 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -8,8 +8,6 @@ #include "TLorentzVector.h" #include "TH1F.h" -#include "TCanvas.h" -#include "TLegend.h" #include @@ -46,46 +44,17 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -// struct Reco_wPair { -// TLorentzVector W1; -// TLorentzVector W2; -// double chi2; -// }; - -// Reco_wPair Chi2_wMass(const TLorentzVector& cTag_Jet, -// const TLorentzVector& lTag_Jet_0, -// const TLorentzVector& lTag_Jet_1, -// const TLorentzVector& lTag_Jet_2, -// double m_W_true = 80.379) { - -// // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* -// std::vector> pairings = { -// {cTag_Jet + lTag_Jet_0, lTag_Jet_1 + lTag_Jet_2}, -// {cTag_Jet + lTag_Jet_1, lTag_Jet_0 + lTag_Jet_2}, -// {cTag_Jet + lTag_Jet_2, lTag_Jet_0 + lTag_Jet_1} - -// // {lTag_Jet_1 + lTag_Jet_2, lTag_Jet_1 + lTag_Jet_2}, -// }; - -// Reco_wPair best_result; -// best_result.chi2 = std::numeric_limits::max(); - -// for (const auto& [W1, W2] : pairings) { -// double chi2 = (pow(W1.M() - m_W_true, 2) + pow(W2.M() - m_W_true, 2)) / (m_W_true); +void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_cosphi, TH1F* hist_eec) { + double phi = jet1.Angle(jet2.Vect()); + double cos_phi = cos(phi); -// if (chi2 < best_result.chi2) { -// best_result = {W1, W2, chi2}; -// } -// } + // double ee_correlator = 0.5 * (1 - cos_phi); + double ee_correlator = 1 - cos_phi; -// return best_result; -// } + // hist_eec->Scale(1.0 / hist_eec->GetEntries()); -void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist) { - double phi = jet1.Angle(jet2.Vect()); - double cos_phi= cos(phi); - - hist->Fill(cos_phi); + hist_cosphi->Fill(cos_phi); + hist_eec->Fill(ee_correlator); } void AnalysisWWCR::run() @@ -110,6 +79,9 @@ void AnalysisWWCR::run() auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); + auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); + auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); + // ******************* RECOJET HISTOGRAMS ******************* auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); @@ -138,6 +110,9 @@ void AnalysisWWCR::run() auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); + auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); + auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); + // Get the trees auto treeCont = std::make_shared(); @@ -256,65 +231,6 @@ void AnalysisWWCR::run() if(event_njet() != 4) continue; NjetCut++; - // ****************************** CALCULATIONS USING TRUTH VARIABLES ****************************** - std::vector truthJets_Wm, truthJets_Wp; - - for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { - float p = truth_Wm_p()->at(i); - float e = truth_Wm_e()->at(i); - float theta = truth_Wm_theta()->at(i); - float phi = truth_Wm_phi()->at(i); - - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); - - TLorentzVector lv; - - lv.SetPxPyPzE(px, py, pz, e); - truthJets_Wm.push_back(lv); - } - - for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { - float p = truth_Wp_p()->at(i); - float e = truth_Wp_e()->at(i); - float theta = truth_Wp_theta()->at(i); - float phi = truth_Wp_phi()->at(i); - - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); - - TLorentzVector lv; - - lv.SetPxPyPzE(px, py, pz, e); - truthJets_Wp.push_back(lv); - } - - if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { - TLorentzVector W1_jet1 = truthJets_Wm[0]; - TLorentzVector W1_jet2 = truthJets_Wm[1]; - TLorentzVector W2_jet1 = truthJets_Wp[0]; - TLorentzVector W2_jet2 = truthJets_Wp[1]; - - TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; - TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; - - h_W1_truth_mass->Fill(W1_truthJet.M()); - h_W2_truth_mass->Fill(W2_truthJet.M()); - - h_W1_truth_p->Fill(W1_truthJet.P()); - h_W2_truth_p->Fill(W2_truthJet.P()); - - h_W1_truth_e->Fill(W1_truthJet.E()); - h_W2_truth_e->Fill(W2_truthJet.E()); - - CosPhi_Angle(W1_jet1, W1_jet2, h_cos_phi_truth_cs); - CosPhi_Angle(W2_jet1, W2_jet2, h_cos_phi_truth_ud); - } - - // *************************** END OF CALCULATIONS USING TRUTH VARIABLES *************************** - bool flage_toss = false; if (recojet_isB.size() == 0){ flage_toss = true; @@ -457,13 +373,6 @@ void AnalysisWWCR::run() else if (maxScoreIdx[i] == 2) lJets.push_back(i); } - // if (cJet == -1 || lJets.size() != 3) { - // std::cerr << "Error: Incorrect number of flavored jets for pairing!" << std::endl; - // continue; - - // // continue; - // } - // Prevent jet reuse: ensure all jet indices are unique std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; @@ -487,6 +396,72 @@ void AnalysisWWCR::run() std::cout << " " << std::endl; } + // ****************************** CALCULATIONS USING TRUTH VARIABLES ****************************** + std::vector truthJets_Wm, truthJets_Wp; + + for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { + float p = truth_Wm_p()->at(i); + float e = truth_Wm_e()->at(i); + float theta = truth_Wm_theta()->at(i); + float phi = truth_Wm_phi()->at(i); + + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector lv; + + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wm.push_back(lv); + } + + for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { + float p = truth_Wp_p()->at(i); + float e = truth_Wp_e()->at(i); + float theta = truth_Wp_theta()->at(i); + float phi = truth_Wp_phi()->at(i); + + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector lv; + + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wp.push_back(lv); + } + + if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { + TLorentzVector W1_jet1 = truthJets_Wm[0]; + TLorentzVector W1_jet2 = truthJets_Wm[1]; + TLorentzVector W2_jet1 = truthJets_Wp[0]; + TLorentzVector W2_jet2 = truthJets_Wp[1]; + + TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; + TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; + + h_W1_truth_mass->Fill(W1_truthJet.M()); + h_W2_truth_mass->Fill(W2_truthJet.M()); + + h_W1_truth_p->Fill(W1_truthJet.P()); + h_W2_truth_p->Fill(W2_truthJet.P()); + + h_W1_truth_e->Fill(W1_truthJet.E()); + h_W2_truth_e->Fill(W2_truthJet.E()); + + CosPhi_Angle(W1_jet1, W1_jet2, h_cos_phi_truth_cs, h_eec_truth_cs); + CosPhi_Angle(W2_jet1, W2_jet2, h_cos_phi_truth_ud, h_eec_truth_ud); + + double counts_eec_truth_cs = h_eec_truth_cs->Integral(); + double counts_eec_truth_ud = h_eec_truth_ud->Integral(); + + if (counts_eec_truth_cs > 0) + h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); + + if (counts_eec_truth_ud > 0) + h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); + } + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; @@ -601,34 +576,30 @@ void AnalysisWWCR::run() W2_j2 = lTag_Jet_0; } - // Reco_wPair result = Chi2_wMass(cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2); - // Reco_wPair result = Chi2_wMass(lTag_Jet_1, lTag_Jet_1, lTag_Jet_1, lTag_Jet_2); + // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + // CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0); + // CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2); + // CosPhi_Angle(W1_j1, W2_j1, h_cos_phi_c_l1); + // CosPhi_Angle(W1_j1, W2_j2, h_cos_phi_c_l2); + // CosPhi_Angle(W1_j2, W2_j1, h_cos_phi_s_l1); + // CosPhi_Angle(W1_j2, W2_j2, h_cos_phi_s_l2); - // h_W1_mass->Fill(result.W1.M()); - // h_W2_mass->Fill(result.W2.M()); - // h_chi2->Fill(result.chi2); + CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0, h_eec_c_l0); + CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2, h_eec_l1_l2); - // h_W1_p->Fill(W1_option1.P()); - // h_W2_p->Fill(W2_option1.P()); + double counts_eec_c_l0 = h_eec_c_l0->Integral(); + double counts_eec_l1_l2 = h_eec_l1_l2->Integral(); - // Calculates the transverse and total momentum for the jets - // h_cJet_pt->Fill(cTag_Jet.Pt()); - // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + if (counts_eec_c_l0 > 0) + h_eec_c_l0->Scale(1.0 / (counts_eec_c_l0 * h_eec_c_l0->GetXaxis()->GetBinWidth(1))); - // h_cJet_p->Fill(cTag_Jet.P()); - // h_lJet0_p->Fill(lTag_Jet_0.P()); - // h_lJet1_p->Fill(lTag_Jet_1.P()); - // h_lJet2_p->Fill(lTag_Jet_2.P()); + if (counts_eec_l1_l2 > 0) + h_eec_l1_l2->Scale(1.0 / (counts_eec_l1_l2 * h_eec_l1_l2->GetXaxis()->GetBinWidth(1))); - // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2); - CosPhi_Angle(W1_j1, W2_j1, h_cos_phi_c_l1); - CosPhi_Angle(W1_j1, W2_j2, h_cos_phi_c_l2); - CosPhi_Angle(W1_j2, W2_j1, h_cos_phi_s_l1); - CosPhi_Angle(W1_j2, W2_j2, h_cos_phi_s_l2); + // h_eec_c_l0->Scale(1.0/counts_eec_c_l0); + // h_eec_l1_l2->Scale(1.0/counts_eec_l1_l2); + + // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -642,191 +613,6 @@ void AnalysisWWCR::run() } - // *************************** COMPARATIVE MASS PLOTS *************************** - TCanvas* c_W1_W2_mass = new TCanvas("c_W1_W2_mass", "Truth Histograms", 1800, 900); - c_W1_W2_mass->Divide(2, 1); - - c_W1_W2_mass->cd(1); - h_W1_truth_mass->Draw(); - h_W1_truth_mass->SetLineColor(kBlue); - h_W1_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W1_mass->Draw("same"); - h_W1_mass->SetLineColor(kRed); - - TLegend *legend_w1_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_mass->SetTextSize(0.04); - legend_w1_mass->SetBorderSize(0); - legend_w1_mass->SetFillStyle(0); // Transparent background - - legend_w1_mass->AddEntry(h_W1_truth_mass, "w1_truth_mass", "l"); - legend_w1_mass->AddEntry(h_W1_mass, "w1_mass", "l"); - legend_w1_mass->Draw(); - - c_W1_W2_mass->cd(2); - h_W2_truth_mass->Draw(); - h_W2_truth_mass->SetLineColor(kBlue); - h_W2_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W2_mass->Draw("same"); - h_W2_mass->SetLineColor(kRed); - - TLegend *legend_w2_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_mass->SetTextSize(0.04); - legend_w2_mass->SetBorderSize(0); - legend_w2_mass->SetFillStyle(0); // Transparent background - - legend_w2_mass->AddEntry(h_W2_truth_mass, "w2_truth_mass", "l"); - legend_w2_mass->AddEntry(h_W2_mass, "w2_mass", "l"); - legend_w2_mass->Draw(); - - c_W1_W2_mass->Update(); - c_W1_W2_mass->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_masses.png"); - - - // *************************** COMPARATIVE MOMENTA PLOTS *************************** - TCanvas* c_W1_W2_p = new TCanvas("c_W1_W2_p", "Truth Histograms", 1800, 900); - c_W1_W2_p->Divide(2, 1); - - c_W1_W2_p->cd(1); - h_W1_truth_p->Draw(); - h_W1_truth_p->SetLineColor(kBlue); - h_W1_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W1_p->Draw("same"); - h_W1_p->SetLineColor(kRed); - - TLegend *legend_w1_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_p->SetTextSize(0.04); - legend_w1_p->SetBorderSize(0); - legend_w1_p->SetFillStyle(0); // Transparent background - - legend_w1_p->AddEntry(h_W1_truth_p, "w1_truth_p", "l"); - legend_w1_p->AddEntry(h_W1_p, "w1_p", "l"); - legend_w1_p->Draw(); - - c_W1_W2_p->cd(2); - h_W2_truth_p->Draw(); - h_W2_truth_p->SetLineColor(kBlue); - h_W2_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W2_p->Draw("same"); - h_W2_p->SetLineColor(kRed); - - TLegend *legend_w2_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_p->SetTextSize(0.04); - legend_w2_p->SetBorderSize(0); - legend_w2_p->SetFillStyle(0); // Transparent background - - legend_w2_p->AddEntry(h_W2_truth_p, "w2_truth_p", "l"); - legend_w2_p->AddEntry(h_W2_p, "w2_p", "l"); - legend_w2_p->Draw(); - - c_W1_W2_p->Update(); - c_W1_W2_p->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_p.png"); - - - // *************************** COMPARATIVE ENERGY PLOTS *************************** - TCanvas* c_W1_W2_e = new TCanvas("c_W1_W2_e", "Truth Histograms", 1800, 900); - c_W1_W2_e->Divide(2, 1); - - c_W1_W2_e->cd(1); - h_W1_truth_e->Draw(); - h_W1_truth_e->SetLineColor(kBlue); - h_W1_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W1_e->Draw("same"); - h_W1_e->SetLineColor(kRed); - - TLegend *legend_w1_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_e->SetTextSize(0.04); - legend_w1_e->SetBorderSize(0); - legend_w1_e->SetFillStyle(0); // Transparent background - - legend_w1_e->AddEntry(h_W1_truth_e, "w1_truth_e", "l"); - legend_w1_e->AddEntry(h_W1_e, "w1_e", "l"); - legend_w1_e->Draw(); - - c_W1_W2_e->cd(2); - h_W2_truth_e->Draw(); - h_W2_truth_e->SetLineColor(kBlue); - h_W2_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W2_e->Draw("same"); - h_W2_e->SetLineColor(kRed); - - TLegend *legend_w2_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_e->SetTextSize(0.04); - legend_w2_e->SetBorderSize(0); - legend_w2_e->SetFillStyle(0); // Transparent background - - legend_w2_e->AddEntry(h_W2_truth_e, "w2_truth_e", "l"); - legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); - legend_w2_e->Draw(); - - c_W1_W2_e->Update(); - c_W1_W2_e->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_e.png"); - - - // *************************** COMPARATIVE ANGULAR DISTRIBUTIONS PLOTS *************************** - TCanvas* c_angular_dist = new TCanvas("c_angular_dist", "Truth Histograms", 1800, 900); - c_angular_dist->Divide(2, 1); - - c_angular_dist->cd(1); - h_cos_phi_truth_cs->Draw(); - h_cos_phi_truth_cs->SetLineColor(kBlue); - h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); - - h_cos_phi_c_l0->Draw("same"); - h_cos_phi_c_l0->SetLineColor(kRed); - - TLegend *legend_w1_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_cos_phi->SetTextSize(0.04); - legend_w1_cos_phi->SetBorderSize(0); - legend_w1_cos_phi->SetFillStyle(0); // Transparent background - - legend_w1_cos_phi->AddEntry(h_cos_phi_truth_cs, "truth cos_phi_cs", "l"); - legend_w1_cos_phi->AddEntry(h_cos_phi_c_l0, "truth cos_phi_c_l0", "l"); - legend_w1_cos_phi->Draw(); - - c_angular_dist->cd(2); - h_cos_phi_truth_ud->Draw(); - h_cos_phi_truth_ud->SetLineColor(kBlue); - h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); - - h_cos_phi_l1_l2->Draw("same"); - h_cos_phi_l1_l2->SetLineColor(kRed); - - TLegend *legend_w2_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_cos_phi->SetTextSize(0.04); - legend_w2_cos_phi->SetBorderSize(0); - legend_w2_cos_phi->SetFillStyle(0); // Transparent background - - legend_w2_cos_phi->AddEntry(h_cos_phi_truth_ud, "truth cos_phi_ud", "l"); - legend_w2_cos_phi->AddEntry(h_cos_phi_l1_l2, "truth cos_phi_l1_l2", "l"); - legend_w2_cos_phi->Draw(); - - c_angular_dist->Update(); - c_angular_dist->SaveAs("/usatlas/u/kleibensperger/FCCeePostCutCode/run/w1_w2_angular_dist.png"); - - - - - std::cout << " " << std::endl; - std::cout << "-------------------- Outputs --------------------" << std::endl; - std::cout << "Number of events: " << NEvents << std::endl; - std::cout << "Number of events passing W decay cuts: " << NdecayCuts << std::endl; - std::cout << "Number of events w/ 4 jets: " << NjetCut << std::endl; - std::cout << "Number of Leptons Cut: " << NleptonCut << std::endl; - std::cout << "Number of events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore << std::endl; - std::cout << " " << std::endl; - - std::cout << " " << std::endl; - std::cout << "Let there be data ;)" << std::endl; - - - - std::cout << " " << std::endl; std::cout << "-------------------- Outputs --------------------" << std::endl; std::cout << "Number of events: " << NEvents << std::endl; @@ -842,26 +628,4 @@ void AnalysisWWCR::run() // end of macro } -// void finalize() { -// auto h_W1_truth_mass = HistContainer->get1DHist("h_W1_truth_mass"); -// auto h_W2_truth_mass = HistContainer->get1DHist("h_W2_truth_mass"); - -// // Create canvas -// TCanvas* c_truth = new TCanvas("c_truth", "Truth Histograms", 1200, 800); -// c_truth->Divide(3, 2); - -// c_truth->cd(1); -// h_W1_truth_mass->Draw(); - -// c_truth->cd(2); -// h_W2_truth_mass->Draw(); - -// // ... draw other histograms on c_truth ... - -// // Save canvas into the output ROOT file -// c_truth->Write(); - -// // Similarly for other canvases -// } - From 7e7bc83474f8fc252aa5cbca16002b8467719131 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 3 Jul 2025 11:03:33 -0400 Subject: [PATCH 06/40] Plots from AnalysisWWCR --- PostCutCode/Root/Plots_AnalysisWWCR.cxx | 343 ++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 PostCutCode/Root/Plots_AnalysisWWCR.cxx diff --git a/PostCutCode/Root/Plots_AnalysisWWCR.cxx b/PostCutCode/Root/Plots_AnalysisWWCR.cxx new file mode 100644 index 0000000..071a7f5 --- /dev/null +++ b/PostCutCode/Root/Plots_AnalysisWWCR.cxx @@ -0,0 +1,343 @@ +#include +#include +#include +#include +#include + +void Plots_AnalysisWWCR() { + + TFile *test_CR = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test.root", "READ"); + TFile *test_noCR = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_noCR.root", "READ"); + TFile *test_SKI = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_SKI.root", "READ"); + TFile *test_SKII = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_SKII.root", "READ"); + + if (!test_CR || test_CR->IsZombie()) { + std::cerr << "Error: Cannot open test_CR!" << std::endl; + return; + } + + if (!test_noCR || test_noCR->IsZombie()) { + std::cerr << "Error: Cannot open test_noCR!" << std::endl; + return; + } + + if (!test_SKI || test_SKI->IsZombie()) { + std::cerr << "Error: Cannot open test_SKI!" << std::endl; + return; + } + + if (!test_SKII || test_SKII->IsZombie()) { + std::cerr << "Error: Cannot open test_SKII!" << std::endl; + return; + } + + // *************************** CR Plots *************************** + TH1F *h_W1_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W1_truth_mass_WW"); + TH1F *h_W2_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W2_truth_mass_WW"); + TH1F *h_W1_mass = (TH1F*)test_CR->Get("Nominal/h_W1_mass_WW"); + TH1F *h_W2_mass = (TH1F*)test_CR->Get("Nominal/h_W2_mass_WW"); + + TH1F *h_W1_truth_p = (TH1F*)test_CR->Get("Nominal/h_W1_truth_p_WW"); + TH1F *h_W2_truth_p = (TH1F*)test_CR->Get("Nominal/h_W2_truth_p_WW"); + TH1F *h_W1_p = (TH1F*)test_CR->Get("Nominal/h_W1_p_WW"); + TH1F *h_W2_p = (TH1F*)test_CR->Get("Nominal/h_W2_p_WW"); + + TH1F *h_W1_truth_e = (TH1F*)test_CR->Get("Nominal/h_W1_truth_e_WW"); + TH1F *h_W2_truth_e = (TH1F*)test_CR->Get("Nominal/h_W2_truth_e_WW"); + TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); + TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); + + TH1F *h_cos_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_cs_WW"); + TH1F *h_cos_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_ud_WW"); + TH1F *h_cos_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_c_l0_WW"); + TH1F *h_cos_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_l1_l2_WW"); + + TH1F *h_eec_truth_cs = (TH1F*)test_CR->Get("Nominal/h_eec_truth_cs_WW"); + TH1F *h_eec_truth_ud = (TH1F*)test_CR->Get("Nominal/h_eec_truth_ud_WW"); + TH1F *h_eec_c_l0 = (TH1F*)test_CR->Get("Nominal/h_eec_c_l0_WW"); + TH1F *h_eec_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_eec_l1_l2_WW"); + + // *************************** No CR Plots *************************** + TH1F *h_W1_truth_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_mass_WW"); + TH1F *h_W2_truth_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_mass_WW"); + TH1F *h_W1_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_mass_WW"); + TH1F *h_W2_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_mass_WW"); + + TH1F *h_W1_truth_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_p_WW"); + TH1F *h_W2_truth_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_p_WW"); + TH1F *h_W1_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_p_WW"); + TH1F *h_W2_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_p_WW"); + + TH1F *h_W1_truth_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_e_WW"); + TH1F *h_W2_truth_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_e_WW"); + TH1F *h_W1_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_e_WW"); + TH1F *h_W2_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_e_WW"); + + TH1F *h_cos_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_cs_WW"); + TH1F *h_cos_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_ud_WW"); + TH1F *h_cos_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_c_l0_WW"); + TH1F *h_cos_phi_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_l1_l2_WW"); + + TH1F *h_eec_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_truth_cs_WW"); + TH1F *h_eec_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_truth_ud_WW"); + TH1F *h_eec_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_c_l0_WW"); + TH1F *h_eec_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_l1_l2_WW"); + + // *************************** SK-I CR Plots *************************** + TH1F *h_W1_truth_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_mass_WW"); + TH1F *h_W2_truth_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_mass_WW"); + TH1F *h_W1_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_mass_WW"); + TH1F *h_W2_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_mass_WW"); + + TH1F *h_W1_truth_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_p_WW"); + TH1F *h_W2_truth_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_p_WW"); + TH1F *h_W1_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_p_WW"); + TH1F *h_W2_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_p_WW"); + + TH1F *h_W1_truth_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_e_WW"); + TH1F *h_W2_truth_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_e_WW"); + TH1F *h_W1_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_e_WW"); + TH1F *h_W2_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_e_WW"); + + TH1F *h_cos_phi_truth_cs_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_truth_cs_WW"); + TH1F *h_cos_phi_truth_ud_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_truth_ud_WW"); + TH1F *h_cos_phi_c_l0_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_c_l0_WW"); + TH1F *h_cos_phi_l1_l2_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_l1_l2_WW"); + + TH1F *h_eec_truth_cs_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_truth_cs_WW"); + TH1F *h_eec_truth_ud_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_truth_ud_WW"); + TH1F *h_eec_c_l0_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_c_l0_WW"); + TH1F *h_eec_l1_l2_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_l1_l2_WW"); + + // *************************** SK-II CR Plots *************************** + TH1F *h_W1_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W1_truth_mass_WW"); + TH1F *h_W2_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W2_truth_mass_WW"); + TH1F *h_W1_mass = (TH1F*)test_CR->Get("Nominal/h_W1_mass_WW"); + TH1F *h_W2_mass = (TH1F*)test_CR->Get("Nominal/h_W2_mass_WW"); + + TH1F *h_W1_truth_p = (TH1F*)test_CR->Get("Nominal/h_W1_truth_p_WW"); + TH1F *h_W2_truth_p = (TH1F*)test_CR->Get("Nominal/h_W2_truth_p_WW"); + TH1F *h_W1_p = (TH1F*)test_CR->Get("Nominal/h_W1_p_WW"); + TH1F *h_W2_p = (TH1F*)test_CR->Get("Nominal/h_W2_p_WW"); + + TH1F *h_W1_truth_e = (TH1F*)test_CR->Get("Nominal/h_W1_truth_e_WW"); + TH1F *h_W2_truth_e = (TH1F*)test_CR->Get("Nominal/h_W2_truth_e_WW"); + TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); + TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); + + TH1F *h_cos_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_cs_WW"); + TH1F *h_cos_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_ud_WW"); + TH1F *h_cos_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_c_l0_WW"); + TH1F *h_cos_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_l1_l2_WW"); + + TH1F *h_eec_truth_cs = (TH1F*)test_CR->Get("Nominal/h_eec_truth_cs_WW"); + TH1F *h_eec_truth_ud = (TH1F*)test_CR->Get("Nominal/h_eec_truth_ud_WW"); + TH1F *h_eec_c_l0 = (TH1F*)test_CR->Get("Nominal/h_eec_c_l0_WW"); + TH1F *h_eec_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_eec_l1_l2_WW"); + + + TFile *Plots_WWCR = new TFile("/usatlas/u/kleibensperger/FCCeePostCutCode/run/WWCR_Plots.root", "Recreate"); + + // *************************** MASS PLOTS *************************** + TCanvas* c_W1_W2_mass = new TCanvas("c_W1_W2_mass", "Truth Histograms", 1500, 600); + c_W1_W2_mass->Divide(2, 1); + c_W1_W2_mass->SetWindowSize(1500, 600); // Window size in pixels + c_W1_W2_mass->SetCanvasSize(1500, 600); // Drawable area in pixels + + c_W1_W2_mass->cd(1); + h_W1_truth_mass->Draw(); + h_W1_truth_mass->SetLineColor(kBlue); + h_W1_truth_mass->GetXaxis()->SetTitle("GeV"); + + h_W1_mass->Draw("same"); + h_W1_mass->SetLineColor(kRed); + + TLegend *legend_w1_mass = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_mass->SetTextSize(0.04); + legend_w1_mass->SetBorderSize(0); + legend_w1_mass->SetFillStyle(0); // Transparent background + + legend_w1_mass->AddEntry(h_W1_truth_mass, "w1_truth_mass", "l"); + legend_w1_mass->AddEntry(h_W1_mass, "w1_mass", "l"); + legend_w1_mass->Draw(); + + c_W1_W2_mass->cd(2); + h_W2_truth_mass->Draw(); + h_W2_truth_mass->SetLineColor(kBlue); + h_W2_truth_mass->GetXaxis()->SetTitle("GeV"); + + h_W2_mass->Draw("same"); + h_W2_mass->SetLineColor(kRed); + + TLegend *legend_w2_mass = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_mass->SetTextSize(0.04); + legend_w2_mass->SetBorderSize(0); + legend_w2_mass->SetFillStyle(0); // Transparent background + + legend_w2_mass->AddEntry(h_W2_truth_mass, "w2_truth_mass", "l"); + legend_w2_mass->AddEntry(h_W2_mass, "w2_mass", "l"); + legend_w2_mass->Draw(); + + // *************************** COMPARATIVE MOMENTA PLOTS *************************** + TCanvas* c_W1_W2_p = new TCanvas("c_W1_W2_p", "Truth Histograms", 1500, 600); + c_W1_W2_p->Divide(2, 1); + + c_W1_W2_p->cd(1); + h_W1_truth_p->Draw(); + h_W1_truth_p->SetLineColor(kBlue); + h_W1_truth_p->GetXaxis()->SetTitle("GeV"); + + h_W1_p->Draw("same"); + h_W1_p->SetLineColor(kRed); + + TLegend *legend_w1_p = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_p->SetTextSize(0.04); + legend_w1_p->SetBorderSize(0); + legend_w1_p->SetFillStyle(0); // Transparent background + + legend_w1_p->AddEntry(h_W1_truth_p, "w1_truth_p", "l"); + legend_w1_p->AddEntry(h_W1_p, "w1_p", "l"); + legend_w1_p->Draw(); + + c_W1_W2_p->cd(2); + h_W2_truth_p->Draw(); + h_W2_truth_p->SetLineColor(kBlue); + h_W2_truth_p->GetXaxis()->SetTitle("GeV"); + + h_W2_p->Draw("same"); + h_W2_p->SetLineColor(kRed); + + TLegend *legend_w2_p = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_p->SetTextSize(0.04); + legend_w2_p->SetBorderSize(0); + legend_w2_p->SetFillStyle(0); // Transparent background + + legend_w2_p->AddEntry(h_W2_truth_p, "w2_truth_p", "l"); + legend_w2_p->AddEntry(h_W2_p, "w2_p", "l"); + legend_w2_p->Draw(); + + // *************************** COMPARATIVE ENERGY PLOTS *************************** + TCanvas* c_W1_W2_e = new TCanvas("c_W1_W2_e", "Truth Histograms", 1500, 600); + c_W1_W2_e->Divide(2, 1); + + c_W1_W2_e->cd(1); + h_W1_truth_e->Draw(); + h_W1_truth_e->SetLineColor(kBlue); + h_W1_truth_e->GetXaxis()->SetTitle("GeV"); + + h_W1_e->Draw("same"); + h_W1_e->SetLineColor(kRed); + + TLegend *legend_w1_e = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_e->SetTextSize(0.04); + legend_w1_e->SetBorderSize(0); + legend_w1_e->SetFillStyle(0); // Transparent background + + legend_w1_e->AddEntry(h_W1_truth_e, "w1_truth_e", "l"); + legend_w1_e->AddEntry(h_W1_e, "w1_e", "l"); + legend_w1_e->Draw(); + + c_W1_W2_e->cd(2); + h_W2_truth_e->Draw(); + h_W2_truth_e->SetLineColor(kBlue); + h_W2_truth_e->GetXaxis()->SetTitle("GeV"); + + h_W2_e->Draw("same"); + h_W2_e->SetLineColor(kRed); + + TLegend *legend_w2_e = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_e->SetTextSize(0.04); + legend_w2_e->SetBorderSize(0); + legend_w2_e->SetFillStyle(0); // Transparent background + + legend_w2_e->AddEntry(h_W2_truth_e, "w2_truth_e", "l"); + legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); + legend_w2_e->Draw(); + + // *************************** COMPARATIVE ANGULAR DISTRIBUTIONS PLOTS *************************** + TCanvas* c_angular_dist = new TCanvas("c_angular_dist", "Truth Histograms", 1500, 600); + c_angular_dist->Divide(2, 1); + + c_angular_dist->cd(1); + h_cos_phi_truth_cs->Draw(); + h_cos_phi_truth_cs->SetLineColor(kBlue); + h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + + h_cos_phi_c_l0->Draw("same"); + h_cos_phi_c_l0->SetLineColor(kRed); + + TLegend *legend_w1_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_cos_phi->SetTextSize(0.04); + legend_w1_cos_phi->SetBorderSize(0); + legend_w1_cos_phi->SetFillStyle(0); // Transparent background + + legend_w1_cos_phi->AddEntry(h_cos_phi_truth_cs, "truth cos_phi_cs", "l"); + legend_w1_cos_phi->AddEntry(h_cos_phi_c_l0, "truth cos_phi_c_l0", "l"); + legend_w1_cos_phi->Draw(); + + c_angular_dist->cd(2); + h_cos_phi_truth_ud->Draw(); + h_cos_phi_truth_ud->SetLineColor(kBlue); + h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); + + h_cos_phi_l1_l2->Draw("same"); + h_cos_phi_l1_l2->SetLineColor(kRed); + + TLegend *legend_w2_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_cos_phi->SetTextSize(0.04); + legend_w2_cos_phi->SetBorderSize(0); + legend_w2_cos_phi->SetFillStyle(0); // Transparent background + + legend_w2_cos_phi->AddEntry(h_cos_phi_truth_ud, "truth cos_phi_ud", "l"); + legend_w2_cos_phi->AddEntry(h_cos_phi_l1_l2, "truth cos_phi_l1_l2", "l"); + legend_w2_cos_phi->Draw(); + + // *************************** Energy-Energy Correlators *************************** + TCanvas* c_truth_ee_correlators = new TCanvas("c_truth_ee_correlators", "Truth Histograms", 1500, 600); + + c_truth_ee_correlators->cd(); + h_eec_truth_cs->Draw(); + h_eec_truth_cs->SetLineColor(kBlue); + h_eec_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + + h_eec_truth_ud->Draw("same"); + h_eec_truth_ud->SetLineColor(kRed); + + TLegend *legend_eec_truth = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_eec_truth->SetTextSize(0.04); + legend_eec_truth->SetBorderSize(0); + legend_eec_truth->SetFillStyle(0); // Transparent background + + legend_eec_truth->AddEntry(h_eec_truth_cs, "W1 #rightarrow cs", "l"); + legend_eec_truth->AddEntry(h_eec_truth_ud, "W1 #rightarrow ud", "l"); + legend_eec_truth->Draw(); + + TCanvas* c_ee_correlators = new TCanvas("c_ee_correlators", "Truth Histograms", 1500, 600); + + c_ee_correlators->cd(); + h_eec_c_l0->Draw(); + h_eec_c_l0->SetLineColor(kBlue); + h_eec_c_l0->GetXaxis()->SetTitle("cos(#phi)"); + + h_eec_l1_l2->Draw("same"); + h_eec_l1_l2->SetLineColor(kRed); + + TLegend *legend_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_eec->SetTextSize(0.04); + legend_eec->SetBorderSize(0); + legend_eec->SetFillStyle(0); // Transparent background + + legend_eec->AddEntry(h_eec_c_l0, "truth cos_phi_ud", "l"); + legend_eec->AddEntry(h_eec_l1_l2, "truth cos_phi_l1_l2", "l"); + legend_eec->Draw(); + + c_W1_W2_mass->Write(); + c_W1_W2_p->Write(); + c_W1_W2_e->Write(); + c_angular_dist->Write(); + c_truth_ee_correlators->Write(); + c_ee_correlators->Write(); + + Plots_WWCR->Write(); + Plots_WWCR->Close(); +} \ No newline at end of file From ce793e84cb184413d4bb054196b939b5dbca0d3e Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 8 Jul 2025 07:53:36 -0400 Subject: [PATCH 07/40] corrected to delta-phi --- PostCutCode/Root/AnalysisWWCR.cxx | 47 ++++++++++++++++++------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index a46b8dd..564261a 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -44,15 +44,16 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_cosphi, TH1F* hist_eec) { - double phi = jet1.Angle(jet2.Vect()); +void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_phi, TH1F* hist_cosphi, TH1F* hist_eec) { + // double phi = jet1.Angle(jet2.Vect()); + double phi = jet1.Phi() - jet2.Phi(); + // double phi = TVector2::Phi_mpi_pi(jet1.Phi() - jet2.Phi()); // ensures that everything is from [-pi, pi]?? double cos_phi = cos(phi); - // double ee_correlator = 0.5 * (1 - cos_phi); - double ee_correlator = 1 - cos_phi; - - // hist_eec->Scale(1.0 / hist_eec->GetEntries()); + double ee_correlator = 0.5 * (1 - cos_phi); + // double ee_correlator = 1 - cos_phi; + hist_phi->Fill(phi); hist_cosphi->Fill(cos_phi); hist_eec->Fill(ee_correlator); } @@ -76,6 +77,9 @@ void AnalysisWWCR::run() auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + auto h_phi_truth_cs = m_histContainer->get1DHist("h_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_truth_ud = m_histContainer->get1DHist("h_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); @@ -103,12 +107,15 @@ void AnalysisWWCR::run() auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); + auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); - auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); - auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); - auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); + // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); + // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); + // auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); + // auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); @@ -449,8 +456,8 @@ void AnalysisWWCR::run() h_W1_truth_e->Fill(W1_truthJet.E()); h_W2_truth_e->Fill(W2_truthJet.E()); - CosPhi_Angle(W1_jet1, W1_jet2, h_cos_phi_truth_cs, h_eec_truth_cs); - CosPhi_Angle(W2_jet1, W2_jet2, h_cos_phi_truth_ud, h_eec_truth_ud); + CosPhi_Angle(W1_jet1, W1_jet2, h_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); + CosPhi_Angle(W2_jet1, W2_jet2, h_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); double counts_eec_truth_cs = h_eec_truth_cs->Integral(); double counts_eec_truth_ud = h_eec_truth_ud->Integral(); @@ -584,17 +591,17 @@ void AnalysisWWCR::run() // CosPhi_Angle(W1_j2, W2_j1, h_cos_phi_s_l1); // CosPhi_Angle(W1_j2, W2_j2, h_cos_phi_s_l2); - CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0, h_eec_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2, h_eec_l1_l2); + CosPhi_Angle(W1_j1, W1_j2, h_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); + CosPhi_Angle(W2_j1, W2_j2, h_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); - double counts_eec_c_l0 = h_eec_c_l0->Integral(); - double counts_eec_l1_l2 = h_eec_l1_l2->Integral(); + // double counts_eec_c_l0 = h_eec_c_l0->Integral(); + // double counts_eec_l1_l2 = h_eec_l1_l2->Integral(); - if (counts_eec_c_l0 > 0) - h_eec_c_l0->Scale(1.0 / (counts_eec_c_l0 * h_eec_c_l0->GetXaxis()->GetBinWidth(1))); + // if (counts_eec_c_l0 > 0) + // h_eec_c_l0->Scale(1.0 / (counts_eec_c_l0 * h_eec_c_l0->GetXaxis()->GetBinWidth(1))); - if (counts_eec_l1_l2 > 0) - h_eec_l1_l2->Scale(1.0 / (counts_eec_l1_l2 * h_eec_l1_l2->GetXaxis()->GetBinWidth(1))); + // if (counts_eec_l1_l2 > 0) + // h_eec_l1_l2->Scale(1.0 / (counts_eec_l1_l2 * h_eec_l1_l2->GetXaxis()->GetBinWidth(1))); // h_eec_c_l0->Scale(1.0/counts_eec_c_l0); // h_eec_l1_l2->Scale(1.0/counts_eec_l1_l2); From 8d482b95e83f0c1548fd93d7d8235b380a81c878 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 8 Jul 2025 07:56:59 -0400 Subject: [PATCH 08/40] plots delta-phi, cos-phi, ee correlator, and ratios --- PostCutCode/Root/Plots_AnalysisWWCR.cxx | 412 +++++++++++++++++------- 1 file changed, 304 insertions(+), 108 deletions(-) diff --git a/PostCutCode/Root/Plots_AnalysisWWCR.cxx b/PostCutCode/Root/Plots_AnalysisWWCR.cxx index 071a7f5..a144d8f 100644 --- a/PostCutCode/Root/Plots_AnalysisWWCR.cxx +++ b/PostCutCode/Root/Plots_AnalysisWWCR.cxx @@ -47,6 +47,11 @@ void Plots_AnalysisWWCR() { TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); + TH1F *h_delta_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_phi_truth_cs_WW"); + TH1F *h_delta_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_phi_truth_ud_WW"); + TH1F *h_delta_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_phi_c_l0_WW"); + TH1F *h_delta_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_phi_l1_l2_WW"); + TH1F *h_cos_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_cs_WW"); TH1F *h_cos_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_ud_WW"); TH1F *h_cos_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_c_l0_WW"); @@ -73,6 +78,11 @@ void Plots_AnalysisWWCR() { TH1F *h_W1_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_e_WW"); TH1F *h_W2_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_e_WW"); + TH1F *h_delta_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_cs_WW"); + TH1F *h_delta_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_ud_WW"); + TH1F *h_delta_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_c_l0_WW"); + TH1F *h_delta_phi_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_l1_l2_WW"); + TH1F *h_cos_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_cs_WW"); TH1F *h_cos_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_ud_WW"); TH1F *h_cos_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_c_l0_WW"); @@ -83,58 +93,6 @@ void Plots_AnalysisWWCR() { TH1F *h_eec_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_c_l0_WW"); TH1F *h_eec_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_l1_l2_WW"); - // *************************** SK-I CR Plots *************************** - TH1F *h_W1_truth_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_mass_WW"); - TH1F *h_W2_truth_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_mass_WW"); - TH1F *h_W1_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_mass_WW"); - TH1F *h_W2_mass_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_mass_WW"); - - TH1F *h_W1_truth_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_p_WW"); - TH1F *h_W2_truth_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_p_WW"); - TH1F *h_W1_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_p_WW"); - TH1F *h_W2_p_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_p_WW"); - - TH1F *h_W1_truth_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_truth_e_WW"); - TH1F *h_W2_truth_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_truth_e_WW"); - TH1F *h_W1_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W1_e_WW"); - TH1F *h_W2_e_SKI = (TH1F*)test_SKI->Get("Nominal/h_W2_e_WW"); - - TH1F *h_cos_phi_truth_cs_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_truth_cs_WW"); - TH1F *h_cos_phi_truth_ud_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_truth_ud_WW"); - TH1F *h_cos_phi_c_l0_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_c_l0_WW"); - TH1F *h_cos_phi_l1_l2_SKI = (TH1F*)test_SKI->Get("Nominal/h_cos_phi_l1_l2_WW"); - - TH1F *h_eec_truth_cs_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_truth_cs_WW"); - TH1F *h_eec_truth_ud_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_truth_ud_WW"); - TH1F *h_eec_c_l0_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_c_l0_WW"); - TH1F *h_eec_l1_l2_SKI = (TH1F*)test_SKI->Get("Nominal/h_eec_l1_l2_WW"); - - // *************************** SK-II CR Plots *************************** - TH1F *h_W1_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W1_truth_mass_WW"); - TH1F *h_W2_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W2_truth_mass_WW"); - TH1F *h_W1_mass = (TH1F*)test_CR->Get("Nominal/h_W1_mass_WW"); - TH1F *h_W2_mass = (TH1F*)test_CR->Get("Nominal/h_W2_mass_WW"); - - TH1F *h_W1_truth_p = (TH1F*)test_CR->Get("Nominal/h_W1_truth_p_WW"); - TH1F *h_W2_truth_p = (TH1F*)test_CR->Get("Nominal/h_W2_truth_p_WW"); - TH1F *h_W1_p = (TH1F*)test_CR->Get("Nominal/h_W1_p_WW"); - TH1F *h_W2_p = (TH1F*)test_CR->Get("Nominal/h_W2_p_WW"); - - TH1F *h_W1_truth_e = (TH1F*)test_CR->Get("Nominal/h_W1_truth_e_WW"); - TH1F *h_W2_truth_e = (TH1F*)test_CR->Get("Nominal/h_W2_truth_e_WW"); - TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); - TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); - - TH1F *h_cos_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_cs_WW"); - TH1F *h_cos_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_ud_WW"); - TH1F *h_cos_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_c_l0_WW"); - TH1F *h_cos_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_l1_l2_WW"); - - TH1F *h_eec_truth_cs = (TH1F*)test_CR->Get("Nominal/h_eec_truth_cs_WW"); - TH1F *h_eec_truth_ud = (TH1F*)test_CR->Get("Nominal/h_eec_truth_ud_WW"); - TH1F *h_eec_c_l0 = (TH1F*)test_CR->Get("Nominal/h_eec_c_l0_WW"); - TH1F *h_eec_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_eec_l1_l2_WW"); - TFile *Plots_WWCR = new TFile("/usatlas/u/kleibensperger/FCCeePostCutCode/run/WWCR_Plots.root", "Recreate"); @@ -254,89 +212,327 @@ void Plots_AnalysisWWCR() { legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); legend_w2_e->Draw(); - // *************************** COMPARATIVE ANGULAR DISTRIBUTIONS PLOTS *************************** - TCanvas* c_angular_dist = new TCanvas("c_angular_dist", "Truth Histograms", 1500, 600); - c_angular_dist->Divide(2, 1); + // *************************** DELTA PHI DISTRIBUTIONS *************************** + TCanvas* c_delta_phi_truth = new TCanvas("c_delta_phi_truth", "Truth Histograms", 1500, 600); + c_delta_phi_truth->Divide(2, 1); + + c_delta_phi_truth->cd(1); + h_delta_phi_truth_cs->Draw("HIST"); + h_delta_phi_truth_cs->SetLineColor(kBlue); + h_delta_phi_truth_cs->GetXaxis()->SetTitle("#Delta#phi"); + h_delta_phi_truth_cs->SetTitle("#Delta#phi: cs"); + + h_delta_phi_truth_cs_noCR->Draw("HIST same"); + h_delta_phi_truth_cs_noCR->SetLineColor(kRed); + + TLegend *legend_w1_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_truth_delta_phi->SetTextSize(0.04); + legend_w1_truth_delta_phi->SetBorderSize(0); + legend_w1_truth_delta_phi->SetFillStyle(0); // Transparent background + + legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs, "#Delta#phi: cs (CR)", "l"); + legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs_noCR, "#Delta#phi: cs (no CR)", "l"); + legend_w1_truth_delta_phi->Draw(); + + c_delta_phi_truth->cd(2); + h_delta_phi_truth_ud->Draw("HIST"); + h_delta_phi_truth_ud->SetLineColor(kBlue); + h_delta_phi_truth_ud->GetXaxis()->SetTitle("#Delta#phi"); + h_delta_phi_truth_ud->SetTitle("#Delta#phi: ud"); + + h_delta_phi_truth_ud_noCR->Draw("HIST same"); + h_delta_phi_truth_ud_noCR->SetLineColor(kRed); + + TLegend *legend_w2_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_truth_delta_phi->SetTextSize(0.04); + legend_w2_truth_delta_phi->SetBorderSize(0); + legend_w2_truth_delta_phi->SetFillStyle(0); // Transparent background + + legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud, "#Delta#phi: ud (CR)", "l"); + legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud_noCR, "#Delta#phi: ud (no CR)", "l"); + legend_w2_truth_delta_phi->Draw(); - c_angular_dist->cd(1); - h_cos_phi_truth_cs->Draw(); + + TCanvas* c_delta_phi_reco = new TCanvas("c_delta_phi_reco", "Reco Histograms", 1500, 600); + c_delta_phi_reco->Divide(2, 1); + + c_delta_phi_reco->cd(1); + h_delta_phi_c_l0->Draw("HIST"); + h_delta_phi_c_l0->SetLineColor(kBlue); + h_delta_phi_c_l0->GetXaxis()->SetTitle("#Delta#phi"); + h_delta_phi_c_l0->SetTitle("#Delta#phi: W1 #rightarrow c q0"); + + h_delta_phi_c_l0_noCR->Draw("HIST same"); + h_delta_phi_c_l0_noCR->SetLineColor(kRed); + + TLegend *legend_w1_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_reco_delta_phi->SetTextSize(0.04); + legend_w1_reco_delta_phi->SetBorderSize(0); + legend_w1_reco_delta_phi->SetFillStyle(0); // Transparent background + + legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0, "#Delta#phi (CR)", "l"); + legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0_noCR, "#Delta#phi (no CR)", "l"); + legend_w1_reco_delta_phi->Draw(); + + c_delta_phi_reco->cd(2); + h_delta_phi_l1_l2->Draw("HIST"); + h_delta_phi_l1_l2->SetLineColor(kBlue); + h_delta_phi_l1_l2->GetXaxis()->SetTitle("#Delta#phi"); + h_delta_phi_l1_l2->SetTitle("#Delta#phi: W2 #rightarrow q1 q2"); + + h_delta_phi_l1_l2_noCR->Draw("HIST same"); + h_delta_phi_l1_l2_noCR->SetLineColor(kRed); + + TLegend *legend_w2_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_reco_delta_phi->SetTextSize(0.04); + legend_w2_reco_delta_phi->SetBorderSize(0); + legend_w2_reco_delta_phi->SetFillStyle(0); // Transparent background + + legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2, "#Delta#phi (CR)", "l"); + legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "#Delta#phi (no CR)", "l"); + legend_w2_reco_delta_phi->Draw(); + + // ****************************** COS(PHI) DISTRIBUTIONS ****************************** + TCanvas* c_cos_phi_truth = new TCanvas("c_cos_phi_truth", "Truth Histograms", 1500, 600); + c_cos_phi_truth->Divide(2, 1); + + c_cos_phi_truth->cd(1); + h_cos_phi_truth_cs->Draw("HIST"); h_cos_phi_truth_cs->SetLineColor(kBlue); h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + h_cos_phi_truth_cs->SetTitle("cos(#phi): cs"); - h_cos_phi_c_l0->Draw("same"); - h_cos_phi_c_l0->SetLineColor(kRed); + h_cos_phi_truth_cs_noCR->Draw("HIST same"); + h_cos_phi_truth_cs_noCR->SetLineColor(kRed); - TLegend *legend_w1_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_cos_phi->SetTextSize(0.04); - legend_w1_cos_phi->SetBorderSize(0); - legend_w1_cos_phi->SetFillStyle(0); // Transparent background + TLegend *legend_w1_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_truth_cos_phi->SetTextSize(0.04); + legend_w1_truth_cos_phi->SetBorderSize(0); + legend_w1_truth_cos_phi->SetFillStyle(0); // Transparent background - legend_w1_cos_phi->AddEntry(h_cos_phi_truth_cs, "truth cos_phi_cs", "l"); - legend_w1_cos_phi->AddEntry(h_cos_phi_c_l0, "truth cos_phi_c_l0", "l"); - legend_w1_cos_phi->Draw(); + legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs, "cos(#phi): cs (CR)", "l"); + legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs_noCR, "cos(#phi): cs (no CR)", "l"); + legend_w1_truth_cos_phi->Draw(); - c_angular_dist->cd(2); - h_cos_phi_truth_ud->Draw(); + c_cos_phi_truth->cd(2); + h_cos_phi_truth_ud->Draw("HIST"); h_cos_phi_truth_ud->SetLineColor(kBlue); h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); + h_cos_phi_truth_ud->SetTitle("cos(#phi): ud"); + + h_cos_phi_truth_ud_noCR->Draw("HIST same"); + h_cos_phi_truth_ud_noCR->SetLineColor(kRed); + + TLegend *legend_w2_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_truth_cos_phi->SetTextSize(0.04); + legend_w2_truth_cos_phi->SetBorderSize(0); + legend_w2_truth_cos_phi->SetFillStyle(0); // Transparent background + + legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud, "cos(#phi): ud (CR)", "l"); + legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud_noCR, "cos(#phi): ud (no CR)", "l"); + legend_w2_truth_cos_phi->Draw(); + + + TCanvas* c_cos_phi_reco = new TCanvas("c_cos_phi_reco", "Reco Histograms", 1500, 600); + c_cos_phi_reco->Divide(2, 1); + + c_cos_phi_reco->cd(1); + h_cos_phi_c_l0->Draw("HIST"); + h_cos_phi_c_l0->SetLineColor(kBlue); + h_cos_phi_c_l0->GetXaxis()->SetTitle("cos(#phi)"); + h_cos_phi_c_l0->SetTitle("cos(#phi): W1 #rightarrow c q0"); - h_cos_phi_l1_l2->Draw("same"); - h_cos_phi_l1_l2->SetLineColor(kRed); + h_cos_phi_c_l0_noCR->Draw("HIST same"); + h_cos_phi_c_l0_noCR->SetLineColor(kRed); - TLegend *legend_w2_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_cos_phi->SetTextSize(0.04); - legend_w2_cos_phi->SetBorderSize(0); - legend_w2_cos_phi->SetFillStyle(0); // Transparent background + TLegend *legend_w1_reco_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_reco_cos_phi->SetTextSize(0.04); + legend_w1_reco_cos_phi->SetBorderSize(0); + legend_w1_reco_cos_phi->SetFillStyle(0); // Transparent background - legend_w2_cos_phi->AddEntry(h_cos_phi_truth_ud, "truth cos_phi_ud", "l"); - legend_w2_cos_phi->AddEntry(h_cos_phi_l1_l2, "truth cos_phi_l1_l2", "l"); - legend_w2_cos_phi->Draw(); + legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0, "cos(#phi) (CR)", "l"); + legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0_noCR, "cos(#phi) (no CR)", "l"); + legend_w1_reco_cos_phi->Draw(); - // *************************** Energy-Energy Correlators *************************** - TCanvas* c_truth_ee_correlators = new TCanvas("c_truth_ee_correlators", "Truth Histograms", 1500, 600); + c_cos_phi_reco->cd(2); + h_cos_phi_l1_l2->Draw("HIST"); + h_cos_phi_l1_l2->SetLineColor(kBlue); + h_cos_phi_l1_l2->GetXaxis()->SetTitle("cos(#phi)"); + h_cos_phi_l1_l2->SetTitle("cos(#phi): W2 #rightarrow q1 q2"); - c_truth_ee_correlators->cd(); - h_eec_truth_cs->Draw(); + h_cos_phi_l1_l2_noCR->Draw("HIST same"); + h_cos_phi_l1_l2_noCR->SetLineColor(kRed); + + TLegend *legend_w2_cos_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_cos_delta_phi->SetTextSize(0.04); + legend_w2_cos_delta_phi->SetBorderSize(0); + legend_w2_cos_delta_phi->SetFillStyle(0); // Transparent background + + legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2, "cos(#phi) (CR)", "l"); + legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "cos(#phi) (no CR)", "l"); + legend_w2_cos_delta_phi->Draw(); + + // ****************************** E-E CORRELATORS DISTRIBUTIONS ****************************** + TCanvas* c_eec_truth = new TCanvas("c_eec_truth", "Truth Histograms", 1500, 600); + c_eec_truth->Divide(2, 1); + + c_eec_truth->cd(1); + h_eec_truth_cs->Draw("HIST"); h_eec_truth_cs->SetLineColor(kBlue); - h_eec_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + h_eec_truth_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_eec_truth_cs->SetTitle("e-e correlator: cs"); + h_eec_truth_cs->Rebin(2); + h_eec_truth_cs->Scale(1.0 / h_eec_truth_cs->Integral()); - h_eec_truth_ud->Draw("same"); - h_eec_truth_ud->SetLineColor(kRed); + h_eec_truth_cs_noCR->Draw("HIST same"); + h_eec_truth_cs_noCR->SetLineColor(kRed); + h_eec_truth_cs_noCR->Rebin(2); + h_eec_truth_cs_noCR->Scale(1.0 / h_eec_truth_cs_noCR->Integral()); - TLegend *legend_eec_truth = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_eec_truth->SetTextSize(0.04); - legend_eec_truth->SetBorderSize(0); - legend_eec_truth->SetFillStyle(0); // Transparent background + TLegend *legend_w1_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_truth_eec->SetTextSize(0.04); + legend_w1_truth_eec->SetBorderSize(0); + legend_w1_truth_eec->SetFillStyle(0); // Transparent background - legend_eec_truth->AddEntry(h_eec_truth_cs, "W1 #rightarrow cs", "l"); - legend_eec_truth->AddEntry(h_eec_truth_ud, "W1 #rightarrow ud", "l"); - legend_eec_truth->Draw(); + legend_w1_truth_eec->AddEntry(h_eec_truth_cs, "w/ CR", "l"); + legend_w1_truth_eec->AddEntry(h_eec_truth_cs_noCR, "no CR", "l"); + legend_w1_truth_eec->Draw(); - TCanvas* c_ee_correlators = new TCanvas("c_ee_correlators", "Truth Histograms", 1500, 600); + c_eec_truth->cd(2); + h_eec_truth_ud->Draw("HIST"); + h_eec_truth_ud->SetLineColor(kBlue); + h_eec_truth_ud->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_eec_truth_ud->SetTitle("e-e correlator: ud"); + h_eec_truth_ud->Rebin(2); + h_eec_truth_ud->Scale(1.0 / h_eec_truth_ud->Integral()); - c_ee_correlators->cd(); - h_eec_c_l0->Draw(); - h_eec_c_l0->SetLineColor(kBlue); - h_eec_c_l0->GetXaxis()->SetTitle("cos(#phi)"); + h_eec_truth_ud_noCR->Draw("HIST same"); + h_eec_truth_ud_noCR->SetLineColor(kRed); + h_eec_truth_ud_noCR->Rebin(2); + h_eec_truth_ud_noCR->Scale(1.0 / h_eec_truth_ud_noCR->Integral()); + + TLegend *legend_w2_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_truth_eec->SetTextSize(0.04); + legend_w2_truth_eec->SetBorderSize(0); + legend_w2_truth_eec->SetFillStyle(0); // Transparent background + + legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud, "w/ CR", "l"); + legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud_noCR, "no CR", "l"); + legend_w2_truth_eec->Draw(); + + TCanvas* c_eec_truth_ratio = new TCanvas("c_eec_truth_ratio", "Truth Ratio", 1500, 600); + + c_eec_truth_ratio->cd(); + TH1D* h_CR_noCR_cs = (TH1D*)h_eec_truth_cs->Clone("h_CR_noCR_cs"); + h_CR_noCR_cs->Divide(h_eec_truth_cs_noCR); - h_eec_l1_l2->Draw("same"); - h_eec_l1_l2->SetLineColor(kRed); + TH1D* h_CR_noCR_ud = (TH1D*)h_eec_truth_ud->Clone("h_CR_noCR_ud"); + h_CR_noCR_ud->Divide(h_eec_truth_ud_noCR); - TLegend *legend_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_eec->SetTextSize(0.04); - legend_eec->SetBorderSize(0); - legend_eec->SetFillStyle(0); // Transparent background + h_CR_noCR_cs->Draw("HIST"); + h_CR_noCR_cs->SetLineColor(kRed); + h_CR_noCR_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_CR_noCR_cs->GetYaxis()->SetTitle("Ratio: no CR / CR"); + + h_CR_noCR_ud->Draw("HIST same"); + h_CR_noCR_ud->SetLineColor(kBlue); + + TLegend *legend_CR_noCR_truth_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_CR_noCR_truth_ratio->SetTextSize(0.04); + legend_CR_noCR_truth_ratio->SetBorderSize(0); + legend_CR_noCR_truth_ratio->SetFillStyle(0); // Transparent background + + legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_cs, "w/ CR", "l"); + legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_ud, "no CR", "l"); + legend_CR_noCR_truth_ratio->Draw(); + + + + TCanvas* c_eec_reco = new TCanvas("c_eec_reco", "Reco Histograms", 1500, 600); + c_eec_reco->Divide(2, 1); + + c_eec_reco->cd(1); + h_eec_c_l0->Draw("HIST"); + h_eec_c_l0->SetLineColor(kBlue); + h_eec_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_eec_c_l0->SetTitle("e-e correlator: W1 #rightarrow c q0"); + h_eec_c_l0->Rebin(2); + h_eec_c_l0->Scale(1.0 / h_eec_c_l0->Integral()); + + h_eec_c_l0_noCR->Draw("HIST same"); + h_eec_c_l0_noCR->SetLineColor(kRed); + h_eec_c_l0_noCR->Rebin(2); + h_eec_c_l0_noCR->Scale(1.0 / h_eec_c_l0_noCR->Integral()); + + TLegend *legend_w1_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w1_reco_eec->SetTextSize(0.04); + legend_w1_reco_eec->SetBorderSize(0); + legend_w1_reco_eec->SetFillStyle(0); // Transparent background + + legend_w1_reco_eec->AddEntry(h_eec_c_l0, "w/ CR", "l"); + legend_w1_reco_eec->AddEntry(h_eec_c_l0_noCR, "no CR", "l"); + legend_w1_reco_eec->Draw(); + + c_eec_reco->cd(2); + h_eec_l1_l2->Draw("HIST"); + h_eec_l1_l2->SetLineColor(kBlue); + h_eec_l1_l2->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_eec_l1_l2->SetTitle("e-e correlator: W2 #rightarrow q1 q2"); + h_eec_l1_l2->Rebin(2); + h_eec_l1_l2->Scale(1.0 / h_eec_l1_l2->Integral()); + + h_eec_l1_l2_noCR->Draw("HIST same"); + h_eec_l1_l2_noCR->SetLineColor(kRed); + h_eec_l1_l2_noCR->Rebin(2); + h_eec_l1_l2_noCR->Scale(1.0 / h_eec_l1_l2_noCR->Integral()); + + TLegend *legend_w2_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_w2_reco_eec->SetTextSize(0.04); + legend_w2_reco_eec->SetBorderSize(0); + legend_w2_reco_eec->SetFillStyle(0); // Transparent background + + legend_w2_reco_eec->AddEntry(h_eec_l1_l2, "w/ CR", "l"); + legend_w2_reco_eec->AddEntry(h_eec_l1_l2_noCR, "no CR", "l"); + legend_w2_reco_eec->Draw(); + + TCanvas* c_eec_reco_ratio = new TCanvas("c_eec_reco_ratio", "Reco Ratio", 1500, 600); + + c_eec_reco_ratio->cd(); + TH1D* h_CR_noCR_c_l0 = (TH1D*)h_eec_c_l0->Clone("h_CR_noCR_c_l0"); + h_CR_noCR_c_l0->Divide(h_eec_c_l0_noCR); + + TH1D* h_CR_noCR_l1_l2 = (TH1D*)h_eec_l1_l2->Clone("h_CR_noCR_l1_l2"); + h_CR_noCR_l1_l2->Divide(h_eec_l1_l2_noCR); + + h_CR_noCR_c_l0->Draw("HIST"); + h_CR_noCR_c_l0->SetLineColor(kRed); + h_CR_noCR_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); + h_CR_noCR_c_l0->GetYaxis()->SetTitle("Ratio: no CR / CR"); + + h_CR_noCR_l1_l2->Draw("HIST same"); + h_CR_noCR_l1_l2->SetLineColor(kBlue); + + TLegend *legend_CR_noCR_reco_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); + legend_CR_noCR_reco_ratio->SetTextSize(0.04); + legend_CR_noCR_reco_ratio->SetBorderSize(0); + legend_CR_noCR_reco_ratio->SetFillStyle(0); // Transparent background + + legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_c_l0, "w/ CR", "l"); + legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_l1_l2, "no CR", "l"); + legend_CR_noCR_reco_ratio->Draw(); - legend_eec->AddEntry(h_eec_c_l0, "truth cos_phi_ud", "l"); - legend_eec->AddEntry(h_eec_l1_l2, "truth cos_phi_l1_l2", "l"); - legend_eec->Draw(); c_W1_W2_mass->Write(); c_W1_W2_p->Write(); c_W1_W2_e->Write(); - c_angular_dist->Write(); - c_truth_ee_correlators->Write(); - c_ee_correlators->Write(); + c_delta_phi_truth->Write(); + c_delta_phi_reco->Write(); + c_cos_phi_truth->Write(); + c_cos_phi_reco->Write(); + c_eec_truth->Write(); + c_eec_truth_ratio->Write(); + c_eec_reco->Write(); + c_eec_reco_ratio->Write(); Plots_WWCR->Write(); Plots_WWCR->Close(); From 1adc643560e1dc486b8ff1ec1ad470f185291903 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 11 Jul 2025 08:28:34 -0400 Subject: [PATCH 09/40] modified the function that selects hadronic decays using truth info --- PostCutCode/Root/AnalysisWWCR.cxx | 133 +++++++++++++++++++----------- 1 file changed, 83 insertions(+), 50 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 564261a..1689e95 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -44,22 +44,31 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_phi, TH1F* hist_cosphi, TH1F* hist_eec) { - // double phi = jet1.Angle(jet2.Vect()); - double phi = jet1.Phi() - jet2.Phi(); - // double phi = TVector2::Phi_mpi_pi(jet1.Phi() - jet2.Phi()); // ensures that everything is from [-pi, pi]?? - double cos_phi = cos(phi); +enum DecayType {cs = 0, ud, us, ub, cd, cb}; +std::vector> allowedDecayPairs = { + {cs, ud} + // {cs, cs}, {cs, ud}, {ud, cs}, {ud, ud} // Leave empty to allow all +}; + +void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_theta, TH1F *hist_delta_theta, TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec) { + double theta = jet1.Angle(jet2.Vect()); + double delta_theta = jet1.Theta() - jet2.Theta(); + + double delta_eta = jet1.Eta() - jet2.Eta(); + double delta_phi = jet1.Phi() - jet2.Phi(); + double cos_phi = cos(delta_phi); double ee_correlator = 0.5 * (1 - cos_phi); - // double ee_correlator = 1 - cos_phi; - hist_phi->Fill(phi); + hist_theta->Fill(theta); + hist_delta_theta->Fill(delta_theta); + hist_delta_eta->Fill(delta_eta); + hist_delta_phi->Fill(delta_phi); hist_cosphi->Fill(cos_phi); hist_eec->Fill(ee_correlator); } -void AnalysisWWCR::run() -{ +void AnalysisWWCR::run() { std::vector cutFlowMap {"All Events", "DecayCuts", "NoNaNFlavScore", "Has 4 Jets", "leptonCut", "d123Cut", "d34Cut", "Events have a c, s, and 2 l tagged jets"}; @@ -77,8 +86,17 @@ void AnalysisWWCR::run() auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); - auto h_phi_truth_cs = m_histContainer->get1DHist("h_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_phi_truth_ud = m_histContainer->get1DHist("h_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); @@ -107,15 +125,20 @@ void AnalysisWWCR::run() auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 300, -1, 1); - // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 300, -1, 1); - // auto h_cos_phi_s_l1 = m_histContainer->get1DHist("h_cos_phi_s_l1", 300, -1, 1); - // auto h_cos_phi_s_l2 = m_histContainer->get1DHist("h_cos_phi_s_l2", 300, -1, 1); auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); @@ -171,6 +194,14 @@ void AnalysisWWCR::run() varMember> truth_Wp_theta {tree, "truth_Wp_Daugthers_theta"}; varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; + // Jet Substructure Information (from the anti_kt algorithm) + varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; + varMember> jetconstituents_kt4_PID {tree, "jetconstituents_kt4_PID"}; + varMember> jetconstituents_kt4_charge {tree, "jetconstituents_kt4_charge"}; + varMember> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; + varMember> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; + varMember> jetconstituents_kt4_phi {tree, "jetconstituents_kt4_phi"}; + varMember> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; // Increment for CutFlow int NEvents = 0; @@ -221,18 +252,41 @@ void AnalysisWWCR::run() QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); - // bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + bool W1_is_us = ( (W1_quarks.n_u == 1 && W1_quarks.n_s == 1) ); + bool W1_is_ub = ( (W1_quarks.n_u == 1 && W1_quarks.n_b == 1) ); + bool W1_is_cd = ( (W1_quarks.n_c == 1 && W1_quarks.n_d == 1) ); + bool W1_is_cb = ( (W1_quarks.n_c == 1 && W1_quarks.n_b == 1) ); - // bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); + bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); + bool W2_is_us = ( (W2_quarks.n_u == 1 && W2_quarks.n_s == 1) ); + bool W2_is_ub = ( (W2_quarks.n_u == 1 && W2_quarks.n_b == 1) ); + bool W2_is_cd = ( (W2_quarks.n_c == 1 && W2_quarks.n_d == 1) ); + bool W2_is_cb = ( (W2_quarks.n_c == 1 && W2_quarks.n_b == 1) ); + + int W1_decay_idx = -1, W2_decay_idx = -1; + bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; + bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; + for (int i = 0; i < 6; ++i) { + if (W1_decay_types[i]) W1_decay_idx = i; + if (W2_decay_types[i]) W2_decay_idx = i; + } - if (! ( - (W1_is_cs && W2_is_ud) - // (W1_is_ud && W2_is_ud) - // (W1_is_cs && W2_is_cs) - )) continue; + if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; NdecayCuts++; + + // if (! ( + // (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cb) || + // (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cb) || + // (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cb) || + // (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cb) || + // (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cb) || + // (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cb) + // )) continue; + + // NdecayCuts++; // Adds the requirement that an event has 4 jets if(event_njet() != 4) continue; @@ -456,8 +510,8 @@ void AnalysisWWCR::run() h_W1_truth_e->Fill(W1_truthJet.E()); h_W2_truth_e->Fill(W2_truthJet.E()); - CosPhi_Angle(W1_jet1, W1_jet2, h_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); - CosPhi_Angle(W2_jet1, W2_jet2, h_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); + CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); + CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); double counts_eec_truth_cs = h_eec_truth_cs->Integral(); double counts_eec_truth_ud = h_eec_truth_ud->Integral(); @@ -584,29 +638,8 @@ void AnalysisWWCR::run() } // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - // CosPhi_Angle(W1_j1, W1_j2, h_cos_phi_c_l0); - // CosPhi_Angle(W2_j1, W2_j2, h_cos_phi_l1_l2); - // CosPhi_Angle(W1_j1, W2_j1, h_cos_phi_c_l1); - // CosPhi_Angle(W1_j1, W2_j2, h_cos_phi_c_l2); - // CosPhi_Angle(W1_j2, W2_j1, h_cos_phi_s_l1); - // CosPhi_Angle(W1_j2, W2_j2, h_cos_phi_s_l2); - - CosPhi_Angle(W1_j1, W1_j2, h_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); - - // double counts_eec_c_l0 = h_eec_c_l0->Integral(); - // double counts_eec_l1_l2 = h_eec_l1_l2->Integral(); - - // if (counts_eec_c_l0 > 0) - // h_eec_c_l0->Scale(1.0 / (counts_eec_c_l0 * h_eec_c_l0->GetXaxis()->GetBinWidth(1))); - - // if (counts_eec_l1_l2 > 0) - // h_eec_l1_l2->Scale(1.0 / (counts_eec_l1_l2 * h_eec_l1_l2->GetXaxis()->GetBinWidth(1))); - - // h_eec_c_l0->Scale(1.0/counts_eec_c_l0); - // h_eec_l1_l2->Scale(1.0/counts_eec_l1_l2); - - + CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); + CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -630,7 +663,7 @@ void AnalysisWWCR::run() std::cout << " " << std::endl; std::cout << " " << std::endl; - std::cout << "Let there be data ;)" << std::endl; + std::cout << "Let there be data :)" << std::endl; // end of macro } From db6ea1a5979f9d434e332af68ad4df113ccaa7f6 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 11 Jul 2025 17:23:57 -0400 Subject: [PATCH 10/40] started the process of adding in the jet constituents --- PostCutCode/Root/AnalysisWWCR.cxx | 152 +++++++++++++++++++----------- 1 file changed, 98 insertions(+), 54 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 1689e95..bd22138 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -6,11 +6,11 @@ #include #include #include "TLorentzVector.h" +// #include "Root" #include "TH1F.h" #include - using namespace std; // Base class @@ -44,12 +44,6 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -enum DecayType {cs = 0, ud, us, ub, cd, cb}; -std::vector> allowedDecayPairs = { - {cs, ud} - // {cs, cs}, {cs, ud}, {ud, cs}, {ud, ud} // Leave empty to allow all -}; - void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_theta, TH1F *hist_delta_theta, TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec) { double theta = jet1.Angle(jet2.Vect()); double delta_theta = jet1.Theta() - jet2.Theta(); @@ -127,21 +121,45 @@ void AnalysisWWCR::run() { auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); + auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); + auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); + auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); + auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); + auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); + auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); + auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -194,14 +212,16 @@ void AnalysisWWCR::run() { varMember> truth_Wp_theta {tree, "truth_Wp_Daugthers_theta"}; varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; - // Jet Substructure Information (from the anti_kt algorithm) - varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; - varMember> jetconstituents_kt4_PID {tree, "jetconstituents_kt4_PID"}; - varMember> jetconstituents_kt4_charge {tree, "jetconstituents_kt4_charge"}; - varMember> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; - varMember> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; - varMember> jetconstituents_kt4_phi {tree, "jetconstituents_kt4_phi"}; - varMember> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; + // Jet Constituents + std::vector> *jetconstituents_kt4_e;; + std::vector> *jetconstituents_kt4_p; + std::vector> *jetconstituents_kt4_phi; + std::vector> *jetconstituents_kt4_theta; + + tree->SetBranchAddress("jetconstituents_kt4_p", &jetconstituents_kt4_p); + tree->SetBranchAddress("jetconstituents_kt4_e", &jetconstituents_kt4_e); + tree->SetBranchAddress("jetconstituents_kt4_theta", &jetconstituents_kt4_theta); + tree->SetBranchAddress("jetconstituents_kt4_phi", &jetconstituents_kt4_phi); // Increment for CutFlow int NEvents = 0; @@ -222,7 +242,6 @@ void AnalysisWWCR::run() { for(int i = 0; i < nEntries; i++) { treeCont->getEntry(i); - // Just to store how many events were run over countingHist->Fill(1); NEvents++; @@ -243,52 +262,48 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; - nPrinted++; // Count only after printing all blocks for this event + nPrinted++; } eventNum++; - QuarkCounter W1_quarks = countQuarks(Wm_jet_truth); - QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); - - bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); - bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); - bool W1_is_us = ( (W1_quarks.n_u == 1 && W1_quarks.n_s == 1) ); - bool W1_is_ub = ( (W1_quarks.n_u == 1 && W1_quarks.n_b == 1) ); - bool W1_is_cd = ( (W1_quarks.n_c == 1 && W1_quarks.n_d == 1) ); - bool W1_is_cb = ( (W1_quarks.n_c == 1 && W1_quarks.n_b == 1) ); - - bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); - bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); - bool W2_is_us = ( (W2_quarks.n_u == 1 && W2_quarks.n_s == 1) ); - bool W2_is_ub = ( (W2_quarks.n_u == 1 && W2_quarks.n_b == 1) ); - bool W2_is_cd = ( (W2_quarks.n_c == 1 && W2_quarks.n_d == 1) ); - bool W2_is_cb = ( (W2_quarks.n_c == 1 && W2_quarks.n_b == 1) ); - - int W1_decay_idx = -1, W2_decay_idx = -1; - bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; - bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; - for (int i = 0; i < 6; ++i) { - if (W1_decay_types[i]) W1_decay_idx = i; - if (W2_decay_types[i]) W2_decay_idx = i; - } - - if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; + // ******************************* DELETE THIS SECTION ??? ******************************* + // QuarkCounter W1_quarks = countQuarks(Wm_jet_truth); + // QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); + + // bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); + // bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + // bool W1_is_us = ( (W1_quarks.n_u == 1 && W1_quarks.n_s == 1) ); + // bool W1_is_ub = ( (W1_quarks.n_u == 1 && W1_quarks.n_b == 1) ); + // bool W1_is_cd = ( (W1_quarks.n_c == 1 && W1_quarks.n_d == 1) ); + // bool W1_is_cb = ( (W1_quarks.n_c == 1 && W1_quarks.n_b == 1) ); + + // bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); + // bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); + // bool W2_is_us = ( (W2_quarks.n_u == 1 && W2_quarks.n_s == 1) ); + // bool W2_is_ub = ( (W2_quarks.n_u == 1 && W2_quarks.n_b == 1) ); + // bool W2_is_cd = ( (W2_quarks.n_c == 1 && W2_quarks.n_d == 1) ); + // bool W2_is_cb = ( (W2_quarks.n_c == 1 && W2_quarks.n_b == 1) ); + + // int W1_decay_idx = -1, W2_decay_idx = -1; + // bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; + // bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; + // for (int i = 0; i < 6; ++i) { + // if (W1_decay_types[i]) W1_decay_idx = i; + // if (W2_decay_types[i]) W2_decay_idx = i; + // } + + // if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; - NdecayCuts++; + // NdecayCuts++; // if (! ( - // (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cb) || - // (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cb) || - // (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cb) || - // (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cb) || - // (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cb) || - // (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cb) + // (W1_is_cs && W2_is_cs) // )) continue; // NdecayCuts++; + // ******************************* DELETE THIS SECTION ??? ******************************* - // Adds the requirement that an event has 4 jets if(event_njet() != 4) continue; NjetCut++; @@ -457,7 +472,32 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; } - // ****************************** CALCULATIONS USING TRUTH VARIABLES ****************************** + // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** + std::vector jetConstituents; + for (size_t i = 0; i < jetconstituents_kt4_p->size(); ++i) { + const auto& constituent_p = jetconstituents_kt4_p->at(i); + const auto& constituent_e = jetconstituents_kt4_e->at(i); + const auto& constituent_theta = jetconstituents_kt4_theta->at(i); + const auto& constituent_phi = jetconstituents_kt4_phi->at(i); + + for (size_t j = 0; j < constituent_p.size(); ++j) { + float p = constituent_p[j]; + float e = constituent_e[j]; + float theta = constituent_theta[j]; + float phi = constituent_phi[j]; + + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector lv; + + lv.SetPxPyPzE(px, py, pz, e); + jetConstituents.push_back(lv); + } + } + + // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** std::vector truthJets_Wm, truthJets_Wp; for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { @@ -523,7 +563,7 @@ void AnalysisWWCR::run() { h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); } - // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE ************************** + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); @@ -639,7 +679,11 @@ void AnalysisWWCR::run() { // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); + CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); + CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); + CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); + CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); + CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); From 259c7aaa8eddb61b2101013b3c56db78e381c538 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Sun, 13 Jul 2025 23:02:59 -0400 Subject: [PATCH 11/40] Python version of Plots_AnalysisWWCR --- PostCutCode/Root/WWCR_Analysis_Plots.ipynb | 1472 ++++++++++++++++++++ 1 file changed, 1472 insertions(+) create mode 100644 PostCutCode/Root/WWCR_Analysis_Plots.ipynb diff --git a/PostCutCode/Root/WWCR_Analysis_Plots.ipynb b/PostCutCode/Root/WWCR_Analysis_Plots.ipynb new file mode 100644 index 0000000..6de0bdc --- /dev/null +++ b/PostCutCode/Root/WWCR_Analysis_Plots.ipynb @@ -0,0 +1,1472 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 214, + "id": "92483cec-6bb9-4937-818f-89a501f7238c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Histograms in file: test\n", + "test/Nominal\n", + "test/Nominal/counting_WW\n", + "test/Nominal/cutFlowHist_WW\n", + "test/Nominal/h_W1_truth_mass_WW\n", + "test/Nominal/h_W2_truth_mass_WW\n", + "test/Nominal/h_W1_truth_p_WW\n", + "test/Nominal/h_W2_truth_p_WW\n", + "test/Nominal/h_W1_truth_e_WW\n", + "test/Nominal/h_W2_truth_e_WW\n", + "test/Nominal/h_theta_truth_cs_WW\n", + "test/Nominal/h_theta_truth_ud_WW\n", + "test/Nominal/h_delta_theta_truth_cs_WW\n", + "test/Nominal/h_delta_theta_truth_ud_WW\n", + "test/Nominal/h_delta_eta_truth_cs_WW\n", + "test/Nominal/h_delta_eta_truth_ud_WW\n", + "test/Nominal/h_delta_phi_truth_cs_WW\n", + "test/Nominal/h_delta_phi_truth_ud_WW\n", + "test/Nominal/h_cos_phi_truth_cs_WW\n", + "test/Nominal/h_cos_phi_truth_ud_WW\n", + "test/Nominal/h_eec_truth_cs_WW\n", + "test/Nominal/h_eec_truth_ud_WW\n", + "test/Nominal/h_W1_mass_WW\n", + "test/Nominal/h_W2_mass_WW\n", + "test/Nominal/h_chi2_WW\n", + "test/Nominal/cJet_pt_WW\n", + "test/Nominal/lJet0_pt_WW\n", + "test/Nominal/lJet1_pt_WW\n", + "test/Nominal/lJet2_pt_WW\n", + "test/Nominal/cJet_p_WW\n", + "test/Nominal/lJet0_p_WW\n", + "test/Nominal/lJet1_p_WW\n", + "test/Nominal/lJet2_p_WW\n", + "test/Nominal/h_W1_p_WW\n", + "test/Nominal/h_W2_p_WW\n", + "test/Nominal/h_W1_e_WW\n", + "test/Nominal/h_W2_e_WW\n", + "test/Nominal/h_theta_c_l0_WW\n", + "test/Nominal/h_theta_l1_l2_WW\n", + "test/Nominal/h_theta_c_l1_WW\n", + "test/Nominal/h_theta_c_l2_WW\n", + "test/Nominal/h_theta_l0_l1_WW\n", + "test/Nominal/h_theta_l0_l2_WW\n", + "test/Nominal/h_delta_theta_c_l0_WW\n", + "test/Nominal/h_delta_theta_l1_l2_WW\n", + "test/Nominal/h_delta_theta_c_l1_WW\n", + "test/Nominal/h_delta_theta_c_l2_WW\n", + "test/Nominal/h_delta_theta_l0_l1_WW\n", + "test/Nominal/h_delta_theta_l0_l2_WW\n", + "test/Nominal/h_delta_eta_c_l0_WW\n", + "test/Nominal/h_delta_eta_l1_l2_WW\n", + "test/Nominal/h_delta_eta_c_l1_WW\n", + "test/Nominal/h_delta_eta_c_l2_WW\n", + "test/Nominal/h_delta_eta_l0_l1_WW\n", + "test/Nominal/h_delta_eta_l0_l2_WW\n", + "test/Nominal/h_delta_phi_c_l0_WW\n", + "test/Nominal/h_delta_phi_l1_l2_WW\n", + "test/Nominal/h_delta_phi_c_l1_WW\n", + "test/Nominal/h_delta_phi_c_l2_WW\n", + "test/Nominal/h_delta_phi_l0_l1_WW\n", + "test/Nominal/h_delta_phi_l0_l2_WW\n", + "test/Nominal/h_cos_phi_c_l0_WW\n", + "test/Nominal/h_cos_phi_l1_l2_WW\n", + "test/Nominal/h_cos_phi_c_l1_WW\n", + "test/Nominal/h_cos_phi_c_l2_WW\n", + "test/Nominal/h_cos_phi_l0_l1_WW\n", + "test/Nominal/h_cos_phi_l0_l2_WW\n", + "test/Nominal/h_eec_c_l0_WW\n", + "test/Nominal/h_eec_l1_l2_WW\n", + "\n", + "Histograms in file: test_noCR\n", + "test_noCR/Nominal\n", + "test_noCR/Nominal/counting_WW\n", + "test_noCR/Nominal/cutFlowHist_WW\n", + "test_noCR/Nominal/h_W1_truth_mass_WW\n", + "test_noCR/Nominal/h_W2_truth_mass_WW\n", + "test_noCR/Nominal/h_W1_truth_p_WW\n", + "test_noCR/Nominal/h_W2_truth_p_WW\n", + "test_noCR/Nominal/h_W1_truth_e_WW\n", + "test_noCR/Nominal/h_W2_truth_e_WW\n", + "test_noCR/Nominal/h_theta_truth_cs_WW\n", + "test_noCR/Nominal/h_theta_truth_ud_WW\n", + "test_noCR/Nominal/h_delta_theta_truth_cs_WW\n", + "test_noCR/Nominal/h_delta_theta_truth_ud_WW\n", + "test_noCR/Nominal/h_delta_eta_truth_cs_WW\n", + "test_noCR/Nominal/h_delta_eta_truth_ud_WW\n", + "test_noCR/Nominal/h_delta_phi_truth_cs_WW\n", + "test_noCR/Nominal/h_delta_phi_truth_ud_WW\n", + "test_noCR/Nominal/h_cos_phi_truth_cs_WW\n", + "test_noCR/Nominal/h_cos_phi_truth_ud_WW\n", + "test_noCR/Nominal/h_eec_truth_cs_WW\n", + "test_noCR/Nominal/h_eec_truth_ud_WW\n", + "test_noCR/Nominal/h_W1_mass_WW\n", + "test_noCR/Nominal/h_W2_mass_WW\n", + "test_noCR/Nominal/h_chi2_WW\n", + "test_noCR/Nominal/cJet_pt_WW\n", + "test_noCR/Nominal/lJet0_pt_WW\n", + "test_noCR/Nominal/lJet1_pt_WW\n", + "test_noCR/Nominal/lJet2_pt_WW\n", + "test_noCR/Nominal/cJet_p_WW\n", + "test_noCR/Nominal/lJet0_p_WW\n", + "test_noCR/Nominal/lJet1_p_WW\n", + "test_noCR/Nominal/lJet2_p_WW\n", + "test_noCR/Nominal/h_W1_p_WW\n", + "test_noCR/Nominal/h_W2_p_WW\n", + "test_noCR/Nominal/h_W1_e_WW\n", + "test_noCR/Nominal/h_W2_e_WW\n", + "test_noCR/Nominal/h_theta_c_l0_WW\n", + "test_noCR/Nominal/h_theta_l1_l2_WW\n", + "test_noCR/Nominal/h_theta_c_l1_WW\n", + "test_noCR/Nominal/h_theta_c_l2_WW\n", + "test_noCR/Nominal/h_theta_l0_l1_WW\n", + "test_noCR/Nominal/h_theta_l0_l2_WW\n", + "test_noCR/Nominal/h_delta_theta_c_l0_WW\n", + "test_noCR/Nominal/h_delta_theta_l1_l2_WW\n", + "test_noCR/Nominal/h_delta_theta_c_l1_WW\n", + "test_noCR/Nominal/h_delta_theta_c_l2_WW\n", + "test_noCR/Nominal/h_delta_theta_l0_l1_WW\n", + "test_noCR/Nominal/h_delta_theta_l0_l2_WW\n", + "test_noCR/Nominal/h_delta_eta_c_l0_WW\n", + "test_noCR/Nominal/h_delta_eta_l1_l2_WW\n", + "test_noCR/Nominal/h_delta_eta_c_l1_WW\n", + "test_noCR/Nominal/h_delta_eta_c_l2_WW\n", + "test_noCR/Nominal/h_delta_eta_l0_l1_WW\n", + "test_noCR/Nominal/h_delta_eta_l0_l2_WW\n", + "test_noCR/Nominal/h_delta_phi_c_l0_WW\n", + "test_noCR/Nominal/h_delta_phi_l1_l2_WW\n", + "test_noCR/Nominal/h_delta_phi_c_l1_WW\n", + "test_noCR/Nominal/h_delta_phi_c_l2_WW\n", + "test_noCR/Nominal/h_delta_phi_l0_l1_WW\n", + "test_noCR/Nominal/h_delta_phi_l0_l2_WW\n", + "test_noCR/Nominal/h_cos_phi_c_l0_WW\n", + "test_noCR/Nominal/h_cos_phi_l1_l2_WW\n", + "test_noCR/Nominal/h_cos_phi_c_l1_WW\n", + "test_noCR/Nominal/h_cos_phi_c_l2_WW\n", + "test_noCR/Nominal/h_cos_phi_l0_l1_WW\n", + "test_noCR/Nominal/h_cos_phi_l0_l2_WW\n", + "test_noCR/Nominal/h_eec_c_l0_WW\n", + "test_noCR/Nominal/h_eec_l1_l2_WW\n" + ] + } + ], + "source": [ + "import uproot\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib as mpl\n", + "import numpy as np\n", + "import scipy\n", + "from scipy.optimize import curve_fit\n", + "\n", + "# Open each file into a separate variable\n", + "files = {\n", + " \"test\": uproot.open(\"FCCeePostCutCode/run/test.root\"),\n", + " \"test_noCR\": uproot.open(\"FCCeePostCutCode/run/test_noCR.root\")\n", + "}\n", + "\n", + "# Example: list the keys from each file\n", + "for label, f in files.items():\n", + " print(f\"\\nHistograms in file: {label}\")\n", + " keys = [key.replace(';1','') for key in f.keys()]\n", + " for k in keys:\n", + " print(f\"{label}/{k}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "65a54fed-8b1f-444e-b21a-44a90be84b20", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAADftElEQVR4nOzdeVyVdfr/8fcNsrmACiouCJqCooFmZJopjaS2p2brdzRnspzwl2aW0yaluVRmZtpmk2bL6Dhhmk3OmIWOS4bbhIGopWIqKi6AoqCcz++PE0ePgIICh+X1fDzux5lzb+c6Rxquc3Hd120ZY4wAAAAAAAAAAEAhbq4OAAAAAAAAAACAyooiOgAAAAAAAAAAxaCIDgAAAAAAAABAMSiiAwAAAAAAAABQDIroAAAAAAAAAAAUgyI6AAAAAAAAAADFoIgOAAAAAAAAAEAxKKIDAAAAAAAAAFAMiugAAAAAAAAAABSDIjoAAAAAAAAAAMWgiA6gWps7d64sy5JlWVq9enWh7cYYBQUFybIs3X777S6IsHxMmjRJX375Zbm/zo8//ijLsvTmm28W2nbXXXfJsizNmTOn0LaePXuqefPmTud5/PHH1aVLF3l4eMiyrFLFERIS4vh3vnDp169f6d9YOaiofxMAAIDKity8fJVFbm6z2TR37lzdeeedCgoKUp06ddSxY0e98sorOn36dIniIDcHUB1RRAdQI3h7e+vzzz8vtH7lypX67bff5OXl5YKoyk9FJYXXXHONateuXeSXoLVr16pWrVpas2aN0/q8vDwlJibqhhtucKz717/+pQ8//FCWZal169aXFUunTp30ySefFFqeeeaZyzpfWSNRBwAAsCM3Lx9lkZvn5ORo6NChOnz4sIYPH67p06fruuuuU1xcnG655RYZY0oUC7k5gOqmlqsDAICKcOutt2rhwoWaMWOGatU69399n3/+ubp06aKMjAwXRld11apVS127di2UjKempiojI0MPPvhgoSR+48aNOn36tHr06OFY95e//EVjx46Vj4+PRowYoe3bt5c6lubNm+v//u//Lu+NAAAAoMKQm5ePssjNPT09tWbNGnXv3t2xz7BhwxQSEqK4uDitWLFCMTExl4yF3BxAdUMnOoAa4YEHHtCRI0e0fPlyx7q8vDz985//1IMPPljkMSdPntRTTz2loKAgeXl5KSwsTFOnTi3UfWFZlkaMGKGFCxcqPDxcPj4+6tatm5KSkiRJ77//vtq0aSNvb29FR0dr9+7dhV5r/fr16tevn/z8/FS7dm316tWrUPL70ksvybIs7dy5Uw8//LDq168vPz8/DR06VDk5OU7xnDx5Uh9//LHjssmHH35YkrRnzx49/vjjCgsLk4+Pj/z9/TVo0KAiY/rll1/0yy+/XPKz7dGjhw4ePKidO3c61q1Zs0a+vr569NFHHUn7+dsKjivQpEkT+fj4XPK1rsTUqVNlWZb27NlTaNuzzz4rT09PHTt2zLGuov5NsrOzNWrUKIWEhMjLy0uNGzfWzTffrE2bNpXPBwEAAOBi5OYPS6qcubmnp6dTAb1A//79JUkpKSmXjKEkyM0BVDUU0QHUCCEhIerWrZv+/ve/O9Z98803yszM1P33319of2OM7rzzTr355pvq16+fpk2bprCwMD399NMaPXp0of3/+9//6qmnntKQIUP00ksvKSUlRbfffrtmzZqlGTNm6PHHH9fTTz+tdevW6U9/+pPTsd9995169uyprKwsxcXFadKkSTp+/Lj+8Ic/6Mcffyz0Wvfee6+ys7M1efJk3XvvvZo7d65efvllx/ZPPvlEXl5euvHGGx2XTT722GOSpMTERK1du1b333+/ZsyYoeHDh2vFihWKjo52SiwlqXfv3urdu/clP9uChPv8rpY1a9bo+uuvV9euXeXh4aG1a9c6batXr54iIyMvee7SOHPmjDIyMgotp06dkmT/3CzL0j/+8Y9Cx/7jH/9Qnz591KBBA0kV+28yfPhwvfvuuxo4cKDeeecdjRkzRj4+PmX2BQUAAKCyITeverl5enq6JCkgIOCSMUjk5gCqIQMA1dicOXOMJJOYmGhmzpxp6tWrZ3JycowxxgwaNMjcdNNNxhhjgoODzW233eY47ssvvzSSzCuvvOJ0vnvuucdYlmV27tzpWCfJeHl5mV27djnWvf/++0aSCQwMNFlZWY71zz77rJHk2Ndms5m2bduavn37GpvN5tgvJyfHtGrVytx8882OdXFxcUaS+dOf/uQUU//+/Y2/v7/Tujp16pghQ4YU+jwK3vv51q1bZySZefPmOa0PDg42wcHBhfa/UFZWlnF3dzd//vOfHevCwsLMyy+/bIwx5rrrrjNPP/20Y1ujRo2c3teFYmNjTWl/PQUHBxtJRS6TJ0927NetWzfTpUsXp2N//PFHp/df0f8mfn5+JjY2tlTvFwAAoCoiN3dWFXLzAjExMcbX19ccO3bskvuSmwOojuhEB1Bj3HvvvTp16pSWLl2q7OxsLV26tNjLRf/1r3/J3d1dTzzxhNP6p556SsYYffPNN07re/furZCQEMfzrl27SpIGDhyoevXqFVr/66+/SpK2bNmiHTt26MEHH9SRI0ccHRonT55U7969tWrVKtlsNqfXGj58uNPzG2+8UUeOHFFWVtYlP4PzR6acOXNGR44cUZs2bVS/fv1Clyju3r27yEtJL1SvXj1FREQ4ul0yMjKUmprquAz0hhtucFxquX37dh0+fNhplEtZ6dq1q5YvX15oeeCBBxz73Hfffdq4caPTpbALFiyQl5eX7rrrLkkV/29Sv359rV+/Xvv377+Stw8AAFClkJtXndx80qRJ+vbbbzVlyhTVr1//kjFI5OYAqh9uLAqgxmjUqJFiYmL0+eefKycnR/n5+brnnnuK3HfPnj1q1qyZU5ItSe3bt3dsP1/Lli2dnvv5+UmSgoKCilxfMN9vx44dkqQhQ4YUG3dmZqbjUsaiXqtg27Fjx+Tr61vseSTp1KlTmjx5subMmaN9+/Y5zZDMzMy86LEX06NHD7399tvKyMjQ2rVr5e7uruuvv16S1L17d73zzjvKzc0tch56WQkICLjkTY4GDRqk0aNHa8GCBXruuedkjNHChQt1yy23OD67iv43ee211zRkyBAFBQWpS5cuuvXWWzV48GC1bt36oscBAABUZeTmVSM3X7BggV544QX9+c9/1l/+8pcSx0BuDqC6oYgOoEZ58MEHNWzYMKWnp+uWW24pcSfFpbi7u5dqfUGCXNA18frrr6tTp05F7lu3bt1SnfNi/t//+3+aM2eORo0apW7dusnPz0+WZen+++8v1MFRGgWJ+po1a7R27VpdffXVjri7d++u3NxcJSYmavXq1apVq5Yjia9ozZo104033qh//OMfeu655/TDDz8oLS1Nr776qmOfiv43uffee3XjjTdq0aJF+s9//qPXX39dr776quLj43XLLbeU8J0BAABUPeTmlTs3X758uQYPHqzbbrtN77333mXHUxxycwBVCUV0ADVK//799dhjj+mHH37QggULit0vODhY3377rbKzs506XrZt2+bYXhauuuoqSZKvr+8lOzVKw7KsItf/85//1JAhQ/TGG2841p0+fVrHjx+/otc7/wZG69at0w033ODY1qxZMwUHB2vNmjVas2aNOnfurNq1a1/R612J++67T48//rhSU1O1YMEC1a5dW3fccYdje0X/m0hS06ZN9fjjj+vxxx/XoUOHdM0112jixIkk6gAAoFojN6+8ufn69evVv39/XXvttfrHP/6hWrXKp3xEbg6gqmAmOoAapW7dunr33Xf10ksvOSVnF7r11luVn5+vmTNnOq1/8803ZVlWmSVQXbp00VVXXaWpU6fqxIkThbYfPnz4ss5bp06dIpNvd3f3Qh0Yb7/9tvLz8wvt+8svvzjNJ7yYZs2aqVWrVlqxYoU2bNjgmLlYoHv37vryyy+VmppaLqNcSmPgwIFyd3fX3//+dy1cuFC333676tSp49hekf8m+fn5hS7Vbdy4sZo1a6bc3NzLeh0AAICqgty8cubmKSkpuu222xQSEqKlS5c6zW4va+TmAKoKOtEB1DgXm6dX4I477tBNN92k559/Xrt371ZkZKT+85//aPHixRo1apSjI+JKubm56cMPP9Qtt9yiDh06aOjQoWrevLn27dun77//Xr6+vvrqq69Kfd4uXbro22+/1bRp0xxJdNeuXXX77bfrk08+kZ+fn8LDw7Vu3Tp9++238vf3L3SO3r17S1KJbmAk2TtePvnkE0ly6naR7In63//+d8d+F9qzZ4/j2A0bNkiSXnnlFUn2zqI//vGPl3z9ffv26dNPPy20vm7durr77rsdzxs3bqybbrpJ06ZNU3Z2tu677z6n/Svy3yQsLEwtWrTQPffco8jISNWtW1fffvutEhMTnTqSAAAAqity88qVm2dnZ6tv3746duyYnn76aX399ddO26+66ip169btkq9Pbg6g2jEAUI3NmTPHSDKJiYkX3S84ONjcdtttTuuys7PNk08+aZo1a2Y8PDxM27Ztzeuvv25sNpvTfpJMbGys07pdu3YZSeb11193Wv/9998bSWbhwoVO6zdv3mwGDBhg/P39jZeXlwkODjb33nuvWbFihWOfuLg4I8kcPny4yPe4a9cux7pt27aZnj17Gh8fHyPJDBkyxBhjzLFjx8zQoUNNQECAqVu3runbt6/Ztm2bCQ4Oduxz/mcSHBx80c/tfO+//76RZJo3b15o26ZNm4wkI8kcPHiw0PaCz6WopVevXpd87eDg4GKPL+o9zJ4920gy9erVM6dOnSrynBXxb5Kbm2uefvppExkZaerVq2fq1KljIiMjzTvvvHPJ9wwAAFDVkJtX/ty84LMqbrkwrqKQmwOojixjSnBnBQAAAAAAAAAAaiBmogMAAAAAAAAAUAyK6AAAAAAAAAAAFIMiOgAAAAAAAAAAxaCIDgAAAAAAAABAMSiiAwAAAAAAAABQDIroAAAAAAAAAAAUo5arA3A1m82m/fv3q169erIsy9XhAAAAoJozxig7O1v16tWTr68vOeh5yM0BAABQkQpy82bNmsnNrfh+8xpfRN+/f7+CgoJcHQYAAABqoMzMTPn6+ro6jEqD3BwAAACusHfvXrVo0aLY7TW+iF6vXj1J9g+KLzAAAAAob1lZWQoKCtLevXsduSjsyM0BAABQkQpy80vl5TW+iF5wmWjv3r3l7u6u2NhYxcbGujgqAAAAVHeMcims4PPw9fWliA4AAIAKc6m8vMYX0QskJiaSqAMAAAAAAAAAnBQ/LR0AAAAAXCAqKkrh4eGaNWuWq0MBAAAA6EQHAAAAULlwlSgAAAAqE4roAACgWsnPz9eZM2dcHQZqOA8PD7m7u7s6DAAAAJchL0dlUFZ5OUV0AABQLRhjlJ6eruPHj7s6FECSVL9+fQUGBnLzUAAAUKOQl6OyKYu8nCI6AACoFgoS9caNG6t27doULuEyxhjl5OTo0KFDkqSmTZu6OCIAAICKQ16OyqIs83KK6AAAoMrLz893JOr+/v6uDgeQj4+PJOnQoUNq3Lgxo10AAECNQF6Oyqas8nK3sgwKAADAFQpmLdauXdvFkQDnFPw8MgsUAADUFOTlqIzKIi+niA4AAKoNLhVFZcLPIwAAqKnIg1CZlMXPI0V0AAAAAAAAAACKQREdAAAAAAAAQI0WHR2tUaNGuToMVFIuL6LPmjVLISEh8vb2VteuXfXjjz8Wu+/PP/+sgQMHKiQkRJZlafr06Rc995QpU2RZFv8BAACAaiEhIUGWZen48eMV8nql/SIxd+5c1a9fv1xiOXXqlOrUqaOdO3cWu8/333+vW2+9Vf7+/qpdu7bCw8P11FNPad++fZLOfX4FS6NGjXTrrbcqKSmpXGIGAABA1RUfH68+ffrI399flmVpy5Ytlzxm9+7dJd63LDz88MO6++67S7x/eX+faNWqlb799ttit2/evFmDBg1SkyZN5O3trbZt22rYsGHavn27pHOfX8HSsGFD9erVS//973/LJd7ScGkRfcGCBRo9erTi4uK0adMmRUZGqm/fvjp06FCR++fk5Kh169aaMmWKAgMDL3ruxMREvf/++4qIiCiP0AEAAFCBli9fruDgYLVp06bI7e+//75iYmIUGBioL774QsnJyXrvvfeUmZmpN954w2nf1NRUHThwQP/+97+Vm5ur2267TXl5eRXxNgAAAFBFnDx5Uj169NCrr77q6lCqhJ9++knHjh1Tr169ity+dOlSXX/99crNzdVnn32mlJQUffrpp/Lz89OLL77otO+3336rAwcOaNWqVWrWrJluv/12HTx4sCLeRrFcWkSfNm2ahg0bpqFDhyo8PFzvvfeeateurY8++qjI/aOiovT666/r/vvvl5eXV7HnPXHihB566CHNnj1bDRo0KK/wAQBAdRMfL0VGSj4+9sf4+HJ9OZvNptdee01t2rSRl5eXWrZsqYkTJxa57+7du3XTTTdJkho0aCDLsvTwww9LkpYtW6YePXqofv368vf31+23365ffvnF6fi1a9eqU6dO8vb21rXXXqsvv/yy1F0yubm5GjNmjJo3b646deqoa9euSkhIkGTvahk6dKgyMzMdnSMvvfRSoXNkZmbK3d1dGzZscHwGDRs21PXXX+/Y59NPP1VQUJDTcYsXL9add95ZZFy//fabnnjiCT3xxBP66KOPFB0drZCQEPXs2VMffvihxo0b57R/48aNFRgYqGuuuUajRo3S3r17tW3bthJ/DgAAAKgAFZybX+iPf/yjxo0bp5iYmBIf06pVK0lS586dZVmWoqOjJdmbfW+++WYFBATIz89PvXr10qZNm5yO3bZtm3r06CFvb2+Fh4fr22+/lWVZ+vLLL0v8+jabTZMnT1arVq3k4+OjyMhI/fOf/5R08e8T5zPGqFGjRo7jJKlTp05q2rSp4/nq1avl5eWlnJwcx7rFixerX79+8vDwKHTOnJwcDR06VLfeequWLFmimJgYtWrVSl27dtXUqVP1/vvvO+3v7++vwMBAdezYUc8995yysrK0fv36En8O5cFlRfS8vDxt3LjR6QfRzc1NMTExWrdu3RWdOzY2VrfddlupfsizsrKcltzc3CuKAQAAVDHx8dLAgVJSknT6tP1x4MByTdaf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AACgOmnUqJEkyd/f3ykn/sMf/uC03wcffKD69etr5cqVuv3227V8+XL98ssvSkhIcBw3ceJE3XzzzSV+7dzcXE2aNEnffvutunXrJklq3bq1Vq9erffff1+9evUq9vvEhaKjo/X+++9LklatWqXOnTsrMDBQCQkJateunRISEpyaXvbt26effvpJt9xyiyR7c0bv3r314osvSpJCQ0OVnJys119/vcjud0nasWOHo3P/UpYuXaq6devq7Nmzys3NlZubm2bOnFmiYy8XnegAAKjsx6Q08PdUy1a1Cy0N/Kt/NytKJiUlRbm5uerdu3eR22+55RbVrVtXdevWVYcOHS56rh07duiBBx5Q69at5evrq5CQEEn2wrdk7zSJiIiQ93l3VCtuznVxkpKSlJ+fr9DQUEdcdevW1cqVKwuNjrmUXr16afXq1crPz9fKlSsVHR3tKKzv379fO3fudEqgFy9erNtvv11ubvbUNSUlRTfccIPTOW+44QalpKQU+XqlHaH00EMPacuWLVqzZo1uueUWPf/88+revXupzlHVZGRkKD8/v9CVEE2aNFF6enqZvIbNZtOoUaN0ww03qGPHjhfdNysry2nJzc0tkxgAAADKyvDhw53y4os5ePCghg0bprZt28rPz0++vr46ceKEU74eFBTkVHgvbb6+c+dO5eTk6Oabb3aKa968eZeVrycnJ+vw4cOF8vUzZ85o7dq1Tvn6kiVLHOMlpeLz9R07dig/P7/I1yxNzn7TTTdpy5YtjlGNQ4cOLdRYVNboRAcAQOfGpDwx/wnGpKBC+Pj4XHT7hx9+qFOnTkmSY65gce644w4FBwdr9uzZatasmWw2mzp27Ki8vLwyi/fEiRNyd3fXxo0b5e7ufK+AS31puFDPnj2VnZ2tTZs2adWqVZo0aZICAwM1ZcoURUZGqlmzZk4zD5csWaIpU6ZcduyNGjVS/fr1HZefXoqfn5/jBqb/+Mc/1KZNG11//fWlmoeJwmJjY7V161atXr36kvteOBM/Li6uyBn7AAAArjJ+/PgixxcWZciQITpy5IjeeustBQcHy8vLS926dSvzfF2Svv76azVv3txpW3Gj94pz9dVXq2HDhlq5cqVWrlypiRMnKjAwUK+++qoSExN15swZpyaTJUuWON2/6HKEhoaWOF+vU6eOI1//6KOPFBkZqb/97W/685//fEUxXAxFdAAAfseYFFSktm3bysfHRytWrNAjjzxSaPuFia8kx5y/87s3jhw5otTUVM2ePVs33nijJBUqUoaFhenTTz9Vbm6uI4FOTEwsVbydO3dWfn6+Dh065HidouIrrrPkfPXr11dERIRmzpwpDw8PtWvXTo0bN9Z9992npUuXOl0aumPHDu3Zs8fpUtb27dtrzZo1jjE4krRmzRqFh4cX+Xpubm66//779cknnyguLq7QXPQTJ07I29u7yLnodevW1ciRIzVmzBht3ry52v6BLSAgQO7u7jp48KDT+oMHD15yPE9JjBgxQkuXLtWqVavUokWLS+6/d+9e+fr6Op6X9osfAABAeWvcuLEaN27stK6ofF2y56rvvPOObr31Vkn2XCfjvOHuYWFh2rt3rw4ePOi4MrC0+Xp4eLi8vLyUlpbmlE+XJL4LWZalG2+8UYsXL9bPP/+sHj16qHbt2srNzdX777+va6+91jGj/MSJE/r+++/17rvvOo4vyNcv/AxCQ0MLNeQUePDBB/Xcc89p8+bNheainzlzRnl5eUXORXdzc9Nzzz2n0aNH68EHH7xks9LlYpwLAACo8QICpPMmnTjx9rZvL2ve3t4aO3asnnnmGccllj/88IP+9re/FXtMcHCwLMvS0qVLdfjwYZ04cUINGjSQv7+/PvjgA+3cuVPfffedRo8e7XTcgw8+KJvNpkcffVQpKSn697//ralTp0pSiYvCoaGheuihhzR48GDFx8dr165d+vHHHzV58mR9/fXXkqSQkBCdOHFCK1asUEZGhnJycoo9X3R0tD777DNHgt+wYUO1b99eCxYscEr6Fy9erJiYGKebFj399NOaO3eu3n33Xe3YsUPTpk1TfHz8RTuBJk6cqKCgIHXt2lXz5s1TcnKyduzYoY8++kidO3d2dO4U5bHHHtP27dsdN2Kqjjw9PdWlSxetWLHCsc5ms2nFihWOmZqXwxijESNGaNGiRfruu+/UqlWrEh3n6+vrtFBEBwCg5nBFbl6Uo0ePasuWLUpOtjdapaamasuWLRcddde4cWP5+Pho2bJlOnjwoON+MG3bttUnn3yilJQUrV+/Xg899JBTsffmm2/WVVddpSFDhuinn37SmjVr9MILL0gqeb5er149jRkzRk8++aQ+/vhj/fLLL9q0aZPefvttffzxx5KK/j5RnOjoaP39739Xp06dVLduXbm5ualnz55OObxkv5F8aGioY6SkJD311FNasWKFJkyYoO3bt+vjjz/WzJkzL5qvF4z96927t2bNmqX//e9/+vXXX/WPf/xD119/vXbs2FHssYMGDZK7u7tmzZpVos/qspgaLjMz00gymZmZrg4FAABcplOnTpnk5GRz6tSpyz7Hnj3GbNxYeNmzpwwDvUB+fr555ZVXTHBwsPHw8DAtW7Y0kyZNuugx48ePN4GBgcayLDNkyBBjjDHLly837du3N15eXiYiIsIkJCQYSWbRokWO49asWWMiIiKMp6en6dKli/n888+NJLNt27ZiX+vGG280Tz31lON5Xl6eGTdunAkJCTEeHh6madOmpn///uann35y7DN8+HDj7+9vJJm4uLhiz71o0SIjybz77ruOdSNHjiwUU48ePczs2bMLHf/OO++Y1q1bGw8PDxMaGmrmzZt3sY/NGGPM8ePHzV//+lfTtm1b4+npaZo0aWJiYmLMokWLjM1mM8YY06tXLzNy5MhCxz722GOmQ4cOJj8//5KvU6C4n8vKmn/Onz/feHl5mblz55rk5GTz6KOPmvr165v09HRjjDF//OMfzV//+lfH/rm5uWbz5s1m8+bNpmnTpmbMmDFm8+bNZseOHY59/vKXvxg/Pz+TkJBgDhw44FhycnKKjKGyfjYAAKBkyiIvN8Y1ufmFeeCcOXOMpELLxXJcY4yZPXu2CQoKMm5ubqZXr17GGGM2bdpkrr32WuPt7W3atm1rFi5caIKDg82bb77pOC4lJcXccMMNxtPT07Rr18589dVXRpJZtmxZsa81ZMgQc9dddzme22w2M336dBMWFmY8PDxMo0aNTN++fc3KlSsd+xT1faIomzdvNpLM2LFjHevefPPNQjH93//9n3n++ecLHf/Pf/7ThIeHO77nvP766xf51OxOnz5tJk+ebK6++mrj7e1tGjZsaG644QYzd+5cc+bMmSLfc4HJkyebRo0amRMnThTadrGfy5Lmn5YxpbzTUjWTlZUlPz8/ZWZmOl0yCgAAqo7Tp09r165datWqldPNM1G8zz77TEOHDlVmZmaxlzy2a9dOjzzySIlnPZa1jIwMNW3aVL/99luhG15WBcX9XFbm/HPmzJl6/fXXlZ6erk6dOmnGjBnq2rWrJHs3UkhIiObOnStJ2r17d5Gd5b169VJCQoKk4jun5syZo4cffrjQ+sr82QAAgEsjLy87a9asUY8ePbRz505dddVVRe7zwAMPyN3dXZ9++mkFR2d39uxZNWnSRN98802pb4RakS72c1nS/JOZ6AAAADXAvHnz1Lp1azVv3lz/+9//NHbsWN17771FFtAPHTqkb775Rqmpqerdu7cLorU7evSopk2bViUL6FXViBEjNGLEiCK3FRTGC4SEhOhS/Tg1vF8HAACgxBYtWqS6deuqbdu22rlzp0aOHKkbbrihyAL62bNntX37dq1bt06PPfaYC6K1O3r0qJ588klFRUW5LIaKQhEdAACgBkhPT9e4ceOUnp6upk2batCgQZo4cWKR+/br10/Hjh3TjBkzCt3UpyKFhoYqNDTUZa8PAAAAVJTs7GyNHTtWaWlpCggIUExMjN54440i9926dau6d++um266ScOHD6/gSM9p3LixY3Z7dUcRHQAAoAZ45pln9Mwzz5Ro302bNpVzNACA0ti2NUsLP/5Ng4a0ULuOjDoCgOpo8ODBGjx4cIn27dSpk3Jycso5IpzPzdUBAAAAAACAohljtHjBfqXvP63FC/YzJgkAABegiA4AAAAAQCWVkpSttF/t3YZpv+YoJSnbxREBAFDzUEQHAAAAAKASMsboq4X7Zf3+zd1yk75aSDc6AAAVjZnov4uKipK7u7tiY2MVGxvr6nAAAAAAAFXI3qN7dTj7cKH1jes1VouGLS7rnOd3oUuSsZ3rRg+PYDY6AAAVhSL67xITE+XrSxICAAAAANVdWRe8c8/kKmpilA5mHSy0LdA3ULun7JaXh1epzunoQrek8xvPLcvejd7+6nqyLKvUsQIAgNKjiA4AAAAAqDHKo+DtWctTLRu21OHsw7IZm2O9m+WmoIZB8qzlWeo4z541OnYkTxdObjFGOn4kT2fPGnl4UEQHAKAiUEQHAABwkejoaHXq1EnTp093dSgAUGOUR8HbsixNuGuC+r3Vz2m9zdg04a4Jl9Ux7uHhprET2ik762yhbfV8a8nDg1ucAUBZqoq5eVWMuarity4AAEAlYYzRuHHj1LRpU/n4+CgmJkY7duy46DEJCQmyLEvHjx+vkBijo6M1atSoEu8/d+5c1a9fv1xiOXXqlOrUqaOdO3cWu8/333+vW2+9Vf7+/qpdu7bCw8P11FNPad++fZLOfX4FS6NGjXTrrbcqKSmpXGIG4HoFBe/zC+jSlRW8JalPhz6KComSu+UuSXK33BUVEqU+HfpcdqwN/D3VslXtQksD/9IX+gEAJXfmzBmNHTtWV199terUqaNmzZpp8ODB2r9//0WPq+jcPD4+XhMmTCjx/uTml48iOgAAgOzzcTft2VRo+e3obxUWw2uvvaYZM2bovffe0/r161WnTh317dtXp0+frrAYqpLly5crODhYbdq0KXL7+++/r5iYGAUGBuqLL75QcnKy3nvvPWVmZuqNN95w2jc1NVUHDhzQv//9b+Xm5uq2225TXl5eRbwNAC5QHgXvguJ8vsmXJOWb/CsqygNATebq3DwnJ0ebNm3Siy++qE2bNik+Pl6pqam68847K+T1S6phw4aqV6+eq8OQVANyc1PDZWZmGkkmMzPT1aEAAIDLdOrUKZOcnGxOnTp1WcefzjttmoxuYvSICi2BowPN6bzTZRyxXa9evczIkSONMcbYbDYTGBhoXn/9dcf248ePGy8vL/P3v/+9yON37dplJDktQ4YMMcYY880335gbbrjB+Pn5mYYNG5rbbrvN7Ny50+n4NWvWmMjISOPl5WW6dOliFi1aZCSZzZs3lyhmY4w5ffq0eeqpp0yzZs1M7dq1zXXXXWe+//57Y4wx33//faH44uLiCp3z+PHjxs3NzSQmJhpjjMnPzzcNGjQwXbt2dezzySefmBYtWjgd96c//cmMHTu2yDj37t1rPD09zahRo4rcfuzYMacYC54bY8ySJUuMJPO///2v2M+hJIr7uST/LB6fDSrSsqRlTv9/vyxp2RWf02azmahXoowekYl6JcrYbLYyiBQAqo4rzcuNqRy5eVF+/PFHI8ns2bOnyO3k5pU3N7/Yz2VJ80860QEAQI1XMB/XzXJOja5kPm5p7dq1S+np6YqJiXGs8/PzU9euXbVu3boijwkKCtIXX3wh6Vy3xltvvSVJOnnypEaPHq0NGzZoxYoVcnNzU//+/WWz2ccXZGVl6Y477tDVV1+tTZs2acKECRo7dmyp4x4xYoTWrVun+fPn66efftKgQYPUr18/7dixQ927d9f06dPl6+urAwcO6MCBAxozZkyhc/j5+alTp05KSEiQJCUlJcmyLG3evFknTpyQJK1cuVK9evVyHGOz2bR06VLdddddRca1cOFC5eXl6Zlnnilye3GXsWZmZmr+/PmSJE9PxiW4SlRUlMLDwzVr1ixXh4JqrKAbXdIVd6EXsCxLk/pPUvum7TWp/yS60AHgMlSG3LwomZmZsiyr2DyS3Lx65+bcWBQAANR45XFDuNJKT0+XJDVp0sRpfZMmTRzbLuTu7q6GDRtKkho3buyUfA4cONBp348++kiNGjVScnKyOnbsqM8//1yWZWn27Nny9vZWeHi49u3bp2HDhpU45rS0NM2ZM0dpaWlq1qyZJGnMmDFatmyZ5syZo0mTJsnPz0+WZSkwMPCi54qOjlZCQoLGjBmjhIQE3Xzzzdq2bZtWr16tfv36KSEhwSnp/uGHHyRJXbt2LfJ8O3bskK+vr5o2bVqi99KiRQtJ9i84knTnnXeqXbt2JToWZS8xMVG+vr6uDgPVXEHB+4n5T5RpwTsmPEbJ45PL5FwoB/Hx0ssvS9u3S6GhUlycNGCAq6MCcJ7KkJtf6PTp0xo7dqweeOCBYnMUcvPqnZvTiQ4AAKDymY9b1m655RbVrVtXdevWVYcOHS66744dO/TAAw+odevW8vX1VUhIiCR7ci3Zu2MiIiLk7e3tOOa6664rVTxJSUnKz89XaGioI666detq5cqV+uWXX0p1rl69emn16tXKz8/XypUrFR0d7Uje9+/fr507dyo6Otqx/+LFi3X77bfLza3odNYYU6ovWP/973+1ceNGzZ07V6GhoXrvvfdKFT+Aqqmg4B0THnPpnVH1xcdLAwdKSUnS6dP2x4ED7esBVCqVKTc/c+aM7r33Xhlj9O677zrWk5tHO/avCbk5negAAAAq3PFS0TeEK+gGOXjwoFOHxsGDB9WpUydJ0ocffqhTp05Jkjw8PC56vjvuuEPBwcGaPXu2mjVrJpvNpo4dO5bpDXlOnDghd3d3bdy4Ue7u7k7b6tatW6pz9ezZU9nZ2dq0aZNWrVqlSZMmKTAwUFOmTFFkZKSaNWumtm3bOvZfsmSJpkyZUuz5QkNDlZmZqQMHDpSo46VVq1aqX7++wsLCdOjQId13331atWpVqd4DAKCSe/llybIkY+zPjbE/Hz+ebnSgknF1bl6goIC+Z88efffdd05d6OTmNSs3pxMdAADgd+UxH7ekWrVqpcDAQK1YscKxLisrS+vXr1e3bt0kSc2bN1ebNm3Upk0bBQcHSzo3GzA/P99x3JEjR5SamqoXXnhBvXv3Vvv27XXs2DGn1wsLC1NSUpJyc3Md6xITE0sVc+fOnZWfn69Dhw454ipYCv4o4Onp6RRbcerXr6+IiAjNnDlTHh4eateunXr27KnNmzdr6dKlTjMXd+zYoT179ujmm28u9nz33HOPPD099dprrxW5/fjx48UeGxsbq61bt2rRokWXjBsAUIVs336ugF7AGCk19crOGx8vRUZKPj72RzrbgTLhytxcOldA37Fjh7799lv5+/s7bSc3t6spuTlFdAAAgN+58oZwlmVp1KhReuWVV7RkyRIlJSVp8ODBatasme6+++5ijwsODpZlWVq6dKkOHz6sEydOqEGDBvL399cHH3ygnTt36rvvvtPo0aOdjnvwwQdls9n06KOPKiUlRf/+9781depURywlERoaqoceekiDBw9WfHy8du3apR9//FGTJ0/W119/LUkKCQnRiRMntGLFCmVkZCgnJ6fY80VHR+uzzz5zJOUNGzZU+/bttWDBAqdEffHixYqJiVHt2rWLPVdQUJDefPNNvfXWW/rzn/+slStXas+ePVqzZo0ee+wxTZgwodhja9eurWHDhikuLk7mwmILAFSgvUf3atOeTYWW347+5urQqqbQUHvn+fksSwoLu/xzMiIGKDeuzM3PnDmje+65Rxs2bNBnn32m/Px8paenKz09/aLd4+TmRasWubmp4TIzM40kk5mZ6epQAADAZTp16pRJTk42p06dcnUopdKrVy8zcuRIx3ObzWZefPFF06RJE+Pl5WV69+5tUlNTL3me8ePHm8DAQGNZlhkyZIgxxpjly5eb9u3bGy8vLxMREWESEhKMJLNo0SLHcWvWrDERERHG09PTdOnSxXz++edGktm2bVuxr3XjjTeap556yvE8Ly/PjBs3zoSEhBgPDw/TtGlT079/f/PTTz859hk+fLjx9/c3kkxcXFyx5160aJGRZN59913HupEjRxaKqUePHmb27NmX/FwKPoe+ffuaBg0aGG9vb9OuXTszZswYs3//fmOMMd9//72RZI4dO+Z0XFpamqlVq5ZZsGBBiV6nKMX9XJJ/Fo/PBjjndN5p02R0E6NHVGgJHB1oTueddnWIVc8XXxgjGWNZzo/x8Zd/zoiIc+cpWCzLmMjIMgsbqEqqal5ujHNuvmvXLiOpyOX777+/6HkqMje/8PsEuXnRLvZzWdL80zKmZrfXZGVlyc/PT5mZmcXe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J0eCn5SUJMuytHnzZp04cUKStHLlSvXq1ctxjM1m09KlS3XXXXdJkhYtWqSRI0fqqaee0tatW/XYY49p6NCh+v7774uM22azaf78+XrooYfUrFmzQtvr1q2rWrUKX7RpjNF///tfbdu2TZ6e/H8OUBU5utAvaDi3LHs3OqOaAKByqGz3rigoPhc3DoXcvHrn5i4vos+aNUshISHy9vZW165d9eOPPxa7788//6yBAwcqJCRElmVp+vTphfaZPHmyoqKiVK9ePTVu3Fh33323UlNTy/EdAAAqimVZGn/nBEXlDZdN+ZIkm/IVlTdc4++cwOXXuGKunI+bnp4uSWrSpInT+iZNmji2Xcjd3d1xCWfjxo0VGBgoPz8/SdLAgQM1YMAAtWnTRp06ddJHH32kpKQkJScnS5I+//xzWZal2bNnKzw8XLfccouefvrpUsWclpamOXPmaOHChbrxxht11VVXacyYMerRo4fmzJkjT09P+fn5ybIsBQYGKjAw0KmD5HzR0dFOXTI333yz2rdvr9WrVzvWnZ+o//DDD5Kkrl27SpKmTp2qhx9+WI8//rhCQ0M1evRoDRgwQFOnTi3y9TIyMnTs2DG1a9euRO/1nXfeUd26deXl5aWePXvKZrPpiSeeKNGxACqXs2eNjh3J04W1GGOk40fydPYsRXSUDLPbgfJVme5dcfr0aY0dO1YPPPCAfH19i9yH3Lx65+YunYm+YMECjR49Wu+99566du2q6dOnq2/fvkpNTVXjxo0L7Z+Tk6PWrVtr0KBBevLJJ4s858qVKxUbG6uoqCidPXtWzz33nPr06aPk5GTVqVOnvN8SAKCcBdmuVxNz7rI3N7mriemgINtVLowK1UFVmI97yy236L///a8kKTg4WD///HOx++7YsUPjxo3T+vXrlZGR4ehySUtLU8eOHZWamqqIiAinWevXXXddqeJJSkpSfn6+QkNDndbn5ubK39+/VOfq1auX/va3vyk/P18rV65Unz59FBgYqISEBEVERGjnzp2Kjo527L948WLdfvvtcnOz94SkpKTo0UcfdTrnDTfc4Oj+uVBpO5keeughPf/88zp27Jji4uLUvXt3de/evVTnAFA5eHi4aeyEdsrOOltoWz3fWvLwcHmvGaoIZrcD5acy5eZnzpzRvffeK2OM3n33Xcd6cvNox/41ITd3aRF92rRp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_cJet_p = files[\"test\"][\"Nominal/cJet_p_WW\"]\n", + "h_cJet_p_noCR = files[\"test_noCR\"][\"Nominal/cJet_p_WW\"]\n", + "\n", + "h_lJet0_p = files[\"test\"][\"Nominal/lJet0_p_WW\"]\n", + "h_lJet0_p_noCR = files[\"test_noCR\"][\"Nominal/lJet0_p_WW\"]\n", + "\n", + "h_lJet1_p = files[\"test\"][\"Nominal/lJet1_p_WW\"]\n", + "h_lJet1_p_noCR = files[\"test_noCR\"][\"Nominal/lJet1_p_WW\"]\n", + "\n", + "h_lJet2_p = files[\"test\"][\"Nominal/lJet2_p_WW\"]\n", + "h_lJet2_p_noCR = files[\"test_noCR\"][\"Nominal/lJet2_p_WW\"]\n", + "\n", + "values1, edges1 = h_cJet_p.to_numpy()\n", + "values2, edges2 = h_cJet_p_noCR.to_numpy()\n", + "values3, edges3 = h_lJet0_p.to_numpy()\n", + "values4, edges4 = h_lJet0_p_noCR.to_numpy()\n", + "values5, edges5 = h_lJet1_p.to_numpy()\n", + "values6, edges6 = h_lJet1_p_noCR.to_numpy()\n", + "values7, edges7 = h_lJet2_p.to_numpy()\n", + "values8, edges8 = h_lJet2_p_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "values5 = values5 / np.sum(values5) if np.sum(values5) != 0 else values5\n", + "values6 = values6 / np.sum(values6) if np.sum(values6) != 0 else values6\n", + "values7 = values7 / np.sum(values7) if np.sum(values7) != 0 else values7\n", + "values8 = values8 / np.sum(values8) if np.sum(values8) != 0 else values8\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 10 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "bin_centers5, values5 = rebin(values5, edges5, factor)\n", + "bin_centers6, values6 = rebin(values6, edges6, factor)\n", + "bin_centers7, values7 = rebin(values7, edges7, factor)\n", + "bin_centers8, values8 = rebin(values8, edges8, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='c-tag Jet w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='c-tag Jet w/o CR')\n", + "ax1.plot(bin_centers3, values3, marker='v', linestyle='None', color='darkgreen', markersize=4, label='l0-tag Jet w/ CR')\n", + "ax1.plot(bin_centers4, values4, marker='^', linestyle='None', color='slateblue', markersize=4, label='l0-tag Jet w/o CR')\n", + "\n", + "ax1.set_xlabel(r'GeV')\n", + "ax1.set_ylabel(r'Set Axis Label')\n", + "ax1.set_title(r'Momenta: W1 Events')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "# ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "# ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers5, values5, marker='o', linestyle='None', color='red', markersize=4, label='l1-tag Jet w/ CR')\n", + "ax2.plot(bin_centers6, values6, marker='s', linestyle='None', color='blue', markersize=4, label='l1-tag jet w/o CR')\n", + "ax2.plot(bin_centers7, values7, marker='v', linestyle='None', color='darkgreen', markersize=4, label='l2-tag jet w/ CR')\n", + "ax2.plot(bin_centers8, values8, marker='^', linestyle='None', color='slateblue', markersize=4, label='l2-tag jet w/o CR')\n", + "\n", + "ax2.set_xlabel('GeV')\n", + "ax2.set_ylabel(r'Set Axis Label')\n", + "ax2.set_title(r'Momenta: W2 Events')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "# ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "# ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "c4ffab13-3ba8-4019-ae72-b13919e53768", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAJOCAYAAACz9fURAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdv0lEQVR4nO39e3idZZ0v/r9XU9pwSgBDW8BmWsEWI5YONHRAOYhVBL8ilNHu2XsLdhQPVB2th4FRKNRREJFBhgjKDIM67g04VB0dN+hUymk6ECmFDodWFEiFtpBBEii2hXT9/sivgdp0kbRJVlbW63Vd60rXc7jX50nDyod373U/hWKxWAwAAAAAANCrUeUuAAAAAAAAhjNBOgAAAAAAlCBIBwAAAACAEgTpAAAAAABQgiAdAAAAAABKEKQDAAAAAEAJgnQAAAAAAChBkA4AAAAAACUI0gEAAAAAoARBOkCZvPTSS/nyl7+cyZMnZ7fddsuxxx6bVatWlbssAACoGnryoXf++eenUCiUuwyAfhOkA5RBV1dXZs+enb/7u7/Lhz70oXz5y1/Ogw8+mHe/+9156aWX+jXWDTfckEKhkB/+8Ifb7Dv00ENTKBRyyy23bLOvsbExRx11VJLk+eefz4IFC/LOd74z++yzTwqFQq699todujYAAKgEw60nb21tzcc//vG88Y1vzO67757Gxsa8733vE+wDDBOCdIAyuOSSS7J48eLceuut+cIXvpBPf/rT+cY3vpFVq1ZlyZIl/RrrLW95S5Lkjjvu2Gp7Z2dn/uu//iujR4/OnXfeudW+1atXZ/Xq1T3ntre3Z+HChXnooYdy6KGH7viFAQBAhRhuPflXv/rV3HjjjXnb296Wb3zjG/nwhz+c2267LYcddlj+67/+a8cvFIABIUgHGGIdHR35yle+kk996lN54xvf2LN9y0yU++67r1/j7b///pk8efI2TfvSpUtTLBbz3ve+d5t9W55vadr322+/rFmzJo8//ni+9rWv9fuaAACgkgzHnnz+/Pl5/PHHc/nll+dDH/pQvvjFL+b222/PSy+9lIsuuqjf1wjAwBKkAwyx73//+3nuuefy4Q9/eKvtu+yyS5Lkueee69n28MMPp62t7VXHfMtb3pJ77703f/jDH3q23XnnnXnjG9+YE088Mf/5n/+ZzZs3b7WvUCjkzW9+c5Jk7NixmTBhwk5d11B54okn8sEPfjD7779/xo4dm8mTJ+djH/tYNm3alKT7+/epT30qkyZNytixYzNu3Li8/e1vz7Jly8pcOQAAw8Vw7MmPOuqojBkzZqsxX//61+eNb3xjHnroof5f5CD5wAc+kEmTJm2zvbe1z++44440NzentrY2Bx54YL71rW8NUZUAA0+QDjDEFi1alKampuy+++5pb2/veaxevTpJsvvuu/cc+4Y3vCGnn376q475lre8JS+++GLuuuuunm133nlnjjrqqBx11FHp6OjY6uOgd955Zw4++OC85jWvGcAr65tzzz03V1999Q6d++STT+aII47Iddddlzlz5uTyyy/P+9///tx666154YUXkiQf/ehHc+WVV+a0007LN7/5zXz2s5/NrrvuOqz+5wMAgPKqlJ68WCxm3bp1aWho2JHL3K6d6cn7asWKFXnHO96Rp556Kueff37mzp2bBQsW9LqOPEAlGF3uAgCqSVdXV/7zP/8z69evz7777tvrMZMnT+73uK9ck/G4447LSy+9lLvuuitnnHFGDjzwwIwfPz533HFHpk2blueeey4rVqzIX/7lX+7Uteyojo6OfOQjH8kuu+ySD3zgA/0695xzzsnatWtz1113ZcaMGT3bFy5cmGKxmCT5t3/7t5x55pn5+te/3rP/85///IDUDgBA5auknvz73/9+nnjiiSxcuLDf9ZSyMz15X5133nkpFou5/fbb09jYmCQ57bTT8qY3vWlQXg9gsAnSAYbQb37zm6xfvz6f//zn8/a3v32rfddcc03+7//9v5k2bVrPti3h8Kt5wxvekNe85jU96yzed999Wb9+fc8aj0cddVTuvPPOnHXWWVm6dGm6urp6Gv2BtmHDhpL7L7744jz33HP54Ac/mDFjxuR//s//2adxN2/enB/96Ed597vfvVWIvsWWj5Hutddeueuuu/Lkk09m//337/8FAAAwolVKT/7www9n3rx5OfLII3PGGWf06xoHqyfvq66urtx888055ZRTekL0pPt7dMIJJ+RnP/vZgL4ewFAQpAMMocceeyxJctxxx2XWrFlb7bvooosyfvz4TJkypd/jFgqFHHXUUbntttuyefPm3HnnnRk3blwOOuigJN1N+xVXXJGk+yOkSQYlSH/++eez55579vn4008/Pccff3yf1md/+umn09nZmUMOOaTkcRdffHHOOOOMTJw4MYcffnhOOumknH766Xnd617X57oAABi5KqEnX7t2bd71rnelvr4+//Iv/5Kampo+1zGYPXlfPf300/nDH/6Q17/+9dvsmzp1qiAdqEiCdIAhtH79+iRbr7mYdH+08vbbb9+p5Vbe8pa35Cc/+UlWrFjRsxbjFkcddVQ+97nP5Yknnsgdd9yR/ffff1CC5dra2vzTP/3Tqx53880357rrrsvs2bO3+3HaHfW+970vRx99dH74wx/m5z//eb72ta/lq1/9ahYtWpQTTzxxQF8LAIDKM9x78o6Ojpx44ol59tlnc/vtt/f7U5aD3ZP/8Q1Ft+jq6urzGACVSJAOMIS2zAx5/vnnt9r+ne98J5s2bcrHPvaxHR77lWsy3nnnnfnUpz7Vs+/www/P2LFjs2TJktx111056aSTdvh1Shk9evSrrrH4i1/8Ij/84Q9zyimn5P/8n//T59k1++67b+rq6ra6QdP27LfffjnrrLNy1lln5amnnsphhx2WL3/5y4J0AACGdU++YcOGvPvd786qVavy7//+72lqaup3DYPZkyfJ3nvvnWeffXab7Y8//njPn/fdd9/suuuu+fWvf73NcStXruzzawEMJ6PKXQBANZk2bVpGjRqVW265pWfb7373u3zpS1/K6aefvtVajEn3uohtbW19GnvGjBmpra3tuSHRK2e/jB07NocddlhaWlqyfv36QVsfvS/+9m//NrNmzcr111+f0aP7/u+5o0aNyimnnJKf/OQn+dWvfrXN/mKxmK6urnR0dGy1fdy4cdl///2zcePGna4dAIDKN1x78q6ursyZMydLly7ND37wgxx55JE7cZWl7WhPniQHHnhgOjo6cv/99/dsW7NmTX74wx/2PK+pqckJJ5yQH/3oR1t97x566KHcfPPNO38BAGVQKPb1rhkADIjTTjstP/nJT3LOOeekvr4+l112WfbZZ5/cdtttqaur2+rYQqGQY489NkuWLOnT2Mccc0xuv/32jB07Nh0dHRk7dmzPvs9+9rP5+te/niS55557cthhh2117hVXXJFnn302Tz75ZK688srMnj07f/qnf5ok+cQnPpH6+vqduOqXPfvss9l11123qq2vnnjiicyYMSOdnZ358Ic/nDe84Q1Zs2ZNfvCDH/Tc1Om1r31t/vzP/zyHHnpo9thjj/z7v/97brjhhnz961/P/PnzB+QaAACobMOxJ//Upz6Vb3zjG3n3u9+d973vfduM+7//9//egSvt3c705P/93/+dP/mTP8n48ePzyU9+Mi+88EKuvPLK7Lvvvlm2bFnPzVnvv//+zJw5M+PGjctZZ52Vl156KX//93+f8ePH5/777+/zTVwBhgtBOsAQ+/3vf58PfehDufnmm7PHHnvkfe97X7785S/3ekOg/jbtf/M3f5MLL7wwRx11VM8NjLb44Q9/mNmzZ2fPPffM73//+20+vjlp0qStPo75So8++mgmTZrUpxoGW1tbW84999z8v//3/9LZ2ZkDDjggJ554Yi699NIkyRe/+MX8/Oc/z29/+9ts3rw5Bx10UD7ykY/s1Ed0AQAYWYZjT37cccfl1ltv3e64wym++cUvfpH58+dn1apVmTx5cs4999z8+te/zgUXXLBVnbfddlvmz5+fFStW5LWvfW0+//nPZ82aNdscB1AJBOkAAAAAAFCCNdIBAAAAAKAEQToAAAAAAJQgSAcAAAAAgBIE6QAAAAAAUIIgHQAAAAAAShCkAwAAAABACaPLXcBg2rx5c5588snsueeeKRQK5S4HAACSJMViMc8991z233//jBpVHXNb9OYAAAw3/enLR3SQ/uSTT2bixInlLgMAAHq1evXqvPa1ry13GUNCbw4AwHDVl758RAfpe+65Z5Lub0RdXV2ZqwEAgG6dnZ2ZOHFiT79aDfTmAAAMN/3py0d0kL7lI6N1dXWadQAAhp1qWuJEbw4AwHDVl768OhZkBAAAAACAHSRIBwAAhkxzc3OamprS0tJS7lIAAKDPRvTSLgAAwPDS2tpqaRcAACqOIB0AoApt3rw5mzZtKncZI9Yuu+ySmpqacpcBAEAF6OrqyosvvljuMkakgezLBekAAFVm06ZNefTRR7N58+ZylzKi7bXXXpkwYUJV3VAUAIC+KxaLWbt2bZ599tlylzKiDVRfLkgHAKgixWIxa9asSU1NTSZOnJhRo9wyZ6AVi8W88MILeeqpp5Ik++23X5krAgBgONoSoo8bNy677babCRgDbKD7ckE6AEAVeemll/LCCy9k//33z2677VbuckasXXfdNUny1FNPZdy4cZZ5AQBgK11dXT0h+mte85pylzNiDWRfbgoSAEAV6erqSpKMGTOmzJWMfFv+ocJ6lwAA/LEtPaLJLYNvoPpyQToAQBXysdHB53sMAMCr0TMOvoH6HgvSAQAAAACghKoI0pubm9PU1JSWlpZylwIAAAAAQIWpiiC9tbU1Dz74YObNm1fuUgAAGCK33nprJk6cuN39xWIx3/72tzNz5szsscce2WuvvTJjxoxcdtlleeGFF5Ik559/fgqFQgqFQmpqajJx4sR8+MMfzjPPPDNUlwEAABVvJPTmVRGkAwBQfX784x/n3e9+93b3v//978+nPvWpvOc978ktt9yS5cuX59xzz82Pf/zj/PznP+857o1vfGPWrFmTtra2/NM//VNuuummfOxjHxuKSwAAgBFhJPTmgnQAAPpv0aLk0EOTXXft/rpo0aC91E9/+tPstdde6erqSpIsX748hUIhZ599ds8xH/rQh/K///f/3uq8f/3Xf83JJ5/c65g33HBDvv/97+f//t//m7/5m79Jc3NzJk2alPe85z355S9/mbe+9a09x44ePToTJkzIAQcckFmzZuW9731vfvGLXwzClQIAwA7Qmw/ClW5LkA4AQP8sWpScdlqyYkWyYUP319NOG7SG/eijj85zzz2Xe++9N0n3x0IbGhqyZMmSnmNuvfXWHHfccT3PH3jggTz11FM5/vjjex3z+9//fqZOnZr3vOc92+wrFAqpr6/v9bzHHnssN998c8aMGbPjFwQAAANFbz5kvbkgHQCA/rnggqRQSIrF7ufFYvfzhQsH5eXq6+szffr0nuZ8yZIl+fSnP5177703zz//fJ544ok88sgjOfbYY3vO+fGPf5wTTjhhu031r3/960ydOrVPr79ixYrsscce2XXXXTN58uQ88MAD+eu//uudvi4AANhpevMh681HD8mrAADsgLa2pL192+0NDUlj49DXw//fqlUvN+pbFIvJypWD9pLHHntslixZks985jO5/fbbc+GFF+aGG27IHXfckWeeeSb7779/Xv/61/cc/+Mf/zgf//jHtzte8Y/rL2Hq1Kn513/912zYsCH//M//nOXLl+cTn/jETl0PAECl0ZsPU3rzIevNzUgHAIaltrZk6tTk8MO3fUyd2r2fMpkypXuWyysVCt1/MYPkuOOOyx133JH77rsvu+yySw4++OAcd9xxWbJkSW699datZrysWbMm9957b971rndtd7wpU6bk4Ycf7tNrjxkzJgcddFAOOeSQXHTRRampqckFF1yw09cEAFAp9ObDmN58yHpzQToAMCy1t3cv8debDRt6nw3DEFmw4OWPjCYvf5R0wYJBe8ktazH+3d/9XU9jvqVZX7JkyVZrMP7kJz/JUUcdlX322We74/3P//k/s2rVqvz4xz/eZl+xWExHR8d2z/3iF7+YSy65JE8++eSOXxAAQAXRmw9jevMh680F6QAA9M/s2cmNNybTpiW1td1fFy1KTj110F5y7733zrRp0/L973+/pzE/5phjsmzZsqxatWqrWS//+q//mpNPPrnkeO973/syZ86c/MVf/EW+8pWv5Fe/+lUef/zx/PSnP82sWbNyyy23bPfcI488MtOmTctXvvKVAbk2AADYYXrzIevNBekAAPTf7NnJ8uXJH/7Q/XUQG/Utjj322HR1dfU06/vss0+ampoyYcKEnpsTrV+/PosXL37VZr1QKOT//J//k0svvTQ/+tGPcuyxx2batGk5//zz8573vCcnnHBCyfM//elP5x/+4R+yevXqAbk2AADYYXrzIenNC8X+rOZeYTo7O1NfX5+Ojo7U1dWVuxwAoB+WLetec3F77rknOeywoatnpNiwYUMeffTRTJ48ObW1teUuZ8AtWrQoX/ziF/Pggw+Wu5SS3+tq7FO3XPOUKVNSU1OTefPmZd68eeUuCwDoA735wBvpfXkyfHrzgerLRw9mkQAAMJT22GOPfPWrXy13GZTQ2tpaNf94AABQzUZaby5IBwCGpYaG7iX+erupUW1t9374Y+94xzvKXQIAwIijN2dHjLTeXJAOAAxLjY3JypVJ+w2/TL71raStrXvjRz6Shvcdn8bGclcIAADVoac3b992X0ND9OZUBUE6ADBsNf5qURo/d1pSKCTFYvKbu5LP3ZC87sakcXa5ywMAgKrR2Cgwp7qNKncBAADbdcEFL4foSffXQiFZuLC8dQEAAFBVBOkAwPC1atXLIfoWxWL350oBAABgiAjSAYDha8qU7hnor1QoJFOnlqceAAAAqpIgHQAYvhYseHk5l+TlZV4WLChvXQAAAFQVQToAMHzNnp3ceGMybVpSW9v9ddGi5NRTy10ZAAAAVWR0uQsYCs3Nzampqcm8efMyb968cpcDAPTH7NndDwAAACiTqpiR3tramgcffFCIDgDANm655ZacdNJJec1rXpPddtstTU1N+cxnPpMnnngiSbJkyZIUCoWex7777puTTjopK1asKHPlAAAwsgzn3rwqgnQAAAZOW1uybNm2j7a2clfWf9/61rcya9asTJgwITfeeGMefPDBXHXVVeno6MjXv/71rY5duXJl1qxZk5tvvjkbN27Mu971rmzatKlMlQMAgN58KHvzqljaBQCAgdHWlkydmmzYsO2+2tpk5cqksXHgX/e4447LtGnTUltbm3/4h3/ImDFj8tGPfjTnn3/+K2pryyc+8YksXrw4o0aNyjvf+c78/d//fcaPH9/rmL/73e/yyU9+Mp/85Cfzd3/3dz3bJ02alGOOOSbPPvvsVsePGzcue+21VyZMmJBPfepTOfnkk/Pwww9n2rRpA3/BAADwKvTmQ9ubm5EOAECftbf33qgn3dvb2wfvtb/zne9k9913z1133ZWLL744CxcuzC9+8YskyebNm/Oe97wnzzzzTG699db84he/yG9/+9vMmTNnu+P94Ac/yKZNm/L5z3++1/177bVXr9s7Ojpy3XXXJUnGjBmzcxcFAAA7SG8+tL25GekAAFSEadOmZcGCBUmS17/+9bniiiuyePHivP3tb8/ixYuzYsWKPProo5k4cWKS5Lvf/W7e+MY3prW1Nc3NzduM9+tf/zp1dXXZb7/9+vT6r33ta5Mk69evT5KcfPLJOfjggwfi0gAAoKJUY29uRjoAABXhjz+mud9+++Wpp55Kkjz00EOZOHFiT6OeJE1NTdlrr73y0EMP9TpesVhMoVDo8+vffvvtueeee3LttddmypQpueqqq3bgKgAAoPJVY29uRjoAABVhl1122ep5oVDI5s2bd3i8KVOmpKOjI2vWrOnTzJfJkydnr732ytSpU/PUU09lzpw5ue2223b49QEAoFJVY29uRjoAABXvDW94Q1avXp3Vq1f3bHvwwQfz7LPPpqmpqddz/vzP/zxjxozJxRdf3Ov+P76h0SvNmzcv//Vf/5Uf/vCHO1U3AACMNCO1NxekAwDQZw0NSW1t7/tqa7v3l8OsWbPypje9Kf/rf/2vLFu2LHfffXdOP/30HHvssZkxY0av50ycODF/93d/l2984xv54Ac/mFtvvTWPP/547rzzznzkIx/Jl770pe2+3m677ZYzzzwzCxYsSLFYHKzLAgCA7dKbdxuq3lyQDgBAnzU2JitXJvfcs+1j5cru/eVQKBTy4x//OHvvvXeOOeaYzJo1K6973ety/fXXlzzvrLPOys9//vM88cQTOfXUU3PwwQfnQx/6UOrq6vLZz3625Lkf//jH89BDD+UHP/jBQF4KAAD0id78ZUPRmxeKI3gKTWdnZ+rr69PR0ZG6urpylwMAUHYbNmzIo48+msmTJ6d2e9NXGBClvtfV2KduueYpU6akpqYm8+bNy7x588pdFgDQH4sWJRdckKxalUyZkixYkMyeXe6qKpK+fOgMVF/uZqMAAMCQaW1trZp/PACAEWXRouS005JCISkWkxUrup/feKMwnapgaRcAAAAAoLQLLng5RE+6vxYKycKF5a0LhoggHQAAAAAobdWql0P0LYrF7sW4oQoI0gEAAACA0qZM6Z6B/kqFQjJ1annqgSEmSAcAAAAASluw4OXlXJKXl3lZsKC8dcEQGRZBektLSyZNmpTa2trMnDkzd999d5/Ou+6661IoFHLKKacMboEAACNM8Y8/lsuA27x5c7lLAAAYOLNnd99YdNq0pLa2++uiRcmpp5a7soqmZxx8A/U9Hj0go+yE66+/PvPnz89VV12VmTNn5rLLLssJJ5yQlStXZty4cds977HHHstnP/vZHH300UNYLQBAZdtll11SKBTy9NNPZ999903hjz+ey04rFovZtGlTnn766YwaNSpjxowpd0kAAANj9uzuBzttzJgxGTVqVJ588snsu+++GTNmjN58gA10X14olnk60syZM9Pc3JwrrrgiSfe/EEycODGf+MQncvbZZ/d6TldXV4455pj85V/+ZW6//fY8++yz+dGPfrTNcZ2dnamvr09HR0fq6uoG8zIAACrG888/n9/97ndmpQ+y3XbbLfvtt1+vDXs19qnVeM0AAKVs2rQpa9asyQsvvFDuUka0gerLyzojfdOmTbnnnntyzjnn9GwbNWpUZs2alaVLl273vIULF2bcuHH54Ac/mNtvv/1VX6ezs3Or52PHjs3YsWN3vHAAgAq2xx575PWvf31efPHFcpcyYtXU1GT06NFmFQEAsF1jxoxJY2NjXnrppXR1dZW7nBFpIPvysgbp7e3t6erqyvjx47faPn78+Dz88MO9nnPHHXfkH//xH7N8+fI+v87EiRO3er5gwYKcf/75/S0XAGDEqKmpSU1NTbnLAACAqlYoFLLLLrtkl112KXcpvIqyr5HeH88991ze//735+qrr05DQ0Of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AJCkOvvUarxmAACGt/70qH2akX755Zfnwx/+cGpra3P55ZeXPPaTn/xk3ysFAAD6RW8OAABDr08z0idPnpxf/epXec1rXpPJkydvf7BCIb/97W8HtMCdYdYLAADD0c70qXpzAAAYGAM+I/3RRx/t9c8AAMDQ0psDAMDQG9XfEzZs2LDdfWvWrNmpYgAAgL7TmwMAwNDod5B+2GGHZfny5dtsv/HGGzNt2rSBqAkAAOgDvTkAAAyNfgfpxx13XP7sz/4sX/3qV5Mk69evzwc+8IG8//3vz9/8zd8MeIEAAEDv9OYAADA0+rRG+it985vfzLve9a586EMfyk9/+tOsWbMme+yxR+6+++4ccsghg1EjAADQC705AAAMjX4H6Uly4oknZvbs2bnyyiszevTo/OQnP9GoAwBAGejNAQBg8PV7aZff/OY3OfLII/PTn/40N998cz7/+c/n5JNPzuc///m8+OKLg1EjAADQC705AAAMjX4H6dOnT8/kyZNz33335e1vf3v+9m//NrfccksWLVqUI444YoeKaGlpyaRJk1JbW5uZM2fm7rvv3u6xV199dY4++ujsvffe2XvvvTNr1qySxwMAwEg1GL05AACwrX4H6d/85jdz3XXXZa+99urZdtRRR+Xee+/NYYcd1u8Crr/++syfPz8LFizIsmXLcuihh+aEE07IU0891evxS5YsyV/8xV/klltuydKlSzNx4sS84x3vyBNPPNHv1wYAgEo20L05AADQu0KxWCwOxECbN2/Oz372s/x//9//16/zZs6cmebm5lxxxRU940ycODGf+MQncvbZZ7/q+V1dXdl7771zxRVX5PTTT99qX2dnZ+rr69PR0ZG6urp+1QUAAINlsPvUHe3NB5PeHACA4aY/PeoO3Wz0lR555JFcc801ufbaa/P000/3ay3GTZs25Z577sk555zTs23UqFGZNWtWli5d2qcxXnjhhbz44ovZZ599+l07AFB92tqS9vZttzc0JI2NQ18PDKSd6c0BAIDt6/fSLknyhz/8Id/97ndzzDHHZOrUqfmP//iPnHfeefnd737Xr3Ha29vT1dWV8ePHb7V9/PjxWbt2bZ/G+Ou//uvsv//+mTVr1naP6ezs3OqxcePGftUJAIwMbW3J1KnJ4Ydv+5g6tXs/VJqB6s0BAIDt61eQ3tramo985COZMGFCLrvssrznPe9JoVDIN7/5zXz0ox/dJhAfbBdddFGuu+66/PCHP0xtbe12j5s4cWLq6+t7HhdeeOEQVgkADBft7cmGDb3v27Ch95nqMFwNRm/e0tKSSZMmpba2NjNnzszdd9+93WOvvvrqHH300dl7772z9957Z9asWSWPBwCAStbnIH3atGl573vfm9e85jX5j//4jyxbtiyf+cxnUigUdvjFGxoaUlNTk3Xr1m21fd26dZkwYULJcy+55JJcdNFF+fnPf55p06aVPHb16tXp6OjoebxyKRkAAKg0g9GbX3/99Zk/f34WLFiQZcuW5dBDD80JJ5yQp556qtfjlyxZkr/4i7/ILbfckqVLl2bixIl5xzvekSeeeGKHawAAgOGqz0H6ypUrc8wxx+Stb31rmpqaBuTFx4wZk8MPPzyLFy/u2bZ58+YsXrw4Rx555HbPu/jii/OlL30pN910U2bMmPGqr1NXV7fVY+zYsQNSPwAAlMNg9OaXXnppzjzzzMydOzdNTU256qqrsttuu+Waa67p9fjvf//7OeusszJ9+vQcfPDB+Yd/+IeeXh4AAEaaPgfpv/3tbzN16tR87GMfy2tf+9p89rOfzb333rtTs16SZP78+bn66qvzne98Jw899FA+9rGPZf369Zk7d26S5PTTT99qBvlXv/rVnHvuubnmmmsyadKkrF27NmvXrs3zzz+/U3UAAEClGOjefNOmTbnnnnu2uu/QqFGjMmvWrCxdurRPY7zwwgt58cUXs88+++xQDQAAMJz1OUg/4IAD8oUvfCGPPPJIvve972Xt2rV585vfnJdeeinXXnttVq1atUMFzJkzJ5dccknOO++8TJ8+PcuXL89NN93Us6ZjW1tb1qxZ03P8lVdemU2bNuXP//zPs99++/U8Lrnkkh16fQAAqDQD3Zu3t7enq6trm3XVx48fn7Vr1/ZpjL/+67/O/vvvv1UY35vOzs6tHhs3buxXrQAAUA79utnoFscff3z++Z//OWvWrMkVV1yRX/7ylzn44INfda3y7fn4xz+exx9/PBs3bsxdd92VmTNn9uxbsmRJrr322p7njz32WIrF4jaP888/f4deGwCoHg0NSW2h99CutrAxDQ1DXBAMgIHuzXfERRddlOuuuy4//OEPU1tbW/LYiRMnpr6+vudx4YUXDlGVAACw40bvzMn19fU566yzctZZ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pZdemjPPPDNz585NU1NTrrrqquy222655pprej3+G9/4Rt75znfmc5/7XN7whjfkS1/6Ug477LBcccUVQ1z5tgZrbavBGLdSxhyscStlzMEat9prdf2uv6Kuvzi29zGLY3dozIaGpHaXrl731e7SNSzXoYOB1NjYPdnlnnu2fVT7TLKR1JcnfodUypiDNW6ljDlY41bKmIM1bqWMOVjjVsqYgzWudceBwVLWpV02bdqUe+65J+ecc07PtlGjRmXWrFlZunRpr+csXbo08+fP32rbCSeckB/96EfbfZ3Ozs6tno8dOzZjx/YeTADASNbYmKx8pCbtN/wy+fa3k8cfT/7kT5IPfzgN7zu+qkNEqkdjY3UH5r0Zqr480ZsDwBYNDd3LwmxvuRiTXGB4KWuQ3t7enq6urowfP36r7ePHj8/DDz/c6zlr167t9fi1a9du93UmTpy41fMFCxbk/PPP37GiAaDCNTYmjZ89Pvns8eUuBRgmhqovT/TmALDFlk/KuYEpVIZhcbPRwbZ69erU1dX1PDfjBQAAykNvDgAv80k5qBxlDdIbGhpSU1OTdevWbbV93bp1mTBhQq/nTJgwoV/HJ0ldXd1WzToAAPCyoerLE705AJXJMixAWW82OmbMmBx++OFZvHhxz7bNmzdn8eLFOfLII3s958gjj9zq+CT5xS9+sd3jh9KWN9Xe7Myb6mCMWyljDta4lTLmYI1b7bW6ftdfzdcP0JuR1pcnlfW+XCm1un7X7/oHdszBGrdSxhyscQerVjcsBwrFYrFYzgKuv/76nHHGGfnWt76VI444IpdddlluuOGGPPzwwxk/fnxOP/30HHDAAbnwwguTJP/xH/+RY489NhdddFHe9a535brrrstXvvKVLFu2LIcccshWY3d2dqa+vj4dHR1DNuulrW1w1rYajHErZczBGrdSxhyscau9Vtfv+qv5+oHyK0ef+moGsy9PRk5vXu2/Q1y/63f9AzvmYI1bKWMO1rh6aKCv+tOjlj1IT5IrrrgiX/va17J27dpMnz49l19+eWbOnJkkOe644zJp0qRce+21Pcf/4Ac/yBe/+MU89thjef3rX5+LL744J5100jbjDsf/QQEAgOHapw5WX54M32sGAKB6VVyQPlg06wAADEfV2KdW4zUDADC89adHLesa6QAAAAAAMNwJ0gEAAAAAoARBOgAAAAAAlCBIBwAAAACAEgTpAAAAAABQgiAdAAAAAABKEKQDAAAAAEAJgnQAAAAAAChBkA4AAAAAACUI0gEAAAAAoARBOgAAAAAAlCBI76eNGzfm/PPPz8aNG8tdClXIzx/l5OePcvLzRzn5+Rue/L1QTn7+KCc/f5Sbn0HKqZw/f4VisVgc8lcdIp2dnamvr09HR0fq6uqG7ZjQV37+KCc/f5STnz/KSU85MAb6mqvxe8jw4eePcvLzR7n5GaScytlTmpE+ArW0tJS7hJLUN7IN9++f+ka24f79U9/INty/f+qDoTfcf67VN7IN9++f+ka2Svj+Dfcah3t9w91w//6przJVRZDe3NycpqamqvkhGO7Xqb6Rbbh//9Q3sg3375/6Rrbh/v1TH8NFNfXmw/0a1TeyDffvn/pGtkr4/g33God7fcPdcP/+qa8yjS53AYNpy6o1ixcv7pma39nZuVNjbjl/Z8cZTF1dXerbCcO5Pj9/O099O87P385T347z87fz1LfjBuPnb8tYI3iVxW0MdG/ufWHnqW/H+fnbeerbcX7+BsZwr3E41+dncOepb8cN9M9ff/ryEb1G+u9+97tMnDix3GUAAECvVq9ende+9rXlLmNI6M0BABiu+tKXj+ggffPmzXnyySez5557plAolLscAABI0j3j5bnnnsv++++fUaOqYrVFvTkAAMNOf/ryER2kAwAAAADAzqqO6S8AAAAAALCDBOkAAAAAAFCCIB0AAAAAAEoQpEOFevjhh/Oa17wmBx54YKZPn5499tgjb3nLW8pdFiNUS0tLJk2alNra2sycOTN33313uUuiSnivA2C487uKoaY3pxy814EgHSrWwQcfnJkzZ+ZHP/pRli9fngMOOCA333xzuctiBLr++uszf/78LFiwIMuWLcuhhx6aE044IU899VS5S6MKeK8DYLjzu4qhpDenXLzXgSB9p7zhDW9IoVDo9XHFFVeUuzyqwMqVKzN16tS88MIL6erqyu67717ukhiBLr300px55pmZO3dumpqactVVV2W33XbLNddcU+7SqBLe6ygXvV7l8HdFufldxVDRm1NO3usol+HS6wnSd8KNN96YJFm8eHHWrFmTxx57LKNGjcoPfvCDnHnmmWWujpHuueeey9ixYzNmzJg88MADecMb3lDukhiBNm3alHvuuSezZs3q2TZq1KjMmjUrS5cuLWNlVAvvdZSTXq9y+LuinPyuYqjozSkn73WU03Dp9QTpO2HdunUZPXp03vzmN2fChAlpb2/P5s2bc/TRR2fs2LHlLo8R7sEHH0xTU1OS5KGHHsqUKVPKXBEjUXt7e7q6ujJ+/Pitto8fPz5r164tU1VUE+91lJNer3L4u6Kc/K5iqOjNKSfvdZTTcOn1BOl/5Oyzz97uRwW2PB5++OEkyYoVKzJlypSev7D77rsv48aN2+aXGgyGBx54IG984xuTJLvvvnt+/vOf57//+7/LXBXAwPJeRznp9cpLX06l8LsKqAbe6yin4dLrjR7SV6sAn/nMZ/KBD3yg5DGve93rkiT3339/3vSmN/Vsv++++7Z6DoPpL//yL3v+fNppp+W0004rYzWMVA0NDampqcm6deu22r5u3bpMmDChTFVRTbzXUU56vfLSl1Mp/K5iqOjNKSfvdZTTcOn1zEj/I/vuu28OPvjgko8xY8Yk6f5LnDZtWs+5991331bPYUf0Z/YVDLYxY8bk8MMPz+LFi3u2bd68OYsXL86RRx5ZxsoABp9er7z05ZSbvpzhRm8OVKvh0uuZkb6DNm/enAceeCDnnXdez7bf/OY3mT17dhmrYiTo6+yrQqFQ8phisTiAVVHN5s+fnzPOOCMzZszIEUcckcsuuyzr16/P3Llzy10aVcB7HeWi16sc/q4YLPpyhiO9OeXivY5yGU69niB9B/3mN7/JCy+8sNW/frzpTW/KggULcvjhh+fNb35zGaujku27777Zd999X/W4tra2vP/9789TTz2V0aNH59xzz8173/veIaiQajNnzpw8/fTTOe+887J27dpMnz49N910k3VnGRLe6ygXvV7l8HfFYNGXMxzpzSkX73WUy3Dq9QpF/2QEFWnNmjVZt25dpk+fnrVr1+bwww/PqlWrsvvuu5e7NIAB470OgOHO7yqgGnivAzPSoWLtt99+2W+//ZIkEyZMSENDQ5555hm/xIARxXsdAMOd31VANfBeB242CiPCPffck66urkycOLHcpQAMGu91AAx3flcB1cB7HdXKjHSocM8880xOP/30XH311eUuBWDQeK8DYLjzuwqoBt7rqGZmpEMF27hxY0455ZScffbZOeqoo8pdDsCg8F4HwHDndxVQDbzXUe0E6VChisViPvCBD+T444/P+9///nKXAzAovNcBMNz5XQVUA+91kBSKxWKx3EUA/XfHHXfkmGOOybRp03q2fe9738ub3vSmMlYFMLC81wEw3PldBVQD73UgSAcAAAAAgJIs7QIAAAAAACUI0gEAAAAAoARBOgAAAAAAlCBIBwAAAACAEgTpAAAAAABQgiAdAAAAAABKEKQDAAAAAEAJgnQAAAAAAChBkA4AAAAAACUI0gF4VcViMZdeemkmT56c3XbbLaeccko6OjrKXRYAAFQVfTlA+QjSAXhVn/vc53LllVfmO9/5Tm6//fbcc889Of/888tdFgAAVBV9OUD5FIrFYrHcRQAwfN1111058sgj86tf/SqHHXZYkmThwoX5/ve/n5UrV5a5OgAAqA76coDyMiMdgJIuueSSvO1tb+tp1pNk/PjxaW9vL2NVAABQXfTlAOUlSAdguzZu3Jh/+7d/y6mnnrrV9g0bNqS+vr5MVQEAQHXRlwOUn6VdANiupUuX5qijjkptbW1qamp6tr/44ot561vfmptuuqmM1QEAQHXQlwOU3+hyFwDA8LVq1arsvvvuWb58+Vbb3/Wud+XNb35zeYoCAIAqoy8HKD9BOgDb1dnZmYaGhhx00EE92x5//PH8+te/zmmnnVbGygAAoHroywHKzxrpAGxXQ0NDOjo68spVwL785S/npJNOSlNTUxkrAwCA6qEvByg/M9IB2K7jjz8+GzZsyEUXXZT/8T/+R77//e/nJz/5Se6+++5ylwYAAFVDXw5QfmakA7Bd48ePz7XXXpsrr7wyb3zjG/Of//mfueOOOzJx4sRylwYAAFVDXw5QfoXiKz8XBAAAAAAAbMWMdAAAAAAAKEGQDgAAAAAAJQjSAQAAAACgBEE6AAAAAACUIEgHAAAAAIASBOkAAAAAAFCCIB0AAAAAAEoQpAMAAAAAQAmCdAAAAAAAKEGQDgAAAAAAJQjSAQAAAACgBEE6AAAAAACU8P8DOu1hNbWus7QAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_theta_cs = files[\"test\"][\"Nominal/h_theta_truth_cs_WW\"]\n", + "h_theta_cs_noCR = files[\"test_noCR\"][\"Nominal/h_theta_truth_cs_WW\"]\n", + "\n", + "h_theta_ud = files[\"test\"][\"Nominal/h_theta_truth_ud_WW\"]\n", + "h_theta_ud_noCR = files[\"test_noCR\"][\"Nominal/h_theta_truth_ud_WW\"]\n", + "\n", + "values1, edges1 = h_theta_cs.to_numpy()\n", + "values2, edges2 = h_theta_cs_noCR.to_numpy()\n", + "values3, edges3 = h_theta_ud.to_numpy()\n", + "values4, edges4 = h_theta_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\theta$')\n", + "ax1.set_ylabel(r'Set Axis Label')\n", + "ax1.set_title(r'$\\theta$: W1 $\\rightarrow$ cs')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\theta$')\n", + "ax2.set_ylabel(r'Set Axis Label')\n", + "ax2.set_title(r'$\\theta$: W2 $\\rightarrow$ ud')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "7400ae0b-638e-4fbe-a620-ef098de88f57", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpl0lEQVR4nO3de3idZZkv/m+a0qaACWCgB2ymRWghSNuhxG4QhY3VgmwRigrOaLGj6GB1j1PPBxpOylFFJVLFHwPjYTgMFQ/bXUejdYNWyBQrlUMBBVIOLQQvEii0xXb9/sjVQGxXadqka63k87mudS3We3hyv2lYufvts563qlAoFAIAAAAAAGxhWKkLAAAAAACAciVEBwAAAACAIoToAAAAAABQhBAdAAAAAACKEKIDAAAAAEARQnQAAAAAAChCiA4AAAAAAEUI0QEAAAAAoAghOgAAAAAAFCFEBwAAAACAIoToAAAAAABQhBAdoJ/99a9/zRe+8IVMnDgxu+++e4455pjcd999pS4LAAAGNX04AANFiA7QjzZu3JjZs2fnK1/5St7//vfnC1/4Qu6+++689a1vzV//+tc+jXXDDTekqqoqP/jBD7bYN3Xq1FRVVeVXv/rVFvsaGhpy1FFHJUmeffbZNDc35/jjj88+++yTqqqqXHPNNTt0bQAAUK7KrQ9va2vLhz/84Rx66KHZY4890tDQkHe+851CfYAKJUQH6EeXXXZZWltb8+tf/zqf+9zn8q//+q/56le/mvvuuy9Llizp01hHH310kuTWW2/ttb2rqyt//OMfM3z48PzmN7/ptW/VqlVZtWpVz7kdHR0577zzcs8992Tq1Kk7fmEAAFDGyq0Pv/jii3PTTTfljW98Y7761a/mAx/4QP7f//t/Ofzww/PHP/5xxy8UgJIQogP0k87Oznzxi1/MRz/60Rx66KE92zfPRvnDH/7Qp/HGjRuXiRMnbtG8L126NIVCIe94xzu22Lf59ebmfezYsXn88cfz8MMP59JLL+3zNQEAQLkrxz58/vz5efjhh/O1r30t73//+/P5z38+t9xyS/7617/moosu6vM1AlBaQnSAfvK9730vzzzzTD7wgQ/02r7bbrslSZ555pmebffee2/a29tfdsyjjz46v//97/P888/3bPvNb36TQw89NCeccEJ+97vfZdOmTb32VVVV5XWve12SZOTIkRkzZsxOXdeutGzZsrz97W/Pfvvtl5qamhx88ME577zzeh1z3XXXZdq0aampqcnkyZNz8803513velevvzABADB0lGMfftRRR2XEiBG9xjzooINy6KGH5p577un7RQ6w/uqx9erAYCVEB+gnixYtSmNjY/bYY490dHT0PFatWpUk2WOPPXqOPeSQQzJnzpyXHfPoo4/OCy+8kNtuu61n229+85scddRROeqoo9LZ2dnr46C/+c1vcvDBB+eVr3xlP17Z9jn77LNz1VVX7fD5P/jBD3LUUUflrrvuyic+8Yl85StfyVFHHZXf/va3Pcd85Stfybve9a68+tWvzte//vXMmjUr73nPe3LbbbflNa95TX9cBgAAFaZS+vBCoZA1a9akvr5+Ry6zqJ3tw/urx9arA4PZ8FIXADAYbNy4Mb/73e+ydu3a7Lvvvls9ZuLEiX0e96XrMR577LH561//mttuuy1nnHFGXv3qV2f06NG59dZbM2XKlDzzzDNZsWJF/umf/mmnrmVHdXZ25oMf/GB22223vPe97+3Tuffdd1/e/e5358QTT8z3v//91NTUJEnOOuusrF+/PkmyYsWKfOpTn8rZZ5/da3b6Cy+8kIULF2bu3Ln9di0AAFSGSurDv/e97+XRRx/d4pOWO2tn+vD+6rH16sBgJ0QH6Ad/+tOfsnbt2nzyk5/Mm970pl77rr766vzHf/xHpkyZ0rOtUChs17iHHHJIXvnKV/assfiHP/wha9eu7Vnf8aijjspvfvObfOhDH8rSpUuzcePGnoa/v61bt26b+y+55JI888wzed/73pcRI0bkH/7hH7Z77AULFqSmpibXXHNNT4C+2ciRI5MkF154Yfbee+989rOf7bX/6KOPzsKFC3PYYYdt99cDAGBwqJQ+/N577828efNy5JFH5owzzujTNQ5kH95fPbZeHRjsLOcC0A8eeuihJMmxxx6bmTNn9no88cQTGT16dCZNmtTncauqqnLUUUf1rLn4m9/8Jvvtt18OPPDAJC8270l6ngciRH/22WczatSol31cc8012bRpU+bMmZPVq1dv19jr16/Pj3/847z73e9ObW3tVo/ZsGFDfvSjH2XOnDlbhOzPPvtskvR8RPTJJ5/MiSeemD322COTJ09Oa2vrTlw5AADlrBL68NWrV+fEE09MXV1d/vM//zPV1dXbXcdA9uF96bGvvPLKHH744dltt91yzjnn7PA469evzz/90z+loaEhtbW1+R//439k6dKl2/39ACgVM9EB+sHatWuT9F5vMen+aOUtt9yyU0usHH300fnxj3+cFStW9KzDuNlRRx2VT3ziE3n00Udz6623Zty4cTnggAN2+GsVU1NTk3/7t3972eN+9rOf5brrrsvs2bOLfpz2b/35z3/Oc889l+nTpxc9ZvMMo2nTpm2x77777svuu+/ec93z5s3LmDFj8uSTT+YXv/hF3vnOd+b+++/PPvvss131AABQOcq9D+/s7MwJJ5yQp59+OrfcckvGjRvXpxoGsg/vS489duzYnHPOOfn+97+/U+P89a9/zYQJE3LrrbfmVa96VW644Ya89a1vzUMPPZQ999xzu+oGKAUhOkA/eMUrXpHkxZkWm1177bXZsGFDzjrrrB0e+6XrMf7mN7/JRz/60Z5906dPz8iRI7NkyZLcdtttectb3rLDX2dbhg8f/rLrK/785z/PD37wg5x88sn5/ve/v90zbJ5//vkk3bN9innuueeKbv/ud7+bQw45JMOGDcuzzz6bm2++OX/+85+z++6756STTsphhx2WH/7wh9ZhBAAYhMq5D1+3bl3e+ta35r777ssvfvGLNDY29rmGgezDt7fHTpKTTz45SfLTn/50p8bZY489smDBgp5jTj/99MyfPz8rV67c5qQagFKznAtAP5gyZUqGDRuWX/3qVz3bHnnkkZx//vmZM2dOr3UYk+41Edvb27dr7COOOCI1NTU9NyJ66QyYkSNH5vDDD09LS0vWrl07YOuhb48LLrggM2fOzPXXX5/hw7f/32g3fyT2F7/4xRb7XnjhhSRJQ0NDkhc/KrtZc3NznnjiiZ41Fu+///7sueeeedWrXtVzzGGHHZa77rqrbxcDAEBFKNc+fOPGjTnttNOydOnS3HjjjTnyyCN34iq3bUf78O3tsQdynPvvvz9/+ctfev5OAFCuzEQH6Af77bdfTj755Hz1q1/N7rvvnrq6ulx++eXZf//98/Wvf32L4w855JAcc8wxWbJkycuOPWLEiDQ1NeWWW27JyJEjt5ihcdRRR+VLX/pSkq2vw3jFFVfk6aefzmOPPZYk+fGPf5xHHnkkSfKRj3wkdXV1fb3crfrhD3+YUaNGZcSIEX06r7a2Nu9973tzzTXXZP369Tn22GPzzDPP5Fe/+lVOPPHEzJs3L/vuu2/e/OY351vf+lZGjhyZQw45JD/+8Y+zatWqJC+usfjss89usa56bW1tnnrqqX65RgAAyku59uEf+9jH8qMf/Shvfetb85e//CXf/e53e+1/97vf3ccrLW5H+/Dt7bEHapznn38+7373u/OZz3ym3/5OAjBQhOgA/eTb3/523v/+9+dLX/pS9txzz7zzne/MF77whZ6PmO6Mo48+OrfcckvPx0Zf6nWve12+9KUv5RWveEWmTp26xbmXXXZZHn744Z7XixYtyqJFi5J0N+/91bDutddeO3xuS0tL9t9//9xwww25+eabs88+++Soo47K8ccf33PMtddemw984AP5//6//y+1tbV597vfnQ9+8IN561vf2tOY77nnnunq6uo1dldXl/UVAQAGsXLsw5cvX56kewLLj3/84y3G7c8QfWf68O3psQdinBdeeCHveMc7cuCBB/Za3gWgXFUVCoVCqYsAgB3xta99Lf/yL/+SRx99NOPGjcuzzz6bffbZJw8++GD233//JMn//J//M3PmzLEmOgAAbIe/7bFf6p//+Z8zZsyYnHPOOTs8zqZNm/IP//APWbt2bX7wgx/0aQkagFKxJjoAFevuu+/OPvvs09OU77nnnnnb296W5ubmPP/88/nJT36SO++8M29729tKXCkAAFSGv+2xk+Svf/1r1q1bl40bN/b6776OkyQf/OAH8/jjj+fGG28UoAMVQ4gOQMW6++67c+ihh/ba9o1vfCOPPfZYXvnKV2b+/Pm5/vrrs88++5SoQgAAqCxb67EvuOCCjBo1Kt/+9rfzhS98IaNGjcp3vvOdPo/z8MMP59vf/nZuv/321NfXZ88998yee+6ZW265pd+vA6A/Wc4FgIq177775h3veEe+8Y1vlLoUAAAYFPqrx9arA4OJEB0AAAAAAIqwnAsAAAAAABQhRAcAAAAAgCIq8jbImzZtymOPPZZXvOIVqaqqKnU5AADQJ4VCIc8880zGjRuXYcMqd16LvhwAgEq2vX15RYbojz32WMaPH1/qMgAAYKesWrUqr3rVq0pdxg7TlwMAMBi8XF9ekSH6K17xiiTdF1dbW1viagAAoG+6uroyfvz4nr62UunLAQCoZNvbl1dkiL75o6K1tbWadQAAKlalL4GiLwcAYDB4ub68chdgBAAAAACAASZEBwAAAACAIoToAAAAAABQxA6tid7S0pJLL700q1evztSpU/P1r389r33ta7d67KJFi/LFL34xDzzwQF544YUcdNBB+djHPpb3vOc9Pce8973vzbXXXtvrvFmzZmXx4sU7Uh4AAC9j06ZN2bBhQ6nLGLR22223VFdXl7oMAAAqwMaNG/PCCy+UuoxBqb/68j6H6Ndff33mz5+fhQsXZsaMGbn88ssza9asrFy5Mvvtt98Wx++zzz753Oc+l4MPPjgjRozIT37yk8ydOzf77bdfZs2a1XPc8ccfn3/7t3/reT1y5MgdvCQAALZlw4YNefDBB7Np06ZSlzKo7bXXXhkzZkzF3zwUAICBUSgUsnr16jz99NOlLmVQ64++vM8h+pe//OWceeaZmTt3bpJk4cKF+T//5//k6quvzqc//ektjj/22GN7vf6Xf/mXXHvttbn11lt7hegjR47MmDFj+loOAAB9UCgU8vjjj6e6ujrjx4/PsGFW9+tvhUIhzz33XJ544okkydixY0tcEQAA5WhzgL7ffvtl9913N/min/VnX96nEH3Dhg1ZtmxZPvOZz/RsGzZsWGbOnJmlS5e+7PmFQiG//OUvs3Llylx88cW99i1ZsiT77bdf9t577xx33HG54IIL8spXvrIv5QEA8DL++te/5rnnnsu4ceOy++67l7qcQWvUqFFJkieeeCL77befpV0AAOhl48aNPQG6DHTg9Fdf3qcQvaOjIxs3bszo0aN7bR89enTuvffeoud1dnZm//33z/r161NdXZ1vfOMbedOb3tSz//jjj8/s2bMzceLE/OlPf8pnP/vZnHDCCVm6dOk2L6yrq6vX65EjR1oGBgBgGzZu3JgkGTFiRIkrGfw2/yPFCy+8IEQHAKCXzWugm9gy8PqjL9+hG4v21Ste8YosX748zz77bFpbWzN//vwccMABPUu9nH766T3HHnbYYZkyZUpe/epXZ8mSJXnjG99YdNzx48f3et3c3JxzzjlnIC4BAGBQ8VHRged7DADAy9EzDrz++B73KUSvr69PdXV11qxZ02v7mjVrtrme+bBhw3LggQcmSaZNm5Z77rknF1544RbrpW92wAEHpL6+Pg888MA2Q/RVq1altra257VZ6AAAsOs1NTWluro68+bNy7x580pdDgAA9Ks+hegjRozI9OnT09rampNPPjlJsmnTprS2tubDH/7wdo+zadOmrF+/vuj+Rx55JE899dTLLvZeW1vbK0QHAAB2vba2Nn05AACD1rC+njB//vxcddVVufbaa3PPPffkrLPOytq1azN37twkyZw5c3rdePTCCy/Mz3/+8/z5z3/OPffcky996Uv5zne+k3e/+91JkmeffTaf+MQn8rvf/S4PPfRQWltb87a3vS0HHnhgZs2a1U+XCQDAUPPrX/96i+X/XqpQKORb3/pWZsyYkT333DN77bVXjjjiiFx++eV57rnnkiTnnHNOqqqqUlVVlerq6owfPz4f+MAH8pe//GVXXQYAAFS8Su/N+7wm+mmnnZYnn3wyCxYsyOrVqzNt2rQsXry452aj7e3tGTbsxWx+7dq1+dCHPpRHHnkko0aNysEHH5zvfve7Oe2005Ik1dXVufPOO3Pttdfm6aefzrhx4/LmN785559/vuVZAADYYT/84Q/z1re+tej+97znPVm0aFE+//nP54orrsi+++6bP/zhD7n88sszYcKEnk9eHnroofnFL36RjRs35p577sk//dM/pbOzM9dff/0uuhIAAKhsld6b79CNRT/84Q8XXb5lyZIlvV5fcMEFueCCC4qONWrUqPzsZz/bkTIAACiVRYuSc89N7rsvmTQpaW5OZs8ekC/1k5/8JO9+97vz1FNPpbq6OsuXL8/f//3f51Of+lQuuuiiJMn73//+rFu3Lt/97nd7zvvRj36UK664Yqtj3nDDDfne976Xm2++OW9729t6tk+YMCEnnXRSurq6erYNHz685/4/+++/f97xjnfk3/7t3wbiUgEAoO/05gNxqb30eTkXAACGuEWLklNPTVasSNat634+9dTu7QPg9a9/fZ555pn8/ve/T9L9UdD6+vpekzd+/etf97pp/V133ZUnnngixx133FbH/N73vpfJkyf3atI3q6qqSl1d3VbPe+ihh/Kzn/0sI0aM2PELAgCA/qI33yW9uRAdAIC+OffcpKoqKRS6XxcK3a/PO29AvlxdXV2mTZvW05gvWbIk//qv/5rf//73efbZZ/Poo4/mgQceyDHHHNNzzg9/+MPMmjWraEN9//33Z/Lkydv19VesWJE999wzo0aNysSJE3PXXXflU5/61E5fFwAA7DS9+S7pzXdoORcAgIHS3p50dGy5vb4+aWjY9fWwFffd92KTvlmhkKxcOWBf8phjjsmSJUvysY99LLfccksuvPDC3HDDDbn11lvzl7/8JePGjctBBx3Uc/wPf/jDossPdpdbKLrvb02ePDk/+tGPej6Sunz58nzkIx/ZqesBAKgEevMKoDffJb25megAQNlob08mT06mT9/yMXly937KwKRJ3bNbXqqqqvsPaYAce+yxufXWW/OHP/whu+22Ww4++OAce+yxWbJkSX7961/3muny+OOP5/e//31OPPHEouNNmjQp995773Z97REjRuTAAw/Ma17zmlx00UWprq7Oueeeu9PXBABQzvTmFUJvvkt6cyE6AFA2Ojq6l/HbmnXrtj4LhhJobn7xY6LJix8fbW4esC+5ee3Fr3zlKz1N+eZGfcmSJb3WXPzxj3+co446Kvvss0/R8f7hH/4h9913X374wx9usa9QKKSzs7PouZ///Odz2WWX5bHHHtvxCwIAKHN68wqhN98lvbkQHQCAvpk9O7nppmTKlKSmpvt50aLklFMG7EvuvffemTJlSr73ve/1NOVveMMbcscdd+S+++7rNdvlRz/6UU466aRtjvfOd74zp512Wt71rnfli1/8Yv77v/87Dz/8cH7yk59k5syZ+dWvflX03COPPDJTpkzJF7/4xX65NgAA2GF6813SmwvRAQDou9mzk+XLk+ef734ewCZ9s2OOOSYbN27sadT32WefNDY2ZsyYMT03Ilq7dm1aW1tftlGvqqrK97///Xz5y1/OzTffnGOOOSZTpkzJOeeck7e97W2ZNWvWNs//13/913z729/OqlWr+uXaAABgh+nNB7w3ryr0ZeX2MtHV1ZW6urpMmjQp1dXVmTdvXubNm1fqsgCAnXTHHd1rLBazbFly+OG7rp7BaN26dXnwwQczceLE1NTUlLqcfrdo0aJ8/vOfz913313qUrb5vd7cz3Z2dqa2trZEFe68wXIdAMCW9OYDa7D35Un59Ob90ZcPH+giB1JbW5tmHQCAHnvuuWcuvvjiUpcBAABD3mDqzSs6RAcABpf6+qRmt41Z90L1FvtqdtuY+vott8NLvfnNby51CUNSU1OTT4gCwCBTX9+9xPbWbi5aU9O9H7ZlMPXmQnQAoGw0NCQrH6hOxw2/TL71reThh5O/+7vkAx9I/TuPS0NDqSsEtsYnRAFg8GloSFauTDo6ttxXXx+9OUOKEB0AKCsNDUnDx49LPn5cqUsBAIAhraFBWA5JMqzUBQAAAAAAQLkSogMAAAAAQBFCdAAAAAAAKEKIDgAAAAAARQjRAQAAAACgCCE6AAAAAAAUIUQHAGBI+9WvfpW3vOUteeUrX5ndd989jY2N+djHPpZHH300SbJkyZJUVVX1PPbdd9+85S1vyYoVK0pcOQAADC7l2psL0QEA6JP29uSOO7Z8tLeXurK+++Y3v5mZM2dmzJgxuemmm3L33Xdn4cKF6ezszJe+9KVex65cuTKPP/54fvazn2X9+vU58cQTs2HDhhJVDgAAevNd1ZsPH7CRAQAYdNrbk8mTk3XrttxXU5OsXJk0NPT/1z322GMzZcqU1NTU5Nvf/nZGjBiRf/7nf84555zzktra85GPfCStra0ZNmxYjj/++Hz961/P6NGjtzrmI488kv/9v/93/vf//t/5yle+0rN9woQJecMb3pCnn3661/H77bdf9tprr4wZMyYf/ehHc9JJJ+Xee+/NlClT+v+CAQDgZejNd11vXtEz0ZuamtLY2JiWlpZSlwIAMCR0dGy9SU+6t3d0DNzXvvbaa7PHHnvktttuyyWXXJLzzjsvP//5z5MkmzZtytve9rb85S9/ya9//ev8/Oc/z5///OecdtppRce78cYbs2HDhnzyk5/c6v699tprq9s7Oztz3XXXJUlGjBixcxcFAAA7SG++63rzip6J3tbWltra2lKXAQDALjBlypQ0NzcnSQ466KBcccUVaW1tzZve9Ka0trZmxYoVefDBBzN+/Pgkyb//+7/n0EMPTVtbW5qamrYY7/77709tbW3Gjh27XV//Va96VZJk7dq1SZKTTjopBx98cH9cWsVrampKdXV15s2bl3nz5pW6HAAABthQ680rOkQHAGDo+NuPZo4dOzZPPPFEkuSee+7J+PHje5r0JGlsbMxee+2Ve+65Z6uNeqFQSFVV1XZ//VtuuSW77757fve73+WLX/xiFi5cuINXMviY3AIAMLQMtd5ciA4AQEXYbbfder2uqqrKpk2bdni8SZMmpbOzM48//vh2zXiZOHFi9tprr0yePDlPPPFETjvttPy///f/dvjrAwBApRpqvXlFr4kOAABJcsghh2TVqlVZtWpVz7a77747Tz/9dBobG7d6ztvf/vaMGDEil1xyyVb3/+3Ni15q3rx5+eMf/5gf/OAHO1U3AAAMNoOxNxeiAwCw3errk5qare+rqeneXwozZ87MYYcdln/8x3/MHXfckdtvvz1z5szJMccckyOOOGKr54wfPz5f+cpX8tWvfjXve9/78utf/zoPP/xwfvOb3+SDH/xgzj///KJfb/fdd8+ZZ56Z5ubmFAqFgbosAAAoSm/ebVf05kJ0AAC2W0NDsnJlsmzZlo+VK7v3l0JVVVV++MMfZu+9984b3vCGzJw5MwcccECuv/76bZ73oQ99KP/1X/+VRx99NKecckoOPvjgvP/9709tbW0+/vGPb/PcD3/4w7nnnnty44039uelAADAdtGbv2ige/OqQgVOnenq6kpdXV06OzvdwAgAoA/WrVuXBx98MBMnTkxNsWkr9Ittfa8HSz87WK4DAGBX05fvOv3Rl5uJDgAAAAAARQjRAQAAAICtW7QomTo1GTWq+3nRolJXBLucEB0AAAAA2NKiRcmppyYrViTr1nU/n3qqIJ0hR4gOAAAAAGzp3HOTqqpk8y0VC4Xu1+edV9q6YBcTogMAAAAAW7rvvhcD9M0KhWTlytLUAyVS0SF6U1NTGhsb09LSUupSAAAqSuFv/zJEv9u0aVOpSwAA2DmTJnXPPH+pqqpk8uTS1DMI6RkHXn98j4f3Qx0l09bWltra2lKXAQBQMXbbbbdUVVXlySefzL777puqv/1LETutUChkw4YNefLJJzNs2LCMGDGi1CUBAOyY5ubuNdA3L+my+bm5udSVVbwRI0Zk2LBheeyxx7LvvvtmxIgRevN+1p99eUWH6AAA9E11dXVe9apX5ZFHHslDDz1U6nIGtd133z0NDQ0ZNqyiP/y5XZqamlJdXZ158+Zl3rx5pS4HAOgvs2cnN93UvQb6ypXdM9Cbm5NTTil1ZRVv2LBhmThxYh5//PE89thjpS5nUOuPvryqUIGf5e3q6kpdXV06OzvNRAcA2AEbN27MCy+8UOoyBq3q6uoMHz686GyiwdLPDpbrAAAolUKhkL/+9a/ZuHFjqUsZlPqrLzcTHQBgCKqurk51dXWpywAAgCGtqqoqu+22W3bbbbdSl8I2DP7PlgIAAAAAwA4SogMAAAAAQBFCdAAAAAAAKEKIDgAAAAAARQjRAQAAAACgCCE6AAAAAAAUIUQHAIAK1tLSkgkTJqSmpiYzZszI7bffXvTYRYsW5Ygjjshee+2VPfbYI9OmTct3vvOdXscUCoUsWLAgY8eOzahRozJz5szcf//9A30ZAABQtoToAABQoa6//vrMnz8/zc3NueOOOzJ16tTMmjUrTzzxxFaP32efffK5z30uS5cuzZ133pm5c+dm7ty5+dnPftZzzCWXXJKvfe1rWbhwYW677bbssccemTVrVtatW7erLgsAAMpKVaFQKJS6iL7q6upKXV1dJk2alOrq6sybNy/z5s0rdVkAALBdNveznZ2dqa2t3eFxZsyYkaamplxxxRVJkk2bNmX8+PH5yEc+kk9/+tPbNcbhhx+eE088Meeff34KhULGjRuXj33sY/n4xz+eJOns7Mzo0aNzzTXX5PTTTx+Q6wAAgFLY3n62omeit7W15e677xagAwAw5GzYsCHLli3LzJkze7YNGzYsM2fOzNKlS1/2/EKhkNbW1qxcuTJveMMbkiQPPvhgVq9e3WvMurq6zJgxY7vGBACAwWh4qQsAAAD6rqOjIxs3bszo0aN7bR89enTuvffeoud1dnZm//33z/r161NdXZ1vfOMbedOb3pQkWb16dc8Yfzvm5n1b09XV1ev1yJEjM3LkyD5dDwAAlKuKnokOAAD0zSte8YosX748bW1t+cIXvpD58+dnyZIlOzXm+PHjU1dX1/O48MIL+6dYAAAoA2aiAwBABaqvr091dXXWrFnTa/uaNWsyZsyYoucNGzYsBx54YJJk2rRpueeee3LhhRfm2GOP7TlvzZo1GTt2bK8xp02bVnTMVatW9VpD0ix0AAAGEzPRAQCgAo0YMSLTp09Pa2trz7ZNmzaltbU1Rx555HaPs2nTpqxfvz5JMnHixIwZM6bXmF1dXbntttu2OWZtbW2vhxAdAIDBxEx0AACoUPPnz88ZZ5yRI444Iq997Wtz+eWXZ+3atZk7d26SZM6cOdl///17lle58MILc8QRR+TVr3511q9fn5/+9Kf5zne+kyuvvDJJUlVVlY9+9KO54IILctBBB2XixIk5++yzM27cuJx88smlukwAACgpIToAAFSo0047LU8++WQWLFiQ1atXZ9q0aVm8eHHPjUHb29szbNiLHz5du3ZtPvShD+WRRx7JqFGjcvDBB+e73/1uTjvttJ5jPvnJT2bt2rX5wAc+kKeffjpHH310Fi9enJqaml1+fQAAUA6qCoVCodRF9FVXV1fq6urS2dnZa+1FAACoBIOlnx0s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AAAA6LuOjo5s3Lgxo0eP7rV99OjRuffee7drjE996lMZN25cryD++OOPz+zZszNx4sT86U9/ymc/+9mccMIJWbp0aaqrq7c6TldXV6/XI0eOzMiRI/t4RQAAUJ6E6AAAMARddNFFue6667JkyZLU1NT0bD/99NN7/vuwww7LlClT8upXvzpLlizJG9/4xq2ONX78+F6vm5ubc8455wxI3QAAsKsJ0QEAoALV19enuro6a9as6bV9zZo1GTNmzDbPveyyy3LRRRflF7/4RaZMmbLNYw844IDU19fngQceKBqir1q1qtcakmahAwAwmFgTHQAAKtCIESMyffr0tLa29mzbtGlTWltbc+SRRxY975JLLsn555+fxYsX54gjjnjZr/PII4/kqaeeytixY4seU1tb2+shRAcAYDARogMAQIWaP39+rrrqqlx77bW55557ctZZZ2Xt2rWZO3dukmTOnDn5zGc+03P8xRdfnLPPPjtXX311JkyYkNWrV2f16tV59tlnkyTPPvtsPvGJT+R3v/tdHnroobS2tuZtb3tbDjzwwMyaNask1wgAAKW2QyF6S0tLJkyYkJqamsyYMSO333570WOvuuqqvP71r8/ee++dvffeOzNnztzi+Pe+972pqqrq9Tj++ON3pDQAABgyTjvttFx22WVZsGBBpk2bluXLl2fx4sU9Nxttb2/P448/3nP8lVdemQ0bNuTtb397xo4d2/O47LLLkiTV1dW58847c9JJJ2XSpEl53/vel+nTp+eWW24xuxwAgCGrqlAoFPpywvXXX585c+Zk4cKFmTFjRi6//PLceOONWblyZfbbb78tjv/Hf/zHvO51r8tRRx2VmpqaXHzxxfnBD36Qu+66K/vvv3+S7hB9zZo1+bd/+7ee80aOHJm99957qzV0dXWlrq4unZ2dvdZeBACASjBY+tnBch0AAAxN29vP9nkm+pe//OWceeaZmTt3bhobG7Nw4cLsvvvuufrqq7d6/Pe+97186EMfyrRp03LwwQfn29/+ds9ajS81cuTIjBkzpudRLEAHAAAAAIBdpU8h+oYNG7Js2bLMnDnzxQGGDcvMmTOzdOnS7RrjueeeywsvvJB99tmn1/YlS5Zkv/32y+TJk3PWWWflqaee6ktpAAAAAADQ74b35eCOjo5s3LixZ43FzUaPHp177713u8b41Kc+lXHjxvUK4o8//vjMnj07EydOzJ/+9Kd89rOfzQknnJClS5emurq66FhdXV29Xo8cOdJajQAAAAAA9Js+heg766KLLsp1112XJUuWpKampmf76aef3vPfhx12WKZMmZJXv/rVWbJkSd74xjcWHW/8+PG9Xjc3N+ecc87p97oBAAAAABia+hSi19fXp7q6OmvWrOm1fc2aNRkzZsw2z73sssty0UUX5Re/+EWmTJmyzWMPOOCA1NfX54EHHthmiL5q1apeC76bhQ4AAAAAQH/q05roI0aMyPTp03vdFHTzTUKPPPLIouddcsklOf/887N48eIcccQRL/t1HnnkkTz11FMZO3bsNo+rra3t9RCiAwAAAADQn/oUoifJ/Pnzc9VVV+Xaa6/NPffck7POOitr167N3LlzkyRz5szJZz7zmZ7jL7744px99tm5+uqrM2HChKxevTqrV6/Os88+myR59tln84lPfCK/+93v8tBDD6W1tTVve9vbcuCBB2bWrFn9dJkAAAAAANB3fQ7RTzvttFx22WVZsGBBpk2bluXLl2fx4sU9Nxttb2/P448/3nP8lVdemQ0bNuTtb397xo4d2/O47LLLkiTV1dW58847c9JJJ2XSpEl53/vel+nTp+eWW24xsxwAKsGiRcnUqcmoUd3PixaVuiIAAADoN1WFQqFQ6iL6qqurK3V1dens7Oy1JjoAsIstWpScempSVZUUCi8+33RTMnt2qauDsjVY+tnN1zFp0qRUV1dn3rx5mTdvXqnLAgCA7bK9fXmfbiwKANDLuee+GJwnLwbp550nRIchpK2traL/MQAAALalz8u5AAD0uO++FwP0zQqFZOXK0tQDAAAA/UyIDgDsuEmTumeev1RVVTJ5cmnqAQAAgH4mRAcAdlxz84tLuCQvLu3S3FzaugAAAKCfCNEBgB03e3b3TUSnTElqarqfFy1KTjml1JUBAABAv3BjUQBg58ye7SaiAAAADFpmogMAAAAAQBEVHaI3NTWlsbExLS0tpS4FAAAAAIBBqKKXc2lra0ttbW2pywAAAAAAYJCq6JnoAAAAAAAwkCp6JjoAAAAADHXt7UnHDb9MvvnN7hcNDckHP5j6dx6XhoZSVweVT4gOAAAAABWqvT2ZfODGrHvhuCTHdW98IMknkprPbszKB6oF6bCTLOcCAADslKampjQ2NqalpaXUpQDAkNPRkax7oXqr+9a9UJ2Ojl1cEAxCZqIDAAA7pa2tLbW1taUuAwAABoSZ6AAAAAAAUISZ6ADADmtvz1Y/HlpfH+suAgAAMCgI0QGAHdLenkyenKxbt+W+mppk5UpBOgAAAJXPci4AwA7p6Nh6gJ50b3cDIwAAGHj19d2TWLampqZ7P7BzzEQHAAAAgArV0ND9KVDLLMLAEaIDAAAAQAVraBCWw0Cq6OVcmpqa0tjYmJaWllKXAgAAAADAIFTRM9Hb2tpSW1tb6jIAAAAAABikKnomOgBQOm5gBAAAwFBQ0TPRAYDScQMjAAAAhgIhOgCww9zACAAAgMHOci4AAAAAAFCEEB0AANgpTU1NaWxsTEtLS6lLAQCAfmc5FwAAYKe0tbWltra21GUAAMCAMBMdAAAAAACKEKIDAAAAAEARQnQAAAAAAChCiA4AAAAAAEUI0QEAAAAAoAghOgAAAAAAFFHRIXpTU1MaGxvT0tJS6lIAAAAAABiEhpe6gJ3R1taW2traUpcBAAAAAMAgVdEz0QEAAAAAYCAJ0QEAAAAAoAghOgAAAAAAFCFEBwAAAACAIoToAADATmlqakpjY2NaWlpKXQoAAPS74aUuAAAAqGxtbW2pra0tdRkAADAgzEQHAAAAAIAihOgAAAAAAFCEEB0AAAAAAIoQogMAAAAAQBFCdAAAAAAAKKKiQ/SmpqY0NjampaWl1KUAAAAAADAIDS91ATujra0ttbW1pS4DAAAAAIBBqqJnogMAwFDX0tKSCRMmpKamJjNmzMjtt99e9Nirrroqr3/967P33ntn7733zsyZM7c4vlAoZMGCBRk7dmxGjRqVmTNn5v777x/oywAAgLIlRAcAgAp1/fXXZ/78+Wlubs4dd9yRqVOnZtasWXniiSe2evySJUvyrne9K7/61a+ydOnSjB8/Pm9+85vz6KOP9hxzySWX5Gtf+1oWLlyY2267LXvssUdmzZqVdevW7arLAgCAslJVKBQKpS6ir7q6ulJXV5fOzk7LuQAAUHH6q5+dMWNGmpqacsUVVyRJNm3alPHjx+cjH/lIPv3pT7/s+Rs3bszee++dK664InPmzEmhUMi4cePysY99LB//+MeTJJ2dnRk9enSuueaanH766QNyHQAAUArb28+aiQ4AABVow4YNWbZsWWbOnNmzbdiwYZk5c2aWLl26XWM899xzeeGFF7LPPvskSR588MGsXr2615h1dXWZMWPGNsfs6urq9Vi/fv0OXhUAAJQfIToAAFSgjo6ObNy4MaNHj+61ffTo0Vm9evV2jfGpT30q48aN6wnNN5/X1zHHjx+furq6nseFF17Yl0sBAICyNrzUBQAAALveRRddlOuuuy5LlixJTU3NTo21atWqXh9/HTly5M6WBwAAZcNMdAAAqED19fWprq7OmjVrem1fs2ZNxowZs81zL7vsslx00UX5r//6r0yZMqVn++bz+jpmbW1tr4cQHQCAwWSHQvSWlpZMmDAhNTU1mTFjRm6//faix1511VV5/etfn7333jt77713Zs6cucXxhUIhCxYsyNixYzNq1KjMnDkz999//46UBgAAQ8KIESMyffr0tLa29mzbtGlTWltbc+SRRxY975JLLsn555+fxYsX54gjjui1b+LEiRkzZkyvMbu6unLbbbdtc0wAABjM+hyiX3/99Zk/f36am5tzxx13ZOrUqZk1a1aeeOKJrR6/ZMmSvOtd78qvfvWrLF26NOPHj8+b3/zmPProoz3HXHLJJfna176WhQsX5rbbbssee+yRWbNmZd26dTt+ZQAAMMjNnz8/V111Va699trcc889Oeuss7J27drMnTs3STJnzpx85jOf6Tn+4osvztlnn52rr746EyZMyOrVq7N69eo8++yzSZKqqqp89KMfzQUXXJAf/ehHWbFiRebMmZNx48bl5JNPLsUlAgBAyVUVCoVCX06YMWNGmpqacsUVVyTpnu0yfvz4fOQjH8mnP/3plz1/48aN2XvvvXPFFVdkzpw5KRQKGTduXD72sY/l4x//eJKks7Mzo0ePzjXXXJPTTz99izG6urpSV1eXzs7OXmsvAgBAJejPfvaKK67IpZdemtWrV2fatGn52te+lhkzZiRJjj322EyYMCHXXHNNkmTChAl5+OGHtxijubk555xzTpLuT4k2NzfnW9/6Vp5++ukcffTR+cY3vpFJkyYN6HUAAMCutr39bJ9C9A0bNmT33XfPf/7nf/aaiXLGGWfk6aefzg9/+MOXHeOZZ57JfvvtlxtvvDH/63/9r/z5z3/Oq1/96vz+97/PtGnTeo475phjMm3atHz1q18tenFbu4GR9RcBACh3gyV8HizXAQDA0LS9/WyflnPp6OjIxo0bM3r06F7bR48endWrV2/X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AKD0Ojo6snHjxowePbrX9tGjR2f16tVbPWf16tUve/zxxx+ff//3f09ra2suvvji/PrXv84JJ5yQjRs3Fq2lq6ur12P9+vU7cWUAAIPcokXJqacmK1Z0r9m4YkX3a0F62epTiG62CwAADG6nn356TjrppBx22GE5+eST85Of/CRtbW1ZsmRJ0XPGjx+furq6nseFF1646woGAKg0556bVFUlhUL360Kh+/V555W2Looa3peDtzXb5d57793qOds722X27NmZOHFi/vSnP+Wzn/1sTjjhhCxdujTV1dVF6+nq6ur1euTIkRk5cmRfLgkAoKzU1yc1u23Muhe27IFqdtuY+vrivRFDS319faqrq7NmzZpe29esWZMxY8Zs9ZwxY8b06fgkOeCAA1JfX58HHnggb3zjG7d6zKpVq1JbW9vzWk8OALAN9933YoC+WaGQrFxZmnp4WTt0Y9H+tiOzXRIzXgCAwaehIVn5QHWWXfrLLDvo9CwbcWT386W/zMoHqtPQUOoKKRcjRozI9OnT09ra2rNt06ZNaW1tzZFHHrnVc4488shexyfJz3/+86LHJ8kjjzySp556KmPHji16TG1tba+HEB0AYBsmTeqeef5SVVXJ5MmlqYeX1aeZ6OU02yUx4wUAGJwaGpKGjx+XfPy4UpdCmZs/f37OOOOMHHHEEXnta1+byy+/PGvXrs3cuXOTJHPmzMn+++/fM9nkX/7lX3LMMcfkS1/6Uk488cRcd911+e///u9861vfSpI8++yzOffcc3PqqadmzJgx+dOf/pRPfvKTOfDAAzNr1qySXScAwKDS3Ny9BvrmJV02Pzc3l7oyiujTTPRymu2SmPECAMDQdtppp+Wyyy7LggULMm3atCxfvjyLFy/uWU6xvb09jz/+eM/xRx11VL7//e/nW9/6VqZOnZr//M//zM0335zXvOY1SZLq6urceeedOemkkzJp0qS8733vy/Tp03PLLbfotQEA+svs2clNNyVTpiQ1Nd3PixYlp5xS6soooqpQ+NsFeLbt+uuvzxlnnJFvfvObPbNdbrjhhtx7770ZPXr0FrNdfvvb3+aYY47JRRdd1DPb5Ytf/GLuuOOOvOY1ryk62+WZZ57JihUrttqsd3V1pa6uLp2dnb1mogMAQCUYLP3sYLkOAACGpu3tZ/u0nEvSPdvlySefzIIFC7J69epM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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_theta_c_l0 = files[\"test\"][\"Nominal/h_theta_c_l0_WW\"]\n", + "h_theta_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_theta_c_l0_WW\"]\n", + "\n", + "h_theta_l1_l2 = files[\"test\"][\"Nominal/h_theta_l1_l2_WW\"]\n", + "h_theta_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_theta_l1_l2_WW\"]\n", + "\n", + "values1, edges1 = h_theta_c_l0.to_numpy()\n", + "values2, edges2 = h_theta_c_l0_noCR.to_numpy()\n", + "values3, edges3 = h_theta_l1_l2.to_numpy()\n", + "values4, edges4 = h_theta_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\theta$')\n", + "ax1.set_title(r'$\\theta$: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\theta$')\n", + "ax2.set_title(r'$\\theta$: W2 $\\rightarrow$ $q_1q_2$')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "0d3b9b72-e106-414e-93ff-b791723646db", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwuUlEQVR4nO3dfZzUdb03/tdwu6BB5Sp4wyaVoKjgpSJhpmYUmmWwlJzOudI8pt1gaXTsxswVurE7PVZyMjtXpzpHL83YLDtdmpGaqSWCGKUu2jHXVLT9mWAoojC/PyYW1t3BXdjdmd19Ph+PeYzz+X5n5v0dxpn3vPfzfX8KxWKxGAAAAAAAoJ1BlQ4AAAAAAACqlSI6AAAAAACUoYgOAAAAAABlKKIDAAAAAEAZiugAAAAAAFCGIjoAAAAAAJShiA4AAAAAAGUoogMAAAAAQBmK6AAAAAAAUIYiOkCVe+GFF/L5z38+48ePz8iRI3PUUUdl1apVlQ4LAAAGDDl57zv//PNTKBQqHQZAEkV0gIr5t3/7txQKhUybNq3sPhs3bkx9fX3+9V//Ne973/vy+c9/Pvfcc0/e/va354UXXujS8/3gBz9IoVDIj370o3bbpkyZkkKhkBtvvLHdtrq6uhx++OFJkr/97W9paGjIsccem1e+8pUpFAr57ne/26U4AACgWvTFnHzp0qU544wzsv/++2ennXZKXV1dTjzxREV9gB6kiA5QIZdffnmGDRuWO+64Iw888ECH+3z1q1/NkiVLcvPNN+fTn/50PvrRj+ZrX/taVq1alZtuuqlLz3fEEUckSX7961+3GV+7dm1+//vfZ8iQIbn11lvbbHv44Yfz8MMPt963paUlCxcuzL333pspU6Z06fkBAKDa9MWc/Etf+lIWL16cN73pTfna176W008/Pb/61a9y8MEH5/e//32X4gGgcxTRASrgwQcfzG233ZZzzz03Q4cOzeWXX95unzVr1uQLX/hCzjrrrOy///6t45tnoNx9991des499tgj48ePb5ew33777SkWi3nXu97Vbtvm25sT9t133z2PPfZYHnrooXzlK1/p0vMDAEA16as5+fz58/PQQw/l61//et73vvfl3HPPzS233JIXXnghX/ziF7sUDwCdo4gOUAGXX355Bg8enNNPPz1vfvObO0zYL7/88jz99NM5/fTT24wPHTo0SfL000+3jt13331pbm5+yec94ogjctddd+XZZ59tHbv11luz//7757jjjstvfvObbNq0qc22QqGQ17/+9UmS4cOHZ+zYsV072Ap55JFHcuqpp2aPPfbI8OHDM378+Hzwgx/Mhg0bkpRev7POOit77713hg8fnt122y1vfvObs3z58gpHDgBAb+irOfnhhx+eYcOGtXnMffbZJ/vvv3/uvffeThx573jve9+bvffeu914R73Of/3rX2fq1KmpqanJa17zmnzrW9/qpSgBOkcRHaACLr/88hx55JEZM2ZMTjzxxNx///1ZunRpm30aGxszadKk7LTTTmlpaWm9PPzww0mSnXbaqXXf/fbbLyeddNJLPu8RRxyR559/Pr/97W9bx2699dYcfvjhOfzww7NmzZo2p4Deeuut2XfffbPLLrvs6CF32Wc+85l8+9vf3q77PvrooznssMNy5ZVXZu7cufn617+e97znPbn55pvzzDPPJEk+8IEP5Jvf/GbmzJmTf/u3f8u//Mu/ZMSIEVX1wwMAgJ7Tn3LyYrGYxx9/PLW1tZ0+/s7YkZy8s1auXJm3vOUteeKJJ3L++efnlFNOSUNDQ4d94wEqZUilAwAYaJYtW5b77rsvZ511VpJk1qxZGTZsWC6//PJMnTo1SWnxot/85jdZt25ddt111w4fZ/z48V1+7q17MB599NF54YUX8tvf/jYnn3xyXvOa12TMmDH59a9/ncmTJ+fpp5/OypUr88///M/bd6A7aM2aNXn/+9+foUOH5r3vfW+X7vupT30qq1evzm9/+9sceuihreMLFy5MsVhMkvz3f/93TjvttFx44YWt2z/+8Y93S+wAAFS3/paTX3755XnkkUeycOHCLsezLTuSk3fWeeedl2KxmFtuuSV1dXVJkjlz5uTAAw/skecD2B6K6AC97PLLL8+QIUMyZ86cJMno0aNz7LHH5sorr8yFF16YwYMH549//GPWrVuXj3/843nzm9/c5v7f+c538n//7//N5MmTW8c2F4Zfyn777Zdddtmlta/i3XffnXXr1rX2dDz88MNz66235kMf+lBuv/32bNy4sTXJ727r16/f5vYvf/nLefrpp3Pqqadm2LBh+cd//MdOPe6mTZtyzTXX5O1vf3ubAvpmm08dffnLX57f/va3efTRR7PHHnt0/QAAAOiz+lNOft9992XevHmZPn16Tj755C69Dj2Vk3fWxo0bc/3112fWrFmtBfSk9BrNnDkzP/vZz7r1+QC2l3YuAL1o48aNufLKK3PMMce0OdVy7ty5efzxx7NkyZIkyZ/+9KckydFHH50ZM2a0uTzxxBMZM2ZMJkyY0OXnLxQKOfzww1v7LN56663Zbbfd8trXvjbJloQ9Set1TxTR//a3v2XEiBEvefnud7+bTZs25aSTTsrq1as79dh/+ctfsnbt2hxwwAHb3O/LX/5yfv/732fcuHE57LDDcv755+d//ud/uuPwAACoYv0pJ1+9enWOP/74jB49Oj/84Q8zePDgTsfRkzl5Z/3lL3/Js88+m3322afdtokTJ3brcwHsCDPRAXrRL3/5yzz22GP53Oc+12b8hBNOyIgRI3L55ZfnLW95S9atW5ekbY/FpHQ65S233LJDLVaOOOKIXHvttVm5cmVr78XNDj/88Jx99tl55JFH8utf/zp77LFHXv3qV2/3c5VTU1OT//iP/3jJ/a6//vpceeWVqa+vL3sK7fY68cQT84Y3vCE/+tGP8vOf/zxf+cpX8qUvfSmNjY057rjjuvW5AACoHv0lJ1+zZk2OO+64PPXUU7nlllu6fHZlT+fkL148dLONGzd2+jEAqoUiOkAvuvzyyzN06NDMnj27zfjOO++ct771rfnRj36USy+9NC972cuSlGaHbO173/teNmzYkA9+8IPbHcPWPRhvvfXW1j6QSXLIIYdk+PDhuemmm/Lb3/42b33rW7f7ebZlyJAhL9lT8YYbbsiPfvSjzJo1K1dccUWnZ9XsuuuuGTVqVJvFmMrZfffd86EPfSgf+tCH8sQTT+Tggw/O5z//eUV0AIB+rD/k5OvXr8/b3/72rFq1Kr/4xS8yadKkLsfQkzl5krziFa/IU0891W78oYceav3vXXfdNSNGjMj999/fbr+mpqZOPxdAT9POBaCXPPvss2lsbMyb3/zmvOIVr2i3/cQTT8zTTz+dn/zkJ5k8eXIGDRqUG2+8sXX7n//853z2s5/NSSed1Kb3YlLqg9jc3NypOA499NDU1NS0Lj609ayX4cOH5+CDD86iRYuybt26HuuH3hmf+9znMmPGjFx11VUZMqTzf/MdNGhQZs2alWuvvTZ33nlnu+3FYjEbN27MmjVr2ozvtttu2WOPPfLcc8/tcOwAAFSn/pCTb9y4MXPnzs3tt9+eq6++OtOnT+/KS9Al25uTJ8lrXvOarFmzJr/73e9axx577LH86Ec/ar09ePDgzJw5M9dcc02b1+7ee+/N9ddfv+MHANBNzEQH6CU/+clP8vTTTydJvvjFL7bb/swzzyQpzYyZO3duZs2ala997WsZOXJkRo8enYsvvjh77rlnvvGNb7S773777ZejjjoqN91000vGMWzYsEydOjW33HJLhg8fnkMOOaTN9sMPPzwXXnhhko57L15yySV56qmn8uijjyZJrr322vz5z39Oknz4wx/O6NGjXzKGzvjxj3+cESNGZNiwYV2+7xe+8IX8/Oc/z1FHHZXTTz89++23Xx577LFcffXVrQs47bXXXnnnO9+ZKVOmZOedd84vfvGLLF26tPXYAQDof/pDTv6xj30sP/nJT/L2t789Tz75ZP7rv/6rzfb//b//90s+f2ftSE7+D//wD/nEJz6R2bNn5yMf+UieeeaZfPOb38yECROyfPny1v0WLFiQ6667Lm94wxvyoQ99KC+88EK+8Y1vZP/9929TgAeopEKxs8tHA7BDTjjhhFx77bUvud/QoUPz2GOPZdCgQXnf+96X66+/PjvvvHNOPPHEfP7zn289rXRrhUKh0wl7kpxzzjm54IIL2ixatNmPfvSj1NfX52Uve1n++te/tjtlc++9925zCubWHnzwwey9996diqGnNTc35zOf+Uz+3//7f1m7dm323HPPHHfccbnooouSJOeee25+/vOf53/+53+yadOmvPa1r8373//+HTotFwCA6tYfcvKjjz46N998c9nHraYyzw033JD58+dn1apVGT9+fD7zmc/k/vvvz4IFC9rE+atf/Srz58/PypUrs9dee+XjH/94HnvssXb7AVSKIjoAAAAAAJShJzoAAAAAAJShiA4AAAAAAGUoogMAAAAAQBmK6AAAAAAAUIYiOgAAAAAAlKGIDgAAAAAAZQypdACVtmnTpjz66KN52ctelkKhUOlwAADo54rFYp5++um87GUvy6hRo+SgW5GbAwDQmzbn5nvssUcGDSo/33zAF9EfffTRjBs3rtJhAAAwAK1ZsyajRo2qdBhVQ24OAEAlPPzww9lrr73Kbh/wRfSXvexlSUovlB8wAAD0tLVr12bcuHF5+OGHW3NRSuTmAAD0ps25+Uvl5QO+iL75NNFRo0ZJ1AEA6DVaubQnNwcAoBJeKi+3sCgAAAAAAJShiA4AAAAAAGUoogMAAAAAQBkDvic6AMBAtGnTpmzYsKHSYfRbQ4cOzeDBgysdBgAAfcDGjRvz/PPPVzqMfqm78nJFdACAAWbDhg158MEHs2nTpkqH0q+9/OUvz9ixYy0eCgBAh4rFYlavXp2nnnqq0qH0a92RlyuiAwAMIMViMY899lgGDx6ccePGZdAg3f26W7FYzDPPPJMnnngiSbL77rtXOCIAAKrR5gL6brvtlpEjR5p80c26My9XRAcAGEBeeOGFPPPMM9ljjz0ycuTISofTb40YMSJJ8sQTT2S33XbT2gUAgDY2btzYWkDfZZddKh1Ov9VdebmpRwAAA8jGjRuTJMOGDatwJP3f5j9S6G8JAMCLbc4RTWzped2RlyuiAwAMQE4V7XleYwAAXoqcsed1x2usiA4AAAAAAGUoogMAAAAAQBmK6AAA9Es333xzxo0bV3Z7sVjMZZddlmnTpmXnnXfOy1/+8hx66KG5+OKL88wzzyRJzj///BQKhRQKhQwePDjjxo3L6aefnieffLK3DgMAAPq8vp6bK6IDANAv/fjHP87b3/72stvf85735Kyzzso73vGO3HjjjVmxYkU+85nP5Mc//nF+/vOft+63//7757HHHktzc3P+4z/+I9ddd10++MEP9sYhAABAv9DXc3NFdAAAuq6xMZkyJRkxonTd2NhjT/XTn/40L3/5y7Nx48YkyYoVK1IoFPLJT36ydZ/3ve99+d//+3+3ud9PfvKTnHDCCR0+5g9+8INcfvnl+b//9//mnHPOydSpU7P33nvnHe94R375y1/mjW98Y+u+Q4YMydixY7PnnntmxowZede73pUbbrihB44UAAC2g9y8B460LUV0AAC6prExmTMnWbkyWb++dD1nTo8l6294wxvy9NNP56677kpSOhW0trY2N910U+s+N998c44++ujW23/4wx/yxBNP5JhjjunwMS+//PJMnDgx73jHO9ptKxQKGT16dIf3+9Of/pTrr78+w4YN2/4DAgCA7iI375XcXBEdAICuWbAgKRSSYrF0u1gs3V64sEeebvTo0TnooINaE/ObbropH/3oR3PXXXflb3/7Wx555JE88MADOeqoo1rv8+Mf/zgzZ84sm1Dff//9mThxYqeef+XKldl5550zYsSIjB8/Pn/4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GGi5uZnoAH+3ecHSZV/5ZZa9dm6WDZteuv7KL6uqp93m/nuHHNL+MnFi31yBG2BH7bfffnn44Yfz8MMPt47dc889eeqppzJp0qQO7/POd74zw4YNy5e//OUOt7948aKtzZs3L7///e/zox/9aIfirjaLFi3K3nvvnZqamkybNi133HHHNve/+uqrs++++6ampiYHHnhgfvazn7XZ/re//S1nnHFG9tprr4wYMSKTJk0ygx+AsvzWgf6hP+bmiugAW6m7szEHn/2mHPzHq3Pwht+Urs9+U+rubKx0aK06038PoKdsPmunI5U8a2fGjBk58MAD80//9E9Zvnx57rjjjpx00kk56qijcuihh3Z4n3HjxuVf//Vf87WvfS2nnnpqbr755jz00EO59dZb8/73vz+f/exnyz7fyJEjc9ppp6WhoSHFYrGnDqtXXXXVVZk/f34aGhqyfPnyTJkyJTNnzmw9LffFbrvttrz73e/OqaeemrvuuiuzZs3KrFmz8vvf/751n/nz5+e6667Lf/3Xf+Xee+/NWWedlTPOOCM/+clPeuuwAOhD/NaBrpGbl/RGbq6IDvSOxsZkypRkxIjSdWP1FKXbWLAgKRSSzR+6xWLp9sKFlY0LoEq0nrWzrP2lkmftFAqF/PjHP84rXvGKHHnkkZkxY0Ze/epX56qrrtrm/T70oQ/l5z//eR555JHMnj07++67b973vvdl1KhR+Zd/+Zdt3veMM87Ivffem6uvvro7D6ViLrroopx22mk55ZRTWmeMjxw5Mt/5znc63P9rX/tajj322Jx99tnZb7/98tnPfjYHH3xwLrnkktZ9brvttpx88sk5+uijs/fee+f000/PlClTXnKGOwBUs2otXDLwyM236OncvFDsL1NnttPatWszevTorFmzJqNGjap0OFAdGhtLxeRVq5IJE5KGhqS+fsceb86cLcXpzdeLF+/Y4/aEESPKN0V/9tnej6cDy5eXTmcsZ9my5OCDey8eoG9Zv359HnzwwYwfPz415X790S3KvdbVmH9u2LAhI0eOzA9/+MPMmjWrdfzkk0/OU089lR//+Mft7lNXV5f58+fnrLPOah1raGjINddck7vvvjtJcvrpp+euu+7KNddckz322CM33XRTTjjhhPz3f/93jjzyyHaPufm1efjhh9u8NsOHD8/w4cO774ABqEp96beO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nDkzTU1N2W233drtv7nv4gUXXJC3ve1tueKKKzJr1qwsX748BxxwQJItfRdPPfXULFiwIKNGjcof/vAHfRcBAKAXbdq0KUnyjne8Ix/96EeTJAcddFBuu+22XHrppTnqqKPK3vfhhx9uczrt8OHDezZYAADYhorORL/oooty2mmn5ZRTTsmkSZNy6aWXZuTIkfnOd77T4f5f+9rXcuyxx+bss8/Ofvvtl89+9rM5+OCDW/s2JsmnP/3pvPWtb82Xv/zl/K//9b/ymte8JieccEKHRXkAACCpra3N4MGD8/jjj7cZf/zxxzN27NgO7zN27Nht7l9bW5shQ4Zk0qRJbfbZb7/9XvIs0VGjRrW5KKIDAFBJFSui67sIAADVYdiwYTnkkEOyZMmS1rFNmzZlyZIlmT59eof3mT59epv9k+SGG25o3X/YsGGZOnVqmpqa2uyzatWqvOpVr+rmIwAAgJ5TsSK6vosAAFA95s+fn29/+9v53ve+l3vvvTcf/OAHs27dupxyyilJkpNOOimf+tSnWvc/88wzc9111+XCCy/Mfffdl/PPPz933nlnzjjjjNZ9zj777Fx11VX59re/nQceeCCXXHJJrr322nzoQx/q9eMDAIDtVdGe6N1N30UAANg+c+fOzV/+8pecd955Wb16dQ466KBcd911rZNYmpubM2jQljk4hx9+eK644oqce+65Oeecc7LPPvvkmmuuaV2rKElmz56dSy+9NBdccEE+8pGPZOLEiVm8eHGOOOKIXj8+AADYXhUrovd238Vf//rX24xnc79FAAAYqM4444w2M8m3dtNNN7Ube9e73pV3vetd23zMf/7nf84///M/d0d4ANWpsTFZsCBZtSqZMCFpaEjq6ysdFQDdqGLtXPRdBAAAAPq0xsZkzpxk5cpk/frS9Zw5pXEA+o2KtnOZP39+Tj755Bx66KE57LDDcvHFF7fru7jnnnu29ic/88wzc9RRR+XCCy/M8ccfnyuvvDJ33nlnLrvsstbHPPvsszN37twceeSReeMb35jrrrsu1157bYczZwAAAAC224IFSaGQFIul28Vi6fbChWajA/QjFS2i67sIAAAA9FmrVm0poG9WLCYvOkMegL6tUCy++NN+YFm7dm1Gjx6dNWvW6IkOAECPk3+W57UB+pwpU0otXLYurRQKyeTJyYoVFQsLgM7pbP5Z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NQkA6G7dmZtfddVVmT9/fi699NJMmzYtF198cWbOnJmmpqbstttu7fa/7bbb8u53vzsXXHBB3va2t+WKK67IrFmzsnz58nbP/aMf/Si/+c1vsscee+zQ8QIAQCV0eSZ6khx33HGpr6/Prbfemubm5nzpS1/aoQK6GS8AALB9uis3v+iii3LaaafllFNOyaRJk3LppZdm5MiR+c53vtPh/l/72tdy7LHH5uyzz85+++2Xz372szn44INzySWXtNnvkUceyYc//OFcfvnlGTp06HYdIwAAVFKXi+h//OMfM3369Pz0pz/N9ddfn49//OM54YQT8vGPfzzPP/98lwPYPOOloaEhy5cvz5QpUzJz5sw88cQTHe6/ecbLqaeemrvuuiuzZs3KrFmz8vvf/77dvma8AADQn3VXbr5hw4YsW7YsM2bMaB0bNGhQZsyYkdtvv73D+9x+++1t9k+SmTNnttl/06ZNec973pOzzz47+++/f6fjWbt2bZvLc8891+n7AgBAd+tyEf2ggw7K+PHjc/fdd+fNb35zPve5z+XGG29MY2NjDjvssC4HYMYLAABsn+7KzVtaWrJx48aMGTOmzfiYMWOyevXqDu+zevXql9z/S1/6UoYMGZKPfOQjXTiqZNy4cRk9enTr5YILLujS/YG+rbY2qanpeFtNTWk7APSm7eqJ/p73vKfN2OGHH5677rorZ511Vpcea/OMl0996lOtY52Z8TJ//vw2YzNnzsw111zTent7Z7wAAEBf0p25eXdbtmxZvva1r2X58uUpFApduu/DDz+cUaNGtd4ePnx4d4cHVLG6uqSpKWlpab+tttZaUwD0vi4X0V+cpG+20047Zfbs2V16rG3NeLnvvvs6vE9PzXhZu3Ztm9vDhw+XrAMAUNW6Kzevra3N4MGD8/jjj7cZf/zxxzN27NgO7zN27Nht7n/LLbfkiSeeSN1W1a6NGzfmYx/7WC6++OL86U9/KhvPqFGj2hTRgYGnrk6xHIDqsV0Li27tgQceyDnnnJO99tqry0X0nrB5xst3v/vdLs14ccooAAB93fbm5sOGDcshhxySJUuWtI5t2rQpS5YsyfTp0zu8z/Tp09vsnyQ33HBD6/7vec978rvf/S4rVqxoveyxxx45++yzc/3112/H0QEAQGV0eSZ6kjz77LO5+uqr8+///u+59dZb84Y3vCHnnXdel4vo1TTjxSmjAAD0Rd2Vm8+fPz8nn3xyDj300Bx22GG5+OKLs27dupxyyilJkpNOOil77rln62STM888M0cddVQuvPDCHH/88bnyyitz55135rLLLkuS7LLLLtlll13aPMfQoUMzduzYTJw4sRuOHAAAekeXZqIvXbo073//+zN27NhcfPHFecc73pFCoZB/+7d/ywc+8IF2bVZeSjXNeNl8yujmiyI6AADVrLtz87lz5+arX/1qzjvvvBx00EFZsWJFrrvuutbHaW5uzmOPPda6/+GHH54rrrgil112WaZMmZIf/vCHueaaa3LAAQd063ECA1hjYzJlSjJiROm6sbHSEQEwQBWKxWKxMztOnjw5a9euzT/+4z/mn/7pn1oX7Bw6dGjuvvvuTJo0absCuOqqq3LyySfnW9/6VuuMlx/84Ae57777MmbMmHYzXm677bYcddRR+eIXv9g64+ULX/hCli9fXjZh33vvvXPWWWd1uLjS2rVrM3r06KxZs0bfRQAAelx35J89lZtXmtwcaNXYmMyZkxQKSbG45Xrx4qS+vtLRAdBPdDb/7PRM9Kamphx55JF54xvf2K1JuRkvAADQNT2VmwNUjQULthTOky2F9IULKxsXAANSp2eiP/LII/nud7+b//iP/8izzz6bd7/73fmnf/qnTJs2LStWrOizybvZLgAA9KbuyD/l5kC/N2JEsn59+/GamuTZZ3s/HgD6pW6fib7nnnvm05/+dB544IH853/+Z1avXp3Xv/71eeGFF/Ld7343q1at6pbAAQCAbZObA/3ehAmlmedbKxQSCxMDUAFdWlh0s2OOOSb/9V//lcceeyyXXHJJfvnLX2bffffN5MmTuzs+AABgG+TmQL/U0LClhUuypbVLQ0Nl4wJgQNquIvpmo0ePzoc+9KHceeedWb58eY4++uhuCgsA+rbm5mT58vaX5uZKRwb0V3JzoF+pry8tIjp5cqmFy+TJpcVGZ8+udGQADECd7oneX+m7CEB3a24unWlcro1nU1NSV9f7cQHVQf5ZntcGAIDe1O090QGAzmlp6biAnpTGW1p6Nx4AAABg+ymiAwAAAABAGYroAAAAAABQRpeL6N///vfz3HPPtRvfsGFDvv/973dLUAAAwEuTmwMAQM/rchH9lFNOyZo1a9qNP/300znllFO6JSgAAOClyc0BAKDndbmIXiwWUygU2o3/+c9/zujRo7slKADoy2prk5pC+5mhSWm8traXAwL6Lbk5AAD0vCGd3fF//a//lUKhkEKhkDe96U0ZMmTLXTdu3JgHH3wwxx57bI8ECQB9SV1d0vTNX6blA59OUkhSbL2uvfQLqavzfQnsGLk5AAD0nk4X0WfNmpUkWbFiRWbOnJmdd965dduwYcOy9957Z86cOd0eIAD0RXXvPy51uz6bLFyYNDUlEycmDQ3JbEUtYMfJzQEAoPcUisVisSt3+N73vpe5c+empqamp2LqVWvXrs3o0aOzZs2ajBo1qtLhAADQz3Vn/ik3BwCA7dfZ/LPLPdFPPvnkrF+/Pv/+7/+eT33qU3nyySeTJMuXL88jjzyy/REDAABdIjcHAICe1+l2Lpv97ne/y4wZMzJ69Oj86U9/ymmnnZZXvvKVaWxsTHNzc77//e/3RJwAAMCLyM0BAKDndXkm+kc/+tG8973vzf3339/mtNG3vvWt+dWvftWtwQEAAOXJzQEAoOd1eSb6nXfemcsuu6zd+J577pnVq1d3S1AAAMBLk5sDAEDP6/JM9OHDh2ft2rXtxletWpVdd921W4ICAABemtwcAAB6XpeL6CeccEIWLlyY559/PklSKBTS3NycT3ziE5kzZ063BwgAAHSsv+bmU6dOzaRJk7Jo0aJKhwIAACkUi8ViV+6wZs2avPOd78ydd96Zp59+OnvssUdWr16d6dOn52c/+1l22mmnnoq1R6xduzajR4/OmjVrMmrUqEqHAwBAP9ed+afcHAAAtl9n888u90QfPXp0brjhhtx66625++6787e//S0HH3xwZsyYsUMBAwAAXSM3BwCAntflmej9zea/NkyYMCGDBw/OvHnzMm/evEqHBQBAP2W2dXleGwAAelNn889O90S//fbb89Of/rTN2Pe///2MHz8+u+22W04//fQ899xz2x9xhS1dujT33HOPAjoAAFWvv+fmAABQTTpdRF+4cGH+8Ic/tN5euXJlTj311MyYMSOf/OQnc+211+aCCy7okSABAIAt5OYAANB7Ol1EX7FiRd70pje13r7yyiszbdq0fPvb3878+fPz9a9/PT/4wQ96JEgAAGALuTkAAPSeThfR//rXv2bMmDGtt2+++eYcd9xxrbenTp2ahx9+uHujAwAA2pGbAwBA7+l0EX3MmDF58MEH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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_theta_cs = files[\"test\"][\"Nominal/h_delta_theta_truth_cs_WW\"]\n", + "h_delta_theta_cs_noCR = files[\"test_noCR\"][\"Nominal/h_delta_theta_truth_cs_WW\"]\n", + "\n", + "h_delta_theta_ud = files[\"test\"][\"Nominal/h_delta_theta_truth_ud_WW\"]\n", + "h_delta_theta_ud_noCR = files[\"test_noCR\"][\"Nominal/h_delta_theta_truth_ud_WW\"]\n", + "\n", + "values1, edges1 = h_delta_theta_cs.to_numpy()\n", + "values2, edges2 = h_delta_theta_cs_noCR.to_numpy()\n", + "values3, edges3 = h_delta_theta_ud.to_numpy()\n", + "values4, edges4 = h_delta_theta_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\theta$')\n", + "ax1.set_ylabel(r'Set Axis Label')\n", + "ax1.set_title(r'$\\Delta\\theta$: W1 $\\rightarrow$ cs')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\theta$')\n", + "ax2.set_ylabel(r'Set Axis Label')\n", + "ax2.set_title(r'$\\Delta\\theta$: W2 $\\rightarrow$ ud')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "c2772afa-8a76-46c0-b561-971f6d1f21f3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABt/ElEQVR4nO3df3iddX0//mf68xQwVQm0gA2wjQYKtL0oobbzQ5FPt6JMoOm0Y1MYOtGt4I/6YSoDQusP1PmjTLpV5uVHt8EX5NuAwPyirAIDqVJa0SqQolOCQAuZly0UAtie7x9nSQlJStMmOeckj8d1nev03Pd9Tl53cq6Td5953693TbFYLAYAAAAAAOhhVLkLAAAAAACASiVEBwAAAACAPgjRAQAAAACgD0J0AAAAAADogxAdAAAAAAD6IEQHAAAAAIA+CNEBAAAAAKAPQnQAAAAAAOiDEB0AAAAAAPogRAcAAAAAgD4I0QEAAAAAoA9CdIAh8Lvf/S6f+tSncuSRR2a//fbLvHnzsmnTpnKXBQAAw5pxOAADQYgOsA/+8R//MTU1NZk9e3afx+zYsSNNTU350pe+lL/6q7/Kpz71qTz44IN529velt/97nf9+nrf/OY3U1NTkxtvvLHHvhkzZqSmpiZ33HFHj3319fWZO3dukuTZZ59Nc3NzTjvttLz+9a9PTU1Nvv71r/erDgAAKKdqHIevW7cuF1xwQY499tjsv//+qa+vzzve8Q6hPkAVEKID7INrrrkm48aNy3333Zef//znvR7z+c9/PmvWrMldd92Vv/u7v8uHP/zhXHnlldm0aVPuvPPOfn29N73pTUmSe+65p9v2bdu25ac//WnGjBmT73//+932PfbYY3nssce6ntve3p7ly5fnoYceyowZM/r19QEAoBJU4zj8s5/9bFavXp3//b//d6688sqcf/75+c///M+ccMIJ+elPf9qvegAYWkJ0gL30y1/+Mvfee28uueSSjB07Ntdcc02PY7Zu3ZpPf/rT+dCHPpRjjz22a3vnbJQf//jH/fqahx56aI488sgeg/e1a9emWCzm7W9/e499nY87B++HHHJInnzyyTz66KP5+7//+359fQAAKLdqHYcvXbo0jz76aP7hH/4hf/VXf5VLLrkkd999d373u9/lM5/5TL/qAWBoCdEB9tI111yT0aNH5/zzz88f/dEf9Tp4v+aaa/LMM8/k/PPP77Z97NixSZJnnnmma9vDDz+ctra2V/26b3rTm/KjH/0ozz//fNe273//+zn22GPzlre8JT/4wQ+yc+fObvtqamryh3/4h0mS8ePHZ/Lkyf072TJav359/vRP/zQHH3xwCoVCjj766CxfvrzbMdddd11mzpyZQqGQhoaG3HTTTTn77LO7/YcJAIDhoVrH4XPnzs24ceO6veZRRx2VY489Ng899NAenPnQGqgxtrE6MBwI0QH20jXXXJOTTz45kyZNyjve8Y488sgjWbduXbdjWlpaMm3atOy///5pb2/vuj322GNJkv3337/r2GOOOSbnnHPOq37dN73pTXnppZfywx/+sGvb97///cydOzdz587N1q1bu10O+v3vfz9HH310DjzwwH095X679NJL88///M97/fwbb7wxc+fOzc9+9rNcdNFF+dKXvpS5c+fm3nvv7TrmS1/6Us4+++z8/u//fr785S9nwYIFede73pUf/vCHOe644wbiNAAAqCDDaRxeLBazZcuW1NXV7fH574l9HYcP1BjbWB0YLsaUuwCAarR+/fo8/PDD+dCHPpQkOeusszJu3Lhcc801aWxsTFJayOgHP/hBtm/fnoMOOqjX1znyyCP7/bVf3o/xlFNOye9+97v88Ic/zLnnnpvf//3fz6RJk3LPPfdk+vTpeeaZZ7Jx48a8+93v3rsT3Udbt27N+973vowdOzZ/+Zd/2a/nbtq0Ke985ztz+umn59prr02hUEiS/PVf/3VeeOGFJMnGjRvz0Y9+NJdeemm32ekvvfRSVq1alfPOO2/AzgUAgPIbbuPwa665Jo8//niPKy331b6MwwdqjG2sDgwnZqID7IVrrrkmY8aMyaJFi5IkEydOzGmnnZbrrrsuO3bsSJL84he/yPbt2/O3f/u3uf3227vdzj777CTJ9OnTu16zWCzu0QJHxxxzTA488MCuHos//vGPs3379q7+jnPnzu1a1Gjt2rXZsWNH14B/oHV0dOz29rnPfS7nnntu3vOe9+Taa6/t12tfdtllKRQK+frXv94VoHcaP358kuSKK67I6173ulx88cXd9nee7/HHH78PZwcAQKUZTuPwhx9+OEuWLMmcOXNy7rnn9uv7MJjj8IEaYxurA8OJEB2gn3bs2JHrrrsup556arfLLhcvXpwtW7ZkzZo1SZJf/epXSZJTTjkl8+fP73Z76qmnMmnSpEydOrXfX7+mpiZz587t6rn4/e9/PwcffHD+4A/+IEn3wXvn/WCE6M8++2wmTJjwqrevf/3r2blzZ84555xs3rx5j177hRdeyC233JJ3vvOdqa2t7fWYF198MTfffHPOOeecHiH7s88+myTdLhF9+umnc/rpp2f//fdPQ0ND188JAIDqMJzG4Zs3b87pp5+eiRMn5v/9f//fjB49eo/rGMxxeH/G2P/0T/+UE044IWPHjs3ll1++16/zwgsv5N3vfnfq6+tTW1ubN77xjVm7du0efz8AhoJ2LgD99L3vfS9PPvlkPvnJT3bbfsYZZ2TChAm55ppr8sd//MfZvn17ku79FpPSpZV33333PrVYedOb3pRbbrklGzdu7OrD2Gnu3Lm56KKL8vjjj+eee+7JoYcemt/7vd/b66/Vl0KhkP/7f//vqx73ne98J9ddd12ampr6vJz2lf7rv/4rzz33XGbNmtXnMZ0zjGbOnNlj36ZNm7Lffvt1O+8lS5Zk8uTJefrpp/Mf//EfXf0zX//61+9RTQAAlNdwGYdv3bo1b3nLW/Lb3/42d999dw499NB+1TCY4/D+jLEPOeSQXH755b3OdO/P6/zud7/LEUcckXvuuSdveMMb8s1vfjNve9vb8qtf/SoHHHDAHtUNMNiE6AD9dM0112Ts2LFZuHBht+0HHHBA3vrWt+bGG2/MqlWr8prXvCbJrpkWnb7xjW/kxRdfzF//9V/vdQ0v78f4/e9/v6snZJLMmjUr48ePz5133pkf/vCHeetb37rXX2d3xowZ86r9FW+//fbceOONOeuss3Lttdfu8Qyb559/Pklptk9fnnvuuT63/9u//VuOOeaYjBpVuuDq2WefzU033ZT/+q//yn777Zczzjgjxx9/fL71rW/pxQgAUCWGwzi8o6Mjb3vb27Jp06b8x3/8R6ZNm9bvGgZzHN6fMfZZZ52VJPn2t7+9T6+z//7757LLLus65s/+7M+ydOnStLa27nZSDcBQ0s4FoB+ef/75tLS05I/+6I/yute9rsf+d7zjHXnmmWdy8803Z/r06Rk1alTuuOOOrv2//vWv84lPfCLnnHNOtz6MSaknYltb2x7VceKJJ6ZQKHQtRPTyGTDjx4/PCSeckJUrV2b79u2D1g99T3zyk5/M/Pnzc/3112fMmD3/u23nJbH/8R//0WPfSy+9lCSpr69PsutS2U7Nzc156qmnuvVYfOSRR3LAAQfkDW94Q9e2448/Pj/72c/2/GQAACib4TAO37FjRxYvXpy1a9fmhhtuyJw5c/rzLeiXvR2H92eMPViv88gjj+Q3v/lN1/8JACqBmegA/XDzzTfnmWeeSZJ85jOf6bG/c8bFNddck8WLF+ess87KlVdemf322y8TJ07MihUrcthhh+XLX/5yj+cec8wxmTdv3h4tajRu3Lg0Njbm7rvvzvjx43vM0Jg7d26+8IUvJOm9D+NVV12V3/72t3niiSeSJLfcckt+/etfJ0kuvPDCTJw48VVr2BPf+ta3MmHChIwbN65fz6utrc1f/uVf5utf/3peeOGFnHLKKXnmmWdyxx135PTTT8+SJUty0EEH5Y//+I9z9dVXZ/z48TnmmGNyyy235LHHHkvSvR/6s88+26O3em1tbf77v/97308SAIBBNxzG4R/5yEdy8803521ve1t+85vf5N/+7d+67X/nO9/5ql9/T+3tOLw/Y+zBeJ3nn38+73znO/Pxj398wP5PAjAgigDssbe97W3FJK96Gzt2bLG9vb34m9/8ptjU1FTcf//9i5MmTSpeeOGFxW3btvX62kmK8+bN2+NaPv7xjxeTFOfOndtjX0tLSzFJ8TWveU3xd7/7XY/9hx9+eJ+1//KXv9zjGgbT9u3bi3/3d39XPOqoo4rjx48vHnLIIcVFixYVf/7zn3cd8+STTxbf9ra3FV/zmtcUDzvssOJHP/rR4i233FJMUrztttu6jtuwYUPxda97XbfXv+CCC4of+chHhux8AADYe8NhHD5v3rzd1l4p9nSM3el973tfsbm5eZ9f58UXXyyefvrpxT//8z8v7ty5czBODWCv1RSLxeLgRfQAMLT+4R/+IR/84Afz+OOPdy3S9Oyzz+b1r399fvnLX+awww5Lkrz5zW/OOeecoyc6AAC8it7G2J3e//73Z/Lkybn88sv3+nV27tyZP//zP8/27dtz44039qsFDcBQ0BMdgGHlwQcfzOtf//pug/IDDjggZ555Zpqbm/P888/n1ltvzU9+8pOceeaZZawUAACqQ29j7N/97nfp6OjIjh07uv27v6+TJO973/vy5JNP5oYbbhCgAxVJiA7AsPLggw/m2GOP7bH9H//xH/PEE0/kwAMPzNKlS3P99dfn9a9/fRkqBACA6tLbGPuTn/xkJkyYkK9+9av51Kc+lQkTJuRf//Vf+/06jz76aL761a/mvvvuS11dXQ444IAccMABufvuuwf8PAD2lnYuAAwrBx10UN7+9rfnH//xH8tdCgAADAsDNcY2VgeqlRAdAAAAAAD6oJ0LAAAAAAD0QYgOAAAAAAB9qMolj3fu3Jknnngir3nNa1JTU1PucgAAoF+KxWKeeeaZHHrooRk1qnrntRiXAwBQzfZ0XF6VIfoTTzyRKVOmlLsMAADYJ4899lje8IY3lLuMvWZcDgDAcPBq4/KqDNFf85rXJCmdXG1tbZmrAQCA/tm2bVumTJnSNa6tVsblAABUsz0dl1dliN55qWhtba3BOgAAVavaW6AYlwMAMBy82ri8ehswAgAAAADAIBOiAwAA+6SxsTHTpk3LypUry10KAAAMuKps5wIAAFSOdevWaecCAMCwJUQHABiBdu7cmRdffLHcZQxbY8eOzejRo8tdBgAAVWDHjh156aWXyl3GsDRQ43IhOgDACPPiiy/ml7/8ZXbu3FnuUoa11772tZk8eXLVLx4KAMDgKBaL2bx5c37729+Wu5RhbSDG5UJ0AIARpFgs5sknn8zo0aMzZcqUjBpliZyBViwW89xzz+Wpp55KkhxyyCFlrggAgErUGaAffPDB2W+//Uy+GGADOS4XogMAjCC/+93v8txzz+XQQw/NfvvtV+5yhq0JEyYkSZ566qkcfPDBWrsAANDNjh07ugL0Aw88sNzlDFsDNS439QgAYATZsWNHkmTcuHFlrmT46/wjhf6WAAC8UucY0cSWwTcQ43IhOgDACORS0cHnewwAwKsxZhx8A/E9FqIDAAAAAEAfhOgAAAAAANAHIToAAMPSXXfdlSlTpvS5v1gs5uqrr87s2bNzwAEH5LWvfW1OPPHErFixIs8991yS5PLLL09NTU1qamoyevToTJkyJeeff35+85vfDNVpAABA1av2sbkQHQCAYelb3/pW3va2t/W5/13velc+9KEP5cwzz8wdd9yRBx54IJdeemm+9a1v5bvf/W7Xcccee2yefPLJtLW15f/+3/+b2267LX/91389FKcAAADDQrWPzYXoAAD0X0tLMmNGMmFC6b6lZdC+1K233prXvva12bFjR5LkgQceSE1NTT72sY91HfNXf/VX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LwIAQNm1tSUbNvS8tbWVuzIAeHX97ol+/fXXZ+nSpVm1alVmz56dFStWZMGCBWltbc3BBx/c4/h77703Z599dq644or8yZ/8Sa699tqcddZZ2bBhQ4477rhux9544435wQ9+kEMPPXTvzwjglfReBACAsmlrK3VT7Ojoua9QKC1XVF8/9HUBwJ7q90z0L37xi3nve9+b8847L9OmTcuqVauy33775Wtf+1qvx1955ZU57bTTctFFF+WYY47JJz7xiZxwwgm56qqruh33+OOP58ILL8w111yTsWPH7t3ZAAAAABWlvb33AD0pbW9vH9p6AKC/+hWiv/jii1m/fn3mz5+/6wVGjcr8+fOzdu3aXp+zdu3abscnyYIFC7odv3PnzrzrXe/KRRddlGOPPbY/JQEAAAAAwKDpVzuX9vb27NixI5MmTeq2fdKkSXn44Yd7fc7mzZt7PX7z5s1djz/72c9mzJgx+cAHPtCfcrJt27Zuj8ePH5/x48f36zUAAAAAAKAve7Ww6EBav359rrzyynz9619PTU1Nv547ZcqUTJw4set2xRVXDFKVAABQmVauXJkjjjgihUIhs2fPzn333bfb42+44YYcffTRKRQKOf744/Ptb3+7z2Pf//73p6amJitWrBjgqgEAoHr0K0Svq6vL6NGjs2XLlm7bt2zZksmTJ/f6nMmTJ+/2+LvvvjtPPfVU6uvrM2bMmIwZMyaPPvpoPvKRj+SII47YbT2PPfZYtm7d2nX7+Mc/3p/TAQCAqnb99ddn6dKlaW5uzoYNGzJjxowsWLAgTz31VK/H33vvvTn77LPznve8Jz/60Y9y1lln5ayzzspPf/rTHsfeeOON+cEPfpBDDz10sE8DAAAqWr9C9HHjxmXWrFlZs2ZN17adO3dmzZo1mTNnTq/PmTNnTrfjk+T222/vOv5d73pXfvKTn+SBBx7ouh166KG56KKL8p3vfGe39dTW1na7aeUCAMBI8sUvfjHvfe97c95552XatGlZtWpV9ttvv3zta1/r9fgrr7wyp512Wi666KIcc8wx+cQnPpETTjghV111VbfjHn/88Vx44YW55pprMnbs2KE4FWAYq6tLCoXe9xUKpf0AUMn61RM9SZYuXZpzzz03J554Yk466aSsWLEi27dvz3nnnZckOeecc3LYYYd1tVb54Ac/mHnz5uULX/hCTj/99Fx33XW5//77c/XVVydJDjzwwBx44IHdvsbYsWMzefLkNDQ07Ov5AQDAsPTiiy9m/fr13a7GHDVqVObPn5+1a9f2+py1a9dm6dKl3bYtWLAgN910U9fjnTt35l3velcuuuiiHHvssXtUi7WKgN2pr09aW5P29p776upK+wGgkvU7RF+8eHGefvrpXHbZZdm8eXNmzpyZ2267rWvx0La2towatWuC+9y5c3PttdfmkksuycUXX5yjjjoqN910U4477riBOwsAABhh2tvbs2PHjq5xeKdJkybl4Ycf7vU5mzdv7vX4zZs3dz3+7Gc/mzFjxuQDH/jAHtcyZcqUbo+bm5tz+eWX7/HzgeGvvl5YDkD16neIniQXXHBBLrjggl733XnnnT22vf3tb8/b3/72PX79X/3qV3tTFlDF2trMTAGAclu/fn2uvPLKbNiwITU1NXv8vMceeyy1tbVdj81CBwBgONmrEB1gILW1JQ0NSUdHz32FQunST0E6AHRXV1eX0aNHZ8uWLd22b9myJZMnT+71OZMnT97t8XfffXeeeuqp1L/sF++OHTvykY98JCtWrOhzskvnGkUAADAc9WthUYDB0N7ee4CelLb3NkMdAEa6cePGZdasWVmzZk3Xtp07d2bNmjWZM2dOr8+ZM2dOt+OT5Pbbb+86/l3veld+8pOf5IEHHui6HXroobnooovyne98Z/BOBgAAKpiZ6AAAUKWWLl2ac889NyeeeGJOOumkrFixItu3b895552XJDnnnHNy2GGH5YorrkiSfPCDH8y8efPyhS98Iaeffnquu+663H///bn66quTJAceeGAOPPDAbl9j7NixmTx5choaGob25AAAoEII0QEAoEotXrw4Tz/9dC677LJs3rw5M2fOzG233da1eGhbW1tGjdp18encuXNz7bXX5pJLLsnFF1+co446KjfddFOOO+64cp0CAABUvJpisVgsdxH9tW3btkycODFbt27VexGGgQ0bklmz+t6/fn1ywglDVw8ADLbhMp4dLucBAMDItKfjWT3RAQAAAACgD0J0oOzq6pJCofd9hUJpPwAAAACUg57oQNnV1yetrUl7e899dXWl/QAAAABQDkJ0oCLU1wvLAQAAAKg82rkAAAAAAEAfhOgAAAAAANAHIToAAAAAAPRBiA4AAAAAAH0QogMAAAAAQB+E6AAAAAAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_theta_c_l0 = files[\"test\"][\"Nominal/h_delta_theta_c_l0_WW\"]\n", + "h_delta_theta_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_delta_theta_c_l0_WW\"]\n", + "\n", + "h_delta_theta_l1_l2 = files[\"test\"][\"Nominal/h_delta_theta_l1_l2_WW\"]\n", + "h_delta_theta_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_delta_theta_l1_l2_WW\"]\n", + "\n", + "values1, edges1 = h_delta_theta_c_l0.to_numpy()\n", + "values2, edges2 = h_delta_theta_c_l0_noCR.to_numpy()\n", + "values3, edges3 = h_delta_theta_l1_l2.to_numpy()\n", + "values4, edges4 = h_delta_theta_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\theta$')\n", + "ax1.set_title(r'$\\Delta\\theta$: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\theta$')\n", + "ax2.set_title(r'$\\Delta\\theta$: W2 $\\rightarrow$ $q_1q_2$')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "d6488fe3-f500-4cdc-862e-782861ba0fca", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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bZruuecezZw5Uxs3bgyNyczMDNsef/xxfeYzn9Gll146+DsDAECSyyU1NUmHDvXempqM8wCS229/+1t94Qtf0IUXXqixY8cqNzdX3/zmN/Xmm29KMvqKn/205EUXXaQvfOELamxsNDlyAIDfLzU09N78frMjAwAMRrzOzaNKop85c0aHDh1SUVFRzxuMGqWioiLV1dVFvKauri5svCQVFxf3Ob61tVW/+tWvtHz58mhCAwCgTy6XNHNm740EOjA4iZSw+MlPfqKioiJlZmZq586deumll7Rp0ya1tbVp/fr1YWObmpp04sQJPf300/rggw+0cOFCnTlzxqTIAQB+v5STI82a1XvLybHmzyUAiBZz85GZm4+OZnAgEFBnZ6fGjx8fdnz8+PE6duxYxGtaWloijm9paYk4/pFHHtHHPvYxeTyec8bT3t4e9jotLU1paWnnvA4AAACD052w6Ojofc5uj90THldddZXy8vJkt9v1r//6r0pNTdXXv/51rV279qzY/Lr11ltVW1urUaNGacGCBfqXf/mXXnPRbm+88YZuu+023XbbbfrhD38YOj5p0iR9+tOf1ttvvx02fty4cbrggguUmZmp22+/Xddee62OHTumvLy84b9hAMA5BQKRfx5JxvFAgKIJAImNufnIzc0HtbBoLD388MP6h3/4B9n7amB7lqysLGVkZIS2devWjUCEAAAAyWsgCYtYeeSRR3TeeefphRde0P3336/q6mrt3btXktTV1aXrrrtOf/nLX/Tss89q7969+u///m+Vl5f3+X47duzQmTNn9O1vfzvi+QsuuCDi8ba2Nm3btk2SlJqaOrSbShBut1u5ubmqqakxOxQAAICkwdx85ObmUVWiO51OpaSkqLW1Nex4a2urMjMzI16TmZk54PHPPfecmpqatH379gHFc/z4cTkcjtBrqtABAAASV15enrxeryRpypQp2rhxo2pra/X5z39etbW1amxs1J/+9CdlZWVJkn7xi1/o8ssvV319vdxud6/3e+WVV+RwOHTxxRcP6PMvueQSSdLp06clSddee62mTp06HLdmefX19WHzcgAAACS2ZJubR1WJnpqaqlmzZqm2tjZ0rKurS7W1tSosLIx4TWFhYdh4Sdq7d2/E8T/72c80a9Ys5efnDygeh8MRtpFEBwAASFwffTTz4osv1smTJyVJL7/8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vXtz6NChfPbZZ5mcnMwDDzyQL7/8snRZbHIff/xxTp8+nXPnzuW7777LwYMHc/To0czPz5cujQbR/wCoiblECXI5tdADYYUl+i327duXnp6e274uXLhQujwa5ueff84jjzySmzdvZmlpKQMDA6VLYpN75513curUqZw8eTL79+/P+++/nzvvvDMffvhh6dJoGP2PGsiF5XkG1MJcotvkcmqiB1JaDZnQEv0Wn376aZJkfHw8V69ezZUrV9Lb25tPPvkkp06dKlwdTXLjxo1s3bo1/f39mZ6ezr59+0qXxCb3559/ZmJiIkeOHFk96+3tzZEjR/LNN98UrIym0f+ohVxYnmdADcwluk0upyZ6IDWoIRNaot9ibm4ufX19OXz4cFqtVq5fv57l5eU888wz2bp1a+nyaJAff/wx+/fvT5L89NNP2bNnT+GK2OyuX7+epaWl7NixY835jh07Mjs7W6gqmkj/oxZyYXmeATUwl+g2uZya6IHUoIZM2Igl+pkzZzpe+f+/18zMTJLk0qVL2bNnz+oDmJqayn333feX4QXrbXp6Oo8++miSZGBgIF999VV+++23wlUBrD/9j1rIhetDNmejMZeAJtMDqUENmbCva/9SQW+88UZOnDjxt+/ZvXt3kuT777/P0NDQ6vnU1NSa76FbXnvttdWvjx07lmPHjhWshibYvn17tmzZkrm5uTXnc3NzabVahaqiifQ/aiEXrg/ZnI3GXKLb5HJqogdSgxoyYSNuog8ODmbv3r1/++rv70+y8lCGh4dXf3ZqamrN9/Df+k9uX0E39ff3Z3R0NOPj46tny8vLGR8fz5NPPlmwMoAy5ML1IZtTC7mcWsnlAGvVkAkbcRP9n1peXs709HTOnj27enb58uW8+OKLBatis/mnt696enr+9j3tdvt/WBWsOH36dF599dWMjY3liSeeyPnz5/PHH3/k5MmTpUujQfQ/aiAXlucZsN7kcmoml1MLPZDSasmEluj/z+XLl3Pz5s01v8kYGhrKuXPnMjo6msOHDxesjs1icHAwg4OD//Z9v/76a44fP575+fn09fXlzTffzEsvvdSFCmmyl19+OdeuXcvZs2czOzubkZGRfPHFFz57lq7S/6iBXFieZ8B6k8upmVxOLfRASqslE/a0/coIqnT16tXMzc1lZGQks7OzGR0dzS+//JKBgYHSpQGsK/0PgJqYS0CT6YGwwk10qNTOnTuzc+fOJEmr1cr27duzsLBgUAGbnv4HQE3MJaDJ9EBY0Yg/LAob3cTERJaWlvLggw+WLgWgq/Q/AGpiLgFNpgfSZG6iQ+UWFhbyyiuv5IMPPihdCkBX6X8A1MRcAppMD6Tp3ESHii0uLuaFF17ImTNn8tRTT5UuB6Br9D8AamIuAU2mB4IlOlSr3W7nxIkTee6553L8+PHS5QB0jf4HQE3MJaDJ9EBY0dNut9uliwD+6uuvv86zzz6b4eHh1bOPPvooQ0NDBasCWH/6HwA1MZeAJtMDYYUlOgAAAAAAdODjXAAAAAAAoANLdAAAAAAA6MASHQAAAAAAOrBEBwAAAACADizRAQAAAACgA0t0AAAAAADowBIdAAAAAAA6sEQHAAAAAIAOLNEBAAAAAKADS3QAAAAAAOjAEh2AVQcOHMjbb7+d119/PXfffXdarVbOnz9fuiwAAGgc2RygHj3tdrtduggAyltcXMy2bdvy0EMP5a233srjjz+e9957LxcuXMjCwkIGBgZKlwgAAI0gmwPUxRIdgCTJxMRExsbG8vnnn+f5559Pkly6dCnDw8OZn5/P4OBg4QoBAKAZZHOAuvg4FwCSJFNTU2m1Wjl69Ojq2bVr19Lf35977rmnYGUAANAssjlAXSzRAUiSTE5OZmxsLD09PWvODhw4kC1bthSsDAAAmkU2B6iLJToASVZuu4yMjKw5m5yc/MsZAACwvmRzgLpYogOQ5PZB/eLFi4I6AAB0mWwOUBdLdABy5cqV/P7772tC+eLiYmZmZvLYY4+VKwwAABpGNgeoT1/pAgAob9euXWm322vOfvjhhywtLeXgwYOFqgIAgOaRzQHq4yY6ALd18eLF7N69O3fddVfpUgAAoNFkc4CyLNEBuC1/uAgAAOogmwOU1dO+9f8IAQAAAAAASdxEBwAAAACAjizRAQAAAACgA0t0AAAAAADowBIdAAAAAAA6sEQHAAAAAIAOLNEBAAAAAKADS3QAAAAAAOjAEh0AAAAAADqwRAcAAAAAgA4s0QEAAAAAoANLdAAAAAAA6OBf3L2avUNC9r0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_eta_cs = files[\"test\"][\"Nominal/h_delta_eta_truth_cs_WW\"]\n", + "h_delta_eta_cs_noCR = files[\"test_noCR\"][\"Nominal/h_delta_eta_truth_cs_WW\"]\n", + "\n", + "h_delta_eta_ud = files[\"test\"][\"Nominal/h_delta_eta_truth_ud_WW\"]\n", + "h_delta_eta_ud_noCR = files[\"test_noCR\"][\"Nominal/h_delta_eta_truth_ud_WW\"]\n", + "\n", + "values1, edges1 = h_delta_eta_cs.to_numpy()\n", + "values2, edges2 = h_delta_eta_cs_noCR.to_numpy()\n", + "values3, edges3 = h_delta_eta_ud.to_numpy()\n", + "values4, edges4 = h_delta_eta_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\eta$')\n", + "ax1.set_title(r'$\\Delta\\eta$: W1 $\\rightarrow$ cs')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\eta$')\n", + "ax2.set_title(r'$\\Delta\\eta$: W2 $\\rightarrow$ ud')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "e40f4c33-57aa-45fa-a2ff-3d8d4f8d8485", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACFSUlEQVR4nOzdf3xU5Zn///ckkEyETqxMTcRmFltJMEKSBccY1k/RbWpo2WoYqpHdCmWpbm1E2nRp0S8yJHYX+4OKXbLLYnVld2GhlBGV8qHFVFotqYQE1lAksV3rUCWBaddEIz9sMt8/zicTxkxCJpnJmTN5PR+P8zidc+4zuU4awz1XrnPdtmAwGBQAAAAAAAAAAOgnxewAAAAAAAAAAABIVCTRAQAAAAAAAAAYAEl0AAAAAAAAAAAGQBIdAAAAAAAAAIABkEQHAAAAAAAAAGAAJNEBAAAAAAAAABgASXQAAAAAAAAAAAZAEh0AAAAAAAAAgAGQRAcAAAAAAAAAYAAk0QEAAAAAAAAAGABJdAAAAAAAAAAABkASHQBG4J//+Z9ls9lUXFw8Kl/vhz/8oWw2m55++ul+5woLC2Wz2fTCCy/0O+dyuTR79uzQ63fffVder1dz587VZZddJpvNpqeeeiqeoQMAAAAxY9V5eENDg+677z5de+21mjBhglwul+644w61trbGNX4AwMiQRAeAEdiyZYvS0tJ08OBB/eY3v4n717vxxhslSS+99FLY8c7OTh09elTjxo3TL3/5y7BzJ06c0IkTJ0LXSlIgEFBNTY1effVVFRYWxj1uAAAAIJasOg//1re+pZ07d+qTn/ykHnvsMd1zzz36xS9+oZkzZ+ro0aNxvw8AwPCQRAeAYXr99dd14MABrVq1SuPHj9eWLVvi/jUnT56sq666qt/kvb6+XsFgULfffnu/c72vL5y8X3HFFTp58qTeeOMNfec734l73AAAAECsWHkeXlVVpTfeeEPf//739cUvflGrVq3Siy++qD/96U965JFH4n4fAIDhIYkOAMO0ZcsWpaam6p577tGnPvWpASfvmzdvls1m0+HDh3X//fcrOztbGRkZ+uxnP6v//d//DY07fvy4/H7/Rb/ujTfeqMOHD+vMmTOhY7/85S917bXX6tOf/rR+9atfqaenJ+yczWbTX/zFX4SOpaenKzs7ezi3PeoaGxv1uc99TpdffrnsdrumTZummpqasDHbtm1TUVGR7Ha78vLytGvXLi1cuFDXXnutSVEDAAAgXqw8D589e7bS0tLC3nfq1Km69tpr9eqrrw75ezAaYjnHZr4OwOpIogPAMG3ZskWf+MQnlJWVpTvuuEOvvfaaGhoa+o175ZVXlJKSorvvvlvvvPOO1qxZo9tuu027d+/W97///dC4a665RosWLbro173xxhv1/vvv6+WXXw4d++Uvf6nZs2dr9uzZ6ujoCHsU9Je//KWmTZumSZMmjfCOh+ehhx7S448/Pqxrn376ac2ePVu//vWvtWLFCj366KOaPXu2Dhw4EBrz6KOPauHChfr4xz+uf/qnf1JZWZnuuusuvfzyy5o+fXqsbgMAAAAJItnm4cFgUO3t7XI6nUO5/SEbyTw8lnNs5usAksE4swMAACtqbGzU8ePH9ZWvfEWSVF5errS0NG3ZskVutztsbHNzs3p6evT1r39dd9xxhyTpS1/6kn7xi1/o4MGDUX/tC/sx3nTTTfrTn/6kl19+WYsXL9bHP/5xZWVl6aWXXlJBQYHeeecdNTc362//9m9HdsMj0NHRob/7u7/T+PHj9YUvfGHI17W2turzn/+85s2bp61bt8put0uS7r33Xp07d06S8b39xje+oYceeiisOv3999/Xxo0btWTJkpjeCwAAAMyVjPPwLVu26M033+z3tOVIDXceHss5NvN1AMmCSnQAGIYtW7Zo3LhxWrBggSQpMzNTc+fO1bZt29Td3R029pVXXtFNN90Umrj3mjRpki655JLQ62AwqP3791/0a19zzTWaNGlSqMfif//3f6urq0uzZ8+WZDwi2ruoUX19vbq7u8P6MMba2bNnB92+/e1va/HixVq6dKm2bt065PddvXq17Ha7nnrqqVACvVd6erokae3atfrwhz+sBx98MOx87/3OmDFjhHcHAACARJJs8/Djx4+rsrJSJSUlWrx48UVjuFC85uGxnGMzXweQLEiiA0CUuru7tW3bNv3lX/5l2COXFRUVam9vV11dXejY6dOn1d7erltvvbXf+7z55puaPHly1F/fZrNp9uzZoZ6Lv/zlL3X55Zfr6quvlhQ+ee/dxyuJ/u677yojI+Oi21NPPaWenh4tWrRIbW1tF33fc+fO6bnnntPnP/95ORyOiGPOnz+vZ599VosWLeqXZH/33XclKezx0NOnT2vevHmaMGGC8vLywv5/AgAAQOJLtnl4W1ub5s2bp8zMTP3oRz9SamrqkGOJ1zw82jn2v/zLv2jmzJkaP3681qxZM6z3OnfunP72b/9WLpdLDodDN9xwg+rr64f8vQCA0UA7FwCI0s9+9jOdPHlS3/zmN8OO33rrrcrIyNCWLVt0yy23SDKqXyRp5syZYWPffPNN/e///u+wKy9uvPFGPffcc2pubg71Yew1e/ZsrVixQm+++aZeeuklTZ48WR/72MeG9XUuxm6369/+7d8uOu4nP/mJtm3bJo/Ho4985CMXHf8///M/eu+99zRr1qwBx/z2t79VV1eXioqK+p1rbW3VJZdcEnbflZWVys7O1unTp/X888+H+mdedtllF40HAAAA5kumeXhHR4c+/elP6+2339aLL74YdVI/XvPwaOfYV1xxhdasWROx0n2o73XmzBlNmTJFL730kj760Y/qhz/8oT772c/qd7/7nSZOnHjRmAFgNJBEB4AobdmyRePHj9f8+fPDjk+cOFGf+cxn9PTTT2vjxo3KyMgITd4LCgrCxjY3N0c8PlQX9mP85S9/GeoJKUmzZs1Senq69u/fr5dfflmf+cxnhvU1hmLcuHEX7a+4b98+Pf300yovL9fWrVuHVGFz5swZSUa1z0Dee++9AY//53/+p6655hqlpBgPXL377rvatWuX/ud//keXXHKJbr31Vs2YMUPPPPMMfRgBAAAsIlnm4WfPntVnP/tZtba26vnnn1d+fn7UccRrHh7NHFsyetJL0p49e4b9XhMmTNDq1atD5++8805VVVWppaVl0KIaABhNtHMBgCicOXNGPp9Pn/rUp/ThD3+43/k77rhD77zzjp599llJxiT9ox/9aL+xr7zyimw2m6699trQsePHj8vv9w8pjuuuu052uz20CNGFFTDp6emaOXOmamtr1dXVFdd+6EPxzW9+U6Wlpdq+fbvGjRva3257H4l9/vnn+517//33JUkul0tS36Oyvbxer06dOhVWXfTaa69p4sSJ+uhHPxo6NmPGDP3617+O7mYAAABgimSZh3d3d6uiokL19fXasWOHSkpKhvR1h2M48/Bo5tjxeq/XXntNf/zjH0OfCQAgEVCJDgBRePbZZ/XOO+9Ikh555JF+53urLbZs2aKKigq98sorEatcmpub9bGPfUwTJkwI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A4H+55zO+PwuBgAkFubmozc3j7onekVFhb773e9q9erVKioq0pEjR7R3797QN8Dv9+vkyZOh8bNnz9bWrVu1adMmFRYW6kc/+pF27dql6dOnh73vtm3bFAwGtXDhwhHeEgAAAOIlEIg8SZeM45GSObGyefNmTZgwQS+//LK+/e1vq6amRvv27ZNkPB1522236Y9//KN+/vOfa9++ffqf//kfVVRUDPh+O3bs0Pnz5/X1r3894vlLL7004vGOjg5t27ZNkvGkJgCYxeWSZs7sv5FAB4Cxgbn56M3No65El6T77rtP9913X8Rz+/fv73fs9ttv1+233z7oe95zzz265557hhMOAAAAxoCCggJ5vV5J0tSpU7VhwwbV1dXpU5/6lOrq6tTc3KzXX39dOTk5kqR///d/17XXXquGhga53e5+7/faa6/J4XDoiiuuGNLX/+hHPypJ6urqkiTdeuutmjZtWixuDQAAALCUsTY3j7oSHQAAADDDBx/NvOKKK3Tq1ClJ0quvvqqcnJzQJF2S8vPzdemll+rVV1+N+H7BYFA2m23IX//FF19UY2OjnnrqKeXm5mrjxo3DuAsAAADA+sba3HxYlegAAADAaBs/fnzYa5vNpp6enmG/X25urjo6OnTy5MkhVbxcddVVuvTSS5WXl6dTp06poqJCv/jFL4b99QEAAACrGmtzcyrRASBBJNOK2gAw2q655hqdOHFCJ06cCB07duyY3n77beXn50e85nOf+5zS0tL07W9/O+L5Dy5edKHKykodPXpUTz/99IjiBgAAAJJNMs7NqUQHgARg1oraABAtp9P4vTTQ7yunc/RjkqTS0lLNmDFDf/M3f6P169frT3/6k7785S9rzpw5uu666yJek5OTo0cffVT33XefOjs7tWjRIk2ZMkW///3v9e///u+aOHGi1q1bF/HaSy65RHfffbe8Xq/Ky8ujevQ0GbndbqWmpqqyslKVlZVmhwMAADAmMDc3jMbcnEp0AEgAZq6oDQDRcLmMP+w1NvbfzPyDn81m0zPPPKMPf/jD+sQnPqHS0lJ97GMf0/bt2we97stf/rJ++tOf6s0339T8+fM1bdo0ffGLX5TD4dDf//3fD3rtfffdp1dffVU7duyI5a1YUkNDg44dO0YCHQAAYBQxN+8T77m5LRgMBuPyznHU2dmpzMxMdXR0yOFwmB0OAIxYU5M0a9bA5xsbpZkzRy8eAMnr7Nmzev3113XVVVfJbrebHU5SG+x7nSzz2WS5DwAAgNHGvHz0xGJeTjsXAAAAAABgSX5/5Kc2nU7aIQIAYsfSSXR6LwIAAAAAMDaxrhAAYLRYOone0NDAY6MARh3VLgAAAID5hrKuEPNzAEAsWDqJDgCjLV7VLom6ojYAAAAAAMBYRxIdAKIQr2qX3hW1qXAHAAAAAABILCTRASBBuFwkywGMnmAwaHYISa+np8fsEAAAAJDgmDPGXyy+xyTRAQAAxpDx48fLZrPp9OnT+shHPiKbzWZ2SEknGAzq/PnzOn36tFJSUpSWlmZ2SACAKLEOEoB4S0tLU0pKit566y195CMfUVpaGnPzGIvlvJwkOgAAwBiSmpqqj370o/r973+v3/3ud2aHk9QuueQSuVwupaSkmB0KACSleK0rFK91kADgQikpKbrqqqt08uRJvfXWW2aHk9RiMS8niQ4AADDGTJw4UVOnTtX7779vdihJKzU1VePGjaOaCADiKF7rCsVrHSQA+KC0tDS5XC796U9/Und3t9nhJKVYzctJogNAFOJV7QIAoy01NVWpqalmhwEAwIiwrhAAq7PZbBo/frzGjx9vdigYBEl0AIhCvKpdAAAAAAAAkJhIogNAlKh2AQAgnNvtVmpqqiorK1VZWWl2OAAAAEBMkUQHAAAAMCINDQ1yOBxmhwEAAADExfCXJAUAAAAAAEgyvesgRcI6SAAwNlm6Ep3HRgEAAAAAQCyxDhIA4IMsnUTnsVEAAAAAABBrrIMEALgQ7VwAAAAAAAAAABgASXQAAAAAAAAAAAZAEh0AAAAAAAAAgAGQRAcAAAAAAAAAYAAk0QEAAAAAAAAAGABJdAAAAMCiamtrNWXKFNntdhUXF+vgwYODjt+xY4emTZsmu92uGTNmaM+ePf3GvPrqq7r11luVmZmpCRMmyO12y+/3x+sWAAAAgIRHEh0AAACwoO3bt6uqqkper1dNTU0qLCxUWVmZTp06FXH8gQMHtHDhQi1dulSHDx9WeXm5ysvLdfTo0dCY3/72t7rxxhs1bdo07d+/X6+88ooeeugh2e320botAAAAIOHYgsFg0OwgotXZ2anMzEx1dHTI4XCYHQ4AAAAQlVjMZ4uLi+V2u7VhwwZJUk9Pj3JycrRs2TKtXLmy3/iKigp1dXVp9+7doWM33HCDioqKtHHjRknSnXfeqfHjx+s//uM/Ru0+AAAAALMMdT5LJToAAABgMefPn1djY6NKS0tDx1JSUlRaWqr6+vqI19TX14eNl6SysrLQ+J6eHv34xz9Wbm6uysrKdPnll6u4uFi7du26aDydnZ1h27lz54Z/cwAAAECCIYkOAAAAWEwgEFB3d7eysrLCjmdlZamtrS3iNW1tbYOOP3XqlN5991098sgjmjt3rn76059q/vz58ng8+vnPfz5oPDk5OcrMzAxta9euHcHdAQAAAIllnNkBAAAAADBfT0+PJOm2227TV7/6VUlSUVGRDhw4oI0bN2rOnDkDXnvixImwx1/T09PjGyyAuPH7pUCg/3GnU3K5Rj8eAAASgaWT6G63W6mpqaqsrFRlZaXZ4QAAAACjwul0KjU1Ve3t7WHH29vblZ2dHfGa7OzsQcc7nU6NGzdO+fn5YWOuueYavfTSS4PG43A46IkOJAG/X8rLk86e7X/ObpdaWkikAwDGJku3c2loaNCxY8dIoAMAAGBMSUtL06xZs1RXVxc61tPTo7q6OpWUlES8pqSkJGy8JO3bty80Pi0tTW63Wy0tLWFjWltb9Wd/9mcxvgMAiSgQiJxAl4zjkSrUAQAYCyxdiQ4AAACMVVVVVVq8eLGuu+46XX/99Vq/fr26urq0ZMkSSdKiRYt05ZVXhvqTL1++XHPmzNG6des0b948bdu2TYcOHdKmTZtC77lixQpVVFToE5/4hG6++Wbt3btXzz33nPbv32/GLQIAAAAJgSQ6AAAAYEEVFRU6ffq0Vq9erba2NhUVFWnv3r2hxUP9fr9SUvoePJ09e7a2bt2qVatW6cEHH9TUqVO1a9cuTZ8+PTRm/vz52rhxo9auXav7779feXl52rlzp2688cZRvz8AAAAgUdiCwWDQ7CCi1dnZqczMTHV0dNB7EQAAAJaTLPPZZLkPAIamJmnWrIHPNzZKM2eOXjwAAMTbUOezlu6JDgAAAAAAAABAPJFEBwAAAAAAcjoluz3yObvdOA8AwFhET3QgAfj9kVe6dzoll2v04wEAAAAw9rhcUksLn01wAZ9Pqq6WWlul3FzJ65U8HrOjAoBRRxIdMJnfL+XlSWfP9j9ntxuTWCarAAAAAEaDy8XnD/w/Pp+0YIFks0nBoNTcbLzeuZNEOoAxh3YugMkCgcgJdMk4HqkKBAAAAACAuKqu7kugS8beZpNqasyNCwBMQCU6ACQ52gUBAAAAiFpra18CvVcwaDwuDQBjDEl0AEhitAsCAAAAMCy5uUYLlwsT6Tab8QEDAMYY2rkAQBKjXRAAYDS43W7l5+ertrbW7FAAALHi9fa1cJH6Wrt4vebGBQAmsHQSnck6AAAAYL6GhgYdO3ZMlZWVZocCAIgVj8dYRLSgwHiMtaDAWGx0/nyzIwOAUWfpdi4NDQ1yOBxmhwGMiNNpzEcGarfhdI5+TAAAAAAAyOMxNgAY4yydRAeSgctl9KVm4Ucgznw+qbraWCApN9d4DJUPBAAAAAAA4CJIogMJwOUiWQ7Elc8nLVjQ18exudl4vXMniXQAAAAAADAoS/dEBwAMrrddUCRjql1QdXVfAl3qWyCppsbcuAAAAAAAQMKjEh0Akhjtgv6f1ta+BHqvYND45gAAAAAAAAyCJDoAJDnaBcnogd7cHJ5It9mkvDzzYgIAAAAAAJZAOxcAQPLzevtauEh9rV28XnPjAgAAAAAACW9YSfTa2lpNmTJFdrtdxcXFOnjw4KDjd+zYoWnTpslut2vGjBnas2dPvzGvvvqqbr31VmVmZmrChAlyu93y+/3DCQ8AgHAej7GIaEGB0Qy+oMBYbHT+fLMjAwAAAAAACS7qJPr27dtVVVUlr9erpqYmFRYWqqysTKdOnYo4/sCBA1q4cKGWLl2qw4cPq7y8XOXl5Tp69GhozG9/+1vdeOONmjZtmvbv369XXnlFDz30kOwDrYYHAEC0PB7pyBHpzBljTwIdAAAAAAAMgS0Y/OBKa4MrLi6W2+3Whg0bJEk9PT3KycnRsmXLtHLlyn7jKyoq1NXVpd27d4eO3XDDDSoqKtLGjRslSXfeeafGjx+v//iP/xhSDJ2dncrMzFRHR4ccDkc04QMAAACmS5b5bLLcBwAAAMamoc5no6pEP3/+vBobG1VaWtr3BikpKi0tVX19fcRr6uvrw8ZLUllZWWh8T0+PfvzjHys3N1dlZWW6/PLLVVxcrF27dkUTGgAAAAAAAAAAMRdVEj0QCKi7u1tZWVlhx7OystTW1hbxmra2tkHHnzp1Su+++64eeeQRzZ07Vz/96U81f/58eTwe/fznPx80ns7OzrDt3Llz0dwOAAAAAAAAAACDGtbCorHU09MjSbrtttv01a9+VUVFRVq5cqX+6q/+KtTuZSA5OTnKzMwMbWvXrh2NkAEAAABcwO12Kz8/X7W1tWaHAgAAAMTcuGgGO51Opaamqr29Pex4e3u7srOzI16TnZ096Hin06lx48YpPz8/bMw111yjl156adB4Tpw4EdarJj09fcj3AgAAACA2Ghoa6IkOAACApBVVJXpaWppmzZqlurq60LGenh7V1dWppKQk4jUlJSVh4yVp3759ofFpaWlyu91qaWkJG9Pa2qo/+7M/GzQeh8MRtpFEBwAAAAAAAADEUlSV6JJUVVWlxYsX67rrrtP111+v9evXq6urS0uWLJEkLVq0SFdeeWWotcry5cs1Z84crVu3TvPmzdO2bdt06NAhbdq0KfSeK1asUEVFhT7xiU/o5ptv1t69e/Xcc89p//79sblLAAAAAAAAAACGIeokekVFhU6fPq3Vq1erra1NRUVF2rt3b2jxUL/fr5SUvgL32bNna+vWrVq1apUefPBBTZ06Vbt27dL06dNDY+bPn6+NGzdq7dq1uv/++5WXl6edO3fqxhtvjMEtAgAAAAAAAAAwPLZgMBg0O4hodXZ2KjMzUx0dHfReBGAOn0+qrpZaW6XcXMnrlTwes6MCAFhEssxnk+U+AAAAMDYNdT4bVU90AICMBPqCBVJzs3T2rLFfsMA4DgAAAAAAgKRCEh0AolVdLdlsUu+DPMGg8bqmxty4AAAAgLHI55MKC6WMDGNPcQsAIMZIogNAtFpb+xLovYJBqaXFnHgAAACAsYqnRAEAo4AkOgBEKzfXqDy/kM0m5eWZEw8AAAAwVvGUKABgFJBEB4Boeb19k3Opb9Lu9ZobFwAAADDWWO0p0Xi1nqGlDQDEFUl0AIiWxyPt3CkVFEh2u7H3+aT5882ODAAAABhbrPSUaLxaz9DSBgDijiQ6AAyHxyMdOSKdOWPsx2ICnWoXAAAAmM1KT4nGq/UMLW0AIO4snUR3u93Kz89XbW2t2aEAwNhCtQsAAAASgZWeEo1X6xmrtbQBAAuyBYMf/E2b+Do7O5WZmamOjg45HA6zwwGAsaew0EicX/hPiM1mfGg5csS0sADAKpJlPtt7H7m5uUpNTVVlZaUqKyvNDgsAElO85tDMzQFg2IY6Lx83ijEBwKjz+6VAoP9xp1NyuUY/nqRBtQsA4AINDQ2W/mMAAIwG/5cfUeBL/58km6SgsQ8G5fzyP2pEH028XuOp0N6WLonc0gYALIokOoCk5fcb6wmdPdv/nN1u5HtJpA9Tbm7kapdEXMAJAAAAGA6fz+g33tpqzH+9XqN9zDD4/VLeVz6ts/p0v3P25VLL3BF8NultaVNTY3zIycszYk3EljYAYFGW7okOAIMJBCIn0CXjeKQKddNZZbFOKy3gBAAAAEQrxmsAxfOzid8vNU3xqOnJI2r65Rlj/2fz5fcP/z0BAOFIogNAorDSYp1WWsAJAAAAiFZ1dV+hiNRXQFJTY25cH9D79O2sWf23vDyRSAeAGKGdCwAkisEm6sN8bDSuPJ7EjAsAAGCYWE8HIRZZA2goFe787ALAyFGJDgCJwiIT9bizSksbAACQVKjoRZjc3L7Whb1YAwgAxiyS6ACQKJioW6ulDQAASCqWXE8H8cMaQACAC5BEB5C0nE6jXXckdrtxPqHEc6Julepui/SeBAAAQJKL8RpAlvtsAgAIQ090AEnL5TI6oVimr2XvRL2mxgg8L89IoI90sc7e6u7e5HRvdffOnYnX05yWNgAAAEgUMVwDyHKfTQAAYUiiA0hqLpfFJqTxWKzTSguW5uYaSf4LE+ljraUNAAAAklI8Ppv0VrhHakVEhTsAxA7tXAAg2VmpupvekwAAAMCQ9Va4Nzb231paLFZQNFJWaWEJwJIsnUR3u93Kz89XbW2t2aEAQOKy0oKlMe49CQAAMFT0rIZVuVzSzJn9tzGXQF+wwHiq9ezZvhaWJNIBxIgtGPxgeWLi6+zsVGZmpjo6OuRwOMwOBwAS2wd7ovfuSU4DgGmSZT6bLPcB9PL76VkdVz6f0WqwtdUo9PB6E6+9IKypsDByW8iCAunIEdPCApD4hjqfpSc6ACS7eC1YCgAAkGQst56OlVhpsXtYj5VaWAKwJEu3cwEADJHHY1RgnDlj7EmgAwBiiDaLAC5qsMXugZGyUgtLAJZEJToAAACAEWloaKCdC4DBUSmMePJ6I7ew9HrNjgxAkqASHQAAAAAAxBeVwoin3haWBQXGSsAFBawBBSCmqEQHAAAAAADxRaUw4s3job8+gLihEh0AAAAAAMQXlcIAAAujEh0AAAAAAMQflcIAAIuiEh0AAAAAAAAAgAGQRAcAAAAAAAAAYAAk0QEAAAAAAAAAGABJdABR8fulpqb+m99vdmQYTfwcAEDiqK2t1ZQpU2S321VcXKyDBw8OOn7Hjh2aNm2a7Ha7ZsyYoT179oSd/8IXviCbzRa2zZ07N563AAAAACQ0SyfR3W638vPzVVtba3YowJjg90t5edKsWf23vLwETqD6fFJhoZSRYex9PrMjsjTL/hwAQBLavn27qqqq5PV61dTUpMLCQpWVlenUqVMRxx84cEALFy7U0qVLdfjwYZWXl6u8vFxHjx4NGzd37lydPHkytP3Xf/3XaNwOAAAAkJBswWAwaHYQ0ers7FRmZqY6OjrkcDjMDgcYM5qajETpQBobpZkzRy+eIfH5pAULJJtNCgb79jt3Sh6P2dFZkiV/DgAgwcRqPltcXCy3260NGzZIknp6epSTk6Nly5Zp5cqV/cZXVFSoq6tLu3fvDh274YYbVFRUpI0bN0oyKtHffvtt7dq1a9TuAwAAADDDUOezlq5EB4CLqq7uS5xLfYn0mhpz4wIAYITOnz+vxsZGlZaWho6lpKSotLRU9fX1Ea+pr68PGy9JZWVl/cbv379fl19+ufLy8nTvvffqD3/4Q+xvAAAAALCIcWYHAABx1dral0DvFQxKLS3mxAMAQIwEAgF1d3crKysr7HhWVpaOHz8e8Zq2traI49va2kKv586dK4/Ho6uuukq//e1v9eCDD+rTn/606uvrlZqaGvF9Ozs7w16np6crPT19OLcFAAAAJByS6ACSW26u1Nwcnki32Yzm3QAAoJ8777wz9L9nzJihgoICffzjH9f+/fv1yU9+MuI1OTk5Ya+9Xq/WrFkTzzABAACAUUMSHUBy83oj90T3es2ODACAEXE6nUpNTVV7e3vY8fb2dmVnZ0e8Jjs7O6rxkvSxj31MTqdTv/nNbwZMop84cSKshyRV6AAAAEgm9EQHMGROp2S3Rz5ntxvnE47HYywiWlBgBFlQYCw2On++2ZFZliV/DgAgCaWlpWnWrFmqq6sLHevp6VFdXZ1KSkoiXlNSUhI2XpL27ds34HhJ+v3vf68//OEPuuKKKwYc43A4wjaS6BgNfr+x4PkHN7/f7MgAAECyoRIdwJC5XEYr8UCg/zmn0zifkDweY0NMWPbnAACSUFVVlRYvXqzrrrtO119/vdavX6+uri4tWbJEkrRo0SJdeeWVWrt2rSRp+fLlmjNnjtatW6d58+Zp27ZtOnTokDZt2iRJevfdd1VdXa0FCxYoOztbv/3tb/X1r39dV199tcrKyky7T+CD/H6jO9/Zs/3P2e3GXIU5CQAAiBWS6ACi4nLxgQT8HABAoqioqNDp06e1evVqtbW1qaioSHv37g0tHur3+5WS0vfw6ezZs7V161atWrVKDz74oKZOnapdu3Zp+vTpkqTU1FS98sor2rx5s95++21NnjxZt9xyix5++GGqy5FQAoHICXTJOB4IMFcBAACxYwsGL1xtzxo6OzuVmZmpjo6OsN6LAACMKp9Pqq6WWluNRWy9Xp56ADAkyTKfTZb7gPU0NUmzZg18vrFRmjlz9OIBAADWNNT5LD3RAQAYDp/PWLS2udkoeWtuNl77fGZHBgAAAAAAYogkOgAAw1FdLdlsUu8DXcGg8bqmxty4AAAAAABATJFEBwBgOFpb+xLovYJBYyUzAACAC/j9RguaD25+v9mRASbw+aTCQikjw9jzJCcAC7D0wqJut1upqamqrKxUZWWl2eEAAMaS3FyjhcuFiXSbTcrLMy8mAADGCKdTstsjLy5qtxvnE4Xfb0wPBoq1pYVFUDGG9LZE7H2is7cl4s6drC0EIKFZOone0NDAAkYAAHN4veEfAHr3Xq/ZkQEAkPRcLiP5HAj0P+d0JlZSOhCInECXjOOBQGLFC8TVYC0RSaIDSGCWTqIDAGAaj8eomKmpMT7F5+UZCfT5882ODACAMcHlIvkMWA4tEQFYFEl0AACGy+OhYgYAAAAYKloiArAoFhYFAAAAAABA/Hm9fS1cJFoiArAMkugAAAAARsTtdis/P1+1tbVmhwIASGS9LRELCoyVdQsKjMVGaYkIIMHRzgUAAADAiDQ0NMjhcJgdBpCQnE4jVxhpcVG73TgPjCm0RARgQSTRAQAAAACIE5fLWDMxEOh/zulkcVQAAKxgWO1camtrNWXKFNntdhUXF+vgwYODjt+xY4emTZsmu92uGTNmaM+ePWHnv/CFL8hms4Vtc+fOHU5oAAAAAAAkFJdLmjmz/0YCHQAAa4g6ib59+3ZVVVXJ6/WqqalJhYWFKisr06lTpyKOP3DggBYuXKilS5fq8OHDKi8vV3l5uY4ePRo2bu7cuTp58mRo+6//+q/h3REAAAAAAAAAADFiCwaDwWguKC4ultvt1oYNGyRJPT09ysnJ0bJly7Ry5cp+4ysqKtTV1aXdu3eHjt1www0qKirSxo0bJRmV6G+//bZ27do1pBg6OzuVmZmpjo4Oei8CAADAcpJlPpss9wEAAICxaajz2agq0c+fP6/GxkaVlpb2vUFKikpLS1VfXx/xmvr6+rDxklRWVtZv/P79+3X55ZcrLy9P9957r/7whz9EExoAAAAAAAAAADEX1cKigUBA3d3dysrKCjuelZWl48ePR7ymra0t4vi2trbQ67lz58rj8eiqq67Sb3/7Wz344IP69Kc/rfr6eqWmpg4YT2dnZ9jr9PR0paenR3NLAAAAAAAAAAAMKKokerzceeedof89Y8YMFRQU6OMf/7j279+vT37ykwNel5OTE/ba6/VqzZo18QoTsBy/XwoE+h93OlnECAAAAAAAABiKqJLoTqdTqampam9vDzve3t6u7OzsiNdkZ2dHNV6SPvaxj8npdOo3v/nNoEn0EydOhPWqoQod6OP3S3l50tmz/c/Z7VJLC4l0AAAAAAAA4GKi6omelpamWbNmqa6uLnSsp6dHdXV1KikpiXhNSUlJ2HhJ2rdv34DjJen3v/+9/vCHP+iKK64YNB6HwxG2kUQH+gQCkRPoknE8UoU6AAAAAAAAgHBRJdElqaqqSo8//rg2b96sV199Vffee6+6urq0ZMkSSdKiRYv0wAMPhMYvX75ce/fu1bp163T8+HGtWbNGhw4d0n333SdJevfdd7VixQr96le/0u9+9zvV1dXptttu09VXX62ysrIY3SYAAAAAAAAAANGLuid6RUWFTp8+rdWrV6utrU1FRUXau3dvaPFQv9+vlJS+3Pzs2bO1detWrVq1Sg8++KCmTp2qXbt2afr06ZKk1NRUvfLKK9q8ebPefvttTZ48WbfccosefvhhKssBAAAAAAAAAKayBYPBoNlBRKuzs1OZmZnq6OgI64kOoE9TkzRr1sDnGxulmTNHLx4AANAnWeazyXIfAID+/P7IbUCdzjG2vpbPJ1VXS62tUm6u5PVKHo/ZUQGIkaHOZ6OuRAcAAACAC7ndbqWmpqqyslKVlZVmhwMAGCG/X8rLi7zOlt0utbSMkUS6zyctWCDZbFIwKDU3G6937iSRDowxJNGBJOV0GpObgSY9TufoxwQAAJJTQ0MDlegAkEQCgcifJSXjeCAwvCS65arbq6v7EuiSsbfZpJoakujAGEMSHUhSLpdRHWCpCQoAAAAAIClZsrq9tbUvgd4rGDSCBTCmkEQHkpjLlYCTEAAAAADAmBOv6va4ys01WrhcmEi32Yy/BgAYU1LMDgAAAAAAAABIOF5vXwsXqa+1i9drblwARh1JdAAAAAAAAOCDPB5jEdGCAqPnTEGBsdjo/PlmRwZglNHOBYiC5RZBAQAAAAAgSk6nkTMeqH+50zn6MZnG42ERUQDWTqK73W6lpqaqsrJSlZWVZoeDJGfJRVAAAAAAAIiSy2V8xqWIDAAMlk6iNzQ0yOFwmB0GxghLLoICAAAAAMAwuFyx/YxLdTsAK7N0Eh0AAAAAAACJj+p2AFZGEh1A4vD5pOpqqbVVys01Vjyn9xwAAAAAJIVYV7cDwGhJMTsAAJBkJNAXLJCam43n+5qbjdc+n9mRAQAAAGOLzycVFkoZGcaeOTkAYIwjiQ4gMVRXSzabFAwar4NB43VNjblxAQAAAGMJxS0AAPRDEh0Yot5FUCJhEZQYaG3tS6D3CgaNpnkAAAAARgfFLQAA9ENPdGCIWAQlznJzjSqXCxPpNpuUl2deTAAAYEjcbrdSU1NVWVmpyspKs8MBMBIUtwAA0A9JdCAKLIISR16v8Zhob9VL797rNTsyjCK/nz9UAYAVNTQ0yOFwmB0GMDb5fEb1eGurUZji9Uoez/Dfj+IWAAD6oZ0LgMTg8Ug7d0oFBUZ/nIIC4wPB/PlmR4ZR4vcbn81mzeq/5eUZ5wEAAHCBePQv93r7ilokilsAABCV6AASicczsqoZWFogYHz2i+TsWeN8IlWjUzUPAABMN1j/8uHOq3uLW2pqjBYueXlGAp3iFgDAGEYSHQCAKPVWzUdK+tvtxudNEukAACDu4tW/nOIWAADC0M4FAIAoDaVqHgAAIO5yc/varvSifzkAADFn6SS62+1Wfn6+amtrzQ4FAAAAAIDRRf9yAABGhaWT6A0NDTp27JgqKyvNDgUAAAAAgNHV27+8oMDoKVdQYCwqSv9yILH5fFJhoZSRYexHshgwgFFh6SQ6AJPwDz7iwOk0PvtFYrcb5wEAAPABHo905Ih05oyxJ4EOJDafT1qwQGpuNnpBNjcbr/lcDSQ0FhYFEJ3ef/B7HxXt/Qd/504WH8KIuFzGGliR+ok7nSzUCQAAACAJVFf3fZ6W+loy1dTwmRpIYCTRAUSHf/ARRy5XfJLlfn9sk/O9VfORFhelah4AAADAgFpb+z5P9woGjYoiAAmLJDqA6PAPPizG75fy8gZOeLe0RJ9Ip2oeAAAAwLDk5hpPdF/4udpmMz60AEhYJNEBRId/8GExgUDkBLpkHA8Ehpf0jlfVPAAAAIAk5vWGt0jt3Xu9ZkcGYBAsLAogOl5v3z/0Ev/gAwAAAAAwVB6PsaZYQYHxaGxBgbH2GIsCAwmNJDqA6PAPPmBdPp9UWChlZBh7n8/siAAkCbfbrfz8fNXW1podCgAAic/jkY4ckc6cMfZ8ngYSHu1cAETP42ERUcBqfL7wx0abm43XO3fy3zOAEWtoaJDD4TA7DAAAACAuqEQHACDRxKNivLq6L4Eu9bVlqqkZ+XsDAAAAAJDESKIDAJKa02l0HorEbjfOJ5TeivHmZmPl096K8ZEm0ltbwxcElozXLS0je18AAAAAAJIc7VwAAEnN5TLyxIFA/3NOp3E+oQxWMT6Stiu5uUZC/sJEus0m5eWNLF4AAAAAAJKcpSvRWcAIADAULpc0c2b/LeES6FL8Ksa93r6EvNSXqPd6R/a+AABgaFjgGwAAy7J0Er2hoUHHjh1TZWWl2aEAABAbubl9ie5esagY93iMRUQLCow+NgUFxof3+fNH9r4AAODi4tWuDQAAjApLJ9EBAEg68awY93ikI0ekM2eMPQl0AABGBwt8AwBgaSTRAQBIJFSMAwCQfFjgGwAASyOJDgBAoqFiHEAUamtrNWXKFNntdhUXF+vgwYODjt+xY4emTZsmu92uGTNmaM+ePQOO/dKXviSbzab169fHOGpgjIlXuzYAADAqSKIDAAAAFrV9+3ZVVVXJ6/WqqalJhYWFKisr06lTpyKOP3DggBYuXKilS5fq8OHDKi8vV3l5uY4ePdpv7NNPP61f/epXmjx5crxvA0h+LPANAIClkUQHAAAALOp73/ue7r77bi1ZskT5+fnauHGjLrnkEj355JMRxz/22GOaO3euVqxYoWuuuUYPP/ywZs6cqQ0bNoSNe/PNN7Vs2TJt2bJF48ePH41bAZIb7doAALA0kugAAACABZ0/f16NjY0qLS0NHUtJSVFpaanq6+sjXlNfXx82XpLKysrCxvf09Oiuu+7SihUrdO2118YneGAsol0bAACWNc7sAAAAAABELxAIqLu7W1lZWWHHs7KydPz48YjXtLW1RRzf1tYWev2tb31L48aN0/333z/kWDo7O8Nep6enKz09fcjXAwAAAImMSnQAAAAAkqTGxkY99thjeuqpp2T74CKIg8jJyVFmZmZoW7t2bRyjBAAAAEYXSXQg2fl8UmGhlJFh7H0+syMCAAAx4HQ6lZqaqvb29rDj7e3tys7OjnhNdnb2oONffPFFnTp1Si6XS+PGjdO4ceP0xhtv6Gtf+5qmTJkyYCwnTpxQR0dHaHvggQdGdnMAAABAAiGJDiQzn09asEBqbpbOnjX2CxaQSAcAIAmkpaVp1qxZqqurCx3r6elRXV2dSkpKIl5TUlISNl6S9u3bFxp/11136ZVXXtGRI0dC2+TJk7VixQr95Cc/GTAWh8MRttHKBQAAE1BEB8QNPdGBZFZdLdlsUjBovA4Gjdc1NcbCRgAAwNKqqqq0ePFiXXfddbr++uu1fv16dXV1acmSJZKkRYsW6corrwy1V1m+fLnmzJmjdevWad68edq2bZsOHTqkTZs2SZImTZqkSZMmhX2N8ePHKzs7W3l5eaN7cwAAYOh6i+h6cwC9RXQ7d/L5H4gBS1eiu91u5efnq7a21uxQgMTU2tqXQO8VDEotLebEAwAAYqqiokLf/e53tXr1ahUVFenIkSPau3dvaPFQv9+vkydPhsbPnj1bW7du1aZNm1RYWKgf/ehH2rVrl6ZPn27WLQAAgFgYrIgOwIjZgsEPZtgSX2dnpzIzM9XR0SGHw2F2OEDiKiw0/vp84X/mNptUUCAdOWJaWAAAjHXJMp9NlvsAAMDyMjKMNq4fZLdLZ86MfjyARQx1PmvpSnQAF+H19v31Wer7q7TXa25cAAAAAAAgdnJz+z7797LZJNqxATFBEh1IZh6P0f+soMD463NBgdEnbf58syMDAAAAAACxQhEdEFck0YFk5/EYrVvOnDH2JNABAAAAAEguFNEBcTXO7AAAAAAAAAAAjJDHY2wAYo5KdAAAAAAAAAAABkASHQAAAAAAAACAAQwriV5bW6spU6bIbreruLhYBw8eHHT8jh07NG3aNNntds2YMUN79uwZcOyXvvQl2Ww2rV+/fjihAQAAAAAAAAAQM1En0bdv366qqip5vV41NTWpsLBQZWVlOnXqVMTxBw4c0MKFC7V06VIdPnxY5eXlKi8v19GjR/uNffrpp/WrX/1KkydPjv5OAAAAAAAAAACIsaiT6N/73vd09913a8mSJcrPz9fGjRt1ySWX6Mknn4w4/rHHHtPcuXO1YsUKXXPNNXr44Yc1c+ZMbdiwIWzcm2++qWXLlmnLli0aP3788O4GAAAAwKhzu93Kz89XbW2t2aEAAAAAMTcumsHnz59XY2OjHnjggdCxlJQUlZaWqr6+PuI19fX1qqqqCjtWVlamXbt2hV739PTorrvu0ooVK3TttddGExIAAAAAkzU0NMjhcJgdBgAAABAXUSXRA4GAuru7lZWVFXY8KytLx48fj3hNW1tbxPFtbW2h19/61rc0btw43X///dGEo87OzrDX6enpSk9Pj+o9AAAAAADx4/dLgUD/406n5HKNfjwAAADRiiqJHg+NjY167LHH1NTUJJvNFtW1OTk5Ya+9Xq/WrFkTw+gAAAAAAMPl90t5edLZs/3P2e1SSwuJdAAAkPii6onudDqVmpqq9vb2sOPt7e3Kzs6OeE12dvag41988UWdOnVKLpdL48aN07hx4/TGG2/oa1/7mqZMmTJoPCdOnFBHR0dou7DNDAAAAADAXIFA5AS6ZByPVKEOAEgwPp9UWChlZBh7n8/siIBRF1USPS0tTbNmzVJdXV3oWE9Pj+rq6lRSUhLxmpKSkrDxkrRv377Q+LvuukuvvPKKjhw5EtomT56sFStW6Cc/+cmg8TgcjrCNVi4AAAAAAABAjPh80oIFUnOz8dfP5mbjNYl0jDFRt3OpqqrS4sWLdd111+n666/X+vXr1dXVpSVLlkiSFi1apCuvvFJr166VJC1fvlxz5szRunXrNG/ePG3btk2HDh3Spk2bJEmTJk3SpEmTwr7G+PHjlZ2drby8vJHeHwAAAAAAAIDhqK6WbDYpGDReB4PG65oayeMxNzZgFEWdRK+oqNDp06e1evVqtbW1qaioSHv37g0tHur3+5WS0lfgPnv2bG3dulWrVq3Sgw8+qKlTp2rXrl2aPn167O4CAIAkweJrAAAAABJGa2tfAr1XMGgsagGMIbZg8IP/JSS+zs5OZWZmqqOjQw6Hw+xwAACICcsuvubzGRUqra1Sbq7k9VKVAlxEssxnk+U+ED9NTdKsWQOfb2yUZs4cvXgAAFEqLDRauFyYPrTZpIIC6cgR08ICYmWo89moeqIDAID4seTia/RIBAAMwuk0/hAcid1unAcAJDCvt6+Fi9TX2sXrNTcuYJSRRAcAAMM3WI9EAMCY53IZT1I1NvbfEvoJq8JCKSPD2POHYQBjmccj7dxpVJ7b7cbe55Pmzzc7MmBURd0THQAAIIQeiQCAi3C5EjRZHknvE1a9fyDufcJq505alQEYuzwefgdizKMSHQAADF9ubt+jnb1sNqO5OwAAVsMTVgAAIAKS6AAAYPjokQgASCY8YQUAACIgiQ4AQIKw5OJr9EgEIMntdis/P1+1tbVmhwKMDE9YAQCACOiJDgBAguhdfC0Q6H/O6UzgfrL0SATGvIaGBjkcDrPDAEbO6w3vic4TVgAAQBavRKfiBQCQbFwuaebM/lvCJtABAEgmPGEFAAAisHQlOhUvAAAAAICY4gkrAADwAZauRAcAAAAAAAAAIJ4sXYkOAAAAAAAAxIPfb8H1igDEBUl0AAAAAAAA4AJ+v5SXJ5092/+c3S61tJBIB8YS2rkAicLnkwoLpYwMY+/zmR0RAAAAAABjUiAQOYEuGccjVagDSF4k0YFE4PNJCxZIzc3Gv8bNzcZrEukAAAAAAACAqUiiA4mgulqy2aRg0HgdDBqva2rMjQsAAAAAAAAY40iiA4mgtbUvgd4rGDSarAEAAAAAAAAwDQuLAokgN9do4XJhIt1mM1YxAQAAAAAAA/L7I/codzpZ/BNAbJBEBxKB12v0QO9t6dK793rNjgwAAAAAgITl9xv1Z5EWAbXbjQe8h5NIdzqN6wd6X6cz+vcEYF0k0YFE4PFIO3caPdBbWowZgNcrzZ9vdmQAAAAAACSsQCByolsyjgcCw0uiu1zGx3Mq3AFIJNGBxOHxGBsAAIDFuN1upaamqrKyUpWVlWaHAwBATLhcJMsBGCydRGeyjsHQEw0AAGB0NDQ0yOFwmB0GAAAAEBeWTqIzWcdA4tUTDQAAAAAAAMDYkmJ2AEA8DKUnGgAAAAAAAABcDEl0AAAAAAAAWJLTaTxxHondbpwHgJEiiQ4AABKPzycVFkoZGcbe5zM7IgAAACQgl8to2drY2H+jlWsCY74Pi7F0T3QAAJCEfD5pwQLJZpOCQam52Xi9c6fk8ZgdHQAAABKMy0Wy3FKY78OCqEQHAACJpbq6b0ItGXubTaqpMTcuAAAAACPHfB8WRBIdSYmeaABgYa2tfRPqXsGg8TwuAAAAAGtjvg8Lop0LklJvT7RAoP85p5PHvAAgoeXmGo90XjixttmkvDzzYgIAAAAQG8z3YUEk0ZG06IkGABbl9Yb3SOzde71mRwYAAABgpJjvw4Jo5wIAABKLx2MsKlRQYPTgKigwFh+aP9/syAAAAACMFPN9WBCV6AAAIPF4PMYGAAAAIPkw34fFUIkOAAAAAAAAAMAALJ1Ed7vdys/PV21trdmhAAAAAGMW83IAAAAkM0u3c2loaJDD4TA7DAAAAGBMY14OAACAZGbpSnQAAAAAwBjm80mFhVJGhrH3+cyOCAAAJCGS6AAAAAAA6/H5pAULpOZm6exZY79gAYl0AAAQcyTRAQAAAADWU10t2WxSMGi8DgaN1zU15sYFAACSDkl0AAAAAID1tLb2JdB7BYNSS4s58QAAgKRFEh0AAAAAYD25uUbl+YVsNikvz5x4AABA0iKJDgAAAACwHq+3r4WL1Nfaxes1Ny4AAJB0SKID0fL5pMJCKSPD2LNwEQAAADD6PB5p506poECy2429zyfNn292ZAAAIMmMMzsAwFJ8PmnBgr4ql+Zm4/XOncYkHgAAAMDo8XiYhwMAgLijEh2IRnV1XwJd6nt8tKbG3LgAAMCYVVtbqylTpshut6u4uFgHDx4cdPyOHTs0bdo02e12zZgxQ3v27Ak7v2bNGk2bNk0TJkzQhz/8YZWWlurll1+O5y0AAAAACY0kOhCN1ta+BHqvYFBqaTEnHgAAMKZt375dVVVV8nq9ampqUmFhocrKynTq1KmI4w8cOKCFCxdq6dKlOnz4sMrLy1VeXq6jR4+GxuTm5mrDhg1qbm7WSy+9pClTpuiWW27R6dOnR+u2AAAAgIRiCwY/mBFMfJ2dncrMzFRHR4ccDofZ4WCE/H4pEOh/3OmUXK7Rj2dQhYVGC5cL/7Ox2Yz+i0eOmBYWAACwlljNZ4uLi+V2u7VhwwZJUk9Pj3JycrRs2TKtXLmy3/iKigp1dXVp9+7doWM33HCDioqKtHHjxkFjff755/XJT34yLvcBAABGxlK5FSCBDHU+a+me6G63W6mpqaqsrFRlZaXZ4WAY/H4pL086e7b/ObvdKPBOqF/2Xm94T/TevddrdmQAAGCMOX/+vBobG/XAAw+EjqWkpKi0tFT19fURr6mvr1dVVVXYsbKyMu3atWvAr7Fp0yZlZmaqsLBwwFg6OzvDXqenpys9PX2IdwIAAEbCcrkVwIIs3c6loaFBx44dI4FuYYFA5F/yknE80l9RTeXxGIuIFhQY/xIVFBiLjc6fb3ZkAABgjAkEAuru7lZWVlbY8aysLLW1tUW8pq2tbUjjd+/erYkTJ8put+vRRx/Vvn375HQ6B4wlJydHmZmZoW3t2rXDvCsAABAty+VWAAuydCU6YAqPx9gAAACS1M0336wjR44oEAjo8ccf1x133KGXX35Zl19+ecTxJ06cCHv8lSp0AAAAJBNLV6IDAAAAY5XT6VRqaqra29vDjre3tys7OzviNdnZ2UMaP2HCBF199dW64YYb9MQTT2jcuHF64oknBozF4XCEbSTRAQAAkExIogMAAAAWlJaWplmzZqmuri50rKenR3V1dSopKYl4TUlJSdh4Sdq3b9+A4y9833Pnzo08aAAAAMCCaOcCAAAAWFRVVZUWL16s6667Ttdff73Wr1+vrq4uLVmyRJK0aNEiXXnllaEe5cuXL9ecOXO0bt06zZs3T9u2bdOhQ4e0adMmSVJXV5f+4R/+QbfeequuuOIKBQIB1dbW6s0339Ttt99u2n0CAAAAZiKJDlM5ncb6nAOtID3I+lUAAABjXkVFhU6fPq3Vq1erra1NRUVF2rt3b2jxUL/fr5SUvodPZ8+era1bt2rVqlV68MEHNXXqVO3atUvTp0+XJKWmpur48ePavHmzAoGAJk2aJLfbrRdffFHXXnutKfcIAAAGR24FiD9bMBgMmh1EtDo7O5WZmamOjo6wBYxgTX5/5JWinU7J5Rr9eAAAAOItWeazyXIfAABYHbkVYHiGOp+lEh2mc7n4hQ4AGCU+n1RdLbW2Srm5ktcreTxmRwUAAACMCLkVIL6GtbBobW2tpkyZIrvdruLiYh08eHDQ8Tt27NC0adNkt9s1Y8YM7dmzJ+z8mjVrNG3aNE2YMEEf/vCHVVpaqpdffnk4oQEAAETm80kLFkjNzcazrs3Nxmufz+zIAAAAAAAJLOok+vbt21VVVSWv16umpiYVFhaqrKxMp06dijj+wIEDWrhwoZYuXarDhw+rvLxc5eXlOnr0aGhMbm6uNmzYoObmZr300kuaMmWKbrnlFp0+fXr4dwYAAHCh6mrJZpN6O9kFg8brmhpz4wIAAAAAJLSoe6IXFxfL7XZrw4YNkqSenh7l5ORo2bJlWrlyZb/xFRUV6urq0u7du0PHbrjhBhUVFWnjxo0Rv0ZvL5rnn39en/zkJwc8T+9FAAAwZBkZA6+2dObM6MeDMS1Z5rPJch8AAAAYm4Y6n42qEv38+fNqbGxUaWlp3xukpKi0tFT19fURr6mvrw8bL0llZWUDjj9//rw2bdqkzMxMFRYWDhpPZ2dn2Hbu3LlobgcAAIwlublG5fmFbDYpL8+ceAAAAAAAlhBVEj0QCKi7u1tZWVlhx7OystTW1hbxmra2tiGN3717tyZOnCi73a5HH31U+/btk9PpHDSenJwcZWZmhra1a9dGczsAAIwZfr/U1NR/8/vNjmwUeb19LVykvtYuXq+5cQEAAAAAEto4swPodfPNN+vIkSMKBAJ6/PHHdccdd+jll1/W5ZdfPuA1J06cCCuzT09PH41QAQCwFL/fKLYeqJNJS4vkco1+XKPO45F27jR6oLe0GN8Ur1eaP9/syAAAAAAACSyqSnSn06nU1FS1t7eHHW9vb1d2dnbEa7Kzs4c0fsKECbr66qt1ww036IknntC4ceP0xBNPDBqPw+EI20iiAwDQXyAQOYEuGccDgdGNx1Qej3TkiNED/cgREuhAjLjdbuXn56u2ttbsUAAAAICYiyqJnpaWplmzZqmuri50rKenR3V1dSopKYl4TUlJSdh4Sdq3b9+A4y98X3qcAwAAAImvoaFBx44dU2VlpdmhAAAAADEXdTuXqqoqLV68WNddd52uv/56rV+/Xl1dXVqyZIkkadGiRbryyitD/cmXL1+uOXPmaN26dZo3b562bdumQ4cOadOmTZKkrq4u/cM//INuvfVWXXHFFQoEAqqtrdWbb76p22+/PYa3CgAAAAAAAABAdKJOoldUVOj06dNavXq12traVFRUpL1794YWD/X7/UpJ6Stwnz17trZu3apVq1bpwQcf1NSpU7Vr1y5Nnz5dkpSamqrjx49r8+bNCgQCmjRpktxut1588UVde+21MbpNAAAAAAAAAACiZwsGg0Gzg4hWZ2enMjMz1dHREbawKAAA6K+pSZo1a+DzjY3SzJmjFw+A5JnPJst9AAAAYGwa6nw2qp7oAADAepxOyW6PfM5uN84DAAAAAIDIom7nAgAArMXlklpapECg/zmn0zgPAAAAAAAiI4kOAMAY4HKRLAcAAAAAYDho5wIAAAAAAAAAwABIogMAAAAAAAAAMACS6AAAAACA+PL5pMJCKSPD2Pt8ZkcEAAAwZJZOorvdbuXn56u2ttbsUAAAAAAAkfh80oIFUnOzdPassV+wgEQ6ACD2+KMt4sQWDAaDZgcRrc7OTmVmZqqjo0MOh8PscAAAAICoJMt8NlnuA3FWWGgkzi/86GmzSQUF0pEjpoUFAEgyvX+0tdmMf3N69zt3Sh6P2dEhQQ11PmvpSnQAAAAAQIJrbQ1PoEvG65YWc+IBACSn6uq+xLnUl0ivqTE3LiQFkugAAAAARoQ2ixhUbq6RxLiQzSbl5ZkTDwAgOfFHW8TROLMDAAAAAGBtDQ0NtHPBwLzeyI/Xe71mRwYASCa5uZHbh/FHW8QAlegAAAAAgPjxeIx+tAUFkt1u7H0+af58syMDACQTr7fvj7USf7RFTFGJDgAAAACQ3y8FAv2PO52SyzXCN/d4WNQNABBfvX+0rakxWrjk5RkJdP5oixggiQ4AAAAAY5zfb+Qazp7tf85uN3IRI06kAwAQb/zRFnFCEh0AAAAAxrhAIHICXTKOBwIk0QFgLIrrU0qAhZBEBwAAAAAAABCGp5SAPiwsCgAAAAAAACDMUJ5SAsYKkugAAAAAAAAAAAyAdi4AAAAAAADAKKDHOGBNlq5Ed7vdys/PV21trdmhAACAscznkwoLpYwMY+/zmR0RAETF6TT620ZitxvnAQAj09tjfNas/ltennEeQGKydCV6Q0ODHA6H2WEAAICxzOeTFiyQbDYpGJSam43XO3dKHo/Z0QHAkLhcxgJxVEcCQPwMpcc4v2+BxGTpJDoAAIDpqqv7EuiSsbfZpJoakugALMXlInkDAOjT+5RSpMQ/TylhrCGJDgAAMBKtrX0J9F7BoFHSCQAAAFgUTykBfUiiAwAAjERurtHC5cJEus1mNLYExgi3263U1FRVVlaqsrLS7HAAAECM8JQSYCCJDgAAMBJeb3hP9N6912t2ZMCoYa0iAAAAJLMUswMAAACwNI/HWES0oMBoDllQYCw2On++2ZEBQPR8PqmwUMrIMPY+n9kRAUDS6O0xHgk9xoHERiU6AADASHk8LCIKwPp8vvAna5qbjdc7d/I7DgBigB7jgHWRRAcAAAAASNXVfQl0qa9FVU0NSXQAiBF6jAPWRDsXAAAAAIDU2hq+SLJkvG5pMSceAACABEESHQAAAAAg5eYalecXstmkvDxz4gEAAEgQJNEBAAAAAJLX29fCRepr7eL1mhsXAACAyUiiAwAAAACMvuc7d0oFBZLdbux9Pmn+fLMjAwAAMJWlFxZ1u91KTU1VZWWlKisrzQ4HAAAAAKzN42ERUQAAgA+wdBK9oaFBDofD7DAAAAAAAAAAAEmKdi4AAAAAAAAAAAyAJDoAAAAAAAAAAAMgiQ4AAAAAAAAAwABIogMAAAAYEbfbrfz8fNXW1podCgAAABBzll5YFAAAAID5Ghoa5HA4zA4DAAAAiAsq0QEAAAAAAAAAGABJdAAAAAAAAAAABkASHQAAAAAAAAAG4vNJhYVSRoax9/nMjgijjCQ6AAAAAAAAAETi80kLFkjNzdLZs8Z+wQIS6WMMSXQAAAAAAAAAiKS6WrLZpGDQeB0MGq9rasyNC6OKJDoAAAAAAAAARNLa2pdA7xUMSi0t5sQDU1g6ie52u5Wfn6/a2lqzQ0GiomcVAAAAAAAAhis316g8v5DNJuXlmRMPTDHO7ABGoqGhQQ6Hw+wwkKh6e1b1PnLT27Nq507J4zE7OgAAAAAAACQ6rzc8v9S793rNjgyjyNKV6MCg6FkFAADGgNraWk2ZMkV2u13FxcU6ePDgoON37NihadOmyW63a8aMGdqzZ0/o3Pvvv69vfOMbmjFjhiZMmKDJkydr0aJFeuutt+J9GwAAAInJ4zEKMgsKJLvd2Pt80vz5ZkeGUUQSHcmLnlUAACDJbd++XVVVVfJ6vWpqalJhYaHKysp06tSpiOMPHDighQsXaunSpTp8+LDKy8tVXl6uo0ePSpLee+89NTU16aGHHlJTU5N8Pp9aWlp06623juZtAQAAJBaPRzpyRDpzxtiTQB9zbMHgB7OMia+zs1OZmZnq6OignQsGVlhotHC58EfcZjP+YnjkiGlhAUAy8fulQKD/cadTcrlGPx7AKmI1ny0uLpbb7daGDRskST09PcrJydGyZcu0cuXKfuMrKirU1dWl3bt3h47dcMMNKioq0saNGyN+jYaGBl1//fV644035PrAf9jMywEAQLT4DIFEMtT5rKV7ogODomcVAMSV32+spXP2bP9zdrvx4A+TYCB+zp8/r8bGRj3wwAOhYykpKSotLVV9fX3Ea+rr61VVVRV2rKysTLt27Rrw63R0dMhms+nSSy8dcExnZ2fY6/T0dKWnp1/8JgAAwJjCZwhYFe1ckLzoWQUAcRUIRJ78SsbxSNUlAGInEAiou7tbWVlZYcezsrLU1tYW8Zq2traoxp89e1bf+MY3tHDhwkErc3JycpSZmRna1q5dG+XdAACAsYDPELAqKtGR3DweYwMAAEBU3n//fd1xxx0KBoP6l3/5l0HHnjhxIizJThU6AAAAkglJdAAAAMCCnE6nUlNT1d7eHna8vb1d2dnZEa/Jzs4e0vjeBPobb7yhn/3sZxftd+5wOOiJDgAAgKQ1rHYutbW1mjJliux2u4qLi3Xw4MFBx+/YsUPTpk2T3W7XjBkztGfPntC5999/X9/4xjc0Y8YMTZgwQZMnT9aiRYv01ltvDSc0WJXPZywEmpFh7H0+syMCAABIaGlpaZo1a5bq6upCx3p6elRXV6eSkpKI15SUlISNl6R9+/aFje9NoL/22mt6/vnnNWnSpPjcAAAAAGARUSfRt2/frqqqKnm9XjU1NamwsFBlZWU6depUxPEHDhzQwoULtXTpUh0+fFjl5eUqLy/X0aNHJUnvvfeempqa9NBDD6mpqUk+n08tLS269dZbR3ZnsA6fz1gAtLnZaIDV3Gy8JpEOAAAwqKqqKj3++OPavHmzXn31Vd17773q6urSkiVLJEmLFi0KW3h0+fLl2rt3r9atW6fjx49rzZo1OnTokO677z5JRgL9c5/7nA4dOqQtW7aou7tbbW1tamtr0/nz5025RwAAAMBstmAwGIzmguLiYrndbm3YsEGSUe2Sk5OjZcuWaeXKlf3GV1RUqKurS7t37w4du+GGG1RUVKSNGzdG/BoNDQ26/vrr9cYbb8gVYUnezs5OZWZmqqOjg8dGR5HfH3mBB6dzhCsnFxYaifMLfxRtNmMh0CNHRvDGAIB48vulvLzICwPZ7VJLywj/fQCSWCznsxs2bNB3vvMdtbW1qaioSN///vdVXFwsSbrppps0ZcoUPfXUU6HxO3bs0KpVq/S73/1OU6dO1be//W195jOfkST97ne/01VXXRXx67zwwgu66aab4nYfAAAg+fEZAolmqPPZqHqinz9/Xo2NjWHVLCkpKSotLVV9fX3Ea+rr61VVVRV2rKysTLt27Rrw63R0dMhms+nSSy8dNJ7Ozs6w1+np6SxiFCdx/SXX2hqeQJeM1y0tw3xDAMBocLmMX9Vx+QMrgCG77777QpXkH7R///5+x26//XbdfvvtEcdPmTJFUdbYAAAADBmfIWBVUSXRA4GAuru7lZWVFXY8KytLx48fj3hNW1tbxPFtbW0Rx589e1bf+MY3tHDhwotWs+Tk5IS99nq9WrNmzUXuAsMRCEROoEvG8UBgBL/ocnMjV6Ln5Q3zDQEAo8XlYqILAAAAYOj4DAEriiqJHm+9ixgFg0H9y7/8y0XHnzhxIizRThW6RXm9Rg90m81IpPfuvV6zIwMAAAAAAAAwxkW1sKjT6VRqaqra29vDjre3tys7OzviNdnZ2UMa35tAf+ONN7Rv374h9VR0OBxhG0l0i/J4pJ07jR7odrux9/mk+fPNjgwAAAAAAADAGBdVEj0tLU2zZs1SXV1d6FhPT4/q6upUUlIS8ZqSkpKw8ZK0b9++sPG9CfTXXntNzz//vCZNmhRNWEgGHo+xiOiZM8aeBDoAAAAAAACABBBVEl2Sqqqq9Pjjj2vz5s169dVXde+996qrq0tLliyRJC1atChs4dHly5dr7969WrdunY4fP641a9bo0KFDocWP3n//fX3uc5/ToUOHtGXLFnV3d6utrU1tbW06f/58jG4TAAAAAJKMzycVFkoZGcbe5zM7IgAAgKQUdU/0iooKnT59WqtXr1ZbW5uKioq0d+/e0OKhfr9fKSl9ufnZs2dr69atWrVqlR588EFNnTpVu3bt0vTp0yVJb775pp599llJUlFRUdjXeuGFF3TTTTcN89YQS06n0Wkl0uKidrtxHgAAAMAo8fnC1xVqbjZe79xpPOUJAACAmLEFg8Gg2UFEq7OzU5mZmero6BhS73TEht8vBQL9jzudrKoMAAAQjWSZzybLfVhSYaGROL/w45zNZqwvdOSIaWEBAABYyVDns1FXomPscrlIlgMAAKA/t9ut1NRUVVZWqrKy0uxwEkrcClFaW8MT6JLxuqVlBG8KAACASEiiAwAAABiRhoYGKtEj8PulvLyBWyK2tIwgkZ6bG7kSPS9vmG8IAACAgUS9sCgAAABGAQsGApYXCEROoEvG8UgV6kPl//IjagoWqUkz1aQ/N/bBIvm//Mjw3xQAAAARUYkOAACQaFgwEMAg/H4p7yuf1ll9ut85+3KpZS5tGAEAAGKJSnQAAIBEU13dl0CXjL3NJtXUmBsXgIQQzwp3AAAA9EcSHQAAINGwYCAAAAAAJAxLt3Nxu91KTU1VZWWlKisrzQ4HAAAgNlgwEAAAAIiK3x/5aSynkzZnGDlLJ9EbGhrkcDjMDgMAAMRQvCa/lppUe73hPdF7916v2ZEBiILTKdntkVuv2O3GeQAAMHJ+v1FvMtC/uS0tCTjnh6VYOokOAACSS7wmv5abVHs8xiKiNTVGcHl5RgJ9/nyzIwMQBZfL+E/YMn/AAwDAooayXgj/7mIkSKIDAICEEa/JryUn1R6PsQGwNJcr9r9fqHAHAAAYXSTRAQAAAMBCqHAHAAAYXSTRAQAAAMBi4lHhDgAAgMhSzA4AAAAAAAAAAIBERRIdAAAAAAAAgGX1rhcSCeuFIBZo5wIAABJGvBbLYxE+IL7cbrdSU1NVWVmpyspKs8MBAABjDOuFIN5IogMAgIQRr8kvk2ogvhoaGuRwOMwOAwAAjGGsF4J4IokOAAASSrwmv0yqAQAAAADDQU90AAAAAAAAAAAGQBIdAAAAAAAAAIABWDqJ7na7lZ+fr9raWrNDAQAAAAAAAAAkIUv3RGcBIwAAAAAAAABAPFm6Eh0AAAAAAAAAgHgiiQ4AAAAAAAAAwABIogMAAAAAAAAAMACS6AAAAAAAAAAwmnw+qbBQysgw9j6f2RFhECTRAQAAAAAAAGC0+HzSggVSc7N09qyxX7CARHoCI4kOAAAAAAAAAKOlulqy2aRg0HgdDBqva2rMjQsDGmd2AAAAAAAAAACQiPx+KRDof9zplFyuYb5pa2tfAr1XMCi1tAzzDRFvJNEBAAAAjIjb7VZqaqoqKytVWVlpdjgAAAAx4fdLeXlGx5UPstuNnPewEum5uUYLlwsT6Tab8cWQkEiiAwAAABiRhoYGORwOs8MAAACIqUAgcgJdMo4HAsNMonu9Rg/03pYuvXuvd0TxIn7oiZ6E/H6pqan/5vfH4M1ZORgAAAAAAAAYPo9H2rlTKigwStoLCowc2/z5ZkeGAVCJnmTi9piJ1LdycO9fx3pXDt650/iPHwAAAAAAAMDFeTzk0yzE0pXobrdb+fn5qq2tNTuUhDGUx0yGjZWDAQAAAAAAAIwxlq5Ep/fiKGPlYAAAAAAAAABjjKUr0THKcnONyvMLsXIwAAAAAAAAkpDTabRHjsRuN85jbLB0JTpGGSsHAwAAAAAAYIxwuYwGDJHaIzudI1h3EJZDEh1D17tycE2N8RskL89IoLNyMAAAAAAAAJKQy0WyHLRzSTpxf8zE45GOHJHOnDH2JNABALAWn08qLJQyMoy9z2d2RAAAAACQ0KhETzI8ZgIAAAbk84W3ZmtuNl7v3Gn8oRwAAAAA0A9J9CTEYyYAACCi6uq+BLrUt8ZJTQ1JdAAAAAAYAO1cAAAAxorW1r4Eeq9g0HiMDQAAAAAQEUl0AACAsSI316g8v5DNZiwWDgAAAACIiCQ6AADAWOH19rVwkfpau3i95sYFy3O73crPz1dtba3ZoQAAAAAxRxIdAABgrPB4jEVECwoku93Y+3zS/PlmRwaLa2ho0LFjx1RZWWl2KInJ55MKC6WMDGPv85kdEQAAAKLAwqIAAABjicfDIqLAaPL5pAUL+p78aG42Xu/cyX+LAAAAFmHpSnQeGwUAAACQ0Kqr+xLoUl9LpZoac+MCAADAkFm6Er2hoUEOh8PsMAAAAAAgstbWvgR6r2BQamkxJx4AAABEzdKV6AAAAACQ0HJz+xbz7WWzSXl55sQDAACAqJFEBwAAAIB48Xr7WrhIfa1dvF5z4wIAAMCQkUQHAAAAgHjxeIxFRAsKJLvd2Pt80vz5ZkcGAACAIbJ0T/Rk4PdLgUD/406n5HKNfjwAAAAAYszjMTYAAABYEkl0E/n9RivEs2f7n7PbjbWGSKQDAAAAAAAAyYOiWuuhnYuJAoHICXTJOB7pPyYAAACgV21traZMmSK73a7i4mIdPHhw0PE7duzQtGnTZLfbNWPGDO3ZsyfsvM/n0y233KJJkybJZrPpyJEjcYweAABg7Oktqp01q/+Wl2ecR+IhiQ4AAABY0Pbt21VVVSWv16umpiYVFhaqrKxMp06dijj+wIEDWrhwoZYuXarDhw+rvLxc5eXlOnr0aGhMV1eXbrzxRn3rW98ardtIGH6/1NTUf+ODLAAAiCWKaq1pWEl0Kl4AAAAAc33ve9/T3XffrSVLlig/P18bN27UJZdcoieffDLi+Mcee0xz587VihUrdM011+jhhx/WzJkztWHDhtCYu+66S6tXr1Zpaelo3UZCoCIMAAAkDZ9PKiyUMjKMvc9ndkRJIeokOhUvAAAAgLnOnz+vxsbGsGR3SkqKSktLVV9fH/Ga+vr6fsnxsrKyAcePJVSEAQCApODzSQsWSM3NxiSmudl4TSJ9xKJOolPxAgAAAJgrEAiou7tbWVlZYcezsrLU1tYW8Zq2traoxkejs7MzbDt37tyI3xMAAABRqq6WbDYpGDReB4PG65oac+NKAlEl0ROt4sXqk3WnU7LbI5+z243zw8ajGwAAWBa9mWE1OTk5yszMDG1r1641OyQAAICxp7W1L4HeKxiUWlrMiSeJjItm8GAVL8ePH494TTwrXnJycsJee71erVmzZsTvO1pcLuNnONLjoU6ncX5Yeh/d6P3LU++jGzt3Sh7PiGIGAADx1dubOVJrCbvdmDsMe46ApOF0OpWamqr29vaw4+3t7crOzo54TXZ2dlTjo3HixAk5HI7Q6/T09BG/JwAAQDLqLaodaL4/oqLa3FwjD3hhIt1mMz5gYESGtbBoojhx4oQ6OjpC2wMPPGB2SFFzuaSZM/tvI/pwzKMbAABYFr2ZMRRpaWmaNWuW6urqQsd6enpUV1enkpKSiNeUlJSEjZekffv2DTg+Gg6HI2wjiQ4AABBZb1FtY2P/bcQFM15vXx5Q6ssPer0jD3yMd72IqhI90Speeifp+AAe3QAAAEh6VVVVWrx4sa677jpdf/31Wr9+vbq6urRkyRJJ0qJFi3TllVeGWqssX75cc+bM0bp16zRv3jxt27ZNhw4d0qZNm0Lv+cc//lF+v19vvfWWJKnl/80fs7OzYzJ/T1RxrQgDAAD4AJcrTk+XejxGJ4qaGiMPmJdnJNDnzx/Z+9L1IrpK9ESreMEAcnP7/uLUi0c3AAAAkkpFRYW++93vavXq1SoqKtKRI0e0d+/eUCtFv9+vkydPhsbPnj1bW7du1aZNm1RYWKgf/ehH2rVrl6ZPnx4a8+yzz+rP//zPNW/ePEnSnXfeqT//8z/Xxo0bR/fmRlmoIuw7P1Pj1RVqTCsx9t/5GS2UAACAtXg80pEj0pkzxn6kCXSJrheSbMHgB0uWB7d9+3YtXrxY//qv/xqqePnhD3+o48ePKysrq1/Fy4EDBzRnzhw98sgjoYqXf/zHf1RTU1Nown5hxUvvmLy8vAErXjo7O5WZmamOjg4q0SP54F+Hevc+X2z+wwEAAHHT1CTNmjXw+cZGo/UbrC1Z5rPJch+SBp5Dj6EKKwAAgIgyMgZ+ZO/MmdGPJ4aGOp+Nuic6FS8W0PvoRkGB8cNcUEACHQAAABgMFVYAAACR0fUi+kr0RJBUFS8AAMDS/P7Ii306ncNrAeH3G3PRgQo9aC2RHJJlPpss9yEpqSusAAAARiSJu14MdT4b1cKiAAAA6BOPhHdvb+ZYJuZHhc9nVPK2thqVKl4vLTBgLbm5xiJZF9YYjbEKKwAAgIjitWCphZBEBwAAGKZAIHICXTKOBwLDS3q7XAmcLI/kg5Upzc3Ga3pJw0q83sgVVl6v2ZEBAACYz+MZ03P7qHuiAwAAAGHoJY1kwLpCAAAAGACV6AAAABiZ1tbwFhiS8bqlxZx4gOEa4xVWAAAAiIxKdAAAAIxMbq5ReX4hekkDAAAASBIk0QEAADAyXm9fCxeJXtIAAAAAkoqlk+hut1v5+fmqra01OxQAADAGOZ1G6+RI7Hbj/JhAL+kxj3k5AAAAkpktGPxgA8vE19nZqczMTHV0dMjhcJgdzsj5fMaCXK2txuPQXi+9GAEAsAi/XwoE+h93OiWXa/TjgTUky3zWrPvgvzsAAADEwlDnsywsajafT1qwoO+x5+Zm4/XOnSTSAQCwAJeLpB0wmvx+o93+2bP9z9ntxnq2/DcJAACAWLJ0O5ekUF3dl0CX+vqJ1tSYGxcAAACQgAKByAl0yTgeqUIdAAAAGAmS6GZrbe1LoPcKBo0SGgAAAAAAAACAqUiimy0316g8v5DNZjyjCgAAAAAAAAAwFUl0s3m9fS1cpL7WLl6vuXEBAAAAAAAAAFhY1HQej7GIaE2N0cIlL89IoM+fb3ZkAAAAAAAAACzC74+8PozTycLrI0USPRF4PMYGAAAAYFBOp2S3R15c1G43zgMAAIw1fr9RmzvQHKmlJUET6T6fVF1trBuZm2sUFydgnpQkOgAAAADLcLmMD4FUWQEAAPQJBCIn0CXjeCCQgPMkn09asKCvvXVzs/F6586ES6TTEx0AAACJyeeTCguljAxj7/OZHREShMslzZzZf0u4D4YAAAAYWHV1XwJd6ls3sqbG3LgioBIdAABgjLBUj0QLVaUAAAAAGIbW1r4Eeq9g0HjsMMGQRAcAABgDLNcjcbCqFJLoAAAAgPXl5hrFMhcm0m0244NLgrF0Oxe32638/HzV1taaHQoAAEBCG0qPxIRioaoUmIR2PwAAAKPC75eamvpvfv8I39jr7SuWkfqKaLzeEccca5auRG9oaJDD4TA7DAAAAMSahapSYBS3pKamqrKyUpWVlfH/grT7AQAACON0Gk+YDvTkqdM5vPeN6xOtHo8xf6upMd4oL89IoM+fP8w3jB9LJ9EBAACQpLze8CRpAlelwITiFtr9AAAAhHG5jDx0rNdAGsoTrSNqC+nxWGL+RhJ9iCy1EBcAAIDVWagqBSag3Q8AAEA/Lhd5ynghiT4ElluICwAAIBlYpCoFJqDdDwAAAEaRpRcWHS2WW4gLAADgA3p7JEYykh6JgCkstAgVAAAArI9KdAAAgDEgXj0SAVPQ7gcAAACjiCQ6AADAGEGPRCQV2v0AAADEXe8TrQO1uR4rT7SSRAcAAAAAAAAA9MMTrQaS6AAAAAAAAACAiHiilYVFh8TplOzjuyOes4/vHjOPLQAAAAAAAADAWEMl+hC4XFLLxz+jwPGApOAFZ2xyXv0RuVx7zQoNAAAAAAAAABBHJNGHyPW7X8ilCB30X7ePfjAAAAAAAAAAgFFh6XYubrdb+fn5qq2tjf8Xy82VbLbwYzablJcX/68NAACA2PH5pMJCKSPD2Pt8ZkcEAAAAIIFZuhK9oaFBDodjdL6Y1ystWGAkzoPBvr3XOzpfHwAAACPn84XP6Zqbjdc7d0oej9nRAQAAAEhAlq5EH1Uej/HhqqBAstuNvc8nzZ9vdmQAAAAYqurqvgS61FccUVNjblwWN6pPiAIAAACjzNKV6KPO46FCCQAA4AP8fikQ6H/c6TQWaE8ora19CfRewaDU0mJOPEliVJ8QBQAAAEYZSXQAAAAMm99vLBFzNsL663a7kZtOqER6bq7RwuXCRDrr3AAAAAAYBEl0AAAADFsgEDmBLhnHA4HhJdHjVt3OOjcAAAAAokQSHQAAAAklrtXtvevc1NQYb5SXZyTQWecGAAAAwABIogMAACChxKu6PYR1bgAAAABEgSQ6AAAAxgxLLYIKAAAAJDErzc1JogMAAGBMsNwiqAAAAECSstrcPMXsAAAAAGBdTqcxyY3EbjfOJ4qhtIkBAAAAEH9Wm5tTiQ4AAIBhc7mMKhGrPIYJAAAAANEiiQ4AAIARcblimyzvrW4f6NHORKpuBwAAAJD8SKIDAAAgoVDdDgAAACCRWDqJ7na7lZqaqsrKSlVWVpodDgAAAGIk1tXtAAAAADBclk6iNzQ0yOFwmB0GAAAALIA2MQAAAEBisNrc3NJJdAAAAGCoaBMTPzwhCgAAgGhYbW5OEh0AAABjBm1i4oMnRAEAABAtK83NU8wOAAAAAAAAAACAREUSHQAAAAAAAACAAZBEBwAAAAAAAABgACTRAQAAAAAAAAAYwLCS6LW1tZoyZYrsdruKi4t18ODBQcfv2LFD06ZNk91u14wZM7Rnz56w88FgUKtXr9YVV1yhjIwMlZaW6rXXXhtOaAAAAAAAAAAAxEzUSfTt27erqqpKXq9XTU1NKiwsVFlZmU6dOhVx/IEDB7Rw4UItXbpUhw8fVnl5ucrLy3X06NHQmG9/+9v6/ve/r40bN+rll1/WhAkTVFZWprNnzw7/zgAAAAAAAAAAGCFbMBgMRnNBcXGx3G63NmzYIEnq6elRTk6Oli1bppUrV/YbX1FRoa6uLu3evTt07IYbblBRUZE2btyoYDCoyZMn62tf+5r+/u//XpLU0dGhrKwsPfXUU7rzzjv7vWdnZ6cyMzPV0dEhh8MR1Q0DAAAAZkuW+Wyy3AcAAADGpqHOZ6OqRD9//rwaGxtVWlra9wYpKSotLVV9fX3Ea+rr68PGS1JZWVlo/Ouvv662trawMZmZmSouLh7wPQEAAAAYaLUIAAAAxFdUSfRAIKDu7m5lZWWFHc/KylJbW1vEa9ra2gYd37uP5j17dXZ2hm3nzp2L5nYAAAAAS6PVIgAAABB/w1pYNFHk5OQoMzMztK1du9bskAAAAIBR873vfU933323lixZovz8fG3cuFGXXHKJnnzyyYjjH3vsMc2dO1crVqzQNddco4cfflgzZ84MtWoMBoNav369Vq1apdtuu00FBQX693//d7311lvatWvXKN4ZAAAAkDiiSqI7nU6lpqaqvb097Hh7e7uys7MjXpOdnT3o+N59NO/Z68SJE+ro6AhtDzzwQDS3AwAAAFgWrRYBAACA0RFVEj0tLU2zZs1SXV1d6FhPT4/q6upUUlIS8ZqSkpKw8ZK0b9++0PirrrpK2dnZYWM6Ozv18ssvD/ievRwOR9iWnp4eze0AAAAAlpVIrRZpswgAAIBkFnU7l6qqKj3++OPavHmzXn31Vd17773q6urSkiVLJEmLFi0Kqwhfvny59u7dq3Xr1un48eNas2aNDh06pPvuu0+SZLPZ9JWvfEXf/OY39eyzz6q5uVmLFi3S5MmTVV5eHpu7vIhz585pzZo1TPZhOn4WkSj4WUQi4OcQiYKfxYuLZZtFvt9IBPwcIlHws4hEwc8iEoGZP4dRJ9ErKir03e9+V6tXr1ZRUZGOHDmivXv3hqpV/H6/Tp48GRo/e/Zsbd26VZs2bVJhYaF+9KMfadeuXZo+fXpozNe//nUtW7ZM99xzj9xut959913t3btXdrs9Brd4cefOnVN1dTW/CGA6fhaRKPhZRCLg5xCJIlF/FhOp1WIs2ywm6vcbYws/h0gU/CwiUfCziERg5s/hsBYWve+++/TGG2/o3Llzevnll1VcXBw6t3//fj311FNh42+//Xa1tLTo3LlzOnr0qD7zmc+EnbfZbKqpqVFbW5vOnj2r559/Xrm5ucMJLanV1taaHcJFJXqMiR6fVST69zHR45OsEWOis8L3kBjHBit8DxM9xkSPL1ElUqvFsdZm0Qo/s8Q4Nljhe5joMSZ6fFaR6N/HRI9PskaMic4K30NitK5hJdFhDiv8ECd6jIken1Uk+vcx0eOTrBFjorPC95AYxwYrfA8TPcZEjy+RJWOrRSuwws8sMY4NVvgeJnqMiR6fVST69zHR45OsEWOis8L3kBita5zZAQxHMBiUZFTFxELv+8Tq/eKlu7ubGEco0ePjZzE2Ej0+KfFjtMLPYqJ/DyViHCkr/BxKif097JXoMSZ6fPH4Wex9r9557XBVVFTo9OnTWr16tdra2lRUVNSv1eL/3979hVZZ/3EA/5w5Zji9qFweLSEsTW2zxfxDaUZhedFFkkTUsGZkdBl2kUTpTdchURDEJOwiLIwuuqhgF0EkFMvNXG2BERVtR00atsHE7XQxPL+WnbKf7jzf7Xm94ID7+kw/7Dl8vm8+++5ZXd3/zs1ceNTiiy++GC+88EIsX778bx+1ODIyEk8//XT89ttvsWnTpqqPWrzSufzP/1bK74nU37MRarxcM+F9GJH21/CC1GtMvT7vxSsj9foi0q9xJrwXU/8aRqjxcmWZywvly03uGfj5559j6dKlWZcBAACX5aeffoobbrgh6zL+b3I5AACzwb/l8hk5RJ+YmIhffvklFixYEIVCIetyAADgPymXy3H27NlYsmTJlJPiM41cDgDATHapuXxGDtEBAAAAAKAWZu6xFwAAAAAAmGaG6AAAAAAAUIUhOgAAAAAAVGGIDonq7++Pa6+9Nm666aZobW2N+fPnx6ZNm7Iuixx4/fXX48Ybb4yrrroqNmzYEF988UXWJZEz+h8AKbEvkRW5nBTogTDJEB0StXLlytiwYUN88MEH0dPTE9dff318/PHHWZfFLHfo0KHYvXt37Nu3L7766qu47bbbYuvWrXHy5MmsSyNH9D8AUmJfIgtyOanQA2GSIfpfrFq1KgqFwt++XnvttazLI2cGBgbilltuidHR0RgfH4/GxsasS2KWe+WVV2LXrl2xc+fOWL16dbzxxhsxb968OHDgQNalkTP6HymQC7PnHpAK+xK1JpeTEj2QrKWQCQ3R/+Lw4cMREdHV1RWDg4Pxww8/RF1dXbz33nuxa9eujKsjT86ePRtz586NhoaG6Ovri1WrVmVdErPcuXPnoru7O7Zs2VJZq6uriy1btsSRI0cyrIy80f9IhVyYPfeAFNiXqDW5nJTogaQghUxoiP4XpVIp6uvrY+PGjVEsFuP06dMxMTERd911V8ydOzfr8siRb775JlavXh0REd9++22sWLEi44qY7U6fPh3j4+OxaNGiKeuLFi2KoaGhjKoij/Q/UiEXZs89IAX2JWpNLicleiApSCET5mKIvmfPnqpH/i+8+vv7IyLi66+/jhUrVlRuQG9vb1x33XUXbV4w3fr6+uLWW2+NiIjGxsb45JNP4tdff824KoDpp/+RCrlwesjmzDT2JSDP9EBSkEImrK/Z/5Sh5557Ljo6Ov7xmmXLlkVExLFjx6KlpaWy3tvbO+VjqJUnn3yy8uft27fH9u3bM6yGPFi4cGHMmTMnSqXSlPVSqRTFYjGjqsgj/Y9UyIXTQzZnprEvUWtyOSnRA0lBCpkwFyfRm5qaYuXKlf/4amhoiIjJm7JmzZrK5/b29k75GC7Xfzl9BbXU0NAQbW1t0dXVVVmbmJiIrq6uuOOOOzKsDCAbcuH0kM1JhVxOquRygKlSyIS5OIl+qSYmJqKvry/27t1bWTtx4kQ89NBDGVbFbHOpp68KhcI/XlMul69gVTBp9+7d8cQTT8TatWtj/fr1sX///hgZGYmdO3dmXRo5ov+RArkwe+4B000uJ2VyOanQA8laKpnQEP1PTpw4EaOjo1O+k9HS0hL79u2Ltra22LhxY4bVMVs0NTVFU1PTv173448/xo4dO+LkyZNRX18fL730Ujz88MM1qJA8e+SRR+LUqVOxd+/eGBoaitbW1vjoo488e5aa0v9IgVyYPfeA6SaXkzK5nFTogWQtlUxYKPuWESRpcHAwSqVStLa2xtDQULS1tcV3330XjY2NWZcGMK30PwBSYl8C8kwPhElOokOiFi9eHIsXL46IiGKxGAsXLowzZ87YqIBZT/8DICX2JSDP9ECYlItfLAozXXd3d4yPj8fSpUuzLgWgpvQ/AFJiXwLyTA8kz5xEh8SdOXMmHn/88XjzzTezLgWgpvQ/AFJiXwLyTA8k75xEh4SNjY3Ftm3bYs+ePXHnnXdmXQ5Azeh/AKTEvgTkmR4IhuiQrHK5HB0dHXHvvffGjh07si4HoGb0PwBSYl8C8kwPhEmFcrlczroI4GKfffZZbN68OdasWVNZe/vtt6OlpSXDqgCmn/4HQErsS0Ce6YEwyRAdAAAAAACq8DgXAAAAAACowhAdAAAAAACqMEQHAAAAAIAqDNEBAAAAAKAKQ3QAAAAAAKjCEB0AAAAAAKowRAcAAAAAgCoM0QEAAAAAoApDdAAAAAAAqMIQHQAAAAAAqjBEB8i5I0eORKFQiAceeCDrUgAAILfkcoB0FcrlcjnrIgDIzlNPPRWjo6Px/vvvx/fffx9LlizJuiQAAMgduRwgXU6iA+TY77//HocOHYpnn3027rnnnnjrrbcuuqa5uTlefvnleOaZZ+Lqq6+OYrEY+/fvr3mtAAAwW8nlAGkzRAfIsXfffTeKxWKsX78+2tvb48CBA/HnH1AaGxuLgYGBOHjwYNx9993x5ZdfRnt7ezz//PMxMjKSYeUAADB7yOUAaTNEB8ixzs7OaG9vj4iIbdu2xeDgYHz66aeVvz9+/HicP38+Xn311Xj00Ufj5ptvjo6Ojjh37lyMjo5mVTYAAMwqcjlA2gzRAXJqYGAgPv/880pYnz9/fjz44IPR2dlZuaa3tzeKxWJs3bq1snbq1KloaGiIa665puY1AwDAbCOXA6TPEB0gpzo7O2PdunWxfPnyylp7e3scPnw4hoeHIyKip6cn1q5dG4VCoXJNT09PNDc3x5w5c2peMwAAzDZyOUD6DNEBcuj8+fNx8ODBeOyxx6as33///TFv3rx45513ImLyxEtra+uUa3p6ei5aAwAA/ju5HGBmMEQHyKEPP/wwSqVSNDc3x/HjxyuvgYGB2Lx5c+VHR/8urB89elRYBwCAK0AuB5gZ6rMuAIDauxDG77vvvqrXHDt2LIaHh6cE87Gxsejv74/bb799uksEAIBZTy4HmBkK5XK5nHURAMwM3d3dsW7duhgeHo4FCxZkXQ4AAOSSXA5QWx7nAsAlO3r0aCxbtkxQBwCADMnlALVliA7AJfPLiwAAIHtyOUBteZwLAAAAAABU4SQ6AAAAAABUYYgOAAAAAABVGKIDAAAAAEAVhugAAAAAAFCFIToAAAAAAFRhiA4AAAAAAFUYogMAAAAAQBWG6AAAAAAAUIUhOgAAAAAAVGGIDgAAAAAAVRiiAwAAAABAFX8AyogkMBN/c1sAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_eta_c_l0 = files[\"test\"][\"Nominal/h_delta_eta_c_l0_WW\"]\n", + "h_delta_eta_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_delta_eta_c_l0_WW\"]\n", + "\n", + "h_delta_eta_l1_l2 = files[\"test\"][\"Nominal/h_delta_eta_l1_l2_WW\"]\n", + "h_delta_eta_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_delta_eta_l1_l2_WW\"]\n", + "\n", + "values1, edges1 = h_delta_eta_c_l0.to_numpy()\n", + "values2, edges2 = h_delta_eta_c_l0_noCR.to_numpy()\n", + "values3, edges3 = h_delta_eta_l1_l2.to_numpy()\n", + "values4, edges4 = h_delta_eta_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\Delta\\eta$')\n", + "ax1.set_title(r'$\\Delta\\eta$: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\Delta\\eta$')\n", + "ax2.set_title(r'$\\Delta\\eta$: W2 $\\rightarrow$ $q_1q_2$')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "bfcdbdf8-9668-4302-8e1f-df588e50be8c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9aklEQVR4nOzdf3yT9b3//2daKEFciiPSgmtWnLRYoe2XUmqZE7d1FnUqlGnlbKLMuakV3epxoh80gOeIP4ayM3rGcGebO4Mj4xDRcfyg2AnHH52WFlxVaHVHCSptyTy2Wixom+8f16cpoQk0bdMrV/K4327X7SLX9b6S15WE5J1X39frbfP7/X4BAAAAAAAAAIA+kswOAAAAAAAAAACAWEUSHQAAAAAAAACAMEiiAwAAAAAAAAAQBkl0AAAAAAAAAADCIIkOAAAAAAAAAEAYJNEBAAAAAAAAAAiDJDoAAAAAAAAAAGGQRAcAAAAAAAAAIAyS6AAAAAAAAAAAhEESHQAAAAAAAACAMEiiAwAAAAAAAAAQBkl0ADBZQUGB5s2bZ3YYAAAAQEKjXz58li1bJpvNZnYYANBvJNEBYAj967/+q2w2m4qKivrV3u/3a9++fcrJyRnwY/7xj3+UzWbTE0880WdfXl6ebDabnn/++T77XC6XZs2aJUn65JNP5Ha7NWfOHH3xi1+UzWbT7373uwHHBAAAAJjJqv3y2tpa3XzzzTrnnHM0ZswYuVwuXXnllWpqahpwXACAwSOJDgBDaP369UpJSdGrr76qt99++6Tt3333XR0+fHhQnfXzzjtPkvTiiy8GbW9vb9frr7+uESNG6KWXXgrad+DAAR04cCBwrM/n04oVK7R3717l5eUNOBYAAAAgFli1X/7AAw9o8+bN+uY3v6mf//zn+uEPf6j//u//1vTp0/X6668PODYAwOCQRAeAIfLOO+/o5Zdf1tKlSzVy5EitX7/+pMe8+eabkjSozvrEiRM1adKkPp31mpoa+f1+XXHFFX329dzu6axPmDBBBw8e1P79+/XQQw8NOBYAAADAbFbul1dWVmr//v36l3/5F/3gBz/Q0qVL9cILL+jzzz/X/fffP+DYAACDQxIdAIbI+vXrlZycrB/+8If61re+dcLO+hNPPBFUc/FrX/uavvvd76qtrS2o3b59++T1ek/62Oedd552796tTz/9NLDtpZde0jnnnKOLLrpIf/nLX9Td3R20z2az6atf/aokadSoUUpPT4/ofM3y/vvv67rrrtPEiRM1atQoTZo0STfeeKOOHj0qSfr444/14x//WJmZmRo1apTGjx+vb33rW6qvrzc5cgAAAAwHK/fLZ82apZSUlKD7nDx5ss455xzt3bv35Cc/TK699lplZmb22R6q1vmLL76owsJC2e12feUrX9GvfvWrYYoSAIYOSXQAGCLr16/X+eefr7S0NF155ZV66623VFtb26fdQw89pLKyMmVnZ2vKlCn68pe/rO9973vasGGDbrzxxqC2Z599thYuXHjSxz7vvPP02Wef6ZVXXglse+mllzRr1izNmjVLbW1tQZd/vvTSS5oyZYrGjRs3iDMemLvvvluPPvrogI794IMPNHPmTD3++OMqLy/Xv/zLv+jqq6/Wzp07dfjwYUnSDTfcoF/+8peaP3++/vVf/1X/+I//qNGjR8fUjw4AAABET7z1y/1+v1paWuR0Ovtz+v02mH55fzU0NOjCCy9Ua2urli1bpkWLFsntdoesGw8AsYwkOgAMgbq6Ou3bt0/l5eWSpLlz5yolJaXPqJfa2lrdcccd+sd//Edt2LBBR44c0axZs7R27Vp961vf0qZNmwLJ4EgcX3/x888/1yuvvKKvfvWr+spXvqK0tLTAvo8//lgNDQ2BY4ZbW1ubfvSjHw1o4tI777xTzc3N2rlzpx555BH96Ec/0ooVK/Tmm28qNTVVkvRf//Vfuv7667Vq1Spdd911+ulPf6qnnnpK3/3ud4f4TAAAABBr4rFfvn79er3//vuBcxoqg+mX99c999wjv9+vF154QUuWLNHSpUv1/PPP64033ojaYwJANJBEB4AhsH79eo0YMULz58+XJKWmpmrOnDl6/PHH1dXVFWj3wAMP6PTTT9eKFSv06aef6u233w5M5PnVr35Vn3/+uVpbWwPt/X6/duzYcdLHP/vsszVu3LhAh/y1115TR0eHZs2aJcm4LLRnEqOamhp1dXVFLYne2dl5wuXBBx/UNddco+uuu04bNmzo9/12d3dry5YtuvTSSzVjxow++3suGx07dqxeeeUVffDBB0N2TgAAALCGeOuX79u3TxUVFSouLtY111wT0XMRrX55f3V1demZZ57R3Llz5XK5AtvPPvtslZaWDvnjAUA0kUQHgEHq6urS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_phi_cs = files[\"test\"][\"Nominal/h_delta_phi_truth_cs_WW\"]\n", + "h_delta_phi_cs_noCR = files[\"test_noCR\"][\"Nominal/h_delta_phi_truth_cs_WW\"]\n", + "\n", + "h_delta_phi_ud = files[\"test\"][\"Nominal/h_delta_phi_truth_ud_WW\"]\n", + "h_delta_phi_ud_noCR = files[\"test_noCR\"][\"Nominal/h_delta_phi_truth_ud_WW\"]\n", + "\n", + "values1, edges1 = h_delta_phi_cs.to_numpy()\n", + "values2, edges2 = h_delta_phi_cs_noCR.to_numpy()\n", + "values3, edges3 = h_delta_phi_ud.to_numpy()\n", + "values4, edges4 = h_delta_phi_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\Delta\\phi$')\n", + "ax1.set_title(r'$\\Delta\\phi$: W1 $\\rightarrow$ cs')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\Delta\\phi$')\n", + "ax2.set_title(r'$\\Delta\\phi$: W2 $\\rightarrow$ ud')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "id": "e6d9f231-8a4d-4b9f-aaf3-836d24d1930b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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TZ482VeD8f3339fw4cN16aWXSvLvwLfvw5FIP3bsmAYNGvSV2wsvvKC2tjbNmTNHDQ0NPbr3l19+qddee0233XabbDZbwDYnT57Uq6++qjlz5nRKtB87dkySfNNFDx8+rOuuu06DBw9WZmam7/8TAAAAokOs9cMbGhp03XXXKSUlRb/73e+UmJjY4zjC2Q8Ppo/985//XOPHj9eAAQO0dOnSXt/nq+4FAGZIMjsAAIh2b775pg4cOKAf//jHfudvvPFGDRo0SKtXr9a1116rTz75RC0tLb5RFh988IEk+UbC7Ny5U1/72teUkpLSqziuuuoqvfbaa6qtrfXVZWw3efJk3X///fr888/13nvvaeTIkfr617/eq/fpjtVq1W9+85uvbPf73/9ea9euVWFhoS666KIe3fu///u/dfz4cU2YMKHLNn/+85/V0tKi3NzcTtfq6+t13nnn+Z67uLhYqampOnz4sN544w1fPc2hQ4f2KB4AAACYK5b64U1NTfr2t7+to0eP6t1339XIkSODiiGc/fBg+tgXX3yxli5dGnDEezD3+ap7AYAZSKQDQB+tXr1aAwYM0MyZM/3On3/++Zo+fbpeeukllZeX669//askafDgwZKMaZ92u10jR45UY2Oj3nnnHd199929jqN9ZMt7772n999/X/fee6/v2oQJEzRw4EC9/fbb2rp1q6ZPn97r9+lOUlKSvv/973fbZvPmzXrppZc0Y8YMrVmzpscjbU6cOCHJGPXTlePHj3d5/j/+4z902WWXKSEhQceOHdPLL7+s//7v/9Z5552nG2+8UePGjdMrr7yiuXPn9igeAAAAmCtW+uGtra264YYbVF9frzfeeENZWVlBxxDOfnhP+9iSNGPGDEnS66+/3qf7fNW9AMAMlHYBgD44ceKE3G63vvWtbwWcCnrzzTfrb3/7m1599VVdcsklkozaiJIxEqZ9FMx9992nhIQEv063ZNRI9Hg8PYpl4sSJslqtWr16tT7//HO/kTADBw7U+PHjVVZWppaWlrDVR++JH//4x8rPz9e6deuUlNTzz3Pbp8e+8cYbna6dOnVKkuRwOCR1TJtt53K5dOjQId8opI8//ljnn3++/u7v/s7XZty4cfroo4+CexgAAACYIlb64WfOnNGsWbNUWVmp9evXa9KkST3+GgSrt/3wnvax++s+AGAWRqQD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fr4SEhK0detWzezi+7O5udnveODAgZ1GugMAAMST5ORkORwOnT59WmfOnDE7nJgUyn55UIl0OusAAKDfFRb2emFRdC0xMVGJiYlmh4E+aGxs1JkzZzRixAi/8yNGjNCePXsCvqahoSFg+4aGBt/xtGnTVFhYqFGjRunPf/6zHnroIX37299WZWWlEhMT1dDQ0GkmalJSkoYOHep3n3OlpaX5HbtcLi1durQnjwoAABCzLBaLBgwYoAEDBpgdCr5CUIl0OusAAABAbLvlllt8/z1u3DhlZ2fr7//+7/X222/rmmuu6fV99+/f7zddlgEuAAAAiCa9Wmw01OisI9rZ7ZLVGnjBUavVuA4AABBKdrtdiYmJOnjwoN/5gwcPdlkyMTU1Naj2kvT1r39ddrtdn3zyia655hqlpqbq0KFDfm1Onz6tI0eOdHsfm81GjXQAAABErYRgGpvRWW+/R1866+0biXSEi8NhlO6tru681dUZ1wEAAEIpOTlZEyZMUEVFhe9cW1ubKioqNGnSpICvmTRpkl97Sdq8eXOX7SXps88+01/+8hddfPHFvnscPXpU1dXVvjZvvvmm2tralJeX15dHAgAAACJWUIl0OutA1xwOafz4zhtJdAAAEC4lJSX65S9/qRdffFG7d+/WD37wA7W0tGju3LmSpDlz5vitb7Ro0SJt2rRJTz31lPbs2aOlS5dq+/btWrBggSTp2LFjuv/++/XHP/5Re/fuVUVFhb7zne/o0ksvVUFBgSTpsssu07Rp0zR//nxt27ZN77//vhYsWKBbbrlFI0eO7P8vAgAAANAPgi7tUlJSojvuuEMTJ07UFVdcoRUrVnTqrF9yySVavny5JKOzPmXKFD311FO67rrrtHbtWm3fvl2rVq2SZHTWly1bpqKiIqWmpurPf/6zfvSjH3XZWS8vL9epU6forAMAACDuzZo1S4cPH9YjjzyihoYG5ebmatOmTb41ijwejxISOsbOTJ48WWvWrNGSJUv00EMPafTo0Xr55Zc1duxYScYitB988IFefPFFHT16VCNHjtS1116rRx991G925+rVq7VgwQJdc801SkhIUFFRkZ577rn+fXgAAACgH1m8Xq832BetXLlSTz75pK+z/txzz/lGhk+dOlXp6el64YUXfO3Xr1+vJUuWaO/evRo9erSeeOIJTZ8+XZJ04sQJzZgx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ra1Nt99+u+6//35dfvnlXb7/Y489pmHDhukf/uEf9OSTT+r06dN9fCLErRAuXgcACBOXq6Oci9RR5sXlMjcuoB8Fvdho+/TR8vJy5eXlacWKFSooKFBdXZ2GDx/eqX379NHly5fr+uuv15o1azRjxgzV1NRo7Nixfm17Mn10/vz5vuMLLrgg2PABAACAmNDY2KgzZ85oxIgRfudHjBihPXv2BHxNQ0NDwPYNDQ2+48cff1xJSUm65557unzve+65R+PHj9fQoUO1ZcsWLV68WAcOHNDTTz/d5Wuam5v9jgcOHKiBAwd22R5xIsSL10mSx8PidQAQcoWFxs/m0lKjnEtmppFEnznT7MiAfhN0Iv3s6aOSVF5erv/8z//Ur3/9az344IOd2p89fVSSHn30UW3evFkrV65UeXm5r1379NHf//73uu666wK+d/v0UQAAAAChV11drWeffVY1NTWynDt9+ywlJSW+/87OzlZycrLuuusuLV++vMvkeFpamt+xy+XS0qVLQxI3olh3i9f1IpHu8Ri5ndbWztesViP3QzIdAHqpsLDXH3ICsSCo0i7RNn20ubnZb/vyyy978pgAAABAxLPb7UpMTNTBgwf9zh88eLDLwSepqandtn/33Xd16NAhORwOJSUlKSkpSfv27dMPf/hDpaendxlLXl6eTp8+rb1793bZZv/+/WpqavJtixcv7tmDIraFePG6xsbASXTJOB9opDoAAEBPBJVI72766NnTQc8Wyumja9eu1VtvvaW77rpLP/3pT/WjH/2o23jT0tKUkpLi25YvX/5VjwgAAABEheTkZE2YMEEVFRW+c21tbaqoqNCkSZMCvmbSpEl+7SVp8+bNvva33367PvjgA+3cudO3jRw5Uvfff79+//vfdxnLzp07lZCQELDUYzubzea3UdYFkli8DgAARI2gS7uEWjinj+7fv182m813TGcdAAAAsaSkpER33HGHJk6cqCuuuEIrVqxQS0uLrwzjnDlzdMkll/gGlCxatEhTpkzRU089peuuu05r167V9u3btWrVKknSsGHDNGzYML/3GDBggFJTU5X5P4nNyspKbd26VVdffbUuuOACVVZW6r777tNtt92mCy+8sB+fHjHB5fKvkc7idQAAIEIFNSI92qaPMuoFAAAAsWzWrFn62c9+pkceeUS5ubnauXOnNm3a5JsR6vF4dODAAV/7yZMna82aNVq1apVycnL0u9/9Ti+//LLGjh3b4/ccOHCg1q5dqylTpujyyy/XT37yE913332+ZDwQlPbF67KzjSLm2dnGAqQsXgcAACKMxes9tyBd9/Ly8nTFFVfo+eefl2RMH3U4HFqwYEHAxUZnzZql48eP67XXXvOdmzx5srKzs1VeXq6//OUvfp17yaihfvvtt2vu3Lm+kS/nWr16tebMmaPGxsZOI1+am5uVkpKipqYmvxHpAAAAQCSIp/5qPD0rzFdTI02Y0PX16mpp/Pj+iwcAAES2YPqqQZd2YfooEP08nsALLdntksPR//EAAAAAoWC3GwPbAy04arUa1wEAAHoj6ET6rFmzdPjwYT3yyCNqaGhQbm5up+mjCQkdFWPap48uWbJEDz30kEaPHt3r6aNLly7Vl19+qVGjRum+++7zq5sOoGc8HmPtpq7+uKirI5kOAACA6ORwGP1ZBo0AAIBQC7q0SzRg+ijQNaa7AgBgvnjqr8bTswIAACC6BNNXDWqxUQAAAAAAAAAA4g2JdAAAAAAAAAAAukEiHQAAAEDYOZ1OZWVlqayszOxQAAAAgKAFvdgoAAAAAASrqqqKGukAAACIWoxIB+KM3S5ZrYGvWa3GdQAAAAAAAAAdYnpEutPpVGJiooqLi1VcXGx2OEBEcDikujqpsbHzNbvduA4AAAAAAACgQ0wn0pk+CgTmcJAwBwAAAAAAAHqK0i6IfG63lJMjDRpk7N1usyMCAAAAAABAnPB4pJqazpvHY3Zk6E8xPSIdMcDtloqKJItF8nql2lrjeMMGqbDQ7OgAAAAAAAAQwzweKTNTam3tfM1qNcrnMus/PjAiHZFt2bKOJLpk7C0WqbTU3LgAAAAAAAAQ8xobAyfRJeN8oDXoEJtIpCOy1dd3JNHbeb3Gx30AAAAAAAAA0A9IpCOyZWQYI9DPZrEYc2oAAAAAAAAAoB+QSEdkc7k6yrlIHWVeXC5z4wIAAAAAAAAQN0ikI7IVFhoLi2ZnGys4ZGcbC5DOnGl2ZAAAAAAAAADiBIl0RL7CQmnnTunECWNPEh0AACDqOJ1OZWVlqayszOxQAAAAesxuN8Z2BmK1GtcRH5LMDgAAAABA7KuqqpLNZjM7DAAAgKA4HFJdndTY2Pma3W5cR3yI6US60+lUYmKiiouLVVxcbHY4AAAAAAAAAKKMw0HCHDGeSGfUCwAAAAAAAACgr6iRDgAAEAput5STIw0aZOzdbrMjAgAAAACECIl0AACAvnK7paIiqbZWam019kVFJNMBAAAAIEbEdGkXAACAfrFsmWSxSF6vcez1GselpVJhobmxAQAAAIgbHg8Lo4YLiXQAAIC+qq/vSKK383qlujpz4gEAAAAQdzweKTPTmCR7LqvV+POEZHrvUdoFAACgrzIyjBHoZ7NYjF4sAAAAAPSDxsbASXTJOB9opDp6jkQ6AABAX7lcHeVcpI4yLy6XuXEBAAAAAEKCRDoAAEBfFRZKGzZI2dnGnMnsbGOh0ZkzzY4MAAAAABAC1EgHAAAIhcJCFhYFuuF0OpWYmKji4mIVFxebHQ4AAAAQFBLpAAAAAMKuqqpKNpvN7DAAAACAXqG0CwAAAAAAAABEObvdqDQZiNVqXEfvxfSIdKaPAgAAAAAAAIgHDodUVyc1Nna+Zrcb19F7MZ1IZ/ooAAAAAAAAgHjhcJAwDxdKuwAAAAAAAACIHW63lJMjDRpk7N1usyNCDCCRDgAAAAAAACA2uN1SUZFUWyu1thr7oiKS6egzEulAvOLTWQCIDvy8BgAAAHpu2TLJYpG8XuPY6zWOS0vNjQtRj0Q6EI/4dBYAogM/rwEAAIDg1Nd3JNHbeb3GKpxAH5BIB+IRn84CQHQI189rRrkDAAAgVmVkGH3ms1ksUmamOfEgZpBIB+IRn84CQHQIx89rRrkDkYcPtwAACB2Xq2MAitQxMMXlMjcuRD0S6UA84tNZAIgO4fh5zawkmMTpdCorK0tlZWVmhxJZ+HALAIDQKiyUNmyQsrMlq9XYu93SzJlmR4YoZ/F6zx3mFP2am5uVkpKipqYm2Ww2s8MBIk/7H2ztiZT2Pb9YACCyhOPn9aBBRrLuXFardOJE3+JFj8VTfzWenrVXcnKM5PnZf5ZZLMYf/Tt3mhYWAABAPAimr8qIdCAe8eksAESHcPy8ZlYSEFkouQcAABAVYjqRzvRRoBuFhcYopxMnjD1JdACITKH+eU3NSCCy8OEWAABAVIjpRHpVVZV27dql4uJis0MBAACIDMxKAiILH24BAABEhZhOpAMAACAAZiUBkYMPtwAAiA5ut7G2yaBBxp6FweNOktkBAAAARDuPR2ps7Hzebpccjv6PB0CUKSw0NgAAEJncbqmoqGPmWG2tcbxhA7/D4wgj0gEAAPrA4zFKGU+Y0HnLzDSuA+FUVlam9PR0Wa1W5eXladu2bd22X79+vcaMGSOr1apx48bp9ddf77Lt3XffLYvFohUrVvidP3LkiG699VbZbDYNGTJE8+bN07Fjx0LxOAAAAJFn2bKOJLrUUZattNTcuNCvSKQDAAD0QWOj1Noa+Fpra+CR6kCorFu3TiUlJXK5XKqpqVFOTo4KCgp06NChgO23bNmi2bNna968edqxY4dmzJihGTNm6MMPP+zU9qWXXtIf//hHjRw5stO1W2+9VR999JE2b96sjRs36g9/+IPuvPPOkD8f+oDp5wAAhE59fUcSvZ3XK9XVmRMPTEEiHQAAAIhSTz/9tObPn6+5c+cqKytL5eXlOu+88/TrX/86YPtnn31W06ZN0/3336/LLrtMjz76qMaPH6+VK1f6tfv888+1cOFCrV69WgMGDPC7tnv3bm3atEn/9m//pry8PF111VV6/vnntXbtWn3xxRdhe1YEoX36eW2t8Yle+/RzkukAAPRORkbHwuDtLBZjCiriBol0AAAAIAqdPHlS1dXVys/P951LSEhQfn6+KisrA76msrLSr70kFRQU+LVva2vT7bffrvvvv1+XX355wHsMGTJEEydO9J3Lz89XQkKCtm7d2tfHQigw/RwAgNByuTp+n0odv2ddLnPjQr/qVSKdOowAAACAuRobG3XmzBmNGDHC7/yIESPU0NAQ8DUNDQ1f2f7xxx9XUlKS7rnnni7vMXz4cL9zSUlJGjp0aJfvK0nNzc1+25dfftnt86EPmH4OAIhjHo9UU9N569PaRYWFxsKi2dmS1Wrs3W5p5syQxY3IF3QinTqMAAAAQGyqrq7Ws88+qxdeeEGWc6cv91FaWppSUlJ82/Lly0N6f5yF6ecAgDjl8Ri/7iZM6LxlZoYgmb5zp3TihLEniR53gk6kU4cRAACgg91uDEoJxGo1rgPhYLfblZiYqIMHD/qdP3jwoFJTUwO+JjU1tdv27777rg4dOiSHw6GkpCQlJSVp3759+uEPf6j09HTfPc4dRHP69GkdOXKky/eVpP3796upqcm3LV68ONhHRk8x/RwAEKcaG43lQQJpbTWuA70VVCI92uowMn0UAACEm8NhVEuoru681dUZ14FwSE5O1oQJE1RRUeE719bWpoqKCk2aNCngayZNmuTXXpI2b97sa3/77bfrgw8+0M6dO33byJEjdf/99+v3v/+97x5Hjx5VdXW17x5vvvmm2tralJeX12W8NpvNbxs4cGCvnx1fgennAAAAIZcUTOPu6jDu2bMn4GvMrMOYlpbmd+xyubR06dIu2yOOuN3GIkz19cbUV5fL+IMDAIBecDhImMMcJSUluuOOOzRx4kRdccUVWrFihVpaWjR37lxJ0pw5c3TJJZf4yqgsWrRIU6ZM0VNPPaXrrrtOa9eu1fbt27Vq1SpJ0rBhwzRs2DC/9xgwYIBSU1OV+T9lQS677DJNmzZN8+fPV3l5uU6dOqUFCxbolltuCViiEf3P45Ea0wulX/v3b+0eflYBAAD0VlCJ9HBor8NYU1MT8jqM+/fvl81m8x0z6gWSjCR6UVHHFNfaWuN4wwaS6QAAIKrMmjVLhw8f1iOPPKKGhgbl5uZq06ZNvoEsHo9HCQkdk1AnT56sNWvWaMmSJXrooYc0evRovfzyyxo7dmxQ77t69WotWLBA11xzjRISElRUVKTnnnsupM+G3mmvDRtoWrvVykwZAIgbDCAEQi6oRHq46zC2O3PmjH74wx9qxYoV2rt3b6/rMLZPGwX8LFvWkUSXOupHlpbySwUAAESdBQsWaMGCBQGvvf32253O3XTTTbrpppt6fP+9e/d2Ojd06FCtWbOmx/dA/+lJbdg+JdJJzABA5GMAIRAWQdVIj7Y6jEBA9fUdSfR2Xq8xPAcAAABAYO2JmdpaIyvfnphxu82ODABwtu4GEMY4u92YgRWI1WpcB3or6NIu1GFE1MvIMDr9ZyfTLRZjDiwAAACinsdjjLw+l91OWZM+YWYnAESHOB5A6HAYj0k/AOEQdCKdOoyIei6X/xSn9r3LZXZkAAAA6CNqhIdRHCdmACCqxPkAQoeD3/UID4vXe25PKPo1NzcrJSVFTU1N1EhHYG63MXKmrs74ReJySTNnmh0VAACIE/HUX+3vZ62pkSZM6Pp6dbU0fnzYwzBNWJ8/JydwYiY7W9q5s5c3BQCE3Lk10tv3bje5D+AcwfRVg6qRDsSMwkKjs3/ihLHnFwkA9J3bbSRZBg0y9tTMBYB+F9basC5XR0JGYmYnAESqwkJjYdHsbOOHf3Y2SXQgBIIu7QIAANDJuaNe2heg27CBurkAJElOp1OJiYkqLi5WcXGx2eHErLDWhm1PzDCzEwAiX2Eh/XAgxEikAwCAvmMBOgBfoaqqKubL2PRGOBZGDWttWBIzAAAgTpFIBwAAfccCdAAQNBZGhSRjVteyZcbv0owMY5Q/H1YAABBxqJEOAAD6LiOjo2ZuO4vFyBABQD8Ka43wEGtsDJxEl4zzgUaqI8a0l0arrTX+p7eXRmOdEQAAIk5MJ9KdTqeysrJUVlZmdigAAMQ2FqADECHaa4RXV3feGOGNiNNdaTQAABBRYrq0C3UYAQDoJyxAB4nyBIgY4agRHo5a5gCl0QAAiB4xnUgHAAD9iAXo4lt7eYL2kZXt5Qk2bODfBaIetcwRNhkZxs/Ls5PplEYDACAixXRpFwAAAPQTyhMghlHLHGFDaTQAAKIGiXQAAAD0HeUJgKBF08KoCJP20mjZ2cb/9OxsY4YPpdEAAIg4lHYBAABA31GeAAha+8Ko1F6Pc5RGAwAgKpBIR0RjUScAiA78vIZcLv8a6ZQnAHokHAujAgAAIPRIpCNisagTAEQHfl5DUkd5gtJS4396ZqaRRKc8Af6H0+lUYmKiiouLVVxcbHY4AAAAQFBIpCNi9WRRJxIzAGA+fl7Dh/IE6EZVVZVsNpvZYfRKey3zrj4wpJY5AABA7CORDgAAAADdoJY5AAAASKQDAAAAwFegljkAAEB8SzA7gHByOp3KyspSWVmZ2aEAAAAAAAAAAKJUTCfSq6qqtGvXLhYz6k9ut5STIw0aZOzdbrMjAgAAAAAAAIA+ielEOvqZ2y0VFUm1tcZKTLW1xnEvk+ntizoFwqJOABA5+HkNAAAAAIh11EhH6CxbJlksktdrHHu9xnFpqVRYGPTtWNQJAKIDP68BxA232+jz1tdLGRmSy9Wrfi4AAACiD4l0hE59fUcSvZ3Xa2RXeolFnQAgOvDzGkDMa5992T5wpH325YYNJNMBAADiAKVdEDoZGcYfFmezWKTMTHPiAQAAAEKlu9mXAAAAiHkk0hE6LlfHHxRSxx8aLpe5cQEAAAB9FYbZlwAAAFHF7ZZycqRBg4x9L9dFjFYk0hE6hYXG1NbsbGN1uexs4xtq5kyzIwMAAAD6htmXAAAgnrWXuautlVpbO8rcxVEynUQ6QquwUNq5UzpxwtiTRAcAAIAkp9OprKwslZWVmR1K7zD7ElHE45FqajpvHo/ZkQEAOomWUd6UuZPF6z13fmL0a25uVkpKipqammSz2cwOp+/cbuMfa329MRLG5WJBIwAAgCgWc/3VbsTUs7rdxh+LdXXGSHSXi4EjiDgej/HPs7W18zWr1fjnywLhABAhzl3MvH0fiYuZDxrU9S+XEyf6P54QCaavyoj0SMe0CQAAACAyMPsSUaCxMXCeQzLONzb2bzwAgG5E0yhvytyRSI940fQNBQAAAAAAAKBnomkxc8rcxXYiPerrMErR9Q0FAAAAAAAAoGeiaZR3YaFRciY72yjnkp1tVMyIoxl6SWYHEE5VVVXRX4cxI8Mo53J2Mj1Sv6EAAEBIeTyBp+Db7dS3BQAAAKKeyxW4RnqkjvIuLIy82u39KKYT6TEh2r6hAABASLBYHAAAABDj2kd5s5h5VIjp0i4xgWkTAADEJRaLAwD0ht1u/OkYiNVqXAcARBAWM48ajEiPBnE+bQIAAAAA0DMOhzGokdJgAACEFol0AAAAAABiiMNBwhwAgFCjtEu8crulnBxp0CBj73abHREAAEBn9FkAAACA4NCHDgsS6fHI7TYWMK2tNYqs1tYax3xTAQCASEKfJaY4nU5lZWWprKzM7FAAAABiF33osLF4vV6v2UGEWnNzs1JSUtTU1CSbzWZ2OJEnJ8f4Jjr7f73FYixkunOnaWEBAIAOHo+UmRl4wVGr1ah/G/PT9mO4zxJP/dV4elYAAADTxXAfOhyC6atSIz0e1df7fzNJxnFdnTnxAACATlgsTvRZAAAAENM8njD09+lDhw2J9BAJyz/8cMnICPzJVGameTEBAIBOommxuLD0heizAAAAIEaFbQYqfeiwielEutPpVGJiooqLi1VcXBy294m6qdcul1EbyWIxvqna9y6X2ZEBAIAoFLa+EH0WAAAAxKjGxsD9Z8k439hIHzrSxPRio1VVVdq1a1dYk+hSz/7hR5TCQmnDBqM2ktVq7N1uaeZMsyMDAABRKGx9IfosAAAAQHDoQ4dNTI9IRzcKC40NAAAgktFnAQAAAIJDHzosYnpEOgAAABDrysrKlJ6eLqvVqry8PG3btq3b9uvXr9eYMWNktVo1btw4vf76637Xly5dqjFjxmjw4MG68MILlZ+fr61bt/q1SU9Pl8Vi8dsee+yxkD8bAAAAEClIpEc4j0eqqem8eTxmRwYAAACzrVu3TiUlJXK5XKqpqVFOTo4KCgp06NChgO23bNmi2bNna968edqxY4dmzJihGTNm6MMPP/S1ycjI0MqVK1VbW6v33ntP6enpuvbaa3X48GG/e5WWlurAgQO+beHChWF9VgAAAMBMFq/37CVcY0Nzc7NSUlLU1NQkm80W9verqZEmTOj6enW1NH588PeNukVMAQBAXApXXyiWhaq/mpeXJ6fTqZUrV0qS2tralJaWpoULF+rBBx/s1H7WrFlqaWnRxo0bfeeuvPJK5ebmqry8vNtY33jjDV1zzTWSjBHp9957r+69996vjLG/++YAAADRgLxfZAimr0qN9BCw241/4F39w7fbe3ffsK3eCwAAEELh6guheydPnlR1dbUWL17sO5eQkKD8/HxVVlYGfE1lZaVKSkr8zhUUFOjll1/u8j1WrVqllJQU5eTk+F177LHH9Oijj8rhcOh73/ue7rvvPiUldf3nRXNzs9/xwIEDNXDgwO4eERHG4wm8eLDdzt8lAAAEy+EwkuX8bo0evSrtQh1Gf+3/8KurO298egQAAGIdfSFzNDY26syZMxoxYoTf+REjRqihoSHgaxoaGnrUfuPGjTr//PNltVr1zDPPaPPmzbKf9YnIPffco7Vr1+qtt97SXXfdpZ/+9Kf60Y9+1G28aWlpSklJ8W3Lly8P5nFhsvZRcxMmdN4yMyk9CQBAbzgcxszNczf6z5Ep6BHp7XUYy8vLlZeXpxUrVqigoEB1dXUaPnx4p/btdRiXL1+u66+/XmvWrNGMGTNUU1OjsWPHSuqow/j1r39dJ06c0DPPPKNrr71Wn3zyiS666CLfvUpLSzV//nzf8QUXXNCbZw4Lh4N/5AAAIH7RF4otV199tXbu3KnGxkb98pe/1M0336ytW7f6+vtnj2rPzs5WcnKy7rrrLi1fvrzLUeb79+/3my7LaPTowmxZAAAQ74Iekf70009r/vz5mjt3rrKyslReXq7zzjtPv/71rwO2f/bZZzVt2jTdf//9uuyyy/Too49q/PjxvjqOkvS9731P+fn5+vrXv67LL79cTz/9tJqbm/XBBx/43euCCy5Qamqqbxs8eHCw4QMAAAAxwW63KzExUQcPHvQ7f/DgQaWmpgZ8TWpqao/aDx48WJdeeqmuvPJK/epXv1JSUpJ+9atfdRlLXl6eTp8+rb1793bZxmaz+W0k0gEAABBNgkqkt9dhzM/P77hBD+ownt1eMuowdtX+q+owDhs2TP/wD/+gJ598UqdPnw4mfAAAACBmJCcna8KECaqoqPCda2trU0VFhSZNmhTwNZMmTfJrL0mbN2/usv3Z9/3yyy+7vL5z504lJCQEnKEKAAAAxIKgSrt0V4dxz549AV8TTB3GW265RcePH9fFF18csA7j+PHjNXToUG3ZskWLFy/WgQMH9PTTT3cZb7QvaMTCXQAAAOhOSUmJ7rjjDk2cOFFXXHGFVqxYoZaWFs2dO1eSNGfOHF1yySW+euSLFi3SlClT9NRTT+m6667T2rVrtX37dq1atUqS1NLSop/85Ce68cYbdfHFF6uxsVFlZWX6/PPPddNNN0kyBsps3bpVV199tS644AJVVlbqvvvu02233aYLL7zQnC8EAAAAwopFx3tRIz1cwlGHMS0tze/Y5XJp6dKlYXuGUGP1XgAAAHRn1qxZOnz4sB555BE1NDQoNzdXmzZt8g1k8Xg8SkjomIQ6efJkrVmzRkuWLNFDDz2k0aNH6+WXX/atXZSYmKg9e/boxRdfVGNjo4YNGyan06l3331Xl19+uSRjcMratWu1dOlSffnllxo1apTuu+8+v/46AAAAYkf7ouNdDfatq4uPPGVQifT+qMPYXotx9OjR+tWvfqXFixcHvO/ZdRgzMzMDtomFBY1YuAsAAADdWbBggRYsWBDw2ttvv93p3E033eQbXX4uq9Uqt9vd7fuNHz9ef/zjH4OOE9GN2bIAAMQvFh03BFUjPdrqMLKgEQAAAAD0Xfts2erqzlu8jEIDAADxLejSLtRhBAAAAID4w2xZAAAQz4JOpFOHEQAAAEDEc7ulZcuk+nopI0NyuaTCQrOjAgAAQJSyeL1er9lBhFpzc7NSUlLU1NTkVyMdAAAAiATx1F815VndbqmoSLJYJK+3Y79hA8l0AACAINXUSBMmdH29uloaP77/4gmlYPqqQdVIBwAAAICIt2xZR/Jc6kiml5aaGxcAAEAUal90PJB4WnQ86NIuAAAAABAsp9OpxMREFRcXq7i4OLxvVl/fkURv5/Uaq2ICAAAgKO2Ljjc2dr5mt8fPGiok0gEAAACEXVVVVf+VdsnIkGpr/ZPpFouUmdk/7w8AABBjWHSc0i4AAAAAYo3L1VHOReoo8+JymRsXAAAAohaJdAAAAACxpbDQWFg0O9so3JmdbSxAOnOm2ZEBAAAgSlHaBQAAAEDsKSw0NgAAACAEYnpEutPpVFZWlsrKyswOBQAAAAAAAAAQpWJ6RHq/LmgEAAAAAAAAAIhJMZ1IR2Aej9TY2Pm83c7quwAAAAAAAABwLhLpccbjkTIzpdbWztesVqmujmQ6AAAAAAAAAJwtpmuko7PGxsBJdMk4H2ikOgAAAAAAAADEMxLpAAAAAAAAAAB0g0Q6AAAAgLBzOp3KyspSWVmZ2aEAAAAAQaNGOgAAACISC6THlqqqKtlsNrPDAAAAAHqFRDoAAAAiDgukAwAAAHHA7ZaWLZPq66WMDMnlkgoLzY4qIEq7xBm73fjjMxCr1bgOAABgNhZIBwAAAGKc2y0VFUm1tUYnv7bWOHa7zY4sIEakxxmHwxjBxTRpAAAAAAAAAKZZtkyyWCSv1zj2eo3j0tKIHJUe04l0p9OpxMREFRcXq7i42OxwIobDQcIcAADEJ+quAwAAABGivr4jid7O6zVGAUegmE6ks6ARAAAA2lF3HQAAAIggGRlGOZezk+kWi9Fpj0DUSAcAAEBcoO46AAAAEEFcro5yLlJHmReXy9y4ukAiHQAAABGHBdIBAACAGFdYKG3YIGVnG5387GxjodGZM82OLKCYLu0CAACA6MQC6QAAAEAcKCyMyIVFAyGRDgAAgIjEAukAAAAAIgWlXQAAAACEndPpVFZWlsrKyswOBQAAAAgaI9IBAAAQF9rrrgdacJS66+FXVVUlm81mdhgAAABAr5BIBwAAQFyg7joAAACA3iKRDgAAgLhB3XUAAAAAvUGN9FByu6WcHGnQIGPvdpsdEQAAAAAAAACgj0ikh4rbLRUVSbW1RuHN2lrjmGQ6ACAS8eEvAAAAAAA9FtOJdKfTqaysLJWVlYX/zZYtkywWyes1jr1e47i0NPzvDQBAMPjwFwAAAACAoMR0Ir2qqkq7du1ScXFx+N+svr4jid7O6zVWtALiBSNcgejAh7+Id/y+AgAAABCkmE6k96uMDCMJcTaLRcrMNCceoL8xwhWIHnz4i3jG7ysAAAAAvUAiPVRcro4RfVLHSD+Xy9y4gP7CCFcgevDhL+IZv68AAAAA9AKJ9FApLJQ2bJCysyWr1di73dLMmWZHBvQPRrgC0YMPfxHP+H0FAAAAoBdIpIdSYaG0c6d04oSxJ4mOeMIIVyB68OEv4hm/rwAAAAD0Aol0AKHBCFcguvDhL+IVv69M43Q6lZWVpbKyMrNDAQAAAIJGIh1AaDDCFQAQDfh9ZZqqqirt2rVLxcXFZocCAAAABC3J7AAAxJDCQmMDACCS8fsKAAAAQJAYkQ4AAAAAAAAAQDdIpAMAAAAAAAAA0I2YTqSzoBEAAAAAAAAAoK9iOpHOgkYAAACIdWVlZUpPT5fValVeXp62bdvWbfv169drzJgxslqtGjdunF5//XW/60uXLtWYMWM0ePBgXXjhhcrPz9fWrVv92hw5ckS33nqrbDabhgwZonnz5unYsWMhfzYAAAAgUsR0Ih0AAACIZevWrVNJSYlcLpdqamqUk5OjgoICHTp0KGD7LVu2aPbs2Zo3b5527NihGTNmaMaMGfrwww99bTIyMrRy5UrV1tbqvffeU3p6uq699lodPnzY1+bWW2/VRx99pM2bN2vjxo36wx/+oDvvvDPszwsAAACYxeL1er1mBxFqzc3NSklJUVNTk2w2m9nhAAAAAH5C1V/Ny8uT0+nUypUrJUltbW1KS0vTwoUL9eCDD3ZqP2vWLLW0tGjjxo2+c1deeaVyc3NVXl7ebaxvvPGGrrnmGu3evVtZWVmqqqrSxIkTJUmbNm3S9OnT9dlnn2nkyJFheVYAQXK7pWXLpPp6KSNDcrmkwkKzowIAIKIE01dlRDoAAAAQhU6ePKnq6mrl5+f7ziUkJCg/P1+VlZUBX1NZWenXXpIKCgq6bH/y5EmtWrVKKSkpysnJ8d1jyJAhviS6JOXn5yshIaFTCRgAJnG7paIiqbZWam019kVFxnkAANArJNIBAACAKNTY2KgzZ85oxIgRfudHjBihhoaGgK9paGjoUfuNGzfq/PPPl9Vq1TPPPKPNmzfLbrf77jF8+HC/9klJSRo6dGiX7ysZo33O3r788ssePyuAIC1bJlksUvsEdK/XOC4tNTcuAACiGIl0AAAAAH6uvvpq7dy5U1u2bNG0adN08803d1l3vafS0tKUkpLi25YvXx6iaAF0Ul/fkURv5/VKdXXmxAMAQAzoVSK9rKxM6enpslqtysvL07Zt27ptv379eo0ZM0ZWq1Xjxo3T66+/7nd96dKlGjNmjAYPHqwLL7xQ+fn5naaFHjlyRLfeeqtsNpuGDBmiefPm6dixY70JHwAAAIh6drtdiYmJOnjwoN/5gwcPKjU1NeBrUlNTe9R+8ODBuvTSS3XllVfqV7/6lZKSkvSrX/3Kd49zk+qnT5/WkSNHunxfSdq/f7+ampp82+LFi3v8rACClJFhjEA/m8UiZWaaEw8AADEg6ET6unXrVFJSIpfLpZqaGuXk5KigoKDLESpbtmzR7NmzNW/ePO3YsUMzZszQjBkz9OGHH/raZGRkaOXKlaqtrdV7772n9PR0XXvttTp8+LCvza233qqPPvpImzdv1saNG/WHP/xBd955Zy8eGQAAAIh+ycnJmjBhgioqKnzn2traVFFRoUmTJgV8zaRJk/zaS9LmzZu7bH/2fdtLsUyaNElHjx5VdXW17/qbb76ptrY25eXldXkPm83mtw0cOPArnxFAL7lcHeVcpI4yLy6XuXEBABDFLF7vufO9upeXlyen06mVK1dKMjrVaWlpWrhwoR588MFO7WfNmqWWlhZt3LjRd+7KK69Ubm6uysvLA75H+2qpb7zxhq655hrt3r1bWVlZqqqq8i1qtGnTJk2fPl2fffaZRo4cGfD1PVltFQAAAOhvoeqvrlu3TnfccYd+8Ytf6IorrtCKFSv029/+Vnv27NGIESM0Z84cXXLJJb4yKlu2bNGUKVP02GOP6brrrtPatWv105/+VDU1NRo7dqxaWlr0k5/8RDfeeKMuvvhiNTY2qqysTGvWrFF1dbUuv/xySdK3v/1tHTx4UOXl5Tp16pTmzp2riRMnas2aNWF7VgBBcruNmuh1dcZIdJdLmjnT7KgAAIgowfRVgxqRfvLkSVVXVys/P7/jBgkJys/PV2VlZcDXVFZW+rWXpIKCgi7bnzx5UqtWrVJKSopycnJ89xgyZIgviS5J+fn5SkhI6FQCBgAAAIgXs2bN0s9+9jM98sgjys3N1c6dO7Vp0ybfgqIej0cHDhzwtZ88ebLWrFmjVatWKScnR7/73e/08ssva+zYsZKkxMRE7dmzR0VFRcrIyNANN9ygv/zlL3r33Xd9SXRJWr16tcaMGaNrrrlG06dP11VXXaVVq1b178MD6F5hobRzp3TihLEniQ4AQJ8kBdO4sbFRZ86c8XXM240YMUJ79uwJ+JqGhoaA7RsaGvzObdy4UbfccouOHz+uiy++WJs3b5bdbvfdY/jw4f6BJyVp6NChne5ztubmZr/jgQMHMoUUAAAAMWXBggVasGBBwGtvv/12p3M33XSTbrrppoDtrVar3G73V77n0KFDA44+BwAAQXK7pWXLjEWCMzKM2SOFhWZHBSCAXi02Gg5XX321du7cqS1btmjatGm6+eabu6y73lNpaWlKSUnxbe1TWgEAAAAAAABTud1SUZFUWyu1thr7oiLjPICIE9SIdLvdrsTERB08eNDv/MGDB5WamhrwNampqT1qP3jwYF166aW69NJLdeWVV2r06NH61a9+pcWLFys1NbVTUv306dM6cuRIl+8rSfv37/erbcNodAAAJI9HamzsfN5ulxyO/o8HAAAAiEvLlnUsBix1LBJcWsqodCACBTUiPTk5WRMmTFBFRYXvXFtbmyoqKjRp0qSAr5k0aZJfe0navHlzl+3Pvu+XX37pu8fRo0dVXV3tu/7mm2+qra1NeXl5Xd7DZrP5bSTSAQDxzuMx1hubMKHzlplpXAcAAADQD+rrO5Lo7bxeY5FgABEn6NIuJSUl+uUvf6kXX3xRu3fv1g9+8AO1tLRo7ty5kqQ5c+Zo8eLFvvaLFi3Spk2b9NRTT2nPnj1aunSptm/f7qvj2NLSooceekh//OMftW/fPlVXV+v/+//+P33++ee+2o2XXXaZpk2bpvnz52vbtm16//33tWDBAt1yyy0aOXJkKL4OAADEhcZGY9ZoIK2tgUeqAwAAAAiDjAxjBPrZLBZjhAuAiBNUaRdJmjVrlg4fPqxHHnlEDQ0Nys3N1aZNm3wLino8HiUkdOTnJ0+erDVr1mjJkiV66KGHNHr0aL388ssaO3asJCkxMVF79uzRiy++qMbGRg0bNkxOp1PvvvuuLr/8ct99Vq9erQULFuiaa65RQkKCioqK9Nxzz/X1+QEAAAAAAID+53IZNdHby7u0710usyMDEIDF6z13Dkn0a25uVkpKipqamvxqpAMAEO9qaowyLl2prpbGj++/eIB4FU/91fZnzcjIUGJiooqLi1VcXGx2WAAARAa326iJXldnjER3uaSZM82OCogbwfTLgx6RDgAAAADBqqqqivkPDQAACIbHIzWmF0q/9l9Y1O6RHA6TggL6kccTuLyo3R6Z3wMk0gEAAAAAAIB+5PEYA9ADrV9ktRoD1CMxkQiESjR+DwS92CgAAIhedrvRKQnEajWuAwAAAAivxsbACUTJOB9olC4QS6Lxe4AR6QAAxBGHw/hkP5qmzwEAAAAAYDYS6QAAxBmHg4Q5AAAAAADBiOnSLk6nU1lZWSorKzM7FAAAAAAAAABAlIrpEelVVVWy2WxmhwEAAAAAAAAAiGIxPSIdAAAAAAAAiDR2u2S1Br5mtRrXgVgWjd8DMT0iHQAAAAAAAIg0DodUVyc1Nna+ZrezphFiXzR+D5BIBwAAAAAAAPqZwxGZyUKgv0Tb9wClXQAAAAAAAAAA6AaJdAAAAABh53Q6lZWVpbKyMrNDAQAAAIJGaRcAAAAAYVdVVSWbzWZ2GAAAAECvMCIdAAAAAAAAAIBukEgHAAAAAAAAAKAbJNIBAAAAAAAAAOgGiXQAAAAAAAAAALoR04l0p9OprKwslZWVmR0KAAAAAAAAACBKJZkdQDhVVVXJZrOZHQYAAAAAAAAAIIrF9Ih0AAAAAAAAAAD6ikQ6AAAAAAAAAADdIJEOAAAAAAAAAEA3YrpGOoD+4/FIjY2dz9vtksPR//EAAIDI4nQ6lZiYqOLiYhUXF5sdDgAAABAUEukA+szjkTIzpdbWztesVqmujmQ6AADxrqqqSjabzewwAAAAgF6htAuAPmtsDJxEl4zzgUaqAwAAAAAAANGCRDoAAAAAAAAAAN0gkQ4AAAAAAAAAQDdIpAMAAAAAAAAA0A0S6QAAAAAAAAAAdCOmE+lOp1NZWVkqKyszOxQgptntktUa+JrValwHAAAAAAAAolWS2QGEU1VVlWw2m9lhADHP4ZDq6qTGxs7X7HbjOgAAAAAAABCtYjqRDqD/OBwkzAEAAAAAABCbYrq0CwAAAAAAAAAAfUUiHQAAAEDYsX4RAAAAohmJdACRz+2WcnKkQYOMvdttdkQAACBIVVVV2rVrl4qLi80OBQAAAAgaiXQAkc3tloqKpNpaqbXV2BcVkUwHAAAAAABAvyGRDiCyLVsmWSyS12sce73GcWmpuXEBAAAAAAAgbpBIBxDZ6us7kujtvF6prs6ceAAAAAAAABB3SKQDiGwZGcYI9LNZLFJmpjnxAAAAAAAAIO6QSAcQ2VyujnIuUkeZF5fL3LgAAAAAAAAQN2I6ke50OpWVlaWysjKzQwHQW4WF0oYNUna2ZLUae7dbmjnT7MgAPx6PVFPTefN4zI4MQKwrKytTenq6rFar8vLytG3btm7br1+/XmPGjJHVatW4ceP0+uuv+66dOnVKDzzwgMaNG6fBgwdr5MiRmjNnjr744gu/e6Snp8tisfhtjz32WFieDwAAAIgESWYHEE5VVVWy2WxmhwGgrwoLjQ2IUB6PUW2otbXzNavVKOnvcPR/XABi37p161RSUqLy8nLl5eVpxYoVKigoUF1dnYYPH96p/ZYtWzR79mwtX75c119/vdasWaMZM2aopqZGY8eO1fHjx1VTU6OHH35YOTk5+utf/6pFixbpxhtv1Pbt2/3uVVpaqvnz5/uOL7jggrA/LwAAAGAWi9d77ip+0a+5uVkpKSlqamoikQ4ACLuaGmnChK6vV1dL48f3XzwAIl+o+qt5eXlyOp1auXKlJKmtrU1paWlauHChHnzwwU7tZ82apZaWFm3cuNF37sorr1Rubq7Ky8sDvkdVVZWuuOIK7du3T47/+VQwPT1d9957r+69996vjJG+OQAAACJVMH3VmC7tAgAAAMSqkydPqrq6Wvn5+b5zCQkJys/PV2VlZcDXVFZW+rWXpIKCgi7bS1JTU5MsFouGDBnid/6xxx7TsGHD9A//8A968skndfr06d4/DAAAABDhYrq0CwAAABCrGhsbdebMGY0YMcLv/IgRI7Rnz56Ar2loaAjYvqGhIWD71tZWPfDAA5o9e7bfCJ177rlH48eP19ChQ7VlyxYtXrxYBw4c0NNPP91lvM3NzX7HAwcO1MCBA7t9RgAAACBSkEgHAAAA0MmpU6d08803y+v16uc//7nftZKSEt9/Z2dnKzk5WXfddZeWL1/eZXI8LS3N79jlcmnp0qUhjxsAAAAIB0q7AAAAAFHIbrcrMTFRBw8e9Dt/8OBBpaamBnxNampqj9q3J9H37dunzZs3f2W9yLy8PJ0+fVp79+7tss3+/fvV1NTk2xYvXtztPQEAiDhut5STIw0aZOzdbrMjAtCPepVILysrU3p6uqxWq/Ly8rRt27Zu269fv15jxoyR1WrVuHHj9Prrr/uunTp1Sg888IDGjRunwYMHa+TIkZozZ46++OILv3ukp6fLYrH4bY899lhvwgcAIKTsdslqDXzNajWuA0CoJScna8KECaqoqPCda2trU0VFhSZNmhTwNZMmTfJrL0mbN2/2a9+eRP/444/1xhtvaNiwYV8Zy86dO5WQkKDhw4d32cZms/ltlHUBAEQVt1sqKpJqa6XWVmNfVEQyHYgjQZd2WbdunUpKSlReXq68vDytWLFCBQUFqqurC9hx3rJli2bPnq3ly5fr+uuv15o1azRjxgzV1NRo7NixOn78uGpqavTwww8rJydHf/3rX7Vo0SLdeOON2r59u9+9SktLNX/+fN/xBRdc0ItHBgAgtBwOqa5OamzsfM1uN64DQDiUlJTojjvu0MSJE3XFFVdoxYoVamlp0dy5cyVJc+bM0SWXXKLly5dLkhYtWqQpU6boqaee0nXXXae1a9dq+/btWrVqlSQjif7d735XNTU12rhxo86cOeOrnz506FAlJyersrJSW7du1dVXX60LLrhAlZWVuu+++3TbbbfpwgsvNOcLAQBAuC1bJlksktdrHHu9xnFpqVRYaG5sAPqFxett/wnQM3l5eXI6nVq5cqUkY9RLWlqaFi5cqAcffLBT+1mzZqmlpUUbN270nbvyyiuVm5ur8vLygO9RVVWlK664Qvv27ZPjf7IP6enpuvfee3Xvvfd+ZYzNzc1KSUlRU1PTV05DBQAAAPpbKPurK1eu1JNPPqmGhgbl5ubqueeeU15eniRp6tSpSk9P1wsvvOBrv379ei1ZskR79+7V6NGj9cQTT2j69OmSpL1792rUqFEB3+ett97S1KlTVVNTo3/+53/Wnj179OWXX2rUqFG6/fbbVVJSEnCUOX1zAEBMGDTIGIl+LqtVOnGi/+MBEBLB9FWDSqSfPHlS5513nn73u99pxowZvvN33HGHjh49qldeeaXTaxwOh0pKSvwS4C6XSy+//LL+9Kc/BXyfN954Q9dee62OHj3qe4D09HS1trbq1KlTcjgc+t73vqf77rtPSUmdB9XTWQcAAEAki6f+ajw9KwAghuXkGOVczk6jWSxSdra0c6dpYQHom2D6qkGVdmlsbNSZM2c0YsQIv/MjRozQnj17Ar6moaEhYPv2KaLnam1t1QMPPKDZs2f7BX/PPfdo/PjxGjp0qLZs2aLFixfrwIEDevrpp7uMt7m52e944MCB1GIEAAAAAABAcFwuoyZ6e3mX9r3LZXZkAPpJrxYbDZf2hY28Xq9+/vOf+10rKSnR1KlTlZ2drbvvvltPPfWUnn/+eX355Zdd3i8tLU0pKSm+rb02JAAAAAAAANBjhYXShg3GCHSr1di73dLMmWZHBqCfBDUi3W63KzExUQcPHvQ7f/DgQaWmpgZ8TWpqao/atyfR9+3bpzfffPMrh9Ln5eXp9OnT2rt3rzIzMwO22b9/v999GI0OAAAAAACAXiksZGFRII4FNSI9OTlZEyZMUEVFhe9cW1ubKioqNGnSpICvmTRpkl97Sdq8ebNf+/Yk+scff6w33nhDw4YN+8pYdu7cqYSEBA0fPrzLNjabzW8jkQ4AAAAAAAAACFZQI9Ilo8TKHXfcoYkTJ+qKK67QihUr1NLSorlz50qS5syZo0suucRXRmXRokWaMmWKnnrqKV133XVau3attm/frlWrVkkykujf/e53VVNTo40bN+rMmTO++ulDhw5VcnKyKisrtXXrVl199dW64IILVFlZqfvuu0+33XabLrzwwlB9LQAAAAAAAAAA6CToRPqsWbN0+PBhPfLII2poaFBubq42bdrkW1DU4/EoIaFjoPvkyZO1Zs0aLVmyRA899JBGjx6tl19+WWPHjpUkff7553r11VclSbm5uX7v9dZbb2nq1KkaOHCg1q5dq6VLl+rLL7/UqFGjdN9996mkpKS3zw0AAACgHzmdTiUmJqq4uFjFxcVmhwMAAAAExeL1er1mBxFqzc3NSklJUVNT01fWWgcAAAD6Wzz1V+PpWQEAABBdgumrBlUjHQAAAAAAAACAeEMiHQAAAAAAxBa3W8rJkQYNMvZut9kRAQCiHIl0AAAAAAAQO9xuqahIqq2VWluNfVERyXQAQJ+QSAcAAAAAALFj2TLJYpHal4Tzeo3j0lJz4wIARDUS6QAAAAAAIHbU13ck0dt5vVJdnTnxAABiQkwn0p1Op7KyslRWVmZ2KAAAAAAAoD9kZBgj0M9msUiZmebEAwCICUlmBxBOVVVVstlsZocBAAAAAAD6i8tl1ERvL+/Svne5zI4MABDFYnpEOgAAAAAAiDOFhdKGDVJ2tmS1Gnu3W5o50+zIAABRLKZHpAMAAAAAgDhUWGhsAACECCPSAQAAAIQd6xcBAAAgmjEiHQAAAEDYsX4RAAAAohkj0gEAAAAAAAAA6AaJdAAAAAAAAAAAukEiHQAAAAAAALHD7ZZycqRBg4y92212RABiAIl0AAAAAAAAxAa3WyoqkmprpdZWY19URDIdQJ+RSAcAAAAAAEBsWLZMslgkr9c49nqN49JSc+MCEPVIpAMAAAAAACA21Nd3JNHbeb1SXZ058QCIGTGdSHc6ncrKylJZWZnZoQAA0DvUdwQAAAB6LiPDGIF+NotFysw0Jx4AMSPJ7ADCqaqqSjabzewwAADonfb6ju1TU9vrO27YIBUWmh0dAAAAEHlcLv8+dPve5TI7MgBRLqZHpANAv2LkMEKN+o4AAABAcAoLjYEn2dmS1Wrs3W5p5kyzIwMQ5WJ6RDoA9BtGDiMcqO8IAAAABK+wkL/DAIQcI9IBIBQYOYxwoL4jgBjC+kVAdPN4pJqazpvH08cbM6sTABAlGJEOAKHAyGGEA/UdAcQQ1i8CopfHY3yO39ra+ZrVanR5HY5e3JhZnQCAKMKIdAAIBUYOIxyo7wgAACJAY2PgJLpknG9s7OWNmdUJAIgijEgHgFBg5DDChfqOAAAgVjGrEwAQRRiRDgChwMhhAAAAIDjM6gQARBFGpANAqDByGAAAAOg5ZnUCAKIIiXQACAGPJ3BtSLu9lwsvAQAAALGufVZnaalRziUz00iiM6sTABCBSKQDQB95PEafP9ACTFar8TcByXQAAABEK7tdsg44o9ZTiZ2uWQeckd3e+XyPMasTABAlYrpGutPpVFZWlsrKyswOBUAMa2wMnESXjPOBRqoDAAAA0cLhkOo+SVT1k2+qevQtqk6eZOyffFN1nyQyaKSv3G4pJ0caNMjYu91mRwQACCCmR6RXVVXJZrOZHQYAAAAAAFHN4ZAc//JN6V++aXYoscXt9q8TX1trHG/YwEh9AIgwMT0iHQAAAAAAIGItW9aRRJc6Fl0tLTU3LgBAJyTSAQAAAIQdZRcBIID6+o4kejuv11hoCQAQUWK6tAsAAACAyEDZRQAIICPDKOdydjLdYpEyM82LCQAQECPSAaCP7HbJag18zWo1rgMAAABAJy5XRzkXqaPMi8tlblwAgE4YkQ4AfeRwGDMvGxs7X7PbjesAAAAA0ElhobGwaGmp8UdFZqaRRJ850+zIAADnIJEOIKJ5PNGRoHY4IiseAAAAAFGisNDYAAARjUQ6gIjl8RgDMlpbO1+zWo0BGySvAQAAAAAAEG7USAcQsRobAyfRJeN8oJHqAAAAAAAAQKiRSAcAAACiWFlZmdLT02W1WpWXl6dt27Z12379+vUaM2aMrFarxo0bp9dff9137dSpU3rggQc0btw4DR48WCNHjtScOXP0xRdf+N3jyJEjuvXWW2Wz2TRkyBDNmzdPx44dC8vzAYhdHo9UU9N583jMjqyzaIoVABAeMZ1IdzqdysrKUllZmdmhAAAAACG3bt06lZSUyOVyqaamRjk5OSooKNChQ4cCtt+yZYtmz56tefPmaceOHZoxY4ZmzJihDz/8UJJ0/Phx1dTU6OGHH1ZNTY3cbrfq6up04403+t3n1ltv1UcffaTNmzdr48aN+sMf/qA777wz7M8LIHa0l3GcMKHzlpkZWQnqaIoVABA+Fq/X6zU7iFBrbm5WSkqKmpqaZLPZzA4HQC/V1Bid065UV0vjx/dfPEB/i5bFdgEEL1T91by8PDmdTq1cuVKS1NbWprS0NC1cuFAPPvhgp/azZs1SS0uLNm7c6Dt35ZVXKjc3V+Xl5QHfo6qqSldccYX27dsnh8Oh3bt3KysrS1VVVZo4caIkadOmTZo+fbo+++wzjRw5MizPCiC2RFNfP5piBQAEJ5i+akyPSAcAIFox8gnAVzl58qSqq6uVn5/vO5eQkKD8/HxVVlYGfE1lZaVfe0kqKCjosr0kNTU1yWKxaMiQIb57DBkyxJdEl6T8/HwlJCRo69atXd6nubnZb/vyyy978pgAAABAREgyOwAA6IrdLlmtgRcctVqN60Cs6sliu4xKB+JbY2Ojzpw5oxEjRvidHzFihPbs2RPwNQ0NDQHbNzQ0BGzf2tqqBx54QLNnz/aN0GloaNDw4cP92iUlJWno0KFd3keS0tLS/I5dLpeWLl3aZXsAQGRhtiSAeEciHUDEcjikujo6awAAmOHUqVO6+eab5fV69fOf/7zP99u/f7/fdNmBAwf2+Z4AgP7RPluyq0FOdXX8fQYg9pFIBxDRHA46ZAAABGK325WYmKiDBw/6nT948KBSU1MDviY1NbVH7duT6Pv27dObb77plwBPTU3ttJjp6dOndeTIkS7fV5JsNhs10gEgSjFbEgCokQ4AAABEpeTkZE2YMEEVFRW+c21tbaqoqNCkSZMCvmbSpEl+7SVp8+bNfu3bk+gff/yx3njjDQ0bNqzTPY4eParq6mrfuTfffFNtbW3Ky8sLxaMBiAPtZRwDibQyjtEUKwAgfHqVSC8rK1N6erqsVqvy8vK0bdu2btuvX79eY8aMkdVq1bhx4/T666/7rp06dUoPPPCAxo0bp8GDB2vkyJGaM2eOvvjiC797HDlyRLfeeqtsNpuGDBmiefPm6dixY70JHwAAAIgJJSUl+uUvf6kXX3xRu3fv1g9+8AO1tLRo7ty5kqQ5c+Zo8eLFvvaLFi3Spk2b9NRTT2nPnj1aunSptm/frgULFkgy+ubf/e53tX37dq1evVpnzpxRQ0ODGhoadPLkSUnSZZddpmnTpmn+/Pnatm2b3n//fS1YsEC33HKLRo4c2f9fBABRqb2MY3V15y3SyoREU6wIH49HqqnpvHk8ZkcGoL8EXdpl3bp1KikpUXl5ufLy8rRixQoVFBSorq6u06JDkrRlyxbNnj1by5cv1/XXX681a9ZoxowZqqmp0dixY3X8+HHV1NTo4YcfVk5Ojv76179q0aJFuvHGG7V9+3bffW699VYdOHBAmzdv1qlTpzR37lzdeeedWrNmTd++AgAARCAW2wXQE7NmzdLhw4f1yCOPqKGhQbm5udq0aZNvQVGPx6OEhI6xM5MnT9aaNWu0ZMkSPfTQQxo9erRefvlljR07VpL0+eef69VXX5Uk5ebm+r3XW2+9palTp0qSVq9erQULFuiaa65RQkKCioqK9Nxzz4X/gQHElGgq4xhNsSL0qBEPQJIsXq/XG8wL8vLy5HQ6tXLlSknG9NG0tDQtXLhQDz74YKf2s2bNUktLizZu3Og7d+WVVyo3N1fl5eUB36OqqkpXXHGF9u3bJ4fDod27dysrK0tVVVWaOHGiJGnTpk2aPn26Pvvss04jX5qbm5WSkqKmpibqMAIAopbHw2K7QKyKp/5qPD0rAMSqmhppwoSur1dXS+PH9188/S3enx+IZcH0VYMq7XLy5ElVV1crPz+/4wYJCcrPz1dlZWXA11RWVvq1l6SCgoIu20tSU1OTLBaLhgwZ4rvHkCFDfEl0ScrPz1dCQoK2bt0azCMAABA1HA6jQ37uRhIdAAAA/clul6wDzgS8Zh1whtmSAOJCUKVdGhsbdebMGd9U0XYjRozQnj17Ar6moaEhYPuGhoaA7VtbW/XAAw9o9uzZvk8BGhoaOpWNSUpK0tChQ7u8j2R8onC2gQMHauDAgV22BwAAAAAAgD+HQ6r7++lq3NMo6ezCBhbZL71IDscms0IDgH7Tq8VGw+XUqVO6+eab5fV69fOf/7zP90tLS1NKSopvW758eQiiBBAT3G4pJ0caNMjYu91mRwQAAAAAEcux9w8arxqN146ztho5Pn3H7NAAoF8ENSLdbrcrMTFRBw8e9Dt/8OBBpaamBnxNampqj9q3J9H37dunN998068mTWpqqg4dOuTX/vTp0zpy5EiX7ytJ+/fv97sPo9EBSDKS5kVFksUieb1Sba1xvGGDVFhodnQAAAAAEHkyMoy/nc5eas9iMVbhBIA4ENSI9OTkZE2YMEEVFRW+c21tbaqoqNCkSZMCvmbSpEl+7SVp8+bNfu3bk+gff/yx3njjDQ0bNqzTPY4eParq6mrfuTfffFNtbW3Ky8vrMl6bzea3kUgHIElatqwjiS4Ze4tFKi01Ny5EP2Y6AAAAIFa5XB1/O0kdf1O5XObG1Q/sdslqDXzNahU14oE4EXRpl5KSEv3yl7/Uiy++qN27d+sHP/iBWlpaNHfuXEnSnDlztHjxYl/7RYsWadOmTXrqqae0Z88eLV26VNu3b9eCBQskGUn07373u9q+fbtWr16tM2fOqKGhQQ0NDTp58qQk6bLLLtO0adM0f/58bdu2Te+//74WLFigW265RSNHjgzF1wFAPKmv9x9FIRnHdXXmxBNLoiWRHI4422c61NZKra0dMx0i9WsAAP3M6XQqKytLZWVlZocCAOiNwkJjFm92tpE9zs42+rozZ5odWdg5HMafi9XVnbe6OuM6gNhn8XrPzSZ9tZUrV+rJJ59UQ0ODcnNz9dxzz/lGhk+dOlXp6el64YUXfO3Xr1+vJUuWaO/evRo9erSeeOIJTZ8+XZK0d+9ejRo1KuD7vPXWW5o6daok6ciRI1qwYIFee+01JSQkqKioSM8995zOP//8Tq9rbm5WSkqKmpqa/Eq7AIAkI3EaaEpidra0c6dpYUW9c0vmtO8jrWROuOLk3xWAIMRTfzWenhUAAADRJZi+aq8S6ZGOzjqAbnWVSI2T0RRhEy2J5HDFOWiQMRL9XFardOJE7+8LICbFU381np4VAAAA0SWYvmrQpV0AIOrF8ZTEsIqWkjnhijMjo6NeZDsWXwIAAAAAICaQSAcQnwoLjdHHJ04Ye5LofRctieRwxRnHiy8BAAAAABDrSKQDAEIjWhLJ4YqTmQ4AAABA8Nxuo/zioEHG3u02OyIACIhEOgAgNKIlkRzOOJnpAAAAAPRc+/pVtbXGekO1tcYxyXQAEYjFRgEAAIB+Fk/91Xh6VgBAkHJyjOT52akpi8UY7LJzp2lhAYgfwfRVk/opJlM4nU4lJiaquLhYxcXFZocDAIgAHo/U2Nj5vN0uORz9Hw8AAAAQt+rr/ZPoknFcV2dOPADQjZhOpFdVVTHqBQDg4/EYa4q2tna+ZrUa/XWS6QAAAEA/ycgIPCI9M9O8mACgCzGdSAcA4GyNjYGT6JJxvrGRRDoAAACiW1TNwHS5jJroFouRTG/fu1xmRwYAnbDYKABEOlaxBwDEAKfTqaysLJWVlZkdCgDErPYZmBMmdN4yM43rEaWwUNqwwaiJbrUae7dbmjnT7MgAoBNGpANAJGtfxb59ZEb7KvYbNhidTgAAogRlFwEg/KJyBmZhIX/bAIgKjEgHgEi2bFlHEl3qmO5YWmpuXAAAAAAAAHGEEekAEMlYxR4AAAAAeiyqasQDiCok0gEgkrGKfUjZ7UbpxUDTXa1W4zoAAACA6NReI76r/n5dHcl0AL1HIh0AIhmr2IeUw2F0nhmhAgAAAMSeqKwRDyBqkEgHgAjmmVioxicrpFWrpH37pK99TbrzTtknfFP0/3rH4aDzDAAAgNjEDEwACB8S6QAQoTqmJX5T0jeNkx9Lul+yPsy0RAAAAAD+fDMwf/um9ItfGH9UOBzSXXfJfvM3+fsBAPqARDoARCimJQIAAAAIlmO7W477zyoP+eet0v2/lb6+QXIUmh0eAEStBLMDCCen06msrCyVlZWZHQoAAAAAAED4LVvWkUSXOtZaKi01Ny4AiHIxPSK9qqpKNpvN7DAAAAAAAAD6R319RxK9nddr1HyJcdSIBxBOMZ1IBwD0H4/HKDdzLru99yVownFPAIA5nE6nEhMTVVxcrOLiYrPDAYDYlZEh1db6J9MtFmMBphjnqxHP3xAAwoBEOgCgzzoWRu18zWrt3cKo4bgnAMA8zBYFgH7icklFZ9VIb9+7XGZH1i8cDv5OABAeMV0jHQCiWfu0xED6PC3R7ZZycqRBg4y9292Hm/VsYdRIuCcAAAAQ8woLpQ0bpOxs4w+H7Gyjvz9zptmRAUBUY0Q6AESosE1LdLv9R6jU1hrHGzYYnW4AAAAA0a2wkL49AIQYiXQAiGBhmZa4bFlHEl3qmO5ZWkpnGwAAAAAAIABKuwBAvKmv9194SDKO6+rMiQcAAAAAACDCkUgHgHiTkWGMQD+bxWKs7AkAAAAAAIBOSKQDQLxxuTrKuUgdZV5crl7fMhwLo4Z1sVUAAAAAAIAgUCMdAOJNYaGxsGhpqVHOJTPTSKLPnNnrW4ZjYdSwLbYKAAAAAAAQJBLpABCPCgtDvrBoOBZGDctiqwAAAAAAAEGK6dIuTqdTWVlZKisrMzsUAAAAAAAAAECUiukR6VVVVbLZbGaHAQAAAAAAAACIYjE9Ih0AAABAZGC2KAAAAKJZTI9IB4BAPB4WsAQAoL8xWxQAAADRjEQ6gLji8UiZmVJra+drVqtUV0cyHQAAAAAAAP4o7QIgrjQ2Bk6iS8b5QCPVAQAAAAAAEN9IpAMAAAAAAAAA0A0S6QAAAAAAAAAAdINEOgAAABClysrKlJ6eLqvVqry8PG3btq3b9uvXr9eYMWNktVo1btw4vf76637X3W63rr32Wg0bNkwWi0U7d+7sdI+pU6fKYrH4bXfffXcoHwsAAACIOCTSAQAAgCi0bt06lZSUyOVyqaamRjk5OSooKNChQ4cCtt+yZYtmz56tefPmaceOHZoxY4ZmzJihDz/80NempaVFV111lR5//PFu33v+/Pk6cOCAb3viiSdC+mwAAABApLF4vV6v2UGEWnNzs1JSUtTU1CSbzWZ2OAAiiMcjZWYGXnDUapXq6iSHo//jAgDEl1D0V/Py8uR0OrVy5UpJUltbm9LS0rRw4UI9+OCDndrPmjVLLS0t2rhxo+/clVdeqdzcXJWXl/u13bt3r0aNGqUdO3YoNzfX79rUqVOVm5urFStW9ChO+uYAAACIVMH0VWN6RLrT6VRWVpbKysrMDgVAhHA4jGR5dXXnjSQ6ACBanDx5UtXV1crPz/edS0hIUH5+viorKwO+prKy0q+9JBUUFHTZvjurV6+W3W7X2LFjtXjxYh0/fjzoewAAAADRJMnsAMKpqqqKUS8AOnE4SJgDAKJbY2Ojzpw5oxEjRvidHzFihPbs2RPwNQ0NDQHbNzQ0BPXe3/ve9/S1r31NI0eO1AcffKAHHnhAdXV1crvd3b6uubnZ73jgwIEaOHBgUO8NAAAAmCWmE+kAAAAAQuvOO+/0/fe4ceN08cUX65prrtGf//xn/f3f/32Xr0tLS/M7drlcWrp0abjCBAAAAEKKRDoAAAAQZex2uxITE3Xw4EG/8wcPHlRqamrA16SmpgbVvqfy8vIkSZ988km3ifT9+/f7zRZlNDoAAACiSUzXSAcAAABiUXJysiZMmKCKigrfuba2NlVUVGjSpEkBXzNp0iS/9pK0efPmLtv31M6dOyVJF198cbftbDab30YiHQAAANGERDoAILK53VJOjjRokLH/ihq8ABAvSkpK9Mtf/lIvvviidu/erR/84AdqaWnR3LlzJUlz5szR4sWLfe0XLVqkTZs26amnntKePXu0dOlSbd++XQsWLPC1OXLkiHbu3Kldu3ZJkurq6rRz505fHfU///nPevTRR1VdXa29e/fq1Vdf1Zw5c/SNb3xD2dnZ/fj0AAAAQP+itAsAIHK53VJRkWSxSF6vVFtrHG/YIBUWmh0dAJhq1qxZOnz4sB555BE1NDQoNzdXmzZt8i0o6vF4lJDQMW5m8uTJWrNmjZYsWaKHHnpIo0eP1ssvv6yxY8f62rz66qu+RLwk3XLLLZI66pknJyfrjTfe0IoVK9TS0qK0tDQVFRVpyZIl/fTUAAAAgDksXq/XG+yLysrK9OSTT6qhoUE5OTl6/vnndcUVV3TZfv369Xr44Ye1d+9ejR49Wo8//rimT5/uu+52u1VeXq7q6modOXJEO3bsUG5urt89pk6dqnfeecfv3F133aXy8vJO79fc3KyUlBQ1NTX51WEEAESZnBwjeX72ryqLRcrOlv6nlAAARKN46q/G07MCAAAgugTTVw26tMu6detUUlIil8ulmpoa5eTkqKCgQIcOHQrYfsuWLZo9e7bmzZunHTt2aMaMGZoxY4Y+/PBDX5uWlhZdddVVevzxx7t97/nz5+vAgQO+7Yknngg2fABANKmv90+iS8ZxXZ058QAAAAAAgLgU9Ij0vLw8OZ1OrVy5UpKxqFFaWpoWLlyoBx98sFP7WbNmqaWlRRs3bvSdu/LKK5Wbm9tpNPnevXs1atSoLkek5+bmasWKFV8ZI6NeACBGMCIdQIyKp/5qPD0rAAAAokvYRqSfPHlS1dXVys/P77hBQoL+//buPraqu/4D+Lu0Kc2YLNmKlE2YbtkDWFhjBwSYLCK6xCVzQsx0ZA+YzCzhDx1L3DQIy/7xLw2JI1lUyKJxOs2WxfgHPtTEh4gRmTyMSVWSpVug3SoEtrGx2N7fH3X11wBXCm3Pufe+XkkTes65t++e+833fO6H0+9dvXp1du3addbH7Nq1a8zxSXLbbbed8/hqfvjDH6a9vT2dnZ356le/mlOnTo37OQCoIVu2jDTRm5pGvn9vrfQtW4rNBQAAADSUcX3Y6ODgYIaGhkY/wOg9s2fPzqFDh876mP7+/rMe39/fP66gd999d66++upceeWV2b9/fx555JH09vbmueeeO+djTp48Oeb76dOnZ/r06eP6uQAUaM2akQ8WffzxkeVcbrhhpIn+mc8UnQwAgJLq60sGB8/c3t6ezJs39XmqqaWsAI1uXI30In3xi18c/ffChQszZ86cfPzjH8/hw4dz7bXXnvUxc+fOHfP9li1b8thjj01mTAAm2po1I18AAPA/9PWN3Hvxzjtn7mtrG7k3oywN6lrKCsA4G+nt7e1pbm7OwMDAmO0DAwPp6Og462M6OjrGdfz5Wrp0aZLkn//85zkb6a+88sqYtW3cjQ4AAMVYvHhxmpubs2HDhmzYsKHoOECdGhw8e2M6Gdk+OFie5nQtZQVgnGukt7a2pru7Oz09PaPbhoeH09PTk2XLlp31McuWLRtzfJL86le/Oufx52vvfz5kbs6cOec8ZubMmWO+NNIBAKAYu3fvzksvvaSJDgBATRr30i4bN27Mfffdl5tvvjlLlizJ1q1b89Zbb2X9+vVJknvvvTdXXXVVvvGNbyRJvvSlL+XWW2/NN7/5zdx+++358Y9/nL/85S/5zne+M/qcx44dS19fX44cOZIk6e3tTTJyN3tHR0cOHz6cp59+Op/61KdyxRVXZP/+/XnooYeycuXKLFq06KJPAgAAAAAAnMu4G+l33XVXXn/99WzevDn9/f3p6urKzp07Rz9QtK+vL9Om/fdG9+XLl+fpp5/Opk2b8rWvfS3XXXddnn/++XR2do4e87Of/Wy0EZ8kn/vc55L8d03z1tbW/PrXvx5t2s+dOzdr167Npk2bLvgXBwAAAACA89FUqVQqRYeYaCdPnsxll12WEydOjFkjHQAAyqCR6tVG+l2B4r3wQtLdfe79e/YkH/nI1OWpppayAtSr8dSq41ojHQAAAKCs2tuTtraz72trG9lfFrWUFYALWNoFgNrW15cMDp65vb09mTdv6vMAAMBEmTcv6e2tjXq3lrJOFu9NgFqikQ7QQPr6khtuSN5558x9bW0jhbyCFQCAWjZvXu3UtLWUdaJ5bwLUGku7ADSQwcGzF6rJyPaz3Q0CAAAw0bw3AWqNRjoAAAAAAFRR1430xYsXZ8GCBdm2bVvRUQAAAAAAqFF1vUb67t27M3PmzKJjAAAAAABQw+r6jnQAAKAc/LUoAAC1rK7vSAdgrPb2pK3t7B/q09Y2sh8AJoO/FgXg//PeBKg1GukADWTevKS3NxkcPHNfe/vIfgAAgMnmvQlQazTSARrMvHmKUgAAoHjemwC1xBrpAAAAAABQhUY6AAAAAABUoZEOAAAAAABVaKQDAAAAAEAVGukAAAAAAFCFRjoAAAAAAFRR1430xYsXZ8GCBdm2bVvRUQAAAAAAqFEtRQeYTLt3787MmTOLjgEAAA1v8eLFaW5uzoYNG7Jhw4ai4wAAwLjUdSMdAAAoBze5AABQy+p6aRcAAAAAALhYGukAAAAAAFCFRjoAAAAAAFShkX6eTp8+ncceeyynT58uOgoNyPijaMYgRTMGKZLxVy5eD4pmDFIk44+iGYMUrcgx2FSpVCpT/lMn2cmTJ3PZZZflxIkTE/aBRpPxnHC+jD+KZgxSNGOQIqktL85E/66NdO4oJ2OQIhl/FM0YpGhF1pbuSK8j27ZtKzpCVfLVt1o4f2XPWPZ8ZVf28ydf/Sv7OZQPpk4tjOeyZyx7vrIr+/mTr/6V/RzKV9/Kfv7Kni+pjYxF0EivI2Uf5PLVt1o4f2XPWPZ8ZVf28ydf/Sv7OZQPpk4tjOeyZyx7vrIr+/mTr/6V/RzKV9/Kfv7Kni+pjYxFaCk6wGR4b7WakydPTthzvvdcE/mcE21oaEi+i1DmfMbfxCh7xjLnMwYvnnwXxxi8ePJduMkYf+89Vx2usniGia7NzQcTo+wZy5zPGLx48l24Whh/SbnPYSLfxaiFMVjm85eUP19S7owTPQbHU5fX5Rrpr776aubOnVt0DAAAqOqVV17JBz7wgaJjTCq1OQAAZXc+dXldNtKHh4dz5MiRvO9970tTU1PRcQAAYIxKpZI33ngjV155ZaZNq+/VFtXmAACU1Xjq8rpspAMAAAAAwESp79tfAAAAAADgImmkAwAAAABAFRrpAAAAAABQhUY61JhDhw7liiuuyLXXXpuurq5ceumlueWWW4qORR3btm1bPvjBD6atrS1Lly7Nn//856Ij0SDMdwCUnWsVU01tTlHMd6CRDjXnxhtvzNKlS/P8889n7969ueqqq/KLX/yi6FjUqWeeeSYbN27Mli1b8sILL+Smm27Kbbfdltdee63oaDQA8x0AZedaxVRSm1Mk8x1opF+Q+fPnp6mp6axfTzzxRNHxaAC9vb254YYbcurUqQwNDWXGjBlFR6JOfetb38oDDzyQ9evXZ8GCBXnyySdzySWXZMeOHUVHo0GY7yiSmq/8vEaUgWsVU0VtTtHMdxSlLDWfRvoFePbZZ5MkPT09OXr0aF5++eVMmzYtP/3pT/PAAw8UnI5698Ybb2T69OlpbW3NwYMHM3/+/KIjUafefffd7NmzJ6tXrx7dNm3atKxevTq7du0qMBmNwnxH0dR85ec1omiuVUwVtTlFM99RpLLUfBrpF2BgYCAtLS1ZsWJFOjo6Mjg4mOHh4Xz0ox/N9OnTi45HnXvppZeyYMGCJMnf/va3XH/99QUnol4NDg5maGgos2fPHrN99uzZ6e/vLygVjcR8R9HUfOXnNaJorlVMFbU5RTPfUaSy1Hwa6f/x6KOPnvNPBN77OnToUJLkwIEDuf7660dfqH379uX973//GRc0mAwHDx7Mhz/84STJjBkz8stf/jL/+te/Ck4FMPHMdxRNzVcMdTm1xLUKaBTmO4pUlpqvZUp/Wok9/PDDuf/++6sec8011yRJ9u/fn4ULF45u37dv35jvYTJ94QtfGP332rVrs3bt2gLTUM/a29vT3NycgYGBMdsHBgbS0dFRUCoaifmOoqn5iqEup5a4VjFV1OYUzXxHkcpS87kj/T9mzZqVG2+8sepXa2trkpEXb9GiRaOP3bdv35jv4UKM5+4rmAqtra3p7u5OT0/P6Lbh4eH09PRk2bJlBSYDmBpqvmKoyykDtTllozYHGllZaj53pI/T8PBwDh48mM2bN49uO3z4cNasWVNgKurB+d591dTUVPWYSqUygalodBs3bsx9992Xm2++OUuWLMnWrVvz1ltvZf369UVHowGY7yiSmq/8vEZMJrU5ZaQ2p0jmO4pSpppPI32cDh8+nFOnTo35X4+FCxdmy5Yt6e7uzooVKwpMRy2bNWtWZs2a9T+P6+vryz333JPXXnstLS0t+frXv57PfvazU5CQRnTXXXfl9ddfz+bNm9Pf35+urq7s3LnT2rNMCfMdRVLzlZ/XiMmkNqeM1OYUyXxHUcpU8zVV/JcR1JSjR49mYGAgXV1d6e/vT3d3d/7+979nxowZRUcDmFDmOwDKzrUKaBTmO3BHOtScOXPmZM6cOUmSjo6OtLe359ixYy5eQN0x3wFQdq5VQKMw34EPG4WatmfPngwNDWXu3LlFRwGYVOY7AMrOtQpoFOY7GpU70qFGHTt2LPfee2+++93vFh0FYFKZ7wAoO9cqoFGY72hk7kiHGnT69OnceeedefTRR7N8+fKi4wBMGvMdAGXnWgU0CvMdjU4jHWpMpVLJ/fffn1WrVuWee+4pOg7ApDHfAVB2rlVAozDfQdJUqVQqRYcAzt8f/vCHrFy5MosWLRrd9oMf/CALFy4sMBXAxDPfAVB2rlVAozDfgUY6AAAAAABUZWkXAAAAAACoQiMdAAAAAACq0EgHAAAAAIAqNNIBAAAAAKAKjXQAAAAAAKhCIx0AAAAAAKrQSAcAAAAAgCo00gEAAAAAoAqNdAAAAAAAqEIjHQAAAAAAqtBIB+CCzZ8/P9/73veKjgEAAA1NXQ4w+TTSARhj165daWpqyu233171uLfffjv/+Mc/ctNNN01RMgAAaBzqcoBy0UgHYIzt27fn85//fHp6enLkyJFzHvfiiy+mUqmks7NzCtMBAEBjUJcDlItGOgCj3nzzzTzzzDP58pe/nI997GN56qmnzjhm7969WbVqVW655ZYMDw9n3rx52bp165RnBQCAeqUuBygfjXQARv3kJz9JR0dHlixZknXr1mXHjh2pVCqj+w8fPpxbb701q1atyh133JE1a9bk4YcfzkMPPZS9e/cWFxwAAOqIuhygfDTSARi1ffv2rFu3Lkly55135ujRo/ntb387uv/BBx/MmjVrsmnTpvT19WXFihX5yle+kpkzZ+b3v/99UbEBAKCuqMsBykcjHYAkSW9vb/74xz+OFuyXXnppPv3pT2f79u1Jkv7+/vzmN7/Jgw8+mKGhoRw4cCBdXV2ZNm1ampub09raWmR8AACoC+pygHLSSAcgychdL4sXL8511103um3dunV59tlnc+LEifzpT3/K8PBwurq60tvbm7fffjtdXV15+eWXc/z48SxfvrzA9AAAUB/U5QDlpJEOQP7973/n+9//fu6+++4x2z/5yU/mkksuyY9+9KO8++67SZJ33nknf/3rX3P11Vfn8ssvz5NPPpnOzs4sXLiwiOgAAFA31OUA5dVSdAAAivfzn/88AwMD6ezszIsvvjhm38qVK7N9+/Y899xzaWlpyeOPP54333wz11xzTZ544ol8+9vfzu9+97uCkgMAQP1QlwOUl0Y6AKPrLX7iE5845zHHjx/Pjh078sgjj+To0aNpaWnJqVOnsnPnznR3d09VVAAAqFvqcoDyaqpUKpWiQwBQWy6//PI89dRTueOOO4qOAgAADUtdDjB1rJEOwLi8+uqrOX78eDo7O4uOAgAADUtdDjC1NNIBGJcDBw5kxowZ+dCHPlR0FAAAaFjqcoCpZWkXAAAAAACowh3pAAAAAABQhUY6AAAAAABUoZEOAAAAAABVaKQDAAAAAEAVGukAAAAAAFCFRjoAAAAAAFShkQ4AAAAAAFVopAMAAAAAQBUa6QAAAAAAUIVGOgAAAAAAVKGRDgAAAAAAVfwfqP0BQ/Yxg5QAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_delta_phi_c_l0 = files[\"test\"][\"Nominal/h_delta_phi_c_l0_WW\"]\n", + "h_delta_phi_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_delta_phi_c_l0_WW\"]\n", + "\n", + "h_delta_phi_l1_l2 = files[\"test\"][\"Nominal/h_delta_phi_l1_l2_WW\"]\n", + "h_delta_phi_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_delta_phi_l1_l2_WW\"]\n", + "\n", + "values1, edges1 = h_delta_phi_c_l0.to_numpy()\n", + "values2, edges2 = h_delta_phi_c_l0_noCR.to_numpy()\n", + "values3, edges3 = h_delta_phi_l1_l2.to_numpy()\n", + "values4, edges4 = h_delta_phi_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\Delta\\phi$')\n", + "ax1.set_title(r'$\\Delta\\phi$: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax1.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\Delta\\phi$')\n", + "ax2.set_title(r'$\\Delta\\phi$: W2 $\\rightarrow$ $q_1q_1$')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "ax2.set_xticks(np.arange(-np.pi, np.pi + 0.1, np.pi / 2))\n", + "ax2.set_xticklabels([r'$-\\pi$', r'$-\\frac{\\pi}{2}$', r'$0$', r'$\\frac{\\pi}{2}$', r'$\\pi$'])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "32bb6f3f-9394-4ea2-a98e-37ee57ebef27", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAJOCAYAAACz9fURAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACQBklEQVR4nOzdfXyT9b3/8Xfa0gaEFDHQUtdQUClUaZESOpiK086CHh22m4jugIyBN4UNerxjByngjqAgVqWz6kTdJj8Yx6rTbUytwrypUAtMbot4lCDQYvXQTpAW2uv3R06DsW0gbdLcvZ6PRx4x1/XNdX2uVLdPPvlen6/JMAxDAAAAAAAAAACgTVGBDgAAAAAAAAAAgGBGIR0AAAAAAAAAAA8opAMAAAAAAAAA4AGFdAAAAAAAAAAAPKCQDgAAAAAAAACABxTSAQAAAAAAAADwgEI6AAAAAAAAAAAeUEgHAAAAAAAAAMADCukAAAAAAAAAAHhAIR0AAAAAAAAAAA8opAMAAAAAAAAA4AGFdAAIIg899JCGDBmi5uZmj+MyMzN1/fXXt9peUlIim82mhoYGf4UIAAAAhDVy8tCyYMECmUymQIcBIAJQSAeAIFFfX68HH3xQ99xzj6Ki2v+fZ8MwtHv3bqWlpbXad8stt6ixsVFPPvlkh2L405/+JJPJpJdeeqnVvoyMDJlMJr399tut9tlsNo0ZM8b1+uuvv1ZhYaHGjRunPn36yGQy6bnnnutQTAAAAEBXCaecvKKiQjNnztSFF16os846SzabTTfccIP27NnTobgAINJRSAeAILFy5UqdPHlSkyZN8jjus88+07Fjx9pM2s1ms6ZMmaLly5fLMAyvY7jkkkskSe+++67b9vr6em3fvl0xMTF677333Pbt379f+/fvd71Xkmpra7Vo0SLt2rVLGRkZXscBAAAABEI45eQPPvigXnzxRV155ZV69NFHNWPGDP3jH//QiBEjtH37dq/jAoBIRyEdAILEs88+q+uuu05ms9njuJ07d0pSm0m7JN1www3at29fm7NUTicpKUkDBw5slbSXl5fLMAz99Kc/bbWv5fW3k/b+/fvr0KFD2rdvn5YuXep1HAAAAEAghFNOXlBQoH379umxxx7TL37xC82bN0/vvPOOTp48qSVLlngdFwBEOgrpAODBgQMHNG3aNCUlJSkuLk4DBw7U7bffrsbGRteYLVu2aPz48bJYLOrZs6euvPJKffDBB27H+de//qXZs2crJSVFcXFx6tevn370ox9p8+bNkqRPP/1UH330kbKzs9uN5aWXXnLrw3jppZfq5ptvVl1dndu4zMxM9enTR6+88orb9t27d8vhcJz2mi+55BJt2bJF33zzjWvbe++9pwsvvFDjx4/XBx984NYv8r333pPJZNIPfvAD17a4uDglJiae9lyBdrq/7+n+bgAAAPA/cnInb3PyMWPGKDY21u24F1xwgS688ELt2rXrtDF0hVtuuUUpKSmttrfX9/zdd9+V3W6X2WzWeeed1+H2OQDQETGBDgAAgtXBgwc1atQoHTlyRDNmzNCQIUN04MAB/fd//7eOHTum2NhY7dixQ5deeqksFovuvvtudevWTU8++aQuv/xybdiwQVlZWZKk2267Tf/93/+tmTNnKi0tTV9++aXeffdd7dq1SyNGjND7778vSRoxYkSbsSxdulR33323Jk2apBMnTqi+vl7jxo3Tk08+KcMwtGrVKrfxI0aMaHW759ChQzV27FitX7/e43Vfcskl+sMf/qCNGzfq8ssvl+RMzMeMGaMxY8aorq5O27dvV3p6umvfkCFDdM4553j7EfvEfffdJ5vNpunTp3v1vjP5+57u7wYAAAD/Iif3bU5uGIZqamp04YUXehznrY7m5N7Ytm2brrrqKvXt21cLFizQyZMnVVhYqISEBL+dEwDcGACANk2ePNmIiooyKioqWu1rbm42DMMwJkyYYMTGxhqffPKJa9/BgweNXr16GZdddplrW3x8vJGfn9/uuebNm2dIMv71r3+12rdp0ybDZDIZd955p2EYhjF48GBj0qRJhmEYxo9+9CMjJibGOHr0qNt7ZsyYYXTv3t1tmyRj7Nixp7lqw9ixY4chybj//vsNwzCMEydOGGeddZbx/PPPG4ZhGAkJCUZxcbFhGIZRX19vREdHG9OnT2/3eBUVFYYk49lnnz3tuTti1qxZhslk8vr4Z/L3Pd3fDQAAAP5FTu6bnLzFH/7wB0OS8cwzz5x2rDc6mpNPmTLFGDBgQKvthYWFxndLVhMmTDDMZrOxb98+17adO3ca0dHRrcYCgD/Q2gUA2tDc3KyXX35Z1157rUaOHNlqv8lkUlNTk15//XVNmDBBgwYNcu3r37+/brrpJr377ruqr6+XJPXu3VsbN27UwYMH2zzfl19+qZiYGPXs2bPVvgcffFB9+/bVokWL9M0332jv3r2uBTx/8IMf6OTJkzp8+LDbe84++2x98803OnbsmGubYRinnfkiOWfJnHPOOa4+i//85z919OhRjRkzRpLzFtGWmTXl5eVqampy68Xoa8ePH/f4eOihhzRlyhRNmzat1Syg9pzJ31c6/d8NAAAA/kNO7tucfPfu3crPz9fo0aM1ZcqU08bwbf7Iyb3R1NSkv//975owYYJsNptr+9ChQ5WTk+Pz8wFAWyikA0AbvvjiC9XX1+uiiy7yOObYsWNKTU1ttW/o0KFqbm7W/v37JUkPPfSQtm/fruTkZI0aNUoLFizQ//zP/5w2jpMnT2rdunUaP368unfvru3bt6u5udl1C+fRo0clOZP0bzMMQ5La7Ct4OiaTSWPGjHH1XXzvvffUr18/nX/++ZLck/aWZ38V0r/++mt17979tI/nnntOzc3Nmjx5sqqrq0973DP5+0od/7sBAACg88jJfZeTV1dX65prrlF8fLz++7//W9HR0Wcci79ycm988cUX+uabb3TBBRe02tfW3x4A/IEe6QDQBW644QZdeumleumll/T6669r6dKlevDBB1VaWqrx48frnHPO0cmTJ/Wvf/1LvXr1cr1v7969Onr0qIYNGyZJ+uijjyTJNftl69atGjBggOLj493O97//+7/q0aOHunfv3qF4L7nkEr366qvatm2bqxdjizFjxuiuu+7SgQMH9O677yopKclt9o8vmc1mPfvss6cd9/e//12rV69Wbm6u+vbt67Pzn+7vBgAAgNARqTl5XV2dxo8fryNHjuidd95RUlKSV3H4Mydv70eGpqYmr2IEgK5AIR0A2tC3b19ZLBZt377d45gePXqoqqqq1b7du3crKipKycnJrm39+/fXHXfcoTvuuEOHDx/WiBEj9F//9V8aP368hgwZIkn69NNPXTNbJGfyLUlnnXWWJOctnVarVUlJSaqtrdWGDRt02223tTr/p59+qqFDh3bs4nVqNsu7776r9957T7Nnz3bty8zMVFxcnNavX6+NGzfq6quv7vB5TicmJka33HKLxzFvvPGGXnrpJU2YMEGrVq06o9k1Z/L3beHp7wYAAAD/ISfvfE5+/PhxXXvttdqzZ4/efPNNpaWleR2Hv3JyyTmL/8iRI622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btfXX3+tdevWufVRf+GFFzRkyBBdeeWVuvrqq3XJJZfoqaee6sy1AwAAIIy98soruvbaa9vd/+///u+aPXu2fvzjH+vtt9/W1q1bdd999+mVV17R66+/7hp34YUX6tChQ3I4HHr22We1bt063X777V1xCWekuLhYKSkpMpvNysrK0qZNm9od+/TTT+vSSy/V2WefrbPPPlvZ2dmtxhuGofnz56t///7q3r27srOz9fHHH7uN+eqrr3TzzTfLYrGod+/emjZtmmuiDAAAAPBdYZGbG2Gorq7OkGTU1dUFOhQAAICg8s033xg7d+40vvnmm84d6MUXDSM93TDMZufziy/6JsA2vPrqq0Z8fLxx8uRJwzAMY8uWLYYk45577nGNmTZtmnHzzTe7ve+8884z/va3v7V5zDVr1hiSjJdffrnVvubmZuPIkSOGYRhGYWGhkZGR4ba/oKDAOPvss08bt6fP2lf56urVq43Y2Fhj5cqVxo4dO4zp06cbvXv3Nmpqatocf9NNNxnFxcXGli1bjF27dhm33HKLER8fb3z++eeuMUuWLDHi4+ONl19+2fjnP/9pXHfddcbAgQPdrmPcuHFGRkaG8cEHHxjvvPOOcf755xuTJk1q85zk5gAAAK35LC83DHLz0+TmvsrLvZ6RDgAAgAhXWirl5UnbtknHjzuf8/Kc2/3g0ksv1b/+9S9t2bJFkvO2UKvVqvXr17vGbNiwQZdffrnr9Y4dO3T48GFdccUVbR7zhRdeUGpqqn784x+32mcymRQfH9/m+z777DP9/e9/V2xsbMcvyIeWL1+u6dOna+rUqUpLS1NJSYl69OihlStXtjn+hRde0B133KHhw4dryJAh+t3vfuda80hyzkYvKirSvHnz9OMf/1jp6en6/e9/r4MHD+rll1+WJO3atUvr1q3T7373O2VlZemSSy7R448/rtWrV+vgwYNddekAAACQyM27MDenkA4AAADvLFwomUySYThfG4bz9aJFfjldfHy8hg8f7krO169frzlz5mjLli36+uuvdeDAAe3du1djx451veeVV15RTk5Ou0n1xx9/rNTU1DM6/7Zt29SzZ091795dAwcO1I4dO3TPPfd0+ro6q7GxUZWVlcrOznZti4qKUnZ2tsrLy8/oGMeOHdOJEyfUp08fSdKnn36q6upqt2PGx8crKyvLdczy8nJXz8oW2dnZioqK0saNG9s9V319vdujoaHBq+sFAABAG8jNuyw3p5AOAAAA7+zZcypRb2EYUlWV3045duxYrV+/XoZh6J133lFubq6GDh2qd999Vxs2bFBSUpIuuOAC1/hXXnlF1113XbvHM74bvwepqanaunWrKioqdM899ygnJ0ezZs3q1PX4Qm1trZqamlxrFbVISEhQdXX1GR3jnnvuUVJSkqtw3vI+T8esrq5Wv3793PbHxMSoT58+Hs+bnJys+Ph412Px4sVnFCMAAAA8IDfvstycQrovlZZKGRlS9+7OZz/dQgEAABBQgwc7Z7l8m8kkneEsko64/PLL9e677+qf//ynunXrpiFDhujyyy/X+vXrtWHDBrcZL4cOHdKWLVt0zTXXtHu8wYMHa/fu3Wd07tjYWJ1//vm66KKLtGTJEkVHR2vhwoWdvqZAW7JkiVavXq2XXnpJZrPZ7+fbv3+/6urqXI+5c+f694Tk5gAAIBKQm3dZbk4h3Ve6uB8RAABAwBQWnrplVDp1K2lhod9O2dKL8ZFHHnEl5i3J+vr16916ML766qsaM2aMq11JW2666Sbt2bNHr7zySqt9hmGorq6u3ffOmzdPy5YtC3g/cKvVqujoaNXU1Lhtr6mpUWJiosf3Llu2TEuWLNHrr7+u9PR01/aW93k6ZmJiog4fPuy2/+TJk/rqq688ntdisbg94uLiTn+RHUVuDgAAIgW5eZfl5mFdSLfb7UpLS1NxcbH/T9bF/YgAAAACJjdXevFFKT1dMpudz6Wl0vXX++2UZ599ttLT0/XCCy+4EvPLLrtMmzdv1p49e9xmvfz5z3/2eOuoJN1www2aOHGiJk2apAceeEAffvih9u3bp9dee03Z2dl6++23233v6NGjlZ6ergceeMAn19ZRsbGxyszMdC0UKsm1cOjo0aPbfd9DDz2k+++/X+vWrXPrcy5JAwcOVGJiotsx6+vrtXHjRtcxR48erSNHjqiystI15q233lJzc7OysrJ8dXmdQ24OAAAiBbl5l+XmMX4/QwBVVFTIYrF0zckC0I8IAAAgYHJznY8uNHbsWG3dutWVrPfp00dpaWmqqalxLU509OhRlZWVqaioyOOxTCaTVq1apaeeekorV67Uf/3XfykmJkYXXHCBJk+erJycHI/vnzNnjm655Rbdc889Sk5O9sXldUhBQYGmTJmikSNHatSoUSoqKtLRo0c1depUSdLkyZN17rnnuvqRP/jgg5o/f75WrVqllJQUV0/znj17qmfPnjKZTJo9e7Z+85vf6IILLtDAgQN13333KSkpSRMmTJAkDR06VOPGjdP06dNVUlKiEydOaObMmbrxxhuVlJQUkM+hFXJzAAAQScjNuyQ3NxnedHMPEfX19YqPj1ddXV3XFdIzMpy3jH774zSZnL8Cbd3aNTEAAACcxvHjx/Xpp59q4MCBXdIXu6uVlpZq3rx52rlzZ6BD8fhZ+zJfXbFihZYuXarq6moNHz5cjz32mGtm+OWXX66UlBQ999xzkqSUlBTt27ev1TEKCwu1YMECSc7bZwsLC/XUU0/pyJEjuuSSS/Tb3/5WgwcPdo3/6quvNHPmTL366quKiopSXl6eHnvsMfXs2bPVscnNAQAAWgv3vFwKntzcV3k5hXRfaenD2HILacuzn2+lAAAA8Ea4J+yvv/66GhoadO211wY6lC4rpAc7cnMAAIDWwj0vl4InN/dVXh7WPdK7VAD6EQEAAMDdVVddFfBEHUGA3BwAACDgwi03D+se6V0uAP2IAAAAALSB3BwAAAA+xIx0AAAAAAAAAAA8oJAOAAAAAAAAAIAHFNIBAAAAAAAAAPCAHuk+4nBItbWtt1utks3W9fEAAAAAwcRutys6Olr5+fnKz88PdDgAAACAVyik+4DDIaWmSsePt95nNktVVRTTAQAAENkqKipksVgCHQYAAADQIbR28YHa2raL6JJze1sz1QEAAAAAAAAAoYFCOgAAAAAAAAAAHoR1Id1utystLU3FxcWBDgUAAABB6u2339bVV1+tc845Rz169FBaWpr+4z/+QwcOHJAkrV+/XiaTyfXo27evrr76am3bti3AkQMAAADhJZhz87AupFdUVGjnzp0sZgQAAOBDDoe0eXPrh8MR6Mi89+STTyo7O1uJiYl68cUXtXPnTpWUlKiurk4PP/yw29iqqiodOnRIf//739XQ0KBrrrlGjY2NAYocAAAAIDfvytycxUYBAABwxgK1yPrll1+u9PR0mc1m/e53v1NsbKxuu+02LViw4FuxOTRr1iyVlZUpKipK48aN0+OPP66EhIQ2j/n555/rl7/8pX75y1/qkUcecW1PSUnRZZddpiNHjriN79evn3r37q3ExETNnj1b1113nXbv3q30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Tk6r8evXr1e/fv2Umpqq22+/XV9++aXbMXr37q2RI0e6tmVnZysqKkobN25sN976+nq3R0NDg1fXCwAAAASSV4V0knUAAAAgONTW1qqpqUkJCQlu2xMSElRdXd3me6qrq087fty4cfr973+vsrIyPfjgg9qwYYPGjx+vpqYm1zH69evndoyYmBj16dOn3fNKUnJysuLj412PxYsXe3W9AAAAQCDFeDPYU7K+e/fuNt9zpsl6bm6uBg4cqE8++US//vWvNX78eJWXlys6OrpTyfq3FRYWasGCBWdyqQAAAEBEuvHGG13/PGzYMKWnp+u8887T+vXrdeWVV3b4uPv375fFYnG9jouL61ScAAAAQFfyqpDuLyTrAAAAgHesVquio6NVU1Pjtr2mpkaJiYltvicxMdGr8ZI0aNAgWa1W7d27V1deeaUSExNbrY908uRJffXVVx6PY7FY3HJzAAAAIJR41dolEMl6yzE6k6y3PCikAwAAIFzExsYqMzNTZWVlrm3Nzc0qKyvT6NGj23zP6NGj3cZL0htvvNHueEn6/PPP9eWXX6p///6uYxw5ckSVlZWuMW+99Zaam5uVlZXVmUuCD1itktnc9j6z2bkfAAAA3vOqkE6yjq7ElwAAAADPCgoK9PTTT+v555/Xrl27dPvtt+vo0aOaOnWqJGny5MmaO3eua/yvfvUrrVu3Tg8//LB2796tBQsW6MMPP9TMmTMlSV9//bXuuusuffDBB/rss89UVlamH//4xzr//POVk5MjSRo6dKjGjRun6dOna9OmTXrvvfc0c+ZM3XjjjUpKSur6DwFubDapqkqqrGz9qKpy7gcAAID3vG7tUlBQoClTpmjkyJEaNWqUioqKWiXr5557rmvxoF/96lcaO3asHn74YV1zzTVavXq1PvzwQz311FOSnMn6woULlZeXp8TERH3yySe6++67203WS0pKdOLECZL1CNDyJaC2tvU+q5UvAQAAABMnTtQXX3yh+fPnq7q6WsOHD9e6detcaxQ5HA5FRZ2aOzNmzBitWrVK8+bN069//WtdcMEFevnll3XRRRdJkqKjo/XRRx/p+eef15EjR5SUlKSrrrpK999/v9vdnS+88IJmzpypK6+8UlFRUcrLy9Njjz3WtRePdtls5MoAAAC+ZjIMw/D2TStWrNDSpUtdyfpjjz3mmhl++eWXKyUl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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_cos_phi_cs = files[\"test\"][\"Nominal/h_cos_phi_truth_cs_WW\"]\n", + "h_cos_phi_cs_noCR = files[\"test_noCR\"][\"Nominal/h_cos_phi_truth_cs_WW\"]\n", + "\n", + "h_cos_phi_ud = files[\"test\"][\"Nominal/h_cos_phi_truth_ud_WW\"]\n", + "h_cos_phi_ud_noCR = files[\"test_noCR\"][\"Nominal/h_cos_phi_truth_ud_WW\"]\n", + "\n", + "values1, edges1 = h_cos_phi_cs.to_numpy()\n", + "values2, edges2 = h_cos_phi_cs_noCR.to_numpy()\n", + "values3, edges3 = h_cos_phi_ud.to_numpy()\n", + "values4, edges4 = h_cos_phi_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\cos(\\phi)$')\n", + "ax1.set_title(r'$\\cos(\\phi)$: W1 $\\rightarrow$ cs')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\cos(\\phi)$')\n", + "ax2.set_title(r'$\\cos(\\phi)$: W2 $\\rightarrow$ ud')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "id": "68802325-6104-4041-b092-8d862d7e2a67", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAJOCAYAAACz9fURAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACD20lEQVR4nOzde3wU9b3/8fcmkCwIG9QAAUwMVAhEINyWFLRiaypYqnKpIl5AarFqUDEtVawSwFZQkWJLKuop6PkdOVBrEPUoVlPBG0pMiHIN4oVFIIHUNpFwCSTz+2ObhTXJks3uZHd2X8/HYx/rznxn9jOTTfzsh898x2YYhiEAAAAAAAAAANComFAHAAAAAAAAAABAOKOQDgAAAAAAAACADxTSAQAAAAAAAADwgUI6AAAAAAAAAAA+UEgHAAAAAAAAAMAHCukAAAAAAAAAAPhAIR0AAAAAAAAAAB8opAMAAAAAAAAA4AOFdAAAAAAAAAAAfKCQDgAAAAAAAACADxTSAQAAAAAAAADwgUI6ALSSRx99VH379lVdXZ3PcUOHDtX48eMbLF+2bJlSUlJ0/Phxs0IEAAAAIg55OAAgGCikA0ArqKqq0iOPPKJ7771XMTFN/+k1DEM7d+5Uenp6g3U333yzampq9NRTT7Uohr/+9a+y2Wxas2ZNg3UZGRmy2Wx6++23G6xLSUnRyJEjPa8PHz6s3NxcjRkzRuecc45sNpueffbZFsUEAAAAmCmS8vDCwkLNmDFDF154oc466yylpKTo2muv1a5du1oUFwDAPxTSAaAVLF++XCdPntTkyZN9jvvqq6905MiRRhN4u92uqVOnavHixTIMw+8YLr74YknSe++957W8qqpKW7duVZs2bfT+++97rdu7d6/27t3r2VaSKioqNH/+fO3YsUMZGRl+xwEAAAC0lkjKwx955BG9+OKLuuyyy/TEE0/o1ltv1TvvvKMhQ4Zo69atfscFAPAPhXQAaAUrVqzQVVddJbvd7nPc9u3bJanRBF6Srr32Wu3Zs6fRjpUz6d69u3r27Nkggd+4caMMw9A111zTYF3969MT+G7duunAgQPas2ePHnvsMb/jAAAAAFpLJOXhOTk52rNnj/74xz/qF7/4hR544AG9++67OnnypBYuXOh3XAAA/1BIBxC19u3bp1tuuUXdu3dXfHy8evbsqdtvv101NTWeMZs3b9YVV1whh8OhDh066LLLLtOHH37otZ9vv/1WM2fOVGpqquLj49WlSxf9+Mc/VnFxsSTpyy+/1KeffqqsrKwmY1mzZo3XnIw/+MEPdMMNN6iystJr3NChQ3XOOedo7dq1Xst37twpl8t1xmO++OKLtXnzZh09etSz7P3339eFF16oK664Qh9++KHX3JHvv/++bDabLrroIs+y+Ph4JSUlnfG9wkFRUZF+9rOfqUuXLrLb7erbt6/mz5/vNWbVqlUaNGiQ7Ha70tLS9NJLL2ny5Mm68MILQxQ1AABAZCMPd/M3Dx85cqTi4uK89tu7d29deOGF2rFjxxljaE3BzLHJ1wGECwrpAKLS/v37NXz4cK1atUqTJk3SH//4R910003asGGDjhw5Iknatm2bfvCDH+iTTz7Rb37zGz344IP68ssvdemll+qjjz7y7Ou2227Tk08+qYkTJ+rPf/6zfv3rX6tdu3aeZPaDDz6QJA0ZMqTRWB577DFNmDBBaWlp6tu3r84//3zdeOONWrlypW6//fYG44cMGdLg0s9+/fppypQpZzzuiy++WCdOnPCK//3339fIkSM1cuRIVVZWel0W+v7776tv374699xzz7hvMzz44IN65plnWrTtmjVrNHLkSG3btk2zZs3SH/7wB40cOdLz85CkP/zhD5o8ebK+973v6U9/+pNGjx6tm266SR999JH69+8frMMAAADAf5CHBzcPNwxD5eXlSkxMPGMM/ggkDw9mjk2+DiCsGAAQhaZMmWLExMQYhYWFDdbV1dUZhmEY48aNM+Li4ozPP//cs27//v1Gx44djUsuucSzLCEhwcjOzm7yvR544AFDkvHtt982WLdp0ybDZrMZv/71rw3DMIw+ffoYkydPNgzDMH784x8bbdq0Maqrq722ufXWW4127dp5LZNkjBo16gxHbRjbtm0zJBkPPfSQYRiGceLECeOss84ynnvuOcMwDKNr165GXl6eYRiGUVVVZcTGxhrTp09vcn+FhYWGJGPFihVnfO+WuPPOOw2bzeb3/ktLS4327dsb48ePN44ePeq17tixY4ZhGMann35qtG3b1njwwQe91t92222GJGP+/PkBxQ4AAICGyMODk4fX+3//7/8Zkoy//OUvZxzrj5bm4cHMscnXAYQbOtIBRJ26ujq99NJLuvLKKzVs2LAG6202m2pra/X3v/9d48aNU69evTzrunXrpuuvv17vvfeeqqqqJEmdOnXSRx99pP379zf6fv/85z/Vpk0bdejQocG6Rx55RJ07d9b8+fN19OhR7d6923MDz4suukgnT57UwYMHvbY5++yzdfToUU/HjuTuRFm/fv0Zj71fv34699xzPXMufvLJJ6qurtbIkSMluS8Xre+y2bhxo2pra73mZQy2Y8eO+Xw8+uijmjp1qm655RatXLmy2fudM2eO7Ha7nn322QbzYcbHx0uSFixYoLPPPlv333+/1/r64x0wYECARwcAAIDTkYcHNw/fuXOnsrOzNWLECE2dOvWMMZzOrDw8mDk2+TqAcEMhHUDUOXTokKqqqnxeCnjo0CEdOXJEaWlpDdb169dPdXV12rt3ryTp0Ucf1datW5WcnKzhw4dr7ty5+uKLL84Yx8mTJ7Vu3TpdccUVateunbZu3aq6ujoNHDhQklRdXS3JnbCfzjAMSe4vGv6y2WwaOXKkZw7G999/X126dNEFF1wgyTuBr382q5B++PBhtWvX7oyPZ599VnV1dZoyZYrKysrOuN/jx4/rlVde0Y033iiHw9HomJqaGr388suaMmVKg0L74cOHJcnr83Ho0CGNHTtWZ511ltLS0lRQUBDAkQMAAEQn8vDg5eFlZWUaO3asEhIS9Le//U2xsbHNjsWsPNzfHPvJJ5/UkCFD1LZtW82dO7dF+zp+/Lh+/vOfKyUlRQ6HQ9///ve1cePGZp8LAPBHm1AHAABWd+211+oHP/iB1qxZo7///e967LHH9Mgjjyg/P19XXHGFzj33XJ08eVLffvutOnbs6Nlu9+7dqq6u9nRSfPrpp5Lk6YQpKSnR+eefr4SEBK/3+9e//qX27durXbt2LYr34osv1iuvvKItW7Z45mWsN3LkSM2aNUv79u3Te++9p+7du3t1AgWT3W7XihUrzjjujTfe0KpVqzRhwgR17tz5jOO/+OILHTlyREOHDm1yzOeff67q6moNGjSowbpdu3apffv2XsednZ2tpKQkHTp0SG+99ZauvfZaffbZZzrnnHPOGA8AAADMEa15eGVlpa644gr9+9//1rvvvqvu3bv7FYdZebi/OXa3bt00d+7cRjvem7uvo0ePKjU1Ve+9957OO+88/fWvf9WVV16pr776qtErEQAgEBTSAUSdzp07y+FweN3Mp7Ex7du3V2lpaYN1O3fuVExMjJKTkz3LunXrpjvuuEN33HGHDh48qCFDhuj3v/+9rrjiCvXt21eS9OWXX3q6XCR3Ii5JZ511liT35Z2JiYnq3r27KioqtGHDBt12220N3v/LL79Uv379WnbwOtXZ8t577+n999/XzJkzPeuGDh2q+Ph4rV+/Xh999JF+8pOftPh9zqRNmza6+eabfY558803tWbNGo0bN04rV65sVqfN0aNHJfnuFDr9ctzvLv+f//kf9evXTzEx7ou2Dh8+rJdeeklffPGF2rdvr6uuukoDBgzQ2rVrNW3atDPGAwAAADfy8MDz8GPHjunKK6/Url279NZbbyk9Pd3vOMzKw/3JsSVp3LhxkqTXXnutxfs666yzNGfOHM/66667Tjk5OSotLfXZWAMALcHULgCiTkxMjMaNG6dXXnlFH3/8cYP1hmEoNjZWl19+udauXauvvvrKs668vFwrV67UxRdfLIfDodraWlVWVnpt36VLF3Xv3l3Hjx+XJI0YMUKSGrxXjx49JMlz6eGnn37q6YK55557FBMT45Vc1ysuLvbqXpHcXypcLlezjn/YsGGy2+16/vnntW/fPq99xcfHa8iQIcrLy1N1dbWp86M3x+9+9ztlZWVp9erVatOmef/2W3957FtvvdVg3YkTJyRJKSkpkk5dNlsvNzdXBw8e9Jpv8bPPPlOHDh103nnneZYNGDBA27Zt8+9gAAAAohx5eGB5eG1trSZNmqSNGzfqhRde8ByfGVqSh/uTY5u1r88++0zffPON5zsBAAQTHekAotLDDz+sv//97xo1apRuvfVW9evXTwcOHNALL7yg9957T506ddLvfvc7vfnmm7r44ot1xx13qE2bNnrqqad0/PhxPfroo5Kkb7/9Vuedd55+9rOfKSMjQx06dNBbb72lwsJCPf7445KkXr16qX///nrrrbf085//3BNDSkqKLr30Uv2///f/1LVrV33yySfq37+/rrzySr3++ut67rnn1LNnT6+4i4qK9M033+jqq6/2Wt6vXz+NGjWqWTc6iouLk9Pp1Lvvvqv4+PgGnRojR470xN5UIX3p0qX697//7bmx0yuvvKKvv/5aknTnnXc2uAy2pdauXat27dopLi6u2ds4HA7dfPPNevbZZ3X8+HFdeuml+vbbb/X2229r7Nixys7OVufOnXX55Zfr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CgAAALQAubkJR9oQhXQAAAD4Jz9fmjhR2rJFOnbM/TxxomkJ+w9+8AN9++232rx5syT3ZaGJiYlav369Z8yGDRt06aWXel5v27ZNBw8e1I9+9KNG9/n8888rLS1NV199dYN1NptNCQkJjW731Vdf6Y033lBcXFzLDyiI8vLylJqaKrvdrszMTG3atKnJsdu2bdPEiROVmpoqm82mJUuWNDpu3759uvHGG3XuueeqXbt2GjBggD7++GOTjgAAAAABITdvtdycQjoAAAD8M2+eZLNJhuF+bRju1/Pnm/J2CQkJGjRokCc5X79+ve655x5t3rxZhw8f1r59+7R7926NGjXKs83atWs1evToJpPqzz77TGlpac16/y1btqhDhw5q166devbsqW3btunee+8N+LgCtXr1auXk5Cg3N1fFxcXKyMjQ6NGjdfDgwUbHHzlyRL169dLChQuVlJTU6Jh//etfuuiii9S2bVu9/vrr2r59ux5//HGdffbZZh4KAAAAWorcvNVycwrpzeRyScXFDR8uV6gjAwAAaGW7dp1K1OsZhlRaatpbjho1SuvXr5dhGHr33Xc1YcIE9evXT++99542bNig7t27q3fv3p7xa9eubfLSUXe4RpPrvistLU0lJSUqLCzUvffeq9GjR+vOO+8M6HiCYfHixZo+fbqmTZum9PR0LVu2TO3bt9fy5csbHe90OvXYY4/puuuuU3x8fKNjHnnkESUnJ2vFihUaPny4evbsqcsvv1zf+973zDwUAAAAtBS5eavl5hTSm8HlktLSpKFDGz7S0iimAwCAKNOnj7vL5XQ2mzsxMsmll16q9957T5988onatm2rvn376tJLL9X69eu1YcMGr46XAwcOaPPmzRo7dmyT++vTp4927tzZrPeOi4vTBRdcoP79+2vhwoWKjY3VvHnzAj6mQNTU1KioqEhZWVmeZTExMcrKytLGjRtbvN+XX35Zw4YN0zXXXKMuXbpo8ODBeuaZZ864XVVVldfj+PHjLY6h2VpxLlAAAICwRW7eark5hfRmqKhwTzHUmGPH3OsBAACiRm7uqUtGpVOXkubmmvaW9XMx/uEPf/Ak5vXJ+vr1673mYHzllVc0cuRInXPOOU3u7/rrr9euXbu0du3aBusMw1BlZWWT2z7wwANatGiR9u/f3/IDClBFRYVqa2vVtWtXr+Vdu3ZVWVlZi/f7xRdf6Mknn1Tv3r31xhtv6Pbbb9ddd92l5557zud2ycnJSkhI8DwWLFjQ4hiapZXnAgUAAAhb5OatlptTSAcAAIB/JkyQXnxRGjhQstvdz/n50vjxpr3l2WefrYEDB+r555/3JOaXXHKJiouLtWvXLq+ul5dfftnnpaOSdO2112rSpEmaPHmyHn74YX388cfas2ePXn31VWVlZentt99uctsRI0Zo4MCBevjhh4NybOGkrq5OQ4YM0cMPP6zBgwfr1ltv1fTp07Vs2TKf2+3du1eVlZWex+zZs80NtJXnAgUAAAhb5OatlptTSAcAAID/JkyQSkqko0fdzyYm6vVGjRql2tpaT7J+zjnnKD09XUlJSZ6bE1VXV6ugoOCMybrNZtPKlSu1ePFivfTSSxo1apQGDhyouXPn6uqrr9bo0aN9bn/PPffov/7rv7R3796gHJu/EhMTFRsbq/Lycq/l5eXlTd5ItDm6deum9PR0r2X9+vWT6wxzGTocDq9HU3OwB00I5gIFAAAIW+TmrZKb2wx/ZnMPE1VVVUpISFBlZaUcDofp71dc7J4PvSlFRdKQIaaHAQAAELBjx47pyy+/VM+ePWW320MdTtDl5+frgQce0Pbt20Mdis9zHYx8NjMzU8OHD9ef/vQnSe5u8pSUFM2YMUP33Xefz21TU1M1c+ZMzZw502v59ddfr7179+rdd9/1LLvnnnv00Ucf6YMPPmiwn9bOyz0yMtzTuZz+VcZmc3dglZS0XhwAAAAtFOl5uRQ+uXmw8vIWdaTn5eUpNTVVdrtdmZmZ2rRpU5Njt23bpokTJyo1NVU2m01LlixpdNy+fft044036txzz1W7du00YMAAffzxxy0JDwAAAFGqQ4cOeuSRR0IdRqvIycnRM888o+eee047duzQ7bffrurqak2bNk2SNGXKFK8pVmpqalRSUqKSkhLV1NRo3759Kikp0e7duz1j7rnnHn344Yd6+OGHtXv3bq1cuVJPP/20srOzW/34fArBXKAAAADwT6Tl5m383WD16tXKycnRsmXLlJmZqSVLlmj06NEqLS1Vly5dGow/cuSIevXqpWuuuUb33HNPo/v817/+pYsuukg//OEP9frrr6tz58767LPPdPbZZ/t/RCZITHRPMdTYDUftdvd6AAAAhN7ll18e6hBazaRJk3To0CHNmTNHZWVlGjRokNatW+e5AanL5VJMzKm+mf3792vw4MGe14sWLdKiRYs0atQorV+/XpLkdDq1Zs0azZ49W/Pnz1fPnj21ZMkS3XDDDa16bGdUPxfo/Pnu6VzS0txF9Fa4jBkAAADNE2m5ud9Tu2RmZsrpdGrp0qWS3JeQJicn684772zxJaT33Xef3n//fa9LSH0JxSWkLpdUUdFweWKilJLSKiEAAAAELBouIQ0XZk/tEg4i5TgAAABaG3l56wlWXu5XR3pNTY2Kioq8LhGNiYlRVlaWNm7c6M+uvLz88ssaPXq0rrnmGm3YsEE9evTQHXfcoenTp/vcrqqqyut1fHy8aTc2SkmhYA4AAAAAAAAA0civOdIrKipUW1vruVy0XteuXVVWVtbiIL744gs9+eST6t27t9544w3dfvvtuuuuu/Tcc8/53C45OVkJCQmex4IFC1ocAwAAAAAAAAAAjfF7jnQz1NXVadiwYXr44YclSYMHD9bWrVu1bNkyTZ06tcnt9u7d69Vyb1Y3OgAAAAAAAAAgevnVkZ6YmKjY2FiVl5d7LS8vL1dSUlKLg+jWrZvS09O9lvXr108ul8vndg6Hw+tBIR0AAAAAAAAAEGx+FdLj4uI0dOhQFRQUeJbV1dWpoKBAI0aMaHEQF110kUpLS72W7dq1S+eff36L9wkAAAAAAAAAQDD4PbVLTk6Opk6dqmHDhmn48OFasmSJqqurNW3aNEnSlClT1KNHD8985TU1Ndq+fbvnv/ft26eSkhJ16NBBF1xwgSTpnnvu0ciRI/Xwww/r2muv1aZNm/T000/r6aefDtZxAgAAAAAAAADQIn51pEvSpEmTtGjRIs2ZM0eDBg1SSUmJ1q1b57kBqcvl0oEDBzzj9+/fr8GDB2vw4ME6cOCAFi1apMGDB+sXv/iFZ4zT6dSaNWv0v//7v+rfv78eeughLVmyRDfccEMQDjGI8vOljAypXTv3c35+qCMCAAAAAAAAAJjM70K6JM2YMUN79uzR8ePH9dFHHykzM9Ozbv369Xr22Wc9r1NTU2UYRoPH+vXrvfb505/+VFu2bNGxY8e0Y8cOTZ8+vUUHZJr8fGniRGnLFunYMffzxIkU0wEAACzu7bff1k9+8hOde+65at++vdLT0/WrX/1K+/btk+TOb202m+fRuXNn/eQnP9GWLVtCHDkAAAAQWcI5N29RIT0qzZsn2WySYbhfG4b79fz5oY0LAACglblcUnFxw8cZ7hMflp566illZWUpKSlJL774orZv365ly5apsrJSjz/+uNfY0tJSHThwQG+88YaOHz+usWPHqqamJkSRAwAAAOTmrZmb+z1HetTatetUEb2eYUjfuUkqAABAJHO5pLQ09wV632W3u1OjlJTgv++ll16qgQMHym6367/+678UFxen2267TXPnzj0tNpfuvPNOFRQUKCYmRmPGjNGf/vQnzxSE3/X111/rrrvu0l133aU//OEPnuWpqam65JJL9O9//9trfJcuXdSpUyclJSVp5syZuuqqq7Rz504NHDgw+AdsMU6nU7GxscrOzlZ2dnaowwEAAIgK5Oatm5vTkd5cffq4O9BPZ7O5P60AAABRoqKi8URdci+vqDDvvZ977jmdddZZ+uijj/Too49q/vz5evPNNyVJdXV1uvrqq/XNN99ow4YNevPNN/XFF19o0qRJTe7vhRdeUE1NjX7zm980ur5Tp06NLq+srNSqVaskSXFxcYEdVIQoLCzU9u3bW62IHkmdVwAAAC1Fbt66uTkd6c2Vm+ueE71+epf659zcUEcGAAAQFQYOHKjc/+RevXv31tKlS1VQUKAf//jHKigo0JYtW/Tll18qOTlZkvTf//3fuvDCC1VYWCin09lgf5999pkcDoe6devWrPc/77zzJEnV1dWSpKuuukp9+/YNxqHBD6HqvAIAAMAp0Zib05HeXBMmSC++KA0c6M7QBw5032h0/PhQRwYAABAVvnuZZrdu3XTw4EFJ0o4dO5ScnOxJ1CUpPT1dnTp10o4dOxrdn2EYsn33ikMf3n33XRUVFenZZ59Vnz59tGzZshYcBQIVys4rAAAAuEVjbk5Huj8mTHA/AAAA0Oratm3r9dpms6murq7F++vTp48qKyt14MCBZnW+9OzZU506dVJaWpoOHjyoSZMm6Z133mnx+wMAAABWFY25OR3pAAAAsLx+/fpp79692rt3r2fZ9u3b9e9//1vp6emNbvOzn/1McXFxevTRRxtd/90bGp0uOztbW7du1Zo1awKKGwAAAIg0kZqbU0gHAABAsyUmume5a4zd7l4fCllZWRowYIBuuOEGFRcXa9OmTZoyZYpGjRqlYcOGNbpNcnKy/vCHP+iJJ57QLbfcog0bNmjPnj16//339ctf/lIP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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_cos_phi_c_l0 = files[\"test\"][\"Nominal/h_cos_phi_c_l0_WW\"]\n", + "h_cos_phi_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_cos_phi_c_l0_WW\"]\n", + "\n", + "h_cos_phi_l1_l2 = files[\"test\"][\"Nominal/h_cos_phi_l1_l2_WW\"]\n", + "h_cos_phi_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_cos_phi_l1_l2_WW\"]\n", + "\n", + "values1, edges1 = h_cos_phi_c_l0.to_numpy()\n", + "values2, edges2 = h_cos_phi_c_l0_noCR.to_numpy()\n", + "values3, edges3 = h_cos_phi_l1_l2.to_numpy()\n", + "values4, edges4 = h_cos_phi_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "values3 = values3 / np.sum(values3) if np.sum(values3) != 0 else values3\n", + "values4 = values4 / np.sum(values4) if np.sum(values4) != 0 else values4\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "bin_centers3, values3 = rebin(values3, edges3, factor)\n", + "bin_centers4, values4 = rebin(values4, edges4, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6), sharex=True)\n", + "\n", + "# === Pad 1: W1 ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.set_xlabel(r'$\\cos(\\phi)$')\n", + "ax1.set_title(r'$\\cos(\\phi)$: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "\n", + "# === Pad 2: W2 ===\n", + "ax2.plot(bin_centers3, values3, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax2.plot(bin_centers4, values4, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax2.set_xlabel(r'$\\cos(\\phi)$')\n", + "ax2.set_title(r'$\\cos(\\phi)$: W2 $\\rightarrow$ $q_1q_2$')\n", + "ax2.legend()\n", + "ax2.tick_params(axis='both', which='both', direction='in')\n", + "ax2.minorticks_on()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "id": "e496848a-176c-46f2-9fa9-6353924fe6c2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABOcAAALOCAYAAADiEXd1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2EUlEQVR4nOzde5zVVb0//teeQS5eZlAREIXwBjpewBRRs7zEkbCjolZqF0nNTjWaxumi35Mg0OUcK7OSk5knPZ7SzCQtLVIp9KSkeKG8gdkPw1BAUmYEBRT27w/OjI7M4KAzs2fPPJ+Px36Me33W/nze6zMIw4v1WatQLBaLAQAAAAA6XEWpCwAAAACA7ko4BwAAAAAlIpwDAAAAgBIRzgEAAABAiQjnAAAAAKBEhHMAAAAAUCLCOQAAAAAoEeEcAAAAAJSIcA4AAAAASkQ4BwAAAAAlIpwDAAAAgBIRzgEAUHauvvrqFAqFPPXUU6UuBQDgbRHOAQCNQUdLrz/+8Y+lLrFddffxN/jrX/+af/mXf8muu+6a3r17p6qqKu9617vyne98Jy+//HKpy2sz99xzTy666KKsWLGipHX87Gc/S6FQyC9+8YuNjo0YMSKFQiG///3vNzo2ZMiQHHrooUmSlStXZvLkyXnf+96X7bbbLoVCIVdffXV7lw4AtKEepS4AAOg8pk6dml122WWj9t13370E1XS87jz+W2+9NR/84AfTq1evnHbaadlnn32ydu3a/OEPf8gXvvCFPProo7niiitKXWabuOeeezJlypR8/OMfT9++fUtWx2GHHZYk+cMf/pATTjihsb2+vj6PPPJIevTokbvvvjtHHnlk47Gnn346Tz/9dE455ZQkyfLlyzN16tQMGTIkI0aMyOzZszt0DADA2yecAwAajRs3LgceeGCpy8iqVauy1VZbdfh1u+v4Fy5cmFNOOSXveMc78rvf/S477rhj47Ha2to8+eSTufXWW9vkWi2NrVTf87a0uWMYNGhQdtlll/zhD39o0j5nzpwUi8V88IMf3OhYw/uGYG/HHXfMs88+m4EDB+b+++/PqFGj3uYoAICO5rFWAKDVLrroohQKhTz55JONs46qq6tz+umn56WXXtqo/+LFi3PGGWdkwIAB6dWrV/bee+/86Ec/avacjz32WD784Q9n2223bQwekmT27Nk58MAD07t37+y22275wQ9+0PiZJPn973/f4qOB1157bQqFQubMmdNlx98W9+Diiy/OypUr81//9V9NgrkGu+++e84999zG9w899FDGjRuXqqqqbL311nnve9/b7KO/LY3tzcbcmvvWnL/97W/5zGc+k+HDh6dPnz7Zfvvt88EPfrDJunQXXXRRvvCFLyRJdtlll8ZHl1/fpzXje7MxzJ8/P4sWLXrTmg877LA89NBDTR4bvvvuu7P33ntn3Lhx+eMf/5j169c3OVYoFPKud70rSdKrV68MHDjwTa/TGSxevDhnnnlmBg0alF69emWXXXbJpz/96axduzZJ8uKLL+a8887L0KFD06tXr/Tv3z//9E//lAcffLDElQNA+zJzDgBoVFdXl+XLlzdpKxQK2X777Zu0fehDH8ouu+ySr3/963nwwQdz5ZVXpn///vmP//iPxj5Lly7NwQcfnEKhkLPPPjs77LBDfvOb3+TMM89MfX19zjvvvCbn/OAHP5g99tgjX/va11IsFpNsCEne9773Zccdd8yUKVOybt26TJ06NTvssEPj54444ogMHjw4P/nJT5o8GpgkP/nJT7LbbrvlkEMO6bLjb4t78Ktf/Sq77rpr4zpmm/Loo4/m3e9+d6qqqvLFL34xW2yxRX7wgx/kiCOOyJ133pnRo0dv9Jk3jm3ZsmUtjnlz79vrzZ07N/fcc09OOeWU7Lzzznnqqafy/e9/P0cccUQee+yxbLnlljnxxBPzxBNP5Lrrrsu3v/3t9OvXL0ka7+nmjq+5MSTJXnvtlcMPP/xNHzM97LDD8j//8z+59957c8QRRyTZEMAdeuihOfTQQ1NXV5dHHnkk++23X+OxPffcc6Nfkx3hwgsvzJAhQ3LWWWdt9mefeeaZHHTQQVmxYkU++clPZs8998zixYvz85//PC+99FJ69uyZT33qU/n5z3+es88+OzU1NfnHP/6RP/zhD3n88cfzzne+sx1GBACdRBEA6PauuuqqYpJmX7169WrsN3ny5GKS4hlnnNHk8yeccEJx++23b9J25plnFnfcccfi8uXLm7Sfcsopxerq6uJLL73U5JynnnrqRnUde+yxxS233LK4ePHixra//OUvxR49ehRf/2PMBRdcUOzVq1dxxYoVjW3Lli0r9ujRozh58uQuP/63cw/q6uqKSYrHH398i31eb/z48cWePXsW//rXvza2PfPMM8Vtttmm+J73vKdJ35bGtqkxt/a+NXzPFi5c2Nin4djrzZkzp5ikeM011zS2feMb39jos5s7vk2NoVgsFpMUDz/88GaPvd6jjz5aTFKcNm1asVgsFl955ZXiVlttVfzv//7vYrFYLA4YMKA4ffr0YrFYLNbX1xcrKyuLZ511VrPnmjt3bjFJ8aqrrnrT674V55xzTrFQKLyl85922mnFioqK4ty5czc6tn79+mKxWCxWV1cXa2tr326ZAFB2PNYKADSaPn16br/99iav3/zmNxv1+9SnPtXk/bvf/e784x//SH19fZKkWCzmxhtvzLHHHptisZjly5c3vsaOHZu6urqNHlV74znXrVuXO+64I+PHj8+gQYMa23ffffeMGzeuSd/TTjsta9asyc9//vPGtuuvvz6vvvpqPvrRj3b58b+de9BQ8zbbbNNin9fXdNttt2X8+PHZddddG9t33HHHfPjDH84f/vCHxvNtamwttb+V+/Z6ffr0afzvV155Jf/4xz+y++67p2/fvq16NPKtjK+lsRWLxVZtzrDXXntl++23b1xL7k9/+lNWrVrVOIvx0EMPzd13351kw1p069ata/L4bFtavXr1Jl8XX3xxJkyYkDPPPDPXXnttq8+7fv363HTTTTn22GObXdOx4RHtvn375t57780zzzzTZmMCgHLgsVYAoNFBBx3Uqg0RhgwZ0uT9tttumyR54YUXUlVVleeeey4rVqzIFVdc0eIOnw2PNjZ44y6py5Yty8svv9zsTqlvbNtzzz0zatSo/OQnP8mZZ56ZZMPjnAcffHBj37Vr1+b5559v8rkddtghlZWVje/LdfxJ6+5Bc6qqqpJsWO/rzTz33HN56aWXMnz48I2O7bXXXlm/fn2efvrp7L333pscW0vtb+W+vd7LL7+cr3/967nqqquyePHiJo+Z1tXVtfi5119/c8fX0thaq1Ao5NBDD81dd92V9evX5+67707//v0bv2eHHnpoLrvssiRpDOnaI5xbuXJlqwLaBqeddlqOOuqoVq1399xzz6W+vj777LPPJvs1hH+DBw/OAQcckGOOOSannXZak6AUALoi4RwAsNleH2i9XkMY0rCA/Uc/+tFMmDCh2b4Na2g1eP2sp7fitNNOy7nnnpu///3vWbNmTf74xz82hhpJcs899+TII49s8pmFCxdm6NChm32tzjj+5M3vQXOqqqoyaNCgPPLII2/7+i1paWxvbH8r9+31zjnnnFx11VU577zzcsghh6S6ujqFQiGnnHJKk00V2lJbfN8OO+yw/OpXv8rDDz/cuN5cg0MPPTRf+MIXsnjx4vzhD3/IoEGD2iWs6t27d6666qo37ffb3/42P/3pT3PiiSdutPbh2/WhD30o7373u/OLX/wit912W77xjW/kP/7jPzJjxoxmZ4sCQFchnAMA2twOO+yQbbbZJuvWrcuYMWPe0jn69++f3r1758knn9zoWHNtp5xySiZOnJjrrrsuL7/8crbYYoucfPLJjcdHjBiR22+/vcln2muXy1KMP3nze9CSf/7nf84VV1yROXPmbHLjiB122CFbbrllFixYsNGx+fPnp6KiIoMHD37T623q/G/nvv385z/PhAkT8q1vfauxbfXq1VmxYkWTfq/f6faN12/P8bWkYSbcH/7wh9x9991NNr044IAD0qtXr8yePTv33ntvjjnmmDa/fpL06NEjH//4xzfZ5/bbb88vfvGLjB8/Ptdee22LIfUb7bDDDqmqqmpVALzjjjvmM5/5TD7zmc9k2bJleec735mvfvWrwjkAujRrzgEAba6ysjInnXRSbrzxxmb/Qv7cc8+16hxjxozJTTfd1GQNqieffLLZdeD69euXcePG5cc//nF+8pOf5H3ve1/jTpzJhkdPx4wZ0+TVu3fvtzjCN6+9o8efvPk9aMkXv/jFbLXVVvnEJz6RpUuXbnT8r3/9a77zne+ksrIyRx99dG6++eY89dRTjceXLl2aa6+9NocddljjY7Jvxdu9b5WVlU0eZU2S733ve1m3bl2Ttq222ipJNgrt2nJ88+fPz6JFi1rV98ADD0zv3r3zk5/8JIsXL24yc65Xr1555zvfmenTp2fVqlXttt5ca3zlK1/JmDFjcv3116dHj9b/G39FRUXGjx+fX/3qV7n//vs3Ol4sFrNu3bqNHj3u379/Bg0alDVr1rzt2gGgMzNzDgBo9Jvf/Cbz58/fqP3QQw/d7Efp/v3f/z2///3vM3r06Jx11lmpqanJ888/nwcffDB33HHHRuu/Neeiiy7Kbbfdlne961359Kc/nXXr1uWyyy7LPvvsk3nz5m3U/7TTTssHPvCBJMm0adM2q96k/MefvLV7sNtuu+Xaa6/NySefnL322iunnXZa9tlnn6xduzb33HNPbrjhhsZZVV/5yldy++2357DDDstnPvOZ9OjRIz/4wQ+yZs2aXHzxxa263qa8nfv2z//8z/mf//mfVFdXp6amJnPmzMkdd9yR7bffvkm/Aw44IEnyb//2bznllFOyxRZb5Nhjj81WW23VZuPba6+9cvjhh7dqU4iePXtm1KhR+d///d/06tWrsb4Ghx56aONswObCucsuuywrVqxoDHF/9atf5e9//3uSDY/6VldXt7ruTbn55pvTp0+f9OzZc7M/+7WvfS233XZbDj/88Hzyk5/MXnvtlWeffTY33HBD42YYO++8cz7wgQ9kxIgR2XrrrXPHHXdk7ty5TWZCAkCXVJpNYgGAzuSqq64qJmnxddVVVxWLxWJx8uTJxSTF5557rtnPL1y4sEn70qVLi7W1tcXBgwcXt9hii+LAgQOL733ve4tXXHFFY5+Wztlg1qxZxf3337/Ys2fP4m677Va88sori//6r/9a7N2790Z916xZU9x2222L1dXVxZdffrnbjf/t3INisVh84oknimeddVZx6NChxZ49exa32Wab4rve9a7i9773veLq1asb+z344IPFsWPHFrfeeuvilltuWTzyyCOL99xzz0bna2lsbzbm1ty35u75Cy+8UDz99NOL/fr1K2699dbFsWPHFufPn198xzveUZwwYUKTa0ybNq240047FSsqKjY6T2vG92ZjSFI8/PDDmz3WnAsuuKCYpHjooYdudGzGjBnFJMVtttmm+Oqrr250/B3veEeLv3bf+GuylP72t78VTzvttOIOO+xQ7NWrV3HXXXct1tbWFtesWVNcs2ZN8Qtf+EJxxIgRxW222aa41VZbFUeMGFH8z//8z1KXDQDtrlAsvmHuPwBAJzd+/Pg8+uij+ctf/tKk/dVXX82gQYNy7LHH5r/+679KVF37a2n8Sfe5BwAAXYU15wCATu3ll19u8v4vf/lLfv3rX+eII47YqO9NN92U5557LqeddloHVdf+Nmf8Sde8BwAAXZmZcwBAp7bjjjvm4x//eHbdddf87W9/y/e///2sWbMmDz30UPbYY48kyb333ps///nPmTZtWvr165cHH3ywxFW3ndaMP+na9wAAoCuzIQQA0Km9733vy3XXXZclS5akV69eOeSQQ/K1r32tSTD1/e9/Pz/+8Y8zcuTIXH311aUrth20ZvxJ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e2f06NG577773tK1fvaznzV5xBUAAAAA3q6yDudWrVqVESNGZPr06c0ev/766zNx4sRMnjw5Dz74YEaMGJGxY8dm2bJljX1GjhyZffbZZ6PXM88809invr4+99xzT4455ph2HxMAAAAA3UdZrzk3bty4jBs3rsXjl1xySc4666ycfvrpSZLLL788t956a370ox/l/PPPT5LGNeU25eabb87RRx/dqt0/6+vrm7zv1avXm34GAAAAgO6prGfObcratWvzwAMPZMyYMY1tFRUVGTNmTObMmbNZ59qcR1oHDx6c6urqxtfXv/71zboWAAAAAN1HWc+c25Tly5dn3bp1GTBgQJP2AQMGZP78+a0+T11dXe67777ceOONrer/9NNPp6qqqvF9r169UiwWW309AAAAALqPLhvOtZXq6uosXbq01f2rqqqahHNJsnr16rYuCwAAAIAuoMs+1tqvX79UVlZuFKwtXbo0AwcObLfrjho1KjU1NS1uUgEAAAAADbpsONezZ88ccMABmTVrVmPb+vXrM2vWrBxyyCHtdt25c+fmscceS21tbZufe9Gi5MEHN34tWtTml+oQv//973PMMcdk++23z5Zbbpmampr867/+axYvXpwkmT17dgqFQuNrhx12yDHHHJOHH364xJUDAAAAtI2yDudWrlyZefPmNe64unDhwsybNy+L/i+tmjhxYn74wx/mv//7v/P444/n05/+dFatWtW4e2s5WbQoGT48OeCAjV/Dh5dfQPeDH/wgY8aMycCBA3PjjTfmsccey+WXX566urp861vfatJ3wYIFefbZZ/Pb3/42a9asyfvf//6sXbu2RJUDAAAAtJ2yXnPu/vvvz5FHHtn4fuLEiUmSCRMm5Oqrr87JJ5+c5557LpMmTcqSJUsycuTIzJw5c6NNIsrB8uVJS0vXrV694fiQIW1/3SOOOCL77bdfevfunSuvvDI9e/bMpz71qVx00UWNfRYtWpRzzjkns2bNSkVFRd73vvfle9/7Xov3+e9//3s++9nP5rOf/Wy+/e1vN7YPHTo073nPe7JixYom/fv375++fftm4MCBOe+883Lcccdl/vz52W+//dp+wAAAAAAdqKxnzh1xxBEpFosbva6++urGPmeffXb+9re/Zc2aNbn33nszevTodq2pK64599///d/Zaqutcu+99+biiy/O1KlTc/vttyfZ8Kjw8ccfn+effz533nlnbr/99vx//9//l5NPPrnF891www1Zu3ZtvvjFLzZ7vG/fvs2219XV5ac//WmSDY8tAwAAAJS7sp451xnNnTt3o91ay91+++2XyZMnJ0n22GOPXHbZZZk1a1b+6Z/+KbNmzcrDDz+chQsXZvDgwUmSa665JnvvvXfmzp2bUaNGbXS+v/zlL6mqqsqOO+7YquvvvPPOSZJVq1YlSY477rjsueeebTE0AAAAgJIq65lzdIw3Pj664447ZtmyZUmSxx9/PIMHD24M5pKkpqYmffv2zeOPP97s+YrFYgqFQquv/7//+7954IEHcvXVV2fYsGG5/PLL38IoAAAAADofM+d4U1tssUWT94VCIevXr3/L5xs2bFjq6ury7LPPtmr23C677JK+fftm+PDhWbZsWU4++eTcddddb/n6AAAAAJ2FmXNtrL3WnOvXL+ndu/ljvXtvOF4Ke+21V55++uk8/fTTjW2PPfZYVqxYkZqammY/84EPfCA9e/bMxRdf3OzxN24I8Xq1tbV55JFH8otf/OJt1Q0AAADQGZg518baa825IUOSBQs27Mr6Rv36tc9Ora0xZsyY7LvvvvnIRz6SSy+9NK+++mo+85nP5PDDD8+BBx7Y7GcGDx6cb3/72zn77LNTX1+f0047LUOHDs3f//73XHPNNdl6663zrW99q9nPbrnlljnrrLMyefLkjB8/frMejwUAAADobMycKyNDhiTvfOfGr1IFc8mGR1xvvvnmbLvttnnPe96TMWPGZNddd83111+/yc995jOfyW233ZbFixfnhBNOyJ577plPfOITqaqqyuc///lNfvbss8/O448/nhtuuKEthwIAAADQ4QrFYrFY6iK6gvr6+lRXV6eurm6jmXOrV6/OwoULs8suu6R3S8+m0ibcawAAAKAz2FRW9HpmzgEAAABAiQjn2lh7bQgBAAAAQNdjQ4g21l4bQgAAAADQ9Zg5BwAAAAAlIpzrQPbeaH/uMQAAAFBOhHMdYIsttkiSvPTSSyWupOtruMcN9xwAAACgM7PmXAeorKxM3759s2zZsiTJlltumUKhUOKqupZisZiXXnopy5YtS9++fVNZWVnqkgAAAADelHCujY0aNSqVlZWpra1NbW1tY/vAgQOTpDGgo3307du38V4DAAAAdHbCuTbW0m6thUIh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z56dFStW5IUXXsjs2bOzePHiNhwBAAAAAN1ZWT/WumrVqowYMSJnnHFGTjzxxI2OX3/99Zk4cWIuv/zyjB49OpdeemnGjh2bBQsWpH///kmSkSNH5tVXX93os7fddltqamry2c9+NkcddVSqq6tz8MEHp7KycpM11dfXN3nfq1ev9OrV622MEgAAAICuqlAsFoulLqItFAqF/OIXv8j48eMb20aPHp1Ro0blsssuS5KsX78+gwcPzjnnnJPzzz9/s6/xiU98IieccELe//73b3Ssvr4+1dXVG7VPnjw5F1100WZfCwAAAIDy1ZAV1dXVpaqqqsV+ZT1zblPWrl2bBx54IBdccEFjW0VFRcaMGZM5c+a0+jzLli1L//79s2DBgtx33325/PLLN9n/6aefbnLDzZoDAAAAoCVdNpxbvnx51q1blwEDBjRpHzBgQObPn9/q8xx//PGpq6vLVlttlauuuio9emz6llVVVW0yDQUAAACABl02nGsrmzPLDgAAAAA2R1nv1rop/fr1S2VlZZYuXdqkfenSpRk4cGC7XXfUqFGpqanJ9OnT2+0aAAAAAHQNXXbmXM+ePXPAAQdk1qxZjZtErF+/PrNmzcrZZ5/dbtedO3eux1oBAAAAaJWyDudWrlyZJ598svH9woULM2/evGy33XYZMmRIJk6cmAkTJuTAAw/MQQcdlEsvvTSrVq3K6aefXsKqAQAAAGCDsg7n7r///hx55JGN7ydOnJgkmTBhQq6++uqcfPLJee655zJp0qQsWbIkI0eOzMyZMzfaJAIAAAAASqFQLBaLpS6iK6ivr091dXWGDRuWysrK1NbWpra2ttRlAQAAAFACDVlRXV3dJpdAK+uZc52RNecAAAAAaK0uu1srAAAAAHR2wjkAAAAAKJE2e6x12223TaFQaFXf559/vq0u2+mMGjXKmnMAAAAAtEqbhXOXXnppW52qrFlzDgAAAIDWarNwbsKECW11KgAAAADoFtptzbm//vWv+fKXv5xTTz01y5YtS5L85je/yaOPPtpelwQAAACAstIu4dydd96ZfffdN/fee29mzJiRlStXJkn+9Kc/ZfLkye1xSQAAAAAoO+0Szp1//vn5yle+kttvvz09e/ZsbD/qqKPyxz/+sT0u2WmMGjUqNTU1mT59eqlLAQAAAKCTa7M1517v4YcfzrXXXrtRe//+/bN8+fL2uGSnYUMIAAAAAFqrXWbO9e3bN88+++xG7Q899FB22mmn9rgkAAAAAJSddgnnTjnllHzpS1/KkiVLUigUsn79+tx99935/Oc/n9NOO609LgkAAAAAZaddwrmvfe1r2XPPPTN48OCsXLkyNTU1ec973pNDDz00X/7yl9vjkgAAAABQdgrFYrHYXidftGhRHnnkkaxcuTL7779/9thjj/a6VMnV19enuro6dXV11pwDAAAA6OZamxW1y4YQDYYMGZLBgwcnSQqFQnteqtMYNWpUKisrU1tbm9ra2lKXAwAAAEAn1i6PtSbJf/3Xf2WfffZJ796907t37+yzzz658sor2+tyncbcuXPz2GOPCeYAAAAAeFPtMnNu0qRJueSSS3LOOefkkEMOSZLMmTMnn/vc57Jo0aJMnTq1PS4LAAAAAGWlXdac22GHHfLd7343p556apP26667Luecc06WL1/e1pcsOWvOAQAAANCgtVlRuzzW+sorr+TAAw/cqP2AAw7Iq6++2h6XBAAAAICy0y7h3Mc+9rF8//vf36j9iiuuyEc+8pH2uCQAAAAAlJ02W3Nu4sSJjf9dKBRy5ZVX5rbbbsvBBx+cJLn33nuzaNGinHbaaW11SQAAAAAoa2225tyRRx7ZugsWCvnd737XFpfsVBqeIx42bFgqKytTW1trx1YAAACAbqq1a861y4YQ3ZENIQAAAABoUNINIQAAAACAN9dma8690f3335+f/exnWbRoUdauXdvk2IwZM9rrsgAAAABQNtpl5txPf/rTHHrooXn88cfzi1/8Iq+88koeffTR/O53v0t1dXV7XBIAAAAAyk67hHNf+9rX8u1vfzu/+tWv0rNnz3znO9/J/Pnz86EPfShDhgxpj0sCAAAAQNlpl3Dur3/9a97//vcnSXr27JlVq1alUCjkc5/7XK644or2uCQAAAAAlJ12Cee23XbbvPjii0mSnXbaKY888kiSZMWKFXnppZfa45IAAAAAUHbaZUOI97znPbn99tuz77775oMf/GDOPffc/O53v8vtt9+e9773ve1xSQAAAAAoO+0Szl122WVZvXp1kuTf/u3fssUWW+See+7JSSedlC9/+cvtcUkAAAAAKDuFYrFYLHURXUF9fX2qq6szbNiwVFZWpra2NrW1taUuCwAAAIASaMiK6urqUlVV1WK/Nps5V19f3+q+myqo3M2dO7dLjw8AAACAttNm4Vzfvn1TKBQ22adYLKZQKGTdunVtdVkAAAAAKFttFs79/ve/b6tTAQAAAEC30Gbh3OGHH95WpwIAAACAbqGi1AUAAAAAQHclnAMAAACAEhHOAQAAAECJCOcAAAAAoETaJZw76qijsmLFio3a6+vrc9RRR7XHJQEAAACg7LRLODd79uysXbt2o/bVq1fnf//3f9vjkgAAAABQdnq05cn+/Oc/N/73Y489liVLljS+X7duXWbOnJmddtqpLS8JAAAAAGWrTcO5kSNHplAopFAoNPv4ap8+ffK9732vLS8JAAAAAGWrTcO5hQsXplgsZtddd819992XHXbYofFYz549079//1RWVrblJTudUaNGpbKyMrW1tamtrS11OQAAAAB0Ym0azr3jHe9Ikqxfv74tT1tW5s6dm6qqqlKXAQAAAEAZaJcNIZLkf/7nf/Kud70rgwYNyt/+9rckybe//e3cfPPN7XVJAAAAACgr7RLOff/738/EiRNzzDHHZMWKFVm3bl2SZNttt82ll17aHpcEAAAAgLLTLuHc9773vfzwhz/Mv/3bvzVZY+7AAw/Mww8/3B6XBAAAAICy0y7h3MKFC7P//vtv1N6rV6+sWrWqPS4JAAAAAGWnXcK5XXbZJfPmzduofebMmdlrr73a45IAAAAAUHbadLfWBhMnTkxtbW1Wr16dYrGY++67L9ddd12+/vWv58orr2yPSwIAAABA2WmXcO4Tn/hE+vTpky9/+ct56aWX8uEPfziDBg3Kd77znZxyyintcUkAAAAAKDuFYrFYbM8LvPTSS1m5cmX69+/fnpcpufr6+lRXV6euri5VVVWlLgcAAACAEmptVtQua869/PLLeemll5IkW265ZV5++eVceumlue2229rjcgAAAABQltolnDv++ONzzTXXJElWrFiRgw46KN/61rdy/PHH5/vf/357XBIAAAAAyk67hHMPPvhg3v3udydJfv7zn2fgwIH529/+lmuuuSbf/e532+OSAAAAAFB22iWce+mll7LNNtskSW677baceOKJqaioyMEHH5y//e1v7XFJAAAAACg77RLO7b777rnpppvy9NNP57e//W2OPvroJMmyZctslgAAAAAA/6ddwrlJkybl85//fIYOHZrRo0fnkEMOSbJhFt3+++/fHpcEAAAAgLJTKBaLxfY48ZIlS/Lss89mxIgRqajYkAHed999qaqqyp577tkelyyp1m6PCwAAAEDX19qsqF1mziXJwIEDs//++zcGc0ly0EEHddpg7oQTTsi2226bD3zgAxsdu+WWWzJ8+PDsscceufLKK0tQHQAAAABdUbuFc+Xm3HPPzTXXXLNR+6uvvpqJEyfmd7/7XR566KF84xvfyD/+8Y8SVAgAAABAVyOc+z9HHHFE4w6zr3ffffdl7733zk477ZStt94648aNy2233VaCCgEAAADoasoinLvrrrty7LHHZtCgQSkUCrnppps26jN9+vQMHTo0vXv3zujRo3Pfffe1ybWfeeaZ7LTTTo3vd9pppyxevLhNzg0AAABA91YW4dyqVasyYsSITJ8+vdnj119/fSZOnJjJkyfnwQcfzIgRIzJ27NgsW7assc/IkSOzzz77bPR65plnOmoYAAAAANBEj1IX0Brjxo3LuHHjWjx+ySWX5Kyzzsrpp5+eJLn88stz66235kc/+lHOP//8JMm8efPe0rUHDRrUZKbc4sWLc9BBB7XYv76+vsn7Xr16pVevXm/p2gAAAAB0bWUxc25T1q5dmwceeCBjxoxpbKuoqMiYMWMyZ86ct33+gw46KI888kgWL16clStX5je/+U3Gjh3bYv/Bgwenurq68fX1r3/9bdcAAAAAQNdUFjPnNmX58uVZt25dBgwY0KR9wIABmT9/fqvPM2bMmPzpT3/KqlWrsvPOO+eGG27IIYcckh49euRb3/pWjjzyyKxfvz5f/OIXs/3227d4nqeffjpVVVWN782aAwAAAKAlZR/OtZU77rijxWPHHXdcjjvuuFadp6qqqkk4BwAAAAAtKfvHWvv165fKysosXbq0SfvSpUszcODADq9n1KhRqampaXHzCgAAAABoUPYz53r27JkDDjggs2bNyvjx45Mk69evz6xZs3L22Wd3eD1z5841cw4AAACAVimLcG7lypV58sknG98vXLgw8+bNy3bbbZchQ4Zk4sSJmTBhQg488MAcdNBBufTSS7Nq1arG3VsBAAAAoDMqi3Du/vvvz5FHHtn4fuLEiUmSCRMm5Oqrr87JJ5+c5557LpMmTcqSJUsycuTIzJw5c6NNIgAAAACgMykUi8ViqYvoCurr61NdXZ1hw4alsrIytbW1qa2tLXVZAAAAAJRA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Zdddd83cuXNz1VVXtWetAAAAANCl9Ghtx/PPPz/33HNPPv7xj+e3v/1tPve5z2XmzJmpqKjI7373uxx88MHtWScAAAAAdDmtnjn3m9/8JldddVW++c1v5le/+lWKxWJGjhyZW265RTAHAAAAAG9Bq8O5Z555JnvttVeSZOjQoendu3c++tGPtlthAAAAANDVtTqcKxaL6dHjtadgKysr06dPn3YpCgAAAAC6g1avOVcsFvPe9763MaB7+eWXc+yxx6Znz55N+j344INtWyEAAAAAdFGtDucmT57c5P3xxx/f5sUAAAAAQHdSKBaLxVIX0RXU19enuro6dXV1qaqqKnU5AAAAAJRQa7OiVq85t3r16vzyl7/Miy++2OzFfvnLX2bNmjVvrVoAAAAA6IZaHc794Ac/yHe+851ss802Gx2rqqrKd7/73fzwhz9s0+IAAAAAoCtrdTj3k5/8JOedd16Lx88777xcc801bVETAAAAAHQLrQ7n/vKXv2TEiBEtHt9vv/3yl7/8pU2KAgAAAIDuoNXh3KuvvprnnnuuxePPPfdcXn311TYpCgAAAAC6g1aHc3vvvXfuuOOOFo/fdttt2XvvvTfr4nfddVeOPfbYDBo0KIVCITfddFOT48ViMZMmTcqOO+6YPn36ZMyYMRvNznv++efzkY98JFVVVenbt2/OPPPMrFy5skmfP//5z3n3u9+d3r17Z/Dgwbn44os3quWGG27Innvumd69e2fffffNr3/9680aCwAAAABsrlaHc2eccUamTZuWW265ZaNjv/rVr/LVr341Z5xxxmZdfNWqVRkxYkSmT5/e7PGLL7443/3ud3P55Zfn3nvvzVZbbZWxY8dm9erVjX0+8pGP5NFHH83tt9+eW265JXfddVc++clPNh6vr6/P0UcfnXe84x154IEH8o1vfCMXXXRRrrjiisY+99xzT0499dSceeaZeeihhzJ+/PiMHz8+jzzyyGaNBwAAAAA2R6FYLBZb2/mjH/1orr322uy5554ZPnx4kmT+/Pl54okn8qEPfSjXXXfdWy+kUMgvfvGLjB8/PsmGWXODBg3Kv/7rv+bzn/98kqSuri4DBgzI1VdfnVNOOSWPP/54ampqMnfu3Bx44IFJkpkzZ+aYY47J3//+9wwaNCjf//7382//9m9ZsmRJevbsmSQ5//zzc9NNN2X+/PlJkpNPPjmrVq1qEjwefPDBGTlyZC6//PJW1V9fX5/q6urU1dWlqqrqLd8HAAAAAMpfa7OiVs+cS5If//jH+elPf5phw4bliSeeyIIFCzJ8+PBcd911byuYa87ChQuzZMmSjBkzprGturo6o0ePzpw5c5Ikc+bMSd++fRuDuSQZM2ZMKioqcu+99zb2ec973tMYzCXJ2LFjs2DBgrzwwguNfV5/nYY+Dddpzpo1a1JfX9/kBQAAAACbo8fmfuBDH/pQPvShD7VHLU0sWbIkSTJgwIAm7QMGDGg8tmTJkvTv37/J8R49emS77bZr0meXXXbZ6BwNx7bddtssWbJkk9dpzte//vVMmTLlLYwMAAAAADbYrJlzvOaCCy5IXV1d4+vpp58udUkAAAAAlJlOG84NHDgwSbJ06dIm7UuXLm08NnDgwCxbtqzJ8VdffTXPP/98kz7NneP112ipT8Px5vTq1StVVVVNXgAAAMCbmzZtWioqKjJt2rRSlwIl12nDuV122SUDBw7MrFmzGtvq6+tz77335pBDDkmSHHLIIVmxYkUeeOCBxj6/+93vsn79+owePbqxz1133ZVXXnmlsc/tt9+e4cOHZ9ttt23s8/rrNPRpuA4AAAAdT4DTNU2bNi2TJk1KsVjMpEmTfH/p9koazq1cuTLz5s3LvHnzkmzYBGLevHlZtGhRCoVCzjvvvHzlK1/JL3/5yzz88MM57bTTMmjQoMYdXffaa6+8733vy1lnnZX77rsvd999d84+++yccsopGTRoUJLkwx/+cHr27Jkzzzwzjz76aK6//vp85zvfycSJExvrOPfcczNz5sx861vfyvz583PRRRfl/vvvz9lnn93RtwQAAIAIcLqqhu/r6/n+0t0VisVisTUdhwwZkuOOOy7HHXdcjjrqqPTosdl7SWxk9uzZOfLIIzdqnzBhQq6++uoUi8VMnjw5V1xxRVasWJHDDjss//mf/5lhw4Y19n3++edz9tln51e/+lUqKipy0kkn5bvf/W623nrrxj5//vOfU1tbm7lz56Zfv34555xz8qUvfanJNW+44YZ8+ctfzlNPPZU99tgjF198cY455phWj6W12+MCAACwac0FOEkyderUXHjhhSWoiLbQ0ve1ge8vXU1rs6JWh3N33nlnfvnLX+aXv/xlnnvuuYwdOzbHHXdc3v/+96dv375tVXfZEs4BAAC8fQKcrquioiKbiiAKhULWr1/fgRVB+2rzcO71Hn300fzyl7/MzTffnHnz5uXQQw9tnFW36667vq3Cy5VwDgAA4O0T4HRdgle6m9ZmRW9pzbm99947F1xwQf74xz/mqaeeyqmnnppZs2Zln332yT777JNbb731LRcOAABA9zVlypS3dZzO68ILL8zUqVObPSaYozt7SzPnWvLSSy/lt7/9bbbZZpuMGTOmrU5bFsycAwAAaBvWnOva3vj99X2lq2ptVvT2d3V4nS233DInnHBCW54SAACAbqYhqBHgdE0N38fJkydnypQpvq90e206c647M3MOAACgbU2bNk2AA5Stdt0Qgo0J5wAAAABo0K4bQgAAAAAAb1+bhnM///nP2/J0AAAAANClbVY49+qrr+aRRx7JE0880aT95ptvzogRI/KRj3ykTYsDAAAA2sa0adNSUVGRadOmlboU4HVaHc498sgj2X333TNixIjstddeOfHEE7N06dIcfvjhOeOMMzJu3Lj89a9/bc9aAQAAgLdg2rRpmTRpUorFYiZNmiSgg06kR2s7fulLX8ruu++eyy67LNddd12uu+66PP744znzzDMzc+bM9OnTpz3rBAAAAN6ChmDu9Rre2wUXSq/VM+fmzp2bb37zm/nnf/7n/Od//meS5P/9v/+Xz3/+84I5AAAASOd7dLS5YK6BGXTQORSKxWKxNR0rKiqyZMmS9O/fP0myzTbb5MEHH8wee+zRrgWWi9ZujwsAAEDX9MYgbOrUqSWfmVZRUZFN/bW/UChk/fr1HVgRdB+tzYpaPXOuUCjkxRdfTH19ferq6lIoFPLyyy+nvr6+yQsAAAC6m5YeHS31zLQpU6a8reNA+2v1mnPFYjHDhg1r8n7//fdv8r5QKGTdunVtWyEAAAB0Ym/26GhSurXdGq7bXH2dYWYfsBmPtd55552tOuHhhx/+tgoqVx5rBQAA6J7K4dHRzvjILXR1rc2KWj1zrruGbgAAALApU6ZMaXHmXMPxUmsI4iZPnpwpU6YI5qATafWac88880w+//nPN7uuXF1dXb7whS9k6dKlbVocAAAAdHYXXnhhpk6d2uyxzjRD7cILL8z69es7TT3ABq0O5y655JLU19c3Ow2vuro6L774Yi655JI2LQ4AAADKQXMBXWcK5oDOq9Xh3MyZM3Paaae1ePy0007LLbfc0iZFAQAAQLlpCOgKhYJgDmi1Vm8IsdVWW+Xxxx/PkCFDmj2+aNGi7LXXXlm1alWbFlgubAgBAAAAQIPWZkWtnjnXp0+fPPXUUy0ef+qpp9KnT5/NKhIAAAAAurNWh3OjR4/O//zP/7R4/JprrslBBx3UJkUBAAAAQHfQo7UdP//5z+ef/umfUl1dnS984QsZMGBAkmTp0qW5+OKLc/XVV+e2225rt0IBAAAAoKtp9ZpzSfKDH/wg5557bl555ZVUVVWlUCikrq4uW2yxRb797W/n05/+dHvW2qlZcw4AAACABm2+5lyS/Mu//Ev++te/5pvf/GY+/OEP55RTTsm3vvWtPPnkk906mAMAAADKx7Rp01JRUZFp06aVupQ2Vc7jKufa367NmjlHy8ycAwAAgM5v2rRpmTRpUuP7qVOn5sILLyxhRW2jnMdVzrVvSrvMnAMAAAAoV28MgZJk0qRJZT9bq5zHVc61txXhHAAAANDlNRcCNSjnMKicx1XOtbclj7W2EY+1AgAAQOdVUVGRTUUghUIh69ev78CK2kY5j6uca28Nj7UCAADdUndeVBxo2ZQpU97W8c6qI8fV1r+/dtXvyebq8VY/+MADD+Txxx9PktTU1OSd73xnmxUFAADwVrz+EamGr11hUXHg7Wv4vaC5xyjLeQOCjhpXe/z+2lW/J5trs8O5ZcuW5ZRTTsns2bPTt2/fJMmKFSty5JFH5qc//Wl22GGHtq4RAADgTbW0qHgioAM2aC4M6gohUHuPqz1/f+2q35PNsdmPtZ5zzjl58cUX8+ijj+b555/P888/n0ceeST19fX57Gc/2x41AgAAbJJFxYHWuvDCCzN16tQUCoUuFQK117g64vfXrvo9aa3N3hCiuro6d9xxR0aNGtWk/b777svRRx+dFStWtGV9ZcOGEAAAUDpdfVFxgFLx++tb124bQqxfvz5bbLHFRu1bbLGFbwYAAFASFhUHaB9+f21/mx3OHXXUUTn33HPzzDPPNLYtXrw4n/vc5/Le9763TYsDAABojYZHoprTHR+RAmgrfn9tf5sdzl122WWpr6/P0KFDs9tuu2W33XbLLrvskvr6+nzve99r0+IuuuiiFAqFJq8999yz8fjq1atTW1ub7bffPltvvXVOOumkLF26tMk5Fi1alPe///3Zcsst079//3zhC1/Iq6++2qTP7Nmz8853vjO9evXK7rvvnquvvrpNxwEAALS/5v4C6S+OAG+f31/b12bv1jp48OA8+OCDueOOOzJ//vwkyV577ZUxY8a0eXFJsvfee+eOO+5ofN+jx2slf+5zn8utt96aG264IdXV1Tn77LNz4okn5u67706SrFu3Lu9///szcODA3HPPPXn22Wdz2mmnZYsttsjXvva1JMnChQvz/ve/P5/61Kfyk5/8JLNmzconPvGJ7Ljjjhk7dmy7jAkAAGgfDX9RnDx5cqZMmeIvjgBtxO+v7WezN4ToSBdddFFuuummzJs3b6NjdXV12WGHHXLttdfmAx/4QJJk/vz52WuvvTJnzpwcfPDB+c1vfpN//ud/zjPPPJMBAwYkSS6//PJ86UtfynPPPZeePXvmS1/6Um699dY88sgjjec+5ZRTsmLFisycObPVtXbFDSGmTZvmfzoAAACAt6DdNoRIklmzZuX//b//l0984hM544wzmrza2l/+8pcMGjQou+66az7ykY9k0aJFSZIHHnggr7zySpMZe3vuuWeGDBmSOXPmJEnmzJmTfffdtzGYS5KxY8emvr4+jz76aGOfN876Gzt2bOM5WrJmzZrU19c3eXUlDVslF4tFW88DtINp06aloqLC768AANDNbXY4N2XKlBx99NGZNWtWli9fnhdeeKHJqy2NHj06V199dWbOnJnvf//7WbhwYd797nfnxRdfzJIlS9KzZ8/07du3yWcGDBiQJUuWJEmWLFnSJJhrON5wbFN96uvr8/LLL7dY29e//vVUV1c3vgYPHvx2h9tpNARzryegA2g7/gEEAABosNlrzl1++eW5+uqr87GPfaw96mli3Lhxjf+93377ZfTo0XnHO96Rn/3sZ+nTp0+7X39TLrjggkycOLHxfX19fZcI6JoL5ho0tHvEFeCta+kfQBK/vwIAQHe02TPn1q5dm0MPPbQ9anlTffv2zbBhw/Lkk09m4MCBWbt2bVasWNGkz9KlSzNw4MAkycCBAzfavbXh/Zv1qaqq2mQA2KtXr1RVVTV5dQWTJ09+W8cBaNmb/QOIGXQAAND9bHY494lPfCLXXntte9TyplauXJm//vWv2XHHHXPAAQdkiy22yKxZsxqPL1iwIIsWLcohhxySJDnkkEPy8MMPZ9myZY19br/99lRVVaWmpqaxz+vP0dCn4RzdzZQp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nBtuuCGHHHJIW5cLAACdVmt+tu7Ro0e+9a1v5cgjj8z69evzxS9+sdPv1JoI5wCg07vjjjtKXQIAAJSF4447Lscdd1ypy9gsHmsFgHbSr1+/VFZWZunSpU3aly5dmoEDB5aoKgAAKD9d+Wdr4RwAtJOePXvmgAMOyKxZsxrb1q9fn1mzZnksFQAANkNX/tnaY60A8DasXLkyTz75ZOP7hQsXZt68edluu+0yZMiQTJw4MRMmTMiBBx6Ygw46KJdeemlWrVrVuMMUAACwQXf92bpQLBaLpS4CAMrV7Nmzc+SRR27UPmHChFx99dVJkssuuyzf+MY3smTJkowcOTLf/e53M3r06A6uFAAAOrfu+rO1cA4AAAAASsSacwAAAABQIsI5AAAAACgR4RwAAAAAlIhwDgAAAABKRDgHAAAAACUinAMAAACAEhHOAQAAAECJCOcAAAAAoESEcwAAAABQIsI5AAAAACgR4RwAAE2ccMIJ2XbbbfOBD3yg1KUAAHR5wjkAAJo499xzc80115S6DACAbkE4BwBAE0cccUS22WabUpcBANAtCOcAANhs//jHP9K/f/889dRTneaae+21V6688sombaecckq+9a1vbdS3pXYAgI4mnAMAYLN99atfzfHHH5+hQ4d2imu+/PLL+ctf/pIRI0Y0af/yl7+cr371q6mrq2tVOwBARxPOAQCwWV566aX813/9V84888xOc81HHnkkxWIx++yzT5P2ffbZJ7vttlt+/OMft6odAKCjCecAADq5p556KoVCYaPXEUccUZJ6fv3rX6dXr145+OCDm7SvX78+F198cXbffff06tUrQ4YMyVe/+tUkyZo1a/LZz342/fv3T+/evXPYYYdl7ty5TT7/85//PPvuu2/69OmT7bffPmPGjMmqVas2ec158+blqKOOymGHHZb169dnyJAhufTSS5v0OfbYY/PTn/50o3G01A4A0JGEcwAAndzgwYPz7LPPNr4eeuihbL/99nnPe97TbP+vfe1r2XrrrTf5WrRoUYvXGzNmTD74wQ/m17/+dXbeeefMmTOnyfH//d//zQEHHLDR5y644IL8+7//ey688MI89thjufbaazNgwIAkyRe/+MXceOON+e///u88+OCD2X333TN27Ng8//zzSZJnn302p556as4444w8/vjjmT17dk488cQUi8UWr/nXv/41hx9+eI466qgcd9xxOfHEE/Ov//qv+dznPpd58+Y19jvooINy3333Zc2aNU0+31I7AEBHKhQbfuIBAKDTW716dY444ojssMMOufnmm1NRsfG/tT7//PONoVdLhg4dmh49erylGsaPH5/tt98+//Vf/9XY9uKLL2aHHXbIZZddlk984hNN+q9atSrbbrttrr766nz4wx9OkrzyyisZOnRozjvvvHzhC1/Igw8+mAMOOCBPPfVU3vGOd7Tqmv/0T/+UnXfeOVdddVVGjx6dk08+Oeedd1623XbbfOUrX8k555yTJPnzn/+cESNGbHTultoBADrSW/uJDACAkjjjjDPy4osv5vbbb282mEuS7bbbLtttt1271fDyyy+nd+/eTdoef/zxrFmzJu9973s36v/Xv/41r7zySt71rnc1tm2xxRY56KCD8vjjjydJRowYkfe+973Zd999M3bs2Bx99NH5wAc+kG233bbZay5ZsiS/+93vcs8992TdunV5+OGH8/Wvfz0VFRWprKxMz549G/v26dMnyYZ1616vpXYAgI7ksVYAgDLxla98Jb/97W/zy1/+Mttss02L/d7OY63NrW33+leS9OvXLy+88EKTzzUEXW9VZWVlbr/99vzmN79JTU1Nvve972X48OFZuHBhs9f84x//mPXr12fkyJFZsGBBXn755YwcOTJPPfVUXnjhhRx66KGNfRtmEe6www5NrtlSOwBARxLOAQCUgRtvvDFTp07Nz372s+y2226b7PupT30q8+bN2+Rr0KBBzX520aJFOfzww7PXXntl3333zc9+9rMUi8XGV5Lsv//+eeyxx5p8bo899kifPn0ya9asjc652267pWfPnrn77rsb21555ZXMnTs3NTU1jW2FQiHvete7MmXKlDz00EPp2bNnfvGLXzR7zbVr1ybZ8JjvQw89lHe84x3Zbrvtcvnll2efffbJvvvu29j3kUceyc4775x+/fo1qauldgCAjuSxVgCATu6RRx7Jaaedli996UvZe++9s2TJkiRJz57/f3t37FJlG8YB+DccJQgaJKIzmNASgUZUiwQ6aZTQ5iKcHESqP8CkoZBwiCAQFBwECdxcagktEOLoItSmU2tqIChkHGrRtgPi8SP4wvf74rrG+30f7udZfzwPd3PD56v/5llrqVTKxMRErl69mq9fv+b69eu5c+dOTp8+Xf/n1q1befz4cXZ3d+vPTk+dOpXR0dE8evQozc3NuXnzZra3t7O+vp6hoaE8fPgwIyMjaWlpyYULF/LixYvUarUMDQ0lSVZXV7O0tJTe3t6cO3cuq6ur2d7ezuXLlxv27OzsTKlUyrNnz/L9+/dcvHgxU1NTmZycTLVaPXSm5eXl9Pb2HjnrcXUAgJMknAMA+I/7+PFjarVaxsfHMz4+Xq93d3fnw4cPf7RXuVxOuVxOkpw/fz5nz57Nzs7OoXCuo6Mj165dy/z8fO7fv1+vP3nyJKVSKU+fPs3m5mbK5XIePHiQJHn+/Hn29/dTqVSyt7eXGzdu5N27d/Vw78yZM6lWq5mYmMi3b9/S1taWly9f5vbt2w17tra2ZnZ2NqOjo9na2kqpVEqtVsvi4uKhqa4/fvzImzdvsri4eOicx9UBAE6aaa0AADT06dOnDA4OZm1t7ci3t2/fZmRkJGtra8cOpvjTjuvZ0tKSV69e5e7du0fWTE9P5/Xr13n//v1v1QEATpqbcwAAHLGzs5N79+5lZmam4fe+vr58/vw5GxsbaW1tPZE9Ner55cuX7O7upr29veGapqamTE5O/nYdAOCkuTkHAMAhP3/+TE9PT4aHh1OpVIrezj9aWFhIf39/9vb26tNkAQD+T4RzAADUHRwcZGBgIJcuXcrY2FjR2wEA+OsJ5wAAqFtZWUlXV1euXLlSr83NzaWjo6PAXQEA/L2EcwAAAABQkJMZrQUAAAAAHCGcAwAAAICCCOcAAAAAoCDCOQAAAAAoiHAOAAAAAAoinAMAAACAggjnAAAAAKAgwjkAAAAAKIhwDgAAAAAKIpwDAAAAgIII5wAAAACgIMI5AAAAACjIL1jNd4xfsEkuAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_eec_truth_cs = files[\"test\"][\"Nominal/h_eec_truth_cs_WW\"]\n", + "h_eec_truth_cs_noCR = files[\"test_noCR\"][\"Nominal/h_eec_truth_cs_WW\"]\n", + "\n", + "xsection_CR = 16.4385\n", + "xsection_noCR = 100000 # Placeholder value\n", + "\n", + "nEvents = 100000\n", + "\n", + "scale_CR = xsection_CR / nEvents\n", + "scale_noCR = xsection_noCR / nEvents\n", + "\n", + "# Convert to numpy arrays\n", + "values1, edges1 = h_eec_truth_cs.to_numpy()\n", + "values2, edges2 = h_eec_truth_cs_noCR.to_numpy()\n", + "\n", + "values1 = values1 * scale_CR\n", + "values2 = values2 * scale_noCR\n", + "\n", + "# values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "# values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 8), sharex=True, gridspec_kw={'height_ratios': [2.5, 1]})\n", + "plt.subplots_adjust(hspace=0)\n", + "\n", + "# === Pad 1: Angular Distributions ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_ylabel('set label')\n", + "ax1.set_title(r'Energy-Energy Correlator: W1 $\\rightarrow$ cs')\n", + "ax1.set_xscale('log')\n", + "ax1.set_yscale('log')\n", + "\n", + "# === Pad 2: Ratios ===\n", + "def safe_divide(num, denom):\n", + " with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratio = np.true_divide(num, denom)\n", + " ratio[~np.isfinite(ratio)] = 0 # -inf, inf, NaN -> 0 or np.nan as you prefer\n", + " return ratio\n", + "\n", + "ratio1 = safe_divide(values2, values1)\n", + "\n", + "ax2.plot(bin_centers1, ratio1, marker='D', linestyle='None', color='black', markersize=4)\n", + "ax2.axhline(y=1, color='r', linestyle='--', linewidth = 0.8)\n", + "\n", + "ax2.set_xlabel(r'z = $\\frac{1}{2}(\\cos(\\phi))$')\n", + "ax2.set_ylabel('no CR / CR')\n", + "ax2.set_xscale('log')\n", + "ax2.set_yscale('linear')" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "id": "1cdcb65e-e1b3-4623-90c0-4e1de275eb0e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABOcAAALOCAYAAADiEXd1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB21ElEQVR4nOzde5iVZb0//vcwCIOHGVEERCEskxxRMBwRM48kkWmCllY7Sc1+tdFSOqjXTkagsm07s3R2bnelnTQzSUu3eCDRSlLSKE+g9sUwEZBtzAhyUFi/P9gzMnJw0DWz5vB6Xde6pnU/z3qez/0Mxsyb+1BWKBQKAQAAAADaXLdSFwAAAAAAXZVwDgAAAABKRDgHAAAAACUinAMAAACAEhHOAQAAAECJCOcAAAAAoESEcwAAAABQIsI5AAAAACgR4RwAAAAAlIhwDgAAAABKRDgHAAAAACUinAMAoEO59tprU1ZWlmeeeabUpdAGLr744pSVlZW6DABoNcI5AOjiGoOOLb3++Mc/lrrEVtXV+9/ob3/7W/6//+//y9vf/vZUVFSksrIy73nPe/Kd73wnq1atKnV5RXP//ffn4osvzvLly0taxy9+8YuUlZXlV7/61SbHhg0blrKystxzzz2bHBs0aFAOPfTQJMmcOXNy9tlnZ7/99ssOO+yQQYMG5SMf+UiefPLJVq8fACie7qUuAABoH6ZOnZq99tprk/a99967BNW0va7c/9tuuy0f/vCH07Nnz5x22mkZOnRo1q5dm9///vf50pe+lMceeyxXX311qcssivvvvz9TpkzJJz/5yey8884lq+Owww5Lkvz+97/PuHHjmtobGhry6KOPpnv37vnDH/6Qo446qunYs88+m2effTannnpqkuTf//3f84c//CEf/vCHc8ABB2Tx4sW58sor8+53vzt//OMfM3To0LbtFADwpgjnAIAkydixY3PQQQeVuoysXLkyO+ywQ5vft6v2f8GCBTn11FPztre9Lb/97W+z++67Nx2bOHFinn766dx2221FudeW+laq73kxbWsfBgwYkL322iu///3vm7XPnj07hUIhH/7whzc51vi+MdibNGlSrrvuuvTo0aPpnFNOOSX7779/vvGNb+SnP/3pm+0OANCGTGsFAFqkcd2np59+umnUUVVVVU4//fS8/PLLm5z/3HPP5Ywzzki/fv3Ss2fP7LfffvnhD3+42Ws+/vjj+djHPpbevXs3BQ9JMmvWrBx00EGpqKjIO97xjvzXf/1Xs/Wn7rnnni1ODbzuuutSVlaW2bNnd9r+F+MZXHrppVmxYkV+8IMfNAvmGu299975/Oc/3/T+z3/+c8aOHZvKysrsuOOOOeaYYzY79XdLfXujPrfkuW3O3//+9/zrv/5rhgwZkl69emXXXXfNhz/84Wbr0l188cX50pe+lCTZa6+9mqYub3xOS/r3Rn2YN29eFi5c+IY1H3bYYfnzn//cbNrwH/7wh+y3334ZO3Zs/vjHP2b9+vXNjpWVleU973lPkuTQQw9tFswlyTvf+c7st99+eeKJJ97w/m3lk5/8ZAYPHrxJ++bWkvv973+fmpqaZn/mAaCzM3IOAEiS1NfXZ9myZc3aysrKsuuuuzZr+8hHPpK99torl1xySR5++OF8//vfT9++ffPv//7vTecsWbIkhxxySMrKynL22Wdnt912y+23354zzzwzDQ0NOffcc5td88Mf/nDe+c535utf/3oKhUKSDSHJ+9///uy+++6ZMmVK1q1bl6lTp2a33XZr+tyRRx6ZgQMH5mc/+1mzqYFJ8rOf/SzveMc7MmrUqE7b/2I8g9/85jd5+9vf3rSO2dY89thjee9735vKysp8+ctfznbbbZf/+q//ypFHHpl77703I0eO3OQzr+/b0qVLt9jnbX1uG5szZ07uv//+nHrqqdlzzz3zzDPP5Hvf+16OPPLIPP7449l+++0zfvz4PPnkk7n++uvz7W9/O3369EmSpme6rf3bXB+SZN99980RRxyRWbNmbfV5HnbYYfnJT36SBx54IEceeWSSDQHcoYcemkMPPTT19fV59NFHc8ABBzQde9e73rXJn8mNFQqFLFmyJPvtt99W772tLrroogwaNChnnXVWUa+7sUceeSTHHntsdtttt1x88cV59dVXU1tbm379+rXaPQGgXSgAAF3aNddcU0iy2VfPnj2bzqutrS0kKZxxxhnNPj9u3LjCrrvu2qztzDPPLOy+++6FZcuWNWs/9dRTC1VVVYWXX3652TU/+tGPblLX8ccfX9h+++0Lzz33XFPbU089VejevXth4x9hLrzwwkLPnj0Ly5cvb2pbunRpoXv37oXa2tpO3/+38gzq6+sLSQof+tCHtnjOxk488cRCjx49Cn/729+a2hYtWlTYaaedCocffnizc7fUt631uaXPrfF7tmDBgqZzGo9tbPbs2YUkhR//+MdNbd/85jc3+ey29m9rfSgUCoUkhSOOOGKzxzb22GOPFZIUpk2bVigUCoVXXnmlsMMOOxR+9KMfFQqFQqFfv36Furq6QqFQKDQ0NBTKy8sLZ5111lav+ZOf/KSQpPCDH/zgDe+/Lc4555xCWVlZ4Zprrtnmz06YMKHwtre9bZP2xufY6MQTTyxUVFQU/v73vze1Pf7444Xy8vJN/swDQGdiWisAkCSpq6vLXXfd1ex1++23b3LeZz7zmWbv3/ve9+Z///d/09DQkGTDyJ2bbropxx9/fAqFQpYtW9b0GjNmTOrr6/Pwww9v9Zrr1q3L3XffnRNPPDEDBgxoat97770zduzYZueedtppWbNmTX75y182td1www159dVX8y//8i+dvv9v5Rk01rzTTjtt8ZyNa7rzzjtz4okn5u1vf3tT++67756Pfexj+f3vf990va31bUvtb+a5baxXr15N//uVV17J//7v/2bvvffOzjvvvNXPvZX+balvhULhDUfNJRtG2O26665Na8n95S9/ycqVK5tGMR566KH5wx/+kGTDWnTr1q1rNn329ebNm5eJEydm1KhRmTBhwhvef2OrV6/e6uvSSy/NhAkTcuaZZ+a6667bpmu3xLp163LHHXfkxBNPzKBBg5ra991334wZM6bo9wOA9sS0VgAgSXLwwQe3aEOEjX9xTpLevXsnSf75z3+msrIyL7zwQpYvX56rr756izt8Nk5tbPT6XVKXLl2aVatWbXan1Ne3vetd70pNTU1+9rOf5cwzz0yyYTrnIYcc0nTu2rVr8+KLLzb73G677Zby8vKm9x21/0nLnsHmVFZWJkleeumlLZ7T6IUXXsjLL7+cIUOGbHJs3333zfr16/Pss89uMp1yczvgbq79zTy3ja1atSqXXHJJrrnmmjz33HPNppnW19dv8XMb339b+7elvrVUWVlZDj300Nx3331Zv359/vCHP6Rv375N37NDDz00V155ZZI0hXRbCucWL16c4447LlVVVfnlL3/Z7M/2G1mxYkWLAtpGp512Wo4++uj079+/xZ95Iy+88EJWrVqVd77znZscGzJkSP7nf/6naPcCgPZGOAcAbJMt/dLfGIY0LmD/L//yL1scvdO4hlajjUc9vRmnnXZaPv/5z+cf//hH1qxZkz/+8Y9NoUaS3H///TnqqKOafWbBggWbXaT+jbTH/idv/Aw2p7KyMgMGDMijjz76lu+/JVvq2+vb38xz29g555yTa665Jueee25GjRqVqqqqlJWV5dRTT222qUIxFeP7dthhh+U3v/lNHnnkkab15hodeuih+dKXvpTnnnsuv//97zNgwIBmo/oa1dfXZ+zYsVm+fHl+97vfNRtt2RIVFRW55ppr3vC8O+64Iz//+c8zfvz4TdY+3JrXb/rQaN26dS2+BgB0ZsI5AKCodtttt+y0005Zt25dRo8e/aau0bdv31RUVOTpp5/e5Njm2k499dRMmjQp119/fVatWpXtttsup5xyStPxYcOG5a677mr2mWKO+tlYKfqfvPEz2JIPfvCDufrqqzN79uytbhyx2267Zfvtt8/8+fM3OTZv3rx069YtAwcOfMP7be36b+W5/fKXv8yECRPyrW99q6lt9erVWb58ebPzthQUtXb/tqRxJNzvf//7/OEPf2i26cWIESPSs2fPzJo1Kw888EA+8IEPbPL51atX5/jjj8+TTz6Zu+++O9XV1dtcQ/fu3fPJT35yq+fcdddd+dWvfpUTTzwx11133TaNzOvdu/cm34dkww67jXbbbbf06tUrTz311Cbnbe57AgCdiTXnAICiKi8vz0knnZSbbrppsyOyXnjhhRZdY/To0bn55puzaNGipvann356s+vA9enTJ2PHjs1Pf/rT/OxnP8v73//+pp04kw3hwOjRo5u9Kioq3mQP37j2tu5/8sbPYEu+/OUvZ4cddsinPvWpLFmyZJPjf/vb3/Kd73wn5eXlOfbYY3PLLbfkmWeeaTq+ZMmSXHfddTnssMOapsm+GW/1uZWXlzebypokV1xxxSajs3bYYYck2SQsKmb/5s2bl4ULF7bo3IMOOigVFRX52c9+lueee67ZyLmePXvm3e9+d+rq6rJy5cpNprSuW7cup5xySmbPnp0bb7yxxTsTvxlf/epXM3r06Nxwww3p3n3b/n3/He94R+rr6/PXv/61qe3555/Pr371q6b35eXlGTNmTG6++eZmz+6JJ57IHXfc8dY7AADtmJFzAECS5Pbbb8+8efM2aT/00EM3O5Vua77xjW/knnvuyciRI3PWWWeluro6L774Yh5++OHcfffdm6z/tjkXX3xx7rzzzrznPe/JZz/72axbty5XXnllhg4dmrlz525y/mmnnZaTTz45STJt2rRtqjfp+P1P3twzeMc73pHrrrsup5xySvbdd9+cdtppGTp0aNauXZv7778/N954Y9Ooqq9+9au56667cthhh+Vf//Vf07179/zXf/1X1qxZk0svvbRF99uat/LcPvjBD+YnP/lJqqqqUl1dndmzZ+fuu+/Orrvu2uy8ESNGJEn+7d/+Laeeemq22267HH/88dlhhx2K1r999903RxxxRIs2hejRo0dqamryu9/9Lj179myqr9Ghhx7aNBrw9eHcF77whfz617/O8ccfnxdffDE//elPmx3flg1R3sgtt9ySXr16pUePHtv82VNPPTXnn39+xo0bl8997nN5+eWX873vfS/77LNPs806pkyZkhkzZuS9731v/vVf/zWvvvpqrrjiiuy3337Ngj0A6HRKtEssANBOXHPNNYUkW3xdc801hUKhUKitrS0kKbzwwgub/fyCBQuatS9ZsqQwceLEwsCBAwvbbbddoX///oVjjjmmcPXVVzeds6VrNpo5c2bhwAMPLPTo0aPwjne8o/D973+/8IUvfKFQUVGxyblr1qwp9O7du1BVVVVYtWpVl+v/W3kGhUKh8OSTTxbOOuuswuDBgws9evQo7LTTToX3vOc9hSuuuKKwevXqpvMefvjhwpgxYwo77rhjYfvtty8cddRRhfvvv3+T622pb2/U55Y8t80983/+85+F008/vdCnT5/CjjvuWBgzZkxh3rx5hbe97W2FCRMmNLvHtGnTCnvssUehW7dum1ynJf17oz4kKRxxxBGbPbY5F154YSFJ4dBDD93k2PTp0wtJCjvttFPh1VdfbXbsiCOO2Oqf3fbkzjvvLAwdOrTQo0ePwpAhQwo//elPm57jxu69997CiBEjCj169Ci8/e1vL1x11VWbPQ8AOpOyQuF14/8BANqxE088MY899tgma1O9+uqrGTBgQI4//vj84Ac/KFF1rW9L/U+6zjMAAOhMrDkHALRbq1atavb+qaeeyv/8z//kyCOP3OTcm2++OS+88EJOO+20Nqqu9W1L/5PO+QwAADo7I+cAgHZr9913zyc/+cm8/e1vz9///vd873vfy5o1a/LnP/8573znO5MkDzzwQP76179m2rRp6dOnT7M1rDq6lvQ/6dzPAACgs7MhBADQbr3//e/P9ddfn8WLF6dnz54ZNWpUvv71rzcLpr73ve/lpz/9aYYPH55rr722dMW2gpb0P+nczwAAoLMzcg4AAAAASsSacwAAAABQIsI5AAAAACgRa84Vyfr167No0aLstNNOKSsrK3U5AAAAAJRQoVDISy+9lAEDBqRbty2PjxPOFcmiRYsycODAUpcBAAAAQDvy7LPPZs8999ziceFckey0005JNjzwysrKElcDAAAAQCk1NDRk4MCBTZnRlgjniqRxKmtlZaVwDgAAAIAkecPlz2wIAQAAAAAlIpwDAAAAgBIRzgEAAABAiVhzro2tW7cur7zySqnL6JS22267lJeXl7oMAAAAgBYTzrWRQqGQxYsXZ/ny5aUupVPbeeed079//zdcbBEAAACgPRDOtZHGYK5v377ZfvvthUdFVigU8vLLL2fp0qVJkt13373EFQEAAAC8MeFcG1i3bl1TMLfrrruWupxOq1evXkmSpUuXpm/fvqa4AgAAAO2eDSGKrKamJtXV1amrq2tqa1xjbvvtty9VWV1G4zO2rh8AAADQERg5V2Rz5sxJZWXlZo+Zytr6PGMAAACgIzFyDgAAAABKRDgHAAAAACUinKPo7r333gwcOHCLxwuFQq6++uqMHDkyO+64Y3beeeccdNBBufzyy/Pyyy8nSS6++OKUlZWlrKws5eXlGThwYD796U/nxRdfbKtuAAAAALQ64VxHM316MmxY0qvXhq/Tp5e6ok3ccsstOf7447d4/BOf+ETOPffcfOhDH8o999yTuXPn5qKLLsott9ySO++8s+m8/fbbL88//3wWLlyYa665JjNmzMhnP/vZtugCAAAAQJuwIURHMn16ctJJSVlZUigkjzyy4f1NNyXjxxf9drfeemv+5V/+Jf/7v/+b8vLyzJ07NwceeGDOP//8fOMb30iSfOpTn8rq1avz05/+tOlzv/71r3PllVdu9pq/+MUv8rOf/Sw333xzPvShDzW1Dx48OCeccEIaGhqa2rp3757+/fsnSfbYY498+MMfzjXXXFP0fgIAAAClsXBhsmzZpu19+iSDBrV9PaVg5FxHMmXKa8FcsuFrWVkydWqr3O69731vXnrppfz5z39OsmG6ap8+fTJr1qymc+69994ceeSRTe8fe+yxLF26NEcfffRmr/mzn/0sQ4YMaRbMNSorK0tVVdVmP/fMM8/kjjvuSI8ePd58hwAAAIB2Y+HCZMiQZMSITV9Dhmw43hUI5zqSJ598LZhrVCgk8+e3yu2qqqoyfPjwpjBu1qxZOe+88/LnP/85K1asyHPPPZenn346RxxxRNNnbrnllowZM2aLIdpTTz2VIUOGtOj+jzzySHbcccf06tUre+21Vx577LGcf/75b7lfAAAAQOktW5asXr35Y6tXb35EXWcknOtI9tlnw0i5jZWVbYiTW8kRRxyRWbNmpVAo5He/+13Gjx+ffffdN7///e9z7733ZsCAAXnnO9/ZdP4tt9ySE044YYvXK7w+XNyKIUOGZO7cuZkzZ07OP//8jBkzJuecc85b6g8AAABAeyKc60hqa1+bypq8NsW1trbVbnnkkUfm97//ff7yl79ku+22y7ve9a4ceeSRmTVrVu69995mo+aef/75/PnPf85xxx23xevts88+mTdvXovu3aNHj+y9994ZOnRovvGNb6S8vDxTpkx5y30CAAAAaC+Ecx3J+PEbNn844ICkomLD1+nTk3HjWu2WjevOffvb324K4hrDuVmzZjVbb+43v/lNDj300Oyyyy5bvN7HPvaxPPnkk7nllls2OVYoFFJfX7/Fz37lK1/Jf/zHf2TRokVvvkMAAAAA7YhwrqMZPz6ZOzdZtWrD11YM5pKkd+/eOeCAA/Kzn/2sKYg7/PDD8/DDD+fJJ59sNnLu17/+9VantCbJRz7ykZxyyin56Ec/mq9//ev505/+lL///e+59dZbM3r06Nxzzz1b/OyoUaNywAEH5Otf/3pR+gYAAABQasI53tARRxyRdevWNYVzu+yyS6qrq9O/f/+mzR1WrlyZmTNnvmE4V1ZWluuuuy6XXXZZbr755hxxxBE54IADcvHFF+dDH/pQxowZs9XPn3feefn+97+fZ599tih9AwAAAEqjT58NEwM3p6Jiw/GuoKywLSv0s0UNDQ2pqqpKfX19Kisrmx1bvXp1FixYkL322isVW/pT18FNnz49X/nKV/L444+XtI6u8KwBAACgs1i4cPO7svbpkwwa1Pb1FNPWsqKNdW/DmujEdtxxx/z7v/97qcsAAAAAOpBBgzp+CPdWCee2Yv78+TnllFOavb/++utz4oknlq6odurYY48tdQkAAAAAHY5wbiuGDBmSuXPnJklWrFiRwYMH533ve19piwIAAACg07AhRAv9+te/zjHHHJMddtih1KUAAAAA0El06HDuvvvuy/HHH58BAwakrKwsN9988ybn1NXVZfDgwamoqMjIkSPz4IMPvql7/eIXv2g2xRUAAAAA3qoOHc6tXLkyw4YNS11d3WaP33DDDZk0aVJqa2vz8MMPZ9iwYRkzZkyWLl3adM7w4cMzdOjQTV6LFi1qOqehoSH3339/PvCBD7R6nwAAAADoOjr0mnNjx47N2LFjt3j8sssuy1lnnZXTTz89SXLVVVfltttuyw9/+MNccMEFSdK0ptzW3HLLLTn22GNTUVHxhuc2NDQ0e9+zZ883/AwAAAAAXVOHHjm3NWvXrs1DDz2U0aNHN7V169Yto0ePzuzZs7fpWtsypXXgwIGpqqpqel1yySXbdC8AAAAAuo4OPXJua5YtW5Z169alX79+zdr79euXefPmtfg69fX1efDBB3PTTTe16Pxnn302lZWVTe979uyZQqHQ4vsBAAAA0HV02nCuWKqqqrJkyZIWn19ZWdksnEuS1atXF7ssAAAAADqBTjuttU+fPikvL98kWFuyZEn69+/favetqalJdXX1FjepeCsWLkwefnjT18KFRb9Vm7jnnnvygQ98ILvuumu23377VFdX5wtf+EKee+65JMmsWbNSVlbW9Nptt93ygQ98II888kiJKwcAAAAojk4bzvXo0SMjRozIzJkzm9rWr1+fmTNnZtSoUa123zlz5uTxxx/PxIkTi3rdhQuTIUOSESM2fQ0Z0vECuv/6r//K6NGj079//9x00015/PHHc9VVV6W+vj7f+ta3mp07f/78PP/887njjjuyZs2aHHfccVm7dm2JKgcAAAAong49rXXFihV5+umnm94vWLAgc+fOzS677JJBgwZl0qRJmTBhQg466KAcfPDBufzyy7Ny5cqm3Vs7kmXLki3Njl29esPxQYOKf98jjzwyBxxwQCoqKvL9738/PXr0yGc+85lcfPHFTecsXLgw55xzTmbOnJlu3brl/e9/f6644opN1vtr9I9//COf+9zn8rnPfS7f/va3m9oHDx6cww8/PMuXL292ft++fbPzzjunf//+Offcc3PCCSdk3rx5OeCAA4rfYQAAAIA21KFHzv3pT3/KgQcemAMPPDBJMmnSpBx44IGZPHlykuSUU07Jf/zHf2Ty5MkZPnx45s6dmxkzZmwxNCqG1pzWWio/+tGPssMOO+SBBx7IpZdemqlTp+auu+5KsmE04oc+9KG8+OKLuffee3PXXXfl//2//7fV3W1vvPHGrF27Nl/+8pc3e3znnXfebHt9fX1+/vOfJ9kwMhIAAACgo+vQI+eOPPLIN9wJ9eyzz87ZZ5/dRhVtmNb6+g0hOroDDjggtbW1SZJ3vvOdufLKKzNz5sy8733vy8yZM/PII49kwYIFGThwYJLkxz/+cfbbb7/MmTMnNTU1m1zvqaeeSmVlZXbfffcW3X/PPfdMkqxcuTJJcsIJJ+Rd73pXMboGAAAAUFIdeuQcbeP100d33333LF26NEnyxBNPZODAgU3BXJJUV1dn5513zhNPPLHZ6xUKhZSVlbX4/r/73e/y0EMP5dprr80+++yTq6666k30AgAAAKD96dAj52gb2223XbP3ZWVlWb9+/Zu+3j777JP6+vo8//zzLRo9t9dee2XnnXfOkCFDsnTp0pxyyim577773vT9AQAAANoLI+c6iD59koqKzR+rqNhwvBT23XffPPvss3n22Web2h5//PEsX7481dXVm/3MySefnB49euTSSy/d7PHXbwixsYkTJ+bRRx/Nr371q7dUNwAAAEB7YORckdXU1KS8vDwTJ07MxIkTi3bdQYOS+fM37Mr6en36tM5OrS0xevTo7L///vn4xz+eyy+/PK+++mr+9V//NUcccUQOOuigzX5m4MCB+fa3v52zzz47DQ0NOe200zJ48OD84x//yI9//OPsuOOO+da3vrXZz26//fY566yzUltbmxNPPHGbpscCAAAAtDfCuSJrzQ0hBg0qXQi3JWVlZbnllltyzjnn5PDDD0+3bt3y/ve/P1dcccVWP/ev//qv2WefffIf//EfGTduXFatWpXBgwfngx/8YCZNmrTVz5599tm57LLLcuONN+YjH/lIMbsDAAAA0KbKCm+03Skt0tDQkKqqqtTX128Szq1evToLFizIXnvtlYotzU2lKDxrAAAAKK6FC9vfTL6OYGtZ0caMnAMAAABgsxYuTIYMSVav3vRYRcWGJbgEdG+NDSGKrKamJtXV1amrqyt1KQAAAABvybJlmw/mkg3tmxtRx7Yxcq7IWnPNOQAAAAA6F+EcAAAAQCuwVhstIZxrQ/beaH2eMQAAAO2BtdpoKWvOtYHtttsuSfLyyy+XuJLOr/EZNz5z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UCiUuohiKCsry69+9auceOKJTW0jR45MTU1NrrzyyiTJ+vXrM3DgwJxzzjm54IILtvken/rUpzJu3Lgcd9xxmxxraGhIVVXVJu21tbW5+OKLt/leAAAAAHRcjVlRfX19Kisrt3hehx45tzVr167NQw89lAsvvLCprVu3bhk9enRmz57d4ussXbo0ffv2zfz58/Pggw/mqquu2ur5zz77bLMHbtQcAAAAAFvSacO5ZcuWZd26denXr1+z9n79+mXevHktvs6HPvSh1NfXZ4cddsg111yT7t23/sgqKyu3moYCAAAAQKNOG84Vy7aMsgMAAACAbdGhd2vdmj59+qS8vDxLlixp1r5kyZL079+/1e5bU1OT6urq1NXVtdo9AAAAAOgcOu3IuR49emTEiBGZOXNm0yYR69evz8yZM3P22We32n3nzJljWisAAAAALdKhw7kVK1bk6aefbnq/YMGCzJ07N7vssksGDRqUSZMmZcKECTnooINy8MEH5/LLL8/KlStz+umnl7BqAAAAANigQ4dzf/rTn3LUUUc1vZ80aVKSZMKECbn22mtzyimn5IUXXsjkyZOzePHiDB8+PDNmzNhkk4hiqqmpSXl5eSZOnJiJEye22n0AAAAA6PjKCoVCodRFdAYNDQ2pqqpKfX29aa0AAAAAXVxLs6JOuyEEAAAAALR3wjkAAAAAKBHhHAAAAACUiHCuyGpqalJdXZ26urpSlwIAAABAO9ehd2ttj+bMmWNDCAAAAABaxMg5AAAAACgR4RwAAAAAlIhwrsisOQcAAABAS1lzrsisOQcAAABASxk5BwAAAAAlUrSRc717905ZWVmLzn3xxReLdVsAAAAA6LCKFs5dfvnlxboUAAAAAHQJRQvnJkyYUKxLAQAAAECX0Gprzv3tb3/LV77ylXz0ox/N0qVLkyS33357Hnvssda6Zbtgt1YAAAAAWqpVwrl77703+++/fx544IFMnz49K1asSJL85S9/SW1tbWvcst2YM2dOHn/88UycOLHUpQAAAADQzrVKOHfBBRfkq1/9au6666706NGjqf3oo4/OH//4x9a4JQAAAAB0OK0Szj3yyCMZN27cJu19+/bNsmXLWuOWAAAAANDhtEo4t/POO+f555/fpP3Pf/5z9thjj9a4JQAAAAB0OK0Szp166qk5//zzs3jx4pSVlWX9+vX5wx/+kC9+8Ys57bTTWuOWAAAAANDhtEo49/Wvfz3vete7MnDgwKxYsSLV1dU5/PDDc+ihh+YrX/lKa9wSAAAAADqcskKhUGitiy9cuDCPPvpoVqxYkQMPPDDvfOc7W+tWJdfQ0JCqqqrss88+KS8vz8SJE+3YCgAAANBFNWZF9fX1qays3OJ5rRrOJUnj5cvKylrzNiXX0gcOAAAAQOfX0qyoVaa1JskPfvCDDB06NBUVFamoqMjQoUPz/e9/v7VuBwAAAAAdTvfWuOjkyZNz2WWX5ZxzzsmoUaOSJLNnz855552XhQsXZurUqa1xWwAAAADoUFplWutuu+2W7373u/noRz/arP3666/POeeck2XLlhX7liVnWisAAAAAjUo6rfWVV17JQQcdtEn7iBEj8uqrr7bGLQEAAACgw2mVcO4Tn/hEvve9723SfvXVV+fjH/94a9wSAAAAADqcoq05N2nSpKb/XVZWlu9///u58847c8ghhyRJHnjggSxcuDCnnXZasW4JAAAAAB1a0cK5P//5z83ejxgxIknyt7/9LUnSp0+f9OnTJ4899lixbgkAAAAAHVrRwrl77rmnWJfq0GpqalJeXp6JEydm4sSJpS4HAAAAgHasaOEcG8yZM8durQAAAAC0SKuFc3/605/yi1/8IgsXLszatWubHZs+fXpr3RYAAAAAOoxW2a315z//eQ499NA88cQT+dWvfpVXXnkljz32WH7729+mqqqqNW4JAAAAAB1Oq4RzX//61/Ptb387v/nNb9KjR4985zvfybx58/KRj3wkgwYNao1bAgAAAECH0yrh3N/+9rccd9xxSZIePXpk5cqVKSsry3nnnZerr766NW4JAAAAAB1Oq4RzvXv3zksvvZQk2WOPPfLoo48mSZYvX56XX365NW4JAAAAAB1Oq2wIcfjhh+euu+7K/vvvnw9/+MP5/Oc/n9/+9re56667cswxx7TGLQEAAACgw2mVcO7KK6/M6tWrkyT/9m//lu222y73339/TjrppHzlK19pjVsCAAAAQIdTVigUCqUuojNoaGhIVVVV6uvrU1lZWepyAAAAACihlmZFRRs519DQ0OJzhVcAAAAAUMRwbuedd05ZWdlWzykUCikrK8u6deuKdVsAAAAA6LCKFs7dc889xbpUh1ZTU5Py8vJMnDgxEydOLHU5AAAAALRj1pwrEmvO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AICSEs4BQFvaZ58NI+U2VlaWDBlSmnoAAICSEs4BQFuqrX1tKmvy2hTX2trS1gUAAJSEcO7/jBs3Lr17987JJ5/crP3ZZ5/NkUcemerq6hxwwAG58cYbS1QhAJ3C+PHJTTclBxyQVFRs+Dp9ejJuXKkrAwAASqCsUHj9wjdd06xZs/LSSy/lRz/6UX75y182tT///PNZsmRJhg8fnsWLF2fEiBF58skns8MOOzT7fENDQ6qqqlJfX5/Kysq2Lh8AAACAdqSlWZGRc//nyCOPzE477bRJ++67757hw4cnSfr3758+ffrkxRdfbOPqAAAAAOiMOkQ4d9999+X444/PgAEDUlZWlptvvnmTc+rq6jJ48OBUVFRk5MiRefDBB4tex0MPPZR169Zl4MCBRb82AAAAAF1PhwjnVq5cmWHDhqWurm6zx2+44YZMmjQptbW1efjhhzNs2LCMGTMmS5cubTpn+PDhGTp06CavRYsWtaiGF198MaeddlquvvrqovQJAAAAALqXuoCWGDt2bMaOHbvF45dddlnOOuusnH766UmSq666Krfddlt++MMf5oILLkiSzJ07903ff82aNTnxxBNzwQUX5NBDD93quQ0NDc3e9+zZMz179nzT9wYAAACg8+oQI+e2Zu3atXnooYcyevToprZu3bpl9OjRmT179lu+fqFQyCc/+ckcffTR+cQnPvGG5w8cODBVVVVNr0suueQt1wAAAABA59QhRs5tzbJly7Ju3br069evWXu/fv0yb968Fl9n9OjR+ctf/pKVK1dmzz33zI033phRo0blD3/4Q2644YYccMABTWvd/eQnP8n++++/2es8++yzzXbgMGoOAAAAgC3p8OFcsdx9992bbT/ssMOyfv36Fl+nsrJyq9vjAgAAAECjDj+ttU+fPikvL8+SJUuatS9ZsiT9+/dv83pqampSXV29xc0rAAAAAKBRhx8516NHj4wYMSIzZ87MiSeemCRZv359Zs6cmbPPPrvN65kzZ46RcwAAAAC0SIcI51asWJGnn3666f2CBQsyd+7c7LLLLhk0aFAmTZqUCRMm5KCDDsrBBx+cyy+/PCtXrmzavRUAAAAA2qMOEc796U9/ylFHHdX0ftKkSUmSCRMm5Nprr80pp5ySF154IZMnT87ixYszfPjwzJgxY5NNIgAAAACgPSkrFAqFUhfRGTQ0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QAfT0qyo3aw5t27duvz85z/PypUrM2rUqDz00EN55ZVXMnr06KZz3vWud2XQoEGZPXt2kmT27NnZf//9m4K5JBkzZkwaGhqaRt/Nnj272TUaz2m8xtq1a/PQQw81O6dbt24ZPXp00zmbs2bNmjQ0NDR7AQAAAMC2KHk498gjj2THHXdMz54985nPfCa/+tWvUl1dncWLF6dHjx7Zeeedm53fr1+/LF68OEmyePHiZsFc4/HGY1s7p6GhIatWrcqyZcuybt26zZ7TeI3NueSSS1JVVdX0Gjhw4JvqPwAAAABdV8nDuSFDhmTu3Ll54IEH8tnPfjYTJkzI448/Xuqy3tCFF16Y+vr6ptezzz5b6pIAAAAA6GC6l7qAHj16ZO+9906SjBgxInPmzMl3vvOdnHLKKVm7dm2WL1/ebPTckiVL0r9//yRJ//79N9lVtXE3143Pef0Or0uWLEllZWV69eqV8vLylJeXb/acxmtsTs+ePdOzZ88312kAAAAASDsYOfd669evz5o1azJixIhst912mTlzZtOx+fPnZ+HChRk1alSSZNSoUXnkkUea7ap61113pbKyMtXV1U3nbHyNxnMar9GjR4+MGDGi2Tnr16/PzJkzm84BAAAAgNZQ0pFzF154YcaOHZtBgwblpZdeynXXXZdZs2bljjvuSFVVVc4888xMmjQpu+yySyorK3POOedk1KhROeSQQ5Ikxx57bKqrq/OJT3wil156aRYvXpyvfOUrmThxYtOots985jO58sor8+UvfzlnnHFGfvvb3+YXv/hFbrvttqY6Jk2alAkTJuSggw7KwQcfnMsvvzwrV67M6aefXpLnAgAAAEDXUNJwbunSpTnttNPy/PPPp6qqKgcccEDuuOOOvO9970uSfPvb3063bt1y0kknZc2aNRkzZkz+8z//s+nz5eXlufXWW/PZz342o0aNyg477JAJEyZk6tSpTefstddeue2223LeeeflO9/5Tvbcc898//vfz5gxY5rOOeWUU/LCCy9k8uTJWbx4cYYPH54ZM2ZsskkEAAAAABRTWaFQKJS6iM6goaEhVVVVqa+vT2VlZanLAQAAAKCEWpoVtbs15wAAAACgqxDOAQAAAECJCOcAAAAAoESEcwAAAABQIsI5AAAAACgR4RwAAAAAlIhwDgAAAABKRDgHAAAAACUinAMAAACAEhHOAQAAAECJFDWce+6554p5OQAAAADo1IoSzi1evDjnnHNO3vnOdxbjcgAAAADQJbQ4nPvnP/+Zj370o+nTp08GDBiQ7373u1m/fn0mT56ct7/97ZkzZ06uueaa1qwVAAAAADqV7i098YILLsj999+fT37yk7njjjty3nnnZcaMGenWrVt++9vf5pBDDmnNOgEAAACg02nxyLnbb78911xzTf7jP/4jv/nNb1IoFDJ8+PDceuutgjkAAAAAeBNaHM4tWrQo++67b5Jk8ODBqaioyL/8y7+0WmEAAAAA0Nm1OJwrFArp3v21WbDl5eXp1atXqxQFAAAAAF1Bi9ecKxQKOeaYY5oCulWrVuX4449Pjx49mp338MMPF7dCAAAAAOikWhzO1dbWNnv/oQ99qOjFAAAAAEBXUlYoFAqlLqIzaGhoSFVVVerr61NZWVnqcgAAAAAooZZmRS1ec2716tX59a9/nZdeemmzN/v1r3+dNWvWvLlqAQAAAKALanE491//9V/5zne+k5122mmTY5WVlfnud7+b//7v/y5qcQAAAADQmbU4nPvZz36Wc889d4vHzz333Pz4xz8uRk0AAAAA0CW0OJx76qmnMmzYsC0eP+CAA/LUU08VpSgAAAAA6ApaHM69+uqreeGFF7Z4/IUXXsirr75alKIAAAAAoCtocTi333775e67797i8TvvvDP77bdfUYoCAAAAgK6gxeHcGWeckWnTpuXWW2/d5NhvfvObfO1rX8sZZ5xR1OIAAAAAoDPr3tITP/3pT+e+++7LCSeckHe9610ZMmRIkmTevHl58skn85GPfCSf/vSnW61QAAAAAOhsWjxyLkl++tOf5uc//3n22WefPPnkk5k/f36GDBmS66+/Ptdff31r1QgAAAAAnVJZoVAolLqIzqChoSFVVVWpr69PZWVlqcsBAAAAoIRamhVt08g5AAAAAKB4hHMAAAAAUCLCOQAAAAAokZKGc5dccklqamqy0047pW/fvjnxxBMzf/78ZuesXr06EydOzK677podd9wxJ510UpYsWdLsnIULF+a4447L9ttvn759++ZLX/pSXn311WbnzJo1K+9+97vTs2fP7L333rn22ms3qaeuri6DBw9ORUVFRo4cmQcffLDofQYAAACARi0O5wYNGpSzzz47d9555ybB15t17733ZuLEifnjH/+Yu+66K6+88kqOPfbYrFy5sumc8847L7/5zW9y44035t57782iRYsyfvz4puPr1q3Lcccdl7Vr1+b+++/Pj370o1x77bWZPHly0zkLFizIcccdl6OOOipz587Nueeem0996lO54447ms654YYbMmnSpNTW1ubhhx/OsGHDMmbMmCxdurQofQUAAACA12vxbq333ntvfv3rX+fXv/51XnjhhYwZMyYnnHBCjjvuuOy8885FKeaFF15I3759c++99+bwww9PfX19dtttt1x33XU5+eSTkyTz5s3Lvvvum9mzZ+eQQw7J7bffng9+8INZtGhR+vXrlyS56qqrcv755+eFF15Ijx49cv755+e2227Lo48+2nSvU089NcuXL8+MGTOSJCNHjkxNTU2uvPLKJMn69eszcODAnHPOObngggvesHa7tQIAAADQqOi7tR5xxBH51re+laeeeip/+MMfMnz48FxxxRXp379/jj766Fx++eX5f//v/72louvr65Mku+yyS5LkoYceyiuvvJLRo0c3nfOud70rgwYNyuzZs5Mks2fPzv77798UzCXJmDFj0tDQkMcee6zpnI2v0XhO4zXWrl2bhx56qNk53bp1y+jRo5vOeb01a9akoaGh2QsAAAAAtsWbWnNuv/32y4UXXpg//vGPeeaZZ/LRj340M2fOzNChQzN06NDcdttt23zN9evX59xzz8173vOeDB06NEmyePHi9OjRY5ORef369cvixYubztk4mGs83nhsa+c0NDRk1apVWbZsWdatW7fZcxqv8XqXXHJJqqqqml4DBw7c5j4DAAAA0LW95Q0h+vfvn7POOiu/+c1vsmzZskybNi09e/bc5utMnDgxjz76aH7+85+/1ZLaxIUXXpj6+vqm17PPPlvqkgAAAADoYLoX82Lbb799xo0bt82fO/vss3Prrbfmvvvuy5577tnU3r9//6xduzbLly9vNnpuyZIl6d+/f9M5r99VtXE3143Pef0Or0uWLEllZWV69eqV8vLylJeXb/acxmu8Xs+ePd9UCAkAAAAAjd7yyLm3olAo5Oyzz86vfvWr/Pa3v81ee+3V7PiIESOy3XbbZebMmU1t8+fPz8KFCzNq1KgkyahRo/LII48021X1rrvuSmVlZaqrq5vO2fgajec0XqNHjx4ZMWJEs3PWr1+fmTNnNp0DAAAAAMVW1JFz22rixIm57rrrcsstt2SnnXZqWt+tqqoqvXr1SlVVVc4888xMmjQpu+yySyorK3POOedk1KhROeSQQ5Ikxx57bKqrq/OJT3wil156aRYvXpyvfOUrmThxYtPIts985jO58sor8+UvfzlnnHFGfvvb3+YXv/hFs7XxJk2alAkTJuSggw7KwQcfnMsvvzwrV67M6aef3vYPBgAAAIAuoaxQKBRKdvOyss22X3PNNfnkJz+ZJFm9enW+8IUv5Prrr8+aNWsyZsyY/Od//mez6aZ///vf89nPfjazZs3KDjvskAkTJuQb3/hGund/LXucNWtWzjvvvDz++OPZc889c9FFFzXdo9GVV16Zb37zm1m8eHGGDx+e7373uxk5cmSL+tLS7XEBAAAA6PxamhUVNZz75S9/mZNPPrlYl+tQhHMAAADFNW3atNTW1mbKlCm56KKLSl0OwDZpaVa0TWvOvfrqq3n00Ufz5JNPNmu/5ZZbMmzYsHz84x9/c9UCAADARqZNm5bJkyenUChk8uTJmTZtWqlLAmgVLQ7nHn300ey9994ZNmxY9t1334wfPz5LlizJEUcckTPOOCNjx47N3/72t9asFQAAgC6gMZjbmIAO6KxavCHE+eefn7333jtXXnllrr/++lx//fV54okncuaZZ2bGjBnp1atXa9YJAABAF7C5YK5RY7sprkBn0uI15/r27Zs777wzw4cPT319fXr37p0f/ehH+cQnPtHaNXYI1pwDAAB467p165at/ZpaVlaW9evXt2FFAG9O0decW7ZsWQYMGJAkqaqqyg477JBDDjnkrVcKAAAA/2fKlClv6ThAR9Piaa1lZWV56aWXUlFRkUKhkLKysqxatSoNDQ3NzjNqDAAAgDerccrq5qa2Tp061ZRWoNNpcThXKBSyzz77NHt/4IEHNntfVlaWdevWFbdCAAAAupTNBXSCOaCzanE4d88997RmHQAAANCkMYirra3NlClTBHNAp9XiDSHYOhtCAAAAANCo6BtCLFq0KF/84hc3WWMuSerr6/OlL30pS5YseXPVAgAAAEAX1OJw7rLLLktDQ8Nmk76qqqq89NJLueyyy4paHAAAAAB0Zi0O52bMmJHTTjtti8dPO+203HrrrUUpCgAAAAC6ghaHcwsWLMigQYO2eHzPPffMM888U4yaAAAAAKBLaHE416tXr62Gb88880x69epVjJoAAAAAoEtocTg3cuTI/OQnP9ni8R//+Mc5+OCDi1IUAAAAAHQF3Vt64he/+MW8733vS1VVVb70pS+lX79+SZIlS5bk0ksvzbXXXps777yz1QoFAAAAgM6mxSPnjjrqqNTV1eXKK6/MgAED0rt37+yyyy4ZMGBA6urqcsUVV+Too49uzVoBAADYimnTpqVbt26ZNm1aqUsBoIXKCoVCYVs+8Nxzz+UXv/hFnn766RQKheyzzz45+eSTs+eee7ZWjR1CQ0NDqqqqUl9fn8rKylKXAwAAdDHTpk3L5MmTm95PnTo1F110UQkrAujaWpoVbXM4x+YJ5wAAgFJ5fTDXSEAHUDotzYpaPK0VAACA9mdLwVySTJ482RRXgHbOyLkiMXIOAAAohW7dumVrv9aVlZVl/fr1bVgRAImRcwAAAF3ClClT3tJxAEpLOAcAANCBXXTRRZk6depmj1lzDqD96/5mP/jQQw/liSeeSJJUV1fn3e9+d9GKAgAAoOUaAzi7tQJ0PNsczi1dujSnnnpqZs2alZ133jlJsnz58hx11FH5+c9/nt12263YNQIAAPAGGoO42traTJkyRTAH0EFs87TWc845Jy+99FIee+yxvPjii3nxxRfz6KOPpqGhIZ/73Odao0YAAABa4KKLLsr69esFcwAdyDbv1lpVVZW77747NTU1zdoffPDBHHvssVm+fHkx6+sw7NYKAAAAQKNW2611/fr12W677TZp32677WzPDQAAAADbYJvDuaOPPjqf//zns2jRoqa25557Luedd16OOeaYohYHAAAAAJ3ZNodzV155ZRoaGjJ48OC84x3vyDve8Y7stddeaWhoyBVXXNEaNQIAAABAp7TNu7UOHDgwDz/8cO6+++7MmzcvSbLvvvtm9OjRRS8OAAAAADqzbR45lyRlZWV53/vel3POOSfnnHOOYK6TmjZtWrp165Zp06aVuhQAAACATmmbR84lycyZMzNz5swsXbp0k00gfvjDHxalMEpr2rRpmTx5cpI0fbUdOwAAAEBxbXM4N2XKlEydOjUHHXRQdt9995SVlbVGXZTQxsFcIwEdAAAAQPFt87TWq666Ktdee20eeOCB3HzzzfnVr37V7LUt7rvvvhx//PEZMGBAysrKcvPNNzc7XigUMnny5Oy+++7p1atXRo8enaeeeqrZOS+++GI+/vGPp7KyMjvvvHPOPPPMrFixotk5f/3rX/Pe9743FRUVGThwYC699NJNarnxxhvzrne9KxUVFdl///3zP//zP9vUl85ic8Fco8mTJ5viCgAAAFBE2xzOrV27NoceemhRbr5y5coMGzYsdXV1mz1+6aWX5rvf/W6uuuqqPPDAA9lhhx0yZsyYrF69uumcj3/843nsscdy11135dZbb819992XT3/6003HGxoacuyxx+Ztb3tbHnrooXzzm9/MxRdfnKuvvrrpnPvvvz8f/ehHc+aZZ+bPf/5zTjzxxJx44ol59NFHi9LPjqS2tvYtHQcAAACg5coKhUJhWz5w/vnnZ8cddyz69MaysrL86le/yoknnphkw6i5AQMG5Atf+EK++MUvJknq6+vTr1+/XHvttTn11FPzxBNPpLq6OnPmzMlBBx2UJJkxY0Y+8IEP5B//+EcGDBiQ733ve/m3f/u3LF68OD169EiSXHDBBbn55pubdps95ZRTsnLlytx6661N9RxyyCEZPnx4rrrqqhbV39DQkKqqqtTX16eysrJYj6XNbW3kXJJMnTrV1FYAAACAN9DSrGibR86tXr06l112WY444oicc845mTRpUrNXsSxYsCCLFy9uthNsVVVVRo4cmdmzZydJZs+enZ133rkpmEuS0aNHp1u3bnnggQeazjn88MObgrkkGTNmTObPn59//vOfTee8fsfZMWPGNN1nc9asWZOGhoZmr87goosuytSpUzd7TDAHAAAA227atGnp1q2bpaLYrG3eEOKvf/1rhg8fniSbTPss5uYQixcvTpL069evWXu/fv2aji1evDh9+/Ztdrx79+7ZZZddmp2z1157bXKNxmO9e/fO4sWLt3qfzbnkkksyZcqUN9Gz9q8xgNt4BJ1gDgAAALbdxjPUbLbI5mxzOHfPPfe0Rh0dzoUXXthspGBDQ0MGDhxYwoqKq/H/KGprazNlyhT/xwEAAADbaHNLRwnoeL1tDufaSv/+/ZMkS5Ysye67797UvmTJkqaRe/3798/SpUubfe7VV1/Niy++2PT5/v37Z8mSJc3OaXz/Ruc0Ht+cnj17pmfPnm+iZx3HRRdd5P8sAAAA4E3Y2pruAjo2ts1rzrWVvfbaK/3798/MmTOb2hoaGvLAAw9k1KhRSZJRo0Zl+fLleeihh5rO+e1vf5v169dn5MiRTefcd999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LVrUVt0AAICSK8bP1h1R91IXAAAd2dixYzN27NgtHr/sssty1lln5fTTT0+SXHXVVbntttvywx/+MBdccEGSZO7cuW1RKgAAtGtv9WfrAQMGNBsp99xzz+Xggw9u9brfKiPnAKCVrF27Ng899FBGjx7d1NatW7eMHj06s2fPLmFlAADQsbTkZ+uDDz44jz76aJ577rmsWLEit99+e8aMGVOqklvMyDkAaCXLli3LunXr0q9fv2bt/fr1y7x581p8ndGjR+cvf/lLVq5cmT333DM33nhjRo0aVexyAQCg3WrJz9bdu3fPt771rRx11FFZv359vvzlL7f7nVoT4RwAtHt33313qUsAAIAO4YQTTsgJJ5xQ6jK2iWmtANBK+vTpk/Ly8ixZsqRZ+5IlS9K/f/8SVQUAAB1PZ/7ZWjgHAK2kR48eGTFiRGbOnNnUtn79+sycOdO0VAAA2Aad+Wdr01oB4C1YsWJFnn766ab3CxYsyNy5c7PLLrtk0KBBmTRpUiZMmJCDDjooBx98cC6//PKsXLmyaYcpAABgg676s3VZoVAolLoIAOioZs2alaOOOmqT9gkTJuTaa69Nklx55ZX55je/mcWLF2f48OH57ne/m5EjR7ZxpQAA0L511Z+thXMAAAAAUCLWnAMAAACAEhHOAQAAAECJCOcAAAAAoESEcwAAAABQIsI5AAAAACgR4RwAAAAAlIhwDgAAAABKRDgHAAAAACUinAMAAACAEhHOAQAAAECJCOcAAGhm3Lhx6d27d04++eRSlwIA0OkJ5wAAaObzn/98fvzjH5e6DACALkE4BwBAM0ceeWR22mmnUpcBANAlCOcAANhm//u//5u+ffvmmWeeaTf33HffffP973+/Wdupp56ab33rW5ucu6V2AIC2JpwDAGCbfe1rX8uHPvShDB48uF3cc9WqVXnqqacybNiwZu1f+cpX8rWvfS319fUtagcAaGvCOQAAtsnLL7+cH/zgBznzzDPbzT0fffTRFAqFDB06tFn70KFD8453vCM//elPW9QOANDWhHMAAO3cM888k7Kysk1eRx55ZEnq+Z//+Z/07NkzhxxySLP29evX59JLL83ee++dnj17ZtCgQfna176WJFmzZk0+97nPpW/fvqmoqMhhhx2WOXPmNPv8L3/5y+y///7p1atXdt1114wePTorV67c6j3nzp2bo48+OocddljWr1+fQYMG5fLLL292zvHHH5+f//znm/RjS+0AAG1JOAcA0M4NHDgwzz//fNPrz3/+c3bdddccfvjhmz3/61//enbcccetvhYuXLjF+40ePTof/vCH8z//8z/Zc889M3v27GbHf/e732XEiBGbfO7CCy/MN77xjVx00UV5/PHHc91116Vfv35Jki9/+cu56aab8qMf/SgPP/xw9t5774wZMyYvvvhikuT555/PRz/60Zxxxhl54oknMmvWrIwfPz6FQmGL9/zb3/6WI444IkcffXROOOGEjB8/Pl/4whdy3nnnZe7cuU3nHXzwwXnwwQezZs2aZp/fUjsAQFsqKzT+xAMAQLu3evXqHHnkkdltt91yyy23pFu3Tf+t9cUXX2wKvbZk8ODB6d69+5uq4cQTT8yuu+6aH/zgB01tL730UnbbbbdceeWV+dSnPtXs/JUrV6Z379659tpr87GPfSxJ8sorr2Tw4ME599xz86UvfSkPP/xwRowYkWeeeSZve9vbWnTP973vfdlzzz1zzTXXZOTIkTnllFNy7rnnpnfv3vnqV7+ac845J0ny17/+NcOGDdvk2ltqBwBoS2/uJzIAAErijDPOyEsvvZS77rprs8Fckuyyyy7ZZZddWq2GVatWpaKiolnbE088kTVr1uSYY47Z5Py//e1veeWVV/Ke97ynqW277bbLwQcfnCeeeCJJMmzYsBxzzDHZf//9M2bMmBx77LE5+eST07t3783ec/Hixfntb3+b+++/P+vWrcsjjzySSy65JN26dUt5eXl69OjRdG6vXr2SbFi3bmNbagcAaEumtQIAdBBf/epXc8cdd+TXv/51dtpppy2e91amtW5ubbuNX0nSp0+f/POf/2z2ucag680qLy/PXXfdldtvvz3V1dW54oorMmTIkCxYsGCz9/zjH/+Y9evXZ/jw4Zk/f35WrVqV4cOH55lnnsk///nPHHrooU3nNo4i3G233Zrdc0vtAABtSTgHANAB3HTTTZk6dWp+8Ytf5B3veMdWz/3MZz6TuXPnbvU1YMCAzX524cKFOeKII7Lvvvtm//33z//f3v28wtrGcRz/qDGRspgmmTIUSZiRXxtNsTJC2dkoYyHhD2CyIDQLnVJToyglZWfDRoaa0mAxodkMG1s/ptRMocmP4lk8dddkPJ16TnOfc3q/ajbf+77m+722n+6ra3t7W5+fn8ZPklpaWnR1dZW1rra2VsXFxYpEIl/+s6amRlarVaenp0bt/f1dZ2dnamhoMGoFBQXyeDxaWFhQPB6X1WrVzs5Ozp5vb2+S/j3mG4/HVVVVJZvNprW1NblcLrndbuPdRCKhiooK2e32rLm+qwMAAOQTx1oBAAB+c4lEQj6fT36/X42NjUomk5Ikq9Wa8/jq/znWarFYFAwG1dzcrGQyqba2NvX19amkpMR4p6enRzMzM0qn08ax06KiIvn9fk1PT8tqtcrj8ejh4UGXl5caHR3V5OSkpqamZLPZVFlZqR8/fiiTyWh0dFSSFIvFFIlE5PV6VVZWplgspoeHB9XX1+fs2dHRIYvFosXFRT0/P6u6ulorKysKhUKKRqNZezo+PpbX6/2y1+/qAAAA+UQ4BwAA8Js7Pz9XJpNRIBBQIBAw6l1dXTo6OvqlvRwOhxwOhySpvLxcdrtdqVQqK5xzu91qbW3V9va2xsfHjfrs7KwsFovm5uZ0d3cnh8OhiYkJSdLS0pI+Pj40PDysp6cntbe36+DgwAj3SktLFY1GFQwG9fj4qKqqKi0vL6u3tzdnT6fTqY2NDfn9ft3f38tisSiTySgcDmfd6vry8qLd3V2Fw+GsfX5XBwAAyDduawUAAEBOFxcXGhkZUSKR+PJsb29PU1NTSiQS315M8at919Nms2lzc1MDAwNf1qyurmpnZ0eHh4c/VQcAAMg3vpwDAADAF6lUSj6fT+vr6zmf9/f36/r6Wre3t3I6nXmZKVfPm5sbpdNpuVyunGsKCwsVCoV+ug4AAJBvfDkHAACALK+vr+ru7tbY2JiGh4fNHuc/7e/va3BwUE9PT8ZtsgAAAH8SwjkAAAAYPj8/NTQ0pLq6Os3Pz5s9DgAAwF+PcA4AAACGk5MTdXZ2qqmpyahtbW3J7XabOBUAAMDfi3AOAAAAAAAAMEl+rtYCAAAAAAAA8AXhHAAAAAAAAGASwjkAAAAAAADAJIRzAAAAAAAAgEkI5wAAAAAAAACTEM4BAAAAAAAAJiGcAwAAAAAAAExCOAcAAAAAAACYhHAOAAAAAAAAMAnhHAAAAAAAAGASwjkAAAAAAADAJIRzAAAAAAAAgEn+ASYXDNj/2DHQAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_eec_truth_ud = files[\"test\"][\"Nominal/h_eec_truth_ud_WW\"]\n", + "h_eec_truth_ud_noCR = files[\"test_noCR\"][\"Nominal/h_eec_truth_ud_WW\"]\n", + "\n", + "xsection_CR = 16.4385\n", + "xsection_noCR = 100000 # Placeholder value\n", + "\n", + "nEvents = 100000\n", + "\n", + "scale_CR = xsection_CR / nEvents\n", + "scale_noCR = xsection_noCR / nEvents\n", + "\n", + "# Convert to numpy arrays\n", + "values1, edges1 = h_eec_truth_ud.to_numpy()\n", + "values2, edges2 = h_eec_truth_ud_noCR.to_numpy()\n", + "\n", + "values1 = values1 * scale_CR\n", + "values2 = values2 * scale_noCR\n", + "\n", + "# values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "# values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 8), sharex=True, gridspec_kw={'height_ratios': [2.5, 1]})\n", + "plt.subplots_adjust(hspace=0)\n", + "\n", + "# === Pad 1: Angular Distributions ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_ylabel('set label')\n", + "ax1.set_title(r'Energy-Energy Correlator: W2 $\\rightarrow$ ud')\n", + "ax1.set_xscale('log')\n", + "ax1.set_yscale('log')\n", + "\n", + "# === Pad 2: Ratios ===\n", + "def safe_divide(num, denom):\n", + " with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratio = np.true_divide(num, denom)\n", + " ratio[~np.isfinite(ratio)] = 0 # -inf, inf, NaN -> 0 or np.nan as you prefer\n", + " return ratio\n", + "\n", + "ratio1 = safe_divide(values2, values1)\n", + "\n", + "ax2.plot(bin_centers1, ratio1, marker='D', linestyle='None', color='black', markersize=4)\n", + "ax2.axhline(y=1, color='r', linestyle='--', linewidth = 0.8)\n", + "\n", + "# ax2.legend()\n", + "ax2.set_xlabel(r'z = $\\frac{1}{2}(\\cos(\\phi))$')\n", + "ax2.set_ylabel('no CR / CR')\n", + "ax2.set_xscale('log')\n", + "ax2.set_yscale('linear')\n", + "# ax2.set_ylim(0.85, 1.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "id": "ce949ad0-f19c-4a6f-b49c-a43cede4547e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABPEAAALOCAYAAADIoYbaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB5TElEQVR4nOzdfZyVZZ0/8M8BhEFlRm2UB2VCUxFEIEEJ01CkzPqRqJXmrpBbtrXkmmwPWiqJrfakUclq9qDlZrIWapaZiqKplAbS4hM+ZEEaIOs6IyCgzPn9McvoyIwOOMw5M/N+v17nNZ7rvu77/l73GaaZT9d134VisVgMAAAAAFC2upW6AAAAAADg9QnxAAAAAKDMCfEAAAAAoMwJ8QAAAACgzAnxAAAAAKDMCfEAAAAAoMwJ8QAAAACgzAnxAAAAAKDMCfEAAAAAoMwJ8QAAAACgzAnxAAAAAKDMCfEAAOg0rrzyyhQKhfzlL38pdSkAAG1KiAcAtGhTINLS6/e//32pS9ymuvr4N3nyySfzz//8z9lrr71SUVGRysrKvPOd78y3v/3tvPjii6Uur83ce++9+fKXv5znn3++pHX813/9VwqFQq677rrNto0YMSKFQiF33HHHZttqampyyCGHJElWr16d6dOn573vfW922WWXFAqFXHnlldu6dABgG+pR6gIAgPI3Y8aM7Lnnnpu177333iWopv115fH/+te/zoc+9KH06tUrkydPzrBhw7Jhw4bcfffd+dznPpeHHnool19+eanLbBP33ntvzjvvvHz0ox/NTjvtVLI6Dj300CTJ3XffnWOPPbaxva6uLg8++GB69OiRe+65J0cccUTjtmXLlmXZsmU58cQTkySrVq3KjBkzUlNTkxEjRmTevHntOgYAoO0J8QCAN3T00Udn9OjRpS4ja9asyQ477NDu5+2q43/qqady4okn5q1vfWtuv/329O/fv3Hb1KlT88QTT+TXv/51m5yrpbGV6jNvS1s6hgEDBmTPPffM3Xff3aR9/vz5KRaL+dCHPrTZtk3vNwWA/fv3z9///vf069cvf/zjH3PQQQe9yVEAAKVmOS0A8KZ9+ctfTqFQyBNPPNE4i6mqqiqnnHJK1q5du1n/p59+Ov/0T/+Uvn37plevXtl///3zox/9qNljPvzwwznppJOy8847NwYUSTJv3ryMHj06FRUVedvb3pbvfe97jfskyR133NHiksSrr746hUIh8+fP77Tjb4tr8PWvfz2rV6/OD3/4wyYB3iZ77713Tj/99Mb3DzzwQI4++uhUVlZmxx13zJFHHtnskuOWxvZGY27NdWvOX//61/zLv/xLBg8enN69e+ctb3lLPvShDzW5b96Xv/zlfO5zn0uS7Lnnno1Lpl/dpzXje6MxPProo1m6dOkb1nzooYfmgQceaLJc+Z577sn++++fo48+Or///e9TX1/fZFuhUMg73/nOJEmvXr3Sr1+/NzxPuViwYEE++MEPZrfddktFRUX222+/zJgxo0mfa665JiNHjkxFRUUGDx6c66+/Ph/5yEey//77l6hqAGhfZuIBAG+otrY2q1atatJWKBTylre8pUnbhz/84ey555658MILs3DhwvzgBz/Ibrvtlq997WuNfVasWJF3vOMdKRQK+fSnP51dd901v/nNb/Kxj30sdXV1+cxnPtPkmB/60Ieyzz775IILLkixWEzSEKa8973vTf/+/XPeeedl48aNmTFjRnbdddfG/Q4//PAMHDgwP/3pT5ssSUySn/70p3nb296WsWPHdtrxt8U1uPHGG7PXXns13mft9Tz00EM57LDDUllZmc9//vPZbrvt8r3vfS+HH3547rzzzowZM2azfV47tpUrV7Y45i29bq92//335957782JJ56YPfbYI3/5y19y6aWX5vDDD8/DDz+c7bffPscdd1wee+yx/OxnP8u3vvWtVFdXJ0njNd3S8TU3hiQZMmRIxo0b94bLWw899NBcddVV+cMf/pDDDz88SUNQd8ghh+SQQw5JbW1tHnzwwQwfPrxx23777bfZ92R7OOecc1JTU5NTTz11q/a/7rrrcuKJJ2avvfbK5z73uey4446Nn9km3/rWtzJt2rQcd9xxmTp1ahYvXpyTTz45u+66q1mGAHQdRQCAFlxxxRXFJM2+evXq1dhv+vTpxSTFf/qnf2qy/7HHHlt8y1ve0qTtYx/7WLF///7FVatWNWk/8cQTi1VVVcW1a9c2OeZHPvKRzeqaOHFicfvtty8+/fTTjW2PP/54sUePHsVX/3pz1llnFXv16lV8/vnnG9tWrlxZ7NGjR3H69Omdfvxv5hrU1tYWkxSPOeaYFvu82qRJk4o9e/YsPvnkk41tzzzzTLFPnz7Fd73rXU36tjS21xtza6/bps/sqaeeauyzadurzZ8/v5ik+JOf/KSx7Rvf+MZm+27p+F5vDMVisZikOG7cuGa3vdpDDz1UTFI8//zzi8VisfjSSy8Vd9hhh+KPf/zjYrFYLPbt27c4a9asYrFYLNbV1RW7d+9ePPXUU5s91v33319MUrziiive8Lxb47TTTisWCoWtOv6SJUuK22+/ffHYY48tvvjii022rVu3rlgsFov//d//Xdxuu+2K55xzTpPtn/zkJ4tJijNmzNjq2gGgI7GcFgB4Q7Nmzcqtt97a5PWb3/xms36f/OQnm7w/7LDD8j//8z+pq6tLkhSLxfziF7/IxIkTUywWs2rVqsbXUUcdldra2ixcuPB1j7lx48bcdtttmTRpUgYMGNDYvvfee+foo49u0nfy5MlZv359fv7znze2zZ49Oy+//HL+8R//sdOP/81cg0019+nTp8U+r67plltuyaRJk7LXXns1tvfv3z8nnXRS7r777sbjvd7YWmrfmuv2ar17927875deein/8z//k7333js77bTT6+73ZsbX0tiKxWKrHjIxZMiQvOUtb2m8192f/vSnrFmzpnFW5CGHHJJ77rknScO98jZu3Nhk2W5bWrdu3eu+vv71r2fKlCn52Mc+lquvvnqLjn3uueemoqIiV155ZSoqKpps69WrV5LkwgsvzM4775wvfvGLTbZvGu8BBxzwJkYHAB2H5bQAwBs6+OCDW/Vgh5qamibvd9555yTJ//7v/6aysjLPPvtsnn/++Vx++eUtPtF005LKTV77VNiVK1fmxRdfbPbJsK9t22+//XLQQQflpz/9aT72sY8laVhG+o53vKOx74YNG/Lcc8812W/XXXdN9+7dG9931PEnrbsGzamsrEySvPDCCy322eTZZ5/N2rVrM3jw4M22DRkyJPX19Vm2bNlm9y5r7om/zbVvzXV7tRdffDEXXnhhrrjiijz99NNNlrfW1ta2uN+rz7+l42tpbK1VKBRyyCGH5K677kp9fX3uueee7Lbbbo2f2SGHHJJLLrkkSRrDvG0R4q1evbpVQe4mkydPzvjx41t1P77169fnxhtvzMc//vHG77fX2rBhQ375y1/mU5/61GYh3+rVq5Mkw4YNS9LwOX30ox/NvHnzsscee+Q//uM/cuSRR7a6dgAod0I8AKDNvDr4erVNocmmG/H/4z/+Y6ZMmdJs3033+Nrk1bOotsbkyZNz+umn529/+1vWr1+f3//+943hR5Lce++9OeKII5rs89RTT2XQoEFbfK5yHH/yxtegOZWVlRkwYEAefPDBN33+lrQ0tte2b811e7XTTjstV1xxRT7zmc9k7NixqaqqSqFQyIknntjk4RBtqS0+t0MPPTQ33nhjFi9e3Hg/vE0OOeSQfO5zn8vTTz+du+++OwMGDGgyS7CtVFRU5IorrnjDfr/97W9zzTXX5Ljjjtvs3owt+fOf/5y1a9dm1KhRLfZ58skns2bNmowcOXKzbY899li23377xnFPnTo1/fr1y7PPPpvbbrstH/7wh/P4449nl112aVU9AFDuhHgAQLvZdddd06dPn2zcuDETJkzYqmNsenrlE088sdm25tpOPPHETJs2LT/72c/y4osvZrvttssJJ5zQuH3EiBG59dZbm+yzrZ7qWYrxJ298DVry//7f/8vll1+e+fPnv+4DMHbddddsv/32WbJkyWbbHn300XTr1i0DBw58w/O93vHfzHX7+c9/nilTpuSiiy5qbFu3bl2ef/75Jv1e/WTf155/W46vJZtm1t1999255557mjy8Y9SoUenVq1fmzZuXP/zhD3nf+97X5udPkh49euSjH/3o6/a59dZbc91112XSpEm5+uqrWwyzX2vTk3dbuu5Jmn2686b2//zP/8yQIUPSrVu3rF69Otdff33+/Oc/Z/vtt88HPvCBHHDAAbnhhhtyyimntKoeACh37okHALSb7t275/jjj88vfvGLZmd4Pfvss606xoQJE3L99dfnmWeeaWx/4oknmr1PXXV1dY4++uj853/+Z37605/mve99b+OTR5OGJa8TJkxo8nrtsr22UorxJ298DVry+c9/PjvssEM+/vGPZ8WKFZttf/LJJ/Ptb3873bt3z3ve857ccMMN+ctf/tK4fcWKFbn66qtz6KGHtrhcsjXe7HXr3r17kyW0SfLd7343GzdubNK2ww47JMlm4V5bju/RRx/N0qVLW9V39OjRqaioyE9/+tM8/fTTTWbi9erVKwceeGBmzZqVNWvWbLP74bXGV77ylUyYMCGzZ89Ojx6tnyOwaWnwbbfdttm2l156KckrS9Q3LRneZPr06Vm5cmXj/fAef/zx7Ljjjtljjz0a+xxwwAF56KGHtmwwAFDGzMQDAN7Qb37zmzz66KObtR9yyCFbvITvq1/9au64446MGTMmp556aoYOHZrnnnsuCxcuzG233bbZ/ema8+Uvfzm33HJL3vnOd+ZTn/pUNm7cmEsuuSTDhg3LokWLNus/efLkfPCDH0ySnH/++VtUb9Lxx59s3TV429velquvvjonnHBChgwZksmTJ2fYsGHZsGFD7r333lx77bWNs7S+8pWv5NZbb82hhx6af/mXf0mPHj3yve99L+vXr8/Xv/71Vp3v9byZ6/b//t//y1VXXZWqqqoMHTo08+fPz2233Za3vOUtTfptWtb5pS99KSeeeGK22267TJw4MTvssEObjW/IkCEZN25cqx5u0bNnzxx00EH53e9+l169em227PSQQw5pnF3YXIh3ySWX5Pnnn28Me2+88cb87W9/S9KwxLiqqqrVdb+eG264Ib17907Pnj23aL/Kysp89KMfzZVXXpn169fn8MMPzwsvvJA77rgj73//+zN16tTsuuuuec973pPLL788vXr1ypAhQ3LjjTdm2bJlSV65H97q1as3C1IrKyvzP//zP20yRgAoCyV6Ki4A0AFcccUVxSQtvq644opisVgsTp8+vZik+Oyzzza7/1NPPdWkfcWKFcWpU6cWBw4cWNxuu+2K/fr1Kx555JHFyy+/vLFPS8fcZO7cucW3v/3txZ49exbf9ra3FX/wgx8U/+3f/q1YUVGxWd/169cXd95552JVVVXxxRdf7HLjfzPXoFgsFh977LHiqaeeWhw0aFCxZ8+exT59+hTf+c53Fr/73e8W161b19hv4cKFxaOOOqq44447FrfffvviEUccUbz33ns3O15LY3ujMbfmujV3zf/3f/+3eMoppxSrq6uLO+64Y/Goo44qPvroo8W3vvWtxSlTpjQ5x/nnn1/cfffdi926ddvsOK0Z3xuNIUlx3LhxzW5rzllnnVVMUjzkkEM22zZnzpxikmKfPn2KL7/88mbb3/rWt7b4vfva78lSWbNmTfFLX/pScZ999in26tWr2L9//+Lxxx9ffOKJJxr7/P3vfy9OnDix2KdPn+Luu+9e/MIXvlC88cYbi0mKN998c7FYbPhsdt555ybH/vSnP138t3/7t3YdDwBsS4Vi8TVrCwAAOqhJkybloYceyuOPP96k/eWXX86AAQMyceLE/PCHPyxRddteS+NPus41oGv4zne+k9NPPz1PP/10BgwYkNWrV2eXXXbJU089ld133z1JcsQRR2Ty5MnuiQdAp+GeeABAh7TppvibPP7447npppty+OGHb9b3+uuvz7PPPpvJkye3U3Xb3paMP+mc14Cu6+GHH84uu+ySAQMGJEl23HHHHHPMMZk+fXpefPHF/OpXv8p///d/55hjjilxpQDQdszEAwA6pP79++ejH/1o9tprr/z1r3/NpZdemvXr1+eBBx7IPvvskyT5wx/+kP/+7//O+eefn+rq6ixcuLDEVbed1ow/6dzXgK7rXe96V5Lkrrvuamx79tlnM2XKlMybNy977LFH/uM//mOrnwINAOXIgy0AgA7pve99b372s59l+fLl6dWrV8aOHZsLLrigSYB16aWX5j//8z8zcuTIXHnllaUrdhtozfiTzn0N6LoeeeSRfOhDH2rStuuuu+amm24qUUUAsO2ZiQcAAAAAZc498QAAAACgzAnxAAAAAKDMuSdeO6uvr88zzzyTPn36pFAolLocAAAAAEqoWCzmhRdeyIABA9KtW8vz7YR47eyZZ57JwIEDS10GAAAAAGVk2bJl2WOPPVrcLsRrZ3369EnS8MFUVlaWuBoAAAAASqmuri4DBw5szIxaIsRrZ5uW0FZWVgrxAAAAAEiSN7ztmgdbAAAAAECZE+IBAAAAQJkT4gEAAABAmXNPvDK1cePGvPTSS6Uuo1Pabrvt0r1791KXAQAAANBqQrwyUywWs3z58jz//POlLqVT22mnndKvX783vGkkAAAAQDkQ4pWZTQHebrvtlu23317I1MaKxWLWrl2blStXJkn69+9f4ooAAAAA3pgQr4xs3LixMcB7y1veUupyOq3evXsnSVauXJnddtvN0loAAACg7HmwRRnZdA+87bffvsSVdH6brrH7DgIAAAAdgRCvDFlCu+25xgAAAEBHIsQDAAAAgDInxAMAAACAMifEo2TuvPPODBw4sMXtxWIxl19+ecaMGZMdd9wxO+20U0aPHp2ZM2dm7dq1SZIvf/nLKRQKKRQK6d69ewYOHJhPfOITee6559prGAAAAADbnBCvs5ozJxkxIundu+HrnDmlrmgzN9xwQyZOnNji9pNPPjmf+cxncswxx+SOO+7IokWLcs455+SGG27ILbfc0thv//33z9///vcsXbo0V1xxRW6++eZ86lOfao8hAAAAALSLHqUugG1gzpzk+OOTQiEpFpPFixve/+IXyXHHtfnpfvWrX+Uf//Ef8z//8z/p3r17Fi1alLe//e35whe+kK9+9atJko9//ONZt25d/vM//7Nxv1/+8pe55JJLmj3mf/3Xf+WnP/1prr/++hxzzDGN7YMGDcoHPvCB1NXVNbb16NEj/fr1S5Lsvvvu+dCHPpQrrriizccJAAAAlMbSpcmqVZu3V1cnNTXtX08pmInXGZ133isBXtLwtVBIZszYJqc77LDD8sILL+SBBx5I0rBMtrq6OvPmzWvsc+edd+bwww9vfP/QQw9l5cqVGT9+fLPH/OlPf5rBgwc3CfA2KRQKqaqqana/v/zlL/ntb3+bnj17bv2AAAAAgLKxdGkyeHAyatTmr8GDG7Z3BUK8zuixx14J8DYpFpMlS7bJ6aqqqjJy5MjG0G7evHk544wz8sADD2T16tV5+umn88QTT2TcuHGN+9xwww056qijWgzbHn/88QwePLhV51+8eHF23HHH9O7dO3vuuWceeuihfOELX3jT4wIAAABKb9WqZN265retW9f8DL3OSIjXGe27b8PMu1crFBri6W1k3LhxmTdvXorFYn73u9/luOOOy5AhQ3L33XfnzjvvzIABA7LPPvs09r/hhhvygQ98oMXjFV8bQr6OwYMHZ9GiRbn//vvzhS98IUcddVROO+20NzUeAAAAgHIixOuMpk9/ZQlt8srS2unTt9kpDz/88Nx9993505/+lO222y777bdfDj/88MybNy933nlnk1l4f//73/PAAw/k/e9/f4vH23ffffPoo4+26tw9e/bM3nvvnWHDhuWrX/1qunfvnvPOO+9NjwkAAACgXAjxOqPjjmt4iMXw4UlFRcPXOXOSY4/dZqfcdF+8b33rW42B3aYQb968eU3uh3fjjTfmkEMOyS677NLi8U466aQ89thjueGGGzbbViwWU1tb2+K+Z599dr75zW/mmWee2foBAQAAAJQRIV5nddxxyaJFyYsvNnzdhgFekuy8884ZPnx4fvrTnzYGdu9617uycOHCPPbYY01m4v3yl7983aW0SfLhD384J5xwQj7ykY/kggsuyB//+Mf89a9/za9+9atMmDAhd9xxR4v7jh07NsOHD88FF1zQJmMDAAAAKDUhHm1m3Lhx2bhxY2OIt8suu2To0KHp169f40Mq1qxZk7lz575hiFcoFHL11Vfn4osvzvXXX59x48Zl+PDh+fKXv5xjjjkmRx111Ovuf8YZZ+QHP/hBli1b1iZjAwAAAEqjurphoWFzKioatncFheKWPEGAN62uri5VVVWpra1NZWVlk23r1q3LU089lT333DMVLX13dnBz5szJ2WefnYcffrikdXSFaw0AAACdxdKlzT+Ftro6qalp/3ra0utlRa/Wox1rguy444752te+VuoyAAAAgA6kpqbjh3VvluW0tKv3vOc9mThxYqnLAAAAADqaOXOSESOS3r0bvs6ZU+qK2pUQDwAAAIDyNmdOcvzxyeLFybp1DV+PP75LBXlCPAAAAADK23nnJYVCsunRDsViw/sZM0pbVzsS4gEAAABQ3h577JUAb5NiMVmypDT1lIAQDwAAAIDytu++DTPvXq1QSAYPLk09JSDEAwAAAKC8TZ/+yhLa5JWltdOnl7audiTEAwAAAKC8HXdc8otfJMOHJxUVDV/nzEmOPbbUlbWbHqUuAAAAAADe0HHHNby6KDPxAAAAAKDMCfE6oaVLk4ULN38tXVrqyrbOHXfckfe97315y1veku233z5Dhw7Nv/3bv+Xpp59OksybNy+FQqHxteuuu+Z973tfFi9eXOLKAQAAANqGEK+TWbq04cEso0Zt/ho8uOMFed/73vcyYcKE9OvXL7/4xS/y8MMP57LLLkttbW0uuuiiJn2XLFmSv//97/ntb3+b9evX5/3vf382bNhQosoBAAAA2o574nUyq1Yl69Y1v23duobtNTVtf97DDz88w4cPT0VFRX7wgx+kZ8+e+eQnP5kvf/nLjX2WLl2a0047LXPnzk23bt3y3ve+N9/97nfTt2/fZo/5t7/9Lf/6r/+af/3Xf823vvWtxvZBgwblXe96V55//vkm/XfbbbfstNNO6devXz7zmc/kAx/4QB599NEMHz687QcMAAAA0I7MxKPN/PjHP84OO+yQP/zhD/n617+eGTNm5NZbb02S1NfX55hjjslzzz2XO++8M7feemv+/Oc/54QTTmjxeNdee202bNiQz3/+881u32mnnZptr62tzTXXXJMk6dmz55sbFAAAAEAZMBOPNjN8+PBMnz49SbLPPvvkkksuydy5c/Pud787c+fOzeLFi/PUU09l4MCBSZKf/OQn2X///XP//ffnoIMO2ux4jz/+eCorK9O/f/9WnX+PPfZIkqxZsyZJ8oEPfCD77bdfWwwNAAAAoKTMxKPNvHbZav/+/bNy5cokySOPPJKBAwc2BnhJMnTo0Oy000555JFHmj1esVhMoVBo9fl/97vfZcGCBbnyyiuz77775rLLLtuKUQAAAACUHzPxaDPbbbddk/eFQiH19fVbfbx99903tbW1+fvf/96q2Xh77rlndtpppwwePDgrV67MCSeckLvuumurzw8AAABQLszE62Sqq5OKiua3VVQ0bC+FIUOGZNmyZVm2bFlj28MPP5znn38+Q4cObXafD37wg+nZs2e+/vWvN7v9tQ+2eLWpU6fmwQcfzHXXXfem6gYAAAAoB2bitaFjjz028+bNy5FHHpmf//znJamhpiZZsqThKbSvVV29bZ5M2xoTJkzIAQcckH/4h3/IzJkz8/LLL+df/uVfMm7cuIwePbrZfQYOHJhvfetb+fSnP526urpMnjw5gwYNyt/+9rf85Cc/yY477piLLrqo2X233377nHrqqZk+fXomTZq0RctyAQAAAMqNmXht6PTTT89PfvKTUpeRmprkwAM3f5UqwEsaltbecMMN2XnnnfOud70rEyZMyF577ZXZs2e/7n7/8i//kltuuSVPP/10jj322Oy33375+Mc/nsrKynz2s5993X0//elP55FHHsm1117blkMBAAAAaHeFYrFYLHURncm8efNyySWXtDgTr66uLlVVVamtrU1lZWWTbevWrctTTz2VPffcMxUtrYmlTbjWAAAAQDl4vazo1Uo+E+/CCy/MQQcdlD59+mS33XbLpEmTsmTJkjY9x1133ZWJEydmwIABKRQKuf7665vtN2vWrAwaNCgVFRUZM2ZM7rvvvjatAwAAAAC2RslDvDvvvDNTp07N73//+9x666156aWX8p73vCdr1qxptv8999yTl156abP2hx9+OCtWrGh2nzVr1mTEiBGZNWtWi3XMnj0706ZNy/Tp07Nw4cKMGDEiRx11VFauXNnYZ+TIkRk2bNhmr2eeeWYLRw0AAAAArVfyB1vcfPPNTd5feeWV2W233bJgwYK8613varKtvr4+U6dOzT777JNrrrkm3bt3T5IsWbIk48ePz7Rp0/L5z39+s3McffTROfroo1+3josvvjinnnpqTjnllCTJZZddll//+tf50Y9+lDPPPDNJsmjRoq0dJgAAAABstZLPxHut2traJMkuu+yy2bZu3brlpptuygMPPJDJkyenvr4+Tz75ZMaPH59JkyY1G+C1xoYNG7JgwYJMmDChybkmTJiQ+fPnb91A3sBBBx2UoUOHvu7sQAAAAABIymAm3qvV19fnM5/5TN75zndm2LBhzfYZMGBAbr/99hx22GE56aSTMn/+/EyYMCGXXnrpVp931apV2bhxY/r27dukvW/fvnn00UdbfZwJEybkT3/6U9asWZM99tgj1157bcaOHdts3/vvv7/FmxV61si25xoDAAAAHUlZhXhTp07Ngw8+mLvvvvt1+9XU1OSqq67KuHHjstdee+WHP/xhCoVCO1XZsttuu+1N7b/ddtslSdauXZvevXu3RUm0YO3atUleueYAAAAA5axsQrxPf/rT+dWvfpW77rore+yxx+v2XbFiRT7xiU9k4sSJuf/++3PGGWfku9/97lafu7q6Ot27d9/swRgrVqxIv379tvq4W6p79+7ZaaedGh+msf3225dFONmZFIvFrF27NitXrsxOO+3UeF9FAAAAgHJW8hCvWCzmtNNOy3XXXZd58+Zlzz33fN3+q1atypFHHpkhQ4bk2muvzWOPPZbDDz88vXr1yje/+c2tqqFnz54ZNWpU5s6dm0mTJiVpWNo7d+7cfPrTn96qY26tTaHhq5+KS9vbaaed2jWgBQAAAHgzSh7iTZ06NVdffXVuuOGG9OnTJ8uXL0+SVFVVbbaktL6+PkcffXTe+ta3Zvbs2enRo0eGDh2aW2+9NePHj8/uu++eM844Y7NzrF69Ok888UTj+6eeeiqLFi3KLrvskpqamiTJtGnTMmXKlIwePToHH3xwZs6cmTVr1jQ+rba9FAqF9O/fP7vttlteeumldj13V7HddtuZgQcAAAB0KIViie/w39Jy0SuuuCIf/ehHN2u/9dZbc9hhh6WioqJJ+wMPPJBdd9212aW48+bNyxFHHLFZ+5QpU3LllVc2vr/kkkvyjW98I8uXL8/IkSPzne98J2PGjNmyAb2Burq6VFVVpba2tsUHWwAAAADQNbQ2Kyp5iNfVCPEAAAAA2KS1WVG3dqwJAAAAANgKQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCvDZy7LHHZuedd84HP/jBUpcCAAAAQCcjxGsjp59+en7yk5+UugwAAAAAOiEhXhs5/PDD06dPn1KXAQAAAEAn1CVCvLvuuisTJ07MgAEDUigUcv3112/WZ9asWRk0aFAqKioyZsyY3Hfffe1fKAAAAAA0o0uEeGvWrMmIESMya9asZrfPnj0706ZNy/Tp07Nw4cKMGDEiRx11VFauXNnYZ+TIkRk2bNhmr2eeeaa9hgEAAABAF9Wj1AW0h6OPPjpHH310i9svvvjinHrqqTnllFOSJJdddll+/etf50c/+lHOPPPMJMmiRYvatKa6urom73v16pVevXq16TkAAAAA6By6xEy817Nhw4YsWLAgEyZMaGzr1q1bJkyYkPnz52+z8w4cODBVVVWNrwsvvHCbnQsAAACAjq1LzMR7PatWrcrGjRvTt2/fJu19+/bNo48+2urjTJgwIX/605+yZs2a7LHHHrn22mszduzYFvsvW7YslZWVje/NwgMAAACgJV0+xGsrt9122xb1r6ysbBLiAQAAAEBLuvxy2urq6nTv3j0rVqxo0r5ixYr069evRFUBAAAAwCu6fIjXs2fPjBo1KnPnzm1sq6+vz9y5c193OSwAAAAAzZgzJxkxIundu+HrnDmlrqhT6BLLaVevXp0nnnii8f1TTz2VRYsWZZdddklNTU2mTZuWKVOmZPTo0Tn44IMzc+bMrFmzpvFptQAAAAC0wpw5yfHHJ4VCUiwmixc3vP/FL5Ljjit1dR1aoVgsFktdxLY2b968HHHEEZu1T5kyJVdeeWWS5JJLLsk3vvGNLF++PCNHjsx3vvOdjBkzps1rqaurS1VVVWpra90TDwAAAOhcRoxoCO5eHTcVCsnw4cmiRSUrq5y1NivqEiFeORHiAQAAAJ3V0op9s2r9jpu1V/danZp1j5WgovLX2qyoVctpd9555xQKhVad+LnnnmtdhQAAAAB0GkuXJoM3LM669NpsW8WG9VmyNKmpKUFhnUSrQryZM2du4zIAAAAA6MhWrUrWFTcP8JKG9lWrhHhvRqtCvClTpmzrOgAAAACAFnTbmp2efPLJnH322fnIRz6SlStXJkl+85vf5KGHHmrT4gAAAACArQjx7rzzzhxwwAH5wx/+kDlz5mT16tVJkj/96U+ZPn16mxcIAAAAAF3dFod4Z555Zr7yla/k1ltvTc+ePRvbx48fn9///vdtWhwAAAAAsBUh3uLFi3Psscdu1r7bbrtl1apVbVIUAAAAAB1LdXVSUdH8toqKhu1svVY92OLVdtppp/z973/Pnnvu2aT9gQceyO67795mhQEAAADQcdTUJEuWNDyl9rWqqz2Z9s3a4hDvxBNPzBe+8IVce+21KRQKqa+vzz333JPPfvazmTx58raoEQAAAIAOoKZGWLetbPFy2gsuuCD77bdfBg4cmNWrV2fo0KF517velUMOOSRnn332tqgRAAAAALq0QrFYLG7NjkuXLs2DDz6Y1atX5+1vf3v22Weftq6tU6qrq0tVVVVqa2tTWVlZ6nIAAAAAKKHWZkVbvJx2k5qamgwcODBJUigUtvYwAAAAAMAb2OLltEnywx/+MMOGDUtFRUUqKioybNiw/OAHP2jr2gAAAACAbEWId+655+b000/PxIkTc+211+baa6/NxIkTc8YZZ+Tcc8/dFjV2SgcddFCGDh2aWbNmlboUAAAAAMrcFt8Tb9ddd813vvOdfOQjH2nS/rOf/SynnXZaVjX3HGEauSceAAAAAJu0Niva4pl4L730UkaPHr1Z+6hRo/Lyyy9v6eEAAAAAgDewxSHeySefnEsvvXSz9ssvvzz/8A//0CZFAQAAAACvaNXTaadNm9b434VCIT/4wQ9yyy235B3veEeS5A9/+EOWLl2ayZMnb5sqAQAAAKALa1WI98ADDzR5P2rUqCTJk08+mSSprq5OdXV1HnrooTYuDwAAAABoVYh3xx13bOs6AAAAAIAWbPE98QAAAACA9tWqmXiv9cc//jH/9V//laVLl2bDhg1Nts2ZM6dNCgMAAAAAGmzxTLxrrrkmhxxySB555JFcd911eemll/LQQw/l9ttvT1VV1baoEQAAAAC6tC0O8S644IJ861vfyo033piePXvm29/+dh599NF8+MMfTk1NzbaoEQAAAAC6tC0O8Z588sm8//3vT5L07Nkza9asSaFQyBlnnJHLL7+8zQsEAAAAgK5ui0O8nXfeOS+88EKSZPfdd8+DDz6YJHn++eezdu3atq0OAAAAANjyB1u8613vyq233poDDjggH/rQh3L66afn9ttvz6233pojjzxyW9QIAAAAAF3aFod4l1xySdatW5ck+dKXvpTtttsu9957b44//vicffbZbV4gAAAAAHR1hWKxWCx1EV1JXV1dqqqqUltbm8rKylKXAwAAAEAJtTYratVMvLq6ulafWDAFAAAAAG2rVSHeTjvtlEKh8Lp9isViCoVCNm7c2CaFAQAAAAANWhXi3XHHHdu6DgAAAACgBa0K8caNG7et6wAAAAAAWtCt1AUAAAAAAK9PiAcAAAAAZU6IBwAAAABlrlX3xKPtHXTQQenevXumTp2aqVOnlrocAAAAoJNbujRZtWrz9urqpKam/ethy2xxiDd+/PjMmTMnO+20U5P2urq6TJo0Kbfffntb1dap3X///amsrCx1GQAAAEAXsHRpMnhwsm7d5tsqKpIlSwR55W6Ll9POmzcvGzZs2Kx93bp1+d3vftcmRQEAAADQdlataj7ASxram5uhR3lp9Uy8//7v/27874cffjjLly9vfL9x48bcfPPN2X333du2OgAAAACg9SHeyJEjUygUUigUMn78+M229+7dO9/97nfbtDgAAAAAYAtCvKeeeirFYjF77bVX7rvvvuy6666N23r27Jnddtst3bt33yZFAgAAAEBX1uoQ761vfWuSpL6+fpsVAwAAAABsbosfbJEkV111Vd75zndmwIAB+etf/5ok+da3vpUbbrihTYsDAAAA4M2rrk4qCuub3VZRWJ/q6nYuiC22xSHepZdemmnTpuV973tfnn/++WzcuDFJsvPOO2fmzJltXR8AAAAAb1JNTbLk0tuzIAdmQUY1+brksjtSU1PqCnkjWxziffe73833v//9fOlLX2pyD7zRo0dn8eLFbVocAAAAAG2j5p+PzoG/ODsHjtiYAyseafg655zUfOK9pS6NVmj1PfE2eeqpp/L2t799s/ZevXplzZo1bVIUAAAAANvAccc1vOhwtngm3p577plFixZt1n7zzTdnyJAhbVETAAAAAPAqWzwTb9q0aZk6dWrWrVuXYrGY++67Lz/72c9y4YUX5gc/+MG2qBEAAAAAurQtDvE+/vGPp3fv3jn77LOzdu3anHTSSRkwYEC+/e1v58QTT9wWNQIAAABAl1YoFovFrd157dq1Wb16dXbbbbe2rKlTq6urS1VVVWpra1NZWVnqcgAAAAAoodZmRVt8T7wXX3wxa9euTZJsv/32efHFFzNz5szccsstW18tAAAAANCiLQ7xjjnmmPzkJz9Jkjz//PM5+OCDc9FFF+WYY47JpZde2uYFAgAAAEBXt8Uh3sKFC3PYYYclSX7+85+nX79++etf/5qf/OQn+c53vtPmBQIAAABAV7fFId7atWvTp0+fJMktt9yS4447Lt26dcs73vGO/PWvf23zAgEAAACgq9viEG/vvffO9ddfn2XLluW3v/1t3vOe9yRJVq5c6UENAAAAALANbHGId+655+azn/1sBg0alDFjxmTs2LFJGmblvf3tb2/zAgEAAACgqysUi8Xilu60fPny/P3vf8+IESPSrVtDDnjfffelsrIy++23X5sX2Zm09rHBAAAAAHR+rc2KemzNwfv165d+/fo1aTv44IO35lAAAAAAwBvY4uW0AAAAAED7EuIBAAAAQJkT4gEAAABAmRPilchBBx2UoUOHZtasWaUuBQAAAIAyt1UPtuDNu//++z2dFgAAAIBWMRMPAAAAAMqcEA8AAAAAypwQDwAAAADKnBAPAAAAAMqcEA8AAAAAypwQDwAAAKDU5sxJRoxIevdu+DpnTqkroswI8QAAAABKac6c5Pjjk8WLk3XrGr4ef7wgjyaEeAAAAACldN55SaGQFIsN74vFhvczZpS2LsqKEA8AAACglB577JUAb5NiMVmypDT1UJaEeGy1pUuThd+8PQv3OSELe41t+PrN27N0aakrAwAAgA5k330bZt69WqGQDB5cmnooS4Vi8bVRL9tSXV1dqqqqUltbm8rKylKXs9WWLk0G770x617qvtm2iu02ZskT3VNTU4LCAAAAoKPZdE+8TUtqN32dMyc59thSV8c21tqsqEc71kQnsmpVmg3wkob2VasixAMAAIBWWDr6uKz6xtzk8suTv/41eetbk098ItWjxsef1mwixAMAAAAokaVLG1bNrls3Psn4hsbHk3wuqTin4bZ4JsmQuCceAAAAQMmsWpWsW9f8tnXrGrZDIsQDAAAAgLInxAMAAACAMifEY6tUVycVFc1vq6ho2A4AAABA2/BgC7ZKTU3DzTWbW5tfXe2mmwAAAM1ZutTfUR2Bz4lyJMRjq9XU+OEFAADQWq88hXTzbRUVnkJaLtr7c9q00q2l81npxiZCPAAAAGgHrXkKqRCv9Nr7c7LSjdYS4gEAAACUkJVutIYQDwAAAGi4D9x/3Z5873sNb2pqkn/+51R/eLyACcqAEA8AAAC6uKVLk8F7b8y6l8YnGd/Q+ESSzyUVX9yYJU90b/8gb86c5LzzksceS/bdN5k+PTnuuHYuAspHt1IX0FksW7Yshx9+eIYOHZrhw4fn2muvLXVJAAAA0CqrViXrXure7LZ1L3Vv9n5t29ScOcnxxyeLFzfciG7x4ob3c+a0cyFQPszEayM9evTIzJkzM3LkyCxfvjyjRo3K+973vuywww6lLg0AAIAyUF2dVGy3sdmwrGK7jamubj5E64qWful7WZUDk2KxoaGYJIVUn315arbxbDxPi6VcCfHaSP/+/dO/f/8kSb9+/VJdXZ3nnntOiAcAAECS/3sK6dvel1WPrsr/pVL/p5DqvXdNTc3NpSqtrCxdmgx+9IasS8Vm2yoeWZclS7ftQyA8LZZyVRbLaZ9++un84z/+Y97ylrekd+/eOeCAA/LHP/6xzY5/1113ZeLEiRkwYEAKhUKuv/76ZvvNmjUrgwYNSkVFRcaMGZP77rtvq863YMGCbNy4MQMHDnwTVQMAANDZ1PzlrhyYhTkwD7zqtTA1T91Z6tLKxqpVaTbASxra22Npb01NcuCBm78EeJRSyUO8//3f/8073/nObLfddvnNb36Thx9+OBdddFF23nnnZvvfc889eemllzZrf/jhh7NixYpm91mzZk1GjBiRWbNmtVjH7NmzM23atEyfPj0LFy7MiBEjctRRR2XlypWNfUaOHJlhw4Zt9nrmmWca+zz33HOZPHlyLr/88tZeAgAAALqKffdNCoWmbYVCMnhwaeqhZXPmJCNGJL17N3x1Pz5KrFAsFotv3G3bOfPMM3PPPffkd7/73Rv2ra+vz4EHHph99tkn11xzTbp3b7hfwJIlSzJu3LhMmzYtn//851/3GIVCIdddd10mTZrUpH3MmDE56KCDcskllzSea+DAgTnttNNy5plntmos69evz7vf/e6ceuqpOfnkk5vtU1dXl6qqquy7777p3r17pk6dmqlTp7bq+AAAAHRwmx7YUCg03O9t09c5c5Jjjy1ZWUuXNuSILd0HbsmS9puFtnBhMmpUy9sXLGiYFbdNtfQ5/eIXnpBLm9uUFdXW1qaysrLFfiWfiffLX/4yo0ePzoc+9KHstttuefvb357vf//7zfbt1q1bbrrppjzwwAOZPHly6uvr8+STT2b8+PGZNGnSGwZ4LdmwYUMWLFiQCRMmNDnXhAkTMn/+/FYdo1gs5qMf/WjGjx/fYoD3avfff38efvhhAR4AAEBXctxxDUHQ8OEN6djw4SUP8JJX7gO3YMHmr/YM8MrGeee9EtwlrwR5M2aUti66tJI/2OLPf/5zLr300kybNi1f/OIXc//99+df//Vf07Nnz0yZMmWz/gMGDMjtt9+eww47LCeddFLmz5+fCRMm5NJLL93qGlatWpWNGzemb9++Tdr79u2bRx99tFXHuOeeezJ79uwMHz688Z57V111VQ444ICtrgsAAIBO6LjjynI2V01NFwzrWvLYY68EeJsUiw2JJpRIyUO8+vr6jB49OhdccEGS5O1vf3sefPDBXHbZZc2GeElSU1OTq666KuPGjctee+2VH/7whym89p4C7ezQQw9NfX19SWsAAACAjq66umGSYktLe6ur26GIffdNFi9uGuS5dyElVvLltP3798/QoUObtA0ZMiRLly5tcZ8VK1bkE5/4RCZOnJi1a9fmjDPOeFM1VFdXp3v37ps9GGPFihXp16/fmzo2AAAA0HplsbR3+vRXltAmryytnT69HU4OzSt5iPfOd74zS14zHfWxxx7LW9/61mb7r1q1KkceeWSGDBmSOXPmZO7cuZk9e3Y++9nPbnUNPXv2zKhRozJ37tzGtvr6+sydOzdjx47d6uMCAAAAW66mpuHhFa99tdty3zK9dyFdW8mX055xxhk55JBDcsEFF+TDH/5w7rvvvlx++eW5/PLLN+tbX1+fo48+Om9961sze/bs9OjRI0OHDs2tt96a8ePHZ/fdd292Vt7q1avzxBNPNL5/6qmnsmjRouyyyy6p+b+fANOmTcuUKVMyevToHHzwwZk5c2bWrFmTU045ZdsNHgAAAChPZXrvQrquQrH42js1tr9f/epXOeuss/L4449nzz33zLRp03Lqqac22/fWW2/NYYcdloqKiibtDzzwQHbdddfssccem+0zb968HHHEEZu1T5kyJVdeeWXj+0suuSTf+MY3snz58owcOTLf+c53MmbMmDc3uNdo7WODAQAAAOj8WpsVlUWI15UI8QAAAADYpLVZUcnviQcAAAAAvD4hHgAAAACUOSEeAAAAAJQ5IR4AAAAAlDkhHgAAAB3XnDnJiBFJ794NX+fMKXVFANuEEA8AAICOac6c5Pjjk8WLk3XrGr4ef7wgD+iUhHgAAAB0TOedlxQKSbHY8L5YbHg/Y0Zp6wLYBoR4AAAAdEyPPfZKgLdJsZgsWVKaegC2ISEeAAAAHdO++zbMvHu1QiEZPLg09QBsQ0I8AAAAOqbp019ZQpu8srR2+vTS1gWwDQjxAAAA6JiOOy75xS+S4cOTioqGr3PmJMceW+rKANpcj1IXAAAAAFvtuOMaXgCdnJl4AAAAAFDmhHgAAAAAUOYspwUAAKBDWro0WbVq8/bq6qSmpv3rAdiWhHgAAAB0OEuXJoMHJ+vWbb6toiJZskSQB3QultMCAADQ4axa1XyAlzS0NzdDD6AjE+IBAAAAQJkT4gEAAABAmRPiAQAAAECZE+IBAAAAQJkT4gEAANDhVFc3PIW2ORUVDdsBOpMepS4AAAAAtlRNTbJkSfNPoa2ubtgO0JkI8QAAAOiQamqEdUDXYTktAAAAAJQ5IR4AAAAAlDkhHgAAAACUOSFeiRx00EEZOnRoZs2aVepSAAAAAChzHmxRIvfff38qKytLXQYAAAAAHYCZeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeAAAAABQ5oR4AAAAAFDmhHgAAAAAUOaEeG1k2bJlOfzwwzN06NAMHz481157balLAgAAAKCT6FHqAjqLHj16ZObMmRk5cmSWL1+eUaNG5X3ve1922GGHUpcGAAAAQAdnJl4b6d+/f0aOHJkk6devX6qrq/Pcc8+VtigAAIDXmjMnGTEi6d274eucOaWuCIBWKKsQ76tf/WoKhUI+85nPtOlx77rrrkycODEDBgxIoVDI9ddf32y/WbNmZdCgQamoqMiYMWNy3333bdX5FixYkI0bN2bgwIFvomoAAIA2NmdOcvzxyeLFybp1DV+PP16QB9ABlE2Id//99+d73/tehg8f/rr97rnnnrz00kubtT/88MNZsWJFs/usWbMmI0aMyKxZs1o87uzZszNt2rRMnz49CxcuzIgRI3LUUUdl5cqVjX1GjhyZYcOGbfZ65plnGvs899xzmTx5ci6//PI3GjIAAEC7Wvql72VhDszC4sgszNv/7+uBWXq2v18Ayl2hWCwWS13E6tWrc+CBB+Y//uM/8pWvfCUjR47MzJkzN+tXX1+fAw88MPvss0+uueaadO/ePUmyZMmSjBs3LtOmTcvnP//51z1XoVDIddddl0mTJjVpHzNmTA466KBccskljecaOHBgTjvttJx55pmtGsf69evz7ne/O6eeempOPvnkZvvU1dWlqqoqtbW1qaysbNVxAQAA3qylS5PBb12XdanYbFtF1mXJXytSU1OCwgC6uNZmRWUxE2/q1Kl5//vfnwkTJrxuv27duuWmm27KAw88kMmTJ6e+vj5PPvlkxo8fn0mTJr1hgNeSDRs2ZMGCBU3O361bt0yYMCHz589v1TGKxWI++tGPZvz48S0GeK920EEHZejQoa87OxAAAKCtrFqVZgO8pKF91ap2LgiALVLyp9Nec801WbhwYe6///5W9R8wYEBuv/32HHbYYTnppJMyf/78TJgwIZdeeulW17Bq1aps3Lgxffv2bdLet2/fPProo606xj333JPZs2dn+PDhjffcu+qqq3LAAQc02//+++83Ew8AAACAVilpiLds2bKcfvrpufXWW1NR0fz/I9ScmpqaXHXVVRk3blz22muv/PCHP0yhUNiGlb6xQw89NPX19SWtAQAAAIDOqaTLaRcsWJCVK1fmwAMPTI8ePdKjR4/ceeed+c53vpMePXpk48aNze63YsWKfOITn8jEiROzdu3anHHGGW+qjurq6nTv3n2zB2OsWLEi/fr1e1PHBgAAAIA3q6Qh3pFHHpnFixdn0aJFja/Ro0fnH/7hH7Jo0aLGB1e82qpVq3LkkUdmyJAhmTNnTubOnZvZs2fns5/97FbX0bNnz4waNSpz585tbKuvr8/cuXMzduzYrT4uAAAAALSFki6n7dOnT4YNG9akbYcddshb3vKWzdqThmDt6KOPzlvf+tbMnj07PXr0yNChQ3Prrbdm/Pjx2X333Zudlbd69eo88cQTje+feuqpLFq0KLvssktq/u/xS9OmTcuUKVMyevToHHzwwZk5c2bWrFmTU045pY1HDQAA0P6qq5OKimTdus23VVQ0bAegfJX8wRZbolu3brngggty2GGHpWfPno3tI0aMyG233ZZdd9212f3++Mc/5ogjjmh8P23atCTJlClTcuWVVyZJTjjhhDz77LM599xzs3z58owcOTI333zzZg+7AAAA6IhqapIlS9LsU2irqxu2A1C+CsVisVjqIrqSurq6VFVVpba21tNpAQCgVObMSc47L3nssWTffZPp05Pjjit1VQB0Qa3Nikp6TzwAAIB2N2dOcvzxyeLFDWtLFy9ueD9nTqkrA4AWCfEAAICu5bzzkkIh2bQoqVhseD9jRmnrAoDXIcQDAAC6lsceeyXA26RYbLhhHACUKSEeAADQtey7b8PMu1crFJLBg0tTDwC0ghAPAADoWqZPf2UJbfLK0trp00tbFwC8DiEeAADQtRx3XPKLXyTDhycVFQ1f58xJjj221JUBQIt6lLoAAACAdnfccQ0vAOggzMQDAAAAgDInxAMAAACAMifEAwAAAIAyJ8QDAAAAgDInxAMAAACAMifEAwAAAIAyJ8QDAAAAgDInxAMAAACAMifEAwAAAIAyJ8QDAAAAgDInxAMAAACAMifEAwAAAIAyJ8QDAAAAgDInxAMAAACAMifEAwAAAIAy16PUBQAAm1u6NFm1avP26uqkpqb96wEAAEpLiAcAZWbp0mTw4GTdus23VVQkS5YI8gAAoKuxnBYAysyqVc0HeElDe3Mz9IAuas6cZMSIpHfvhq9z5pS6IgBgGxHiAQBARzRnTnL88cnixQ0J/+LFDe8FeQDQKQnxAACgIzrvvKRQSIrFhvfFYsP7GTNKWxcAsE0I8QAAoCN67LFXArxNisWGG2cCAJ2OEA8AADqiffdtmHn3aoVCw5NxAIBOR4gHAGWmujqp2G5js9sqttuY6up2LggoT9Onv7KENnllae306aWtCwDYJoR4AFBmamqSJU90z4Jv3J4F+5yYBT3HNnz9xu1Z8kT31NSUukKgLBx3XPKLXyTDhycVFQ1f58xJjj221JUBANtAoVh87Y002Jbq6upSVVWV2traVFZWlrocAAA6qKVLk1WrNm+vro6wHwA6kNZmRT3asSYAAKANLF3acOu7des231ZR0fBsC0FeywSgAHREQjwAAOhgVq1qPsBLGtpXrRJGtUQACkBH5Z54AABAl9GaABQAypEQDwAAAADKnBAPAAAAAMqce+IBANCEm/4DAJQfIR4AAI3c9L9jqK5u+Dxa+pyqq9u/JgBg2xLiAQDQyFNPO4aamoZA1YzJLScABaCjEuIBAEAHVFMjrNsaAlAAOiohHgAA0KUIQAHoiDydFgAAAADKnBCvjSxbtiyHH354hg4dmuHDh+faa68tdUkAAAAAdBKW07aRHj16ZObMmRk5cmSWL1+eUaNG5X3ve1922GGHUpcGANBqbvoPAFCehHhtpH///unfv3+SpF+/fqmurs5zzz0nxAMAOpSammTJzN9k1Se/lKSQpNj4tXrmv6em5ujSFggA0EWVfDntpZdemuHDh6eysjKVlZUZO3ZsfvOb37TpOe66665MnDgxAwYMSKFQyPXXX99sv1mzZmXQoEGpqKjImDFjct99923V+RYsWJCNGzdm4MCBb6JqAIDSqPmPM3NgYVEOzMIcmAcavhYWpebSs0pdGgBAl1XyEG+PPfbIV7/61SxYsCB//OMfM378+BxzzDF56KGHmu1/zz335KWXXtqs/eGHH86KFSua3WfNmjUZMWJEZs2a1WIds2fPzrRp0zJ9+vQsXLgwI0aMyFFHHZWVK1c29hk5cmSGDRu22euZZ55p7PPcc89l8uTJufzyy1t7CQAAystjjyXFYtO2YjFZsqQ09QAAkEKx+Nrf0Epvl112yTe+8Y187GMfa9JeX1+fAw88MPvss0+uueaadO/ePUmyZMmSjBs3LtOmTcvnP//51z12oVDIddddl0mTJjVpHzNmTA466KBccskljecaOHBgTjvttJx55pmtqnv9+vV597vfnVNPPTUnn3xys33q6upSVVWVfffdN927d8/UqVMzderUVh0fAKBdjBiRLF7cNMgrFJLhw5NFi0pWFgBAZ7QpK6qtrU1lZWWL/Uo+E+/VNm7cmGuuuSZr1qzJ2LFjN9verVu33HTTTXnggQcyefLk1NfX58knn8z48eMzadKkNwzwWrJhw4YsWLAgEyZMaHKuCRMmZP78+a06RrFYzEc/+tGMHz++xQDv1e6///48/PDDAjwAoPxMn94Q4BUKDe8LhYb306eXti4AgC6sLEK8xYsXZ8cdd0yvXr3yyU9+Mtddd12GDh3abN8BAwbk9ttvz913352TTjop48ePz4QJE3LppZdu9flXrVqVjRs3pm/fvk3a+/btm+XLl7fqGPfcc09mz56d66+/PiNHjszIkSOzePHira4JAKBkjjsu+cUvGmbeVVQ0fJ0z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7DfVlClTisVisThlypTiuHHjNttn5MiRxZ49exb32muv4hVXXLFF5+xsIV6x6A9MAID25o8ktlZnCQpey98kbaecJmqUUy3bUmf7md5Zf85sS63NijzYop3V1dWlqqrqjW9WCAAALejWrVte79f4QqGQ+lffnBteZdOSvU06+u0aOtt4ysH555+f6dOn57zzziv5tSynWraVzvgz3b/LLdParMg98QAAoIPpqveLom1sy/thtbfXBgVJ3B+yDZxzzjmpr68vi++NcqplW+mMP9M708+ZcmImXjszEw8AgLbQXHiRmO1A19HSv4FN/FugI/EzvWtrbVYkxGtnQjwAANqK5Up0ZZ1xCSJdm5/pXZfltAAA0MlZrkRX1hmXINK1+ZnOGzETr52ZiQcAANA2LEEEOgMz8QAAAOjUNs1cejUBHtBZCfEAAADosCxBBLoKy2nbmeW0AAAAAGxiOS0AAAAAdBJCPAAAAAAoc0I8AAAAAChzQjwAAAAAKHNCPAAAAAAoc0I8AAAAAChzQjwAAKBLOv/889OtW7ecf/75pS4FAN5Qj1IXAAAA0N7OP//8nHvuuUnS+PWcc84pZUkA8LrMxAMAALqUVwd4m5x77rlm5AFQ1oR4AABAl9FcgLeJIA+AclYoFovFUhfRldTV1aWqqiq1tbWprKwsdTkAANCldOvWLa/3J1ChUEh9fX07VgRAV9farMhMPAAAoMs477zz3tR2ACiVLh/izZo1K4MGDUpFRUXGjBmT++6773X7z5w5M4MHD07v3r0zcODAnHHGGVm3bl07VQsAALwZ55xzTmbMmNHsthkzZni4BQBlq0uHeLNnz860adMyffr0LFy4MCNGjMhRRx2VlStXNtv/6quvzplnnpnp06fnkUceyQ9/+MPMnj07X/ziF9u5cgAAYGs1F+QJ8AAod106xLv44otz6qmn5pRTTsnQoUNz2WWXZfvtt8+PfvSjZvvfe++9eec735mTTjopgwYNynve85585CMfecPZewAAQHnZFOQVCgUBHgAdQpcN8TZs2JAFCxZkwoQJjW3dunXLhAkTMn/+/Gb3OeSQQ7JgwYLG0O7Pf/5zbrrpprzvfe9r8Tzr169PXV1dkxcAAFB655xzTurr6wV4AHQIPUpdQKmsWrUqGzduTN++fZu09+3bN48++miz+5x00klZtWpVDj300BSLxbz88sv55Cc/+brLaS+88EI3xwUAAADgTemyM/G2xrx583LBBRfkP/7jP7Jw4cLMmTMnv/71r3P++ee3uM9ZZ52V2traxteyZcvasWIAAAAAOoMuOxOvuro63bt3z4oVK5q0r1ixIv369Wt2n3POOScnn3xyPv7xjydJDjjggKxZsyaf+MQn8qUvfSndum2eifbq1Su9evVq+wEAAAAA0GV02Zl4PXv2zKhRozJ37tzGtvr6+sydOzdjx45tdp+1a9duFtR17949SVIsFrddsQAAAAB0aV12Jl6STJs2LVOmTMno0aNz8MEHZ+bMmVmzZk1OOeWUJMnkyZOz++6758ILL0ySTJw4MRdffHHe/va3Z8yYMXniiSdyzjnnZOLEiY1hHgAAAAC0tS4d4p1wwgl59tlnc+6552b58uUZOXJkbr755saHXSxdurTJzLuzzz47hUIhZ599dp5++unsuuuumThxYv793/+9VEMAAAAAoAsoFDvZOtCnn346u+++e6nLaFFdXV2qqqpSW1ubysrKUpcDAAAAQAm1NivqNPfEW758eU477bTss88+pS4FAAAAANpUhwrx/vd//zcf+chHUl1dnQEDBuQ73/lO6uvrc+6552avvfbK/fffnyuuuKLUZQIAAABAm+pQ98Q788wzc++99+ajH/1ofvvb3+aMM87IzTffnG7duuX222/PO97xjlKXCAAAAABtrkPNxPvNb36TK664It/85jdz4403plgsZuTIkfnVr34lwAMAAACg0+pQId4zzzyTIUOGJEkGDRqUioqK/OM//mOJqwIAAACAbatDhXjFYjE9eryyArh79+7p3bt3CSsCAAAAgG2vQ90Tr1gs5sgjj2wM8l588cVMnDgxPXv2bNJv4cKFpSgPAAAAALaJDhXiTZ8+vcn7Y445pkSVAAAAAED7KRSLxWKpi+hK6urqUlVVldra2lRWVpa6HAAAAABKqLVZUYe6J966devyy1/+Mi+88MJm2+rq6vLLX/4y69evL0FlAAAAALDtdKgQ73vf+16+/e1vp0+fPpttq6yszHe+8518//vfL0FlAAAAALDtdKgQ76c//Wk+85nPtLj9M5/5TH7yk5+0X0EAAAAA0A46VIj3+OOPZ8SIES1uHz58eB5//PF2rAgAAAAAtr0OFeK9/PLLefbZZ1vc/uyzz+bll19ux4oAAAAAYNvrUCHe/vvvn9tuu63F7bfcckv233//dqwIAAAAALa9DhXi/dM//VPOP//8/OpXv9ps24033ph///d/zz/90z+VoDIAAAAA2HZ6lLqALfGJT3wid911Vz7wgQ9kv/32y+DBg5Mkjz76aB577LF8+MMfzic+8YkSVwkAAAAAbatDzcRLkv/8z//MNddck3333TePPfZYlixZksGDB+dnP/tZfvazn5W6PAAAAABoc4VisVgsdRFdSV1dXaqqqlJbW5vKyspSlwMAAABACbU2K+pwM/Ha2qxZszJo0KBUVFRkzJgxue+++163//PPP5+pU6emf//+6dWrV/bdd9/cdNNN7VQtAAAAAF1Rh7onXlubPXt2pk2blssuuyxjxozJzJkzc9RRR2XJkiXZbbfdNuu/YcOGvPvd785uu+2Wn//859l9993z17/+NTvttFP7Fw8AAABAl9Gll9OOGTMmBx10UC655JIkSX19fQYOHJjTTjstZ5555mb9L7vssnzjG9/Io48+mu22226rzmk5LQAAAACbWE77BjZs2JAFCxZkwoQJjW3dunXLhAkTMn/+/Gb3+eUvf5mxY8dm6tSp6du3b4YNG5YLLrggGzdubPE869evT11dXZMXAAAAAGyJDhXi1dTU5NOf/nRuueWWvPzyy2/qWKtWrcrGjRvTt2/fJu19+/bN8uXLm93nz3/+c37+859n48aNuemmm3LOOefkoosuyle+8pUWz3PhhRemqqqq8TVw4MA3VTcAAAAAXU+HCvGuuuqq9OrVK1OnTk11dXVOOOGE/PSnP83zzz/fLuevr6/PbrvtlssvvzyjRo3KCSeckC996Uu57LLLWtznrLPOSm1tbeNr2bJl7VIrAAAAAJ1Hhwrxxo0bl4suuiiPP/547rnnnowcOTLf/e53069fv4wfPz4zZ87Mn//851Ydq7q6Ot27d8+KFSuatK9YsSL9+vVrdp/+/ftn3333Tffu3RvbhgwZkuXLl2fDhg3N7tOrV69UVlY2eQEAAADAluhQId6r7b///jnrrLPy+9//Pn/5y1/ykY98JHPnzs2wYcMybNiw/PrXv37d/Xv27JlRo0Zl7ty5jW319fWZO3duxo4d2+w+73znO/PEE0+kvr6+se2xxx5L//7907Nnz7YZGAAAAAC8RocN8V6tX79+OfXUU3PjjTdm1apVOf/889OrV6833G/atGn5/ve/nx//+Md55JFH8qlPfSpr1qzJKaeckiSZPHlyzjrrrMb+n/rUp/Lcc8/l9NNPz2OPPZZf//rXueCCCzJ16tRtNjYAAAAA6FHqAtra9ttvn2OPPbZVfU844YQ8++yzOffcc7N8+fKMHDkyN998c+PDLpYuXZpu3V7JOQcOHJjf/va3OeOMMzJ8+PDsvvvuOf300/OFL3xhm4wFAAAAAJKkUCwWi6Uuoiupq6tLVVVVamtr3R8PAAAAoItrbVbUKZbTAgAAAEBnJsQDAAAAgDLX6UK8n//856UuAQAAAADaVIcL8V5++eU8+OCDeeyxx5q033DDDRkxYkT+4R/+oUSVAQAAAMC20aFCvAcffDB77713RowYkSFDhuS4447LihUrMm7cuPzTP/1Tjj766Dz55JOlLhMAAAAA2lSPUhewJb7whS9k7733ziWXXJKf/exn+dnPfpZHHnkkH/vYx3LzzTend+/epS4RAAAAANpcoVgsFktdRGvttttuueWWWzJy5MjU1tZm5513zo9//OOcfPLJpS6t1Vr72GAAAAAAOr/WZkUdajntqlWrMmDAgCRJVVVVdthhh7zjHe8ocVUAAAAAsG11qOW0hUIhL7zwQioqKlIsFlMoFPLiiy+mrq6uST8z3AAAAADoTDpUiFcsFrPvvvs2ef/2t7+9yftCoZCNGzeWojwAAAAA2CY6VIh3xx13lLoEAAAAAGh3HSrEGzduXKlLAAAAAIB216EebPHMM8/ks5/97Gb3wEuS2trafO5zn8uKFStKUBkAAAAAbDsdKsS7+OKLU1dX1+yDK6qqqvLCCy/k4osvLkFlAAAAALDtdKgQ7+abb87kyZNb3D558uT86le/aseKAAAAAGDb61Ah3lNPPZWampoWt++xxx75y1/+0n4FAQAAAEA76FAhXu/evV83pPvLX/6S3r17t19BAAAAANAOOlSIN2bMmFx11VUtbv/JT36Sgw8+uB0rAgAAAIBtr0epC9gSn/3sZ/Pud787VVVV+dznPpe+ffsmSVasWJGvf/3rufLKK3PLLbeUuEoAAAAAaFuFYrFYLHURW+J73/teTj/99Lz00kuprKxMoVBIbW1ttttuu3zrW9/Kpz71qVKX+Lrq6upSVVWV2traZp+yCwAAAEDX0dqsqEMtp02Sf/7nf86TTz6Zb37zmznppJNy4okn5qKLLsoTTzyx1QHerFmzMmjQoFRUVGTMmDG57777WrXfNddck0KhkEmTJm3VeQEAAACgNTrcTLy2Nnv27EyePDmXXXZZxowZk5kzZ+baa6/NkiVLsttuu7W431/+8pcceuih2WuvvbLLLrvk+uuvb9X5zMQDAAAAYJNOOxOvrV188cU59dRTc8opp2To0KG57LLLsv322+dHP/pRi/ts3Lgx//AP/5Dzzjsve+21VztWCwAAAEBX1KVDvA0bNmTBggWZMGFCY1u3bt0yYcKEzJ8/v8X9ZsyYkd122y0f+9jH3vAc69evT11dXZMXAAAAAGyJLh3irVq1Khs3bmx8yu0mffv2zfLly5vd5+67784Pf/jDfP/732/VOS688MJUVVU1vgYOHPim6wYAAACga+nSId6WeuGFF3LyySfn+9//fqqrq1u1z1lnnZXa2trG17Jly7ZxlQAAAAB0Nj1KXcCbsWDBgjzyyCNJkqFDh+bAAw/cov2rq6vTvXv3rFixokn7ihUr0q9fv836P/nkk/nLX/6SiRMnNrbV19cnSXr06JElS5bkbW97W5N9evXqlV69em1RXQAAAADwah0yxFu5cmVOPPHEzJs3LzvttFOS5Pnnn88RRxyRa665JrvuumurjtOzZ8+MGjUqc+fOzaRJk5I0hHJz587Npz/96c3677ffflm8eHGTtrPPPjsvvPBCvv3tb1sqCwAAAMA20SGX05522ml54YUX8tBDD+W5557Lc889lwcffDB1dXX513/91y061rRp0/L9738/P/7xj/PII4/kU5/6VNasWZNTTjklSTJ58uScddZZSZKKiooMGzasyWunnXZKnz59MmzYsPTs2bPNxwoAAAAAHXIm3s0335zbbrstQ4YMaWwbOnRoZs2alfe85z1bdKwTTjghzz77bM4999wsX748I0eOzM0339z4sIulS5emW7cOmXUCAAAA0EkUisVisdRFbKk+ffrkd7/7XUaOHNmk/YEHHsi4ceNSV1dXmsJaoa6uLlVVVamtrU1lZWWpywEAAACghFqbFXXIKWbjx4/P6aefnmeeeaax7emnn84ZZ5yRI488soSVAQAAAEDb65Ah3iWXXJK6uroMGjQob3vb2/K2t70te+65Z+rq6vLd73631OUBAAAAQJvqkPfEGzhwYBYuXJjbbrst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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_eec_c_l0 = files[\"test\"][\"Nominal/h_eec_c_l0_WW\"]\n", + "h_eec_c_l0_noCR = files[\"test_noCR\"][\"Nominal/h_eec_c_l0_WW\"]\n", + "\n", + "xsection_CR = 16.4385\n", + "xsection_noCR = 10 # Placeholder value\n", + "\n", + "nEvents = 100000\n", + "\n", + "scale_CR = xsection_CR / nEvents\n", + "scale_noCR = xsection_noCR / nEvents\n", + "\n", + "# Convert to numpy arrays\n", + "values1, edges1 = h_eec_c_l0.to_numpy()\n", + "values2, edges2 = h_eec_c_l0_noCR.to_numpy()\n", + "\n", + "values1 = values1 * scale_CR\n", + "values2 = values2 * scale_noCR\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 8), sharex=True, gridspec_kw={'height_ratios': [2.5, 1]})\n", + "plt.subplots_adjust(hspace=0)\n", + "\n", + "# === Pad 1: Angular Distributions ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_ylabel('set label')\n", + "ax1.set_title(r'Energy-Energy Correlator: W1 $\\rightarrow$ $cq_0$')\n", + "ax1.set_xscale('log')\n", + "ax1.set_yscale('log')\n", + "\n", + "# === Pad 2: Ratios ===\n", + "def safe_divide(num, denom):\n", + " with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratio = np.true_divide(num, denom)\n", + " ratio[~np.isfinite(ratio)] = 0 # -inf, inf, NaN -> 0 or np.nan as you prefer\n", + " return ratio\n", + "\n", + "ratio1 = safe_divide(values2, values1)\n", + "\n", + "ax2.plot(bin_centers1, ratio1, marker='D', linestyle='None', color='black', markersize=4)\n", + "ax2.axhline(y=1, color='r', linestyle='--', linewidth = 0.8)\n", + "\n", + "# ax2.legend()\n", + "ax2.set_xlabel(r'z = $\\frac{1}{2}(\\cos(\\phi))$')\n", + "ax2.set_ylabel('no CR / CR')\n", + "ax2.set_xscale('log')\n", + "ax2.set_yscale('linear')\n", + "# ax2.set_ylim(0.85, 1.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "id": "5e343489-8fe4-4e91-bebd-2ce8cb67c46f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.85, 1.1)" + ] + }, + "execution_count": 199, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABNoAAALOCAYAAAB/HH79AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABsjUlEQVR4nO3deZzVdb0/8NdhHVTAZRBEGXFFcYHcCDK3uHLRHy6UudxCTe1a1lXJLEtAoLS8N7WUm9milVlaoraYG0lmkppIueISiqGApM4oCChzfn/MZXScAQfmwJkZns/H4zyO5/Pd3p/vADPz8vP5fgrFYrEYAAAAAKBFOpS7AAAAAABoDwRtAAAAAFACgjYAAAAAKAFBGwAAAACUgKANAAAAAEpA0AYAAAAAJSBoAwAAAIASELQBAAAAQAkI2gAAAACgBARtAAAAAFACgjYAAAAAKAFBGwAA68w111yTQqGQ5557rtylAACsc4I2AGhDVoYWq3r95S9/KXeJ69SG3v+Vnn322fznf/5ntt9++1RUVKRHjx750Ic+lG9/+9t58803y11eydx333254IIL8tprr5W1jhtuuCGFQiE33XRTo22DBg1KoVDI3Xff3WhbVVVVhg0bliR58MEH87nPfS677bZbNt5441RVVeXjH/94nnrqqXVePwCw/nQqdwEAwJqbNGlStttuu0btO+64YxmqWf825P7/7ne/yzHHHJOuXbtmzJgx2X333bN8+fLce++9+eIXv5jHHnssV111VbnLLIn77rsvEydOzEknnZRNN920bHXsv//+SZJ77703Rx99dH17TU1NHn300XTq1Cl//vOfc/DBB9dve+GFF/LCCy/kuOOOS5J885vfzJ///Occc8wx2XPPPTN//vxcccUV2WuvvfKXv/wlu++++/rtFACwTgjaAKANGjlyZPbZZ59yl5HFixdn4403Xu/X3VD7P2fOnBx33HHZdttt84c//CFbbbVV/bYzzjgjzzzzTH73u9+V5Fqr6lu5vualtKZ96Nu3b7bbbrvce++9DdpnzJiRYrGYY445ptG2lZ9XhnRjx47Nddddly5dutTvc+yxx2aPPfbIN77xjVx77bVr2x0AoBUxdRQA2qELLrgghUIhzzzzTP1ooJ49e+bkk0/OkiVLGu0/b968fOpTn0rv3r3TtWvX7LbbbvnRj37U5Dkff/zxnHDCCdlss83qQ4QkmT59evbZZ59UVFRkhx12yPe+9736Y5Lk7rvvXuX0u+uuuy6FQiEzZsxot/0vxT24+OKL88Ybb+SHP/xhg5BtpR133DFnnnlm/eeHH344I0eOTI8ePbLJJpvkIx/5SJPTa1fVt/frc3PuW1Oef/75fPazn82AAQPSrVu3bLHFFjnmmGMaPMftggsuyBe/+MUkyXbbbVc/Pfjd+zSnf+/XhyeffDJz585935r333//PPzwww2m5v75z3/ObrvtlpEjR+Yvf/lLamtrG2wrFAr50Ic+lCQZNmxYg5AtSXbaaafstttueeKJJ973+uvbL37xiwwePDgVFRUZMGBAbr755hx//PHZbbfdynIeAGgrjGgDgDaouro6ixYtatBWKBSyxRZbNGj7+Mc/nu222y4XXXRRZs6cmR/84AfZcsst881vfrN+nwULFuSDH/xgCoVCPve5z6VXr175/e9/n1NOOSU1NTU566yzGpzzmGOOyU477ZQLL7wwxWIxSV3g8e///u/ZaqutMnHixKxYsSKTJk1Kr1696o876KCD0q9fv/zsZz9rMP0uSX72s59lhx12yNChQ9tt/0txD37zm99k++23r3/u1+o89thj+fCHP5wePXrk3HPPTefOnfO9730vBx10UP74xz9myJAhjY55b98WLly4yj6v6X17twcffDD33XdfjjvuuGyzzTZ57rnn8t3vfjcHHXRQHn/88Wy00UYZPXp0nnrqqfz85z/PpZdemsrKyiSpv6dr2r+m+pAku+66aw488MBMnz59tfdz//33z09/+tPcf//9Oeigg5LUhWnDhg3LsGHDUl1dnUcffTR77rln/bZddtml0Z/JdysWi1mwYEHJQ6dx48alqqoqp5122lodf+mll2bs2LEZPXp0zjjjjDzyyCP55Cc/mV69emXfffdd7+cBgDalCAC0GVdffXUxSZOvrl271u83YcKEYpLipz71qQbHH3300cUtttiiQdspp5xS3GqrrYqLFi1q0H7ccccVe/bsWVyyZEmDcx5//PGN6ho1alRxo402Ks6bN6++7emnny526tSp+O4fN84777xi165di6+99lp928KFC4udOnUqTpgwod33vyX3oLq6upikeOSRR65yn3c76qijil26dCk+++yz9W0vvvhisXv37sUDDjigwb6r6tvq+tzc+7byazZnzpz6fVZue7cZM2YUkxR/8pOf1Lf993//d6Nj17R/q+tDsVgsJikeeOCBTW57t8cee6yYpDh58uRisVgsvvXWW8WNN964+OMf/7hYLBaLvXv3Lk6ZMqVYLBaLNTU1xY4dOxZPO+201Z7zpz/9aTFJ8Yc//OH7Xn9NfP7zny8WCoXi1VdfvcbH/v3vfy927ty5OG7cuAbtp59+ejFJcdKkSev1PADQ1pg6CgBt0JQpU3LnnXc2eP3+979vtN/pp5/e4POHP/zh/Otf/0pNTU2SuhE1N954Y0aNGpVisZhFixbVv0aMGJHq6urMnDlztedcsWJF7rrrrhx11FHp27dvffuOO+6YkSNHNth3zJgxWbZsWX71q1/Vt11//fV5++2384lPfKLd978l92Blzd27d1/lPu+u6Y477shRRx2V7bffvr59q622ygknnJB77723/nyr69uq2tfmvr1bt27d6v/7rbfeyr/+9a/suOOO2XTTTVd7XEv6t6q+FYvF9x3NltSNfNtiiy3qn732t7/9LYsXL64fXThs2LD8+c9/TlL37LYVK1Y0mKL6Xk8++WTOOOOMDB06NCeeeOL7Xv/dli5dutrXxRdfnBNPPDGnnHJKrrvuujU690UXXZTNNtssX/nKVxq0r+zLHnvssV7PAwBtjamjANAG7bfffs1aDKCqqqrB58022yxJ8uqrr6ZHjx55+eWX89prr+Wqq65a5UqVK6cPrvTe1T4XLlyYN998s8kVP9/btssuu2TffffNz372s5xyyilJ6qZMfvCDH6zfd/ny5XnllVcaHNerV6907Nix/nNb7X/SvHvQlB49eiRJXn/99VXus9LLL7+cJUuWZMCAAY227brrrqmtrc0LL7zQaMpiUyu5NtW+Nvft3d58881cdNFFufrqqzNv3rwGUzmrq6tXedy7r7+m/VtV35qrUChk2LBhueeee1JbW5s///nP2XLLLeu/ZsOGDcsVV1yRJPWB26qCtvnz5+fwww9Pz54986tf/arBn+3388YbbzQrbF1pzJgxOeSQQ9KnT5/33Xf58uX59a9/nc985jOpqKhodN0k9aujfve73833v//9PPLII/nqV7+aCy64YK3Os2zZsnzmM5/JXXfdlddeey0DBw7MpZde2uxp5ADQ2gjaAKAdW9Uv8CuDjZUPb//EJz6xylE1K585tdK7RyOtjTFjxuTMM8/MP//5zyxbtix/+ctf6gOKJLnvvvty8MEHNzhmzpw56d+//xpfqzX2P3n/e9CUHj16pG/fvnn00UdbfP1VWVXf3tu+Nvft3T7/+c/n6quvzllnnZWhQ4emZ8+eKRQKOe644xosKFBKpfi67b///vnNb36TRx55pP75bCsNGzYsX/ziFzNv3rzce++96du3b4PRditVV1dn5MiRee211/KnP/2pwSjI5qioqMjVV1/9vvvdfvvt+cUvfpHRo0c3elbgqjz77LNZvHhxBg8e3GjbU089lY022qi+T1tttVUuuOCCJkfMrcl53n777fTv3z/33ntvttlmm9xwww0ZNWpUnnvuuWyyySbNqhsAWhNBGwBswHr16pXu3btnxYoVGT58+FqdY8stt0xFRUWeeeaZRtuaajvuuOMyduzY/PznP8+bb76Zzp0759hjj63fPmjQoNx5550NjmnOaJy1UY7+J+9/D1bl//2//5errroqM2bMWO2In169emWjjTbK7NmzG2178skn06FDh/Tr1+99r7e687fkvv3qV7/KiSeemG9961v1bUuXLs1rr73WYL93r9j63uuvy/6tysoRavfee2/+/Oc/N1jwYe+9907Xrl0zffr03H///TnssMMaHb906dKMGjUqTz31VO66664MHDhwjWvo1KlTTjrppNXuc+edd+amm27KUUcdleuuu67ZI+aaWpF3Zfu1116bXXfdNR061D155qijjkqS3HrrrS06z8Ybb5zx48fX77Py78bs2bOz9957N6tuAGhNPKMNADZgHTt2zEc/+tHceOONTY6Uevnll5t1juHDh+fmm2/Oiy++WN/+zDPPNPnctMrKyowcOTLXXnttfvazn+Xf//3f61eUTOqmdw4fPrzB673Tz0qlHP1P3v8erMq5556bjTfeOKeeemoWLFjQaPuzzz6bb3/72+nYsWMOPfTQ3HLLLXnuuefqty9YsCDXXXdd9t9///qpqGujpfetY8eODaaLJsnll1+eFStWNGjbeOONk6RRAFfK/j355JOZO3dus/bdZ599UlFRkZ/97GeZN29egxFtXbt2zV577ZUpU6Zk8eLFjaaNrlixIscee2xmzJiRX/7yl+t0auTXvva1DB8+PNdff306dWr+/1dfOdV65dTXlSZMmJCFCxc2+7lqLTnP008/nVdeeWW106gBoDUzog0A2qDf//73efLJJxu1Dxs2rMnpaqvzjW98I3fffXeGDBmS0047LQMHDswrr7ySmTNn5q677mr0vLSmXHDBBbnjjjvyoQ99KJ/5zGeyYsWKXHHFFdl9990za9asRvuPGTMmH/vYx5IkkydPXqN6k7bf/2Tt7sEOO+yQ6667Lscee2x23XXXjBkzJrvvvnuWL1+e++67L7/85S/rRzt97Wtfy5133pn9998/n/3sZ9OpU6d873vfy7Jly3LxxRc363qr05L79v/+3//LT3/60/Ts2TMDBw7MjBkzctddd2WLLbZosN/KEU1f/epXc9xxx6Vz584ZNWpUNt5445L1b9ddd82BBx7YrAURunTpkn333Td/+tOf0rVr10YjroYNG1Y/Su+9QdsXvvCF/PrXv86oUaPyyiuv5Nprr22wfU0WA3k/t9xyS7p165YuXbqs0XG9evXKoYcemquuuipdu3bNrrvumt/85jd54YUXkrzzXLV1dZ4333wzn/jEJ3LeeeelZ8+ea1Q7ALQaZVrtFABYC1dffXUxySpfV199dbFYLBYnTJhQTFJ8+eWXmzx+zpw5DdoXLFhQPOOMM4r9+vUrdu7cudinT5/iRz7ykeJVV11Vv8+qzrnStGnTih/4wAeKXbp0Ke6www7FH/zgB8UvfOELxYqKikb7Llu2rLjZZpsVe/bsWXzzzTc3uP635B4Ui8XiU089VTzttNOK/fv3L3bp0qXYvXv34oc+9KHi5ZdfXly6dGn9fjNnziyOGDGiuMkmmxQ32mij4sEHH1y87777Gp1vVX17vz435741dc9fffXV4sknn1ysrKwsbrLJJsURI0YUn3zyyeK2225bPPHEExtcY/LkycWtt9662KFDh0bnaU7/3q8PSYoHHnhgk9uact555xWTFIcNG9Zo29SpU4tJit27dy++/fbbDbYdeOCBq/2z21q89NJLxVGjRhW7d+9e3HrrrYtf+tKXir/5zW+KSYq33XZbo/3/8z//szhhwoQWn2f58uXFww8/vHjCCScUa2tr10XXAGC9KBSL7xm3DwBQIkcddVQee+yxPP300w3a33777fTt2zejRo3KD3/4wzJVt+6tqv/JhnMPaPu+853v5Mwzz8y8efMaLd5w+umnp0+fPg1WHV3T89TW1uaEE07I4sWLc9NNN63RdFcAaG08ow0AKIk333yzweenn346t956aw466KBG+9588815+eWXM2bMmPVU3bq3Jv1P2uc9oH16/PHHs/nmmzcIx95+++0sXbo0K1asaPDfa3qeJPnP//zPvPTSS/nlL38pZAOgzTOiDQAoia222ionnXRStt9++zz//PP57ne/m2XLluXhhx/OTjvtlCS5//778/e//z2TJ09OZWVlZs6cWeaqS6c5/U/a9z2gfTrggAOSJPfcc0992wUXXJCJEyc22O/qq69e7YqoTZ3n+eefT//+/VNRUdFgddTf//73+fCHP1yK8gFgvRK0AQAlcfLJJ+fuu+/O/Pnz07Vr1wwdOjQXXnhh9tprr/p9TjrppFx77bUZPHhwrrnmmmY/XL0taE7/k/Z9D2ifevXqlWOOOSb/+7//2yrOAwCtmaANAAAAAErAM9oAAAAAoAQEbQAAAABQApb1aUJtbW1efPHFdO/ePYVCodzlAAAAAFBGxWIxr7/+evr27ZsOHVY9bk3Q1oQXX3wx/fr1K3cZAAAAALQiL7zwQrbZZptVbhe0NaF79+5J6m5ejx49ylwNAAAAAOVUU1OTfv361WdGqyJoa8LK6aI9evQQtAEAAACQJO/7iDGLIQAAAABACQjaAAAAAKAEBG0AAAAAUAKe0dYCK1asyFtvvVXuMtqlzp07p2PHjuUuAwAAAKDZBG1roVgsZv78+XnttdfKXUq7tummm6ZPnz7v+6BBAAAAgNZA0LYWVoZsW265ZTbaaCNBUIkVi8UsWbIkCxcuTJJstdVWZa4IAAAA4P0J2tbQihUr6kO2LbbYotzltFvdunVLkixcuDBbbrmlaaQAAABAq2cxhDW08plsG220UZkraf9W3mPPwQMAAADaAkHbWjJddN1zjwEAAIC2RNAGAAAAACUgaAMAAACAEhC0sVp//OMf069fv1VuLxaLueqqqzJkyJBssskm2XTTTbPPPvvksssuy5IlS5IkF1xwQQqFQgqFQjp27Jh+/frl05/+dF555ZX11Q0AAACAdU7QVk5TpyaDBiXdutW9T51a7ooaueWWWzJq1KhVbv/kJz+Zs846K0ceeWTuvvvuzJo1K+PGjcstt9ySO+64o36/3XbbLS+99FLmzp2bq6++Orfddls+85nPrI8uAAAAAKwXncpdwAZr6tTkox9NCoWkWEweeaTu8403JqNHl/xyv/3tb/OJT3wi//rXv9KxY8fMmjUrH/jAB/KlL30p3/jGN5Ikp556apYuXZprr722/rhf//rXueKKK5o85w033JCf/exnufnmm3PkkUfWt/fv3z9HHHFEampq6ts6deqUPn36JEm23nrrHHPMMbn66qtL3k8AAACgPObOTRYtatxeWZlUVa3/esrBiLZymTjxnZAtqXsvFJJJk9bJ5T784Q/n9ddfz8MPP5ykbkpoZWVlpk+fXr/PH//4xxx00EH1nx977LEsXLgwhxxySJPn/NnPfpYBAwY0CNlWKhQK6dmzZ5PHPffcc7n99tvTpUuXte8QAAAA0GrMnZsMGJDsvXfj14ABdds3BIK2cnnqqXdCtpWKxWT27HVyuZ49e2bw4MH1wdr06dNz9tln5+GHH84bb7yRefPm5ZlnnsmBBx5Yf8wtt9ySESNGrDIQe/rppzNgwIBmXf+RRx7JJptskm7dumW77bbLY489li996Ust7hcAAABQfosWJUuXNr1t6dKmR7q1R4K2ctl557oRbO9WKNTFvOvIgQcemOnTp6dYLOZPf/pTRo8enV133TX33ntv/vjHP6Zv377Zaaed6ve/5ZZbcsQRR6zyfMX3BoWrMWDAgMyaNSsPPvhgvvSlL2XEiBH5/Oc/36L+AAAAALQmgrZymTDhnemiyTvTSCdMWGeXPOigg3Lvvffmb3/7Wzp37pxddtklBx10UKZPn54//vGPDUazvfTSS3n44Ydz+OGHr/J8O++8c5588slmXbtLly7Zcccds/vuu+cb3/hGOnbsmIkTJ7a4TwAAAACthaCtXEaPrlv4YM89k4qKuvepU5Ojj15nl1z5nLZLL720PlRbGbRNnz69wfPZfvOb32TYsGHZfPPNV3m+E044IU899VRuueWWRtuKxWKqq6tXeez555+f//mf/8mLL7649h0CAAAAaEUEbeU0enQya1by5pt17+swZEuSzTbbLHvuuWd+9rOf1YdqBxxwQGbOnJmnnnqqwYi2X//616udNpokH//4x3Psscfm+OOPz4UXXpi//vWvef755/Pb3/42w4cPz913373KY4cOHZo999wzF154YUn6BgAAAFBugrYNzIEHHpgVK1bUB22bb755Bg4cmD59+tQvbLB48eJMmzbtfYO2QqGQ6667LpdcckluvvnmHHjggdlzzz1zwQUX5Mgjj8yIESNWe/zZZ5+dH/zgB3nhhRdK0jcAAACgPCork4rOK5rcVtF5RSor13NBZVIorskT7TcQNTU16dmzZ6qrq9OjR48G25YuXZo5c+Zku+22S0VFRZkqXLemTp2a888/P48//nhZ69gQ7jUAAAC0F3PnJotu+ENy1VXJ888n226bfPrTqfz4IamqKnd1LbO6rOjdOq3HmmgjNtlkk3zzm98sdxkAAABAG1JVlVSdc0hyziHlLqVsBG00cuihh5a7BAAAAIA2xzPaAAAAAKAEBG0AAAAAUAKCNgAAAAAoAUEbAAAAAJSAoA0AAAAASkDQBgAAAAAlIGgDAAAAgBIQtAEAAABACQjaymTu3GTmzMavuXPLXdnaufvuu3PYYYdliy22yEYbbZSBAwfmC1/4QubNm5ckmT59egqFQv2rV69eOeyww/LII4+UuXIAAACA0hC0lcHcucmAAcneezd+DRjQ9sK2733vexk+fHj69OmTG2+8MY8//niuvPLKVFdX51vf+laDfWfPnp2XXnopt99+e5YtW5bDDz88y5cvL1PlAAAAAKXTqdwFbIgWLUqWLm1629Klddurqkp/3YMOOih77rlnKioq8oMf/CBdunTJ6aefngsuuKB+n7lz5+bzn/98pk2blg4dOuTf//3fc/nll6d3795NnvOf//xn/uu//iv/9V//lUsvvbS+vX///jnggAPy2muvNdh/yy23zKabbpo+ffrkrLPOyhFHHJEnn3wye+65Z+k7DAAAALAeGdG2gfnxj3+cjTfeOPfff38uvvjiTJo0KXfeeWeSpLa2NkceeWReeeWV/PGPf8ydd96Zf/zjHzn22GNXeb5f/vKXWb58ec4999wmt2+66aZNtldXV+cXv/hFkqRLly4t6xQAAABAK2BE2wZmzz33zIQJE5IkO+20U6644opMmzYt//Zv/5Zp06blkUceyZw5c9KvX78kyU9+8pPstttuefDBB7Pvvvs2Ot/TTz+dHj16ZKuttmrW9bfZZpskyeLFi5MkRxxxRHbZZZdSdA0AAACgrIxo28C8d4rmVlttlYULFyZJnnjiifTr168+ZEuSgQMHZtNNN80TTzzR5PmKxWIKhUKzr/+nP/0pDz30UK655prsvPPOufLKK9eiFwAAAACtjxFtG5jOnTs3+FwoFFJbW7vW59t5551TXV2dl156qVmj2rbbbrtsuummGTBgQBYuXJhjjz0299xzz1pfHwAAAKC1MKKtDCork4qKprdVVNRtL4ddd901L7zwQl544YX6tscffzyvvfZaBg4c2OQxH/vYx9KlS5dcfPHFTW5/72II73bGGWfk0UcfzU033dSiugEAAABaAyPayqCqKpk9u2510feqrFw3K442x/Dhw7PHHnvkP/7jP3LZZZfl7bffzmc/+9kceOCB2WeffZo8pl+/frn00kvzuc99LjU1NRkzZkz69++ff/7zn/nJT36STTbZJN/61reaPHajjTbKaaedlgkTJuSoo45aoymoAAAAAK2NEW1lUlWV7LVX41e5QrakbhrpLbfcks022ywHHHBAhg8fnu233z7XX3/9ao/77Gc/mzvuuCPz5s3L0UcfnV122SWnnnpqevTokXPOOWe1x37uc5/LE088kV/+8pel7AoAAADAelcoFovFchfR2tTU1KRnz56prq5Ojx49GmxbunRp5syZk+222y4Vq5r/SUm41wAAAEBrsLqs6N2MaFuNfffdNwMHDsyUKVPKXQoAAAAArZxntK3Ggw8+uNqUEgAAAABWMqINAAAAAEpA0AYAAAAAJSBoW0vWkFj33GMAAACgLRG0raHOnTsnSZYsWVLmStq/lfd45T0HAAAAaM0shrCGOnbsmE033TQLFy5Mkmy00UYpFAplrqp9KRaLWbJkSRYuXJhNN900HTt2LHdJAAAAAO9L0LYW+vTpkyT1YRvrxqabblp/rwEAAABaO0HbWigUCtlqq62y5ZZb5q233ip3Oe1S586djWQDAAAA2hRBWwt07NhRGAQAAABAEoshAAAAAEBJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAhtU0Hb00Udns802y8c+9rFylwIAAABQHlOnJoMGJd261b1PnVruitqNDSpoO/PMM/OTn/yk3GUAAAAAlMfUqclHP5o88kiydGnd+0c/KmwrkQ0qaDvooIPSvXv3cpcBAAAAUB4TJyaFQlIs1n0uFus+T5pU3rraiVYTtN1zzz0ZNWpU+vbtm0KhkJtvvrnRPlOmTEn//v1TUVGRIUOG5IEHHlj/hQIAAAC0VU899U7ItlKxmMyeXZ562plWE7QtXrw4gwYNypQpU5rcfv3112fs2LGZMGFCZs6cmUGDBmXEiBFZuHBh/T6DBw/O7rvv3uj14osvrq9uAAAAALReO+9cN4Lt3QqFZMCA8tTTznQqdwErjRw5MiNHjlzl9ksuuSSnnXZaTj755CTJlVdemd/97nf50Y9+lC9/+ctJklmzZpW0ppqamgafu3btmq5du5b0GgAAAADrzYQJdc9kWzl9dOX7hAnlrqxdaDUj2lZn+fLleeihhzJ8+PD6tg4dOmT48OGZMWPGOrtuv3790rNnz/rXRRddtM6uBQAAALDOjR6d3HhjsueeSUVF3fvUqcnRR5e7snah1YxoW51FixZlxYoV6d27d4P23r1758knn2z2eYYPH56//e1vWbx4cbbZZpv88pe/zNChQ1e5/wsvvJAePXrUfzaaDQAAAGjL5s5NFvUfnfxodIP2yrlJVVWZimpH2kTQVip33XXXGu3fo0ePBkEbAAAAQFs1d27do9iWLm28raKibj0EYVvLtImpo5WVlenYsWMWLFjQoH3BggXp06dPmaoCAAAAaDsWLWo6ZEvq2hctWr/1tEdtImjr0qVL9t5770ybNq2+rba2NtOmTVvt1E8AAAAAWF9azdTRN954I88880z95zlz5mTWrFnZfPPNU1VVlbFjx+bEE0/MPvvsk/322y+XXXZZFi9eXL8KKQAAAACUU6sJ2v7617/m4IMPrv88duzYJMmJJ56Ya665Jscee2xefvnljB8/PvPnz8/gwYNz2223NVogAQAAAADKoVAsFovlLqK1qampSc+ePVNdXW0xBAAAAKBdmDkz2XvvVW9/6KFkr73WXz1tSXOzojbxjDYAAAAAWqaysm510aZUVNRtp2VazdRRAAAAANadqqpk9uymVxetrKzbTssI2gAAAAA2EFVVArV1ydRRAAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEljjVUc322yzFAqFZu37yiuvrHFBAAAAANAWrXHQdtlll62DMgAAAACgbVvjoO3EE09cF3UAAAAAQJvW4me0Pfvsszn//PNz/PHHZ+HChUmS3//+93nsscdaXBwAAAAAtBUtCtr++Mc/Zo899sj999+fqVOn5o033kiS/O1vf8uECRNKUmA57bvvvhk4cGCmTJlS7lIAAAAAaOXWeOrou335y1/O1772tYwdOzbdu3evbz/kkENyxRVXtLi4cnvwwQfTo0ePcpcBAAAAQBvQohFtjzzySI4++uhG7VtuuWUWLVrUklMDAAAAQJvSoqBt0003zUsvvdSo/eGHH87WW2/dklMDAAAAQJvSoqDtuOOOy5e+9KXMnz8/hUIhtbW1+fOf/5xzzjknY8aMKVWNAAAAANDqtShou/DCC7PLLrukX79+eeONNzJw4MAccMABGTZsWM4///xS1QgAAAAArV6hWCwWW3qSuXPn5tFHH80bb7yRD3zgA9lpp51KUVvZ1NTUpGfPnqmurrYYAgAAAMAGrrlZUYtWHV2pqqoq/fr1S5IUCoVSnBIAAAAA2pQWTR1Nkh/+8IfZfffdU1FRkYqKiuy+++75wQ9+UIraAAAAAKDNaNGItvHjx+eSSy7J5z//+QwdOjRJMmPGjJx99tmZO3duJk2aVJIiAQAAAKC1a9Ez2nr16pXvfOc7Of744xu0//znP8/nP//5LFq0qMUFloNntAEAAACwUnOzohZNHX3rrbeyzz77NGrfe++98/bbb7fk1AAAAADQprQoaPvkJz+Z7373u43ar7rqqvzHf/xHS04NAAAAAG3KGj+jbezYsfX/XSgU8oMf/CB33HFHPvjBDyZJ7r///sydOzdjxowpXZUAAAAA0MqtcdD28MMPN/i89957J0meffbZJEllZWUqKyvz2GOPlaA8AAAAAGgb1jhou/vuu9dFHQAAAADQprXoGW0AAAAAQJ01HtH2Xn/9619zww03ZO7cuVm+fHmDbVOnTm3p6QEAAACgTWjRiLZf/OIXGTZsWJ544oncdNNNeeutt/LYY4/lD3/4Q3r27FmqGgEAAACg1WtR0HbhhRfm0ksvzW9+85t06dIl3/72t/Pkk0/m4x//eKqqqkpVIwAAAAC0ei0K2p599tkcfvjhSZIuXbpk8eLFKRQKOfvss3PVVVeVpEAAAAAAaAtaFLRtttlmef3115MkW2+9dR599NEkyWuvvZYlS5a0vDoAAAAAaCNaFLQdcMABufPOO5MkxxxzTM4888ycdtppOf744/ORj3ykJAWW07777puBAwdmypQp5S4FAAAAgFauUCwWi2t78CuvvJKlS5emb9++qa2tzcUXX5z77rsvO+20U84///xsttlmpax1vampqUnPnj1TXV2dHj16lLscAAAAAMqouVlRi4K29krQBgAAAMBKzc2KOq3NiZtLSAUAAADAhmKNg7ZNN900hUJhtfsUi8UUCoWsWLFirQsDAAAAgLZkjYO2u+++e13UAQAAAABt2hoHbQceeOC6qAMAAAAA2rQO5S4AAAAAANoDQRsAAAAAlMAaTx0FAAAAYN2YOzdZtKhxe2VlUlW1/uthzQjaAAAAAFqBuXOTAQOSpUsbb6uoSGbPFra1di2aOnrIIYfktddea9ReU1OTQw45pCWnBgAAANigLFrUdMiW1LU3NdKN1qVFQdv06dOzfPnyRu1Lly7Nn/70p5acGgAAAADalLWaOvr3v/+9/r8ff/zxzJ8/v/7zihUrctttt2XrrbdueXUAAAAA0EasVdA2ePDgFAqFFAqFJqeIduvWLZdffnmLiwMAAACAtmKtgrY5c+akWCxm++23zwMPPJBevXrVb+vSpUu23HLLdOzYsWRFAgAAAEBrt1ZB27bbbpskqa2tLWkxlJ5lgQEAAKBtqKysW110VauOVlau/5pYM2sVtL3bT3/601x55ZWZM2dOZsyYkW233TaXXnpptt9++xx55JGlqJG1ZFlgAAAAaDuqqup+Vzdgpu1q0aqj3/3udzN27Ngcdthhee2117JixYokyWabbZbLLrusFPXRApYFBgAAgLalqirZa6/GLyFb29CioO3yyy/P97///Xz1q19t8Ey2ffbZJ4888kiLiwMAAACAtqJFQducOXPygQ98oFF7165ds3jx4pacGgAAAGDDNHVqMmhQ0q1b3fvUqeWuiGZqUdC23XbbZdasWY3ab7vttuy6664tOTUAAADAhmfq1OSjH00eeaTuuU+PPFL3WdjWJrRoMYSxY8fmjDPOyNKlS1MsFvPAAw/k5z//eS666KL84Ac/KFWNAAAAABuGiROTQiEpFus+F4t1nydNSkaPLm9tvK8WBW2nnnpqunXrlvPPPz9LlizJCSeckL59++bb3/52jjvuuFLVyFqqrEwqOq/I0rc6NtpW0XlFKisbtwMAAABl9NRT74RsKxWLdcuR0uoVisX3fvXWzpIlS/LGG29kyy23LMXpyqqmpiY9e/ZMdXV1evToUe5yWmTu3GTRDX9Irroqef75ZNttk09/OpUfP8SKJQAAANDaDBpUN1303XFNoZDsuWfSxOO7WD+amxW1KGh78803UywWs9FGGyVJnn/++dx0000ZOHBgDj300LU9bdmtvHk777xzOnbsmDPOOCNnnHFGucsCAAAA2ruVz2hbOX105fvUqcnRR5e7ug3WegnaDj300IwePTqn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sFJzs6J294w2AAAAACgHQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAKxzkydPTocOHTJ58uRylwKwznQqdwEAAAC0b5MnT8748eOTpP593Lhx5SwJYJ0wog0AAIB15t0h20rjx483sg1olwRtAAAArBNNhWwrCduA9qhQLBaL5S6itampqUnPnj1TXV2dHj16lLscAACANqlDhw5Z3a+chUIhtbW167EigLXT3KzIiDYAAADWiYkTJ7ZoO0BbI2gDAABgnRg3blwmTZrU5LZJkyZZEAFodwRtAAAArDNNhW1CNqC9ErQBAACwTq0M2wqFgpANaNcshtAEiyEAAAAAsJLFEAAAAABgPRK0AQAAAEAJCNoAAAAAoAQEbQAAAK3Q5MmT06FDh0yePLncpQDQTJ3KXQAAAAANTZ48OePHj0+S+ncrdQK0fka0AQAAtCLvDtlWGj9+vJFtAG2AoA0AAKCVaCpkW0nYBtD6lTVou+eeezJq1Kj07ds3hUIhN9988/seM3369Oy1117p2rVrdtxxx1xzzTUNtl9wwQUpFAoNXrvsssu66QAAAEAJTZgwoUXbgfbDcxrbprIGbYsXL86gQYMyZcqUZu0/Z86cHH744Tn44IMza9asnHXWWTn11FNz++23N9hvt912y0svvVT/uvfee9dF+QAAACU1ceLEFm2ntAQdlMvK0a3FYtFo1jamrIshjBw5MiNHjmz2/ldeeWW22267fOtb30qS7Lrrrrn33ntz6aWXZsSIEfX7derUKX369Cl5vQAAAOvSygUPmpo+OmnSJAsirEcWpKBcVvWcxsSfwbagTT2jbcaMGRk+fHiDthEjRmTGjBkN2p5++un07ds322+/ff7jP/4jc+fOXe15ly1blpqamgYvAACAchg3blwmTZrUoE3Itn5ZkIJy8ZzGtq9NBW3z589P7969G7T17t07NTU1efPNN5MkQ4YMyTXXXJPbbrst3/3udzNnzpx8+MMfzuuvv77K81500UXp2bNn/atfv37rtB8AAACrszJsKxQKQrb1TNBBOXlOY9vXpoK25hg5cmSOOeaY7LnnnhkxYkRuvfXWvPbaa7nhhhtWecx5552X6urq+tcLL7ywHisGAABobNy4camtrRWyrWeCDsrJcxrbvjYVtPXp0ycLFixo0LZgwYL06NEj3bp1a/KYTTfdNDvvvHOeeeaZVZ63a9eu6dGjR4MXAAAAGx5BB+XU1NTxlYxubRvaVNA2dOjQTJs2rUHbnXfemaFDh67ymDfeeCPPPvtsttpqq3VdHgAAAG2coINy85zGtq2sQdsbb7yRWbNmZdasWUmSOXPmZNasWfWLF5x33nkZM2ZM/f6nn356/vGPf+Tcc8/Nk08+mf/93//NDTfckLPPPrt+n3POOSd//OMf89xzz+W+++7L0UcfnY4dO+b4449fr30DAACgbRJ0UG6e09h2FYrFYrFcF58+fXoOPvjgRu0nnnhirrnmmpx00kl57rnnMn369AbHnH322Xn88cezzTbbZNy4cTnppJPqtx933HG555578q9//Su9evXK/vvvn69//evZYYcdml1XTU1NevbsmerqatNIAQAANlCTJ0/OhAkTMnHiREEHbOCamxWVNWhrrQRtAAAAAKzU3KyoTT2jDQAAAABaK0EbAAAAAJSAoA0AAAAASkDQBgAAAAAlIGgDAAAAgBIQtAEAAABACQjaAAAAAKAEBG0AAAAAUAKCNgAAAAAoAUEbAAAAAJRASYO2efPmlfJ0AAAAANBmlCRomz9/fj7/+c9np512KsXpAAAAAKDNaXbQ9uqrr+b4449PZWVl+vbtm+985zupra3N+PHjs/322+fBBx/M1VdfvS5rBQAAAIBWq1Nzd/zyl7+c++67LyeddFJuv/32nH322bntttvSoUOH/OEPf8gHP/jBdVknAAAAALRqzR7R9vvf/z5XX311/ud//ie/+c1vUiwWM3jw4Pz2t78VsgEAAACwwWt20Pbiiy9m1113TZL0798/FRUV+cQnPrHOCgMAAACAtqTZQVuxWEynTu/MNO3YsWO6deu2TooCAAAAaI0mT56cDh06ZPLkyeUuhVao2c9oKxaL+chHPlIftr355psZNWpUunTp0mC/mTNnlrZCAAAAgFZg8uTJGT9+fJLUv48bN66cJdHKNDtomzBhQoPPRx55ZMmLYd2ZPHlyJkyYkIkTJ/pHAAAAANbQu0O2lYRtvFehWCwWy11Ea1NTU5OePXumuro6PXr0KHc5LfbefwwmTZrkHwEAAABopqZCtnfze3b719ysqNlB29KlS3PHHXfk4IMPTvfu3RtdbPr06RkxYkS6du3asspbgfYUtK3qHwP/CAAAAEDzdOjQIauLTwqFQmpra9djRaxvzc2Kmr0Ywve+9718+9vfbhSyJUmPHj3yne98J9///vfXrlrWidUl7uPHj/fgRgAAAGiGiRMntmj7hmZDXjCi2SPa9ttvv4wbNy6jRo1qcvtvf/vbTJo0KQ888EBJCyyH9jKiTeIOAAAApWHGWPO018dXlXxE29NPP51Bgwatcvuee+6Zp59+es2qZJ2SuAMAAEBpjBs3LpMmTWrQ1l5CpFJZ1YIRG9LItmYHbW+//XZefvnlVW5/+eWX8/bbb6/Rxe+5556MGjUqffv2TaFQyM033/y+x0yfPj177bVXunbtmh133DHXXHNNo32mTJmS/v37p6KiIkOGDGkXo+zWRlP/CKzkHwMAaB825KkZALQOG9L3opW/ZxcKBb9Xv4fHV9VpdtC222675a677lrl9jvuuCO77bbbGl188eLFGTRoUKZMmdKs/efMmZPDDz88Bx98cGbNmpWzzjorp556am6//fb6fa6//vqMHTs2EyZMyMyZMzNo0KCMGDEiCxcuXKPa2guJOwC0Xyt/oC0WixvUD7AAtB4b4veicePGpba21u/V7zFhwoQWbW83is30ve99r7jxxhsXf/Ob3zTa9utf/7q48cYbF7/3ve8193SNJCnedNNNq93n3HPPLe62224N2o499tjiiBEj6j/vt99+xTPOOKP+84oVK4p9+/YtXnTRRc2upbq6upikWF1d3exjWrtJkyYVC4VCcdKkSeUuBQAogUmTJhWTNHr5Xg/A+uJ7Ee+2qj8P7eXPRXOzok7NDeQ+/elP55577skRRxyRXXbZJQMGDEiSPPnkk3nqqafy8Y9/PJ/+9KdLEv6tyowZMzJ8+PAGbSNGjMhZZ52VJFm+fHkeeuihnHfeefXbO3TokOHDh2fGjBmrPO+yZcuybNmy+s81NTUr/+OdnTp3Trp1S958M3nrrXfau3atey1enKxY8U57RUXSpUvyxhvJuxcc2GijpFOnhudOko03Tjp0SF5/vWF79+51xy9e3LC9R4/k7beTJUveaevQIdlkk2T58mTp0nfaO3bMuHHjMu7cc5Nly965dhvvUzbeuK4/7/ra6ZM+6ZM+6ZM+bQh9+uZXv5r/vvDCrFwLfnGS2iTdk/z3+PHpsnRpvvSlL7WpPrXHr5M+6ZM+6VN77tM3L7qo/nvRkiQrkvrvS/XfiyZNalN9ao9fp/XZp3HjxqXD22/nm++aVbcidX8+vj5+fL5y5pltO4947zVWZU0TvOuvv7545JFHFgcOHFjcddddi0ceeWTx+uuvX+tEcKU0Y0TbTjvtVLzwwgsbtP3ud78rJikuWbKkOG/evGKS4n333ddgny9+8YvF/fbbb5XnnTBhQpNpa3VSLK58nXJK3c6nnPJOW1IsTphQ137ooQ3bv//9uvaBAxu233ZbXXv37g3bH320WKyubtiW1LU9+mjDtu7d685x220N2wcOrGv//vcbth966MqONmzXJ33SJ33SJ33SpzbZp+r31D4wKXZ/b3/aWJ/a49dJn0rTp+kHHdTu+tQev076tGH36dA08Tt0G+9Te/w6laNPt+X/RrK1gz5Vr/xz/j4j2grFYrHYvEhu3SoUCrnpppty1FFHrXKfnXfeOSeffHKDEWu33nprDj/88CxZsiSvvvpqtt5669x3330ZOnRo/T7nnntu/vjHP+b+++9v8rxNjWjr169fql944Z0lW9ti2rpSG0/F9Umf9Emf9Emf9Klhn7751a/m6xdeWN/87hFtSfLVr3zFiDZ9ahd9mnzJJfna+PHp+n9NX/3KV/Kl889v031qj18nfdow+/TNiy6q/1703hFtyf/9fTWibYPt0ze/+c1ceOGFOe/88/PlyZPbRZ9qamrSs1+/VFdXv5MVNaFNBW0HHHBA9tprr1x22WX1bVdffXXOOuusVFdXZ/ny5dloo43yq1/9qsF5TjzxxLz22mu55ZZbmlVLTU1Nevbs+b43DwCgXFa1spdFj2gv/BmH1s/fUzYkzc2KOqzHmlps6NChmTZtWoO2O++8s370WpcuXbL33ns32Ke2tjbTpk1rMMINAKCts7I47dmqfnlPssGsaghtge9F0FhZg7Y33ngjs2bNyqxZs5Ikc+bMyaxZszJ37twkyXnnnZcxY8bU73/66afnH//4R84999w8+eST+d///d/ccMMNOfvss+v3GTt2bL7//e/nxz/+cZ544ol85jOfyeLFi3PyySev174BAKxrK3/BKRQKfrGhXZkwYUKLtgPrj+9F0FBZp45Onz49Bx98cKP2E088Mddcc01OOumkPPfcc5k+fXqDY84+++w8/vjj2WabbTJu3LicdNJJDY6/4oor8t///d+ZP39+Bg8enO985zsZMmRIs+sydRQAAMpndSPaEiNmAFj/mpsVNTtoq6qqyhFHHJEjjjgihxxySDp16lSyYlsbQRsAAJSXZz8B0JqU/BltP/3pT9O1a9ecccYZqayszLHHHpuf/exnee2110pRLwAAQD3PfgKgLVqrqaOPPfZYfv3rX+eWW27JrFmzMmzYsPrRbttvv/26qHO9MqINAABah8mTJ2fChAmZOHGikA2Aslmnq47utttuOe+88/KXv/wlzz33XI4//vhMmzYtu+++e3bffff87ne/W+vCAQCgvZk8eXI6dOhgtcy1MG7cuNTW1grZAGgTSroYwpIlS3L77bene/fuGT58eKlOu94Z0QYAQKm891ljpj8CQNvT3KyopCsabLTRRjn66KNLeUoAAGizmnqg/8rPwjYAaH/WauooAACweqtaNTOpC9tMIwWA9qekU0fbC1NHAQBoqQ4dOmR1P2oXCoXU1taux4oAgLW1ThdDAAAAVm/ixIkt2g4AtD0lDdp+9atflfJ0AADQZo0bNy6TJk1qcpsFEQCgfVqjoO3tt9/Oo48+mqeeeqpB+y233JJBgwblP/7jP0paHAAAtGVNhW1CNgBov5odtD366KPZcccdM2jQoOy6664ZPXp0FixYkAMPPDCf+tSnMnLkyDz77LPrslYAAGhzVoZthUJByAYA7VyzF0M4/PDDs2zZspx11ln5+c9/np///OcZMGBATjnllJxxxhnp1q3buq51vbEYAgAAAAArNTcranbQtuWWW+aOO+7I4MGDU11dnc022yw//vGP88lPfrJkRbcWgjYAAAAAVir5qqOLFi1K3759kyQ9e/bMxhtvnA9+8IMtrxQAAAAA2oFmB22FQiGvv/56ampqUl1dnUKhkDfffDM1NTUNXgAAAADry+TJk9OhQ4dMnjy53KVAOjV3x2KxmJ133rnB5w984AMNPhcKhaxYsaK0FQIAAAA0YfLkyRk/fnyS1L9bdIZyanbQdvfdd6/LOgAAAACa7d0h20rCNsqt2UHbgQceuC7rAAAAAGiWpkK2lYRtlFOzn9H24osv5pxzzmnyOWzV1dX54he/mAULFpS0OAAAAID3mjBhQou2w7rS7KDtkksuSU1NTZNLmPbs2TOvv/56LrnkkpIWBwAAAPBeEydObNF2LCKxrjQ7aLvtttsyZsyYVW4fM2ZMfvvb35akKAAAAIBVGTduXCZNmtTktkmTJpk2+j5WTr0tFosZP368sK2Emh20zZkzJ1VVVavcvs022+S5554rRU0AAAAAq9VU2CZke3+rWkRC2FYazQ7aunXrttog7bnnnku3bt1KURMAAADA+1oZthUKBSFbM7zfIhLCtpYrFIvFYnN2PPzww9O3b998//vfb3L7qaeemhdffDG33nprSQssh5qamvTs2TPV1dVNPpMOAAAAoK3p0KFDVhcDFQqF1NbWrseK2o7mZkXNHtF2zjnn5Oqrr84555zTYHXRBQsW5Atf+EKuueaanHPOOWtV7JQpU9K/f/9UVFRkyJAheeCBB1a571tvvZVJkyZlhx12SEVFRQYNGpTbbrutwT4XXHBBCoVCg9cuu+yyVrUBAAAAtAcWkVj3OjV3x4MPPjhTpkzJmWeemUsvvTQ9evRIoVBIdXV1OnfunMsvvzyHHHLIGhdw/fXXZ+zYsbnyyiszZMiQXHbZZRkxYkRmz56dLbfcstH+559/fq699tp8//vfzy677JLbb789Rx99dO6777584AMfqN9vt912y1133fVORzs1u6sAAAAA7c7KqbVNTR819bY0mj11dKV58+blhhtuyDPPPJNisZidd945H/vYx7LNNtusVQFDhgzJvvvumyuuuCJJUltbm379+uXzn/98vvzlLzfav2/fvvnqV7+aM844o77tox/9aLp165Zrr702Sd2ItptvvjmzZs1aq5pMHQUAAADaq/c+q03I9v6amxWt8TCvrbfeOmeffXaLiltp+fLleeihh3LeeefVt3Xo0CHDhw/PjBkzmjxm2bJlqaioaNDWrVu33HvvvQ3ann766fTt2zcVFRUZOnRoLrroolWumrps2bIsW7as/nNNTc3adgkAAACgVVsZqk2YMCETJ04UspVQs5/Rti4sWrQoK1asSO/evRu09+7dO/Pnz2/ymBEjRuSSSy7J008/ndra2tx5552ZOnVqXnrppfp9hgwZkmuuuSa33XZbvvvd72bOnDn58Ic/nNdff73Jc1500UXp2bNn/atfv36l6yQAAABAKzNu3LjU1tYK2UqsrEHb2vj2t7+dnXbaKbvssku6dOmSz33uczn55JPTocM7XRk5cmSOOeaY7LnnnhkxYkRuvfXWvPbaa7nhhhuaPOd5552X6urq+tcLL7ywvroDAAAAQDtR1qCtsrIyHTt2bLCKaVK3kmmfPn2aPKZXr165+eabs3jx4jz//PN58skns8kmm2T77bdf5XU23XTT7LzzznnmmWea3N61a9f06NGjwQsAAAAA1kRZg7YuXbpk7733zrRp0+rbamtrM23atAwdOnS1x1ZUVGTrrbfO22+/nRtvvDFHHnnkKvd944038uyzz2arrbYqWe0AAAAA8G5rvBjCSg899FCeeOKJJMnAgQOz1157rdV5xo4dmxNPPDH77LNP9ttvv1x22WVZvHhxTj755CTJmDFjsvXWW+eiiy5Kktx///2ZN29eBg8enHnz5uWCCy5IbW1tzj333PpznnPOORk1alS23XbbvPjii5kwYUI6duyY448/fm27CwAAAACrtcZB28KFC3Pcccdl+vTp2XTTTZMkr732Wg4++OD84he/SK9evdbofMcee2xefvnljB8/PvPnz8/gwYNz22231S+QMHfu3AbPX1u6dGnOP//8/OMf/8gmm2ySww47LD/96U/ra0mSf/7znzn++OPzr3/9K7169cr++++fv/zlL2tcGwAAAAA0V6FYLBbX5IBjjz02//jHP/KTn/wku+66a5Lk8ccfz4knnpgdd9wxP//5z9dJoetTTU1Nevbsmerqas9rAwAAANjANTcrWuOgrWfPnrnrrruy7777Nmh/4IEHcuihh+a1115bq4JbE0EbAAAAACs1Nyta48UQamtr07lz50btnTt3Tm1t7ZqeDgAAAADahTUO2g455JCceeaZefHFF+vb5s2bl7PPPjsf+chHSlocAAAAALQVaxy0XXHFFampqUn//v2zww47ZIcddsh2222XmpqaXH755euiRgAAAABo9dY4aOvXr19mzpyZ3/3udznrrLNy1lln5dZbb83MmTOzzTbbrIsaAQAAgHeZPHlyOnTokMmTJ5e7FOBd1ngxhA2BxRAAAABorSZPnpzx48fXf540aVLGjRtXxoqg/WtuVtRpbU4+bdq0TJs2LQsXLmy0AMKPfvSjtTklAAAA8D7eG7Ilqf8sbIPyW+OgbeLEiZk0aVL22WefbLXVVikUCuuiLgAAAOBdmgrZVhK2QeuwxlNHt9pqq1x88cX55Cc/ua5qKjtTRwEAAGhtOnTokNX9Cl8oFBrNOgNKo7lZ0RovhrB8+fIMGzasRcUBAAAAa2bixIkt2g6se2sctJ166qm57rrr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res/b7311pk3b976KL1FBG0A8H8WL16cQYMGZcqUKU1uv/766zN27NhMmDAhM2fOzKBBgzJixIgsXLiwfp/Bgwdn9913b/R68cUX11c3AACg7Erxs3Vb1KncBQBAazFy5MiMHDlyldsvueSSnHbaaTn55JOTJFdeeWV+97vf5Uc/+lG+/OUvJ0lmzZq1PkoFAIBWraU/W/ft27fBCLZ58+Zlv/32W+d1t5QRbQDQDMuXL89DDz2U4cOH17d16NAhw4cPz4wZM8pYGQAAtC3N+dl6v/32y6OPPpp58+bljTfeyO9///uMGDGiXCU3mxFtANAMixYtyooVK9K7d+8G7b17986TTz7Z7PMMHz48f/vb37J48eJss802+eUvf5mhQ4eWulwAAGi1mvOzdadOnfKtb30rBx98cGpra3Puuee2+hVHE0EbAKxXd911V7lLAACANuGII47IEUccUe4y1oipowDQDJWVlenYsWMWLFjQoH3BggXp06dPmaoCAIC2pz3/bC1oA4Bm6NKlS/bee+9Mmzatvq22tjbTpk0z9RMAANZAe/7Z2tRRAPg/b7zxRp555pn6z3PmzMmsWbOy+eabp6qqKmPHjs2JJ56YffbZJ/vtt18uu+yyLF68uH6lJAAAoM6G+rN1oVgsFstdBAC0BtOnT8/BBx/cqP3EE0/MNddckyS54oor8t///d+ZP39+Bg8enO985zsZMmTIeq4UAABatw31Z2tBGwAAAACUgGe0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAA7djRRx+dzTbbLB/72MfKXQoAQLsnaAMAaMfOPPPM/OQnPyl3GQAAGwRBGwBAO3bQQQele/fu5S4DAGCDIGgDANjA/etf/8qWW26Z5557rtVcc9ddd80PfvCDBm3HHXdcvvWtbzXad1XtAADrm6ANAGAD9/Wvfz1HHnlk+vfv3yqu+eabb+bpp5/OoEGDGrSff/75+frXv57q6upmtQMArG+CNgCADdiSJUvywx/+MKecckqrueajjz6aYrGY3XffvUH77rvvnh122CHXXntts9oBANY3QRsAwHr03HPPpVAoNHoddNBBZann1ltvTdeuXfPBD36wQXttbW0uvvji7LjjjunatWuqqqry9a9/PUmybNmy/Nd//Ve23HLLVFRUZP/998+DDz7Y4Phf/epX2WOPPdKtW7dsscUWGT58eBYvXrzaa86aNSuHHHJI9t9//9TW1qaqqiqXXXZZg31GjRqVX/ziF436sap2AID1SdAGALAe9evXLy+99FL96+GHH84WW2yRAw44oMn9L7zwwmyyySarfc2dO3eV1xs+fHiOOeaY3Hrrrdlmm20yY8aMBtv/9Kc/Ze+992503HnnnZdvfOMbGTduXB5//PFcd9116d27d5Lk3HPPzY033pgf//jHmTlzZnbccceMGDEir7zySpLkpZdeyvHHH59PfepTeeKJJzJ9+vSMHj06xWJxldd89tlnc+CBB+aQQw7JEUcckdGjR+cLX/hCzj777MyaNat+v/322y8PPPBAli1b1uD4VbUDAKxPheLKn3gAAFivli5dmoMOOii9evXKLbfckg4dGv8/0FdeeaU+wFqV/v37p1OnTmtVw1FHHZUtttgiP/zhD+vbXn/99fTq1StXXHFFTj311Ab7L168OJtttlmuueaanHDCCUmSt956K/37989ZZ52VL37xi5k5c2b23nvvPPfcc9l2222bdc1/+7d/yzbbbJOrr746Q4YMybHHHpuzzjorm222Wb72ta/l85//fJLk73//ewYNGtTo3KtqBwBYn9buJzIAAFrsU5/6VF5//fXceeedTYZsSbL55ptn8803X2c1vPnmm6moqGjQ9sQTT2TZsmX5yEc+0mj/Z599Nm+99VY+9KEP1bd17tw5++23X5544okkyaBBg/KRj3wke+yxR0aMGJFDDz00H/vYx7LZZps1ec358+fnD3/4Q+67776sWLEijzzySC666KJ06NAhHTt2TJcuXer37datW5K657y926raAQDWJ1NHAQDK4Gtf+1puv/32/PrXv0737t1XuV9Lpo429Sy4d7+SpLKyMq+++mqD41aGVmurY8eOufPOO/P73/8+AwcOzOWXX54BAwZkzpw5TV7zL3/5S2prazN48ODMnj07b775ZgYPHpznnnsur776aoYNG1a/78rRfb169WpwzVW1AwCsT4I2AID17MYbb8ykSZNyww03ZIcddljtvqeffnpmzZq12lffvn2bPHbu3Lk58MADs+uuu2aPPfbIDTfckGKxWP9Kkg984AN5/PHHGxy30047pVu3bpk2bVqjc+6www7p0qVL/vznP9e3vfXWW3nwwQczcODA+rZCoZAPfehDmThxYh5++OF06dIlN910U5PXXL58eZK6qbQPP/xwtt1222y++ea58sors/vuu2ePPfao3/fRRx/NNttsk8rKygZ1raodAGB9MnUUAGA9evTRRzNmzJh86Utfym677Zb58+cnSbp06dLkFNGWTB3t1KlTLrvssgwePDjz58/P3nvvncMOOywbb7xx/T4jRozIeeedl1dffbV+amdFRUW+9KUv5dxzz02XLl3yoQ99KC+//HIee+yxnHLKKfnMZz6TL37xi9l8881TVVWViy++OEuWLMkpp5ySJLn//vszbdq0HHroodlyyy1z//335+WXX86uu+7a5DWHDh2aTp06ZdKkSXnjjTey/fbb54orrsjll1+ee+65p0Gf/vSnP+XQQw9t1NdVtQMArE+CNgCA9eivf/1rlixZkq997Wv52te+Vt9+4IEHZvr06SW91lZbbZWtttoqSdKnT59UVlbmlVdeaRC07bHHHtlrr71yww035D//8z/r28eNG5dOnTpl/PjxefHFF7PVVlvl9NNPT5J84xvfSG1tbT75yU/m9ddfzz777JPbb7+9Pqjr0aNH7rnnnlx22WWpqanJtttum29961sZOXJkk9fs169ffvSjH+VLX/pSXnrppXTq1ClLlizJbbfd1mB10qVLl+bmm2/Obbfd1qCfq2oHAFjfrDoKALABeOihh3LiiSfm0UcfbbTtd7/7Xb74xS/m0UcfXeWiDKW2qmtuvvnmueaaa3LEEUc0Oua73/1ubrrpptxxxx3NagcAWN+MaAMAaOdeeeWVjBkzJt///veb3H744Yfn6aefzrx589KvX7/1UlNT1/znP/+ZV199NbvvvnuTx3Tu3DmXX355s9sBANY3I9oAANqxZcuW5d/+7d9y2mmn5ZOf/GS5y1mt3//+9znmmGPy+uuv16+KCgDQlgjaAADaqWKxmBNOOCEDBgzIBRdcUO5yAADaPUEbAEA7de+99+aAAw7InnvuWd/205/+NHvssUcZqwIAaL8EbQAAAABQAutnWSkAAAAAaOcEbQAAAABQAoI2AAAAACgBQRsAAAAAlICgDQAAAABKQNAGAAAAACUgaAMAAACAEhC0AQAAAEAJCNoAAAAAoAQEbQAAAABQAoI2AAAAACgBQRsAAAAAlMD/B+dnGawADMk1AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "h_eec_l1_l2 = files[\"test\"][\"Nominal/h_eec_l1_l2_WW\"]\n", + "h_eec_l1_l2_noCR = files[\"test_noCR\"][\"Nominal/h_eec_l1_l2_WW\"]\n", + "\n", + "# Convert to numpy arrays\n", + "values1, edges1 = h_eec_l1_l2.to_numpy()\n", + "values2, edges2 = h_eec_l1_l2_noCR.to_numpy()\n", + "\n", + "values1 = values1 / np.sum(values1) if np.sum(values1) != 0 else values1\n", + "values2 = values2 / np.sum(values2) if np.sum(values2) != 0 else values2\n", + "\n", + "def rebin(values, edges, factor):\n", + " assert len(values) % factor == 0, \"Number of bins must be divisible by rebin factor.\"\n", + " \n", + " rebinned_values = values.reshape(-1, factor).sum(axis=1)\n", + " rebinned_edges = edges[::factor]\n", + " rebinned_centers = (rebinned_edges[:-1] + rebinned_edges[1:]) / 2\n", + "\n", + " return rebinned_centers, rebinned_values\n", + "\n", + "factor = 5 # change this as needed\n", + "\n", + "bin_centers1, values1 = rebin(values1, edges1, factor)\n", + "bin_centers2, values2 = rebin(values2, edges2, factor)\n", + "\n", + "# Create figure with two pads (stacked vertically)\n", + "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 8), sharex=True, gridspec_kw={'height_ratios': [2.5, 1]})\n", + "plt.subplots_adjust(hspace=0)\n", + "\n", + "# === Pad 1: Angular Distributions ===\n", + "ax1.plot(bin_centers1, values1, marker='o', linestyle='None', color='red', markersize=4, label='w/ CR')\n", + "ax1.plot(bin_centers2, values2, marker='s', linestyle='None', color='blue', markersize=4, label='no CR')\n", + "\n", + "ax1.legend()\n", + "ax1.tick_params(axis='both', which='both', direction='in')\n", + "ax1.minorticks_on()\n", + "ax1.set_ylabel('set label')\n", + "ax1.set_title(r'Energy-Energy Correlator: W2 $\\rightarrow$ $q_1q_2$')\n", + "ax1.set_xscale('log')\n", + "ax1.set_yscale('log')\n", + "\n", + "# === Pad 2: Ratios ===\n", + "def safe_divide(num, denom):\n", + " with np.errstate(divide='ignore', invalid='ignore'):\n", + " ratio = np.true_divide(num, denom)\n", + " ratio[~np.isfinite(ratio)] = 0 # -inf, inf, NaN -> 0 or np.nan as you prefer\n", + " return ratio\n", + "\n", + "ratio1 = safe_divide(values2, values1)\n", + "\n", + "ax2.plot(bin_centers1, ratio1, marker='D', linestyle='None', color='black', markersize=4)\n", + "ax2.axhline(y=1, color='r', linestyle='--', linewidth = 0.8)\n", + "\n", + "# ax2.legend()\n", + "ax2.set_xlabel(r'z = $\\frac{1}{2}(\\cos(\\phi))$')\n", + "ax2.set_ylabel('no CR / CR')\n", + "ax2.set_xscale('log')\n", + "ax2.set_yscale('linear')\n", + "ax2.set_ylim(0.85, 1.1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9dc0d678-b999-48f4-8fa3-40399411f26a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py3-w-ROOT", + "language": "python", + "name": "pyroot3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.21" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 53883a2699d2b0afc792445db89dd31f3f4de99b Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 14 Jul 2025 16:12:03 -0400 Subject: [PATCH 12/40] issue with jet-substructure for-loop (line 461) --- PostCutCode/Root/AnalysisWWCR.cxx | 585 +++++++++++++++--------------- 1 file changed, 295 insertions(+), 290 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index bd22138..67a2332 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -70,96 +70,96 @@ void AnalysisWWCR::run() { auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); - // ******************* TRUTH HISTOGRAMS ******************* - auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); - auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); - - auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); - auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); - - auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); - auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); - - auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); - auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); - - auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); - auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); - - // ******************* RECOJET HISTOGRAMS ******************* - auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); - auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); - auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - - auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - - auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); - - auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); - auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); - - auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); - auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - - auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); - auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); - auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); - auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); - auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); - - auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); - auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); - auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); - auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); - auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); - auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); + // // ******************* TRUTH HISTOGRAMS ******************* + // auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); + // auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); + + // auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); + // auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); + + // auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); + // auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + + // auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); + // auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); + + // auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); + // auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); + + // // ******************* RECOJET HISTOGRAMS ******************* + // auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); + // auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + // auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); + + // auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + // auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + // auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + // auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + + // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + + // auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); + // auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); + + // auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); + // auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); + + // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); + // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); + // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); + // auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); + // auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); + + // auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); + // auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); + // auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); + // auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); + // auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); + // auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -213,16 +213,27 @@ void AnalysisWWCR::run() { varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; // Jet Constituents - std::vector> *jetconstituents_kt4_e;; - std::vector> *jetconstituents_kt4_p; - std::vector> *jetconstituents_kt4_phi; - std::vector> *jetconstituents_kt4_theta; + // std::vector> jetconstituents_kt4_e;; + // std::vector> jetconstituents_kt4_p; + // std::vector> jetconstituents_kt4_phi; + // std::vector> jetconstituents_kt4_theta; + + std::vector> *jetconstituents_kt4_e = nullptr; + std::vector> *jetconstituents_kt4_p = nullptr; + std::vector> *jetconstituents_kt4_phi = nullptr; + std::vector> *jetconstituents_kt4_theta = nullptr; tree->SetBranchAddress("jetconstituents_kt4_p", &jetconstituents_kt4_p); tree->SetBranchAddress("jetconstituents_kt4_e", &jetconstituents_kt4_e); tree->SetBranchAddress("jetconstituents_kt4_theta", &jetconstituents_kt4_theta); tree->SetBranchAddress("jetconstituents_kt4_phi", &jetconstituents_kt4_phi); + std::cout << "# of Entries (jetConstituents_kt4_p): " << tree->GetBranch("jetconstituents_kt4_p")->GetEntries() << std::endl; + std::cout << "# of Entries (jetConstituents_kt4_e): " << tree->GetBranch("jetconstituents_kt4_e")->GetEntries() << std::endl; + std::cout << "# of Entries (jetConstituents_kt4_theta): " << tree->GetBranch("jetconstituents_kt4_theta")->GetEntries() << std::endl; + std::cout << "# of Entries (jetConstituents_kt4_phi): " << tree->GetBranch("jetconstituents_kt4_phi")->GetEntries() << std::endl; + std::cout << " " << std::endl; + // Increment for CutFlow int NEvents = 0; int NokFlav = 0; @@ -234,7 +245,7 @@ void AnalysisWWCR::run() { int NdCutd34 = 0; int NdecayCuts = 0; - const int maxPrint = 25; + const int maxPrint = 5; int nPrinted = 0; bool do_debug = true; // Set to false to turn off all debug printing @@ -267,43 +278,6 @@ void AnalysisWWCR::run() { eventNum++; - // ******************************* DELETE THIS SECTION ??? ******************************* - // QuarkCounter W1_quarks = countQuarks(Wm_jet_truth); - // QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); - - // bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); - // bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); - // bool W1_is_us = ( (W1_quarks.n_u == 1 && W1_quarks.n_s == 1) ); - // bool W1_is_ub = ( (W1_quarks.n_u == 1 && W1_quarks.n_b == 1) ); - // bool W1_is_cd = ( (W1_quarks.n_c == 1 && W1_quarks.n_d == 1) ); - // bool W1_is_cb = ( (W1_quarks.n_c == 1 && W1_quarks.n_b == 1) ); - - // bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); - // bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); - // bool W2_is_us = ( (W2_quarks.n_u == 1 && W2_quarks.n_s == 1) ); - // bool W2_is_ub = ( (W2_quarks.n_u == 1 && W2_quarks.n_b == 1) ); - // bool W2_is_cd = ( (W2_quarks.n_c == 1 && W2_quarks.n_d == 1) ); - // bool W2_is_cb = ( (W2_quarks.n_c == 1 && W2_quarks.n_b == 1) ); - - // int W1_decay_idx = -1, W2_decay_idx = -1; - // bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; - // bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; - // for (int i = 0; i < 6; ++i) { - // if (W1_decay_types[i]) W1_decay_idx = i; - // if (W2_decay_types[i]) W2_decay_idx = i; - // } - - // if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; - - // NdecayCuts++; - - // if (! ( - // (W1_is_cs && W2_is_cs) - // )) continue; - - // NdecayCuts++; - // ******************************* DELETE THIS SECTION ??? ******************************* - if(event_njet() != 4) continue; NjetCut++; @@ -472,218 +446,249 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; } + if (do_debug && nPrinted < maxPrint){ + std::cout << "we make it this far (1)" << std::endl; + } + // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** - std::vector jetConstituents; - for (size_t i = 0; i < jetconstituents_kt4_p->size(); ++i) { - const auto& constituent_p = jetconstituents_kt4_p->at(i); - const auto& constituent_e = jetconstituents_kt4_e->at(i); - const auto& constituent_theta = jetconstituents_kt4_theta->at(i); - const auto& constituent_phi = jetconstituents_kt4_phi->at(i); - - for (size_t j = 0; j < constituent_p.size(); ++j) { - float p = constituent_p[j]; - float e = constituent_e[j]; - float theta = constituent_theta[j]; - float phi = constituent_phi[j]; - - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); - - TLorentzVector lv; - - lv.SetPxPyPzE(px, py, pz, e); - jetConstituents.push_back(lv); + std::vector jetConstituents; // flattens the overall vector and allows us to open it up + std::vector jet4Vectors; // the 'sub'-vector within the jetConstituents vector + + if (do_debug && nPrinted < maxPrint){ + std::cout << "we make it this far (2)" << std::endl; + } + + for (size_t i = 0; i < jetconstituents_kt4_p->size(); i++) { + // TLorentzVector jet_vec; // reset for each jet + + if (i < maxPrint) { + std::cout << "we might get this far (3)" << std::endl; } + + // for (size_t j = 0; j < jetconstituents_kt4_p->at(i).size(); ++j) { + + // float p = jetconstituents_kt4_p->at(i).at(j); + // float theta = jetconstituents_kt4_theta->at(i).at(j); + // float phi = jetconstituents_kt4_phi->at(i).at(j); + // float e = jetconstituents_kt4_e->at(i).at(j); + + // if (i < 10) { + // std::cout << "momentum: " << p << std::endl; + // std::cout << "theta: " << theta << std::endl; + // std::cout << "phi: " << phi << std::endl; + // std::cout << "energy: " << e << std::endl; + // } + + // // float p = jetconstituents_kt4_p[i][j]; + // // float theta = jetconstituents_kt4_theta[i][j]; + // // float phi = jetconstituents_kt4_phi[i][j]; + // // float e = jetconstituents_kt4_e[i][j]; + + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); + + // TLorentzVector vec; + // vec.SetPxPyPzE(px, py, pz, e); + + // // jet_vec += vec; // accumulate total jet vector + // jetConstituents.push_back(vec); // if needed for individual constituents + // } + + // jet4Vectors.push_back(jet_vec); } - // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** - std::vector truthJets_Wm, truthJets_Wp; - for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { - float p = truth_Wm_p()->at(i); - float e = truth_Wm_e()->at(i); - float theta = truth_Wm_theta()->at(i); - float phi = truth_Wm_phi()->at(i); - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); + + + // // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** + // std::vector truthJets_Wm, truthJets_Wp; + + // for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { + // float p = truth_Wm_p()->at(i); + // float e = truth_Wm_e()->at(i); + // float theta = truth_Wm_theta()->at(i); + // float phi = truth_Wm_phi()->at(i); + + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); - TLorentzVector lv; + // TLorentzVector lv; - lv.SetPxPyPzE(px, py, pz, e); - truthJets_Wm.push_back(lv); - } + // lv.SetPxPyPzE(px, py, pz, e); + // truthJets_Wm.push_back(lv); + // } - for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { - float p = truth_Wp_p()->at(i); - float e = truth_Wp_e()->at(i); - float theta = truth_Wp_theta()->at(i); - float phi = truth_Wp_phi()->at(i); + // for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { + // float p = truth_Wp_p()->at(i); + // float e = truth_Wp_e()->at(i); + // float theta = truth_Wp_theta()->at(i); + // float phi = truth_Wp_phi()->at(i); - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); - TLorentzVector lv; + // TLorentzVector lv; - lv.SetPxPyPzE(px, py, pz, e); - truthJets_Wp.push_back(lv); - } + // lv.SetPxPyPzE(px, py, pz, e); + // truthJets_Wp.push_back(lv); + // } - if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { - TLorentzVector W1_jet1 = truthJets_Wm[0]; - TLorentzVector W1_jet2 = truthJets_Wm[1]; - TLorentzVector W2_jet1 = truthJets_Wp[0]; - TLorentzVector W2_jet2 = truthJets_Wp[1]; + // if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { + // TLorentzVector W1_jet1 = truthJets_Wm[0]; + // TLorentzVector W1_jet2 = truthJets_Wm[1]; + // TLorentzVector W2_jet1 = truthJets_Wp[0]; + // TLorentzVector W2_jet2 = truthJets_Wp[1]; - TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; - TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; + // TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; + // TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; - h_W1_truth_mass->Fill(W1_truthJet.M()); - h_W2_truth_mass->Fill(W2_truthJet.M()); + // h_W1_truth_mass->Fill(W1_truthJet.M()); + // h_W2_truth_mass->Fill(W2_truthJet.M()); - h_W1_truth_p->Fill(W1_truthJet.P()); - h_W2_truth_p->Fill(W2_truthJet.P()); + // h_W1_truth_p->Fill(W1_truthJet.P()); + // h_W2_truth_p->Fill(W2_truthJet.P()); - h_W1_truth_e->Fill(W1_truthJet.E()); - h_W2_truth_e->Fill(W2_truthJet.E()); + // h_W1_truth_e->Fill(W1_truthJet.E()); + // h_W2_truth_e->Fill(W2_truthJet.E()); - CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); - CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); + // CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); + // CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); - double counts_eec_truth_cs = h_eec_truth_cs->Integral(); - double counts_eec_truth_ud = h_eec_truth_ud->Integral(); + // double counts_eec_truth_cs = h_eec_truth_cs->Integral(); + // double counts_eec_truth_ud = h_eec_truth_ud->Integral(); - if (counts_eec_truth_cs > 0) - h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); + // if (counts_eec_truth_cs > 0) + // h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); - if (counts_eec_truth_ud > 0) - h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); - } + // if (counts_eec_truth_ud > 0) + // h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); + // } - // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** - TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + // // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** + // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; - cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); + // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - const double m_W_true = 80.379; + // const double m_W_true = 80.379; - TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; + // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; - TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; + // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; - TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; + // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; - double chi2_option1 = - (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); + // double chi2_option1 = + // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - double chi2_option2 = - (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); + // double chi2_option2 = + // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - double chi2_option3 = - (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + // double chi2_option3 = + // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - // for the cos(phi) angle - TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; + // // for the cos(phi) angle + // TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; - if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - h_W1_mass->Fill(W1_option1.M()); - h_W2_mass->Fill(W2_option1.M()); - h_chi2->Fill(chi2_option1); + // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { + // h_W1_mass->Fill(W1_option1.M()); + // h_W2_mass->Fill(W2_option1.M()); + // h_chi2->Fill(chi2_option1); - h_W1_p->Fill(W1_option1.P()); - h_W2_p->Fill(W2_option1.P()); + // h_W1_p->Fill(W1_option1.P()); + // h_W2_p->Fill(W2_option1.P()); - h_W1_e->Fill(W1_option1.E()); - h_W2_e->Fill(W2_option1.E()); + // h_W1_e->Fill(W1_option1.E()); + // h_W2_e->Fill(W2_option1.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_0; + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_0; - W2_j1 = lTag_Jet_1; - W2_j2 = lTag_Jet_2; + // W2_j1 = lTag_Jet_1; + // W2_j2 = lTag_Jet_2; - } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - h_W1_mass->Fill(W1_option2.M()); - h_W2_mass->Fill(W2_option2.M()); - h_chi2->Fill(chi2_option2); + // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { + // h_W1_mass->Fill(W1_option2.M()); + // h_W2_mass->Fill(W2_option2.M()); + // h_chi2->Fill(chi2_option2); - h_W1_p->Fill(W1_option2.P()); - h_W2_p->Fill(W2_option2.P()); + // h_W1_p->Fill(W1_option2.P()); + // h_W2_p->Fill(W2_option2.P()); - h_W1_e->Fill(W1_option2.E()); - h_W2_e->Fill(W2_option2.E()); + // h_W1_e->Fill(W1_option2.E()); + // h_W2_e->Fill(W2_option2.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_1; + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_1; - W2_j1 = lTag_Jet_0; - W2_j2 = lTag_Jet_2; + // W2_j1 = lTag_Jet_0; + // W2_j2 = lTag_Jet_2; - } else { - h_W1_mass->Fill(W1_option3.M()); - h_W2_mass->Fill(W2_option3.M()); - h_chi2->Fill(chi2_option3); + // } else { + // h_W1_mass->Fill(W1_option3.M()); + // h_W2_mass->Fill(W2_option3.M()); + // h_chi2->Fill(chi2_option3); - h_W1_p->Fill(W1_option3.P()); - h_W2_p->Fill(W2_option3.P()); + // h_W1_p->Fill(W1_option3.P()); + // h_W2_p->Fill(W2_option3.P()); - h_W1_e->Fill(W1_option3.E()); - h_W2_e->Fill(W2_option3.E()); + // h_W1_e->Fill(W1_option3.E()); + // h_W2_e->Fill(W2_option3.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_2; + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_2; - W2_j1 = lTag_Jet_1; - W2_j2 = lTag_Jet_0; - } + // W2_j1 = lTag_Jet_1; + // W2_j2 = lTag_Jet_0; + // } - // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); - CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); - CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); - CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); - CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); + // // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); + // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); + // CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); From da245b03e2945cc86145099bfded2d29152531e6 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 15 Jul 2025 08:20:33 -0400 Subject: [PATCH 13/40] Fixed issue with branches and have started calculating the four-vector --- PostCutCode/Root/AnalysisWWCR.cxx | 82 +++++++------------------------ 1 file changed, 19 insertions(+), 63 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 67a2332..d4707bb 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -213,26 +213,10 @@ void AnalysisWWCR::run() { varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; // Jet Constituents - // std::vector> jetconstituents_kt4_e;; - // std::vector> jetconstituents_kt4_p; - // std::vector> jetconstituents_kt4_phi; - // std::vector> jetconstituents_kt4_theta; - - std::vector> *jetconstituents_kt4_e = nullptr; - std::vector> *jetconstituents_kt4_p = nullptr; - std::vector> *jetconstituents_kt4_phi = nullptr; - std::vector> *jetconstituents_kt4_theta = nullptr; - - tree->SetBranchAddress("jetconstituents_kt4_p", &jetconstituents_kt4_p); - tree->SetBranchAddress("jetconstituents_kt4_e", &jetconstituents_kt4_e); - tree->SetBranchAddress("jetconstituents_kt4_theta", &jetconstituents_kt4_theta); - tree->SetBranchAddress("jetconstituents_kt4_phi", &jetconstituents_kt4_phi); - - std::cout << "# of Entries (jetConstituents_kt4_p): " << tree->GetBranch("jetconstituents_kt4_p")->GetEntries() << std::endl; - std::cout << "# of Entries (jetConstituents_kt4_e): " << tree->GetBranch("jetconstituents_kt4_e")->GetEntries() << std::endl; - std::cout << "# of Entries (jetConstituents_kt4_theta): " << tree->GetBranch("jetconstituents_kt4_theta")->GetEntries() << std::endl; - std::cout << "# of Entries (jetConstituents_kt4_phi): " << tree->GetBranch("jetconstituents_kt4_phi")->GetEntries() << std::endl; - std::cout << " " << std::endl; + varMember>> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; + varMember>> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; + varMember>> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; + varMember>> jetconstituents_kt4_phi {tree, "jetconstituents_kt4_phi"}; // Increment for CutFlow int NEvents = 0; @@ -446,57 +430,29 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; } - if (do_debug && nPrinted < maxPrint){ - std::cout << "we make it this far (1)" << std::endl; - } - // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up - std::vector jet4Vectors; // the 'sub'-vector within the jetConstituents vector - - if (do_debug && nPrinted < maxPrint){ - std::cout << "we make it this far (2)" << std::endl; - } - - for (size_t i = 0; i < jetconstituents_kt4_p->size(); i++) { - // TLorentzVector jet_vec; // reset for each jet - if (i < maxPrint) { - std::cout << "we might get this far (3)" << std::endl; - } + df = df.Define() - // for (size_t j = 0; j < jetconstituents_kt4_p->at(i).size(); ++j) { + // for (int i = 0; i < jetconstituents_kt4_p.size(); i++) { + // for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { - // float p = jetconstituents_kt4_p->at(i).at(j); - // float theta = jetconstituents_kt4_theta->at(i).at(j); - // float phi = jetconstituents_kt4_phi->at(i).at(j); - // float e = jetconstituents_kt4_e->at(i).at(j); + // float p = jetconstituents_kt4_p[i][j]; + // float theta = jetconstituents_kt4_theta[i][j]; + // float phi = jetconstituents_kt4_phi[i][j]; + // float e = jetconstituents_kt4_e[i][j]; - // if (i < 10) { - // std::cout << "momentum: " << p << std::endl; - // std::cout << "theta: " << theta << std::endl; - // std::cout << "phi: " << phi << std::endl; - // std::cout << "energy: " << e << std::endl; - // } + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); - // // float p = jetconstituents_kt4_p[i][j]; - // // float theta = jetconstituents_kt4_theta[i][j]; - // // float phi = jetconstituents_kt4_phi[i][j]; - // // float e = jetconstituents_kt4_e[i][j]; + // TLorentzVector vec; + // vec.SetPxPyPzE(px, py, pz, e); - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); - - // TLorentzVector vec; - // vec.SetPxPyPzE(px, py, pz, e); - - // // jet_vec += vec; // accumulate total jet vector - // jetConstituents.push_back(vec); // if needed for individual constituents - // } - - // jet4Vectors.push_back(jet_vec); - } + // jetConstituents.push_back(vec); // if needed for individual constituents + // } + // } From 7f89a2b1c547d3b6d7729c8a7f0378c75f1ec95a Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 15 Jul 2025 13:28:07 -0400 Subject: [PATCH 14/40] issue on lines 439-442 --- PostCutCode/Root/AnalysisWWCR.cxx | 33 +++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index d4707bb..e6a3b90 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -433,26 +433,29 @@ void AnalysisWWCR::run() { // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up - df = df.Define() + for (int i = 0; i < jetconstituents_kt4_p.size(); i++) { + for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { - // for (int i = 0; i < jetconstituents_kt4_p.size(); i++) { - // for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { + float p = jetconstituents_kt4_p.at(i).at(j); + float theta = jetconstituents_kt4_theta.at(i).at(j); + float phi = jetconstituents_kt4_phi.at(i).at(j); + float e = jetconstituents_kt4_e.at(i).at(j); - // float p = jetconstituents_kt4_p[i][j]; - // float theta = jetconstituents_kt4_theta[i][j]; - // float phi = jetconstituents_kt4_phi[i][j]; - // float e = jetconstituents_kt4_e[i][j]; + // float p = jetconstituents_kt4_p[i][j]; + // float theta = jetconstituents_kt4_theta[i][j]; + // float phi = jetconstituents_kt4_phi[i][j]; + // float e = jetconstituents_kt4_e[i][j]; - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // TLorentzVector vec; - // vec.SetPxPyPzE(px, py, pz, e); + TLorentzVector vec; + vec.SetPxPyPzE(px, py, pz, e); - // jetConstituents.push_back(vec); // if needed for individual constituents - // } - // } + jetConstituents.push_back(vec); // if needed for individual constituents + } + } From fce7047afa29d6b873858a480bcf6e3f64a40e87 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 16 Jul 2025 10:05:15 -0400 Subject: [PATCH 15/40] includes print statements and minor fixes from previous version --- PostCutCode/Root/AnalysisWWCR.cxx | 51 +++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index e6a3b90..a59b4fc 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -12,6 +12,7 @@ #include using namespace std; +using namespace ROOT::VecOps; // Base class AnalysisWWCR::AnalysisWWCR(): @@ -213,6 +214,8 @@ void AnalysisWWCR::run() { varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; // Jet Constituents + varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; + varMember>> jetconstituents_kt4_PID {tree, "jetconstituents_kt4_PID"}; varMember>> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; varMember>> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; varMember>> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; @@ -433,27 +436,43 @@ void AnalysisWWCR::run() { // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up - for (int i = 0; i < jetconstituents_kt4_p.size(); i++) { - for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { + // for (int j = 0; j < jetconstituents_kt4.size(); ++j){ + // for (int k = 0; k < jetconstituents_kt4.size(); ++k){ - float p = jetconstituents_kt4_p.at(i).at(j); - float theta = jetconstituents_kt4_theta.at(i).at(j); - float phi = jetconstituents_kt4_phi.at(i).at(j); - float e = jetconstituents_kt4_e.at(i).at(j); + // } + // } + + for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { + for (size_t k = 0; k < jetconstituents_kt4_p.at(k).size(); ++k) { + + // std::cout << "jetconstituents_kt4_p.size(): " << jetconstituents_kt4_p.size() << std::endl; + // std::cout << "jetconstituents_kt4_e.size(): " << jetconstituents_kt4_e.size() << std::endl; + // std::cout << "jetconstituents_kt4_theta.size(): " << jetconstituents_kt4_theta.size() << std::endl; + // std::cout << "jetconstituents_kt4_phi.size(): " << jetconstituents_kt4_phi.size() << std::endl; + + float p = jetconstituents_kt4_p.at(j).at(k); + float theta = jetconstituents_kt4_theta.at(j).at(k); + float phi = jetconstituents_kt4_phi.at(j).at(k); + float e = jetconstituents_kt4_e.at(j).at(k); + + // // if (k < 10) { + // // std::cout << " Constituent k: " << k << std::endl; + // // std::cout << " p: " << p << ", theta: " << theta << ", phi: " << phi << ", e: " << e << std::endl; + // // } - // float p = jetconstituents_kt4_p[i][j]; - // float theta = jetconstituents_kt4_theta[i][j]; - // float phi = jetconstituents_kt4_phi[i][j]; - // float e = jetconstituents_kt4_e[i][j]; + // // float p = jetconstituents_kt4_p[i][j]; + // // float theta = jetconstituents_kt4_theta[i][j]; + // // float phi = jetconstituents_kt4_phi[i][j]; + // // float e = jetconstituents_kt4_e[i][j]; - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); - TLorentzVector vec; - vec.SetPxPyPzE(px, py, pz, e); + // TLorentzVector vec; + // vec.SetPxPyPzE(px, py, pz, e); - jetConstituents.push_back(vec); // if needed for individual constituents + // jetConstituents.push_back(vec); // if needed for individual constituents } } From 9dceacba422fac16792be24152d3bc61dae12453 Mon Sep 17 00:00:00 2001 From: Iza Veliscek Date: Wed, 16 Jul 2025 11:04:53 -0400 Subject: [PATCH 16/40] load RVecDict and compute jet const. LV --- PostCutCode/CMakeLists.txt | 41 +- PostCutCode/PostCutCode/LinkDef.h | 5 + PostCutCode/PostCutCode/RVecDict.h | 2 + PostCutCode/Root/AnalysisWWCR.cxx | 51 ++- PostCutCode/Root/Plots_AnalysisWWCR.cxx | 539 ------------------------ 5 files changed, 58 insertions(+), 580 deletions(-) create mode 100644 PostCutCode/PostCutCode/LinkDef.h create mode 100644 PostCutCode/PostCutCode/RVecDict.h delete mode 100644 PostCutCode/Root/Plots_AnalysisWWCR.cxx diff --git a/PostCutCode/CMakeLists.txt b/PostCutCode/CMakeLists.txt index cc7d9b5..6786eb2 100644 --- a/PostCutCode/CMakeLists.txt +++ b/PostCutCode/CMakeLists.txt @@ -1,36 +1,36 @@ cmake_minimum_required(VERSION 3.8) - project(PostCutCode) message("announcing PostCutCode") set(CMAKE_BUILD_TYPE Debug) add_compile_options(-std=c++17 -fPIC -Wall -Wextra -Wno-unused-parameter -O2) -# You need to tell CMake where to find the ROOT installation. This can be done in a number of ways: -# - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake -# - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS}) -#---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS) -find_package(ROOT REQUIRED COMPONENTS RIO EG Minuit RooFit RooFitCore RooStats HistFactory Core RIO Net Hist Graf Graf3d Gpad Tree Rint Postscript Matrix Physics MathCore Thread MultiProc TMVA) -# find_package(nlohmann_json REQUIRED) - -#---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY) +find_package(ROOT REQUIRED COMPONENTS RIO EG Minuit RooFit RooFitCore RooStats HistFactory Core Net Hist Graf Graf3d Gpad Tree Rint Postscript Matrix Physics MathCore Thread MultiProc TMVA) include(${ROOT_USE_FILE}) -# compile options - include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -# link_directories(/cvmfs/sw.hsf.org/spackages7/intel-tbb/2020.3/x86_64-centos7-gcc11.2.0-opt/ey3ft/lib /cvmfs/sw.hsf.org/spackages7/zlib/1.2.13/x86_64-centos7-gcc11.2.0-opt/2wmsk/lib) -#---Create a shared library with generated dictionary +# Collect source files file(GLOB sources "Root/*.cxx") -add_library(PostCutCodeLib SHARED ${sources}) +# Generate the dictionary +set(DICT_HEADERS PostCutCode/RVecDict.h) +set(DICT_LINKDEF PostCutCode/LinkDef.h) + +ROOT_GENERATE_DICTIONARY(RVecDict + ${DICT_HEADERS} + LINKDEF ${DICT_LINKDEF} +) + +# Add the shared library and include the dictionary source variable +add_library(PostCutCodeLib SHARED ${sources} ${RVecDict_dictionary}) +target_include_directories(PostCutCodeLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(PostCutCodeLib ${ROOT_LIBRARIES}) -#---Link the exe files +# Build executables file(GLOB_RECURSE exe_files "utils/*.cxx") foreach(_exe_file ${exe_files}) get_filename_component(_theExec ${_exe_file} NAME_WE) @@ -38,11 +38,12 @@ foreach(_exe_file ${exe_files}) target_link_libraries(${_theExec} PostCutCodeLib) endforeach() -set(ENV{WSCANNER_DATADIR} ${CMAKE_CURRENT_SOURCE_DIR}/data/) - - -# ---------- Generating the setup.sh file +# Setup script set(SETUP ${CMAKE_CURRENT_BINARY_DIR}/../setup.sh) file(WRITE ${SETUP} "#!/bin/bash\n") -file(APPEND ${SETUP} "# this is an auto-generated setup script\n" ) +file(APPEND ${SETUP} "# this is an auto-generated setup script\n") file(APPEND ${SETUP} "export PATH=\${PATH}:${CMAKE_CURRENT_BINARY_DIR}/\n") + +# Optional: export data env +set(ENV{WSCANNER_DATADIR} ${CMAKE_CURRENT_SOURCE_DIR}/data/) + diff --git a/PostCutCode/PostCutCode/LinkDef.h b/PostCutCode/PostCutCode/LinkDef.h new file mode 100644 index 0000000..9fb1711 --- /dev/null +++ b/PostCutCode/PostCutCode/LinkDef.h @@ -0,0 +1,5 @@ +#ifdef __CLING__ +#pragma link C++ class ROOT::VecOps::RVec+; +#pragma link C++ class ROOT::VecOps::RVec>+; +#endif + diff --git a/PostCutCode/PostCutCode/RVecDict.h b/PostCutCode/PostCutCode/RVecDict.h new file mode 100644 index 0000000..3dd27c0 --- /dev/null +++ b/PostCutCode/PostCutCode/RVecDict.h @@ -0,0 +1,2 @@ +#pragma once +#include diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index e6a3b90..46e33c3 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -1,4 +1,5 @@ // Local includes +#include // for std::exit #include "PostCutCode/AnalysisWWCR.h" #include "PostCutCode/TreeContainer.h" #include @@ -213,6 +214,7 @@ void AnalysisWWCR::run() { varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; // Jet Constituents + varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; varMember>> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; varMember>> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; varMember>> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; @@ -309,10 +311,10 @@ void AnalysisWWCR::run() { NokFlav++; // cut on the number of electrons - if (event_nmu() > 2.) continue; - if (event_nel() > 2.) continue; - if (muons_p() > 20.) continue; - if (elecrons_p() > 20.) continue; + // if (event_nmu() > 2.) continue; + // if (event_nel() > 2.) continue; + // if (muons_p() > 20.) continue; + // if (elecrons_p() > 20.) continue; NleptonCut++; @@ -432,29 +434,36 @@ void AnalysisWWCR::run() { // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up + // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. + for (int i = 0; i < jetconstituents_kt4.size(); ++i){ + std::cout << "instance i: " << i<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; + if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ + std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; + std::exit(EXIT_FAILURE); + } + for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ + // jetconstituents_kt4_p.at(i).at(k) + std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + float p = jetconstituents_kt4_p.at(i).at(k); + float theta = jetconstituents_kt4_theta.at(i).at(k); + float phi = jetconstituents_kt4_phi.at(i).at(k); + float e = jetconstituents_kt4_e.at(i).at(k); - for (int i = 0; i < jetconstituents_kt4_p.size(); i++) { - for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { - float p = jetconstituents_kt4_p.at(i).at(j); - float theta = jetconstituents_kt4_theta.at(i).at(j); - float phi = jetconstituents_kt4_phi.at(i).at(j); - float e = jetconstituents_kt4_e.at(i).at(j); + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // float p = jetconstituents_kt4_p[i][j]; - // float theta = jetconstituents_kt4_theta[i][j]; - // float phi = jetconstituents_kt4_phi[i][j]; - // float e = jetconstituents_kt4_e[i][j]; + TLorentzVector vec; + vec.SetPxPyPzE(px, py, pz, e); - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); + jetConstituents.push_back(vec); // if needed for individual constituents - TLorentzVector vec; - vec.SetPxPyPzE(px, py, pz, e); - jetConstituents.push_back(vec); // if needed for individual constituents - } + } + + // } } diff --git a/PostCutCode/Root/Plots_AnalysisWWCR.cxx b/PostCutCode/Root/Plots_AnalysisWWCR.cxx deleted file mode 100644 index a144d8f..0000000 --- a/PostCutCode/Root/Plots_AnalysisWWCR.cxx +++ /dev/null @@ -1,539 +0,0 @@ -#include -#include -#include -#include -#include - -void Plots_AnalysisWWCR() { - - TFile *test_CR = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test.root", "READ"); - TFile *test_noCR = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_noCR.root", "READ"); - TFile *test_SKI = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_SKI.root", "READ"); - TFile *test_SKII = TFile::Open("/usatlas/u/kleibensperger/FCCeePostCutCode/run/test_SKII.root", "READ"); - - if (!test_CR || test_CR->IsZombie()) { - std::cerr << "Error: Cannot open test_CR!" << std::endl; - return; - } - - if (!test_noCR || test_noCR->IsZombie()) { - std::cerr << "Error: Cannot open test_noCR!" << std::endl; - return; - } - - if (!test_SKI || test_SKI->IsZombie()) { - std::cerr << "Error: Cannot open test_SKI!" << std::endl; - return; - } - - if (!test_SKII || test_SKII->IsZombie()) { - std::cerr << "Error: Cannot open test_SKII!" << std::endl; - return; - } - - // *************************** CR Plots *************************** - TH1F *h_W1_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W1_truth_mass_WW"); - TH1F *h_W2_truth_mass = (TH1F*)test_CR->Get("Nominal/h_W2_truth_mass_WW"); - TH1F *h_W1_mass = (TH1F*)test_CR->Get("Nominal/h_W1_mass_WW"); - TH1F *h_W2_mass = (TH1F*)test_CR->Get("Nominal/h_W2_mass_WW"); - - TH1F *h_W1_truth_p = (TH1F*)test_CR->Get("Nominal/h_W1_truth_p_WW"); - TH1F *h_W2_truth_p = (TH1F*)test_CR->Get("Nominal/h_W2_truth_p_WW"); - TH1F *h_W1_p = (TH1F*)test_CR->Get("Nominal/h_W1_p_WW"); - TH1F *h_W2_p = (TH1F*)test_CR->Get("Nominal/h_W2_p_WW"); - - TH1F *h_W1_truth_e = (TH1F*)test_CR->Get("Nominal/h_W1_truth_e_WW"); - TH1F *h_W2_truth_e = (TH1F*)test_CR->Get("Nominal/h_W2_truth_e_WW"); - TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); - TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); - - TH1F *h_delta_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_phi_truth_cs_WW"); - TH1F *h_delta_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_phi_truth_ud_WW"); - TH1F *h_delta_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_phi_c_l0_WW"); - TH1F *h_delta_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_phi_l1_l2_WW"); - - TH1F *h_cos_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_cs_WW"); - TH1F *h_cos_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_cos_phi_truth_ud_WW"); - TH1F *h_cos_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_c_l0_WW"); - TH1F *h_cos_phi_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_cos_phi_l1_l2_WW"); - - TH1F *h_eec_truth_cs = (TH1F*)test_CR->Get("Nominal/h_eec_truth_cs_WW"); - TH1F *h_eec_truth_ud = (TH1F*)test_CR->Get("Nominal/h_eec_truth_ud_WW"); - TH1F *h_eec_c_l0 = (TH1F*)test_CR->Get("Nominal/h_eec_c_l0_WW"); - TH1F *h_eec_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_eec_l1_l2_WW"); - - // *************************** No CR Plots *************************** - TH1F *h_W1_truth_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_mass_WW"); - TH1F *h_W2_truth_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_mass_WW"); - TH1F *h_W1_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_mass_WW"); - TH1F *h_W2_mass_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_mass_WW"); - - TH1F *h_W1_truth_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_p_WW"); - TH1F *h_W2_truth_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_p_WW"); - TH1F *h_W1_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_p_WW"); - TH1F *h_W2_p_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_p_WW"); - - TH1F *h_W1_truth_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_truth_e_WW"); - TH1F *h_W2_truth_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_truth_e_WW"); - TH1F *h_W1_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_e_WW"); - TH1F *h_W2_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_e_WW"); - - TH1F *h_delta_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_cs_WW"); - TH1F *h_delta_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_ud_WW"); - TH1F *h_delta_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_c_l0_WW"); - TH1F *h_delta_phi_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_l1_l2_WW"); - - TH1F *h_cos_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_cs_WW"); - TH1F *h_cos_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_truth_ud_WW"); - TH1F *h_cos_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_c_l0_WW"); - TH1F *h_cos_phi_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_cos_phi_l1_l2_WW"); - - TH1F *h_eec_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_truth_cs_WW"); - TH1F *h_eec_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_truth_ud_WW"); - TH1F *h_eec_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_c_l0_WW"); - TH1F *h_eec_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_l1_l2_WW"); - - - TFile *Plots_WWCR = new TFile("/usatlas/u/kleibensperger/FCCeePostCutCode/run/WWCR_Plots.root", "Recreate"); - - // *************************** MASS PLOTS *************************** - TCanvas* c_W1_W2_mass = new TCanvas("c_W1_W2_mass", "Truth Histograms", 1500, 600); - c_W1_W2_mass->Divide(2, 1); - c_W1_W2_mass->SetWindowSize(1500, 600); // Window size in pixels - c_W1_W2_mass->SetCanvasSize(1500, 600); // Drawable area in pixels - - c_W1_W2_mass->cd(1); - h_W1_truth_mass->Draw(); - h_W1_truth_mass->SetLineColor(kBlue); - h_W1_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W1_mass->Draw("same"); - h_W1_mass->SetLineColor(kRed); - - TLegend *legend_w1_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_mass->SetTextSize(0.04); - legend_w1_mass->SetBorderSize(0); - legend_w1_mass->SetFillStyle(0); // Transparent background - - legend_w1_mass->AddEntry(h_W1_truth_mass, "w1_truth_mass", "l"); - legend_w1_mass->AddEntry(h_W1_mass, "w1_mass", "l"); - legend_w1_mass->Draw(); - - c_W1_W2_mass->cd(2); - h_W2_truth_mass->Draw(); - h_W2_truth_mass->SetLineColor(kBlue); - h_W2_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W2_mass->Draw("same"); - h_W2_mass->SetLineColor(kRed); - - TLegend *legend_w2_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_mass->SetTextSize(0.04); - legend_w2_mass->SetBorderSize(0); - legend_w2_mass->SetFillStyle(0); // Transparent background - - legend_w2_mass->AddEntry(h_W2_truth_mass, "w2_truth_mass", "l"); - legend_w2_mass->AddEntry(h_W2_mass, "w2_mass", "l"); - legend_w2_mass->Draw(); - - // *************************** COMPARATIVE MOMENTA PLOTS *************************** - TCanvas* c_W1_W2_p = new TCanvas("c_W1_W2_p", "Truth Histograms", 1500, 600); - c_W1_W2_p->Divide(2, 1); - - c_W1_W2_p->cd(1); - h_W1_truth_p->Draw(); - h_W1_truth_p->SetLineColor(kBlue); - h_W1_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W1_p->Draw("same"); - h_W1_p->SetLineColor(kRed); - - TLegend *legend_w1_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_p->SetTextSize(0.04); - legend_w1_p->SetBorderSize(0); - legend_w1_p->SetFillStyle(0); // Transparent background - - legend_w1_p->AddEntry(h_W1_truth_p, "w1_truth_p", "l"); - legend_w1_p->AddEntry(h_W1_p, "w1_p", "l"); - legend_w1_p->Draw(); - - c_W1_W2_p->cd(2); - h_W2_truth_p->Draw(); - h_W2_truth_p->SetLineColor(kBlue); - h_W2_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W2_p->Draw("same"); - h_W2_p->SetLineColor(kRed); - - TLegend *legend_w2_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_p->SetTextSize(0.04); - legend_w2_p->SetBorderSize(0); - legend_w2_p->SetFillStyle(0); // Transparent background - - legend_w2_p->AddEntry(h_W2_truth_p, "w2_truth_p", "l"); - legend_w2_p->AddEntry(h_W2_p, "w2_p", "l"); - legend_w2_p->Draw(); - - // *************************** COMPARATIVE ENERGY PLOTS *************************** - TCanvas* c_W1_W2_e = new TCanvas("c_W1_W2_e", "Truth Histograms", 1500, 600); - c_W1_W2_e->Divide(2, 1); - - c_W1_W2_e->cd(1); - h_W1_truth_e->Draw(); - h_W1_truth_e->SetLineColor(kBlue); - h_W1_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W1_e->Draw("same"); - h_W1_e->SetLineColor(kRed); - - TLegend *legend_w1_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_e->SetTextSize(0.04); - legend_w1_e->SetBorderSize(0); - legend_w1_e->SetFillStyle(0); // Transparent background - - legend_w1_e->AddEntry(h_W1_truth_e, "w1_truth_e", "l"); - legend_w1_e->AddEntry(h_W1_e, "w1_e", "l"); - legend_w1_e->Draw(); - - c_W1_W2_e->cd(2); - h_W2_truth_e->Draw(); - h_W2_truth_e->SetLineColor(kBlue); - h_W2_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W2_e->Draw("same"); - h_W2_e->SetLineColor(kRed); - - TLegend *legend_w2_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_e->SetTextSize(0.04); - legend_w2_e->SetBorderSize(0); - legend_w2_e->SetFillStyle(0); // Transparent background - - legend_w2_e->AddEntry(h_W2_truth_e, "w2_truth_e", "l"); - legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); - legend_w2_e->Draw(); - - // *************************** DELTA PHI DISTRIBUTIONS *************************** - TCanvas* c_delta_phi_truth = new TCanvas("c_delta_phi_truth", "Truth Histograms", 1500, 600); - c_delta_phi_truth->Divide(2, 1); - - c_delta_phi_truth->cd(1); - h_delta_phi_truth_cs->Draw("HIST"); - h_delta_phi_truth_cs->SetLineColor(kBlue); - h_delta_phi_truth_cs->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_truth_cs->SetTitle("#Delta#phi: cs"); - - h_delta_phi_truth_cs_noCR->Draw("HIST same"); - h_delta_phi_truth_cs_noCR->SetLineColor(kRed); - - TLegend *legend_w1_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_delta_phi->SetTextSize(0.04); - legend_w1_truth_delta_phi->SetBorderSize(0); - legend_w1_truth_delta_phi->SetFillStyle(0); // Transparent background - - legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs, "#Delta#phi: cs (CR)", "l"); - legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs_noCR, "#Delta#phi: cs (no CR)", "l"); - legend_w1_truth_delta_phi->Draw(); - - c_delta_phi_truth->cd(2); - h_delta_phi_truth_ud->Draw("HIST"); - h_delta_phi_truth_ud->SetLineColor(kBlue); - h_delta_phi_truth_ud->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_truth_ud->SetTitle("#Delta#phi: ud"); - - h_delta_phi_truth_ud_noCR->Draw("HIST same"); - h_delta_phi_truth_ud_noCR->SetLineColor(kRed); - - TLegend *legend_w2_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_delta_phi->SetTextSize(0.04); - legend_w2_truth_delta_phi->SetBorderSize(0); - legend_w2_truth_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud, "#Delta#phi: ud (CR)", "l"); - legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud_noCR, "#Delta#phi: ud (no CR)", "l"); - legend_w2_truth_delta_phi->Draw(); - - - TCanvas* c_delta_phi_reco = new TCanvas("c_delta_phi_reco", "Reco Histograms", 1500, 600); - c_delta_phi_reco->Divide(2, 1); - - c_delta_phi_reco->cd(1); - h_delta_phi_c_l0->Draw("HIST"); - h_delta_phi_c_l0->SetLineColor(kBlue); - h_delta_phi_c_l0->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_c_l0->SetTitle("#Delta#phi: W1 #rightarrow c q0"); - - h_delta_phi_c_l0_noCR->Draw("HIST same"); - h_delta_phi_c_l0_noCR->SetLineColor(kRed); - - TLegend *legend_w1_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_delta_phi->SetTextSize(0.04); - legend_w1_reco_delta_phi->SetBorderSize(0); - legend_w1_reco_delta_phi->SetFillStyle(0); // Transparent background - - legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0, "#Delta#phi (CR)", "l"); - legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0_noCR, "#Delta#phi (no CR)", "l"); - legend_w1_reco_delta_phi->Draw(); - - c_delta_phi_reco->cd(2); - h_delta_phi_l1_l2->Draw("HIST"); - h_delta_phi_l1_l2->SetLineColor(kBlue); - h_delta_phi_l1_l2->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_l1_l2->SetTitle("#Delta#phi: W2 #rightarrow q1 q2"); - - h_delta_phi_l1_l2_noCR->Draw("HIST same"); - h_delta_phi_l1_l2_noCR->SetLineColor(kRed); - - TLegend *legend_w2_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_reco_delta_phi->SetTextSize(0.04); - legend_w2_reco_delta_phi->SetBorderSize(0); - legend_w2_reco_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2, "#Delta#phi (CR)", "l"); - legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "#Delta#phi (no CR)", "l"); - legend_w2_reco_delta_phi->Draw(); - - // ****************************** COS(PHI) DISTRIBUTIONS ****************************** - TCanvas* c_cos_phi_truth = new TCanvas("c_cos_phi_truth", "Truth Histograms", 1500, 600); - c_cos_phi_truth->Divide(2, 1); - - c_cos_phi_truth->cd(1); - h_cos_phi_truth_cs->Draw("HIST"); - h_cos_phi_truth_cs->SetLineColor(kBlue); - h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_truth_cs->SetTitle("cos(#phi): cs"); - - h_cos_phi_truth_cs_noCR->Draw("HIST same"); - h_cos_phi_truth_cs_noCR->SetLineColor(kRed); - - TLegend *legend_w1_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_cos_phi->SetTextSize(0.04); - legend_w1_truth_cos_phi->SetBorderSize(0); - legend_w1_truth_cos_phi->SetFillStyle(0); // Transparent background - - legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs, "cos(#phi): cs (CR)", "l"); - legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs_noCR, "cos(#phi): cs (no CR)", "l"); - legend_w1_truth_cos_phi->Draw(); - - c_cos_phi_truth->cd(2); - h_cos_phi_truth_ud->Draw("HIST"); - h_cos_phi_truth_ud->SetLineColor(kBlue); - h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_truth_ud->SetTitle("cos(#phi): ud"); - - h_cos_phi_truth_ud_noCR->Draw("HIST same"); - h_cos_phi_truth_ud_noCR->SetLineColor(kRed); - - TLegend *legend_w2_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_cos_phi->SetTextSize(0.04); - legend_w2_truth_cos_phi->SetBorderSize(0); - legend_w2_truth_cos_phi->SetFillStyle(0); // Transparent background - - legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud, "cos(#phi): ud (CR)", "l"); - legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud_noCR, "cos(#phi): ud (no CR)", "l"); - legend_w2_truth_cos_phi->Draw(); - - - TCanvas* c_cos_phi_reco = new TCanvas("c_cos_phi_reco", "Reco Histograms", 1500, 600); - c_cos_phi_reco->Divide(2, 1); - - c_cos_phi_reco->cd(1); - h_cos_phi_c_l0->Draw("HIST"); - h_cos_phi_c_l0->SetLineColor(kBlue); - h_cos_phi_c_l0->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_c_l0->SetTitle("cos(#phi): W1 #rightarrow c q0"); - - h_cos_phi_c_l0_noCR->Draw("HIST same"); - h_cos_phi_c_l0_noCR->SetLineColor(kRed); - - TLegend *legend_w1_reco_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_cos_phi->SetTextSize(0.04); - legend_w1_reco_cos_phi->SetBorderSize(0); - legend_w1_reco_cos_phi->SetFillStyle(0); // Transparent background - - legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0, "cos(#phi) (CR)", "l"); - legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0_noCR, "cos(#phi) (no CR)", "l"); - legend_w1_reco_cos_phi->Draw(); - - c_cos_phi_reco->cd(2); - h_cos_phi_l1_l2->Draw("HIST"); - h_cos_phi_l1_l2->SetLineColor(kBlue); - h_cos_phi_l1_l2->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_l1_l2->SetTitle("cos(#phi): W2 #rightarrow q1 q2"); - - h_cos_phi_l1_l2_noCR->Draw("HIST same"); - h_cos_phi_l1_l2_noCR->SetLineColor(kRed); - - TLegend *legend_w2_cos_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_cos_delta_phi->SetTextSize(0.04); - legend_w2_cos_delta_phi->SetBorderSize(0); - legend_w2_cos_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2, "cos(#phi) (CR)", "l"); - legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "cos(#phi) (no CR)", "l"); - legend_w2_cos_delta_phi->Draw(); - - // ****************************** E-E CORRELATORS DISTRIBUTIONS ****************************** - TCanvas* c_eec_truth = new TCanvas("c_eec_truth", "Truth Histograms", 1500, 600); - c_eec_truth->Divide(2, 1); - - c_eec_truth->cd(1); - h_eec_truth_cs->Draw("HIST"); - h_eec_truth_cs->SetLineColor(kBlue); - h_eec_truth_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_truth_cs->SetTitle("e-e correlator: cs"); - h_eec_truth_cs->Rebin(2); - h_eec_truth_cs->Scale(1.0 / h_eec_truth_cs->Integral()); - - h_eec_truth_cs_noCR->Draw("HIST same"); - h_eec_truth_cs_noCR->SetLineColor(kRed); - h_eec_truth_cs_noCR->Rebin(2); - h_eec_truth_cs_noCR->Scale(1.0 / h_eec_truth_cs_noCR->Integral()); - - TLegend *legend_w1_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_eec->SetTextSize(0.04); - legend_w1_truth_eec->SetBorderSize(0); - legend_w1_truth_eec->SetFillStyle(0); // Transparent background - - legend_w1_truth_eec->AddEntry(h_eec_truth_cs, "w/ CR", "l"); - legend_w1_truth_eec->AddEntry(h_eec_truth_cs_noCR, "no CR", "l"); - legend_w1_truth_eec->Draw(); - - c_eec_truth->cd(2); - h_eec_truth_ud->Draw("HIST"); - h_eec_truth_ud->SetLineColor(kBlue); - h_eec_truth_ud->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_truth_ud->SetTitle("e-e correlator: ud"); - h_eec_truth_ud->Rebin(2); - h_eec_truth_ud->Scale(1.0 / h_eec_truth_ud->Integral()); - - h_eec_truth_ud_noCR->Draw("HIST same"); - h_eec_truth_ud_noCR->SetLineColor(kRed); - h_eec_truth_ud_noCR->Rebin(2); - h_eec_truth_ud_noCR->Scale(1.0 / h_eec_truth_ud_noCR->Integral()); - - TLegend *legend_w2_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_eec->SetTextSize(0.04); - legend_w2_truth_eec->SetBorderSize(0); - legend_w2_truth_eec->SetFillStyle(0); // Transparent background - - legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud, "w/ CR", "l"); - legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud_noCR, "no CR", "l"); - legend_w2_truth_eec->Draw(); - - TCanvas* c_eec_truth_ratio = new TCanvas("c_eec_truth_ratio", "Truth Ratio", 1500, 600); - - c_eec_truth_ratio->cd(); - TH1D* h_CR_noCR_cs = (TH1D*)h_eec_truth_cs->Clone("h_CR_noCR_cs"); - h_CR_noCR_cs->Divide(h_eec_truth_cs_noCR); - - TH1D* h_CR_noCR_ud = (TH1D*)h_eec_truth_ud->Clone("h_CR_noCR_ud"); - h_CR_noCR_ud->Divide(h_eec_truth_ud_noCR); - - h_CR_noCR_cs->Draw("HIST"); - h_CR_noCR_cs->SetLineColor(kRed); - h_CR_noCR_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_CR_noCR_cs->GetYaxis()->SetTitle("Ratio: no CR / CR"); - - h_CR_noCR_ud->Draw("HIST same"); - h_CR_noCR_ud->SetLineColor(kBlue); - - TLegend *legend_CR_noCR_truth_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_CR_noCR_truth_ratio->SetTextSize(0.04); - legend_CR_noCR_truth_ratio->SetBorderSize(0); - legend_CR_noCR_truth_ratio->SetFillStyle(0); // Transparent background - - legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_cs, "w/ CR", "l"); - legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_ud, "no CR", "l"); - legend_CR_noCR_truth_ratio->Draw(); - - - - TCanvas* c_eec_reco = new TCanvas("c_eec_reco", "Reco Histograms", 1500, 600); - c_eec_reco->Divide(2, 1); - - c_eec_reco->cd(1); - h_eec_c_l0->Draw("HIST"); - h_eec_c_l0->SetLineColor(kBlue); - h_eec_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_c_l0->SetTitle("e-e correlator: W1 #rightarrow c q0"); - h_eec_c_l0->Rebin(2); - h_eec_c_l0->Scale(1.0 / h_eec_c_l0->Integral()); - - h_eec_c_l0_noCR->Draw("HIST same"); - h_eec_c_l0_noCR->SetLineColor(kRed); - h_eec_c_l0_noCR->Rebin(2); - h_eec_c_l0_noCR->Scale(1.0 / h_eec_c_l0_noCR->Integral()); - - TLegend *legend_w1_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_eec->SetTextSize(0.04); - legend_w1_reco_eec->SetBorderSize(0); - legend_w1_reco_eec->SetFillStyle(0); // Transparent background - - legend_w1_reco_eec->AddEntry(h_eec_c_l0, "w/ CR", "l"); - legend_w1_reco_eec->AddEntry(h_eec_c_l0_noCR, "no CR", "l"); - legend_w1_reco_eec->Draw(); - - c_eec_reco->cd(2); - h_eec_l1_l2->Draw("HIST"); - h_eec_l1_l2->SetLineColor(kBlue); - h_eec_l1_l2->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_l1_l2->SetTitle("e-e correlator: W2 #rightarrow q1 q2"); - h_eec_l1_l2->Rebin(2); - h_eec_l1_l2->Scale(1.0 / h_eec_l1_l2->Integral()); - - h_eec_l1_l2_noCR->Draw("HIST same"); - h_eec_l1_l2_noCR->SetLineColor(kRed); - h_eec_l1_l2_noCR->Rebin(2); - h_eec_l1_l2_noCR->Scale(1.0 / h_eec_l1_l2_noCR->Integral()); - - TLegend *legend_w2_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_reco_eec->SetTextSize(0.04); - legend_w2_reco_eec->SetBorderSize(0); - legend_w2_reco_eec->SetFillStyle(0); // Transparent background - - legend_w2_reco_eec->AddEntry(h_eec_l1_l2, "w/ CR", "l"); - legend_w2_reco_eec->AddEntry(h_eec_l1_l2_noCR, "no CR", "l"); - legend_w2_reco_eec->Draw(); - - TCanvas* c_eec_reco_ratio = new TCanvas("c_eec_reco_ratio", "Reco Ratio", 1500, 600); - - c_eec_reco_ratio->cd(); - TH1D* h_CR_noCR_c_l0 = (TH1D*)h_eec_c_l0->Clone("h_CR_noCR_c_l0"); - h_CR_noCR_c_l0->Divide(h_eec_c_l0_noCR); - - TH1D* h_CR_noCR_l1_l2 = (TH1D*)h_eec_l1_l2->Clone("h_CR_noCR_l1_l2"); - h_CR_noCR_l1_l2->Divide(h_eec_l1_l2_noCR); - - h_CR_noCR_c_l0->Draw("HIST"); - h_CR_noCR_c_l0->SetLineColor(kRed); - h_CR_noCR_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_CR_noCR_c_l0->GetYaxis()->SetTitle("Ratio: no CR / CR"); - - h_CR_noCR_l1_l2->Draw("HIST same"); - h_CR_noCR_l1_l2->SetLineColor(kBlue); - - TLegend *legend_CR_noCR_reco_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_CR_noCR_reco_ratio->SetTextSize(0.04); - legend_CR_noCR_reco_ratio->SetBorderSize(0); - legend_CR_noCR_reco_ratio->SetFillStyle(0); // Transparent background - - legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_c_l0, "w/ CR", "l"); - legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_l1_l2, "no CR", "l"); - legend_CR_noCR_reco_ratio->Draw(); - - - c_W1_W2_mass->Write(); - c_W1_W2_p->Write(); - c_W1_W2_e->Write(); - c_delta_phi_truth->Write(); - c_delta_phi_reco->Write(); - c_cos_phi_truth->Write(); - c_cos_phi_reco->Write(); - c_eec_truth->Write(); - c_eec_truth_ratio->Write(); - c_eec_reco->Write(); - c_eec_reco_ratio->Write(); - - Plots_WWCR->Write(); - Plots_WWCR->Close(); -} \ No newline at end of file From dd0b1fb72c63f4331976f6d515a14009b71d57db Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 16 Jul 2025 11:44:52 -0400 Subject: [PATCH 17/40] commiting before merging branches --- PostCutCode/Root/AnalysisWWCR.cxx | 72 +- PostCutCode/Root/Plots_AnalysisWWCR.cxx | 863 ++++++++++++------------ 2 files changed, 455 insertions(+), 480 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index a59b4fc..50207f3 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -1,4 +1,5 @@ // Local includes +#include // for std::exit #include "PostCutCode/AnalysisWWCR.h" #include "PostCutCode/TreeContainer.h" #include @@ -12,7 +13,6 @@ #include using namespace std; -using namespace ROOT::VecOps; // Base class AnalysisWWCR::AnalysisWWCR(): @@ -215,7 +215,6 @@ void AnalysisWWCR::run() { // Jet Constituents varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; - varMember>> jetconstituents_kt4_PID {tree, "jetconstituents_kt4_PID"}; varMember>> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; varMember>> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; varMember>> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; @@ -312,10 +311,10 @@ void AnalysisWWCR::run() { NokFlav++; // cut on the number of electrons - if (event_nmu() > 2.) continue; - if (event_nel() > 2.) continue; - if (muons_p() > 20.) continue; - if (elecrons_p() > 20.) continue; + // if (event_nmu() > 2.) continue; + // if (event_nel() > 2.) continue; + // if (muons_p() > 20.) continue; + // if (elecrons_p() > 20.) continue; NleptonCut++; @@ -435,45 +434,36 @@ void AnalysisWWCR::run() { // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up + // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. + for (int i = 0; i < jetconstituents_kt4.size(); ++i){ + std::cout << "instance i: " << i<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; + if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ + std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; + std::exit(EXIT_FAILURE); + } + for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ + // jetconstituents_kt4_p.at(i).at(k) + std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + float p = jetconstituents_kt4_p.at(i).at(k); + float theta = jetconstituents_kt4_theta.at(i).at(k); + float phi = jetconstituents_kt4_phi.at(i).at(k); + float e = jetconstituents_kt4_e.at(i).at(k); - // for (int j = 0; j < jetconstituents_kt4.size(); ++j){ - // for (int k = 0; k < jetconstituents_kt4.size(); ++k){ - - // } - // } - - for (int j = 0; j < jetconstituents_kt4_p.size(); ++j) { - for (size_t k = 0; k < jetconstituents_kt4_p.at(k).size(); ++k) { - - // std::cout << "jetconstituents_kt4_p.size(): " << jetconstituents_kt4_p.size() << std::endl; - // std::cout << "jetconstituents_kt4_e.size(): " << jetconstituents_kt4_e.size() << std::endl; - // std::cout << "jetconstituents_kt4_theta.size(): " << jetconstituents_kt4_theta.size() << std::endl; - // std::cout << "jetconstituents_kt4_phi.size(): " << jetconstituents_kt4_phi.size() << std::endl; - - float p = jetconstituents_kt4_p.at(j).at(k); - float theta = jetconstituents_kt4_theta.at(j).at(k); - float phi = jetconstituents_kt4_phi.at(j).at(k); - float e = jetconstituents_kt4_e.at(j).at(k); - // // if (k < 10) { - // // std::cout << " Constituent k: " << k << std::endl; - // // std::cout << " p: " << p << ", theta: " << theta << ", phi: " << phi << ", e: " << e << std::endl; - // // } + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // // float p = jetconstituents_kt4_p[i][j]; - // // float theta = jetconstituents_kt4_theta[i][j]; - // // float phi = jetconstituents_kt4_phi[i][j]; - // // float e = jetconstituents_kt4_e[i][j]; + TLorentzVector vec; + vec.SetPxPyPzE(px, py, pz, e); - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); + jetConstituents.push_back(vec); // if needed for individual constituents - // TLorentzVector vec; - // vec.SetPxPyPzE(px, py, pz, e); - // jetConstituents.push_back(vec); // if needed for individual constituents - } + } + + // } } @@ -693,6 +683,4 @@ void AnalysisWWCR::run() { std::cout << "Let there be data :)" << std::endl; // end of macro -} - - +} \ No newline at end of file diff --git a/PostCutCode/Root/Plots_AnalysisWWCR.cxx b/PostCutCode/Root/Plots_AnalysisWWCR.cxx index a144d8f..ef4ac72 100644 --- a/PostCutCode/Root/Plots_AnalysisWWCR.cxx +++ b/PostCutCode/Root/Plots_AnalysisWWCR.cxx @@ -47,6 +47,21 @@ void Plots_AnalysisWWCR() { TH1F *h_W1_e = (TH1F*)test_CR->Get("Nominal/h_W1_e_WW"); TH1F *h_W2_e = (TH1F*)test_CR->Get("Nominal/h_W2_e_WW"); + TH1F *h_theta_truth_cs = (TH1F*)test_CR->Get("Nominal/h_theta_truth_cs_WW"); + TH1F *h_theta_truth_ud = (TH1F*)test_CR->Get("Nominal/h_theta_truth_ud_WW"); + TH1F *h_theta_c_l0 = (TH1F*)test_CR->Get("Nominal/h_theta_c_l0_WW"); + TH1F *h_theta_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_theta_l1_l2_WW"); + + TH1F *h_delta_theta_truth_cs = (TH1F*)test_CR->Get("Nominal/h_delta_theta_truth_cs_WW"); + TH1F *h_delta_theta_truth_ud = (TH1F*)test_CR->Get("Nominal/h_delta_theta_truth_ud_WW"); + TH1F *h_delta_theta_c_l0 = (TH1F*)test_CR->Get("Nominal/h_delta_theta_c_l0_WW"); + TH1F *h_delta_theta_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_delta_theta_l1_l2_WW"); + + TH1F *h_delta_eta_truth_cs = (TH1F*)test_CR->Get("Nominal/h_delta_eta_truth_cs_WW"); + TH1F *h_delta_eta_truth_ud = (TH1F*)test_CR->Get("Nominal/h_delta_eta_truth_ud_WW"); + TH1F *h_delta_eta_c_l0 = (TH1F*)test_CR->Get("Nominal/h_delta_eta_c_l0_WW"); + TH1F *h_delta_eta_l1_l2 = (TH1F*)test_CR->Get("Nominal/h_delta_eta_l1_l2_WW"); + TH1F *h_delta_phi_truth_cs = (TH1F*)test_CR->Get("Nominal/h_phi_truth_cs_WW"); TH1F *h_delta_phi_truth_ud = (TH1F*)test_CR->Get("Nominal/h_phi_truth_ud_WW"); TH1F *h_delta_phi_c_l0 = (TH1F*)test_CR->Get("Nominal/h_phi_c_l0_WW"); @@ -78,6 +93,21 @@ void Plots_AnalysisWWCR() { TH1F *h_W1_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W1_e_WW"); TH1F *h_W2_e_noCR = (TH1F*)test_noCR->Get("Nominal/h_W2_e_WW"); + TH1F *h_theta_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_theta_truth_cs_WW"); + TH1F *h_theta_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_theta_truth_ud_WW"); + TH1F *h_theta_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_theta_c_l0_WW"); + TH1F *h_theta_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_theta_l1_l2_WW"); + + TH1F *h_delta_theta_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_theta_truth_cs_WW"); + TH1F *h_delta_theta_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_theta_truth_ud_WW"); + TH1F *h_delta_theta_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_theta_c_l0_WW"); + TH1F *h_delta_theta_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_theta_l1_l2_WW"); + + TH1F *h_delta_eta_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_eta_truth_cs_WW"); + TH1F *h_delta_eta_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_eta_truth_ud_WW"); + TH1F *h_delta_eta_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_eta_c_l0_WW"); + TH1F *h_delta_eta_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_delta_eta_l1_l2_WW"); + TH1F *h_delta_phi_truth_cs_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_cs_WW"); TH1F *h_delta_phi_truth_ud_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_truth_ud_WW"); TH1F *h_delta_phi_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_phi_c_l0_WW"); @@ -93,446 +123,403 @@ void Plots_AnalysisWWCR() { TH1F *h_eec_c_l0_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_c_l0_WW"); TH1F *h_eec_l1_l2_noCR = (TH1F*)test_noCR->Get("Nominal/h_eec_l1_l2_WW"); - TFile *Plots_WWCR = new TFile("/usatlas/u/kleibensperger/FCCeePostCutCode/run/WWCR_Plots.root", "Recreate"); - // *************************** MASS PLOTS *************************** - TCanvas* c_W1_W2_mass = new TCanvas("c_W1_W2_mass", "Truth Histograms", 1500, 600); - c_W1_W2_mass->Divide(2, 1); - c_W1_W2_mass->SetWindowSize(1500, 600); // Window size in pixels - c_W1_W2_mass->SetCanvasSize(1500, 600); // Drawable area in pixels - - c_W1_W2_mass->cd(1); - h_W1_truth_mass->Draw(); - h_W1_truth_mass->SetLineColor(kBlue); - h_W1_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W1_mass->Draw("same"); - h_W1_mass->SetLineColor(kRed); - - TLegend *legend_w1_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_mass->SetTextSize(0.04); - legend_w1_mass->SetBorderSize(0); - legend_w1_mass->SetFillStyle(0); // Transparent background - - legend_w1_mass->AddEntry(h_W1_truth_mass, "w1_truth_mass", "l"); - legend_w1_mass->AddEntry(h_W1_mass, "w1_mass", "l"); - legend_w1_mass->Draw(); - - c_W1_W2_mass->cd(2); - h_W2_truth_mass->Draw(); - h_W2_truth_mass->SetLineColor(kBlue); - h_W2_truth_mass->GetXaxis()->SetTitle("GeV"); - - h_W2_mass->Draw("same"); - h_W2_mass->SetLineColor(kRed); - - TLegend *legend_w2_mass = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_mass->SetTextSize(0.04); - legend_w2_mass->SetBorderSize(0); - legend_w2_mass->SetFillStyle(0); // Transparent background - - legend_w2_mass->AddEntry(h_W2_truth_mass, "w2_truth_mass", "l"); - legend_w2_mass->AddEntry(h_W2_mass, "w2_mass", "l"); - legend_w2_mass->Draw(); - - // *************************** COMPARATIVE MOMENTA PLOTS *************************** - TCanvas* c_W1_W2_p = new TCanvas("c_W1_W2_p", "Truth Histograms", 1500, 600); - c_W1_W2_p->Divide(2, 1); - - c_W1_W2_p->cd(1); - h_W1_truth_p->Draw(); - h_W1_truth_p->SetLineColor(kBlue); - h_W1_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W1_p->Draw("same"); - h_W1_p->SetLineColor(kRed); - - TLegend *legend_w1_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_p->SetTextSize(0.04); - legend_w1_p->SetBorderSize(0); - legend_w1_p->SetFillStyle(0); // Transparent background - - legend_w1_p->AddEntry(h_W1_truth_p, "w1_truth_p", "l"); - legend_w1_p->AddEntry(h_W1_p, "w1_p", "l"); - legend_w1_p->Draw(); - - c_W1_W2_p->cd(2); - h_W2_truth_p->Draw(); - h_W2_truth_p->SetLineColor(kBlue); - h_W2_truth_p->GetXaxis()->SetTitle("GeV"); - - h_W2_p->Draw("same"); - h_W2_p->SetLineColor(kRed); - - TLegend *legend_w2_p = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_p->SetTextSize(0.04); - legend_w2_p->SetBorderSize(0); - legend_w2_p->SetFillStyle(0); // Transparent background - - legend_w2_p->AddEntry(h_W2_truth_p, "w2_truth_p", "l"); - legend_w2_p->AddEntry(h_W2_p, "w2_p", "l"); - legend_w2_p->Draw(); - - // *************************** COMPARATIVE ENERGY PLOTS *************************** - TCanvas* c_W1_W2_e = new TCanvas("c_W1_W2_e", "Truth Histograms", 1500, 600); - c_W1_W2_e->Divide(2, 1); - - c_W1_W2_e->cd(1); - h_W1_truth_e->Draw(); - h_W1_truth_e->SetLineColor(kBlue); - h_W1_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W1_e->Draw("same"); - h_W1_e->SetLineColor(kRed); - - TLegend *legend_w1_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_e->SetTextSize(0.04); - legend_w1_e->SetBorderSize(0); - legend_w1_e->SetFillStyle(0); // Transparent background - - legend_w1_e->AddEntry(h_W1_truth_e, "w1_truth_e", "l"); - legend_w1_e->AddEntry(h_W1_e, "w1_e", "l"); - legend_w1_e->Draw(); - - c_W1_W2_e->cd(2); - h_W2_truth_e->Draw(); - h_W2_truth_e->SetLineColor(kBlue); - h_W2_truth_e->GetXaxis()->SetTitle("GeV"); - - h_W2_e->Draw("same"); - h_W2_e->SetLineColor(kRed); - - TLegend *legend_w2_e = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_e->SetTextSize(0.04); - legend_w2_e->SetBorderSize(0); - legend_w2_e->SetFillStyle(0); // Transparent background - - legend_w2_e->AddEntry(h_W2_truth_e, "w2_truth_e", "l"); - legend_w2_e->AddEntry(h_W2_e, "w2_e", "l"); - legend_w2_e->Draw(); - - // *************************** DELTA PHI DISTRIBUTIONS *************************** - TCanvas* c_delta_phi_truth = new TCanvas("c_delta_phi_truth", "Truth Histograms", 1500, 600); - c_delta_phi_truth->Divide(2, 1); - - c_delta_phi_truth->cd(1); - h_delta_phi_truth_cs->Draw("HIST"); - h_delta_phi_truth_cs->SetLineColor(kBlue); - h_delta_phi_truth_cs->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_truth_cs->SetTitle("#Delta#phi: cs"); - - h_delta_phi_truth_cs_noCR->Draw("HIST same"); - h_delta_phi_truth_cs_noCR->SetLineColor(kRed); - - TLegend *legend_w1_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_delta_phi->SetTextSize(0.04); - legend_w1_truth_delta_phi->SetBorderSize(0); - legend_w1_truth_delta_phi->SetFillStyle(0); // Transparent background - - legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs, "#Delta#phi: cs (CR)", "l"); - legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs_noCR, "#Delta#phi: cs (no CR)", "l"); - legend_w1_truth_delta_phi->Draw(); - - c_delta_phi_truth->cd(2); - h_delta_phi_truth_ud->Draw("HIST"); - h_delta_phi_truth_ud->SetLineColor(kBlue); - h_delta_phi_truth_ud->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_truth_ud->SetTitle("#Delta#phi: ud"); - - h_delta_phi_truth_ud_noCR->Draw("HIST same"); - h_delta_phi_truth_ud_noCR->SetLineColor(kRed); - - TLegend *legend_w2_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_delta_phi->SetTextSize(0.04); - legend_w2_truth_delta_phi->SetBorderSize(0); - legend_w2_truth_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud, "#Delta#phi: ud (CR)", "l"); - legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud_noCR, "#Delta#phi: ud (no CR)", "l"); - legend_w2_truth_delta_phi->Draw(); - - - TCanvas* c_delta_phi_reco = new TCanvas("c_delta_phi_reco", "Reco Histograms", 1500, 600); - c_delta_phi_reco->Divide(2, 1); - - c_delta_phi_reco->cd(1); - h_delta_phi_c_l0->Draw("HIST"); - h_delta_phi_c_l0->SetLineColor(kBlue); - h_delta_phi_c_l0->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_c_l0->SetTitle("#Delta#phi: W1 #rightarrow c q0"); - - h_delta_phi_c_l0_noCR->Draw("HIST same"); - h_delta_phi_c_l0_noCR->SetLineColor(kRed); - - TLegend *legend_w1_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_delta_phi->SetTextSize(0.04); - legend_w1_reco_delta_phi->SetBorderSize(0); - legend_w1_reco_delta_phi->SetFillStyle(0); // Transparent background - - legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0, "#Delta#phi (CR)", "l"); - legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0_noCR, "#Delta#phi (no CR)", "l"); - legend_w1_reco_delta_phi->Draw(); - - c_delta_phi_reco->cd(2); - h_delta_phi_l1_l2->Draw("HIST"); - h_delta_phi_l1_l2->SetLineColor(kBlue); - h_delta_phi_l1_l2->GetXaxis()->SetTitle("#Delta#phi"); - h_delta_phi_l1_l2->SetTitle("#Delta#phi: W2 #rightarrow q1 q2"); - - h_delta_phi_l1_l2_noCR->Draw("HIST same"); - h_delta_phi_l1_l2_noCR->SetLineColor(kRed); - - TLegend *legend_w2_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_reco_delta_phi->SetTextSize(0.04); - legend_w2_reco_delta_phi->SetBorderSize(0); - legend_w2_reco_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2, "#Delta#phi (CR)", "l"); - legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "#Delta#phi (no CR)", "l"); - legend_w2_reco_delta_phi->Draw(); - - // ****************************** COS(PHI) DISTRIBUTIONS ****************************** - TCanvas* c_cos_phi_truth = new TCanvas("c_cos_phi_truth", "Truth Histograms", 1500, 600); - c_cos_phi_truth->Divide(2, 1); - - c_cos_phi_truth->cd(1); - h_cos_phi_truth_cs->Draw("HIST"); - h_cos_phi_truth_cs->SetLineColor(kBlue); - h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_truth_cs->SetTitle("cos(#phi): cs"); - - h_cos_phi_truth_cs_noCR->Draw("HIST same"); - h_cos_phi_truth_cs_noCR->SetLineColor(kRed); - - TLegend *legend_w1_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_cos_phi->SetTextSize(0.04); - legend_w1_truth_cos_phi->SetBorderSize(0); - legend_w1_truth_cos_phi->SetFillStyle(0); // Transparent background - - legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs, "cos(#phi): cs (CR)", "l"); - legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs_noCR, "cos(#phi): cs (no CR)", "l"); - legend_w1_truth_cos_phi->Draw(); - - c_cos_phi_truth->cd(2); - h_cos_phi_truth_ud->Draw("HIST"); - h_cos_phi_truth_ud->SetLineColor(kBlue); - h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_truth_ud->SetTitle("cos(#phi): ud"); - - h_cos_phi_truth_ud_noCR->Draw("HIST same"); - h_cos_phi_truth_ud_noCR->SetLineColor(kRed); - - TLegend *legend_w2_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_cos_phi->SetTextSize(0.04); - legend_w2_truth_cos_phi->SetBorderSize(0); - legend_w2_truth_cos_phi->SetFillStyle(0); // Transparent background - - legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud, "cos(#phi): ud (CR)", "l"); - legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud_noCR, "cos(#phi): ud (no CR)", "l"); - legend_w2_truth_cos_phi->Draw(); - - - TCanvas* c_cos_phi_reco = new TCanvas("c_cos_phi_reco", "Reco Histograms", 1500, 600); - c_cos_phi_reco->Divide(2, 1); - - c_cos_phi_reco->cd(1); - h_cos_phi_c_l0->Draw("HIST"); - h_cos_phi_c_l0->SetLineColor(kBlue); - h_cos_phi_c_l0->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_c_l0->SetTitle("cos(#phi): W1 #rightarrow c q0"); - - h_cos_phi_c_l0_noCR->Draw("HIST same"); - h_cos_phi_c_l0_noCR->SetLineColor(kRed); - - TLegend *legend_w1_reco_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_cos_phi->SetTextSize(0.04); - legend_w1_reco_cos_phi->SetBorderSize(0); - legend_w1_reco_cos_phi->SetFillStyle(0); // Transparent background - - legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0, "cos(#phi) (CR)", "l"); - legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0_noCR, "cos(#phi) (no CR)", "l"); - legend_w1_reco_cos_phi->Draw(); - - c_cos_phi_reco->cd(2); - h_cos_phi_l1_l2->Draw("HIST"); - h_cos_phi_l1_l2->SetLineColor(kBlue); - h_cos_phi_l1_l2->GetXaxis()->SetTitle("cos(#phi)"); - h_cos_phi_l1_l2->SetTitle("cos(#phi): W2 #rightarrow q1 q2"); - - h_cos_phi_l1_l2_noCR->Draw("HIST same"); - h_cos_phi_l1_l2_noCR->SetLineColor(kRed); - - TLegend *legend_w2_cos_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_cos_delta_phi->SetTextSize(0.04); - legend_w2_cos_delta_phi->SetBorderSize(0); - legend_w2_cos_delta_phi->SetFillStyle(0); // Transparent background - - legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2, "cos(#phi) (CR)", "l"); - legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "cos(#phi) (no CR)", "l"); - legend_w2_cos_delta_phi->Draw(); - - // ****************************** E-E CORRELATORS DISTRIBUTIONS ****************************** - TCanvas* c_eec_truth = new TCanvas("c_eec_truth", "Truth Histograms", 1500, 600); - c_eec_truth->Divide(2, 1); - - c_eec_truth->cd(1); - h_eec_truth_cs->Draw("HIST"); - h_eec_truth_cs->SetLineColor(kBlue); - h_eec_truth_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_truth_cs->SetTitle("e-e correlator: cs"); - h_eec_truth_cs->Rebin(2); - h_eec_truth_cs->Scale(1.0 / h_eec_truth_cs->Integral()); - - h_eec_truth_cs_noCR->Draw("HIST same"); - h_eec_truth_cs_noCR->SetLineColor(kRed); - h_eec_truth_cs_noCR->Rebin(2); - h_eec_truth_cs_noCR->Scale(1.0 / h_eec_truth_cs_noCR->Integral()); - - TLegend *legend_w1_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_truth_eec->SetTextSize(0.04); - legend_w1_truth_eec->SetBorderSize(0); - legend_w1_truth_eec->SetFillStyle(0); // Transparent background - - legend_w1_truth_eec->AddEntry(h_eec_truth_cs, "w/ CR", "l"); - legend_w1_truth_eec->AddEntry(h_eec_truth_cs_noCR, "no CR", "l"); - legend_w1_truth_eec->Draw(); - - c_eec_truth->cd(2); - h_eec_truth_ud->Draw("HIST"); - h_eec_truth_ud->SetLineColor(kBlue); - h_eec_truth_ud->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_truth_ud->SetTitle("e-e correlator: ud"); - h_eec_truth_ud->Rebin(2); - h_eec_truth_ud->Scale(1.0 / h_eec_truth_ud->Integral()); - - h_eec_truth_ud_noCR->Draw("HIST same"); - h_eec_truth_ud_noCR->SetLineColor(kRed); - h_eec_truth_ud_noCR->Rebin(2); - h_eec_truth_ud_noCR->Scale(1.0 / h_eec_truth_ud_noCR->Integral()); - - TLegend *legend_w2_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_truth_eec->SetTextSize(0.04); - legend_w2_truth_eec->SetBorderSize(0); - legend_w2_truth_eec->SetFillStyle(0); // Transparent background - - legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud, "w/ CR", "l"); - legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud_noCR, "no CR", "l"); - legend_w2_truth_eec->Draw(); - - TCanvas* c_eec_truth_ratio = new TCanvas("c_eec_truth_ratio", "Truth Ratio", 1500, 600); - - c_eec_truth_ratio->cd(); - TH1D* h_CR_noCR_cs = (TH1D*)h_eec_truth_cs->Clone("h_CR_noCR_cs"); - h_CR_noCR_cs->Divide(h_eec_truth_cs_noCR); - - TH1D* h_CR_noCR_ud = (TH1D*)h_eec_truth_ud->Clone("h_CR_noCR_ud"); - h_CR_noCR_ud->Divide(h_eec_truth_ud_noCR); - - h_CR_noCR_cs->Draw("HIST"); - h_CR_noCR_cs->SetLineColor(kRed); - h_CR_noCR_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_CR_noCR_cs->GetYaxis()->SetTitle("Ratio: no CR / CR"); - - h_CR_noCR_ud->Draw("HIST same"); - h_CR_noCR_ud->SetLineColor(kBlue); - - TLegend *legend_CR_noCR_truth_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_CR_noCR_truth_ratio->SetTextSize(0.04); - legend_CR_noCR_truth_ratio->SetBorderSize(0); - legend_CR_noCR_truth_ratio->SetFillStyle(0); // Transparent background - - legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_cs, "w/ CR", "l"); - legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_ud, "no CR", "l"); - legend_CR_noCR_truth_ratio->Draw(); - - - - TCanvas* c_eec_reco = new TCanvas("c_eec_reco", "Reco Histograms", 1500, 600); - c_eec_reco->Divide(2, 1); - - c_eec_reco->cd(1); - h_eec_c_l0->Draw("HIST"); - h_eec_c_l0->SetLineColor(kBlue); - h_eec_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_c_l0->SetTitle("e-e correlator: W1 #rightarrow c q0"); - h_eec_c_l0->Rebin(2); - h_eec_c_l0->Scale(1.0 / h_eec_c_l0->Integral()); - - h_eec_c_l0_noCR->Draw("HIST same"); - h_eec_c_l0_noCR->SetLineColor(kRed); - h_eec_c_l0_noCR->Rebin(2); - h_eec_c_l0_noCR->Scale(1.0 / h_eec_c_l0_noCR->Integral()); - - TLegend *legend_w1_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w1_reco_eec->SetTextSize(0.04); - legend_w1_reco_eec->SetBorderSize(0); - legend_w1_reco_eec->SetFillStyle(0); // Transparent background - - legend_w1_reco_eec->AddEntry(h_eec_c_l0, "w/ CR", "l"); - legend_w1_reco_eec->AddEntry(h_eec_c_l0_noCR, "no CR", "l"); - legend_w1_reco_eec->Draw(); - - c_eec_reco->cd(2); - h_eec_l1_l2->Draw("HIST"); - h_eec_l1_l2->SetLineColor(kBlue); - h_eec_l1_l2->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_eec_l1_l2->SetTitle("e-e correlator: W2 #rightarrow q1 q2"); - h_eec_l1_l2->Rebin(2); - h_eec_l1_l2->Scale(1.0 / h_eec_l1_l2->Integral()); - - h_eec_l1_l2_noCR->Draw("HIST same"); - h_eec_l1_l2_noCR->SetLineColor(kRed); - h_eec_l1_l2_noCR->Rebin(2); - h_eec_l1_l2_noCR->Scale(1.0 / h_eec_l1_l2_noCR->Integral()); - - TLegend *legend_w2_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_w2_reco_eec->SetTextSize(0.04); - legend_w2_reco_eec->SetBorderSize(0); - legend_w2_reco_eec->SetFillStyle(0); // Transparent background - - legend_w2_reco_eec->AddEntry(h_eec_l1_l2, "w/ CR", "l"); - legend_w2_reco_eec->AddEntry(h_eec_l1_l2_noCR, "no CR", "l"); - legend_w2_reco_eec->Draw(); - - TCanvas* c_eec_reco_ratio = new TCanvas("c_eec_reco_ratio", "Reco Ratio", 1500, 600); - - c_eec_reco_ratio->cd(); - TH1D* h_CR_noCR_c_l0 = (TH1D*)h_eec_c_l0->Clone("h_CR_noCR_c_l0"); - h_CR_noCR_c_l0->Divide(h_eec_c_l0_noCR); - - TH1D* h_CR_noCR_l1_l2 = (TH1D*)h_eec_l1_l2->Clone("h_CR_noCR_l1_l2"); - h_CR_noCR_l1_l2->Divide(h_eec_l1_l2_noCR); - - h_CR_noCR_c_l0->Draw("HIST"); - h_CR_noCR_c_l0->SetLineColor(kRed); - h_CR_noCR_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); - h_CR_noCR_c_l0->GetYaxis()->SetTitle("Ratio: no CR / CR"); - - h_CR_noCR_l1_l2->Draw("HIST same"); - h_CR_noCR_l1_l2->SetLineColor(kBlue); - - TLegend *legend_CR_noCR_reco_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); - legend_CR_noCR_reco_ratio->SetTextSize(0.04); - legend_CR_noCR_reco_ratio->SetBorderSize(0); - legend_CR_noCR_reco_ratio->SetFillStyle(0); // Transparent background - - legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_c_l0, "w/ CR", "l"); - legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_l1_l2, "no CR", "l"); - legend_CR_noCR_reco_ratio->Draw(); - - - c_W1_W2_mass->Write(); - c_W1_W2_p->Write(); - c_W1_W2_e->Write(); - c_delta_phi_truth->Write(); - c_delta_phi_reco->Write(); - c_cos_phi_truth->Write(); - c_cos_phi_reco->Write(); - c_eec_truth->Write(); - c_eec_truth_ratio->Write(); - c_eec_reco->Write(); - c_eec_reco_ratio->Write(); + // *************************** THETA DISTRIBUTIONS *************************** + TCanvas* c_theta_truth = new TCanvas("c_theta_truth", "Truth Histograms", 1500, 600); + c_theta_truth->Divide(2, 1); + + c_theta_truth->cd(1); + h_theta_truth_cs->Draw("HIST P"); + h_theta_truth_cs->SetMarkerStyle(20); + h_theta_truth_cs->SetMarkerColor(kBlue); + h_theta_truth_cs->SetMarkerSize(0.8); + h_theta_truth_cs->GetXaxis()->SetTitle("#theta"); + h_theta_truth_cs->SetTitle("#theta: W1 #rightarrow cs"); + h_theta_truth_cs->Rebin(2); + h_theta_truth_cs->Scale(1.0 / h_theta_truth_cs->Integral()); + + h_theta_truth_cs_noCR->Draw("HIST P same"); + h_theta_truth_cs_noCR->SetMarkerStyle(21); + h_theta_truth_cs_noCR->SetMarkerColor(kRed); + h_theta_truth_cs_noCR->SetMarkerSize(0.8); + h_theta_truth_cs_noCR->Rebin(2); + h_theta_truth_cs_noCR->Scale(1.0 / h_theta_truth_cs_noCR->Integral()); + + c_theta_truth->cd(2); + h_theta_truth_ud->Draw("HIST P"); + h_theta_truth_ud->SetMarkerStyle(20); + h_theta_truth_ud->SetMarkerColor(kBlue); + h_theta_truth_ud->SetMarkerSize(0.7); + h_theta_truth_ud->GetXaxis()->SetTitle("#theta"); + h_theta_truth_ud->SetTitle("#theta: W2 #rightarrow ud"); + h_theta_truth_ud->Rebin(2); + h_theta_truth_ud->Scale(1.0 / h_theta_truth_ud->Integral()); + + h_theta_truth_ud_noCR->Draw("HIST P same"); + h_theta_truth_ud_noCR->SetMarkerStyle(21); + h_theta_truth_ud_noCR->SetMarkerColor(kRed); + h_theta_truth_ud_noCR->SetMarkerSize(0.7); + h_theta_truth_ud_noCR->Rebin(2); + h_theta_truth_ud_noCR->Scale(1.0 / h_theta_truth_ud_noCR->Integral()); + + + TCanvas* c_theta_reco = new TCanvas("c_theta_reco", "Reconstructed Histograms", 1500, 600); + c_theta_reco->Divide(2, 1); + + c_theta_reco->cd(1); + h_theta_c_l0->Draw("HIST P"); + h_theta_c_l0->SetMarkerStyle(20); + h_theta_c_l0->SetMarkerColor(kBlue); + h_theta_c_l0->SetMarkerSize(0.8); + h_theta_c_l0->GetXaxis()->SetTitle("#theta"); + h_theta_c_l0->SetTitle("#theta: W1 #rightarrow c #q_0"); + h_theta_c_l0->Rebin(2); + h_theta_c_l0->Scale(1.0 / h_theta_c_l0->Integral()); + + h_theta_c_l0_noCR->Draw("HIST P same"); + h_theta_c_l0_noCR->SetMarkerStyle(21); + h_theta_c_l0_noCR->SetMarkerColor(kRed); + h_theta_c_l0_noCR->SetMarkerSize(0.7); + h_theta_c_l0_noCR->Rebin(2); + h_theta_c_l0_noCR->Scale(1.0 / h_theta_c_l0_noCR->Integral()); + + c_theta_reco->cd(2); + h_theta_l1_l2->Draw("HIST P"); + h_theta_l1_l2->SetMarkerStyle(20); + h_theta_l1_l2->SetMarkerColor(kBlue); + h_theta_l1_l2->SetMarkerSize(0.8); + h_theta_l1_l2->GetXaxis()->SetTitle("#theta"); + h_theta_l1_l2->SetTitle("#theta: W2 #rightarrow #q_1 #q_2"); + h_theta_l1_l2->Rebin(2); + h_theta_l1_l2->Scale(1.0 / h_theta_l1_l2->Integral()); + + h_theta_l1_l2_noCR->Draw("HIST P same"); + h_theta_l1_l2_noCR->SetMarkerStyle(21); + h_theta_l1_l2_noCR->SetMarkerColor(kRed); + h_theta_l1_l2_noCR->SetMarkerSize(0.7); + h_theta_l1_l2_noCR->Rebin(2); + h_theta_l1_l2_noCR->Scale(1.0 / h_theta_l1_l2_noCR->Integral()); + + // // *************************** DELTA PHI DISTRIBUTIONS *************************** + // TCanvas* c_delta_phi_truth = new TCanvas("c_delta_phi_truth", "Truth Histograms", 1500, 600); + // c_delta_phi_truth->Divide(2, 1); + + // c_delta_phi_truth->cd(1); + // h_delta_phi_truth_cs->Draw("HIST"); + // h_delta_phi_truth_cs->SetLineColor(kBlue); + // h_delta_phi_truth_cs->GetXaxis()->SetTitle("#Delta#phi"); + // h_delta_phi_truth_cs->SetTitle("#Delta#phi: cs"); + + // h_delta_phi_truth_cs_noCR->Draw("HIST same"); + // h_delta_phi_truth_cs_noCR->SetLineColor(kRed); + + // TLegend *legend_w1_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_truth_delta_phi->SetTextSize(0.04); + // legend_w1_truth_delta_phi->SetBorderSize(0); + // legend_w1_truth_delta_phi->SetFillStyle(0); // Transparent background + + // legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs, "#Delta#phi: cs (CR)", "l"); + // legend_w1_truth_delta_phi->AddEntry(h_delta_phi_truth_cs_noCR, "#Delta#phi: cs (no CR)", "l"); + // legend_w1_truth_delta_phi->Draw(); + + // c_delta_phi_truth->cd(2); + // h_delta_phi_truth_ud->Draw("HIST"); + // h_delta_phi_truth_ud->SetLineColor(kBlue); + // h_delta_phi_truth_ud->GetXaxis()->SetTitle("#Delta#phi"); + // h_delta_phi_truth_ud->SetTitle("#Delta#phi: ud"); + + // h_delta_phi_truth_ud_noCR->Draw("HIST same"); + // h_delta_phi_truth_ud_noCR->SetLineColor(kRed); + + // TLegend *legend_w2_truth_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_truth_delta_phi->SetTextSize(0.04); + // legend_w2_truth_delta_phi->SetBorderSize(0); + // legend_w2_truth_delta_phi->SetFillStyle(0); // Transparent background + + // legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud, "#Delta#phi: ud (CR)", "l"); + // legend_w2_truth_delta_phi->AddEntry(h_delta_phi_truth_ud_noCR, "#Delta#phi: ud (no CR)", "l"); + // legend_w2_truth_delta_phi->Draw(); + + + // TCanvas* c_delta_phi_reco = new TCanvas("c_delta_phi_reco", "Reco Histograms", 1500, 600); + // c_delta_phi_reco->Divide(2, 1); + + // c_delta_phi_reco->cd(1); + // h_delta_phi_c_l0->Draw("HIST"); + // h_delta_phi_c_l0->SetLineColor(kBlue); + // h_delta_phi_c_l0->GetXaxis()->SetTitle("#Delta#phi"); + // h_delta_phi_c_l0->SetTitle("#Delta#phi: W1 #rightarrow c q0"); + + // h_delta_phi_c_l0_noCR->Draw("HIST same"); + // h_delta_phi_c_l0_noCR->SetLineColor(kRed); + + // TLegend *legend_w1_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_reco_delta_phi->SetTextSize(0.04); + // legend_w1_reco_delta_phi->SetBorderSize(0); + // legend_w1_reco_delta_phi->SetFillStyle(0); // Transparent background + + // legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0, "#Delta#phi (CR)", "l"); + // legend_w1_reco_delta_phi->AddEntry(h_delta_phi_c_l0_noCR, "#Delta#phi (no CR)", "l"); + // legend_w1_reco_delta_phi->Draw(); + + // c_delta_phi_reco->cd(2); + // h_delta_phi_l1_l2->Draw("HIST"); + // h_delta_phi_l1_l2->SetLineColor(kBlue); + // h_delta_phi_l1_l2->GetXaxis()->SetTitle("#Delta#phi"); + // h_delta_phi_l1_l2->SetTitle("#Delta#phi: W2 #rightarrow q1 q2"); + + // h_delta_phi_l1_l2_noCR->Draw("HIST same"); + // h_delta_phi_l1_l2_noCR->SetLineColor(kRed); + + // TLegend *legend_w2_reco_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_reco_delta_phi->SetTextSize(0.04); + // legend_w2_reco_delta_phi->SetBorderSize(0); + // legend_w2_reco_delta_phi->SetFillStyle(0); // Transparent background + + // legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2, "#Delta#phi (CR)", "l"); + // legend_w2_reco_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "#Delta#phi (no CR)", "l"); + // legend_w2_reco_delta_phi->Draw(); + + // // ****************************** COS(PHI) DISTRIBUTIONS ****************************** + // TCanvas* c_cos_phi_truth = new TCanvas("c_cos_phi_truth", "Truth Histograms", 1500, 600); + // c_cos_phi_truth->Divide(2, 1); + + // c_cos_phi_truth->cd(1); + // h_cos_phi_truth_cs->Draw("HIST"); + // h_cos_phi_truth_cs->SetLineColor(kBlue); + // h_cos_phi_truth_cs->GetXaxis()->SetTitle("cos(#phi)"); + // h_cos_phi_truth_cs->SetTitle("cos(#phi): cs"); + + // h_cos_phi_truth_cs_noCR->Draw("HIST same"); + // h_cos_phi_truth_cs_noCR->SetLineColor(kRed); + + // TLegend *legend_w1_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_truth_cos_phi->SetTextSize(0.04); + // legend_w1_truth_cos_phi->SetBorderSize(0); + // legend_w1_truth_cos_phi->SetFillStyle(0); // Transparent background + + // legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs, "cos(#phi): cs (CR)", "l"); + // legend_w1_truth_cos_phi->AddEntry(h_cos_phi_truth_cs_noCR, "cos(#phi): cs (no CR)", "l"); + // legend_w1_truth_cos_phi->Draw(); + + // c_cos_phi_truth->cd(2); + // h_cos_phi_truth_ud->Draw("HIST"); + // h_cos_phi_truth_ud->SetLineColor(kBlue); + // h_cos_phi_truth_ud->GetXaxis()->SetTitle("cos(#phi)"); + // h_cos_phi_truth_ud->SetTitle("cos(#phi): ud"); + + // h_cos_phi_truth_ud_noCR->Draw("HIST same"); + // h_cos_phi_truth_ud_noCR->SetLineColor(kRed); + + // TLegend *legend_w2_truth_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_truth_cos_phi->SetTextSize(0.04); + // legend_w2_truth_cos_phi->SetBorderSize(0); + // legend_w2_truth_cos_phi->SetFillStyle(0); // Transparent background + + // legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud, "cos(#phi): ud (CR)", "l"); + // legend_w2_truth_cos_phi->AddEntry(h_delta_phi_truth_ud_noCR, "cos(#phi): ud (no CR)", "l"); + // legend_w2_truth_cos_phi->Draw(); + + + // TCanvas* c_cos_phi_reco = new TCanvas("c_cos_phi_reco", "Reco Histograms", 1500, 600); + // c_cos_phi_reco->Divide(2, 1); + + // c_cos_phi_reco->cd(1); + // h_cos_phi_c_l0->Draw("HIST"); + // h_cos_phi_c_l0->SetLineColor(kBlue); + // h_cos_phi_c_l0->GetXaxis()->SetTitle("cos(#phi)"); + // h_cos_phi_c_l0->SetTitle("cos(#phi): W1 #rightarrow c q0"); + + // h_cos_phi_c_l0_noCR->Draw("HIST same"); + // h_cos_phi_c_l0_noCR->SetLineColor(kRed); + + // TLegend *legend_w1_reco_cos_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_reco_cos_phi->SetTextSize(0.04); + // legend_w1_reco_cos_phi->SetBorderSize(0); + // legend_w1_reco_cos_phi->SetFillStyle(0); // Transparent background + + // legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0, "cos(#phi) (CR)", "l"); + // legend_w1_reco_cos_phi->AddEntry(h_cos_phi_c_l0_noCR, "cos(#phi) (no CR)", "l"); + // legend_w1_reco_cos_phi->Draw(); + + // c_cos_phi_reco->cd(2); + // h_cos_phi_l1_l2->Draw("HIST"); + // h_cos_phi_l1_l2->SetLineColor(kBlue); + // h_cos_phi_l1_l2->GetXaxis()->SetTitle("cos(#phi)"); + // h_cos_phi_l1_l2->SetTitle("cos(#phi): W2 #rightarrow q1 q2"); + + // h_cos_phi_l1_l2_noCR->Draw("HIST same"); + // h_cos_phi_l1_l2_noCR->SetLineColor(kRed); + + // TLegend *legend_w2_cos_delta_phi = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_cos_delta_phi->SetTextSize(0.04); + // legend_w2_cos_delta_phi->SetBorderSize(0); + // legend_w2_cos_delta_phi->SetFillStyle(0); // Transparent background + + // legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2, "cos(#phi) (CR)", "l"); + // legend_w2_cos_delta_phi->AddEntry(h_delta_phi_l1_l2_noCR, "cos(#phi) (no CR)", "l"); + // legend_w2_cos_delta_phi->Draw(); + + // // ****************************** E-E CORRELATORS DISTRIBUTIONS ****************************** + // TCanvas* c_eec_truth = new TCanvas("c_eec_truth", "Truth Histograms", 1500, 600); + // c_eec_truth->Divide(2, 1); + + // c_eec_truth->cd(1); + // h_eec_truth_cs->Draw("HIST"); + // h_eec_truth_cs->SetLineColor(kBlue); + // h_eec_truth_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_eec_truth_cs->SetTitle("e-e correlator: cs"); + // h_eec_truth_cs->Rebin(2); + // h_eec_truth_cs->Scale(1.0 / h_eec_truth_cs->Integral()); + + // h_eec_truth_cs_noCR->Draw("HIST same"); + // h_eec_truth_cs_noCR->SetLineColor(kRed); + // h_eec_truth_cs_noCR->Rebin(2); + // h_eec_truth_cs_noCR->Scale(1.0 / h_eec_truth_cs_noCR->Integral()); + + // TLegend *legend_w1_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_truth_eec->SetTextSize(0.04); + // legend_w1_truth_eec->SetBorderSize(0); + // legend_w1_truth_eec->SetFillStyle(0); // Transparent background + + // legend_w1_truth_eec->AddEntry(h_eec_truth_cs, "w/ CR", "l"); + // legend_w1_truth_eec->AddEntry(h_eec_truth_cs_noCR, "no CR", "l"); + // legend_w1_truth_eec->Draw(); + + // c_eec_truth->cd(2); + // h_eec_truth_ud->Draw("HIST"); + // h_eec_truth_ud->SetLineColor(kBlue); + // h_eec_truth_ud->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_eec_truth_ud->SetTitle("e-e correlator: ud"); + // h_eec_truth_ud->Rebin(2); + // h_eec_truth_ud->Scale(1.0 / h_eec_truth_ud->Integral()); + + // h_eec_truth_ud_noCR->Draw("HIST same"); + // h_eec_truth_ud_noCR->SetLineColor(kRed); + // h_eec_truth_ud_noCR->Rebin(2); + // h_eec_truth_ud_noCR->Scale(1.0 / h_eec_truth_ud_noCR->Integral()); + + // TLegend *legend_w2_truth_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_truth_eec->SetTextSize(0.04); + // legend_w2_truth_eec->SetBorderSize(0); + // legend_w2_truth_eec->SetFillStyle(0); // Transparent background + + // legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud, "w/ CR", "l"); + // legend_w2_truth_eec->AddEntry(h_delta_phi_truth_ud_noCR, "no CR", "l"); + // legend_w2_truth_eec->Draw(); + + // TCanvas* c_eec_truth_ratio = new TCanvas("c_eec_truth_ratio", "Truth Ratio", 1500, 600); + + // c_eec_truth_ratio->cd(); + // TH1D* h_CR_noCR_cs = (TH1D*)h_eec_truth_cs->Clone("h_CR_noCR_cs"); + // h_CR_noCR_cs->Divide(h_eec_truth_cs_noCR); + + // TH1D* h_CR_noCR_ud = (TH1D*)h_eec_truth_ud->Clone("h_CR_noCR_ud"); + // h_CR_noCR_ud->Divide(h_eec_truth_ud_noCR); + + // h_CR_noCR_cs->Draw("HIST"); + // h_CR_noCR_cs->SetLineColor(kRed); + // h_CR_noCR_cs->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_CR_noCR_cs->GetYaxis()->SetTitle("Ratio: no CR / CR"); + + // h_CR_noCR_ud->Draw("HIST same"); + // h_CR_noCR_ud->SetLineColor(kBlue); + + // TLegend *legend_CR_noCR_truth_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_CR_noCR_truth_ratio->SetTextSize(0.04); + // legend_CR_noCR_truth_ratio->SetBorderSize(0); + // legend_CR_noCR_truth_ratio->SetFillStyle(0); // Transparent background + + // legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_cs, "w/ CR", "l"); + // legend_CR_noCR_truth_ratio->AddEntry(h_CR_noCR_ud, "no CR", "l"); + // legend_CR_noCR_truth_ratio->Draw(); + + + + // TCanvas* c_eec_reco = new TCanvas("c_eec_reco", "Reco Histograms", 1500, 600); + // c_eec_reco->Divide(2, 1); + + // c_eec_reco->cd(1); + // h_eec_c_l0->Draw("HIST"); + // h_eec_c_l0->SetLineColor(kBlue); + // h_eec_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_eec_c_l0->SetTitle("e-e correlator: W1 #rightarrow c q0"); + // h_eec_c_l0->Rebin(2); + // h_eec_c_l0->Scale(1.0 / h_eec_c_l0->Integral()); + + // h_eec_c_l0_noCR->Draw("HIST same"); + // h_eec_c_l0_noCR->SetLineColor(kRed); + // h_eec_c_l0_noCR->Rebin(2); + // h_eec_c_l0_noCR->Scale(1.0 / h_eec_c_l0_noCR->Integral()); + + // TLegend *legend_w1_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w1_reco_eec->SetTextSize(0.04); + // legend_w1_reco_eec->SetBorderSize(0); + // legend_w1_reco_eec->SetFillStyle(0); // Transparent background + + // legend_w1_reco_eec->AddEntry(h_eec_c_l0, "w/ CR", "l"); + // legend_w1_reco_eec->AddEntry(h_eec_c_l0_noCR, "no CR", "l"); + // legend_w1_reco_eec->Draw(); + + // c_eec_reco->cd(2); + // h_eec_l1_l2->Draw("HIST"); + // h_eec_l1_l2->SetLineColor(kBlue); + // h_eec_l1_l2->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_eec_l1_l2->SetTitle("e-e correlator: W2 #rightarrow q1 q2"); + // h_eec_l1_l2->Rebin(2); + // h_eec_l1_l2->Scale(1.0 / h_eec_l1_l2->Integral()); + + // h_eec_l1_l2_noCR->Draw("HIST same"); + // h_eec_l1_l2_noCR->SetLineColor(kRed); + // h_eec_l1_l2_noCR->Rebin(2); + // h_eec_l1_l2_noCR->Scale(1.0 / h_eec_l1_l2_noCR->Integral()); + + // TLegend *legend_w2_reco_eec = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_w2_reco_eec->SetTextSize(0.04); + // legend_w2_reco_eec->SetBorderSize(0); + // legend_w2_reco_eec->SetFillStyle(0); // Transparent background + + // legend_w2_reco_eec->AddEntry(h_eec_l1_l2, "w/ CR", "l"); + // legend_w2_reco_eec->AddEntry(h_eec_l1_l2_noCR, "no CR", "l"); + // legend_w2_reco_eec->Draw(); + + // TCanvas* c_eec_reco_ratio = new TCanvas("c_eec_reco_ratio", "Reco Ratio", 1500, 600); + + // c_eec_reco_ratio->cd(); + // TH1D* h_CR_noCR_c_l0 = (TH1D*)h_eec_c_l0->Clone("h_CR_noCR_c_l0"); + // h_CR_noCR_c_l0->Divide(h_eec_c_l0_noCR); + + // TH1D* h_CR_noCR_l1_l2 = (TH1D*)h_eec_l1_l2->Clone("h_CR_noCR_l1_l2"); + // h_CR_noCR_l1_l2->Divide(h_eec_l1_l2_noCR); + + // h_CR_noCR_c_l0->Draw("HIST"); + // h_CR_noCR_c_l0->SetLineColor(kRed); + // h_CR_noCR_c_l0->GetXaxis()->SetTitle("1 - cos(#phi)"); + // h_CR_noCR_c_l0->GetYaxis()->SetTitle("Ratio: no CR / CR"); + + // h_CR_noCR_l1_l2->Draw("HIST same"); + // h_CR_noCR_l1_l2->SetLineColor(kBlue); + + // TLegend *legend_CR_noCR_reco_ratio = new TLegend(0.6, 0.7, 0.8, 0.8); + // legend_CR_noCR_reco_ratio->SetTextSize(0.04); + // legend_CR_noCR_reco_ratio->SetBorderSize(0); + // legend_CR_noCR_reco_ratio->SetFillStyle(0); // Transparent background + + // legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_c_l0, "w/ CR", "l"); + // legend_CR_noCR_reco_ratio->AddEntry(h_CR_noCR_l1_l2, "no CR", "l"); + // legend_CR_noCR_reco_ratio->Draw(); + + c_theta_truth->Write(); + c_theta_reco->Write(); + // c_delta_phi_truth->Write(); + // c_delta_phi_reco->Write(); + // c_cos_phi_truth->Write(); + // c_cos_phi_reco->Write(); + // c_eec_truth->Write(); + // c_eec_truth_ratio->Write(); + // c_eec_reco->Write(); + // c_eec_reco_ratio->Write(); Plots_WWCR->Write(); Plots_WWCR->Close(); From 3878acb8cf8ed95a10025e3c9361134408d9dfb5 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 16 Jul 2025 14:20:58 -0400 Subject: [PATCH 18/40] modifications before merge --- .../AnalysisWWCR-checkpoint.cxx | 686 ++++++++++++++++++ 1 file changed, 686 insertions(+) create mode 100644 PostCutCode/Root/.ipynb_checkpoints/AnalysisWWCR-checkpoint.cxx diff --git a/PostCutCode/Root/.ipynb_checkpoints/AnalysisWWCR-checkpoint.cxx b/PostCutCode/Root/.ipynb_checkpoints/AnalysisWWCR-checkpoint.cxx new file mode 100644 index 0000000..50207f3 --- /dev/null +++ b/PostCutCode/Root/.ipynb_checkpoints/AnalysisWWCR-checkpoint.cxx @@ -0,0 +1,686 @@ +// Local includes +#include // for std::exit +#include "PostCutCode/AnalysisWWCR.h" +#include "PostCutCode/TreeContainer.h" +#include +#include +#include +#include +#include "TLorentzVector.h" +// #include "Root" + +#include "TH1F.h" +#include + +using namespace std; + +// Base class +AnalysisWWCR::AnalysisWWCR(): + AnalysisBase(), + m_debug(true) +{} +AnalysisWWCR::~AnalysisWWCR() +{} + +struct QuarkCounter { + int n_c = 0; + int n_s = 0; + int n_u = 0; + int n_d = 0; + int n_b = 0; + }; + +QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { + QuarkCounter counter; + + for (size_t i = 0; i < jet_truth->size(); ++i) { + int pdg_code = std::abs(jet_truth->at(i)); + + if (pdg_code == 5) counter.n_b++; + if (pdg_code == 4) counter.n_c++; + if (pdg_code == 3) counter.n_s++; + if (pdg_code == 2) counter.n_u++; + if (pdg_code == 1) counter.n_d++; + } + return counter; +} + +void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_theta, TH1F *hist_delta_theta, TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec) { + double theta = jet1.Angle(jet2.Vect()); + double delta_theta = jet1.Theta() - jet2.Theta(); + + double delta_eta = jet1.Eta() - jet2.Eta(); + double delta_phi = jet1.Phi() - jet2.Phi(); + double cos_phi = cos(delta_phi); + + double ee_correlator = 0.5 * (1 - cos_phi); + + hist_theta->Fill(theta); + hist_delta_theta->Fill(delta_theta); + hist_delta_eta->Fill(delta_eta); + hist_delta_phi->Fill(delta_phi); + hist_cosphi->Fill(cos_phi); + hist_eec->Fill(ee_correlator); +} + +void AnalysisWWCR::run() { + + std::vector cutFlowMap {"All Events", "DecayCuts", "NoNaNFlavScore", "Has 4 Jets", "leptonCut", "d123Cut", "d34Cut", "Events have a c, s, and 2 l tagged jets"}; + + // Get the histograms + auto countingHist = m_histContainer->getCountingHist(); + auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); + + // // ******************* TRUTH HISTOGRAMS ******************* + // auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); + // auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); + + // auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); + // auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); + + // auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); + // auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + + // auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); + // auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); + + // auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); + // auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); + + // // ******************* RECOJET HISTOGRAMS ******************* + // auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); + // auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + // auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); + + // auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + // auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + // auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + // auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + + // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + + // auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); + // auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); + + // auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); + // auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); + + // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); + // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); + // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); + // auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); + // auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); + + // auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); + // auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); + // auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); + // auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); + // auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); + // auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); + + // Get the trees + auto treeCont = std::make_shared(); + + // Get max events to run on + int nEntries = treeCont->getEventsToRun(); + + // Connect branches to trees + auto tree = treeCont->getTree(); + + // calls the branch_name (var_type branch {tree, "branch_name"};) + varMember event_njet {tree, "event_njet"}; + varMember event_nmu {tree, "event_nmu"}; + varMember event_nel {tree, "event_nel"}; + varMember muons_p {tree, "muons_p"}; + varMember elecrons_p {tree, "electrons_p"}; + varMember d_12 {tree, "d_12"}; + varMember d_23 {tree, "d_23"}; + varMember d_34 {tree, "d_34"}; + + // reconstructed jets (for flavor tagger score) + varMember> recojet_isB {tree, "recojet_isB"}; + varMember> recojet_isC {tree, "recojet_isC"}; + varMember> recojet_isS {tree, "recojet_isS"}; + varMember> recojet_isU {tree, "recojet_isU"}; + varMember> recojet_isD {tree, "recojet_isD"}; + varMember> recojet_isG {tree, "recojet_isG"}; + varMember> recojet_isTAU {tree, "recojet_isTAU"}; + + // truth information + varMember> truth_Wm_Daugthers_pdg {tree, "truth_Wm_Daugthers_pdg"}; + varMember> truth_Wp_Daugthers_pdg {tree, "truth_Wp_Daugthers_pdg"}; + + // For the new input file + varMember> jet_px {tree, "jet_px_corr"}; + varMember> jet_py {tree, "jet_py_corr"}; + varMember> jet_pz {tree, "jet_pz_corr"}; + varMember> jet_e {tree, "jet_e_corr"}; + + ROOT::VecOps::RVec* Wm_jet_truth = truth_Wm_Daugthers_pdg(); + ROOT::VecOps::RVec* Wp_jet_truth = truth_Wp_Daugthers_pdg(); + + varMember> truth_Wm_p {tree, "truth_Wm_Daugthers_p"}; + varMember> truth_Wm_e {tree, "truth_Wm_Daugthers_e"}; + varMember> truth_Wm_theta {tree, "truth_Wm_Daugthers_theta"}; + varMember> truth_Wm_phi {tree, "truth_Wm_Daugthers_phi"}; + + varMember> truth_Wp_p {tree, "truth_Wp_Daugthers_p"}; + varMember> truth_Wp_e {tree, "truth_Wp_Daugthers_e"}; + varMember> truth_Wp_theta {tree, "truth_Wp_Daugthers_theta"}; + varMember> truth_Wp_phi {tree, "truth_Wp_Daugthers_phi"}; + + // Jet Constituents + varMember> jetconstituents_kt4 {tree, "jetconstituents_kt4"}; + varMember>> jetconstituents_kt4_e {tree, "jetconstituents_kt4_e"}; + varMember>> jetconstituents_kt4_p {tree, "jetconstituents_kt4_p"}; + varMember>> jetconstituents_kt4_theta {tree, "jetconstituents_kt4_theta"}; + varMember>> jetconstituents_kt4_phi {tree, "jetconstituents_kt4_phi"}; + + // Increment for CutFlow + int NEvents = 0; + int NokFlav = 0; + int NjetCut = 0; + int NleptonCut = 0; + int eventNum = 1; + int nFlavScore = 0; + int NdCutd123 = 0; + int NdCutd34 = 0; + int NdecayCuts = 0; + + const int maxPrint = 5; + int nPrinted = 0; + bool do_debug = true; // Set to false to turn off all debug printing + + // *************************** SAME AS BELOW, LOOKING OVER THE MACRO STEP BY STEP *************************** + for(int i = 0; i < nEntries; i++) + { + treeCont->getEntry(i); + countingHist->Fill(1); + NEvents++; + + if(i % 10000 == 0) std::cout<<"Done i: "<size(); ++i) { + int pdg_code = Wm_jet_truth->at(i); + std::cout << "W_1 daughter " << i << " PDG code: " << pdg_code << std::endl; + } + + for (size_t i = 0; i < Wp_jet_truth->size(); ++i) { + int pdg_code = Wp_jet_truth->at(i); + std::cout << "W_2 daughter " << i << " PDG code: " << pdg_code << std::endl; + } + + std::cout << " " << std::endl; + + nPrinted++; + } + + eventNum++; + + if(event_njet() != 4) continue; + NjetCut++; + + bool flage_toss = false; + if (recojet_isB.size() == 0){ + flage_toss = true; + } + if (flage_toss) continue; + + float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); + float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); + float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); + float jet3_scoreQ = std::max({recojet_isU.at(3), recojet_isD.at(3), recojet_isS.at(3)}); + + std::vector j0_flav {recojet_isB.at(0), recojet_isC.at(0), jet0_scoreQ, recojet_isG.at(0), recojet_isTAU.at(0)}; + std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; + std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; + std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; + + for (float j0_f : j0_flav) { + if (std::isnan(j0_f)) { + flage_toss = true; + continue; + } + } + for (float j1_f : j1_flav) { + if (std::isnan(j1_f)) { + flage_toss = true; + continue; + } + } + for (float j2_f : j2_flav) { + if (std::isnan(j2_f)) { + flage_toss = true; + continue; + } + } + for (float j3_f : j3_flav) { + if (std::isnan(j3_f)) { + flage_toss = true; + continue; + } + } + + NokFlav++; + + // cut on the number of electrons + // if (event_nmu() > 2.) continue; + // if (event_nel() > 2.) continue; + // if (muons_p() > 20.) continue; + // if (elecrons_p() > 20.) continue; + + NleptonCut++; + + // if (d_12()<=15000. || d_12()>=58000.) continue;//missing! + // if ((d_23()<=400.) || (d_23()>=18000.))continue; + // NdCutd123++; + // if ((d_34()<=100.) || (d_34()>=6000.))continue; + // NdCutd34++; + + std::map> jetFlavScores; + jetFlavScores[0] = j0_flav; + jetFlavScores[1] = j1_flav; + jetFlavScores[2] = j2_flav; + jetFlavScores[3] = j3_flav; + + std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; + + if (do_debug && nPrinted < maxPrint) { + for (const auto& [jetIdx, flavVec] : jetFlavScores) { + std::cout << "Jet " << jetIdx << " flavor scores:\n"; + for (size_t i = 0; i < flavVec.size(); ++i) { + std::cout << " " << flavLabels[i] << ": "; + if (std::abs(flavVec[i]) < 1e-6) { + std::cout << std::scientific << std::setprecision(2) << flavVec[i]; + } else { + std::cout << std::fixed << std::setprecision(6) << flavVec[i]; + } + std::cout << "\n"; + } + std::cout << std::endl; + } + } + + // Get the max flavor scores + auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); + auto j1_MaxScoreIt = std::max_element(j1_flav.begin(), j1_flav.end()); + auto j2_MaxScoreIt = std::max_element(j2_flav.begin(), j2_flav.end()); + auto j3_MaxScoreIt = std::max_element(j3_flav.begin(), j3_flav.end()); + + int j0_maxScoreIdx = std::distance(j0_flav.begin(), j0_MaxScoreIt); + int j1_maxScoreIdx = std::distance(j1_flav.begin(), j1_MaxScoreIt); + int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); + int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); + + if (do_debug && nPrinted < maxPrint) { + std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; + std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; + std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; + std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; + std::cout << " " << std::endl; + } + + std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; + + if (nPrinted < maxPrint) { + std::cout << "maxScoreIdx: "; + for (int ScoreIdx : maxScoreIdx) { + std::cout << ScoreIdx << " "; + } + std::cout << std::endl; + std::cout << " " << std::endl; + } + + std::map> jetFlavMaxScore; + for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ + jetFlavMaxScore[maxScoreIdx[i]].push_back(i); + } + + int n_c = 0; + int n_l = 0; + // int n_b = 0; + + bool has_invalid_flavor = false; + + for (int i = 0; i < 4; ++i) { + if (maxScoreIdx[i] == 1) n_c++; + else if (maxScoreIdx[i] == 2) n_l++; + } + + if (has_invalid_flavor) continue; + + if (!(n_c == 1 && n_l == 3)) continue; + + nFlavScore++; + + // Start Pairing the jets in W1 and W2 + int cJet = -1; + std::vector lJets; + + for (int i = 0; i < 4; ++i) { + if (maxScoreIdx[i] == 1) cJet = i; + else if (maxScoreIdx[i] == 2) lJets.push_back(i); + } + + // Prevent jet reuse: ensure all jet indices are unique + std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; + + if (cJet == -1 || lJets.size() != 3 || uniqueJets.size() < 4) { + if (cJet == lJets[0] && cJet == lJets[1] && cJet == lJets[2] && + lJets[0] == lJets[1] && lJets[0] == lJets[2] && lJets[1] == lJets[2]) { + + std::cerr << "Error: Jet reuse detected or invalid jet assignment!" << std::endl; + continue; + + } + } + + // W pair 1: c + s and u+d + std::pair W1_pair = {cJet, lJets[0]}; + std::pair W2_pair = {lJets[1], lJets[2]}; + + if (do_debug && nPrinted < maxPrint) { + std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; + std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; + std::cout << " " << std::endl; + } + + // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** + std::vector jetConstituents; // flattens the overall vector and allows us to open it up + // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. + for (int i = 0; i < jetconstituents_kt4.size(); ++i){ + std::cout << "instance i: " << i<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; + if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ + std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; + std::exit(EXIT_FAILURE); + } + for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ + // jetconstituents_kt4_p.at(i).at(k) + std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + float p = jetconstituents_kt4_p.at(i).at(k); + float theta = jetconstituents_kt4_theta.at(i).at(k); + float phi = jetconstituents_kt4_phi.at(i).at(k); + float e = jetconstituents_kt4_e.at(i).at(k); + + + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); + + TLorentzVector vec; + vec.SetPxPyPzE(px, py, pz, e); + + jetConstituents.push_back(vec); // if needed for individual constituents + + + } + + // } + } + + + + + + // // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** + // std::vector truthJets_Wm, truthJets_Wp; + + // for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { + // float p = truth_Wm_p()->at(i); + // float e = truth_Wm_e()->at(i); + // float theta = truth_Wm_theta()->at(i); + // float phi = truth_Wm_phi()->at(i); + + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); + + // TLorentzVector lv; + + // lv.SetPxPyPzE(px, py, pz, e); + // truthJets_Wm.push_back(lv); + // } + + // for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { + // float p = truth_Wp_p()->at(i); + // float e = truth_Wp_e()->at(i); + // float theta = truth_Wp_theta()->at(i); + // float phi = truth_Wp_phi()->at(i); + + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); + + // TLorentzVector lv; + + // lv.SetPxPyPzE(px, py, pz, e); + // truthJets_Wp.push_back(lv); + // } + + // if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { + // TLorentzVector W1_jet1 = truthJets_Wm[0]; + // TLorentzVector W1_jet2 = truthJets_Wm[1]; + // TLorentzVector W2_jet1 = truthJets_Wp[0]; + // TLorentzVector W2_jet2 = truthJets_Wp[1]; + + // TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; + // TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; + + // h_W1_truth_mass->Fill(W1_truthJet.M()); + // h_W2_truth_mass->Fill(W2_truthJet.M()); + + // h_W1_truth_p->Fill(W1_truthJet.P()); + // h_W2_truth_p->Fill(W2_truthJet.P()); + + // h_W1_truth_e->Fill(W1_truthJet.E()); + // h_W2_truth_e->Fill(W2_truthJet.E()); + + // CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); + // CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); + + // double counts_eec_truth_cs = h_eec_truth_cs->Integral(); + // double counts_eec_truth_ud = h_eec_truth_ud->Integral(); + + // if (counts_eec_truth_cs > 0) + // h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); + + // if (counts_eec_truth_ud > 0) + // h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); + // } + + // // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** + // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + + // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + + // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); + + // const double m_W_true = 80.379; + + // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; + // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + + // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; + // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + + // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; + // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + + // double chi2_option1 = + // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); + + // double chi2_option2 = + // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); + + // double chi2_option3 = + // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + + // // for the cos(phi) angle + // TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; + + // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { + // h_W1_mass->Fill(W1_option1.M()); + // h_W2_mass->Fill(W2_option1.M()); + // h_chi2->Fill(chi2_option1); + + // h_W1_p->Fill(W1_option1.P()); + // h_W2_p->Fill(W2_option1.P()); + + // h_W1_e->Fill(W1_option1.E()); + // h_W2_e->Fill(W2_option1.E()); + + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); + + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_0; + + // W2_j1 = lTag_Jet_1; + // W2_j2 = lTag_Jet_2; + + // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { + // h_W1_mass->Fill(W1_option2.M()); + // h_W2_mass->Fill(W2_option2.M()); + // h_chi2->Fill(chi2_option2); + + // h_W1_p->Fill(W1_option2.P()); + // h_W2_p->Fill(W2_option2.P()); + + // h_W1_e->Fill(W1_option2.E()); + // h_W2_e->Fill(W2_option2.E()); + + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); + + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_1; + + // W2_j1 = lTag_Jet_0; + // W2_j2 = lTag_Jet_2; + + // } else { + // h_W1_mass->Fill(W1_option3.M()); + // h_W2_mass->Fill(W2_option3.M()); + // h_chi2->Fill(chi2_option3); + + // h_W1_p->Fill(W1_option3.P()); + // h_W2_p->Fill(W2_option3.P()); + + // h_W1_e->Fill(W1_option3.E()); + // h_W2_e->Fill(W2_option3.E()); + + // h_cJet_pt->Fill(cTag_Jet.Pt()); + // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + // h_cJet_p->Fill(cTag_Jet.P()); + // h_lJet0_p->Fill(lTag_Jet_0.P()); + // h_lJet1_p->Fill(lTag_Jet_1.P()); + // h_lJet2_p->Fill(lTag_Jet_2.P()); + + // W1_j1 = cTag_Jet; + // W1_j2 = lTag_Jet_2; + + // W2_j1 = lTag_Jet_1; + // W2_j2 = lTag_Jet_0; + // } + + // // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); + // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); + // CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); + // CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); + + // cutflow histograms + cutFlowHist->SetBinContent(1, NEvents); + cutFlowHist->SetBinContent(2, NdecayCuts); + cutFlowHist->SetBinContent(3, NokFlav); + cutFlowHist->SetBinContent(4, NjetCut); + cutFlowHist->SetBinContent(5, NleptonCut); + cutFlowHist->SetBinContent(6, NdCutd123); + cutFlowHist->SetBinContent(7, NdCutd34); + cutFlowHist->SetBinContent(8, nFlavScore); + + } + + std::cout << " " << std::endl; + std::cout << "-------------------- Outputs --------------------" << std::endl; + std::cout << "Number of events: " << NEvents << std::endl; + std::cout << "Number of events passing W decay cuts: " << NdecayCuts << std::endl; + std::cout << "Number of events w/ 4 jets: " << NjetCut << std::endl; + std::cout << "Number of Leptons Cut: " << NleptonCut << std::endl; + std::cout << "Number of events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore << std::endl; + std::cout << " " << std::endl; + + std::cout << " " << std::endl; + std::cout << "Let there be data :)" << std::endl; + + // end of macro +} \ No newline at end of file From 828f6931a2853806f13365184a8e81e0f32fdeac Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 17 Jul 2025 10:20:53 -0400 Subject: [PATCH 19/40] added calculation for EE correlations w/ jet substructure --- PostCutCode/Root/AnalysisWWCR.cxx | 537 ++++++++++++++++-------------- 1 file changed, 283 insertions(+), 254 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 50207f3..8456a59 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -71,96 +71,114 @@ void AnalysisWWCR::run() { auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); - // // ******************* TRUTH HISTOGRAMS ******************* - // auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); - // auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); - - // auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); - // auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); - - // auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); - // auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); - - // auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); - // auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); - - // auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); - // auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); - - // // ******************* RECOJET HISTOGRAMS ******************* - // auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); - // auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); - // auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - - // auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - // auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - // auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - // auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - - // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); - - // auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); - // auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); - - // auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); - // auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - - // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - // auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); - // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); - // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); - // auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); - // auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); - - // auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); - // auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); - // auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); - // auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); - // auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); - // auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); + // ******************* SUBSTRCTURE HISTOGRAMS ******************* + // auto h_jetSub_p = m_histContainer->get1DHist("h_jetSub_p", 300, 0, 150); + + auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); + auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); + + auto h_theta_jetSub_1 = m_histContainer->get1DHist("h_theta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_theta_jetSub_1 = m_histContainer->get1DHist("h_delta_theta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_eta_jetSub_1 = m_histContainer->get1DHist("h_delta_eta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_phi_jetSub_1 = m_histContainer->get1DHist("h_delta_phi_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + + auto h_cos_phi_jetSub_1 = m_histContainer->get1DHist("h_cos_phi_jetSub_1", 150, -1, 1); + + auto h_eec_jetSub_1 = m_histContainer->get1DHist("h_eec_jetSub_1", 150, -1, 1); + + // ******************* TRUTH HISTOGRAMS ******************* + auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); + auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); + + auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); + auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); + + auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); + auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + + auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + + auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); + auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); + + auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); + auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); + + // ******************* RECOJET HISTOGRAMS ******************* + auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); + auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); + auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); + + auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); + auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); + auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); + auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); + + auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); + auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); + auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); + auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); + + auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); + auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); + + auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); + auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); + + auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); + auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); + auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); + auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); + auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); + auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); + + auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); + auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); + auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); + auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); + auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); + auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -436,15 +454,15 @@ void AnalysisWWCR::run() { std::vector jetConstituents; // flattens the overall vector and allows us to open it up // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. for (int i = 0; i < jetconstituents_kt4.size(); ++i){ - std::cout << "instance i: " << i<< std::endl; - // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; + // std::cout << "instance i: " << i<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; + if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; std::exit(EXIT_FAILURE); } for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ - // jetconstituents_kt4_p.at(i).at(k) - std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; float p = jetconstituents_kt4_p.at(i).at(k); float theta = jetconstituents_kt4_theta.at(i).at(k); float phi = jetconstituents_kt4_phi.at(i).at(k); @@ -457,206 +475,217 @@ void AnalysisWWCR::run() { TLorentzVector vec; vec.SetPxPyPzE(px, py, pz, e); + jetConstituents.push_back(vec); + } + } - jetConstituents.push_back(vec); // if needed for individual constituents + for (size_t m = 0; m < jetConstituents.size(); ++m){ + for (size_t n = m + 1; n < jetConstituents.size(); ++n){ + TLorentzVector subJet_1 = jetConstituents.at(m); + TLorentzVector subJet_2 = jetConstituents.at(n); - } - - // } + h_subJet_1_p->Fill(subJet_1.P()); + h_subJet_2_p->Fill(subJet_2.P()); + + CosPhi_Angle(subJet_1, subJet_2, h_theta_jetSub_1, h_delta_theta_jetSub_1, h_delta_eta_jetSub_1, h_delta_phi_jetSub_1, h_cos_phi_jetSub_1, h_eec_jetSub_1); + } } + + + - // // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** - // std::vector truthJets_Wm, truthJets_Wp; + // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** + std::vector truthJets_Wm, truthJets_Wp; - // for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { - // float p = truth_Wm_p()->at(i); - // float e = truth_Wm_e()->at(i); - // float theta = truth_Wm_theta()->at(i); - // float phi = truth_Wm_phi()->at(i); + for (size_t i = 0; i < truth_Wm_p()->size(); ++i) { + float p = truth_Wm_p()->at(i); + float e = truth_Wm_e()->at(i); + float theta = truth_Wm_theta()->at(i); + float phi = truth_Wm_phi()->at(i); - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // TLorentzVector lv; + TLorentzVector lv; - // lv.SetPxPyPzE(px, py, pz, e); - // truthJets_Wm.push_back(lv); - // } + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wm.push_back(lv); + } - // for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { - // float p = truth_Wp_p()->at(i); - // float e = truth_Wp_e()->at(i); - // float theta = truth_Wp_theta()->at(i); - // float phi = truth_Wp_phi()->at(i); + for (size_t i = 0; i < truth_Wp_p()->size(); ++i) { + float p = truth_Wp_p()->at(i); + float e = truth_Wp_e()->at(i); + float theta = truth_Wp_theta()->at(i); + float phi = truth_Wp_phi()->at(i); - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // TLorentzVector lv; + TLorentzVector lv; - // lv.SetPxPyPzE(px, py, pz, e); - // truthJets_Wp.push_back(lv); - // } + lv.SetPxPyPzE(px, py, pz, e); + truthJets_Wp.push_back(lv); + } - // if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { - // TLorentzVector W1_jet1 = truthJets_Wm[0]; - // TLorentzVector W1_jet2 = truthJets_Wm[1]; - // TLorentzVector W2_jet1 = truthJets_Wp[0]; - // TLorentzVector W2_jet2 = truthJets_Wp[1]; + if (truthJets_Wm.size() >= 2 && truthJets_Wp.size() >= 2) { + TLorentzVector W1_jet1 = truthJets_Wm[0]; + TLorentzVector W1_jet2 = truthJets_Wm[1]; + TLorentzVector W2_jet1 = truthJets_Wp[0]; + TLorentzVector W2_jet2 = truthJets_Wp[1]; - // TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; - // TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; + TLorentzVector W1_truthJet = W1_jet1 + W1_jet2; + TLorentzVector W2_truthJet = W2_jet1 + W2_jet2; - // h_W1_truth_mass->Fill(W1_truthJet.M()); - // h_W2_truth_mass->Fill(W2_truthJet.M()); + h_W1_truth_mass->Fill(W1_truthJet.M()); + h_W2_truth_mass->Fill(W2_truthJet.M()); - // h_W1_truth_p->Fill(W1_truthJet.P()); - // h_W2_truth_p->Fill(W2_truthJet.P()); + h_W1_truth_p->Fill(W1_truthJet.P()); + h_W2_truth_p->Fill(W2_truthJet.P()); - // h_W1_truth_e->Fill(W1_truthJet.E()); - // h_W2_truth_e->Fill(W2_truthJet.E()); + h_W1_truth_e->Fill(W1_truthJet.E()); + h_W2_truth_e->Fill(W2_truthJet.E()); - // CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); - // CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); + CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); + CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); - // double counts_eec_truth_cs = h_eec_truth_cs->Integral(); - // double counts_eec_truth_ud = h_eec_truth_ud->Integral(); + double counts_eec_truth_cs = h_eec_truth_cs->Integral(); + double counts_eec_truth_ud = h_eec_truth_ud->Integral(); - // if (counts_eec_truth_cs > 0) - // h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); + if (counts_eec_truth_cs > 0) + h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); - // if (counts_eec_truth_ud > 0) - // h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); - // } + if (counts_eec_truth_ud > 0) + h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); + } - // // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** - // TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** + TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; - // cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - // lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - // lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - // lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); + lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - // const double m_W_true = 80.379; + const double m_W_true = 80.379; - // TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - // TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; + TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; - // TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - // TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; + TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; - // TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - // TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; + TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; - // double chi2_option1 = - // (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); + double chi2_option1 = + (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); - // double chi2_option2 = - // (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); + double chi2_option2 = + (pow(W1_option2.M() - m_W_true, 2) + pow(W2_option2.M() - m_W_true, 2)) / (m_W_true); - // double chi2_option3 = - // (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); + double chi2_option3 = + (pow(W1_option3.M() - m_W_true, 2) + pow(W2_option3.M() - m_W_true, 2)) / (m_W_true); - // // for the cos(phi) angle - // TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; + // for the cos(phi) angle + TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; - // if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { - // h_W1_mass->Fill(W1_option1.M()); - // h_W2_mass->Fill(W2_option1.M()); - // h_chi2->Fill(chi2_option1); + if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { + h_W1_mass->Fill(W1_option1.M()); + h_W2_mass->Fill(W2_option1.M()); + h_chi2->Fill(chi2_option1); - // h_W1_p->Fill(W1_option1.P()); - // h_W2_p->Fill(W2_option1.P()); + h_W1_p->Fill(W1_option1.P()); + h_W2_p->Fill(W2_option1.P()); - // h_W1_e->Fill(W1_option1.E()); - // h_W2_e->Fill(W2_option1.E()); - - // h_cJet_pt->Fill(cTag_Jet.Pt()); - // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - - // h_cJet_p->Fill(cTag_Jet.P()); - // h_lJet0_p->Fill(lTag_Jet_0.P()); - // h_lJet1_p->Fill(lTag_Jet_1.P()); - // h_lJet2_p->Fill(lTag_Jet_2.P()); - - // W1_j1 = cTag_Jet; - // W1_j2 = lTag_Jet_0; - - // W2_j1 = lTag_Jet_1; - // W2_j2 = lTag_Jet_2; - - // } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { - // h_W1_mass->Fill(W1_option2.M()); - // h_W2_mass->Fill(W2_option2.M()); - // h_chi2->Fill(chi2_option2); - - // h_W1_p->Fill(W1_option2.P()); - // h_W2_p->Fill(W2_option2.P()); - - // h_W1_e->Fill(W1_option2.E()); - // h_W2_e->Fill(W2_option2.E()); - - // h_cJet_pt->Fill(cTag_Jet.Pt()); - // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - - // h_cJet_p->Fill(cTag_Jet.P()); - // h_lJet0_p->Fill(lTag_Jet_0.P()); - // h_lJet1_p->Fill(lTag_Jet_1.P()); - // h_lJet2_p->Fill(lTag_Jet_2.P()); - - // W1_j1 = cTag_Jet; - // W1_j2 = lTag_Jet_1; - - // W2_j1 = lTag_Jet_0; - // W2_j2 = lTag_Jet_2; - - // } else { - // h_W1_mass->Fill(W1_option3.M()); - // h_W2_mass->Fill(W2_option3.M()); - // h_chi2->Fill(chi2_option3); - - // h_W1_p->Fill(W1_option3.P()); - // h_W2_p->Fill(W2_option3.P()); - - // h_W1_e->Fill(W1_option3.E()); - // h_W2_e->Fill(W2_option3.E()); - - // h_cJet_pt->Fill(cTag_Jet.Pt()); - // h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - // h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - // h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - - // h_cJet_p->Fill(cTag_Jet.P()); - // h_lJet0_p->Fill(lTag_Jet_0.P()); - // h_lJet1_p->Fill(lTag_Jet_1.P()); - // h_lJet2_p->Fill(lTag_Jet_2.P()); - - // W1_j1 = cTag_Jet; - // W1_j2 = lTag_Jet_2; - - // W2_j1 = lTag_Jet_1; - // W2_j2 = lTag_Jet_0; - // } - - // // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); - // CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); - // CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); - // CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); - // CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); - // CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); + h_W1_e->Fill(W1_option1.E()); + h_W2_e->Fill(W2_option1.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_0; + + W2_j1 = lTag_Jet_1; + W2_j2 = lTag_Jet_2; + + } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { + h_W1_mass->Fill(W1_option2.M()); + h_W2_mass->Fill(W2_option2.M()); + h_chi2->Fill(chi2_option2); + + h_W1_p->Fill(W1_option2.P()); + h_W2_p->Fill(W2_option2.P()); + + h_W1_e->Fill(W1_option2.E()); + h_W2_e->Fill(W2_option2.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_1; + + W2_j1 = lTag_Jet_0; + W2_j2 = lTag_Jet_2; + + } else { + h_W1_mass->Fill(W1_option3.M()); + h_W2_mass->Fill(W2_option3.M()); + h_chi2->Fill(chi2_option3); + + h_W1_p->Fill(W1_option3.P()); + h_W2_p->Fill(W2_option3.P()); + + h_W1_e->Fill(W1_option3.E()); + h_W2_e->Fill(W2_option3.E()); + + h_cJet_pt->Fill(cTag_Jet.Pt()); + h_lJet0_pt->Fill(lTag_Jet_0.Pt()); + h_lJet1_pt->Fill(lTag_Jet_1.Pt()); + h_lJet2_pt->Fill(lTag_Jet_2.Pt()); + + h_cJet_p->Fill(cTag_Jet.P()); + h_lJet0_p->Fill(lTag_Jet_0.P()); + h_lJet1_p->Fill(lTag_Jet_1.P()); + h_lJet2_p->Fill(lTag_Jet_2.P()); + + W1_j1 = cTag_Jet; + W1_j2 = lTag_Jet_2; + + W2_j1 = lTag_Jet_1; + W2_j2 = lTag_Jet_0; + } + + // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* + CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); + CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); + CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); + CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); + CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); + CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); From 343314404dbb5f9db85a663e9e8c0eb1bb4cbaf5 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Sat, 19 Jul 2025 22:44:00 -0400 Subject: [PATCH 20/40] started correcting ee calculation --- PostCutCode/Root/AnalysisWWCR.cxx | 394 ++++++++++++++++++++---------- 1 file changed, 261 insertions(+), 133 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 8456a59..48e3981 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -45,23 +45,36 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_theta, TH1F *hist_delta_theta, TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec) { - double theta = jet1.Angle(jet2.Vect()); - double delta_theta = jet1.Theta() - jet2.Theta(); +// void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_global_theta, TH1F *hist_delta_theta, TH1F *hist_cos_theta, +// TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec_theta, TH1F* hist_eec_phi) { + +// double global_theta = jet1.Angle(jet2.Vect()); +// double delta_theta = jet1.Theta() - jet2.Theta(); +// double cos_theta = cos(global_theta); - double delta_eta = jet1.Eta() - jet2.Eta(); - double delta_phi = jet1.Phi() - jet2.Phi(); - double cos_phi = cos(delta_phi); - - double ee_correlator = 0.5 * (1 - cos_phi); - - hist_theta->Fill(theta); - hist_delta_theta->Fill(delta_theta); - hist_delta_eta->Fill(delta_eta); - hist_delta_phi->Fill(delta_phi); - hist_cosphi->Fill(cos_phi); - hist_eec->Fill(ee_correlator); -} +// double delta_eta = jet1.Eta() - jet2.Eta(); +// double delta_phi = jet1.Phi() - jet2.Phi(); +// double cos_phi = cos(delta_phi); + +// double ee_correlator_theta = 0.5 * (1 - cos_theta); +// double ee_correlator_phi = 0.5 * (1 - cos_phi); + +// // double degrees = radians * 180.0 / TMath::Pi(); + +// double global_theta_deg = global_theta * 180.0 / TMath::Pi(); +// double delta_theta_deg = delta_theta * 180.0 / TMath::Pi(); +// double delta_eta_deg = delta_eta * 180 / TMath::Pi(); +// double delta_phi_deg = delta_phi * 180.0 / TMath::Pi(); + +// hist_global_theta->Fill(global_theta_deg); +// hist_delta_theta->Fill(delta_theta_deg); +// hist_cos_theta->Fill(cos_theta); +// hist_delta_eta->Fill(delta_eta_deg); +// hist_delta_phi->Fill(delta_phi_deg); +// hist_cosphi->Fill(cos_phi); +// hist_eec_theta->Fill(ee_correlator_theta); +// hist_eec_phi->Fill(ee_correlator_phi); +// } void AnalysisWWCR::run() { @@ -71,25 +84,27 @@ void AnalysisWWCR::run() { auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); - // ******************* SUBSTRCTURE HISTOGRAMS ******************* - // auto h_jetSub_p = m_histContainer->get1DHist("h_jetSub_p", 300, 0, 150); - - auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); - auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); + // // ******************* SUBSTRCTURE HISTOGRAMS ******************* + // auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); + // auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); - auto h_theta_jetSub_1 = m_histContainer->get1DHist("h_theta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_theta_jetSub_1 = m_histContainer->get1DHist("h_theta_jetSub_1", 150, -180.0, 180.0); - auto h_delta_theta_jetSub_1 = m_histContainer->get1DHist("h_delta_theta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_delta_theta_jetSub_1 = m_histContainer->get1DHist("h_delta_theta_jetSub_1", 150, -180.0, 180.0); + + // auto h_delta_eta_jetSub_1 = m_histContainer->get1DHist("h_delta_eta_jetSub_1", 150, -180.0, 180.0); + + // auto h_delta_phi_jetSub_1 = m_histContainer->get1DHist("h_delta_phi_jetSub_1", 150, -180.0, 180.0); - auto h_delta_eta_jetSub_1 = m_histContainer->get1DHist("h_delta_eta_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_cos_phi_jetSub_1 = m_histContainer->get1DHist("h_cos_phi_jetSub_1", 150, -1, 1); - auto h_delta_phi_jetSub_1 = m_histContainer->get1DHist("h_delta_phi_jetSub_1", 150, -TMath::Pi(), TMath::Pi()); + // auto h_eec_phi_jetSub_1 = m_histContainer->get1DHist("h_eec_phi_jetSub_1", 150, -1, 1); - auto h_cos_phi_jetSub_1 = m_histContainer->get1DHist("h_cos_phi_jetSub_1", 150, -1, 1); + // auto h_cos_theta_jetSub_1 = m_histContainer->get1DHist("h_cos_theta_jetSub_1", 150, -1, 1); - auto h_eec_jetSub_1 = m_histContainer->get1DHist("h_eec_jetSub_1", 150, -1, 1); + // auto h_eec_theta_jetSub_1 = m_histContainer->get1DHist("h_eec_theta_jetSub_1", 150, -1, 1); - // ******************* TRUTH HISTOGRAMS ******************* + // ******************************** TRUTH HISTOGRAMS ******************************** auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); @@ -99,23 +114,39 @@ void AnalysisWWCR::run() { auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + + auto h_chi_truth_cs = m_histContainer->get1DHist("h_chi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_chi_truth_ud = m_histContainer->get1DHist("h_chi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_truth_cs = m_histContainer->get1DHist("h_delta_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_truth_ud = m_histContainer->get1DHist("h_delta_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_eta_truth_cs = m_histContainer->get1DHist("h_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_eta_truth_ud = m_histContainer->get1DHist("h_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_truth_cs = m_histContainer->get1DHist("h_delta_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_truth_ud = m_histContainer->get1DHist("h_delta_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_truth_cs = m_histContainer->get1DHist("h_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_truth_ud = m_histContainer->get1DHist("h_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + - auto h_delta_phi_truth_cs = m_histContainer->get1DHist("h_delta_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_truth_ud = m_histContainer->get1DHist("h_delta_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); + auto h_cos_chi_truth_cs = m_histContainer->get1DHist("h_cos_chi_truth_cs", 150, -1, 1); + auto h_cos_chi_truth_ud = m_histContainer->get1DHist("h_cos_chi_truth_ud", 150, -1, 1); + + auto h_cos_theta_truth_cs = m_histContainer->get1DHist("h_cos_theta_truth_cs", 150, -1, 1); + auto h_cos_theta_truth_ud = m_histContainer->get1DHist("h_cos_theta_truth_ud", 150, -1, 1); auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); - auto h_eec_truth_cs = m_histContainer->get1DHist("h_eec_truth_cs", 150, -1, 1); - auto h_eec_truth_ud = m_histContainer->get1DHist("h_eec_truth_ud", 150, -1, 1); + + + auto h_eec_chi_truth_cs = m_histContainer->get1DHist("h_eec_chi_truth_cs", 150, -1, 1); + auto h_eec_chi_truth_ud = m_histContainer->get1DHist("h_eec_chi_truth_ud", 150, -1, 1); + + auto h_eec_theta_truth_cs = m_histContainer->get1DHist("h_eec_theta_truth_cs", 150, -1, 1); + auto h_eec_theta_truth_ud = m_histContainer->get1DHist("h_eec_theta_truth_ud", 150, -1, 1); + + auto h_eec_phi_truth_cs = m_histContainer->get1DHist("h_eec_phi_truth_cs", 150, -1, 1); + auto h_eec_phi_truth_ud = m_histContainer->get1DHist("h_eec_phi_truth_ud", 150, -1, 1); // ******************* RECOJET HISTOGRAMS ******************* auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); @@ -138,47 +169,73 @@ void AnalysisWWCR::run() { auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); + auto h_chi_c_l0 = m_histContainer->get1DHist("h_chi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_chi_l1_l2 = m_histContainer->get1DHist("h_chi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -TMath::Pi(), TMath::Pi()); - auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); - auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); - auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); - auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); - auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); - - auto h_eec_c_l0 = m_histContainer->get1DHist("h_eec_c_l0", 150, -1, 1); - auto h_eec_l1_l2 = m_histContainer->get1DHist("h_eec_l1_l2", 150, -1, 1); - auto h_eec_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -1, 1); - auto h_eec_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -1, 1); - auto h_eec_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -1, 1); - auto h_eec_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -1, 1); + auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_eta_c_l0 = m_histContainer->get1DHist("h_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_eta_l1_l2 = m_histContainer->get1DHist("h_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); + + // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -180.0, -180.0); + // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -180.0, -180.0); + // auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -180.0, -180.0); + // auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -180.0, -180.0); + // auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -180.0, -180.0); + // auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -180.0, -180.0); + + // auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -180.0, -180.0); + // auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -180.0, -180.0); + // auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -180.0, -180.0); + // auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -180.0, -180.0); + // auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -180.0, -180.0); + // auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -180.0, -180.0); + + // auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -180.0, -180.0); + // auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -180.0, -180.0); + // auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -180.0, -180.0); + // auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -180.0, -180.0); + // auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -180.0, -180.0); + // auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -180.0, -180.0); + + // auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -180.0, -180.0); + // auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -180.0, -180.0); + // auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -180.0, -180.0); + // auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -180.0, -180.0); + // auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -180.0, -180.0); + // auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -180.0, -180.0); + + // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); + // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); + // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); + // auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); + // auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); + + // auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 150, -1, 1); + // auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 150, -1, 1); + // auto h_eec_phi_c_l1 = m_histContainer->get1DHist("h_eec_phi_c_l1", 150, -1, 1); + // auto h_eec_phi_c_l2 = m_histContainer->get1DHist("h_eec_phi_c_l2", 150, -1, 1); + // auto h_eec_phi_l0_l1 = m_histContainer->get1DHist("h_eec_phi_l0_l1", 150, -1, 1); + // auto h_eec_phi_l0_l2 = m_histContainer->get1DHist("h_eec_phi_l0_l2", 150, -1, 1); + + // auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 150, -1, 1); + // auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 150, -1, 1); + // auto h_cos_theta_c_l1 = m_histContainer->get1DHist("h_cos_theta_c_l1", 150, -1, 1); + // auto h_cos_theta_c_l2 = m_histContainer->get1DHist("h_cos_theta_c_l2", 150, -1, 1); + // auto h_cos_theta_l0_l1 = m_histContainer->get1DHist("h_cos_theta_l0_l1", 150, -1, 1); + // auto h_cos_theta_l0_l2 = m_histContainer->get1DHist("h_cos_theta_l0_l2", 150, -1, 1); + + // auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 150, -1, 1); + // auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 150, -1, 1); + // auto h_eec_theta_c_l1 = m_histContainer->get1DHist("h_eec_theta_c_l1", 150, -1, 1); + // auto h_eec_theta_c_l2 = m_histContainer->get1DHist("h_eec_theta_c_l2", 150, -1, 1); + // auto h_eec_theta_l0_l1 = m_histContainer->get1DHist("h_eec_theta_l0_l1", 150, -1, 1); + // auto h_eec_theta_l0_l2 = m_histContainer->get1DHist("h_eec_theta_l0_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -450,54 +507,47 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; } - // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** - std::vector jetConstituents; // flattens the overall vector and allows us to open it up - // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. - for (int i = 0; i < jetconstituents_kt4.size(); ++i){ - // std::cout << "instance i: " << i<< std::endl; - // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; - - if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ - std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; - std::exit(EXIT_FAILURE); - } - for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ - // std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; - float p = jetconstituents_kt4_p.at(i).at(k); - float theta = jetconstituents_kt4_theta.at(i).at(k); - float phi = jetconstituents_kt4_phi.at(i).at(k); - float e = jetconstituents_kt4_e.at(i).at(k); - - - float px = p * sin(theta) * cos(phi); - float py = p * sin(theta) * sin(phi); - float pz = p * cos(theta); - - TLorentzVector vec; - vec.SetPxPyPzE(px, py, pz, e); - jetConstituents.push_back(vec); - } - } - - for (size_t m = 0; m < jetConstituents.size(); ++m){ - for (size_t n = m + 1; n < jetConstituents.size(); ++n){ - - TLorentzVector subJet_1 = jetConstituents.at(m); - TLorentzVector subJet_2 = jetConstituents.at(n); + // // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** + // std::vector jetConstituents; // flattens the overall vector and allows us to open it up + // // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. + // for (int i = 0; i < jetconstituents_kt4.size(); ++i){ + // // std::cout << "instance i: " << i<< std::endl; + // // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; - h_subJet_1_p->Fill(subJet_1.P()); - h_subJet_2_p->Fill(subJet_2.P()); + // if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ + // std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; + // std::exit(EXIT_FAILURE); + // } + // for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ + // // std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + // float p = jetconstituents_kt4_p.at(i).at(k); + // float theta = jetconstituents_kt4_theta.at(i).at(k); + // float phi = jetconstituents_kt4_phi.at(i).at(k); + // float e = jetconstituents_kt4_e.at(i).at(k); - CosPhi_Angle(subJet_1, subJet_2, h_theta_jetSub_1, h_delta_theta_jetSub_1, h_delta_eta_jetSub_1, h_delta_phi_jetSub_1, h_cos_phi_jetSub_1, h_eec_jetSub_1); - } - } - + // float px = p * sin(theta) * cos(phi); + // float py = p * sin(theta) * sin(phi); + // float pz = p * cos(theta); + // TLorentzVector vec; + // vec.SetPxPyPzE(px, py, pz, e); + // jetConstituents.push_back(vec); + // } + // } + // for (size_t m = 0; m < jetConstituents.size(); ++m){ + // for (size_t n = m + 1; n < jetConstituents.size(); ++n){ + // TLorentzVector subJet_1 = jetConstituents.at(m); + // TLorentzVector subJet_2 = jetConstituents.at(n); + // h_subJet_1_p->Fill(subJet_1.P()); + // h_subJet_2_p->Fill(subJet_2.P()); + // CosPhi_Angle(subJet_1, subJet_2, h_theta_jetSub_1, h_delta_theta_jetSub_1, h_delta_eta_jetSub_1, h_delta_phi_jetSub_1, h_cos_phi_jetSub_1, h_eec_phi_jetSub_1, h_cos_theta_jetSub_1, h_eec_theta_jetSub_1); + // } + // } // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** std::vector truthJets_Wm, truthJets_Wp; @@ -552,17 +602,61 @@ void AnalysisWWCR::run() { h_W1_truth_e->Fill(W1_truthJet.E()); h_W2_truth_e->Fill(W2_truthJet.E()); - CosPhi_Angle(W1_jet1, W1_jet2, h_theta_truth_cs, h_delta_theta_truth_cs, h_delta_eta_truth_cs, h_delta_phi_truth_cs, h_cos_phi_truth_cs, h_eec_truth_cs); - CosPhi_Angle(W2_jet1, W2_jet2, h_theta_truth_ud, h_delta_theta_truth_ud, h_delta_eta_truth_ud, h_delta_phi_truth_ud, h_cos_phi_truth_ud, h_eec_truth_ud); - - double counts_eec_truth_cs = h_eec_truth_cs->Integral(); - double counts_eec_truth_ud = h_eec_truth_ud->Integral(); + double chi_truth_cs = W1_jet1.Angle(W1_jet2.Vect()); // Is this the proper variable name for the angle? + double chi_truth_ud = W2_jet1.Angle(W2_jet2.Vect()); // If not, please note the correct varaible name - if (counts_eec_truth_cs > 0) - h_eec_truth_cs->Scale(1.0 / (counts_eec_truth_cs * h_eec_truth_cs->GetXaxis()->GetBinWidth(1))); + double theta_truth_cs = std::fabs(W1_jet1.Theta() - W1_jet2.Theta()); + double theta_truth_ud = std::fabs(W2_jet1.Theta() - W2_jet2.Theta()); - if (counts_eec_truth_ud > 0) - h_eec_truth_ud->Scale(1.0 / (counts_eec_truth_ud * h_eec_truth_ud->GetXaxis()->GetBinWidth(1))); + double eta_truth_cs = std::fabs(W1_jet1.Eta() - W1_jet2.Eta()); + double eta_truth_ud = std::fabs(W2_jet1.Eta() - W2_jet2.Eta()); + + double phi_truth_cs = std::fabs(W1_jet1.Phi() - W1_jet2.Phi()); + double phi_truth_ud = std::fabs(W2_jet1.Phi() - W2_jet2.Phi()); + + // ************** COSINE MEASUREMENTS ************** + double cos_chi_truth_cs = cos(chi_truth_cs); + double cos_chi_truth_ud = cos(chi_truth_ud); + + double cos_theta_truth_cs = cos(theta_truth_cs); + double cos_theta_truth_ud = cos(theta_truth_ud); + + double cos_phi_truth_cs = cos(phi_truth_cs); + double cos_phi_truth_ud = cos(phi_truth_ud); + + // ************** EE CORRELATIONS ************** + double ee_correlation_chi_truth_cs = 0.5 * (1 - cos_chi_truth_cs); + double ee_correlation_chi_truth_ud = 0.5 * (1 - cos_chi_truth_ud); + + double ee_correlation_theta_truth_cs = 0.5 * (1 - cos_theta_truth_cs); + double ee_correlation_theta_truth_ud = 0.5 * (1 - cos_theta_truth_ud); + + double ee_correlation_phi_truth_cs = 0.5 * (1 - cos_phi_truth_cs); + double ee_correlation_phi_truth_ud = 0.5 * (1 - cos_phi_truth_ud); + + // *********************** HISTOGRAMS *********************** + h_chi_truth_cs->Fill(chi_truth_cs); + h_chi_truth_ud->Fill(chi_truth_ud); + h_theta_truth_cs->Fill(theta_truth_cs); + h_theta_truth_ud->Fill(theta_truth_ud); + h_eta_truth_cs->Fill(eta_truth_cs); + h_eta_truth_ud->Fill(eta_truth_ud); + h_phi_truth_cs->Fill(phi_truth_cs); + h_phi_truth_ud->Fill(phi_truth_ud); + + h_cos_chi_truth_cs->Fill(cos_chi_truth_cs); + h_cos_chi_truth_ud->Fill(cos_chi_truth_ud); + h_cos_theta_truth_cs->Fill(cos_theta_truth_cs); + h_cos_theta_truth_ud->Fill(cos_theta_truth_ud); + h_cos_phi_truth_cs->Fill(cos_phi_truth_cs); + h_cos_phi_truth_ud->Fill(cos_phi_truth_ud); + + h_eec_chi_truth_cs->Fill(ee_correlation_chi_truth_cs); + h_eec_chi_truth_ud->Fill(ee_correlation_chi_truth_ud); + h_eec_theta_truth_cs->Fill(ee_correlation_theta_truth_cs); + h_eec_theta_truth_ud->Fill(ee_correlation_theta_truth_ud); + h_eec_phi_truth_cs->Fill(ee_correlation_phi_truth_cs); + h_eec_phi_truth_ud->Fill(ee_correlation_phi_truth_ud); } // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** @@ -679,13 +773,48 @@ void AnalysisWWCR::run() { W2_j2 = lTag_Jet_0; } - // ************************* CHANGE // COMMENT OUT WHEN RUNNING WITH DIFFERENT WW DECAY OPTIONS ******************************* - CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l0, h_delta_theta_c_l0, h_delta_eta_c_l0, h_delta_phi_c_l0, h_cos_phi_c_l0, h_eec_c_l0); - CosPhi_Angle(W2_j1, W2_j2, h_theta_l1_l2, h_delta_theta_l1_l2, h_delta_eta_l1_l2, h_delta_phi_l1_l2, h_cos_phi_l1_l2, h_eec_l1_l2); - CosPhi_Angle(W1_j1, W1_j2, h_theta_c_l1, h_delta_theta_c_l1, h_delta_eta_c_l1, h_delta_phi_c_l1, h_cos_phi_c_l1, h_eec_c_l1); - CosPhi_Angle(W2_j1, W2_j2, h_theta_c_l2, h_delta_theta_c_l2, h_delta_eta_c_l2, h_delta_phi_c_l2, h_cos_phi_c_l2, h_eec_c_l2); - CosPhi_Angle(W1_j1, W1_j2, h_theta_l0_l1, h_delta_theta_l0_l1, h_delta_eta_l0_l1, h_delta_phi_l0_l1, h_cos_phi_l0_l1, h_eec_l0_l1); - CosPhi_Angle(W2_j1, W2_j2, h_theta_l0_l2, h_delta_theta_l0_l2, h_delta_eta_l0_l2, h_delta_phi_l0_l2, h_cos_phi_l0_l2, h_eec_l0_l2); + double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); // Is this the proper variable name for the angle? + double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); // If not, please note the correct varaible name + + double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); + double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); + + double eta_c_l0 = std::fabs(W1_j1.Eta() - W1_j2.Eta()); + double eta_l1_l2 = std::fabs(W2_j1.Eta() - W2_j2.Eta()); + + double phi_c_l0 = std::fabs(W1_j1.Phi() - W1_j2.Phi()); + double phi_l1_l2 = std::fabs(W2_j1.Phi() - W2_j2.Phi()); + + // ************** COSINE MEASUREMENTS ************** + double cos_chi_c_l0 = cos(chi_c_l0); + double cos_chi_l1_l2 = cos(chi_l1_l2); + + double cos_theta_c_l0 = cos(theta_c_l0); + double cos_theta_l1_l2 = cos(theta_l1_l2); + + double cos_phi_c_l0 = cos(phi_c_l0); + double cos_phi_l1_l2 = cos(phi_l1_l2); + + // ************** EE CORRELATIONS ************** + double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); + double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); + + double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); + double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); + + double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); + double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); + + // *********************** HISTOGRAMS *********************** + h_chi_c_l0->Fill(chi_c_l0); + h_chi_l1_l2->Fill(chi_l1_l2); + h_theta_c_l0->Fill(theta_c_l0); + h_theta_l1_l2->Fill(theta_l1_l2); + h_eta_c_l0->Fill(eta_c_l0); + h_eta_l1_l2->Fill(eta_l1_l2); + h_phi_c_l0->Fill(phi_c_l0); + h_phi_l1_l2->Fill(phi_l1_l2); + // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); @@ -696,7 +825,6 @@ void AnalysisWWCR::run() { cutFlowHist->SetBinContent(6, NdCutd123); cutFlowHist->SetBinContent(7, NdCutd34); cutFlowHist->SetBinContent(8, nFlavScore); - } std::cout << " " << std::endl; From ffeb43ce949950d5861a2ef1eb5d1b519977545e Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Sun, 20 Jul 2025 00:58:55 -0400 Subject: [PATCH 21/40] modified ee correlation calculation for jet constituents and jets --- PostCutCode/Root/AnalysisWWCR.cxx | 223 +++++++++++++++--------------- 1 file changed, 113 insertions(+), 110 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 48e3981..c88cb5e 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -84,26 +84,23 @@ void AnalysisWWCR::run() { auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); - // // ******************* SUBSTRCTURE HISTOGRAMS ******************* - // auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); - // auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); - - // auto h_theta_jetSub_1 = m_histContainer->get1DHist("h_theta_jetSub_1", 150, -180.0, 180.0); + // ******************* SUBSTRCTURE HISTOGRAMS ******************* + auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); + auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); + + auto h_chi_subjet = m_histContainer->get1DHist("h_chi_subjet", 150, -TMath::Pi(), TMath::Pi()); + auto h_theta_subjet = m_histContainer->get1DHist("h_theta_subjet", 150, -TMath::Pi(), TMath::Pi()); + auto h_eta_subjet = m_histContainer->get1DHist("h_eta_subjet", 150, -TMath::Pi(), TMath::Pi()); + auto h_phi_subjet = m_histContainer->get1DHist("h_phi_subjet", 150, -TMath::Pi(), TMath::Pi()); + + auto h_cos_chi_subjet = m_histContainer->get1DHist("h_cos_chi_subjet", 150, -1, 1); + auto h_cos_theta_subjet = m_histContainer->get1DHist("h_cos_theta_subjet", 150, -1, 1); + auto h_cos_phi_subjet = m_histContainer->get1DHist("h_cos_phi_subjet", 150, -1, 1); + + auto h_eec_chi_subjet = m_histContainer->get1DHist("h_eec_chi_subjet", 150, -1, 1); + auto h_eec_theta_subjet = m_histContainer->get1DHist("h_eec_theta_subjet", 150, -1, 1); + auto h_eec_phi_subjet = m_histContainer->get1DHist("h_eec_phi_subjet", 150, -1, 1); - // auto h_delta_theta_jetSub_1 = m_histContainer->get1DHist("h_delta_theta_jetSub_1", 150, -180.0, 180.0); - - // auto h_delta_eta_jetSub_1 = m_histContainer->get1DHist("h_delta_eta_jetSub_1", 150, -180.0, 180.0); - - // auto h_delta_phi_jetSub_1 = m_histContainer->get1DHist("h_delta_phi_jetSub_1", 150, -180.0, 180.0); - - // auto h_cos_phi_jetSub_1 = m_histContainer->get1DHist("h_cos_phi_jetSub_1", 150, -1, 1); - - // auto h_eec_phi_jetSub_1 = m_histContainer->get1DHist("h_eec_phi_jetSub_1", 150, -1, 1); - - // auto h_cos_theta_jetSub_1 = m_histContainer->get1DHist("h_cos_theta_jetSub_1", 150, -1, 1); - - // auto h_eec_theta_jetSub_1 = m_histContainer->get1DHist("h_eec_theta_jetSub_1", 150, -1, 1); - // ******************************** TRUTH HISTOGRAMS ******************************** auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); @@ -181,61 +178,25 @@ void AnalysisWWCR::run() { auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -180.0, -180.0); - // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -180.0, -180.0); - // auto h_theta_c_l1 = m_histContainer->get1DHist("h_theta_c_l1", 150, -180.0, -180.0); - // auto h_theta_c_l2 = m_histContainer->get1DHist("h_theta_c_l2", 150, -180.0, -180.0); - // auto h_theta_l0_l1 = m_histContainer->get1DHist("h_theta_l0_l1", 150, -180.0, -180.0); - // auto h_theta_l0_l2 = m_histContainer->get1DHist("h_theta_l0_l2", 150, -180.0, -180.0); - - // auto h_delta_theta_c_l0 = m_histContainer->get1DHist("h_delta_theta_c_l0", 150, -180.0, -180.0); - // auto h_delta_theta_l1_l2 = m_histContainer->get1DHist("h_delta_theta_l1_l2", 150, -180.0, -180.0); - // auto h_delta_theta_c_l1 = m_histContainer->get1DHist("h_delta_theta_c_l1", 150, -180.0, -180.0); - // auto h_delta_theta_c_l2 = m_histContainer->get1DHist("h_delta_theta_c_l2", 150, -180.0, -180.0); - // auto h_delta_theta_l0_l1 = m_histContainer->get1DHist("h_delta_theta_l0_l1", 150, -180.0, -180.0); - // auto h_delta_theta_l0_l2 = m_histContainer->get1DHist("h_delta_theta_l0_l2", 150, -180.0, -180.0); - - // auto h_delta_eta_c_l0 = m_histContainer->get1DHist("h_delta_eta_c_l0", 150, -180.0, -180.0); - // auto h_delta_eta_l1_l2 = m_histContainer->get1DHist("h_delta_eta_l1_l2", 150, -180.0, -180.0); - // auto h_delta_eta_c_l1 = m_histContainer->get1DHist("h_delta_eta_c_l1", 150, -180.0, -180.0); - // auto h_delta_eta_c_l2 = m_histContainer->get1DHist("h_delta_eta_c_l2", 150, -180.0, -180.0); - // auto h_delta_eta_l0_l1 = m_histContainer->get1DHist("h_delta_eta_l0_l1", 150, -180.0, -180.0); - // auto h_delta_eta_l0_l2 = m_histContainer->get1DHist("h_delta_eta_l0_l2", 150, -180.0, -180.0); - - // auto h_delta_phi_c_l0 = m_histContainer->get1DHist("h_delta_phi_c_l0", 150, -180.0, -180.0); - // auto h_delta_phi_l1_l2 = m_histContainer->get1DHist("h_delta_phi_l1_l2", 150, -180.0, -180.0); - // auto h_delta_phi_c_l1 = m_histContainer->get1DHist("h_delta_phi_c_l1", 150, -180.0, -180.0); - // auto h_delta_phi_c_l2 = m_histContainer->get1DHist("h_delta_phi_c_l2", 150, -180.0, -180.0); - // auto h_delta_phi_l0_l1 = m_histContainer->get1DHist("h_delta_phi_l0_l1", 150, -180.0, -180.0); - // auto h_delta_phi_l0_l2 = m_histContainer->get1DHist("h_delta_phi_l0_l2", 150, -180.0, -180.0); - - // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); - // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - // auto h_cos_phi_c_l1 = m_histContainer->get1DHist("h_cos_phi_c_l1", 150, -1, 1); - // auto h_cos_phi_c_l2 = m_histContainer->get1DHist("h_cos_phi_c_l2", 150, -1, 1); - // auto h_cos_phi_l0_l1 = m_histContainer->get1DHist("h_cos_phi_l0_l1", 150, -1, 1); - // auto h_cos_phi_l0_l2 = m_histContainer->get1DHist("h_cos_phi_l0_l2", 150, -1, 1); - - // auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 150, -1, 1); - // auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 150, -1, 1); - // auto h_eec_phi_c_l1 = m_histContainer->get1DHist("h_eec_phi_c_l1", 150, -1, 1); - // auto h_eec_phi_c_l2 = m_histContainer->get1DHist("h_eec_phi_c_l2", 150, -1, 1); - // auto h_eec_phi_l0_l1 = m_histContainer->get1DHist("h_eec_phi_l0_l1", 150, -1, 1); - // auto h_eec_phi_l0_l2 = m_histContainer->get1DHist("h_eec_phi_l0_l2", 150, -1, 1); - - // auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 150, -1, 1); - // auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 150, -1, 1); - // auto h_cos_theta_c_l1 = m_histContainer->get1DHist("h_cos_theta_c_l1", 150, -1, 1); - // auto h_cos_theta_c_l2 = m_histContainer->get1DHist("h_cos_theta_c_l2", 150, -1, 1); - // auto h_cos_theta_l0_l1 = m_histContainer->get1DHist("h_cos_theta_l0_l1", 150, -1, 1); - // auto h_cos_theta_l0_l2 = m_histContainer->get1DHist("h_cos_theta_l0_l2", 150, -1, 1); - - // auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 150, -1, 1); - // auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 150, -1, 1); - // auto h_eec_theta_c_l1 = m_histContainer->get1DHist("h_eec_theta_c_l1", 150, -1, 1); - // auto h_eec_theta_c_l2 = m_histContainer->get1DHist("h_eec_theta_c_l2", 150, -1, 1); - // auto h_eec_theta_l0_l1 = m_histContainer->get1DHist("h_eec_theta_l0_l1", 150, -1, 1); - // auto h_eec_theta_l0_l2 = m_histContainer->get1DHist("h_eec_theta_l0_l2", 150, -1, 1); + + auto h_cos_chi_c_l0 = m_histContainer->get1DHist("h_cos_chi_c_l0", 150, -1, 1); + auto h_cos_chi_l1_l2 = m_histContainer->get1DHist("h_cos_chi_l1_l2", 150, -1, 1); + + auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 150, -1, 1); + auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 150, -1, 1); + + auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); + auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); + + + auto h_eec_chi_c_l0 = m_histContainer->get1DHist("h_eec_chi_c_l0", 150, -1, 1); + auto h_eec_chi_l1_l2 = m_histContainer->get1DHist("h_eec_chi_l1_l2", 150, -1, 1); + + auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 150, -1, 1); + auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 150, -1, 1); + + auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 150, -1, 1); + auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 150, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -507,47 +468,74 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; } - // // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** - // std::vector jetConstituents; // flattens the overall vector and allows us to open it up - // // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. - // for (int i = 0; i < jetconstituents_kt4.size(); ++i){ - // // std::cout << "instance i: " << i<< std::endl; - // // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; - - // if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ - // std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; - // std::exit(EXIT_FAILURE); - // } - // for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ - // // std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; - // float p = jetconstituents_kt4_p.at(i).at(k); - // float theta = jetconstituents_kt4_theta.at(i).at(k); - // float phi = jetconstituents_kt4_phi.at(i).at(k); - // float e = jetconstituents_kt4_e.at(i).at(k); - - - // float px = p * sin(theta) * cos(phi); - // float py = p * sin(theta) * sin(phi); - // float pz = p * cos(theta); + // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** + std::vector jetConstituents; // flattens the overall vector and allows us to open it up + // jetconstituents_kt4.at(i): number of jet const. belogning to jet i. + for (int i = 0; i < jetconstituents_kt4.size(); ++i){ + // std::cout << "instance i: " << i<< std::endl; + // std::cout << "jetconstituents_kt4_p.at(i): " << jetconstituents_kt4_p.at(i)<< std::endl; - // TLorentzVector vec; - // vec.SetPxPyPzE(px, py, pz, e); - // jetConstituents.push_back(vec); - // } - // } + if (jetconstituents_kt4_p.at(i).size() != jetconstituents_kt4.at(i)){ + std::cerr << "ERROR: Input mismatch — jet size doesn't match!" << std::endl; + std::exit(EXIT_FAILURE); + } + for (int k = 0; k < jetconstituents_kt4_p.at(i).size(); ++k){ + // std::cout << "jetconstituents_kt4_p.at(i).at(k): " << jetconstituents_kt4_p.at(i).at(k)<< std::endl; + float p = jetconstituents_kt4_p.at(i).at(k); + float theta = jetconstituents_kt4_theta.at(i).at(k); + float phi = jetconstituents_kt4_phi.at(i).at(k); + float e = jetconstituents_kt4_e.at(i).at(k); - // for (size_t m = 0; m < jetConstituents.size(); ++m){ - // for (size_t n = m + 1; n < jetConstituents.size(); ++n){ - // TLorentzVector subJet_1 = jetConstituents.at(m); - // TLorentzVector subJet_2 = jetConstituents.at(n); + float px = p * sin(theta) * cos(phi); + float py = p * sin(theta) * sin(phi); + float pz = p * cos(theta); - // h_subJet_1_p->Fill(subJet_1.P()); - // h_subJet_2_p->Fill(subJet_2.P()); + TLorentzVector vec; + vec.SetPxPyPzE(px, py, pz, e); + jetConstituents.push_back(vec); + } + } - // CosPhi_Angle(subJet_1, subJet_2, h_theta_jetSub_1, h_delta_theta_jetSub_1, h_delta_eta_jetSub_1, h_delta_phi_jetSub_1, h_cos_phi_jetSub_1, h_eec_phi_jetSub_1, h_cos_theta_jetSub_1, h_eec_theta_jetSub_1); - // } - // } + for (size_t m = 0; m < jetConstituents.size(); ++m){ + for (size_t n = m + 1; n < jetConstituents.size(); ++n){ + + TLorentzVector subJet_1 = jetConstituents.at(m); + TLorentzVector subJet_2 = jetConstituents.at(n); + + h_subJet_1_p->Fill(subJet_1.P()); + h_subJet_2_p->Fill(subJet_2.P()); + + double chi_subjet = subJet_1.Angle(subJet_2.Vect()); // Is this the proper variable name for the angle? + double theta_subjet = std::fabs(subJet_1.Theta() - subJet_2.Theta()); + double eta_subjet = std::fabs(subJet_1.Eta() - subJet_2.Eta()); + double phi_subjet = std::fabs(subJet_1.Phi() - subJet_2.Phi()); + + // ************** COSINE MEASUREMENTS ************** + double cos_chi_subjet = cos(chi_subjet); + double cos_theta_subjet = cos(theta_subjet); + double cos_phi_subjet = cos(phi_subjet); + + // ************** EE CORRELATIONS ************** + double ee_correlation_chi_subjet = 0.5 * (1 - cos_chi_subjet); + double ee_correlation_theta_subjet = 0.5 * (1 - cos_theta_subjet); + double ee_correlation_phi_subjet = 0.5 * (1 - cos_phi_subjet); + + // *********************** HISTOGRAMS *********************** + h_chi_subjet->Fill(chi_subjet); + h_theta_subjet->Fill(theta_subjet); + h_eta_subjet->Fill(eta_subjet); + h_phi_subjet->Fill(phi_subjet); + + h_cos_chi_subjet->Fill(cos_chi_subjet); + h_cos_theta_subjet->Fill(cos_theta_subjet); + h_cos_phi_subjet->Fill(cos_phi_subjet); + + h_eec_chi_subjet->Fill(ee_correlation_chi_subjet); + h_eec_theta_subjet->Fill(ee_correlation_theta_subjet); + h_eec_phi_subjet->Fill(ee_correlation_phi_subjet); + } + } // ****************************** CALCULATIONS USING TRUTH QUARKS ****************************** std::vector truthJets_Wm, truthJets_Wp; @@ -773,6 +761,7 @@ void AnalysisWWCR::run() { W2_j2 = lTag_Jet_0; } + // should these be done using the chi^2 method?? double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); // Is this the proper variable name for the angle? double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); // If not, please note the correct varaible name @@ -815,6 +804,20 @@ void AnalysisWWCR::run() { h_phi_c_l0->Fill(phi_c_l0); h_phi_l1_l2->Fill(phi_l1_l2); + h_cos_chi_c_l0->Fill(cos_chi_c_l0); + h_cos_chi_l1_l2->Fill(cos_chi_l1_l2); + h_cos_theta_c_l0->Fill(cos_theta_c_l0); + h_cos_theta_l1_l2->Fill(cos_theta_l1_l2); + h_cos_phi_c_l0->Fill(cos_phi_c_l0); + h_cos_phi_l1_l2->Fill(cos_phi_l1_l2); + + h_eec_chi_c_l0->Fill(ee_correlation_chi_c_l0); + h_eec_chi_l1_l2->Fill(ee_correlation_chi_l1_l2); + h_eec_theta_c_l0->Fill(ee_correlation_theta_c_l0); + h_eec_theta_l1_l2->Fill(ee_correlation_theta_l1_l2); + h_eec_phi_c_l0->Fill(ee_correlation_phi_c_l0); + h_eec_phi_l1_l2->Fill(ee_correlation_phi_l1_l2); + // cutflow histograms cutFlowHist->SetBinContent(1, NEvents); From 4f5c091060449700902c89c1a74b4a79c30a8e0f Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 24 Jul 2025 11:31:12 -0400 Subject: [PATCH 22/40] fixed issue phi measurements --- PostCutCode/Root/AnalysisWWCR.cxx | 310 ++++++++++++++---------------- 1 file changed, 142 insertions(+), 168 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index c88cb5e..4221954 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -85,118 +85,96 @@ void AnalysisWWCR::run() { auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); // ******************* SUBSTRCTURE HISTOGRAMS ******************* - auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 300, 0, 150); - auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 300, 0, 150); + auto h_subJet_1_p = m_histContainer->get1DHist("h_subJet_1_p", 500, 0, 150); + auto h_subJet_2_p = m_histContainer->get1DHist("h_subJet_2_p", 500, 0, 150); - auto h_chi_subjet = m_histContainer->get1DHist("h_chi_subjet", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_subjet = m_histContainer->get1DHist("h_theta_subjet", 150, -TMath::Pi(), TMath::Pi()); - auto h_eta_subjet = m_histContainer->get1DHist("h_eta_subjet", 150, -TMath::Pi(), TMath::Pi()); - auto h_phi_subjet = m_histContainer->get1DHist("h_phi_subjet", 150, -TMath::Pi(), TMath::Pi()); + auto h_chi_subjet = m_histContainer->get1DHist("h_chi_subjet", 500, 0, TMath::Pi()); + auto h_cos_chi_subjet = m_histContainer->get1DHist("h_cos_chi_subjet", 500, -1, 1); + auto h_eec_chi_subjet = m_histContainer->get1DHist("h_eec_chi_subjet", 500, -1, 1); - auto h_cos_chi_subjet = m_histContainer->get1DHist("h_cos_chi_subjet", 150, -1, 1); - auto h_cos_theta_subjet = m_histContainer->get1DHist("h_cos_theta_subjet", 150, -1, 1); - auto h_cos_phi_subjet = m_histContainer->get1DHist("h_cos_phi_subjet", 150, -1, 1); + auto h_theta_subjet = m_histContainer->get1DHist("h_theta_subjet", 500, 0, TMath::Pi()); + auto h_cos_theta_subjet = m_histContainer->get1DHist("h_cos_theta_subjet", 500, -1, 1); + auto h_eec_theta_subjet = m_histContainer->get1DHist("h_eec_theta_subjet", 500, -1, 1); - auto h_eec_chi_subjet = m_histContainer->get1DHist("h_eec_chi_subjet", 150, -1, 1); - auto h_eec_theta_subjet = m_histContainer->get1DHist("h_eec_theta_subjet", 150, -1, 1); - auto h_eec_phi_subjet = m_histContainer->get1DHist("h_eec_phi_subjet", 150, -1, 1); - - // ******************************** TRUTH HISTOGRAMS ******************************** - auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 300, 0, 150); - auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 300, 0, 150); - - auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 300, 0, 150); - auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 300, 0, 150); - - auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 300, 0, 150); - auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 300, 0, 150); + auto h_eta_subjet = m_histContainer->get1DHist("h_eta_subjet", 500, 0, TMath::Pi()); + auto h_phi_subjet = m_histContainer->get1DHist("h_phi_subjet", 500, -TMath::Pi(), TMath::Pi()); + auto h_cos_phi_subjet = m_histContainer->get1DHist("h_cos_phi_subjet", 500, -1, 1); + auto h_eec_phi_subjet = m_histContainer->get1DHist("h_eec_phi_subjet", 500, -1, 1); - auto h_chi_truth_cs = m_histContainer->get1DHist("h_chi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_chi_truth_ud = m_histContainer->get1DHist("h_chi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_eta_truth_cs = m_histContainer->get1DHist("h_eta_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_eta_truth_ud = m_histContainer->get1DHist("h_eta_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - auto h_phi_truth_cs = m_histContainer->get1DHist("h_phi_truth_cs", 150, -TMath::Pi(), TMath::Pi()); - auto h_phi_truth_ud = m_histContainer->get1DHist("h_phi_truth_ud", 150, -TMath::Pi(), TMath::Pi()); - - - auto h_cos_chi_truth_cs = m_histContainer->get1DHist("h_cos_chi_truth_cs", 150, -1, 1); - auto h_cos_chi_truth_ud = m_histContainer->get1DHist("h_cos_chi_truth_ud", 150, -1, 1); - - auto h_cos_theta_truth_cs = m_histContainer->get1DHist("h_cos_theta_truth_cs", 150, -1, 1); - auto h_cos_theta_truth_ud = m_histContainer->get1DHist("h_cos_theta_truth_ud", 150, -1, 1); - - auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 150, -1, 1); - auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 150, -1, 1); - - - - auto h_eec_chi_truth_cs = m_histContainer->get1DHist("h_eec_chi_truth_cs", 150, -1, 1); - auto h_eec_chi_truth_ud = m_histContainer->get1DHist("h_eec_chi_truth_ud", 150, -1, 1); - - auto h_eec_theta_truth_cs = m_histContainer->get1DHist("h_eec_theta_truth_cs", 150, -1, 1); - auto h_eec_theta_truth_ud = m_histContainer->get1DHist("h_eec_theta_truth_ud", 150, -1, 1); - - auto h_eec_phi_truth_cs = m_histContainer->get1DHist("h_eec_phi_truth_cs", 150, -1, 1); - auto h_eec_phi_truth_ud = m_histContainer->get1DHist("h_eec_phi_truth_ud", 150, -1, 1); + // ******************************** TRUTH HISTOGRAMS ******************************** + auto h_W1_truth_mass = m_histContainer->get1DHist("h_W1_truth_mass", 500, 0, 150); + auto h_W2_truth_mass = m_histContainer->get1DHist("h_W2_truth_mass", 500, 0, 150); + + auto h_W1_truth_p = m_histContainer->get1DHist("h_W1_truth_p", 500, 0, 150); + auto h_W2_truth_p = m_histContainer->get1DHist("h_W2_truth_p", 500, 0, 150); + + auto h_W1_truth_e = m_histContainer->get1DHist("h_W1_truth_e", 500, 0, 150); + auto h_W2_truth_e = m_histContainer->get1DHist("h_W2_truth_e", 500, 0, 150); + + auto h_chi_truth_cs = m_histContainer->get1DHist("h_chi_truth_cs", 500, 0, TMath::Pi()); + auto h_chi_truth_ud = m_histContainer->get1DHist("h_chi_truth_ud", 500, 0, TMath::Pi()); + auto h_cos_chi_truth_cs = m_histContainer->get1DHist("h_cos_chi_truth_cs", 500, -1, 1); + auto h_cos_chi_truth_ud = m_histContainer->get1DHist("h_cos_chi_truth_ud", 500, -1, 1); + auto h_eec_chi_truth_cs = m_histContainer->get1DHist("h_eec_chi_truth_cs", 500, -1, 1); + auto h_eec_chi_truth_ud = m_histContainer->get1DHist("h_eec_chi_truth_ud", 500, -1, 1); + + auto h_theta_truth_cs = m_histContainer->get1DHist("h_theta_truth_cs", 500, 0, TMath::Pi()); + auto h_theta_truth_ud = m_histContainer->get1DHist("h_theta_truth_ud", 500, 0, TMath::Pi()); + auto h_cos_theta_truth_cs = m_histContainer->get1DHist("h_cos_theta_truth_cs", 500, -1, 1); + auto h_cos_theta_truth_ud = m_histContainer->get1DHist("h_cos_theta_truth_ud", 500, -1, 1); + auto h_eec_theta_truth_cs = m_histContainer->get1DHist("h_eec_theta_truth_cs", 500, -1, 1); + auto h_eec_theta_truth_ud = m_histContainer->get1DHist("h_eec_theta_truth_ud", 500, -1, 1); + + auto h_eta_truth_cs = m_histContainer->get1DHist("h_eta_truth_cs", 500, 0, TMath::Pi()); + auto h_eta_truth_ud = m_histContainer->get1DHist("h_eta_truth_ud", 500, 0, TMath::Pi()); + + auto h_phi_truth_cs = m_histContainer->get1DHist("h_phi_truth_cs", 500, -TMath::Pi(), TMath::Pi()); + auto h_phi_truth_ud = m_histContainer->get1DHist("h_phi_truth_ud", 500, -TMath::Pi(), TMath::Pi()); + auto h_cos_phi_truth_cs = m_histContainer->get1DHist("h_cos_phi_truth_cs", 500, -1, 1); + auto h_cos_phi_truth_ud = m_histContainer->get1DHist("h_cos_phi_truth_ud", 500, -1, 1); + auto h_eec_phi_truth_cs = m_histContainer->get1DHist("h_eec_phi_truth_cs", 500, -1, 1); + auto h_eec_phi_truth_ud = m_histContainer->get1DHist("h_eec_phi_truth_ud", 500, -1, 1); // ******************* RECOJET HISTOGRAMS ******************* - auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 300, 0, 150); - auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 300, 0, 150); - auto h_chi2 = m_histContainer->get1DHist("h_chi2", 300, 0, 150); - - auto h_cJet_pt = m_histContainer->get1DHist("cJet_pt", 300, 0, 150); - auto h_lJet0_pt = m_histContainer->get1DHist("lJet0_pt", 300, 0, 150); - auto h_lJet1_pt = m_histContainer->get1DHist("lJet1_pt", 300, 0, 150); - auto h_lJet2_pt = m_histContainer->get1DHist("lJet2_pt", 300, 0, 150); - - auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 300, 0, 150); - auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 300, 0, 150); - auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 300, 0, 150); - auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 300, 0, 150); - - auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 150, 0, 150); - auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 150, 0, 150); - - auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 300, 0, 150); - auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 300, 0, 150); - - auto h_chi_c_l0 = m_histContainer->get1DHist("h_chi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_chi_l1_l2 = m_histContainer->get1DHist("h_chi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_eta_c_l0 = m_histContainer->get1DHist("h_eta_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_eta_l1_l2 = m_histContainer->get1DHist("h_eta_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - - auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 150, -TMath::Pi(), TMath::Pi()); - auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 150, -TMath::Pi(), TMath::Pi()); - - - auto h_cos_chi_c_l0 = m_histContainer->get1DHist("h_cos_chi_c_l0", 150, -1, 1); - auto h_cos_chi_l1_l2 = m_histContainer->get1DHist("h_cos_chi_l1_l2", 150, -1, 1); - - auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 150, -1, 1); - auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 150, -1, 1); - - auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 150, -1, 1); - auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 150, -1, 1); - - - auto h_eec_chi_c_l0 = m_histContainer->get1DHist("h_eec_chi_c_l0", 150, -1, 1); - auto h_eec_chi_l1_l2 = m_histContainer->get1DHist("h_eec_chi_l1_l2", 150, -1, 1); - - auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 150, -1, 1); - auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 150, -1, 1); - - auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 150, -1, 1); - auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 150, -1, 1); + auto h_W1_mass = m_histContainer->get1DHist("h_W1_mass", 500, 0, 150); + auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 500, 0, 150); + auto h_chi2 = m_histContainer->get1DHist("h_chi2", 500, 0, 150); + + auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 500, 0, 150); + auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 500, 0, 150); + auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 500, 0, 150); + auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 500, 0, 150); + + auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 500, 0, 150); + auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 500, 0, 150); + + auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 500, 0, 150); + auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 500, 0, 150); + + auto h_chi_c_l0 = m_histContainer->get1DHist("h_chi_c_l0", 500, 0, TMath::Pi()); + auto h_chi_l1_l2 = m_histContainer->get1DHist("h_chi_l1_l2", 500, 0, TMath::Pi()); + auto h_cos_chi_c_l0 = m_histContainer->get1DHist("h_cos_chi_c_l0", 500, -1, 1); + auto h_cos_chi_l1_l2 = m_histContainer->get1DHist("h_cos_chi_l1_l2", 500, -1, 1); + auto h_eec_chi_c_l0 = m_histContainer->get1DHist("h_eec_chi_c_l0", 500, -1, 1); + auto h_eec_chi_l1_l2 = m_histContainer->get1DHist("h_eec_chi_l1_l2", 500, -1, 1); + + auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 500, 0, TMath::Pi()); + auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 500, 0, TMath::Pi()); + auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 500, -1, 1); + auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 500, -1, 1); + auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 500, -1, 1); + auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 500, -1, 1); + + auto h_eta_c_l0 = m_histContainer->get1DHist("h_eta_c_l0", 500, -TMath::Pi(), TMath::Pi()); + auto h_eta_l1_l2 = m_histContainer->get1DHist("h_eta_l1_l2", 500, -TMath::Pi(), TMath::Pi()); + + auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 500, 0, TMath::Pi()); + auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 500, 0, TMath::Pi()); + auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 500, -1, 1); + auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 500, -1, 1); + auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 500, -1, 1); + auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 500, -1, 1); // Get the trees auto treeCont = std::make_shared(); @@ -267,7 +245,7 @@ void AnalysisWWCR::run() { int NdCutd34 = 0; int NdecayCuts = 0; - const int maxPrint = 5; + const int maxPrint = 10; int nPrinted = 0; bool do_debug = true; // Set to false to turn off all debug printing @@ -506,34 +484,33 @@ void AnalysisWWCR::run() { h_subJet_1_p->Fill(subJet_1.P()); h_subJet_2_p->Fill(subJet_2.P()); - double chi_subjet = subJet_1.Angle(subJet_2.Vect()); // Is this the proper variable name for the angle? - double theta_subjet = std::fabs(subJet_1.Theta() - subJet_2.Theta()); - double eta_subjet = std::fabs(subJet_1.Eta() - subJet_2.Eta()); - double phi_subjet = std::fabs(subJet_1.Phi() - subJet_2.Phi()); + double jetSub_chi_1 = subJet_1.Angle(subJet_2.Vect()); + double jetSub_cos_chi_1 = cos(jetSub_chi_1); + double eec_jetSub_chi_1 = 0.5 * (1 - jetSub_cos_chi_1); - // ************** COSINE MEASUREMENTS ************** - double cos_chi_subjet = cos(chi_subjet); - double cos_theta_subjet = cos(theta_subjet); - double cos_phi_subjet = cos(phi_subjet); - - // ************** EE CORRELATIONS ************** - double ee_correlation_chi_subjet = 0.5 * (1 - cos_chi_subjet); - double ee_correlation_theta_subjet = 0.5 * (1 - cos_theta_subjet); - double ee_correlation_phi_subjet = 0.5 * (1 - cos_phi_subjet); - - // *********************** HISTOGRAMS *********************** - h_chi_subjet->Fill(chi_subjet); - h_theta_subjet->Fill(theta_subjet); - h_eta_subjet->Fill(eta_subjet); - h_phi_subjet->Fill(phi_subjet); - - h_cos_chi_subjet->Fill(cos_chi_subjet); - h_cos_theta_subjet->Fill(cos_theta_subjet); - h_cos_phi_subjet->Fill(cos_phi_subjet); + double jetSub_theta_2 = std::fabs(subJet_1.Theta() - subJet_2.Theta()); + double jetSub_cos_theta_2 = cos(jetSub_theta_2); + double eec_jetSub_theta_2 = 0.5 * (1 - jetSub_cos_theta_2); + + double jetSub_eta_3 = std::fabs(subJet_1.Eta() - subJet_2.Eta()); + + double jetSub_phi_4 = subJet_1.Phi() - subJet_2.Phi(); + double jetSub_cos_phi_4 = cos(jetSub_phi_4); + double eec_jetSub_phi_4 = 0.5 * (1 - jetSub_cos_phi_4); + + h_chi_subjet->Fill(jetSub_chi_1); + h_cos_chi_subjet->Fill(jetSub_cos_chi_1); + h_eec_chi_subjet->Fill(eec_jetSub_chi_1); - h_eec_chi_subjet->Fill(ee_correlation_chi_subjet); - h_eec_theta_subjet->Fill(ee_correlation_theta_subjet); - h_eec_phi_subjet->Fill(ee_correlation_phi_subjet); + h_theta_subjet->Fill(jetSub_theta_2); + h_cos_theta_subjet->Fill(jetSub_cos_theta_2); + h_eec_theta_subjet->Fill(eec_jetSub_theta_2); + + h_eta_subjet->Fill(jetSub_eta_3); + + h_phi_subjet->Fill(jetSub_phi_4); + h_cos_phi_subjet->Fill(jetSub_cos_phi_4); + h_eec_phi_subjet->Fill(eec_jetSub_phi_4); } } @@ -599,8 +576,8 @@ void AnalysisWWCR::run() { double eta_truth_cs = std::fabs(W1_jet1.Eta() - W1_jet2.Eta()); double eta_truth_ud = std::fabs(W2_jet1.Eta() - W2_jet2.Eta()); - double phi_truth_cs = std::fabs(W1_jet1.Phi() - W1_jet2.Phi()); - double phi_truth_ud = std::fabs(W2_jet1.Phi() - W2_jet2.Phi()); + double phi_truth_cs = W1_jet1.Phi() - W1_jet2.Phi(); + double phi_truth_ud = W2_jet1.Phi() - W2_jet2.Phi(); // ************** COSINE MEASUREMENTS ************** double cos_chi_truth_cs = cos(chi_truth_cs); @@ -612,6 +589,17 @@ void AnalysisWWCR::run() { double cos_phi_truth_cs = cos(phi_truth_cs); double cos_phi_truth_ud = cos(phi_truth_ud); + // if (nPrinted < maxPrint) { + // std::cout << "Truth Quarks" << std::endl; + // std::cout << "chi: " << chi_truth_cs << " " << "cos(chi): " << cos_chi_truth_cs << std::endl; + // std::cout << "chi: " << chi_truth_ud << " " << "cos(chi): " << cos_chi_truth_ud << std::endl; + // std::cout << "theta: " << theta_truth_cs << " " << "cos(chi): " << cos_theta_truth_cs << std::endl; + // std::cout << "theta: " << theta_truth_ud << " " << "cos(chi): " << cos_theta_truth_ud << std::endl; + // std::cout << "phi: " << phi_truth_cs << " " << "cos(chi): " << cos_phi_truth_cs << std::endl; + // std::cout << "phi: " << phi_truth_ud << " " << "cos(chi): " << cos_phi_truth_ud << std::endl; + // std::cout << " " << std::endl; + // } + // ************** EE CORRELATIONS ************** double ee_correlation_chi_truth_cs = 0.5 * (1 - cos_chi_truth_cs); double ee_correlation_chi_truth_ud = 0.5 * (1 - cos_chi_truth_ud); @@ -690,11 +678,6 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option1.E()); h_W2_e->Fill(W2_option1.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); h_lJet0_p->Fill(lTag_Jet_0.P()); h_lJet1_p->Fill(lTag_Jet_1.P()); @@ -717,11 +700,6 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option2.E()); h_W2_e->Fill(W2_option2.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); h_lJet0_p->Fill(lTag_Jet_0.P()); h_lJet1_p->Fill(lTag_Jet_1.P()); @@ -744,11 +722,6 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option3.E()); h_W2_e->Fill(W2_option3.E()); - h_cJet_pt->Fill(cTag_Jet.Pt()); - h_lJet0_pt->Fill(lTag_Jet_0.Pt()); - h_lJet1_pt->Fill(lTag_Jet_1.Pt()); - h_lJet2_pt->Fill(lTag_Jet_2.Pt()); - h_cJet_p->Fill(cTag_Jet.P()); h_lJet0_p->Fill(lTag_Jet_0.P()); h_lJet1_p->Fill(lTag_Jet_1.P()); @@ -761,36 +734,37 @@ void AnalysisWWCR::run() { W2_j2 = lTag_Jet_0; } - // should these be done using the chi^2 method?? - double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); // Is this the proper variable name for the angle? - double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); // If not, please note the correct varaible name + // ************* CHI ************* + double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); + double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); + + double cos_chi_c_l0 = cos(chi_c_l0); + double cos_chi_l1_l2 = cos(chi_l1_l2); + + double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); + double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); + // ************* THETA ************* double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); + double cos_theta_c_l0 = cos(theta_c_l0); + double cos_theta_l1_l2 = cos(theta_l1_l2); + + double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); + double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); + + // ************* ETA ************* double eta_c_l0 = std::fabs(W1_j1.Eta() - W1_j2.Eta()); double eta_l1_l2 = std::fabs(W2_j1.Eta() - W2_j2.Eta()); - double phi_c_l0 = std::fabs(W1_j1.Phi() - W1_j2.Phi()); - double phi_l1_l2 = std::fabs(W2_j1.Phi() - W2_j2.Phi()); - - // ************** COSINE MEASUREMENTS ************** - double cos_chi_c_l0 = cos(chi_c_l0); - double cos_chi_l1_l2 = cos(chi_l1_l2); - - double cos_theta_c_l0 = cos(theta_c_l0); - double cos_theta_l1_l2 = cos(theta_l1_l2); + // ************* PHI ************* + double phi_c_l0 = W1_j1.Phi() - W1_j2.Phi(); + double phi_l1_l2 = W2_j1.Phi() - W2_j2.Phi(); double cos_phi_c_l0 = cos(phi_c_l0); double cos_phi_l1_l2 = cos(phi_l1_l2); - // ************** EE CORRELATIONS ************** - double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); - double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); - - double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); - double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); - double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); From 2dca02c8483e1009d723120c410cda04a5cea35c Mon Sep 17 00:00:00 2001 From: Iza Veliscek Date: Thu, 24 Jul 2025 14:52:18 -0400 Subject: [PATCH 23/40] add brances to output root file --- PostCutCode/PostCutCode/AnalysisWWCR.h | 6 +++- PostCutCode/Root/AnalysisBase.cxx | 2 +- PostCutCode/Root/AnalysisWWCR.cxx | 46 ++++++++++++++++++++++++-- PostCutCode/Root/AnalysisZHAllHad.cxx | 24 +++++++------- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/PostCutCode/PostCutCode/AnalysisWWCR.h b/PostCutCode/PostCutCode/AnalysisWWCR.h index e72d5a5..f35db1b 100644 --- a/PostCutCode/PostCutCode/AnalysisWWCR.h +++ b/PostCutCode/PostCutCode/AnalysisWWCR.h @@ -21,7 +21,11 @@ class AnalysisWWCR: public AnalysisBase void run() override; protected: - + std::vector ee_corr; + std::vector theta_corr; + std::vector phi_corr; + std::vector chi_corr; + double mc_weight; }; diff --git a/PostCutCode/Root/AnalysisBase.cxx b/PostCutCode/Root/AnalysisBase.cxx index d54a2f8..19642c8 100644 --- a/PostCutCode/Root/AnalysisBase.cxx +++ b/PostCutCode/Root/AnalysisBase.cxx @@ -29,7 +29,7 @@ void AnalysisBase::writeHistogram() auto outFile = TFile::Open(MDC::GetInstance()->getOutputFileName().c_str(), "recreate"); // get all the hist auto histList = m_histContainer->getHistList(); - // my_tree->Write(); + my_tree->Write(); outFile->mkdir("Nominal"); outFile->cd("Nominal"); for(const auto& h: histList) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 4221954..051b251 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -8,6 +8,7 @@ #include #include "TLorentzVector.h" // #include "Root" +#include #include "TH1F.h" #include @@ -79,7 +80,18 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { void AnalysisWWCR::run() { std::vector cutFlowMap {"All Events", "DecayCuts", "NoNaNFlavScore", "Has 4 Jets", "leptonCut", "d123Cut", "d34Cut", "Events have a c, s, and 2 l tagged jets"}; + // using json = nlohmann::json; + std::ifstream f(MDC::GetInstance()->getSOWJSONFile()); + nlohmann::json data = nlohmann::json::parse(f); + // override the sum of weights, if it is inside the extra files that we built by hand + std::ifstream customF(MDC::GetInstance()->getCustomSOWJSONFile()); + nlohmann::json customData = nlohmann::json::parse(customF); + + auto sName = MDC::GetInstance()->getSampleName(); + + double norm_weight = (double)data[sName]["crossSection"]/(double)data[sName]["sumOfWeights"]; + // Get the histograms auto countingHist = m_histContainer->getCountingHist(); auto cutFlowHist = m_histContainer->get1DHist("cutFlowHist", cutFlowMap.size(), 0, 8, cutFlowMap); @@ -175,7 +187,17 @@ void AnalysisWWCR::run() { auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 500, -1, 1); auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 500, -1, 1); auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 500, -1, 1); - + + //Make new tree + TTree* t = new TTree("analysis","my analysis tree"); + my_tree = (TTree*) t; + //define the output branches + + my_tree->Branch("b_ee_corr",&ee_corr); + my_tree->Branch("b_theta_corr",&theta_corr); + my_tree->Branch("b_phi_corr",&phi_corr); + my_tree->Branch("b_chi_corr",&chi_corr); + my_tree->Branch("b_w",&mc_weight); // Get the trees auto treeCont = std::make_shared(); @@ -286,6 +308,11 @@ void AnalysisWWCR::run() { flage_toss = true; } if (flage_toss) continue; + // define vectors + std::vector vec_ee_corr; + std::vector vec_theta_corr; + std::vector vec_phi_corr; + std::vector vec_chi_corr; float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); @@ -296,7 +323,8 @@ void AnalysisWWCR::run() { std::vector j1_flav {recojet_isB.at(1), recojet_isC.at(1), jet1_scoreQ, recojet_isG.at(1), recojet_isTAU.at(1)}; std::vector j2_flav {recojet_isB.at(2), recojet_isC.at(2), jet2_scoreQ, recojet_isG.at(2), recojet_isTAU.at(2)}; std::vector j3_flav {recojet_isB.at(3), recojet_isC.at(3), jet3_scoreQ, recojet_isG.at(3), recojet_isTAU.at(3)}; - + + for (float j0_f : j0_flav) { if (std::isnan(j0_f)) { flage_toss = true; @@ -498,6 +526,11 @@ void AnalysisWWCR::run() { double jetSub_cos_phi_4 = cos(jetSub_phi_4); double eec_jetSub_phi_4 = 0.5 * (1 - jetSub_cos_phi_4); + vec_ee_corr.push_back(eec_jetSub_theta_2); + vec_theta_corr.push_back(jetSub_theta_2); + vec_phi_corr.push_back(jetSub_phi_4); + vec_chi_corr.push_back(jetSub_chi_1); + h_chi_subjet->Fill(jetSub_chi_1); h_cos_chi_subjet->Fill(jetSub_cos_chi_1); h_eec_chi_subjet->Fill(eec_jetSub_chi_1); @@ -589,6 +622,8 @@ void AnalysisWWCR::run() { double cos_phi_truth_cs = cos(phi_truth_cs); double cos_phi_truth_ud = cos(phi_truth_ud); + + // if (nPrinted < maxPrint) { // std::cout << "Truth Quarks" << std::endl; // std::cout << "chi: " << chi_truth_cs << " " << "cos(chi): " << cos_chi_truth_cs << std::endl; @@ -734,6 +769,13 @@ void AnalysisWWCR::run() { W2_j2 = lTag_Jet_0; } + mc_weight = norm_weight; + ee_corr = vec_ee_corr; + theta_corr = vec_theta_corr; + phi_corr= vec_phi_corr; + chi_corr=vec_chi_corr; + my_tree->Fill(); + // ************* CHI ************* double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); diff --git a/PostCutCode/Root/AnalysisZHAllHad.cxx b/PostCutCode/Root/AnalysisZHAllHad.cxx index e84a72d..239d589 100644 --- a/PostCutCode/Root/AnalysisZHAllHad.cxx +++ b/PostCutCode/Root/AnalysisZHAllHad.cxx @@ -183,18 +183,18 @@ void AnalysisZHAllHad::run() auto tree = treeCont->getTree(); //Define ttree for analysis - TTree* t = new TTree("analysis","my analysis tree"); - my_tree = (TTree*) t; - //define the output branches - my_tree->Branch("b_mH_jj",&mH_jj); - my_tree->Branch("b_mZ_jj",&mZ_jj); - my_tree->Branch("b_Hscore",&Hscore); - my_tree->Branch("b_Zscore",&Zscore); - my_tree->Branch("b_Hflav",&Hflav); - my_tree->Branch("b_Zflav",&Zflav); - my_tree->Branch("b_ChiH",&ChiH); - my_tree->Branch("b_ChiZ",&ChiZ); - my_tree->Branch("b_w",&mc_weight); + // TTree* t = new TTree("analysis","my analysis tree"); + // my_tree = (TTree*) t; + // //define the output branches + // my_tree->Branch("b_mH_jj",&mH_jj); + // my_tree->Branch("b_mZ_jj",&mZ_jj); + // my_tree->Branch("b_Hscore",&Hscore); + // my_tree->Branch("b_Zscore",&Zscore); + // my_tree->Branch("b_Hflav",&Hflav); + // my_tree->Branch("b_Zflav",&Zflav); + // my_tree->Branch("b_ChiH",&ChiH); + // my_tree->Branch("b_ChiZ",&ChiZ); + // my_tree->Branch("b_w",&mc_weight); // assuming you have vectors as input (should also save option to run w/o vectors) From ed7b4cc36319c08a42e2ea0472c24addd65100e0 Mon Sep 17 00:00:00 2001 From: Iza Veliscek Date: Thu, 24 Jul 2025 15:57:37 -0400 Subject: [PATCH 24/40] add simple plotting script --- scripts/plot.C | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 scripts/plot.C diff --git a/scripts/plot.C b/scripts/plot.C new file mode 100644 index 0000000..f6011ca --- /dev/null +++ b/scripts/plot.C @@ -0,0 +1,69 @@ +void plot() { + // Turn off stats boxes + gStyle->SetOptStat(0); + + // Open files and get trees + TFile *f0 = TFile::Open("testnoCR.root"); + TFile *f1 = TFile::Open("test.root"); + TTree *t0 = (TTree*)f0->Get("analysis"); + TTree *t1 = (TTree*)f1->Get("analysis"); + + // Define log bins + int nBins = 100; + double xMin = 0.01, xMax = 3.2; + double logMin = std::log10(xMin); + double logMax = std::log10(xMax); + double binWidth = (logMax - logMin) / nBins; + double* logBins = new double[nBins + 1]; + for (int i = 0; i <= nBins; ++i) logBins[i] = std::pow(10, logMin + i * binWidth); + + // Create histograms + TH1F* h0 = new TH1F("h0", "b_theta_corr from testnoCR", nBins, logBins); + TH1F* h1 = new TH1F("h1", "b_theta_corr from test", nBins, logBins); + + // Fill histograms + t0->Draw("b_theta_corr>>h0", "", "goff"); + t1->Draw("b_theta_corr>>h1", "", "goff"); + + // Normalize both histograms by their integrals + h0->Scale(1.0 / h0->Integral()); + h1->Scale(1.0 / h1->Integral()); + + // Styling + h0->SetLineColor(kRed); h0->SetLineWidth(2); + h1->SetLineColor(kBlue); h1->SetLineWidth(2); + + // Create canvas with 2 pads + TCanvas* c = new TCanvas("c", "Comparison with Ratio", 800, 800); + c->Divide(1, 2); + + // Top pad: overlay histograms + c->cd(1); + gPad->SetLogx(); + gPad->SetLogy(); + h0->SetTitle("b_theta_corr;b_theta_corr;Normalized Events"); + h0->Draw("hist"); + h1->Draw("hist same"); + + // Legend moved to top-left + TLegend* leg = new TLegend(0.15, 0.75, 0.45, 0.88); + leg->AddEntry(h0, "testnoCR.root (normalized)", "l"); + leg->AddEntry(h1, "test.root (normalized)", "l"); + leg->Draw(); + + // Bottom pad: ratio h1/h0 + c->cd(2); + gPad->SetLogx(); + + TH1F* h_ratio = (TH1F*)h1->Clone("h_ratio"); + h_ratio->Divide(h0); + h_ratio->SetTitle("Ratio (test / testnoCR);b_theta_corr;Ratio"); + h_ratio->SetLineColor(kBlack); + h_ratio->SetMinimum(0.9); + h_ratio->SetMaximum(1.1); + h_ratio->Draw("hist"); + + c->Update(); + c->SaveAs("b_theta_corr_comparison.png"); +} + From 66698b0820e91e3def99f928cd167f912b56019c Mon Sep 17 00:00:00 2001 From: Iza Veliscek Date: Thu, 24 Jul 2025 17:19:38 -0400 Subject: [PATCH 25/40] scripts/plotall.C --- scripts/plotall.C | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 scripts/plotall.C diff --git a/scripts/plotall.C b/scripts/plotall.C new file mode 100644 index 0000000..678e4f6 --- /dev/null +++ b/scripts/plotall.C @@ -0,0 +1,112 @@ +void plot() { + gStyle->SetOptStat(0); + + // Custom binning to match z = (1 - cos(θ)) / 2 axis + int nBins = 100; + double xMin = 0.01, xMax = 3.1; + double logMin = std::log10(xMin); + double logMax = std::log10(xMax); + double binWidth = (logMax - logMin) / nBins; + double* logBins = new double[nBins + 1]; + for (int i = 0; i <= nBins; ++i) logBins[i] = std::pow(10, logMin + i * binWidth); + + // const int nLowBins = 20; + // const int nHighBins = 20; + // const int nMidBins = 10; + // const int nBins = nLowBins + nMidBins + nHighBins; + // double* bins = new double[nBins + 1]; + + // const double lowStart = 1e-4, lowEnd = 1e-2; + // const double highStart = 1 - 1e-2, highEnd = 1 - 1e-4; + // const double midStart = lowEnd, midEnd = highStart; + + // double logLowStart = TMath::Log10(lowStart); + // double logLowEnd = TMath::Log10(lowEnd); + // for (int i = 0; i <= nLowBins; ++i) + // bins[i] = TMath::Power(10, logLowStart + i * (logLowEnd - logLowStart) / nLowBins); + + // for (int i = 1; i <= nMidBins; ++i) + // bins[nLowBins + i] = midStart + i * (midEnd - midStart) / nMidBins; + + // double logHighStart = TMath::Log10(1 - highStart); + // double logHighEnd = TMath::Log10(1 - highEnd); + // for (int i = 0; i <= nHighBins; ++i) + // bins[nLowBins + nMidBins + i] = 1 - TMath::Power(10, logHighStart + i * (logHighEnd - logHighStart) / nHighBins); + + // Load trees + TFile *fNom = TFile::Open("test.root"); + TFile *fCR = TFile::Open("testnoCR.root"); + TFile *fSKI = TFile::Open("testnoSKI.root"); + TFile *fSKII = TFile::Open("testnoSKII.root"); + + TTree *tNom = (TTree*)fNom->Get("analysis"); + TTree *tCR = (TTree*)fCR->Get("analysis"); + TTree *tSKI = (TTree*)fSKI->Get("analysis"); + TTree *tSKII = (TTree*)fSKII->Get("analysis"); + + // Histograms + TH1F *hNom = new TH1F("hNom", "delta_theta;Normalized Events", nBins, logBins); + TH1F *hCR = new TH1F("hCR", "", nBins, logBins); + TH1F *hSKI = new TH1F("hSKI", "", nBins, logBins); + TH1F *hSKII = new TH1F("hSKII", "", nBins, logBins); + + // Fill + tNom->Draw("b_theta_corr >> hNom", "", "goff"); + tCR->Draw("b_theta_corr >> hCR", "", "goff"); + tSKI->Draw("b_theta_corr >> hSKI", "", "goff"); + tSKII->Draw("b_theta_corr >> hSKII", "", "goff"); + + // Normalize + hNom->Scale(1.0 / hNom->Integral()); + hCR->Scale(1.0 / hCR->Integral()); + hSKI->Scale(1.0 / hSKI->Integral()); + hSKII->Scale(1.0 / hSKII->Integral()); + + // Ratio to Nominal + TH1F *rCR = (TH1F*)hCR->Clone("rCR"); rCR->Divide(hNom); + TH1F *rSKI = (TH1F*)hSKI->Clone("rSKI"); rSKI->Divide(hNom); + TH1F *rSKII = (TH1F*)hSKII->Clone("rSKII"); rSKII->Divide(hNom); + + // Canvas + TCanvas *c = new TCanvas("c", "comparison", 800, 800); + c->Divide(1, 2); + + // Upper plot + c->cd(1); + gPad->SetLogx(); + gPad->SetLogy(); + hNom->SetLineColor(kBlack); hNom->SetLineWidth(3); + hCR->SetLineColor(kRed); hCR->SetLineWidth(3); + hSKI->SetLineColor(kBlue); hSKI->SetLineWidth(3); + hSKII->SetLineColor(kGreen+2); hSKII->SetLineWidth(3); + + hNom->Draw("HIST"); + hCR->Draw("HIST SAME"); + hSKI->Draw("HIST SAME"); + hSKII->Draw("HIST SAME"); + + auto leg = new TLegend(0.15, 0.75, 0.45, 0.88); + leg->AddEntry(hNom, "Nominal", "l"); + leg->AddEntry(hCR, "noCR", "l"); + leg->AddEntry(hSKI, "SKI", "l"); + leg->AddEntry(hSKII, "SKII", "l"); + leg->Draw(); + + // Ratio plot + c->cd(2); + gPad->SetLogx(); + rCR->SetMinimum(0.85); rCR->SetMaximum(1.1); + rCR->SetLineColor(kRed); + // rCR->SetTitle("Ratio to Nominal;z = (1 - cos(#theta))/2;Ratio"); + rCR->Draw("HIST"); + rCR->SetLineWidth(3); + rSKI->SetLineColor(kBlue); + rSKI->SetLineWidth(3); + rSKI->Draw("HIST SAME"); + rSKII->SetLineColor(kGreen+2); + rSKII->SetLineWidth(3); + rSKII->Draw("HIST SAME"); + + c->SaveAs("b_theta_corr_comparison_full_all.png"); +} + From 37f9dcb9acbf23334a65de141c03b4fa19c987ba Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 25 Jul 2025 10:03:14 -0400 Subject: [PATCH 26/40] hadronic decay cuts added --- PostCutCode/Root/AnalysisWWCR.cxx | 70 +++++++++++++++++-------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 051b251..9aa965f 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -46,37 +46,6 @@ QuarkCounter countQuarks(const ROOT::VecOps::RVec* jet_truth) { return counter; } -// void CosPhi_Angle(const TLorentzVector& jet1, const TLorentzVector& jet2, TH1F* hist_global_theta, TH1F *hist_delta_theta, TH1F *hist_cos_theta, -// TH1F* hist_delta_eta, TH1F* hist_delta_phi, TH1F* hist_cosphi, TH1F* hist_eec_theta, TH1F* hist_eec_phi) { - -// double global_theta = jet1.Angle(jet2.Vect()); -// double delta_theta = jet1.Theta() - jet2.Theta(); -// double cos_theta = cos(global_theta); - -// double delta_eta = jet1.Eta() - jet2.Eta(); -// double delta_phi = jet1.Phi() - jet2.Phi(); -// double cos_phi = cos(delta_phi); - -// double ee_correlator_theta = 0.5 * (1 - cos_theta); -// double ee_correlator_phi = 0.5 * (1 - cos_phi); - -// // double degrees = radians * 180.0 / TMath::Pi(); - -// double global_theta_deg = global_theta * 180.0 / TMath::Pi(); -// double delta_theta_deg = delta_theta * 180.0 / TMath::Pi(); -// double delta_eta_deg = delta_eta * 180 / TMath::Pi(); -// double delta_phi_deg = delta_phi * 180.0 / TMath::Pi(); - -// hist_global_theta->Fill(global_theta_deg); -// hist_delta_theta->Fill(delta_theta_deg); -// hist_cos_theta->Fill(cos_theta); -// hist_delta_eta->Fill(delta_eta_deg); -// hist_delta_phi->Fill(delta_phi_deg); -// hist_cosphi->Fill(cos_phi); -// hist_eec_theta->Fill(ee_correlator_theta); -// hist_eec_phi->Fill(ee_correlator_phi); -// } - void AnalysisWWCR::run() { std::vector cutFlowMap {"All Events", "DecayCuts", "NoNaNFlavScore", "Has 4 Jets", "leptonCut", "d123Cut", "d34Cut", "Events have a c, s, and 2 l tagged jets"}; @@ -88,7 +57,7 @@ void AnalysisWWCR::run() { std::ifstream customF(MDC::GetInstance()->getCustomSOWJSONFile()); nlohmann::json customData = nlohmann::json::parse(customF); - auto sName = MDC::GetInstance()->getSampleName(); + auto sName = MDC::GetInstance()->getSampleName(); double norm_weight = (double)data[sName]["crossSection"]/(double)data[sName]["sumOfWeights"]; @@ -300,6 +269,43 @@ void AnalysisWWCR::run() { eventNum++; + // Add in a pre-selection cut to look at hadronic decays + QuarkCounter W1_quarks = countQuarks(Wm_jet_truth); + QuarkCounter W2_quarks = countQuarks(Wp_jet_truth); + + bool W1_is_cs = ( (W1_quarks.n_c == 1 && W1_quarks.n_s == 1) ); + // bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + bool W1_is_ud = ( (W1_quarks.n_u == 1 && W1_quarks.n_d == 1) ); + bool W1_is_us = ( (W1_quarks.n_u == 1 && W1_quarks.n_s == 1) ); + bool W1_is_ub = ( (W1_quarks.n_u == 1 && W1_quarks.n_b == 1) ); + bool W1_is_cd = ( (W1_quarks.n_c == 1 && W1_quarks.n_d == 1) ); + bool W1_is_cb = ( (W1_quarks.n_c == 1 && W1_quarks.n_b == 1) ); + + // bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); + bool W2_is_cs = ( (W2_quarks.n_c == 1 && W2_quarks.n_s == 1) ); + bool W2_is_ud = ( (W2_quarks.n_u == 1 && W2_quarks.n_d == 1) ); + bool W2_is_us = ( (W2_quarks.n_u == 1 && W2_quarks.n_s == 1) ); + bool W2_is_ub = ( (W2_quarks.n_u == 1 && W2_quarks.n_b == 1) ); + bool W2_is_cd = ( (W2_quarks.n_c == 1 && W2_quarks.n_d == 1) ); + bool W2_is_cb = ( (W2_quarks.n_c == 1 && W2_quarks.n_b == 1) ); + + int W1_decay_idx = -1, W2_decay_idx = -1; + bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; + bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; + for (int i = 0; i < 6; ++i) { + if (W1_decay_types[i]) W1_decay_idx = i; + if (W2_decay_types[i]) W2_decay_idx = i; + } + + if (! ( + (W1_is_cs && W2_is_ud) + // (W1_is_ud && W2_is_ud) + // (W1_is_cs && W2_is_cs) + )) continue; + if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; + + NdecayCuts++; + if(event_njet() != 4) continue; NjetCut++; From ac418282ad47cccf88e46679a770705181df1382 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 25 Jul 2025 11:03:35 -0400 Subject: [PATCH 27/40] added truth level cut --- PostCutCode/Root/AnalysisWWCR.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 9aa965f..fc7522f 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -297,6 +297,7 @@ void AnalysisWWCR::run() { if (W2_decay_types[i]) W2_decay_idx = i; } + // add all hadronic if (! ( (W1_is_cs && W2_is_ud) // (W1_is_ud && W2_is_ud) @@ -457,6 +458,7 @@ void AnalysisWWCR::run() { else if (maxScoreIdx[i] == 2) lJets.push_back(i); } + // remove this section // Prevent jet reuse: ensure all jet indices are unique std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; From f0f8bd77450d4621d335fdcf63946456711eb567 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 25 Jul 2025 11:16:00 -0400 Subject: [PATCH 28/40] all hadronic decays selected on truth level --- PostCutCode/Root/AnalysisWWCR.cxx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index fc7522f..72f4966 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -297,13 +297,18 @@ void AnalysisWWCR::run() { if (W2_decay_types[i]) W2_decay_idx = i; } - // add all hadronic - if (! ( - (W1_is_cs && W2_is_ud) - // (W1_is_ud && W2_is_ud) - // (W1_is_cs && W2_is_cs) + // add all hadronic decays, there is probably a more efficient way of doing this + if (!( + (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_cb) || + (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_cb) || + (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_cb) || + (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_cb) || + (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_cb) || + (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_cb) )) continue; - if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; + +if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; + NdecayCuts++; From b93e1a846c9a12dcdf44abed35790a483d4d395a Mon Sep 17 00:00:00 2001 From: Iza Veliscek Date: Fri, 25 Jul 2025 12:07:37 -0400 Subject: [PATCH 29/40] truth level selection of WW->4q events --- PostCutCode/Root/AnalysisWWCR.cxx | 155 +++++++++++++++--------------- 1 file changed, 77 insertions(+), 78 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 72f4966..0e107b1 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -292,22 +292,27 @@ void AnalysisWWCR::run() { int W1_decay_idx = -1, W2_decay_idx = -1; bool W1_decay_types[] = {W1_is_cs, W1_is_ud, W1_is_us, W1_is_ub, W1_is_cd, W1_is_cb}; bool W2_decay_types[] = {W2_is_cs, W2_is_ud, W2_is_us, W2_is_ub, W2_is_cd, W2_is_cb}; - for (int i = 0; i < 6; ++i) { - if (W1_decay_types[i]) W1_decay_idx = i; - if (W2_decay_types[i]) W2_decay_idx = i; - } - // add all hadronic decays, there is probably a more efficient way of doing this - if (!( - (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_cb) || - (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_cb) || - (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_cb) || - (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_cb) || - (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_cb) || - (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_cb) - )) continue; + int W1_nHad = W1_quarks.n_u+W1_quarks.n_d+W1_quarks.n_b+W1_quarks.n_s+W1_quarks.n_c; + int W2_nHad = W2_quarks.n_u+W2_quarks.n_d+W2_quarks.n_b+W2_quarks.n_s+W2_quarks.n_c; + //select onlt WW->all had + if (W1_nHad==0 || W2_nHad==0) continue; + // for (int i = 0; i < 6; ++i) { + // if (W1_decay_types[i]) W1_decay_idx = i; + // if (W2_decay_types[i]) W2_decay_idx = i; + // } + + // // add all hadronic decays, there is probably a more efficient way of doing this + // if (!( + // (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_cb) || + // (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_cb) || + // (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_cb) || + // (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_cb) || + // (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_cb) || + // (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_cb) + // )) continue; -if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; + // if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; NdecayCuts++; @@ -448,44 +453,34 @@ if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; else if (maxScoreIdx[i] == 2) n_l++; } - if (has_invalid_flavor) continue; + // if (has_invalid_flavor) continue; - if (!(n_c == 1 && n_l == 3)) continue; + // if (!(n_c == 1 && n_l == 3)) continue; nFlavScore++; // Start Pairing the jets in W1 and W2 - int cJet = -1; - std::vector lJets; + // int cJet = -1; + // std::vector lJets; - for (int i = 0; i < 4; ++i) { - if (maxScoreIdx[i] == 1) cJet = i; - else if (maxScoreIdx[i] == 2) lJets.push_back(i); - } + // for (int i = 0; i < 4; ++i) { + // if (maxScoreIdx[i] == 1) cJet = i; + // else if (maxScoreIdx[i] == 2) lJets.push_back(i); + // } - // remove this section - // Prevent jet reuse: ensure all jet indices are unique - std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; + // // remove this section + // // Prevent jet reuse: ensure all jet indices are unique + // std::set uniqueJets = {cJet, lJets[0], lJets[1], lJets[2]}; - if (cJet == -1 || lJets.size() != 3 || uniqueJets.size() < 4) { - if (cJet == lJets[0] && cJet == lJets[1] && cJet == lJets[2] && - lJets[0] == lJets[1] && lJets[0] == lJets[2] && lJets[1] == lJets[2]) { + // if (cJet == -1 || lJets.size() != 3 || uniqueJets.size() < 4) { + // if (cJet == lJets[0] && cJet == lJets[1] && cJet == lJets[2] && + // lJets[0] == lJets[1] && lJets[0] == lJets[2] && lJets[1] == lJets[2]) { - std::cerr << "Error: Jet reuse detected or invalid jet assignment!" << std::endl; - continue; - - } - } + // std::cerr << "Error: Jet reuse detected or invalid jet assignment!" << std::endl; + // continue; - // W pair 1: c + s and u+d - std::pair W1_pair = {cJet, lJets[0]}; - std::pair W2_pair = {lJets[1], lJets[2]}; - - if (do_debug && nPrinted < maxPrint) { - std::cout << "W1 pair: Jet " << W1_pair.first << " (c), Jet " << W1_pair.second << " (s)" << std::endl; - std::cout << "W2 pair: Jet " << W2_pair.first << " (l), Jet " << W2_pair.second << " (l)" << std::endl; - std::cout << " " << std::endl; - } + // } + // } // ****************************** CALCULATIONS USING JET CONSTITUENTS ****************************** std::vector jetConstituents; // flattens the overall vector and allows us to open it up @@ -684,24 +679,28 @@ if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; } // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** - TLorentzVector cTag_Jet, lTag_Jet_0, lTag_Jet_1, lTag_Jet_2; + TLorentzVector Jet1, Jet2, Jet3, Jet4; - cTag_Jet.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - lTag_Jet_0.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); + // Jet1.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); + // Jet2.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - lTag_Jet_1.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - lTag_Jet_2.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); - + // Jet3.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); + // Jet3.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); + Jet1.SetPxPyPzE(jet_px.at(0), jet_py.at(0), jet_pz.at(0), jet_e.at(0)); + Jet2.SetPxPyPzE(jet_px.at(1), jet_py.at(1), jet_pz.at(1), jet_e.at(1)); + + Jet3.SetPxPyPzE(jet_px.at(2), jet_py.at(2), jet_pz.at(2), jet_e.at(2)); + Jet4.SetPxPyPzE(jet_px.at(3), jet_py.at(3), jet_pz.at(3), jet_e.at(3)); const double m_W_true = 80.379; - TLorentzVector W1_option1 = cTag_Jet + lTag_Jet_0; - TLorentzVector W2_option1 = lTag_Jet_1 + lTag_Jet_2; + TLorentzVector W1_option1 = Jet1 + Jet2; + TLorentzVector W2_option1 = Jet3 + Jet4; - TLorentzVector W1_option2 = cTag_Jet + lTag_Jet_1; - TLorentzVector W2_option2 = lTag_Jet_0 + lTag_Jet_2; + TLorentzVector W1_option2 = Jet1 + Jet3; + TLorentzVector W2_option2 = Jet2 + Jet4; - TLorentzVector W1_option3 = cTag_Jet + lTag_Jet_2; - TLorentzVector W2_option3 = lTag_Jet_0 + lTag_Jet_1; + TLorentzVector W1_option3 = Jet1 + Jet4; + TLorentzVector W2_option3 = Jet2 + Jet3; double chi2_option1 = (pow(W1_option1.M() - m_W_true, 2) + pow(W2_option1.M() - m_W_true, 2)) / (m_W_true); @@ -726,16 +725,16 @@ if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; h_W1_e->Fill(W1_option1.E()); h_W2_e->Fill(W2_option1.E()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + h_cJet_p->Fill(Jet1.P()); + h_lJet0_p->Fill(Jet2.P()); + h_lJet1_p->Fill(Jet3.P()); + h_lJet2_p->Fill(Jet4.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_0; + W1_j1 = Jet1; + W1_j2 = Jet2; - W2_j1 = lTag_Jet_1; - W2_j2 = lTag_Jet_2; + W2_j1 = Jet3; + W2_j2 = Jet4; } else if (chi2_option2 <= chi2_option1 && chi2_option2 <= chi2_option3) { h_W1_mass->Fill(W1_option2.M()); @@ -748,16 +747,16 @@ if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; h_W1_e->Fill(W1_option2.E()); h_W2_e->Fill(W2_option2.E()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + h_cJet_p->Fill(Jet1.P()); + h_lJet0_p->Fill(Jet2.P()); + h_lJet1_p->Fill(Jet3.P()); + h_lJet2_p->Fill(Jet4.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_1; + W1_j1 = Jet1; + W1_j2 = Jet3; - W2_j1 = lTag_Jet_0; - W2_j2 = lTag_Jet_2; + W2_j1 = Jet2; + W2_j2 = Jet4; } else { h_W1_mass->Fill(W1_option3.M()); @@ -770,16 +769,16 @@ if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; h_W1_e->Fill(W1_option3.E()); h_W2_e->Fill(W2_option3.E()); - h_cJet_p->Fill(cTag_Jet.P()); - h_lJet0_p->Fill(lTag_Jet_0.P()); - h_lJet1_p->Fill(lTag_Jet_1.P()); - h_lJet2_p->Fill(lTag_Jet_2.P()); + h_cJet_p->Fill(Jet1.P()); + h_lJet0_p->Fill(Jet2.P()); + h_lJet1_p->Fill(Jet3.P()); + h_lJet2_p->Fill(Jet3.P()); - W1_j1 = cTag_Jet; - W1_j2 = lTag_Jet_2; + W1_j1 = Jet1; + W1_j2 = Jet4; - W2_j1 = lTag_Jet_1; - W2_j2 = lTag_Jet_0; + W2_j1 = Jet3; + W2_j2 = Jet2; } mc_weight = norm_weight; From bf80ed43123682f1a017005572e7e8057e5c8ac2 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 28 Jul 2025 02:04:32 -0400 Subject: [PATCH 30/40] added mostly complete plots for theta, phi, and chi. Issues with cosine plots --- scripts/plotall.C | 397 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 345 insertions(+), 52 deletions(-) diff --git a/scripts/plotall.C b/scripts/plotall.C index 678e4f6..4371256 100644 --- a/scripts/plotall.C +++ b/scripts/plotall.C @@ -35,9 +35,9 @@ void plot() { // Load trees TFile *fNom = TFile::Open("test.root"); - TFile *fCR = TFile::Open("testnoCR.root"); - TFile *fSKI = TFile::Open("testnoSKI.root"); - TFile *fSKII = TFile::Open("testnoSKII.root"); + TFile *fCR = TFile::Open("test_noCR.root"); + TFile *fSKI = TFile::Open("test_SKI.root"); + TFile *fSKII = TFile::Open("test_SKII.root"); TTree *tNom = (TTree*)fNom->Get("analysis"); TTree *tCR = (TTree*)fCR->Get("analysis"); @@ -45,68 +45,361 @@ void plot() { TTree *tSKII = (TTree*)fSKII->Get("analysis"); // Histograms - TH1F *hNom = new TH1F("hNom", "delta_theta;Normalized Events", nBins, logBins); - TH1F *hCR = new TH1F("hCR", "", nBins, logBins); - TH1F *hSKI = new TH1F("hSKI", "", nBins, logBins); - TH1F *hSKII = new TH1F("hSKII", "", nBins, logBins); + TH1F *h_theta_Nom = new TH1F("h_theta_Nom", "#Delta#theta;#theta;Normalized Events", nBins, logBins); + TH1F *h_theta_CR = new TH1F("h_theta_CR", "", nBins, logBins); + TH1F *h_theta_SKI = new TH1F("h_theta_SKI", "", nBins, logBins); + TH1F *h_theta_SKII = new TH1F("h_theta_SKII", "", nBins, logBins); + + TH1F *h_phi_Nom = new TH1F("h_phi_Nom", "#Delta#phi;Normalized Events", nBins, logBins); + TH1F *h_phi_CR = new TH1F("h_phi_CR", "", nBins, logBins); + TH1F *h_phi_SKI = new TH1F("h_phi_SKI", "", nBins, logBins); + TH1F *h_phi_SKII = new TH1F("h_phi_SKII", "", nBins, logBins); + + TH1F *h_chi_Nom = new TH1F("h_chi_Nom", "#Delta#chi;Normalized Events", nBins, logBins); + TH1F *h_chi_CR = new TH1F("h_chi_CR", "", nBins, logBins); + TH1F *h_chi_SKI = new TH1F("h_chi_SKI", "", nBins, logBins); + TH1F *h_chi_SKII = new TH1F("h_chi_SKII", "", nBins, logBins); + + TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); + TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); + TH1F *h_eec_theta_SKI = new TH1F("h_eec_theta_SKI", "", nBins, logBins); + TH1F *h_eec_theta_SKII = new TH1F("h_eec_theta_SKII", "", nBins, logBins); + + TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", 100, -1.0, 1.0); + TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", 100, -1.0, 1.0); + TH1D* h_cos_theta_SKI = new TH1D("h_cos_theta_SKI", "Cos(theta) - SKI", 100, -1.0, 1.0); + TH1D* h_cos_theta_SKII = new TH1D("h_cos_theta_SKII", "Cos(theta) - SKII", 100, -1.0, 1.0); // Fill - tNom->Draw("b_theta_corr >> hNom", "", "goff"); - tCR->Draw("b_theta_corr >> hCR", "", "goff"); - tSKI->Draw("b_theta_corr >> hSKI", "", "goff"); - tSKII->Draw("b_theta_corr >> hSKII", "", "goff"); + tNom->Draw("b_theta_corr >> h_theta_Nom", "", "goff"); + tCR->Draw("b_theta_corr >> h_theta_CR", "", "goff"); + tSKI->Draw("b_theta_corr >> h_theta_SKI", "", "goff"); + tSKII->Draw("b_theta_corr >> h_theta_SKII", "", "goff"); + + tNom->Draw("b_phi_corr >> h_phi_Nom", "", "goff"); + tCR->Draw("b_phi_corr >> h_phi_CR", "", "goff"); + tSKI->Draw("b_phi_corr >> h_phi_SKI", "", "goff"); + tSKII->Draw("b_phi_corr >> h_phi_SKII", "", "goff"); + + tNom->Draw("b_chi_corr >> h_chi_Nom", "", "goff"); + tCR->Draw("b_chi_corr >> h_chi_CR", "", "goff"); + tSKI->Draw("b_chi_corr >> h_chi_SKI", "", "goff"); + tSKII->Draw("b_chi_corr >> h_chi_SKII", "", "goff"); // Normalize - hNom->Scale(1.0 / hNom->Integral()); - hCR->Scale(1.0 / hCR->Integral()); - hSKI->Scale(1.0 / hSKI->Integral()); - hSKII->Scale(1.0 / hSKII->Integral()); + h_theta_Nom->Scale(1.0 / h_theta_Nom->Integral()); + h_theta_CR->Scale(1.0 / h_theta_CR->Integral()); + h_theta_SKI->Scale(1.0 / h_theta_SKI->Integral()); + h_theta_SKII->Scale(1.0 / h_theta_SKII->Integral()); + + h_phi_Nom->Scale(1.0 / h_phi_Nom->Integral()); + h_phi_CR->Scale(1.0 / h_phi_CR->Integral()); + h_phi_SKI->Scale(1.0 / h_phi_SKI->Integral()); + h_phi_SKII->Scale(1.0 / h_phi_SKII->Integral()); + + h_chi_Nom->Scale(1.0 / h_chi_Nom->Integral()); + h_chi_CR->Scale(1.0 / h_chi_CR->Integral()); + h_chi_SKI->Scale(1.0 / h_chi_SKI->Integral()); + h_chi_SKII->Scale(1.0 / h_chi_SKII->Integral()); // Ratio to Nominal - TH1F *rCR = (TH1F*)hCR->Clone("rCR"); rCR->Divide(hNom); - TH1F *rSKI = (TH1F*)hSKI->Clone("rSKI"); rSKI->Divide(hNom); - TH1F *rSKII = (TH1F*)hSKII->Clone("rSKII"); rSKII->Divide(hNom); + TH1F *r_theta_CR = (TH1F*)h_theta_CR->Clone("r_theta_CR"); r_theta_CR->Divide(h_theta_Nom); + TH1F *r_theta_SKI = (TH1F*)h_theta_SKI->Clone("r_theta_SKI"); r_theta_SKI->Divide(h_theta_Nom); + TH1F *r_theta_SKII = (TH1F*)h_theta_SKII->Clone("r_theta_SKII"); r_theta_SKII->Divide(h_theta_Nom); + + TH1F *r_phi_CR = (TH1F*)h_phi_CR->Clone("r_phi_CR"); r_phi_CR->Divide(h_phi_Nom); + TH1F *r_phi_SKI = (TH1F*)h_phi_SKI->Clone("r_phi_SKI"); r_phi_SKI->Divide(h_phi_Nom); + TH1F *r_phi_SKII = (TH1F*)h_phi_SKII->Clone("r_phi_SKII"); r_phi_SKII->Divide(h_phi_Nom); + + TH1F *r_chi_CR = (TH1F*)h_chi_CR->Clone("r_chi_CR"); r_chi_CR->Divide(h_chi_Nom); + TH1F *r_chi_SKI = (TH1F*)h_chi_SKI->Clone("r_chi_SKI"); r_chi_SKI->Divide(h_chi_Nom); + TH1F *r_chi_SKII = (TH1F*)h_chi_SKII->Clone("r_chi_SKII"); r_chi_SKII->Divide(h_chi_Nom); + + // Canvas 1 + TCanvas *c_theta = new TCanvas("c_theta", "comparison", 1000, 800); + c_theta->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad = new TPad("topPad", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad->SetBottomMargin(0.025); + topPad->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad = new TPad("bottomPad", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad->SetTopMargin(0.025); // Small top margin + bottomPad->SetBottomMargin(0.2); // More space for x-axis label + bottomPad->Draw(); + + // Upper plot + topPad->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_theta_Nom->SetTitle("b_theta_corr"); + h_theta_Nom->GetXaxis()->SetLabelSize(0); + h_theta_Nom->GetYaxis()->SetTitle("normalized events"); + h_theta_Nom->GetYaxis()->CenterTitle(true); + h_theta_Nom->GetXaxis()->SetTitleSize(0.08); + h_theta_Nom->GetYaxis()->SetTitleOffset(1.0); - // Canvas - TCanvas *c = new TCanvas("c", "comparison", 800, 800); - c->Divide(1, 2); + h_theta_Nom->SetLineColor(kBlack); h_theta_Nom->SetLineWidth(3); + h_theta_CR->SetLineColor(kRed); h_theta_CR->SetLineWidth(3); + h_theta_SKI->SetLineColor(kBlue); h_theta_SKI->SetLineWidth(3); + h_theta_SKII->SetLineColor(kGreen+2); h_theta_SKII->SetLineWidth(3); + + h_theta_Nom->Draw("HIST"); + h_theta_CR->Draw("HIST SAME"); + h_theta_SKI->Draw("HIST SAME"); + h_theta_SKII->Draw("HIST SAME"); + + auto leg_theta = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_theta->AddEntry(h_theta_Nom, "Nominal", "l"); + leg_theta->AddEntry(h_theta_CR, "noCR", "l"); + leg_theta->AddEntry(h_theta_SKI, "SKI", "l"); + leg_theta->AddEntry(h_theta_SKII, "SKII", "l"); + leg_theta->Draw(); + + // Ratio plot + bottomPad->cd(); + gPad->SetLogx(); + r_theta_CR->SetMinimum(0.85); r_theta_CR->SetMaximum(1.1); + r_theta_CR->SetLineColor(kRed); + // r_theta_CR->SetTitle("Ratio to Nominal;z = (1 - cos(#theta))/2;Ratio"); + r_theta_CR->Draw("HIST"); + r_theta_CR->SetLineWidth(3); + r_theta_SKI->SetLineColor(kBlue); + r_theta_SKI->SetLineWidth(3); + r_theta_SKI->Draw("HIST SAME"); + r_theta_SKII->SetLineColor(kGreen+2); + r_theta_SKII->SetLineWidth(3); + r_theta_SKII->Draw("HIST SAME"); + + r_theta_CR->GetXaxis()->SetTitle("#theta (degrees)"); // Axis titles + r_theta_CR->GetYaxis()->SetTitle("ratio"); + r_theta_CR->GetXaxis()->CenterTitle(true); // Center them + r_theta_CR->GetYaxis()->CenterTitle(true); + r_theta_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_theta_CR->GetYaxis()->SetTitleSize(0.055); + r_theta_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_theta_CR->GetYaxis()->SetLabelSize(0.05); + r_theta_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_theta_CR->GetYaxis()->SetTitleOffset(0.55); + + + // Canvas 2 + TCanvas *c_phi = new TCanvas("c_phi", "comparison", 1000, 800); + c_phi->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_phi = new TPad("topPad_phi", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_phi->SetBottomMargin(0.025); + topPad_phi->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_phi = new TPad("bottomPad_phi", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_phi->SetTopMargin(0.025); // Small top margin + bottomPad_phi->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_phi->Draw(); // Upper plot - c->cd(1); + topPad_phi->cd(); gPad->SetLogx(); gPad->SetLogy(); - hNom->SetLineColor(kBlack); hNom->SetLineWidth(3); - hCR->SetLineColor(kRed); hCR->SetLineWidth(3); - hSKI->SetLineColor(kBlue); hSKI->SetLineWidth(3); - hSKII->SetLineColor(kGreen+2); hSKII->SetLineWidth(3); - - hNom->Draw("HIST"); - hCR->Draw("HIST SAME"); - hSKI->Draw("HIST SAME"); - hSKII->Draw("HIST SAME"); - - auto leg = new TLegend(0.15, 0.75, 0.45, 0.88); - leg->AddEntry(hNom, "Nominal", "l"); - leg->AddEntry(hCR, "noCR", "l"); - leg->AddEntry(hSKI, "SKI", "l"); - leg->AddEntry(hSKII, "SKII", "l"); - leg->Draw(); + + h_phi_Nom->SetTitle("b_phi_corr"); + h_phi_Nom->GetXaxis()->SetLabelSize(0); + h_phi_Nom->GetYaxis()->SetTitle("normalized events"); + h_phi_Nom->GetYaxis()->CenterTitle(true); + h_phi_Nom->GetXaxis()->SetTitleSize(0.08); + h_phi_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_phi_Nom->SetLineColor(kBlack); h_phi_Nom->SetLineWidth(3); + h_phi_CR->SetLineColor(kRed); h_phi_CR->SetLineWidth(3); + h_phi_SKI->SetLineColor(kBlue); h_phi_SKI->SetLineWidth(3); + h_phi_SKII->SetLineColor(kGreen+2); h_phi_SKII->SetLineWidth(3); + + h_phi_Nom->Draw("HIST"); + h_phi_CR->Draw("HIST SAME"); + h_phi_SKI->Draw("HIST SAME"); + h_phi_SKII->Draw("HIST SAME"); + + auto leg_phi = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_phi->AddEntry(h_phi_Nom, "Nominal", "l"); + leg_phi->AddEntry(h_phi_CR, "noCR", "l"); + leg_phi->AddEntry(h_phi_SKI, "SKI", "l"); + leg_phi->AddEntry(h_phi_SKII, "SKII", "l"); + leg_phi->Draw(); // Ratio plot - c->cd(2); + bottomPad_phi->cd(); gPad->SetLogx(); - rCR->SetMinimum(0.85); rCR->SetMaximum(1.1); - rCR->SetLineColor(kRed); - // rCR->SetTitle("Ratio to Nominal;z = (1 - cos(#theta))/2;Ratio"); - rCR->Draw("HIST"); - rCR->SetLineWidth(3); - rSKI->SetLineColor(kBlue); - rSKI->SetLineWidth(3); - rSKI->Draw("HIST SAME"); - rSKII->SetLineColor(kGreen+2); - rSKII->SetLineWidth(3); - rSKII->Draw("HIST SAME"); - - c->SaveAs("b_theta_corr_comparison_full_all.png"); + + r_phi_CR->SetMinimum(0.85); r_phi_CR->SetMaximum(1.1); + r_phi_CR->SetLineColor(kRed); + r_phi_CR->Draw("HIST"); + r_phi_CR->SetLineWidth(3); + r_phi_SKI->SetLineColor(kBlue); + r_phi_SKI->SetLineWidth(3); + r_phi_SKI->Draw("HIST SAME"); + r_phi_SKII->SetLineColor(kGreen+2); + r_phi_SKII->SetLineWidth(3); + r_phi_SKII->Draw("HIST SAME"); + + r_phi_CR->GetXaxis()->SetTitle("#phi (degrees)"); // Axis titles + r_phi_CR->GetYaxis()->SetTitle("ratio"); + r_phi_CR->GetXaxis()->CenterTitle(true); // Center them + r_phi_CR->GetYaxis()->CenterTitle(true); + r_phi_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_phi_CR->GetYaxis()->SetTitleSize(0.055); + r_phi_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_phi_CR->GetYaxis()->SetLabelSize(0.05); + r_phi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_phi_CR->GetYaxis()->SetTitleOffset(0.55); + + + // Canvas 3 + TCanvas *c_chi = new TCanvas("c_chi", "comparison", 1000, 800); + c_chi->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_chi = new TPad("topPad_chi", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_chi->SetBottomMargin(0.025); + topPad_chi->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_chi = new TPad("bottomPad_chi", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_chi->SetTopMargin(0.025); // Small top margin + bottomPad_chi->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_chi->Draw(); + + // Upper plot + topPad_chi->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_chi_Nom->SetTitle("b_chi_corr"); + h_chi_Nom->GetXaxis()->SetLabelSize(0); + h_chi_Nom->GetYaxis()->SetTitle("normalized events"); + h_chi_Nom->GetYaxis()->CenterTitle(true); + h_chi_Nom->GetXaxis()->SetTitleSize(0.08); + h_chi_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_chi_Nom->SetLineColor(kBlack); h_chi_Nom->SetLineWidth(3); + h_chi_CR->SetLineColor(kRed); h_chi_CR->SetLineWidth(3); + h_chi_SKI->SetLineColor(kBlue); h_chi_SKI->SetLineWidth(3); + h_chi_SKII->SetLineColor(kGreen+2); h_chi_SKII->SetLineWidth(3); + + h_chi_Nom->Draw("HIST"); + h_chi_CR->Draw("HIST SAME"); + h_chi_SKI->Draw("HIST SAME"); + h_chi_SKII->Draw("HIST SAME"); + + auto leg_chi = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_chi->AddEntry(h_chi_Nom, "Nominal", "l"); + leg_chi->AddEntry(h_chi_CR, "noCR", "l"); + leg_chi->AddEntry(h_chi_SKI, "SKI", "l"); + leg_chi->AddEntry(h_chi_SKII, "SKII", "l"); + leg_chi->Draw(); + + // Ratio plot + bottomPad_chi->cd(); + gPad->SetLogx(); + + r_chi_CR->SetMinimum(0.85); r_chi_CR->SetMaximum(1.1); + r_chi_CR->SetLineColor(kRed); + r_chi_CR->Draw("HIST"); + r_chi_CR->SetLineWidth(3); + r_chi_SKI->SetLineColor(kBlue); + r_chi_SKI->SetLineWidth(3); + r_chi_SKI->Draw("HIST SAME"); + r_chi_SKII->SetLineColor(kGreen+2); + r_chi_SKII->SetLineWidth(3); + r_chi_SKII->Draw("HIST SAME"); + + r_chi_CR->GetXaxis()->SetTitle("#chi (degrees)"); // Axis titles + r_chi_CR->GetYaxis()->SetTitle("ratio"); + r_chi_CR->GetXaxis()->CenterTitle(true); // Center them + r_chi_CR->GetYaxis()->CenterTitle(true); + r_chi_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_chi_CR->GetYaxis()->SetTitleSize(0.055); + r_chi_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_chi_CR->GetYaxis()->SetLabelSize(0.05); + r_chi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_chi_CR->GetYaxis()->SetTitleOffset(0.55); + + + // **************************** Cosine Plots **************************** + int nbins_2 = h_theta_Nom->GetNbinsX(); + for (int i = 1; i <= nbins_2; ++i) { + double theta_Nom = h_theta_Nom->GetBinCenter(i); + double binWidth_Nom = h_theta_Nom->GetBinWidth(i); + double cos_theta_Nom = std::cos(theta_Nom); + + double theta_CR = h_theta_CR->GetBinCenter(i); + double binWidth_CR = h_theta_CR->GetBinWidth(i); + double cos_theta_CR = std::cos(theta_CR); + + double theta_SKI = h_theta_SKI->GetBinCenter(i); + double binWidth_SKI = h_theta_SKI->GetBinWidth(i); + double cos_theta_SKI = std::cos(theta_SKI); + + double theta_SKII = h_theta_SKII->GetBinCenter(i); + double binWidt_SKII = h_theta_SKII->GetBinWidth(i); + double cos_theta_SKII = std::cos(theta_SKII); + + // Nominal + double weight = h_theta_Nom->GetBinContent(i) / binWidth_Nom; + h_cos_theta_Nom->Fill(cos_theta_Nom, weight); + + // noCR + weight = h_theta_CR->GetBinContent(i) / binWidth_CR; + h_cos_theta_CR->Fill(cos_theta_CR, weight); + + // SKI + weight = h_theta_SKI->GetBinContent(i) / binWidth_SKI; + h_cos_theta_SKI->Fill(cos_theta_SKI, weight); + + // SKII + weight = h_theta_SKII->GetBinContent(i) / binWidt_SKII; + h_cos_theta_SKII->Fill(cos_theta_SKII, weight); + + } + + TCanvas *c_cos_theta = new TCanvas("c_cos_theta", "Cos(theta) Comparison", 1000, 800); + c_cos_theta->cd(); + + h_cos_theta_Nom->SetLineColor(kBlack); h_cos_theta_Nom->SetLineWidth(3); + h_cos_theta_CR->SetLineColor(kRed); h_cos_theta_CR->SetLineWidth(3); + h_cos_theta_SKI->SetLineColor(kBlue); h_cos_theta_SKI->SetLineWidth(3); + h_cos_theta_SKII->SetLineColor(kGreen+2); h_cos_theta_SKII->SetLineWidth(3); + + h_cos_theta_Nom->SetTitle("cos(#theta) comparison"); + h_cos_theta_Nom->GetXaxis()->SetTitle("cos(#theta)"); + h_cos_theta_Nom->GetYaxis()->SetTitle("Events"); + + h_cos_theta_Nom->Draw("HIST"); + h_cos_theta_CR->Draw("HIST SAME"); + h_cos_theta_SKI->Draw("HIST SAME"); + h_cos_theta_SKII->Draw("HIST SAME"); + + auto leg_cos = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_cos->AddEntry(h_cos_theta_Nom, "Nominal", "l"); + leg_cos->AddEntry(h_cos_theta_CR, "noCR", "l"); + leg_cos->AddEntry(h_cos_theta_SKI, "SKI", "l"); + leg_cos->AddEntry(h_cos_theta_SKII, "SKII", "l"); + leg_cos->Draw(); + + // **************************** EE Correlation Plots **************************** + + + + c_theta->SaveAs("b_theta_corr_comparison_full_all.png"); + c_cos_theta->SaveAs("b_cos_theta_corr_comparison_full_all.png"); + + c_phi->SaveAs("b_phi_corr_comparison_full_all.png"); + c_chi->SaveAs("b_chi_corr_comparison_full_all.png"); } From c3e6b8741c910188e82231ed30bac5dd539fea39 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 28 Jul 2025 13:20:18 -0400 Subject: [PATCH 31/40] binning issue with cosine and eec calculations --- scripts/plotall.C | 90 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/scripts/plotall.C b/scripts/plotall.C index 4371256..7e0af51 100644 --- a/scripts/plotall.C +++ b/scripts/plotall.C @@ -70,6 +70,11 @@ void plot() { TH1D* h_cos_theta_SKI = new TH1D("h_cos_theta_SKI", "Cos(theta) - SKI", 100, -1.0, 1.0); TH1D* h_cos_theta_SKII = new TH1D("h_cos_theta_SKII", "Cos(theta) - SKII", 100, -1.0, 1.0); + TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", 100, 0, 1.0); + TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", 100, 0, 1.0); + TH1D* h_eec_SKI = new TH1D("h_eec_SKI", "Cos(theta) - SKI", 100, 0, 1.0); + TH1D* h_eec_SKII = new TH1D("h_eec_SKII", "Cos(theta) - SKII", 100, 0, 1.0); + // Fill tNom->Draw("b_theta_corr >> h_theta_Nom", "", "goff"); tCR->Draw("b_theta_corr >> h_theta_CR", "", "goff"); @@ -115,6 +120,10 @@ void plot() { TH1F *r_chi_SKI = (TH1F*)h_chi_SKI->Clone("r_chi_SKI"); r_chi_SKI->Divide(h_chi_Nom); TH1F *r_chi_SKII = (TH1F*)h_chi_SKII->Clone("r_chi_SKII"); r_chi_SKII->Divide(h_chi_Nom); + TH1D *r_eec_CR = (TH1D*)h_eec_CR->Clone("r_eec_CR"); r_chi_CR->Divide(h_eec_Nom); + TH1D *r_eec_SKI = (TH1D*)h_eec_SKI->Clone("r_eec_SKI"); r_chi_SKI->Divide(h_eec_Nom); + TH1D *r_eec_SKII = (TH1D*)h_eec_SKII->Clone("r_eec_SKII"); r_chi_SKII->Divide(h_eec_Nom); + // Canvas 1 TCanvas *c_theta = new TCanvas("c_theta", "comparison", 1000, 800); c_theta->Divide(1, 2); @@ -141,6 +150,7 @@ void plot() { h_theta_Nom->GetYaxis()->SetTitle("normalized events"); h_theta_Nom->GetYaxis()->CenterTitle(true); h_theta_Nom->GetXaxis()->SetTitleSize(0.08); + h_theta_Nom->GetXaxis()->SetLabelSize(0.09); h_theta_Nom->GetYaxis()->SetTitleOffset(1.0); h_theta_Nom->SetLineColor(kBlack); h_theta_Nom->SetLineWidth(3); @@ -153,7 +163,7 @@ void plot() { h_theta_SKI->Draw("HIST SAME"); h_theta_SKII->Draw("HIST SAME"); - auto leg_theta = new TLegend(0.15, 0.75, 0.45, 0.88); + auto leg_theta = new TLegend(0.15, 0.3, 0.35, 0.45); leg_theta->AddEntry(h_theta_Nom, "Nominal", "l"); leg_theta->AddEntry(h_theta_CR, "noCR", "l"); leg_theta->AddEntry(h_theta_SKI, "SKI", "l"); @@ -175,11 +185,11 @@ void plot() { r_theta_SKII->SetLineWidth(3); r_theta_SKII->Draw("HIST SAME"); - r_theta_CR->GetXaxis()->SetTitle("#theta (degrees)"); // Axis titles + r_theta_CR->GetXaxis()->SetTitle("#theta (radians)"); // Axis titles r_theta_CR->GetYaxis()->SetTitle("ratio"); r_theta_CR->GetXaxis()->CenterTitle(true); // Center them r_theta_CR->GetYaxis()->CenterTitle(true); - r_theta_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_theta_CR->GetXaxis()->SetTitleSize(0.08); // Set the title size r_theta_CR->GetYaxis()->SetTitleSize(0.055); r_theta_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size r_theta_CR->GetYaxis()->SetLabelSize(0.05); @@ -247,7 +257,7 @@ void plot() { r_phi_SKII->SetLineWidth(3); r_phi_SKII->Draw("HIST SAME"); - r_phi_CR->GetXaxis()->SetTitle("#phi (degrees)"); // Axis titles + r_phi_CR->GetXaxis()->SetTitle("#phi (radians)"); // Axis titles r_phi_CR->GetYaxis()->SetTitle("ratio"); r_phi_CR->GetXaxis()->CenterTitle(true); // Center them r_phi_CR->GetYaxis()->CenterTitle(true); @@ -319,7 +329,7 @@ void plot() { r_chi_SKII->SetLineWidth(3); r_chi_SKII->Draw("HIST SAME"); - r_chi_CR->GetXaxis()->SetTitle("#chi (degrees)"); // Axis titles + r_chi_CR->GetXaxis()->SetTitle("#chi (radians)"); // Axis titles r_chi_CR->GetYaxis()->SetTitle("ratio"); r_chi_CR->GetXaxis()->CenterTitle(true); // Center them r_chi_CR->GetYaxis()->CenterTitle(true); @@ -366,6 +376,15 @@ void plot() { weight = h_theta_SKII->GetBinContent(i) / binWidt_SKII; h_cos_theta_SKII->Fill(cos_theta_SKII, weight); + double z_Nom = 0.5 * (1 - cos_theta_Nom); + double z_noCR = 0.5 * (1 - cos_theta_CR); + double z_SKI = 0.5 * (1 - cos_theta_SKI); + double z_SKII = 0.5 * (1 - cos_theta_SKII); + + h_eec_Nom->Fill(z_Nom); + h_eec_CR->Fill(z_noCR); + h_eec_SKI->Fill(z_SKI); + h_eec_SKII->Fill(z_SKII); } TCanvas *c_cos_theta = new TCanvas("c_cos_theta", "Cos(theta) Comparison", 1000, 800); @@ -392,12 +411,71 @@ void plot() { leg_cos->AddEntry(h_cos_theta_SKII, "SKII", "l"); leg_cos->Draw(); - // **************************** EE Correlation Plots **************************** + TCanvas *c_eec_theta = new TCanvas("c_eec_theta", "eec theta Comparison", 1000, 800); + c_eec_theta->cd(); + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_eec_theta = new TPad("topPad_eec_theta", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_eec_theta->SetBottomMargin(0.025); + topPad_eec_theta->Draw(); + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_eec_theta = new TPad("bottomPad_eec_theta", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_eec_theta->SetTopMargin(0.025); // Small top margin + bottomPad_eec_theta->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_eec_theta->Draw(); + + topPad_eec_theta->cd(); + h_eec_Nom->SetLineColor(kBlack); h_eec_Nom->SetLineWidth(3); + h_eec_CR->SetLineColor(kRed); h_eec_CR->SetLineWidth(3); + h_eec_SKI->SetLineColor(kBlue); h_eec_SKI->SetLineWidth(3); + h_eec_SKII->SetLineColor(kGreen+2); h_eec_SKII->SetLineWidth(3); + + // h_eec_Nom->SetTitle("z = 1/2(1 - cos(#theta)) comparison"); + h_eec_Nom->GetYaxis()->SetTitle("Events"); + + h_eec_Nom->Draw("HIST"); + h_eec_CR->Draw("HIST SAME"); + h_eec_SKI->Draw("HIST SAME"); + h_eec_SKII->Draw("HIST SAME"); + + auto leg_eec = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_eec->AddEntry(h_cos_theta_Nom, "Nominal", "l"); + leg_eec->AddEntry(h_eec_CR, "noCR", "l"); + leg_eec->AddEntry(h_eec_SKI, "SKI", "l"); + leg_eec->AddEntry(h_eec_SKII, "SKII", "l"); + leg_eec->Draw(); + + bottomPad_eec_theta->cd(); + // r_eec_CR->GetXaxis()->SetTitle("z = 1/2(1 - cos(#theta)))"); + // r_eec_CR->GetYaxis()->SetTitle("ratio"); + + // r_eec_CR->SetMinimum(0.85); r_eec_CR->SetMaximum(1.1); + r_eec_CR->SetLineColor(kRed); + r_eec_CR->Draw("HIST"); + r_eec_CR->SetLineWidth(3); + r_eec_SKI->SetLineColor(kBlue); + r_eec_SKI->SetLineWidth(3); + r_eec_SKI->Draw("HIST SAME"); + r_eec_SKII->SetLineColor(kGreen+2); + r_eec_SKII->SetLineWidth(3); + r_eec_SKII->Draw("HIST SAME"); + + r_eec_CR->GetXaxis()->SetTitle("z = 1/2(1 - cos(#theta)))"); + r_eec_CR->GetYaxis()->SetTitle("ratio"); + r_eec_CR->GetXaxis()->CenterTitle(true); // Center them + r_eec_CR->GetYaxis()->CenterTitle(true); + r_eec_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_eec_CR->GetYaxis()->SetTitleSize(0.055); + r_eec_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_eec_CR->GetYaxis()->SetLabelSize(0.05); + r_eec_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_eec_CR->GetYaxis()->SetTitleOffset(0.55); c_theta->SaveAs("b_theta_corr_comparison_full_all.png"); c_cos_theta->SaveAs("b_cos_theta_corr_comparison_full_all.png"); + c_eec_theta->SaveAs("b_eec_comparison_full_all.png"); c_phi->SaveAs("b_phi_corr_comparison_full_all.png"); c_chi->SaveAs("b_chi_corr_comparison_full_all.png"); From fa05044c2b87f3d6b67719519e3079d214dec892 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 31 Jul 2025 09:58:16 -0400 Subject: [PATCH 32/40] saving reco-jets to ROOT file --- PostCutCode/Root/AnalysisWWCR.cxx | 181 ++++++++++++++++++++---------- 1 file changed, 120 insertions(+), 61 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 0e107b1..8075b99 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -157,26 +157,33 @@ void AnalysisWWCR::run() { auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 500, -1, 1); auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 500, -1, 1); - //Make new tree - TTree* t = new TTree("analysis","my analysis tree"); - my_tree = (TTree*) t; - //define the output branches + TTree* t = new TTree("analysis","my analysis tree"); // Make a new tree + my_tree = (TTree*) t; // define the output branches - my_tree->Branch("b_ee_corr",&ee_corr); - my_tree->Branch("b_theta_corr",&theta_corr); - my_tree->Branch("b_phi_corr",&phi_corr); - my_tree->Branch("b_chi_corr",&chi_corr); + my_tree->Branch("b_ee_corr", &ee_corr); + my_tree->Branch("b_p_jet_const_1", &p_jet_const_1); + my_tree->Branch("b_p_jet_const_2", &p_jet_const_2); + my_tree->Branch("b_theta_corr", &theta_corr); + my_tree->Branch("b_phi_corr", &phi_corr); + my_tree->Branch("b_chi_corr", &chi_corr); + + my_tree->Branch("b_p_reco_cJet", &p_reco_cJet); + my_tree->Branch("b_p_reco_lJet0", &p_reco_lJet0); + my_tree->Branch("b_p_reco_lJet1", &p_reco_lJet1); + my_tree->Branch("b_p_reco_lJet2", &p_reco_lJet2); + my_tree->Branch("b_theta_c_l0", &theta_c_l0); + my_tree->Branch("b_theta_l1_l2", &theta_l1_l2); + my_tree->Branch("b_phi_c_l0", &phi_c_l0); + my_tree->Branch("b_phi_l1_l2", &phi_l1_l2); + my_tree->Branch("b_chi_c_l0", &chi_c_l0); + my_tree->Branch("b_chi_l1_l2", &chi_l1_l2); my_tree->Branch("b_w",&mc_weight); - // Get the trees - auto treeCont = std::make_shared(); - - // Get max events to run on - int nEntries = treeCont->getEventsToRun(); - // Connect branches to trees - auto tree = treeCont->getTree(); + auto treeCont = std::make_shared(); // Get the trees + int nEntries = treeCont->getEventsToRun(); // Get max events to run on + auto tree = treeCont->getTree(); // Connect branches to trees - // calls the branch_name (var_type branch {tree, "branch_name"};) + // calls the branch_name varMember event_njet {tree, "event_njet"}; varMember event_nmu {tree, "event_nmu"}; varMember event_nel {tree, "event_nel"}; @@ -236,6 +243,11 @@ void AnalysisWWCR::run() { int NdCutd34 = 0; int NdecayCuts = 0; + int count_cJet = 0; + int count_lJet0 = 0; + int count_lJet1 = 0; + int count_lJet2 = 0; + const int maxPrint = 10; int nPrinted = 0; bool do_debug = true; // Set to false to turn off all debug printing @@ -245,7 +257,7 @@ void AnalysisWWCR::run() { { treeCont->getEntry(i); countingHist->Fill(1); - NEvents++; + NEvents++; // Total Number of Events if(i % 10000 == 0) std::cout<<"Done i: "<all had - if (W1_nHad==0 || W2_nHad==0) continue; - // for (int i = 0; i < 6; ++i) { - // if (W1_decay_types[i]) W1_decay_idx = i; - // if (W2_decay_types[i]) W2_decay_idx = i; - // } - - // // add all hadronic decays, there is probably a more efficient way of doing this - // if (!( - // (W1_is_ud && W2_is_ud) || (W1_is_ud && W2_is_us) || (W1_is_ud && W2_is_ub) || (W1_is_ud && W2_is_cd) || (W1_is_ud && W2_is_cs) || (W1_is_ud && W2_is_cb) || - // (W1_is_us && W2_is_ud) || (W1_is_us && W2_is_us) || (W1_is_us && W2_is_ub) || (W1_is_us && W2_is_cd) || (W1_is_us && W2_is_cs) || (W1_is_us && W2_is_cb) || - // (W1_is_ub && W2_is_ud) || (W1_is_ub && W2_is_us) || (W1_is_ub && W2_is_ub) || (W1_is_ub && W2_is_cd) || (W1_is_ub && W2_is_cs) || (W1_is_ub && W2_is_cb) || - // (W1_is_cd && W2_is_ud) || (W1_is_cd && W2_is_us) || (W1_is_cd && W2_is_ub) || (W1_is_cd && W2_is_cd) || (W1_is_cd && W2_is_cs) || (W1_is_cd && W2_is_cb) || - // (W1_is_cs && W2_is_ud) || (W1_is_cs && W2_is_us) || (W1_is_cs && W2_is_ub) || (W1_is_cs && W2_is_cd) || (W1_is_cs && W2_is_cs) || (W1_is_cs && W2_is_cb) || - // (W1_is_cb && W2_is_ud) || (W1_is_cb && W2_is_us) || (W1_is_cb && W2_is_ub) || (W1_is_cb && W2_is_cd) || (W1_is_cb && W2_is_cs) || (W1_is_cb && W2_is_cb) - // )) continue; - - // if (W1_decay_idx == -1 || W2_decay_idx == -1) continue; - - NdecayCuts++; + if (W1_nHad==0 || W2_nHad==0) continue; // select WW --> all hadronic decays + NdecayCuts++; // number of events all hardonic decays if(event_njet() != 4) continue; - NjetCut++; + NjetCut++; // number of events with four jets bool flage_toss = false; if (recojet_isB.size() == 0){ flage_toss = true; } if (flage_toss) continue; + // define vectors - std::vector vec_ee_corr; + std::vector vec_p_jet_const_1; + std::vector vec_p_jet_const_2; std::vector vec_theta_corr; std::vector vec_phi_corr; std::vector vec_chi_corr; + std::vector vec_ee_corr; + std::vector vec_p_reco_cJet; + std::vector vec_p_reco_lJet0; + std::vector vec_p_reco_lJet1; + std::vector vec_p_reco_lJet2; + std::vector vec_theta_c_l0; + std::vector vec_theta_l1_l2; + std::vector vec_phi_c_l0; + std::vector vec_phi_l1_l2; + std::vector vec_chi_c_l0; + std::vector vec_chi_l1_l2; + + + // set u/d/s to a "light flavor" quark float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); float jet2_scoreQ = std::max({recojet_isU.at(2), recojet_isD.at(2), recojet_isS.at(2)}); @@ -454,7 +462,6 @@ void AnalysisWWCR::run() { } // if (has_invalid_flavor) continue; - // if (!(n_c == 1 && n_l == 3)) continue; nFlavScore++; @@ -534,10 +541,12 @@ void AnalysisWWCR::run() { double jetSub_cos_phi_4 = cos(jetSub_phi_4); double eec_jetSub_phi_4 = 0.5 * (1 - jetSub_cos_phi_4); - vec_ee_corr.push_back(eec_jetSub_theta_2); + vec_p_jet_const_1.push_back(subJet_1.P()); + vec_p_jet_const_2.push_back(subJet_2.P()); vec_theta_corr.push_back(jetSub_theta_2); vec_phi_corr.push_back(jetSub_phi_4); vec_chi_corr.push_back(jetSub_chi_1); + vec_ee_corr.push_back(eec_jetSub_theta_2); h_chi_subjet->Fill(jetSub_chi_1); h_cos_chi_subjet->Fill(jetSub_cos_chi_1); @@ -630,19 +639,6 @@ void AnalysisWWCR::run() { double cos_phi_truth_cs = cos(phi_truth_cs); double cos_phi_truth_ud = cos(phi_truth_ud); - - - // if (nPrinted < maxPrint) { - // std::cout << "Truth Quarks" << std::endl; - // std::cout << "chi: " << chi_truth_cs << " " << "cos(chi): " << cos_chi_truth_cs << std::endl; - // std::cout << "chi: " << chi_truth_ud << " " << "cos(chi): " << cos_chi_truth_ud << std::endl; - // std::cout << "theta: " << theta_truth_cs << " " << "cos(chi): " << cos_theta_truth_cs << std::endl; - // std::cout << "theta: " << theta_truth_ud << " " << "cos(chi): " << cos_theta_truth_ud << std::endl; - // std::cout << "phi: " << phi_truth_cs << " " << "cos(chi): " << cos_phi_truth_cs << std::endl; - // std::cout << "phi: " << phi_truth_ud << " " << "cos(chi): " << cos_phi_truth_ud << std::endl; - // std::cout << " " << std::endl; - // } - // ************** EE CORRELATIONS ************** double ee_correlation_chi_truth_cs = 0.5 * (1 - cos_chi_truth_cs); double ee_correlation_chi_truth_ud = 0.5 * (1 - cos_chi_truth_ud); @@ -681,16 +677,12 @@ void AnalysisWWCR::run() { // ************************** CALCULATIONS FOR MASS AND SUCH BEGIN HERE (USING RECO-JETS) ************************** TLorentzVector Jet1, Jet2, Jet3, Jet4; - // Jet1.SetPxPyPzE(jet_px.at(cJet), jet_py.at(cJet), jet_pz.at(cJet), jet_e.at(cJet)); - // Jet2.SetPxPyPzE(jet_px.at(lJets[0]), jet_py.at(lJets[0]), jet_pz.at(lJets[0]), jet_e.at(lJets[0])); - - // Jet3.SetPxPyPzE(jet_px.at(lJets[1]), jet_py.at(lJets[1]), jet_pz.at(lJets[1]), jet_e.at(lJets[1])); - // Jet3.SetPxPyPzE(jet_px.at(lJets[2]), jet_py.at(lJets[2]), jet_pz.at(lJets[2]), jet_e.at(lJets[2])); Jet1.SetPxPyPzE(jet_px.at(0), jet_py.at(0), jet_pz.at(0), jet_e.at(0)); Jet2.SetPxPyPzE(jet_px.at(1), jet_py.at(1), jet_pz.at(1), jet_e.at(1)); Jet3.SetPxPyPzE(jet_px.at(2), jet_py.at(2), jet_pz.at(2), jet_e.at(2)); Jet4.SetPxPyPzE(jet_px.at(3), jet_py.at(3), jet_pz.at(3), jet_e.at(3)); + const double m_W_true = 80.379; TLorentzVector W1_option1 = Jet1 + Jet2; @@ -714,6 +706,11 @@ void AnalysisWWCR::run() { // for the cos(phi) angle TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; + // int count_cJet = 0; + // int count_lJet0 = 0; + // int count_lJet1 = 0; + // int count_lJet2 = 0; + if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { h_W1_mass->Fill(W1_option1.M()); h_W2_mass->Fill(W2_option1.M()); @@ -730,6 +727,16 @@ void AnalysisWWCR::run() { h_lJet1_p->Fill(Jet3.P()); h_lJet2_p->Fill(Jet4.P()); + vec_p_reco_cJet.push_back(Jet1.P()); + vec_p_reco_lJet0.push_back(Jet2.P()); + vec_p_reco_lJet1.push_back(Jet3.P()); + vec_p_reco_lJet2.push_back(Jet4.P()); + + count_cJet++; + count_lJet0++; + count_lJet1++; + count_lJet2++; + W1_j1 = Jet1; W1_j2 = Jet2; @@ -752,6 +759,16 @@ void AnalysisWWCR::run() { h_lJet1_p->Fill(Jet3.P()); h_lJet2_p->Fill(Jet4.P()); + vec_p_reco_cJet.push_back(Jet1.P()); + vec_p_reco_lJet0.push_back(Jet2.P()); + vec_p_reco_lJet1.push_back(Jet3.P()); + vec_p_reco_lJet2.push_back(Jet4.P()); + + count_cJet++; + count_lJet0++; + count_lJet1++; + count_lJet2++; + W1_j1 = Jet1; W1_j2 = Jet3; @@ -774,6 +791,16 @@ void AnalysisWWCR::run() { h_lJet1_p->Fill(Jet3.P()); h_lJet2_p->Fill(Jet3.P()); + vec_p_reco_cJet.push_back(Jet1.P()); + vec_p_reco_lJet0.push_back(Jet2.P()); + vec_p_reco_lJet1.push_back(Jet3.P()); + vec_p_reco_lJet2.push_back(Jet4.P()); + + count_cJet++; + count_lJet0++; + count_lJet1++; + count_lJet2++; + W1_j1 = Jet1; W1_j2 = Jet4; @@ -783,11 +810,22 @@ void AnalysisWWCR::run() { mc_weight = norm_weight; ee_corr = vec_ee_corr; + p_jet_const_1 = vec_p_jet_const_1; + p_jet_const_2 = vec_p_jet_const_2; theta_corr = vec_theta_corr; phi_corr= vec_phi_corr; chi_corr=vec_chi_corr; + p_reco_cJet = vec_p_reco_cJet; + p_reco_lJet0 = vec_p_reco_lJet0; + p_reco_lJet1 = vec_p_reco_lJet1; + p_reco_lJet2 = vec_p_reco_lJet2; my_tree->Fill(); + // double counts_cJet = h_cJet_p->Integral(); + // double counts_lJet0 = h_lJet0_p->Integral(); + // double counts_lJet1 = h_lJet1_p->Integral(); + // double counts_lJet2 = h_lJet2_p->Integral(); + // ************* CHI ************* double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); @@ -823,6 +861,13 @@ void AnalysisWWCR::run() { double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); // *********************** HISTOGRAMS *********************** + vec_theta_c_l0.push_back(theta_c_l0); + vec_theta_l1_l2.push_back(theta_l1_l2); + vec_phi_c_l0.push_back(phi_c_l0); + vec_phi_l1_l2.push_back(phi_l1_l2); + vec_chi_c_l0.push_back(chi_c_l0); + vec_chi_l1_l2.push_back(chi_l1_l2); + h_chi_c_l0->Fill(chi_c_l0); h_chi_l1_l2->Fill(chi_l1_l2); h_theta_c_l0->Fill(theta_c_l0); @@ -867,6 +912,20 @@ void AnalysisWWCR::run() { std::cout << "Number of events with 1 c-tagged, 1 s-tagged, and 2 light-tagged jets: " << nFlavScore << std::endl; std::cout << " " << std::endl; + std::cout << "Number of events for cJet: " << count_cJet << std::endl; + std::cout << "Number of events for lJet0: " << count_lJet0 << std::endl; + std::cout << "Number of events for lJet1: " << count_lJet1 << std::endl; + std::cout << "Number of events for lJet2: " << count_lJet2 << std::endl; + + std::cout << " " << std::endl; + + std::cout << "Histogram entries for cJet: " << h_cJet_p->GetEntries() << std::endl; + std::cout << "Histogram entries for lJet0: " << h_lJet0_p->GetEntries() << std::endl; + std::cout << "Histogram entries for lJet1: " << h_lJet1_p->GetEntries() << std::endl; + std::cout << "Histogram entries for lJet2: " << h_lJet2_p->GetEntries() << std::endl; + + + std::cout << " " << std::endl; std::cout << "Let there be data :)" << std::endl; From 1ee5eebd771a02f306ce389a6a954c52acab593d Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Fri, 1 Aug 2025 09:16:32 -0400 Subject: [PATCH 33/40] variable binning for momenta plots --- scripts/plot.C | 487 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 445 insertions(+), 42 deletions(-) diff --git a/scripts/plot.C b/scripts/plot.C index f6011ca..8bb7447 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -3,67 +3,470 @@ void plot() { gStyle->SetOptStat(0); // Open files and get trees - TFile *f0 = TFile::Open("testnoCR.root"); - TFile *f1 = TFile::Open("test.root"); - TTree *t0 = (TTree*)f0->Get("analysis"); - TTree *t1 = (TTree*)f1->Get("analysis"); + TFile *fNom = TFile::Open("test.root"); + TFile *fCR = TFile::Open("test_noCR.root"); + TTree *tNom = (TTree*)fNom->Get("analysis"); + TTree *tCR = (TTree*)fCR->Get("analysis"); - // Define log bins + // Custom binning to match z = (1 - cos(θ)) / 2 axis int nBins = 100; - double xMin = 0.01, xMax = 3.2; + double xMin = 0.01, xMax = 3.1; + double xMin_lin = 0.01, xMax_lin = 180; + double xMin_lin_2 = -1.0, xMax_lin_2 = 1.0; + + // Linear bins + double linearBinWidth = (xMax_lin - xMin_lin) / nBins; + double* linearBins = new double[nBins + 1]; + for (int i = 0; i <= nBins; ++i) + linearBins[i] = xMin_lin + i * linearBinWidth; + + double linearBinWidth_2 = (xMax_lin_2 - xMin_lin_2) / nBins; + double* linearBins_2 = new double[nBins + 1]; + for (int i = 0; i <= nBins; ++i) + linearBins_2[i] = xMin_lin_2 + i * linearBinWidth_2; + + + // Logarithmic Bins double logMin = std::log10(xMin); double logMax = std::log10(xMax); double binWidth = (logMax - logMin) / nBins; double* logBins = new double[nBins + 1]; for (int i = 0; i <= nBins; ++i) logBins[i] = std::pow(10, logMin + i * binWidth); + const int totalBins = 100; + const double lastEdgeBeforeMerge = 100.0; + const double finalEdge = 180.0; + + const int binsBeforeLast = totalBins - 1; // 99 bins before last + std::vector binEdges; + + // Uniform binning from 0 to 105 GeV in 99 bins + for (int i = 0; i <= binsBeforeLast; ++i) { + binEdges.push_back(i * (lastEdgeBeforeMerge / binsBeforeLast)); + } + + // Add final bin edge at 180 GeV + binEdges.push_back(finalEdge); + + // Convert to array if needed (e.g., for ROOT) + double* binsArray = new double[binEdges.size()]; + std::copy(binEdges.begin(), binEdges.end(), binsArray); + + std::cout << "Last few bin edges:\n"; + for (size_t i = binEdges.size() - 5; i < binEdges.size(); ++i) { + std::cout << binEdges[i] << " "; + } + std::cout << std::endl; + // Create histograms - TH1F* h0 = new TH1F("h0", "b_theta_corr from testnoCR", nBins, logBins); - TH1F* h1 = new TH1F("h1", "b_theta_corr from test", nBins, logBins); + // Histograms + TH1F *h_p_jet_const_1_Nom = new TH1F("h_p_jet_const_1_Nom", "Jet constituent momentum", totalBins, binsArray); + TH1F *h_p_jet_const_1_CR = new TH1F("h_p_jet_const_1_CR", "", totalBins, binsArray); + + TH1F *h_p_jet_const_2_Nom = new TH1F("h_p_jet_const_2_Nom", "Jet constituent momentum", totalBins, binsArray); + TH1F *h_p_jet_const_2_CR = new TH1F("h_p_jet_const_2_CR", "", totalBins, binsArray); + + TH1F *h_theta_Nom = new TH1F("h_theta_Nom", "#Delta#theta;#theta;Normalized Events", nBins, logBins); + TH1F *h_theta_CR = new TH1F("h_theta_CR", "", nBins, logBins); + + TH1F *h_phi_Nom = new TH1F("h_phi_Nom", "#Delta#phi;Normalized Events", nBins, logBins); + TH1F *h_phi_CR = new TH1F("h_phi_CR", "", nBins, logBins); + + TH1F *h_chi_Nom = new TH1F("h_chi_Nom", "#Delta#chi;Normalized Events", nBins, logBins); + TH1F *h_chi_CR = new TH1F("h_chi_CR", "", nBins, logBins); + + TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); + TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); + + TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", nBins, linearBins_2); + + TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); + + TH1F* h_p_reco_cJet_Nom = new TH1F("h_p_reco_cJet_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_cJet_CR = new TH1F("h_p_reco_cJet_CR", "", nBins, linearBins); + + TH1F* h_p_reco_lJet0_Nom = new TH1F("h_p_reco_lJet0_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_lJet0_CR = new TH1F("h_p_reco_lJet0_CR", "", nBins, linearBins); + + TH1F* h_p_reco_lJet1_Nom = new TH1F("h_p_reco_lJet1_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_lJet1_CR = new TH1F("h_p_reco_lJet1_CR", "", nBins, linearBins); + + TH1F* h_p_reco_lJet2_Nom = new TH1F("h_p_reco_lJet2_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_lJet2_CR = new TH1F("h_p_reco_lJet2_CR", "", nBins, linearBins); + + // Fill + tNom->Draw("b_p_jet_const_1 >> h_p_jet_const_1_Nom", "", "goff"); + tCR->Draw("b_p_jet_const_1 >> h_p_jet_const_1_CR", "", "goff"); + + tNom->Draw("b_p_jet_const_2 >> h_p_jet_const_2_Nom", "", "goff"); + tCR->Draw("b_p_jet_const_2 >> h_p_jet_const_2_CR", "", "goff"); + + tNom->Draw("b_theta_corr >> h_theta_Nom", "", "goff"); + tCR->Draw("b_theta_corr >> h_theta_CR", "", "goff"); + + tNom->Draw("b_phi_corr >> h_phi_Nom", "", "goff"); + tCR->Draw("b_phi_corr >> h_phi_CR", "", "goff"); - // Fill histograms - t0->Draw("b_theta_corr>>h0", "", "goff"); - t1->Draw("b_theta_corr>>h1", "", "goff"); + tNom->Draw("b_chi_corr >> h_chi_Nom", "", "goff"); + tCR->Draw("b_chi_corr >> h_chi_CR", "", "goff"); + + tNom->Draw("b_p_reco_cJet >> h_p_reco_cJet_Nom", "", "goff"); + tCR->Draw("b_p_reco_cJet >> h_p_reco_cJet_CR", "", "goff"); + + tNom->Draw("b_p_reco_lJet0 >> h_p_reco_lJet0_Nom", "", "goff"); + tCR->Draw("b_p_reco_lJet0 >> h_p_reco_lJet0_CR", "", "goff"); + + tNom->Draw("b_p_reco_lJet1 >> h_p_reco_lJet1_Nom", "", "goff"); + tCR->Draw("b_p_reco_lJet1 >> h_p_reco_lJet1_CR", "", "goff"); + + tNom->Draw("b_p_reco_lJet2 >> h_p_reco_lJet2_Nom", "", "goff"); + tCR->Draw("b_p_reco_lJet2 >> h_p_reco_lJet2_CR", "", "goff"); // Normalize both histograms by their integrals - h0->Scale(1.0 / h0->Integral()); - h1->Scale(1.0 / h1->Integral()); + h_p_jet_const_1_Nom->Scale(1.0 / h_p_jet_const_1_Nom->Integral()); + h_p_jet_const_1_CR->Scale(1.0 / h_p_jet_const_1_CR->Integral()); + + h_p_jet_const_2_Nom->Scale(1.0 / h_p_jet_const_2_Nom->Integral()); + h_p_jet_const_2_CR->Scale(1.0 / h_p_jet_const_2_CR->Integral()); + + h_theta_Nom->Scale(1.0 / h_theta_Nom->Integral()); + h_theta_CR->Scale(1.0 / h_theta_CR->Integral()); + + h_phi_Nom->Scale(1.0 / h_phi_Nom->Integral()); + h_phi_CR->Scale(1.0 / h_phi_CR->Integral()); + + h_chi_Nom->Scale(1.0 / h_chi_Nom->Integral()); + h_chi_CR->Scale(1.0 / h_chi_CR->Integral()); + + h_p_reco_cJet_Nom->Scale(1.0 / h_p_reco_cJet_Nom->Integral()); + h_p_reco_cJet_CR->Scale(1.0 / h_p_reco_cJet_CR->Integral()); + + h_p_reco_lJet0_Nom->Scale(1.0 / h_p_reco_lJet0_Nom->Integral()); + h_p_reco_lJet0_CR->Scale(1.0 / h_p_reco_lJet0_CR->Integral()); + + h_p_reco_lJet1_Nom->Scale(1.0 / h_p_reco_lJet1_Nom->Integral()); + h_p_reco_lJet1_CR->Scale(1.0 / h_p_reco_lJet1_CR->Integral()); + + h_p_reco_lJet2_Nom->Scale(1.0 / h_p_reco_lJet2_Nom->Integral()); + h_p_reco_lJet2_CR->Scale(1.0 / h_p_reco_lJet2_CR->Integral()); + + // Ratio to Nominal + TH1F *r_p_jet_const_1_CR = (TH1F*)h_p_jet_const_1_CR->Clone("r_p_jet_const_1_CR"); r_p_jet_const_1_CR->Divide(h_p_jet_const_1_Nom); + TH1F *r_p_jet_const_2_CR = (TH1F*)h_p_jet_const_2_CR->Clone("r_p_jet_const_2_CR"); r_p_jet_const_2_CR->Divide(h_p_jet_const_2_Nom); + TH1F *r_theta_CR = (TH1F*)h_theta_CR->Clone("r_theta_CR"); r_theta_CR->Divide(h_theta_Nom); + TH1F *r_phi_CR = (TH1F*)h_phi_CR->Clone("r_phi_CR"); r_phi_CR->Divide(h_phi_Nom); + TH1F *r_chi_CR = (TH1F*)h_chi_CR->Clone("r_chi_CR"); r_chi_CR->Divide(h_chi_Nom); + TH1D *r_eec_CR = (TH1D*)h_eec_CR->Clone("r_eec_CR"); r_eec_CR->Divide(h_eec_Nom); + TH1F *r_p_reco_cJet_CR = (TH1F*)h_p_reco_cJet_CR->Clone("r_p_reco_cJet_CR"); r_p_reco_cJet_CR->Divide(h_p_reco_cJet_Nom); + TH1F *r_p_reco_lJet0_CR = (TH1F*)h_p_reco_lJet0_CR->Clone("r_p_reco_lJet0_CR"); r_p_reco_lJet0_CR->Divide(h_p_reco_lJet0_Nom); + TH1F *r_p_reco_lJet1_CR = (TH1F*)h_p_reco_lJet1_CR->Clone("r_p_reco_lJet1_CR"); r_p_reco_lJet1_CR->Divide(h_p_reco_lJet1_Nom); + TH1F *r_p_reco_lJet2_CR = (TH1F*)h_p_reco_lJet2_CR->Clone("r_p_reco_lJet2_CR"); r_p_reco_lJet2_CR->Divide(h_p_reco_lJet2_Nom); + + // **************************************** Jet Constituent Plots **************************************** + TCanvas *c_p_jet_const_1 = new TCanvas("c_p_jet_const_1", "comparison", 1000, 800); + c_p_jet_const_1->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_p_jetConst_1 = new TPad("topPad_p_jetConst_1", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_p_jetConst_1->SetBottomMargin(0.025); + topPad_p_jetConst_1->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_p_jetConst_1 = new TPad("bottomPad_p_jetConst_1", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_p_jetConst_1->SetTopMargin(0.025); // Small top margin + bottomPad_p_jetConst_1->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_p_jetConst_1->Draw(); + + // Upper plot + topPad_p_jetConst_1->cd(); + // gPad->SetLogx(); + gPad->SetLogy(); + + h_p_jet_const_1_Nom->SetTitle("Momenta- Jet Constituents"); + h_p_jet_const_1_Nom->GetXaxis()->SetLabelSize(0); + h_p_jet_const_1_Nom->GetYaxis()->SetTitle("normalized events"); + h_p_jet_const_1_Nom->GetYaxis()->CenterTitle(true); + h_p_jet_const_1_Nom->GetXaxis()->SetTitleSize(0.08); + h_p_jet_const_1_Nom->GetXaxis()->SetLabelSize(0); + h_p_jet_const_1_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_p_jet_const_1_Nom->SetLineColor(kBlue); h_p_jet_const_1_Nom->SetLineWidth(3); + h_p_jet_const_1_CR->SetLineColor(kRed); h_p_jet_const_1_CR->SetLineWidth(3); + + h_p_jet_const_1_Nom->Draw("HIST"); + h_p_jet_const_1_CR->Draw("HIST SAME"); + + auto leg_p_jetConst_1 = new TLegend(0.75, 0.75, 0.95, 0.88); + leg_p_jetConst_1->AddEntry(h_p_jet_const_1_Nom, "Nominal", "l"); + leg_p_jetConst_1->AddEntry(h_p_jet_const_1_CR, "noCR", "l"); + leg_p_jetConst_1->Draw(); + + // Ratio plot + bottomPad_p_jetConst_1->cd(); + // gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_p_jet_const_1_CR->SetLineColor(kRed); + r_p_jet_const_1_CR->Draw("HIST"); + r_p_jet_const_1_CR->SetLineWidth(3); + + r_p_jet_const_1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles + r_p_jet_const_1_CR->GetYaxis()->SetTitle("ratio"); + r_p_jet_const_1_CR->SetTitle(""); + r_p_jet_const_1_CR->GetXaxis()->CenterTitle(true); // Center them + r_p_jet_const_1_CR->GetYaxis()->CenterTitle(true); + r_p_jet_const_1_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_p_jet_const_1_CR->GetYaxis()->SetTitleSize(0.055); + r_p_jet_const_1_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_p_jet_const_1_CR->GetYaxis()->SetLabelSize(0.05); + r_p_jet_const_1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_p_jet_const_1_CR->GetYaxis()->SetTitleOffset(0.55); + + + TCanvas *c_p_jet_const_2 = new TCanvas("c_p_jet_const_2", "comparison", 1000, 800); + c_p_jet_const_2->Divide(1, 2); - // Styling - h0->SetLineColor(kRed); h0->SetLineWidth(2); - h1->SetLineColor(kBlue); h1->SetLineWidth(2); + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_p_jetConst_2 = new TPad("topPad_p_jetConst_2", "Top Pad", 0.0, 0.4, 1.0, 1.0); + topPad_p_jetConst_2->SetBottomMargin(0.025); + topPad_p_jetConst_2->Draw(); - // Create canvas with 2 pads - TCanvas* c = new TCanvas("c", "Comparison with Ratio", 800, 800); - c->Divide(1, 2); + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_p_jetConst_2 = new TPad("bottomPad_p_jetConst_2", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_p_jetConst_2->SetTopMargin(0.025); // Small top margin + bottomPad_p_jetConst_2->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_p_jetConst_2->Draw(); - // Top pad: overlay histograms - c->cd(1); + // Upper plot + topPad_p_jetConst_2->cd(); + // gPad->SetLogx(); + gPad->SetLogy(); + + h_p_jet_const_2_Nom->SetTitle("Momenta- Jet Constituents"); + h_p_jet_const_2_Nom->GetXaxis()->SetLabelSize(0); + h_p_jet_const_2_Nom->GetYaxis()->SetTitle("normalized events"); + h_p_jet_const_2_Nom->GetYaxis()->CenterTitle(true); + h_p_jet_const_2_Nom->GetXaxis()->SetTitleSize(0.08); + h_p_jet_const_2_Nom->GetXaxis()->SetLabelSize(0); + h_p_jet_const_2_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_p_jet_const_2_Nom->SetLineColor(kBlue); h_p_jet_const_2_Nom->SetLineWidth(3); + h_p_jet_const_2_CR->SetLineColor(kRed); h_p_jet_const_2_CR->SetLineWidth(3); + + h_p_jet_const_2_Nom->Draw("HIST"); + h_p_jet_const_2_CR->Draw("HIST SAME"); + + auto leg_p_jetConst_2 = new TLegend(0.75, 0.75, 0.95, 0.88); + leg_p_jetConst_2->AddEntry(h_p_jet_const_2_Nom, "Nominal", "l"); + leg_p_jetConst_2->AddEntry(h_p_jet_const_2_CR, "noCR", "l"); + leg_p_jetConst_2->Draw(); + + // Ratio plot + bottomPad_p_jetConst_2->cd(); + // gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_p_jet_const_2_CR->SetLineColor(kRed); + r_p_jet_const_2_CR->Draw("HIST"); + r_p_jet_const_2_CR->SetLineWidth(3); + + r_p_jet_const_2_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles + r_p_jet_const_2_CR->GetYaxis()->SetTitle("ratio"); + r_p_jet_const_2_CR->SetTitle(""); + r_p_jet_const_2_CR->GetXaxis()->CenterTitle(true); // Center them + r_p_jet_const_2_CR->GetYaxis()->CenterTitle(true); + r_p_jet_const_2_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_p_jet_const_2_CR->GetYaxis()->SetTitleSize(0.055); + r_p_jet_const_2_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_p_jet_const_2_CR->GetYaxis()->SetLabelSize(0.05); + r_p_jet_const_2_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_p_jet_const_2_CR->GetYaxis()->SetTitleOffset(0.55); + + TCanvas *c_theta = new TCanvas("c_theta", "comparison", 1000, 800); + c_theta->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad = new TPad("topPad", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad->SetBottomMargin(0.025); + topPad->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad = new TPad("bottomPad", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad->SetTopMargin(0.025); // Small top margin + bottomPad->SetBottomMargin(0.2); // More space for x-axis label + bottomPad->Draw(); + + // Upper plot + topPad->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_theta_Nom->SetTitle("b_theta_corr"); + h_theta_Nom->GetXaxis()->SetLabelSize(0); + h_theta_Nom->GetYaxis()->SetTitle("normalized events"); + h_theta_Nom->GetYaxis()->CenterTitle(true); + h_theta_Nom->GetXaxis()->SetTitleSize(0.08); + h_theta_Nom->GetXaxis()->SetLabelSize(0.09); + h_theta_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_theta_Nom->SetLineColor(kBlack); h_theta_Nom->SetLineWidth(3); + h_theta_CR->SetLineColor(kRed); h_theta_CR->SetLineWidth(3); + + h_theta_Nom->Draw("HIST"); + h_theta_CR->Draw("HIST SAME"); + + auto leg_theta = new TLegend(0.15, 0.3, 0.35, 0.45); + leg_theta->AddEntry(h_theta_Nom, "Nominal", "l"); + leg_theta->AddEntry(h_theta_CR, "noCR", "l"); + leg_theta->Draw(); + + // Ratio plot + bottomPad->cd(); + gPad->SetLogx(); + r_theta_CR->SetMinimum(0.85); r_theta_CR->SetMaximum(1.1); + r_theta_CR->SetLineColor(kRed); + r_theta_CR->Draw("HIST"); + r_theta_CR->SetLineWidth(3); + + r_theta_CR->GetXaxis()->SetTitle("#theta (radians)"); // Axis titles + r_theta_CR->GetYaxis()->SetTitle("ratio"); + r_theta_CR->GetXaxis()->CenterTitle(true); // Center them + r_theta_CR->GetYaxis()->CenterTitle(true); + r_theta_CR->GetXaxis()->SetTitleSize(0.08); // Set the title size + r_theta_CR->GetYaxis()->SetTitleSize(0.055); + r_theta_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_theta_CR->GetYaxis()->SetLabelSize(0.05); + r_theta_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_theta_CR->GetYaxis()->SetTitleOffset(0.55); + + + // Canvas 2 + TCanvas *c_phi = new TCanvas("c_phi", "comparison", 1000, 800); + c_phi->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_phi = new TPad("topPad_phi", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_phi->SetBottomMargin(0.025); + topPad_phi->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_phi = new TPad("bottomPad_phi", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_phi->SetTopMargin(0.025); // Small top margin + bottomPad_phi->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_phi->Draw(); + + // Upper plot + topPad_phi->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_phi_Nom->SetTitle("b_phi_corr"); + h_phi_Nom->GetXaxis()->SetLabelSize(0); + h_phi_Nom->GetYaxis()->SetTitle("normalized events"); + h_phi_Nom->GetYaxis()->CenterTitle(true); + h_phi_Nom->GetXaxis()->SetTitleSize(0.08); + h_phi_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_phi_Nom->SetLineColor(kBlack); h_phi_Nom->SetLineWidth(3); + h_phi_CR->SetLineColor(kRed); h_phi_CR->SetLineWidth(3); + + h_phi_Nom->Draw("HIST"); + h_phi_CR->Draw("HIST SAME"); + + auto leg_phi = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_phi->AddEntry(h_phi_Nom, "Nominal", "l"); + leg_phi->AddEntry(h_phi_CR, "noCR", "l"); + leg_phi->Draw(); + + // Ratio plot + bottomPad_phi->cd(); + gPad->SetLogx(); + + r_phi_CR->SetMinimum(0.85); r_phi_CR->SetMaximum(1.1); + r_phi_CR->SetLineColor(kRed); + r_phi_CR->Draw("HIST"); + r_phi_CR->SetLineWidth(3); + + r_phi_CR->GetXaxis()->SetTitle("#phi (radians)"); // Axis titles + r_phi_CR->GetYaxis()->SetTitle("ratio"); + r_phi_CR->GetXaxis()->CenterTitle(true); // Center them + r_phi_CR->GetYaxis()->CenterTitle(true); + r_phi_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_phi_CR->GetYaxis()->SetTitleSize(0.055); + r_phi_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_phi_CR->GetYaxis()->SetLabelSize(0.05); + r_phi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_phi_CR->GetYaxis()->SetTitleOffset(0.55); + + + // Canvas 3 + TCanvas *c_chi = new TCanvas("c_chi", "comparison", 1000, 800); + c_chi->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_chi = new TPad("topPad_chi", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_chi->SetBottomMargin(0.025); + topPad_chi->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_chi = new TPad("bottomPad_chi", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_chi->SetTopMargin(0.025); // Small top margin + bottomPad_chi->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_chi->Draw(); + + // Upper plot + topPad_chi->cd(); gPad->SetLogx(); gPad->SetLogy(); - h0->SetTitle("b_theta_corr;b_theta_corr;Normalized Events"); - h0->Draw("hist"); - h1->Draw("hist same"); - - // Legend moved to top-left - TLegend* leg = new TLegend(0.15, 0.75, 0.45, 0.88); - leg->AddEntry(h0, "testnoCR.root (normalized)", "l"); - leg->AddEntry(h1, "test.root (normalized)", "l"); - leg->Draw(); - - // Bottom pad: ratio h1/h0 - c->cd(2); + + h_chi_Nom->SetTitle("b_chi_corr"); + h_chi_Nom->GetXaxis()->SetLabelSize(0); + h_chi_Nom->GetYaxis()->SetTitle("normalized events"); + h_chi_Nom->GetYaxis()->CenterTitle(true); + h_chi_Nom->GetXaxis()->SetTitleSize(0.08); + h_chi_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_chi_Nom->SetLineColor(kBlack); h_chi_Nom->SetLineWidth(3); + h_chi_CR->SetLineColor(kRed); h_chi_CR->SetLineWidth(3); + + h_chi_Nom->Draw("HIST"); + h_chi_CR->Draw("HIST SAME"); + + auto leg_chi = new TLegend(0.15, 0.75, 0.45, 0.88); + leg_chi->AddEntry(h_chi_Nom, "Nominal", "l"); + leg_chi->AddEntry(h_chi_CR, "noCR", "l"); + leg_chi->Draw(); + + // Ratio plot + bottomPad_chi->cd(); gPad->SetLogx(); - TH1F* h_ratio = (TH1F*)h1->Clone("h_ratio"); - h_ratio->Divide(h0); - h_ratio->SetTitle("Ratio (test / testnoCR);b_theta_corr;Ratio"); - h_ratio->SetLineColor(kBlack); - h_ratio->SetMinimum(0.9); - h_ratio->SetMaximum(1.1); - h_ratio->Draw("hist"); + r_chi_CR->SetMinimum(0.85); r_chi_CR->SetMaximum(1.1); + r_chi_CR->SetLineColor(kRed); + r_chi_CR->Draw("HIST"); + r_chi_CR->SetLineWidth(3); + + r_chi_CR->GetXaxis()->SetTitle("#chi (radians)"); // Axis titles + r_chi_CR->GetYaxis()->SetTitle("ratio"); + r_chi_CR->GetXaxis()->CenterTitle(true); // Center them + r_chi_CR->GetYaxis()->CenterTitle(true); + r_chi_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_chi_CR->GetYaxis()->SetTitleSize(0.055); + r_chi_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_chi_CR->GetYaxis()->SetLabelSize(0.05); + r_chi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_chi_CR->GetYaxis()->SetTitleOffset(0.55); + + + c_p_jet_const_1->SaveAs("b_p_jet_const_comparison_full_all.png"); + c_p_jet_const_2->SaveAs("b_p_jet2_const_comparison_full_all.png"); + c_theta->SaveAs("b_theta_corr_comparison_full_all.png"); + c_phi->SaveAs("b_phi_corr_comparison_full_all.png"); + c_chi->SaveAs("b_chi_corr_comparison_full_all.png"); - c->Update(); - c->SaveAs("b_theta_corr_comparison.png"); } From 0014b917fd7bad5e44f09833e8a3b2a0ac3fc5a6 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Mon, 4 Aug 2025 11:04:42 -0400 Subject: [PATCH 34/40] all kinematic plots saved to root --- PostCutCode/Root/AnalysisWWCR.cxx | 377 +++++++++++++++++++----------- 1 file changed, 239 insertions(+), 138 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 8075b99..3fc440f 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -122,10 +122,10 @@ void AnalysisWWCR::run() { auto h_W2_mass = m_histContainer->get1DHist("h_W2_mass", 500, 0, 150); auto h_chi2 = m_histContainer->get1DHist("h_chi2", 500, 0, 150); - auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 500, 0, 150); - auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 500, 0, 150); - auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 500, 0, 150); - auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 500, 0, 150); + // auto h_cJet_p = m_histContainer->get1DHist("cJet_p", 500, 0, 150); + // auto h_lJet0_p = m_histContainer->get1DHist("lJet0_p", 500, 0, 150); + // auto h_lJet1_p = m_histContainer->get1DHist("lJet1_p", 500, 0, 150); + // auto h_lJet2_p = m_histContainer->get1DHist("lJet2_p", 500, 0, 150); auto h_W1_p = m_histContainer->get1DHist("h_W1_p", 500, 0, 150); auto h_W2_p = m_histContainer->get1DHist("h_W2_p", 500, 0, 150); @@ -133,29 +133,29 @@ void AnalysisWWCR::run() { auto h_W1_e = m_histContainer->get1DHist("h_W1_e", 500, 0, 150); auto h_W2_e = m_histContainer->get1DHist("h_W2_e", 500, 0, 150); - auto h_chi_c_l0 = m_histContainer->get1DHist("h_chi_c_l0", 500, 0, TMath::Pi()); - auto h_chi_l1_l2 = m_histContainer->get1DHist("h_chi_l1_l2", 500, 0, TMath::Pi()); - auto h_cos_chi_c_l0 = m_histContainer->get1DHist("h_cos_chi_c_l0", 500, -1, 1); - auto h_cos_chi_l1_l2 = m_histContainer->get1DHist("h_cos_chi_l1_l2", 500, -1, 1); - auto h_eec_chi_c_l0 = m_histContainer->get1DHist("h_eec_chi_c_l0", 500, -1, 1); - auto h_eec_chi_l1_l2 = m_histContainer->get1DHist("h_eec_chi_l1_l2", 500, -1, 1); - - auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 500, 0, TMath::Pi()); - auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 500, 0, TMath::Pi()); - auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 500, -1, 1); - auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 500, -1, 1); - auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 500, -1, 1); - auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 500, -1, 1); - - auto h_eta_c_l0 = m_histContainer->get1DHist("h_eta_c_l0", 500, -TMath::Pi(), TMath::Pi()); - auto h_eta_l1_l2 = m_histContainer->get1DHist("h_eta_l1_l2", 500, -TMath::Pi(), TMath::Pi()); - - auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 500, 0, TMath::Pi()); - auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 500, 0, TMath::Pi()); - auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 500, -1, 1); - auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 500, -1, 1); - auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 500, -1, 1); - auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 500, -1, 1); + // auto h_chi_c_l0 = m_histContainer->get1DHist("h_chi_c_l0", 500, 0, TMath::Pi()); + // auto h_chi_l1_l2 = m_histContainer->get1DHist("h_chi_l1_l2", 500, 0, TMath::Pi()); + // auto h_cos_chi_c_l0 = m_histContainer->get1DHist("h_cos_chi_c_l0", 500, -1, 1); + // auto h_cos_chi_l1_l2 = m_histContainer->get1DHist("h_cos_chi_l1_l2", 500, -1, 1); + // auto h_eec_chi_c_l0 = m_histContainer->get1DHist("h_eec_chi_c_l0", 500, -1, 1); + // auto h_eec_chi_l1_l2 = m_histContainer->get1DHist("h_eec_chi_l1_l2", 500, -1, 1); + + // auto h_theta_c_l0 = m_histContainer->get1DHist("h_theta_c_l0", 500, 0, TMath::Pi()); + // auto h_theta_l1_l2 = m_histContainer->get1DHist("h_theta_l1_l2", 500, 0, TMath::Pi()); + // auto h_cos_theta_c_l0 = m_histContainer->get1DHist("h_cos_theta_c_l0", 500, -1, 1); + // auto h_cos_theta_l1_l2 = m_histContainer->get1DHist("h_cos_theta_l1_l2", 500, -1, 1); + // auto h_eec_theta_c_l0 = m_histContainer->get1DHist("h_eec_theta_c_l0", 500, -1, 1); + // auto h_eec_theta_l1_l2 = m_histContainer->get1DHist("h_eec_theta_l1_l2", 500, -1, 1); + + // auto h_eta_c_l0 = m_histContainer->get1DHist("h_eta_c_l0", 500, -TMath::Pi(), TMath::Pi()); + // auto h_eta_l1_l2 = m_histContainer->get1DHist("h_eta_l1_l2", 500, -TMath::Pi(), TMath::Pi()); + + // auto h_phi_c_l0 = m_histContainer->get1DHist("h_phi_c_l0", 500, 0, TMath::Pi()); + // auto h_phi_l1_l2 = m_histContainer->get1DHist("h_phi_l1_l2", 500, 0, TMath::Pi()); + // auto h_cos_phi_c_l0 = m_histContainer->get1DHist("h_cos_phi_c_l0", 500, -1, 1); + // auto h_cos_phi_l1_l2 = m_histContainer->get1DHist("h_cos_phi_l1_l2", 500, -1, 1); + // auto h_eec_phi_c_l0 = m_histContainer->get1DHist("h_eec_phi_c_l0", 500, -1, 1); + // auto h_eec_phi_l1_l2 = m_histContainer->get1DHist("h_eec_phi_l1_l2", 500, -1, 1); TTree* t = new TTree("analysis","my analysis tree"); // Make a new tree my_tree = (TTree*) t; // define the output branches @@ -166,17 +166,26 @@ void AnalysisWWCR::run() { my_tree->Branch("b_theta_corr", &theta_corr); my_tree->Branch("b_phi_corr", &phi_corr); my_tree->Branch("b_chi_corr", &chi_corr); + // my_tree->Branch("b_delR_corr", &delR_corr); + + my_tree->Branch("b_p_reco_Jet1", &p_reco_Jet1); + my_tree->Branch("b_p_reco_Jet2", &p_reco_Jet2); + my_tree->Branch("b_p_reco_Jet3", &p_reco_Jet3); + my_tree->Branch("b_p_reco_Jet4", &p_reco_Jet4); + my_tree->Branch("b_theta_Jet1_Jet2", &theta_Jet1_Jet2); + my_tree->Branch("b_theta_Jet3_Jet4", &theta_Jet3_Jet4); + my_tree->Branch("b_phi_Jet1_Jet2", &phi_Jet1_Jet2); + my_tree->Branch("b_phi_Jet3_Jet4", &phi_Jet3_Jet4); + my_tree->Branch("b_chi_Jet1_Jet2", &chi_Jet1_Jet2); + my_tree->Branch("b_chi_Jet3_Jet4", &chi_Jet3_Jet4); + + my_tree->Branch("b_mass_W1", &mass_W1); + my_tree->Branch("b_mass_W2", &mass_W2); + my_tree->Branch("b_p_W1", &p_W1); + my_tree->Branch("b_p_W2", &p_W2); + my_tree->Branch("b_e_W1", &e_W1); + my_tree->Branch("b_e_W2", &e_W2); - my_tree->Branch("b_p_reco_cJet", &p_reco_cJet); - my_tree->Branch("b_p_reco_lJet0", &p_reco_lJet0); - my_tree->Branch("b_p_reco_lJet1", &p_reco_lJet1); - my_tree->Branch("b_p_reco_lJet2", &p_reco_lJet2); - my_tree->Branch("b_theta_c_l0", &theta_c_l0); - my_tree->Branch("b_theta_l1_l2", &theta_l1_l2); - my_tree->Branch("b_phi_c_l0", &phi_c_l0); - my_tree->Branch("b_phi_l1_l2", &phi_l1_l2); - my_tree->Branch("b_chi_c_l0", &chi_c_l0); - my_tree->Branch("b_chi_l1_l2", &chi_l1_l2); my_tree->Branch("b_w",&mc_weight); auto treeCont = std::make_shared(); // Get the trees @@ -324,20 +333,28 @@ void AnalysisWWCR::run() { std::vector vec_theta_corr; std::vector vec_phi_corr; std::vector vec_chi_corr; + // std::vector vec_delR_corr; std::vector vec_ee_corr; - std::vector vec_p_reco_cJet; - std::vector vec_p_reco_lJet0; - std::vector vec_p_reco_lJet1; - std::vector vec_p_reco_lJet2; - std::vector vec_theta_c_l0; - std::vector vec_theta_l1_l2; - std::vector vec_phi_c_l0; - std::vector vec_phi_l1_l2; - std::vector vec_chi_c_l0; - std::vector vec_chi_l1_l2; + std::vector vec_p_reco_Jet1; + std::vector vec_p_reco_Jet2; + std::vector vec_p_reco_Jet3; + std::vector vec_p_reco_Jet4; + std::vector vec_theta_Jet1_Jet2; + std::vector vec_theta_Jet3_Jet4; + std::vector vec_phi_Jet1_Jet2; + std::vector vec_phi_Jet3_Jet4; + std::vector vec_chi_Jet1_Jet2; + std::vector vec_chi_Jet3_Jet4; + + std::vector vec_mass_W1; + std::vector vec_mass_W2; + std::vector vec_p_W1; + std::vector vec_p_W2; + std::vector vec_e_W1; + std::vector vec_e_W2; + // std::vector vec_delR_W; - // set u/d/s to a "light flavor" quark float jet0_scoreQ = std::max({recojet_isU.at(0), recojet_isD.at(0), recojet_isS.at(0)}); float jet1_scoreQ = std::max({recojet_isU.at(1), recojet_isD.at(1), recojet_isS.at(1)}); @@ -541,11 +558,14 @@ void AnalysisWWCR::run() { double jetSub_cos_phi_4 = cos(jetSub_phi_4); double eec_jetSub_phi_4 = 0.5 * (1 - jetSub_cos_phi_4); + // double jetSub_delR = sqrt(jetSub_eta_3 * jetSub_eta_3 + jetSub_phi_4 * jetSub_phi_4); + vec_p_jet_const_1.push_back(subJet_1.P()); vec_p_jet_const_2.push_back(subJet_2.P()); vec_theta_corr.push_back(jetSub_theta_2); vec_phi_corr.push_back(jetSub_phi_4); vec_chi_corr.push_back(jetSub_chi_1); + // vec_delR_corr.push_back(jetSub_delR); vec_ee_corr.push_back(eec_jetSub_theta_2); h_chi_subjet->Fill(jetSub_chi_1); @@ -706,11 +726,6 @@ void AnalysisWWCR::run() { // for the cos(phi) angle TLorentzVector W1_j1, W1_j2, W2_j1, W2_j2; - // int count_cJet = 0; - // int count_lJet0 = 0; - // int count_lJet1 = 0; - // int count_lJet2 = 0; - if (chi2_option1 <= chi2_option2 && chi2_option1 <= chi2_option3) { h_W1_mass->Fill(W1_option1.M()); h_W2_mass->Fill(W2_option1.M()); @@ -722,15 +737,28 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option1.E()); h_W2_e->Fill(W2_option1.E()); - h_cJet_p->Fill(Jet1.P()); - h_lJet0_p->Fill(Jet2.P()); - h_lJet1_p->Fill(Jet3.P()); - h_lJet2_p->Fill(Jet4.P()); + // double eta_W_boson = std::fabs(W1_option1.Eta() - W2_option1.Eta()); + // double phi_W_boson = std::fabs(W1_option1.Phi() - W2_option1.Phi()); + + // double delta_R_W_boson = sqrt(eta_W_boson * eta_W_boson + phi_W_boson * phi_W_boson); - vec_p_reco_cJet.push_back(Jet1.P()); - vec_p_reco_lJet0.push_back(Jet2.P()); - vec_p_reco_lJet1.push_back(Jet3.P()); - vec_p_reco_lJet2.push_back(Jet4.P()); + // h_Jet1_p->Fill(Jet1.P()); + // h_Jet2_p->Fill(Jet2.P()); + // h_Jet3_p->Fill(Jet3.P()); + // h_Jet4_p->Fill(Jet4.P()); + + vec_mass_W1.push_back(W1_option1.M()); + vec_mass_W2.push_back(W1_option1.M()); + vec_p_W1.push_back(W1_option1.P()); + vec_p_W2.push_back(W2_option1.P()); + vec_e_W1.push_back(W1_option1.E()); + vec_e_W2.push_back(W2_option1.E()); + // vec_delR_W.push_back(delta_R_W_boson); + + vec_p_reco_Jet1.push_back(Jet1.P()); + vec_p_reco_Jet2.push_back(Jet2.P()); + vec_p_reco_Jet3.push_back(Jet3.P()); + vec_p_reco_Jet4.push_back(Jet4.P()); count_cJet++; count_lJet0++; @@ -754,15 +782,28 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option2.E()); h_W2_e->Fill(W2_option2.E()); - h_cJet_p->Fill(Jet1.P()); - h_lJet0_p->Fill(Jet2.P()); - h_lJet1_p->Fill(Jet3.P()); - h_lJet2_p->Fill(Jet4.P()); + // double eta_W_boson = std::fabs(W1_option2.Eta() - W2_option2.Eta()); + // double phi_W_boson = std::fabs(W1_option2.Phi() - W2_option2.Phi()); + + // double delta_R_W_boson = sqrt(eta_W_boson * eta_W_boson + phi_W_boson * phi_W_boson); + + // h_cJet_p->Fill(Jet1.P()); + // h_lJet0_p->Fill(Jet2.P()); + // h_lJet1_p->Fill(Jet3.P()); + // h_lJet2_p->Fill(Jet4.P()); - vec_p_reco_cJet.push_back(Jet1.P()); - vec_p_reco_lJet0.push_back(Jet2.P()); - vec_p_reco_lJet1.push_back(Jet3.P()); - vec_p_reco_lJet2.push_back(Jet4.P()); + vec_mass_W1.push_back(W1_option2.M()); + vec_mass_W2.push_back(W1_option2.M()); + vec_p_W1.push_back(W1_option2.P()); + vec_p_W2.push_back(W2_option2.P()); + vec_e_W1.push_back(W1_option2.E()); + vec_e_W2.push_back(W2_option2.E()); + // vec_delR_W.push_back(delta_R_W_boson); + + vec_p_reco_Jet1.push_back(Jet1.P()); + vec_p_reco_Jet2.push_back(Jet2.P()); + vec_p_reco_Jet3.push_back(Jet3.P()); + vec_p_reco_Jet4.push_back(Jet4.P()); count_cJet++; count_lJet0++; @@ -786,15 +827,28 @@ void AnalysisWWCR::run() { h_W1_e->Fill(W1_option3.E()); h_W2_e->Fill(W2_option3.E()); - h_cJet_p->Fill(Jet1.P()); - h_lJet0_p->Fill(Jet2.P()); - h_lJet1_p->Fill(Jet3.P()); - h_lJet2_p->Fill(Jet3.P()); + // double eta_W_boson = std::fabs(W1_option3.Eta() - W2_option3.Eta()); + // double phi_W_boson = std::fabs(W1_option3.Phi() - W2_option3.Phi()); + + // double delta_R_W_boson = sqrt(eta_W_boson * eta_W_boson + phi_W_boson * phi_W_boson); + + // h_cJet_p->Fill(Jet1.P()); + // h_lJet0_p->Fill(Jet2.P()); + // h_lJet1_p->Fill(Jet3.P()); + // h_lJet2_p->Fill(Jet3.P()); + + vec_mass_W1.push_back(W1_option3.M()); + vec_mass_W2.push_back(W1_option3.M()); + vec_p_W1.push_back(W1_option3.P()); + vec_p_W2.push_back(W2_option3.P()); + vec_e_W1.push_back(W1_option3.E()); + vec_e_W2.push_back(W2_option3.E()); + // vec_delR_W.push_back(delta_R_W_boson); - vec_p_reco_cJet.push_back(Jet1.P()); - vec_p_reco_lJet0.push_back(Jet2.P()); - vec_p_reco_lJet1.push_back(Jet3.P()); - vec_p_reco_lJet2.push_back(Jet4.P()); + vec_p_reco_Jet1.push_back(Jet1.P()); + vec_p_reco_Jet2.push_back(Jet2.P()); + vec_p_reco_Jet3.push_back(Jet3.P()); + vec_p_reco_Jet4.push_back(Jet4.P()); count_cJet++; count_lJet0++; @@ -808,6 +862,37 @@ void AnalysisWWCR::run() { W2_j2 = Jet2; } + double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); + double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); + // double cos_chi_c_l0 = cos(chi_c_l0); + // double cos_chi_l1_l2 = cos(chi_l1_l2); + // double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); + // double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); + + double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); + double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); + // double cos_theta_c_l0 = cos(theta_c_l0); + // double cos_theta_l1_l2 = cos(theta_l1_l2); + // double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); + // double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); + + double eta_c_l0 = std::fabs(W1_j1.Eta() - W1_j2.Eta()); + double eta_l1_l2 = std::fabs(W2_j1.Eta() - W2_j2.Eta()); + + double phi_c_l0 = W1_j1.Phi() - W1_j2.Phi(); + double phi_l1_l2 = W2_j1.Phi() - W2_j2.Phi(); + // double cos_phi_c_l0 = cos(phi_c_l0); + // double cos_phi_l1_l2 = cos(phi_l1_l2); + // double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); + // double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); + + vec_theta_Jet1_Jet2.push_back(theta_c_l0); + vec_theta_Jet3_Jet4.push_back(theta_l1_l2); + vec_phi_Jet1_Jet2.push_back(phi_c_l0); + vec_phi_Jet3_Jet4.push_back(phi_l1_l2); + vec_chi_Jet1_Jet2.push_back(chi_c_l0); + vec_chi_Jet3_Jet4.push_back(chi_l1_l2); + mc_weight = norm_weight; ee_corr = vec_ee_corr; p_jet_const_1 = vec_p_jet_const_1; @@ -815,10 +900,26 @@ void AnalysisWWCR::run() { theta_corr = vec_theta_corr; phi_corr= vec_phi_corr; chi_corr=vec_chi_corr; - p_reco_cJet = vec_p_reco_cJet; - p_reco_lJet0 = vec_p_reco_lJet0; - p_reco_lJet1 = vec_p_reco_lJet1; - p_reco_lJet2 = vec_p_reco_lJet2; + // delR_corr = vec_delR_corr; + + p_reco_Jet1 = vec_p_reco_Jet1; + p_reco_Jet2 = vec_p_reco_Jet2; + p_reco_Jet3 = vec_p_reco_Jet3; + p_reco_Jet4 = vec_p_reco_Jet4; + theta_Jet1_Jet2 = vec_theta_Jet1_Jet2; + theta_Jet3_Jet4 = vec_theta_Jet3_Jet4; + phi_Jet1_Jet2 = vec_phi_Jet1_Jet2; + phi_Jet3_Jet4 = vec_phi_Jet3_Jet4; + chi_Jet1_Jet2 = vec_chi_Jet1_Jet2; + chi_Jet3_Jet4 = vec_chi_Jet3_Jet4; + + mass_W1 = vec_mass_W1; + mass_W2 = vec_mass_W2; + p_W1 = vec_p_W1; + p_W2 = vec_p_W2; + e_W1 = vec_e_W1; + e_W2 = vec_e_W2; + // delta_R_W_boson = vec_delR_W; my_tree->Fill(); // double counts_cJet = h_cJet_p->Integral(); @@ -826,70 +927,70 @@ void AnalysisWWCR::run() { // double counts_lJet1 = h_lJet1_p->Integral(); // double counts_lJet2 = h_lJet2_p->Integral(); - // ************* CHI ************* - double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); - double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); + // // ************* CHI ************* + // double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); + // double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); - double cos_chi_c_l0 = cos(chi_c_l0); - double cos_chi_l1_l2 = cos(chi_l1_l2); + // double cos_chi_c_l0 = cos(chi_c_l0); + // double cos_chi_l1_l2 = cos(chi_l1_l2); - double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); - double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); + // double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); + // double ee_correlation_chi_l1_l2 = 0.5 * (1 - cos_chi_l1_l2); - // ************* THETA ************* - double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); - double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); + // // ************* THETA ************* + // double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); + // double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); - double cos_theta_c_l0 = cos(theta_c_l0); - double cos_theta_l1_l2 = cos(theta_l1_l2); + // double cos_theta_c_l0 = cos(theta_c_l0); + // double cos_theta_l1_l2 = cos(theta_l1_l2); - double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); - double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); + // double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); + // double ee_correlation_theta_l1_l2 = 0.5 * (1 - cos_theta_l1_l2); - // ************* ETA ************* - double eta_c_l0 = std::fabs(W1_j1.Eta() - W1_j2.Eta()); - double eta_l1_l2 = std::fabs(W2_j1.Eta() - W2_j2.Eta()); + // // ************* ETA ************* + // double eta_c_l0 = std::fabs(W1_j1.Eta() - W1_j2.Eta()); + // double eta_l1_l2 = std::fabs(W2_j1.Eta() - W2_j2.Eta()); - // ************* PHI ************* - double phi_c_l0 = W1_j1.Phi() - W1_j2.Phi(); - double phi_l1_l2 = W2_j1.Phi() - W2_j2.Phi(); + // // ************* PHI ************* + // double phi_c_l0 = W1_j1.Phi() - W1_j2.Phi(); + // double phi_l1_l2 = W2_j1.Phi() - W2_j2.Phi(); - double cos_phi_c_l0 = cos(phi_c_l0); - double cos_phi_l1_l2 = cos(phi_l1_l2); + // double cos_phi_c_l0 = cos(phi_c_l0); + // double cos_phi_l1_l2 = cos(phi_l1_l2); - double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); - double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); + // double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); + // double ee_correlation_phi_l1_l2 = 0.5 * (1 - cos_phi_l1_l2); // *********************** HISTOGRAMS *********************** - vec_theta_c_l0.push_back(theta_c_l0); - vec_theta_l1_l2.push_back(theta_l1_l2); - vec_phi_c_l0.push_back(phi_c_l0); - vec_phi_l1_l2.push_back(phi_l1_l2); - vec_chi_c_l0.push_back(chi_c_l0); - vec_chi_l1_l2.push_back(chi_l1_l2); - - h_chi_c_l0->Fill(chi_c_l0); - h_chi_l1_l2->Fill(chi_l1_l2); - h_theta_c_l0->Fill(theta_c_l0); - h_theta_l1_l2->Fill(theta_l1_l2); - h_eta_c_l0->Fill(eta_c_l0); - h_eta_l1_l2->Fill(eta_l1_l2); - h_phi_c_l0->Fill(phi_c_l0); - h_phi_l1_l2->Fill(phi_l1_l2); - - h_cos_chi_c_l0->Fill(cos_chi_c_l0); - h_cos_chi_l1_l2->Fill(cos_chi_l1_l2); - h_cos_theta_c_l0->Fill(cos_theta_c_l0); - h_cos_theta_l1_l2->Fill(cos_theta_l1_l2); - h_cos_phi_c_l0->Fill(cos_phi_c_l0); - h_cos_phi_l1_l2->Fill(cos_phi_l1_l2); - - h_eec_chi_c_l0->Fill(ee_correlation_chi_c_l0); - h_eec_chi_l1_l2->Fill(ee_correlation_chi_l1_l2); - h_eec_theta_c_l0->Fill(ee_correlation_theta_c_l0); - h_eec_theta_l1_l2->Fill(ee_correlation_theta_l1_l2); - h_eec_phi_c_l0->Fill(ee_correlation_phi_c_l0); - h_eec_phi_l1_l2->Fill(ee_correlation_phi_l1_l2); + // vec_theta_Jet1_Jet2.push_back(theta_c_l0); + // vec_theta_Jet3_Jet4.push_back(theta_l1_l2); + // vec_phi_Jet1_Jet2.push_back(phi_c_l0); + // vec_phi_Jet3_Jet4.push_back(phi_l1_l2); + // vec_chi_Jet1_Jet2.push_back(chi_c_l0); + // vec_chi_Jet3_Jet4.push_back(chi_l1_l2); + + // h_chi_c_l0->Fill(chi_c_l0); + // h_chi_l1_l2->Fill(chi_l1_l2); + // h_theta_c_l0->Fill(theta_c_l0); + // h_theta_l1_l2->Fill(theta_l1_l2); + // h_eta_c_l0->Fill(eta_c_l0); + // h_eta_l1_l2->Fill(eta_l1_l2); + // h_phi_c_l0->Fill(phi_c_l0); + // h_phi_l1_l2->Fill(phi_l1_l2); + + // h_cos_chi_c_l0->Fill(cos_chi_c_l0); + // h_cos_chi_l1_l2->Fill(cos_chi_l1_l2); + // h_cos_theta_c_l0->Fill(cos_theta_c_l0); + // h_cos_theta_l1_l2->Fill(cos_theta_l1_l2); + // h_cos_phi_c_l0->Fill(cos_phi_c_l0); + // h_cos_phi_l1_l2->Fill(cos_phi_l1_l2); + + // h_eec_chi_c_l0->Fill(ee_correlation_chi_c_l0); + // h_eec_chi_l1_l2->Fill(ee_correlation_chi_l1_l2); + // h_eec_theta_c_l0->Fill(ee_correlation_theta_c_l0); + // h_eec_theta_l1_l2->Fill(ee_correlation_theta_l1_l2); + // h_eec_phi_c_l0->Fill(ee_correlation_phi_c_l0); + // h_eec_phi_l1_l2->Fill(ee_correlation_phi_l1_l2); // cutflow histograms @@ -919,10 +1020,10 @@ void AnalysisWWCR::run() { std::cout << " " << std::endl; - std::cout << "Histogram entries for cJet: " << h_cJet_p->GetEntries() << std::endl; - std::cout << "Histogram entries for lJet0: " << h_lJet0_p->GetEntries() << std::endl; - std::cout << "Histogram entries for lJet1: " << h_lJet1_p->GetEntries() << std::endl; - std::cout << "Histogram entries for lJet2: " << h_lJet2_p->GetEntries() << std::endl; + // std::cout << "Histogram entries for cJet: " << h_cJet_p->GetEntries() << std::endl; + // std::cout << "Histogram entries for lJet0: " << h_lJet0_p->GetEntries() << std::endl; + // std::cout << "Histogram entries for lJet1: " << h_lJet1_p->GetEntries() << std::endl; + // std::cout << "Histogram entries for lJet2: " << h_lJet2_p->GetEntries() << std::endl; From 8211ddebf1f3652ee97224b4f90ac639f4a29046 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 5 Aug 2025 16:45:21 -0400 Subject: [PATCH 35/40] loading in SKI_kl variation files --- PostCutCode/PostCutCode/AnalysisWWCR.h | 35 ++ scripts/plot.C | 820 +++++++++++++++++++++++-- 2 files changed, 807 insertions(+), 48 deletions(-) diff --git a/PostCutCode/PostCutCode/AnalysisWWCR.h b/PostCutCode/PostCutCode/AnalysisWWCR.h index f35db1b..0aed00e 100644 --- a/PostCutCode/PostCutCode/AnalysisWWCR.h +++ b/PostCutCode/PostCutCode/AnalysisWWCR.h @@ -25,6 +25,41 @@ class AnalysisWWCR: public AnalysisBase std::vector theta_corr; std::vector phi_corr; std::vector chi_corr; + std::vector delR_corr; + std::vector p_jet_const_1; + std::vector p_jet_const_2; + + std::vector p_reco_Jet1; + std::vector p_reco_Jet2; + std::vector p_reco_Jet3; + std::vector p_reco_Jet4; + std::vector theta_Jet1_Jet2; + std::vector theta_Jet3_Jet4; + std::vector theta_Jet1_Jet3; + std::vector theta_Jet2_Jet4; + std::vector theta_Jet1_Jet4; + std::vector theta_Jet2_Jet3; + std::vector phi_Jet1_Jet2; + std::vector phi_Jet3_Jet4; + std::vector phi_Jet1_Jet3; + std::vector phi_Jet2_Jet4; + std::vector phi_Jet1_Jet4; + std::vector phi_Jet2_Jet3; + std::vector chi_Jet1_Jet2; + std::vector chi_Jet3_Jet4; + std::vector chi_Jet1_Jet3; + std::vector chi_Jet2_Jet4; + std::vector chi_Jet1_Jet4; + std::vector chi_Jet2_Jet3; + + std::vector mass_W1; + std::vector mass_W2; + std::vector p_W1; + std::vector p_W2; + std::vector e_W1; + std::vector e_W2; + // std::vector delta_R_W_boson; + double mc_weight; }; diff --git a/scripts/plot.C b/scripts/plot.C index 8bb7447..59313d1 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -3,12 +3,19 @@ void plot() { gStyle->SetOptStat(0); // Open files and get trees - TFile *fNom = TFile::Open("test.root"); - TFile *fCR = TFile::Open("test_noCR.root"); + TFile *fNom = TFile::Open("/atlasgpfs01/usatlas/data/kleibensperger/WWCR_100k_events/test.root"); + TFile *fCR = TFile::Open("/atlasgpfs01/usatlas/data/kleibensperger/WWCR_100k_events/test_noCR.root"); + TFile *fSKI_kl5 = TFile::Open("/atlasgpfs01/usatlas/data/kleibensperger/WWCR_100k_events/test_SKI_kl5.root"); + TFile *fSKI_kl50 = TFile::Open("/atlasgpfs01/usatlas/data/kleibensperger/WWCR_100k_events/test_SKI_kl50.root"); + TFile *fSKI_kl100 = TFile::Open("/atlasgpfs01/usatlas/data/kleibensperger/WWCR_100k_events/test_SKI_kl100.root"); + TTree *tNom = (TTree*)fNom->Get("analysis"); TTree *tCR = (TTree*)fCR->Get("analysis"); + TTree *tSKI_kl5 = (TTree*)fSKI_kl5->Get("analysis"); + TTree *tSKI_kl50 = (TTree*)fSKI_kl50->Get("analysis"); + TTree *tSKI_kl100 = (TTree*)fSKI_kl100->Get("analysis"); - // Custom binning to match z = (1 - cos(θ)) / 2 axis + // Custom binning to match z = (1 - cos(θ)) / 2 axis int nBins = 100; double xMin = 0.01, xMax = 3.1; double xMin_lin = 0.01, xMax_lin = 180; @@ -75,6 +82,9 @@ void plot() { TH1F *h_chi_Nom = new TH1F("h_chi_Nom", "#Delta#chi;Normalized Events", nBins, logBins); TH1F *h_chi_CR = new TH1F("h_chi_CR", "", nBins, logBins); + TH1F *h_delR_Nom = new TH1F("h_delR_Nom", "#deltaR- Nominal", nBins, linearBins); + TH1F *h_delR_CR = new TH1F("h_delR_CR", "", nBins, linearBins); + TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); @@ -84,17 +94,49 @@ void plot() { TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); - TH1F* h_p_reco_cJet_Nom = new TH1F("h_p_reco_cJet_Nom", "Momentum", nBins, linearBins); - TH1F* h_p_reco_cJet_CR = new TH1F("h_p_reco_cJet_CR", "", nBins, linearBins); + // ************************ Reconstructed W Bosons ************************ + TH1F* h_mass_W1_Nom = new TH1F("h_mass_W1_Nom", "Mass", nBins, linearBins); + TH1F* h_mass_W1_CR = new TH1F("h_mass_W1_CR", "", nBins, linearBins); + + TH1F* h_mass_W2_Nom = new TH1F("h_mass_W2_Nom", "Mass", nBins, linearBins); + TH1F* h_mass_W2_CR = new TH1F("h_mass_W2_CR", "", nBins, linearBins); + + TH1F* h_p_W1_Nom = new TH1F("h_p_W1_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_W1_CR = new TH1F("h_p_W1_CR", "", nBins, linearBins); + + TH1F* h_p_W2_Nom = new TH1F("h_p_W2_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_W2_CR = new TH1F("h_p_W2_CR", "", nBins, linearBins); + + TH1F* h_e_W1_Nom = new TH1F("h_e_W1_Nom", "Energy", nBins, linearBins); + TH1F* h_e_W1_CR = new TH1F("h_e_W1_CR", "", nBins, linearBins); + + TH1F* h_e_W2_Nom = new TH1F("h_e_W2_Nom", "Energy", nBins, linearBins); + TH1F* h_e_W2_CR = new TH1F("h_e_W2_CR", "", nBins, linearBins); + + // ************************ Reconstructed Jets ************************ + TH1F* h_p_reco_Jet1_Nom = new TH1F("h_p_reco_Jet1_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_Jet1_CR = new TH1F("h_p_reco_Jet1_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet2_Nom = new TH1F("h_p_reco_Jet2_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_Jet2_CR = new TH1F("h_p_reco_Jet2_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet3_Nom = new TH1F("h_p_reco_Jet3_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_Jet3_CR = new TH1F("h_p_reco_Jet3_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet4_Nom = new TH1F("h_p_reco_Jet4_Nom", "Momentum", nBins, linearBins); + TH1F* h_p_reco_Jet4_CR = new TH1F("h_p_reco_Jet4_CR", "", nBins, linearBins); - TH1F* h_p_reco_lJet0_Nom = new TH1F("h_p_reco_lJet0_Nom", "Momentum", nBins, linearBins); - TH1F* h_p_reco_lJet0_CR = new TH1F("h_p_reco_lJet0_CR", "", nBins, linearBins); + TH1F* h_theta_Jet1_Jet2_Nom = new TH1F("h_theta_Jet1_Jet2_Nom", "#theta", nBins, logBins); + TH1F* h_theta_Jet1_Jet2_CR = new TH1F("h_theta_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_theta_Jet3_Jet4_Nom = new TH1F("h_theta_Jet3_Jet4_Nom", "#theta", nBins, logBins); + TH1F* h_theta_Jet3_Jet4_CR = new TH1F("h_theta_Jet3_Jet4_CR", "", nBins, logBins); - TH1F* h_p_reco_lJet1_Nom = new TH1F("h_p_reco_lJet1_Nom", "Momentum", nBins, linearBins); - TH1F* h_p_reco_lJet1_CR = new TH1F("h_p_reco_lJet1_CR", "", nBins, linearBins); + TH1F* h_phi_Jet1_Jet2_Nom = new TH1F("h_phi_Jet1_Jet2_Nom", "#theta", nBins, logBins); + TH1F* h_phi_Jet1_Jet2_CR = new TH1F("h_phi_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_phi_Jet3_Jet4_Nom = new TH1F("h_phi_Jet3_Jet4_Nom", "#theta", nBins, logBins); + TH1F* h_phi_Jet3_Jet4_CR = new TH1F("h_phi_Jet3_Jet4_CR", "", nBins, logBins); - TH1F* h_p_reco_lJet2_Nom = new TH1F("h_p_reco_lJet2_Nom", "Momentum", nBins, linearBins); - TH1F* h_p_reco_lJet2_CR = new TH1F("h_p_reco_lJet2_CR", "", nBins, linearBins); + TH1F* h_chi_Jet1_Jet2_Nom = new TH1F("h_chi_Jet1_Jet2_Nom", "#theta", nBins, logBins); + TH1F* h_chi_Jet1_Jet2_CR = new TH1F("h_chi_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_chi_Jet3_Jet4_Nom = new TH1F("h_chi_Jet3_Jet4_Nom", "#theta", nBins, logBins); + TH1F* h_chi_Jet3_Jet4_CR = new TH1F("h_chi_Jet3_Jet4_CR", "", nBins, logBins); // Fill tNom->Draw("b_p_jet_const_1 >> h_p_jet_const_1_Nom", "", "goff"); @@ -112,17 +154,49 @@ void plot() { tNom->Draw("b_chi_corr >> h_chi_Nom", "", "goff"); tCR->Draw("b_chi_corr >> h_chi_CR", "", "goff"); - tNom->Draw("b_p_reco_cJet >> h_p_reco_cJet_Nom", "", "goff"); - tCR->Draw("b_p_reco_cJet >> h_p_reco_cJet_CR", "", "goff"); - - tNom->Draw("b_p_reco_lJet0 >> h_p_reco_lJet0_Nom", "", "goff"); - tCR->Draw("b_p_reco_lJet0 >> h_p_reco_lJet0_CR", "", "goff"); - - tNom->Draw("b_p_reco_lJet1 >> h_p_reco_lJet1_Nom", "", "goff"); - tCR->Draw("b_p_reco_lJet1 >> h_p_reco_lJet1_CR", "", "goff"); - - tNom->Draw("b_p_reco_lJet2 >> h_p_reco_lJet2_Nom", "", "goff"); - tCR->Draw("b_p_reco_lJet2 >> h_p_reco_lJet2_CR", "", "goff"); + tNom->Draw("b_delR_corr >> h_delR_Nom", "", "goff"); + tCR->Draw("b_delR_corr >> h_delR_CR", "", "goff"); + + // ***************** W Bosons ***************** + tNom->Draw("b_mass_W1 >> h_mass_W1_Nom", "", "goff"); + tCR->Draw("b_mass_W1 >> h_mass_W1_CR", "", "goff"); + tNom->Draw("b_mass_W2 >> h_mass_W2_Nom", "", "goff"); + tCR->Draw("b_mass_W2 >> h_mass_W2_CR", "", "goff"); + + tNom->Draw("b_p_W1 >> h_p_W1_Nom", "", "goff"); + tCR->Draw("b_p_W1 >> h_p_W1_CR", "", "goff"); + tNom->Draw("b_p_W2 >> h_p_W2_Nom", "", "goff"); + tCR->Draw("b_p_W2 >> h_p_W2_CR", "", "goff"); + + tNom->Draw("b_e_W1 >> h_e_W1_Nom", "", "goff"); + tCR->Draw("b_e_W1 >> h_e_W1_CR", "", "goff"); + tNom->Draw("b_e_W2 >> h_e_W2_Nom", "", "goff"); + tCR->Draw("b_e_W2 >> h_e_W2_CR", "", "goff"); + + // ***************** Reconstructed Jets ***************** + tNom->Draw("b_p_reco_Jet1 >> h_p_reco_Jet1_Nom", "", "goff"); + tCR->Draw("b_p_reco_Jet1 >> h_p_reco_Jet1_CR", "", "goff"); + tNom->Draw("b_p_reco_Jet2 >> h_p_reco_Jet2_Nom", "", "goff"); + tCR->Draw("b_p_reco_Jet2 >> h_p_reco_Jet2_CR", "", "goff"); + tNom->Draw("b_p_reco_Jet3 >> h_p_reco_Jet3_Nom", "", "goff"); + tCR->Draw("b_p_reco_Jet3 >> h_p_reco_Jet3_CR", "", "goff"); + tNom->Draw("b_p_reco_Jet4 >> h_p_reco_Jet4_Nom", "", "goff"); + tCR->Draw("b_p_reco_Jet4 >> h_p_reco_Jet4_CR", "", "goff"); + + tNom->Draw("b_theta_Jet1_Jet2 >> h_theta_Jet1_Jet2_Nom", "", "goff"); + tCR->Draw("b_theta_Jet1_Jet2 >> h_theta_Jet1_Jet2_CR", "", "goff"); + tNom->Draw("b_theta_Jet3_Jet4 >> h_theta_Jet3_Jet4_Nom", "", "goff"); + tCR->Draw("b_theta_Jet3_Jet4 >> h_theta_Jet3_Jet4_CR", "", "goff"); + + tNom->Draw("b_phi_Jet1_Jet2 >> h_phi_Jet1_Jet2_Nom", "", "goff"); + tCR->Draw("b_phi_Jet1_Jet2 >> h_phi_Jet1_Jet2_CR", "", "goff"); + tNom->Draw("b_phi_Jet3_Jet4 >> h_phi_Jet3_Jet4_Nom", "", "goff"); + tCR->Draw("b_phi_Jet3_Jet4 >> h_phi_Jet3_Jet4_CR", "", "goff"); + + tNom->Draw("b_chi_Jet1_Jet2 >> h_chi_Jet1_Jet2_Nom", "", "goff"); + tCR->Draw("b_chi_Jet1_Jet2 >> h_chi_Jet1_Jet2_CR", "", "goff"); + tNom->Draw("b_chi_Jet3_Jet4 >> h_chi_Jet3_Jet4_Nom", "", "goff"); + tCR->Draw("b_chi_Jet3_Jet4 >> h_chi_Jet3_Jet4_CR", "", "goff"); // Normalize both histograms by their integrals h_p_jet_const_1_Nom->Scale(1.0 / h_p_jet_const_1_Nom->Integral()); @@ -140,17 +214,49 @@ void plot() { h_chi_Nom->Scale(1.0 / h_chi_Nom->Integral()); h_chi_CR->Scale(1.0 / h_chi_CR->Integral()); - h_p_reco_cJet_Nom->Scale(1.0 / h_p_reco_cJet_Nom->Integral()); - h_p_reco_cJet_CR->Scale(1.0 / h_p_reco_cJet_CR->Integral()); - - h_p_reco_lJet0_Nom->Scale(1.0 / h_p_reco_lJet0_Nom->Integral()); - h_p_reco_lJet0_CR->Scale(1.0 / h_p_reco_lJet0_CR->Integral()); - - h_p_reco_lJet1_Nom->Scale(1.0 / h_p_reco_lJet1_Nom->Integral()); - h_p_reco_lJet1_CR->Scale(1.0 / h_p_reco_lJet1_CR->Integral()); - - h_p_reco_lJet2_Nom->Scale(1.0 / h_p_reco_lJet2_Nom->Integral()); - h_p_reco_lJet2_CR->Scale(1.0 / h_p_reco_lJet2_CR->Integral()); + h_delR_Nom->Scale(1.0 / h_delR_Nom->Integral()); + h_delR_CR->Scale(1.0 / h_delR_CR->Integral()); + + // ***************** W Bosons ***************** + h_mass_W1_Nom->Scale(1.0 / h_mass_W1_Nom->Integral()); + h_mass_W1_CR->Scale(1.0 / h_mass_W1_CR->Integral()); + h_mass_W2_Nom->Scale(1.0 / h_mass_W2_Nom->Integral()); + h_mass_W2_CR->Scale(1.0 / h_mass_W2_CR->Integral()); + + h_p_W1_Nom->Scale(1.0 / h_p_W1_Nom->Integral()); + h_p_W1_CR->Scale(1.0 / h_p_W1_CR->Integral()); + h_p_W2_Nom->Scale(1.0 / h_p_W2_Nom->Integral()); + h_p_W2_CR->Scale(1.0 / h_p_W2_CR->Integral()); + + h_e_W1_Nom->Scale(1.0 / h_e_W1_Nom->Integral()); + h_e_W1_CR->Scale(1.0 / h_e_W1_CR->Integral()); + h_e_W2_Nom->Scale(1.0 / h_e_W2_Nom->Integral()); + h_e_W2_CR->Scale(1.0 / h_e_W2_CR->Integral()); + + // ***************** Reconstructed Jets ***************** + h_p_reco_Jet1_Nom->Scale(1.0 / h_p_reco_Jet1_Nom->Integral()); + h_p_reco_Jet1_CR->Scale(1.0 / h_p_reco_Jet1_CR->Integral()); + h_p_reco_Jet2_Nom->Scale(1.0 / h_p_reco_Jet2_Nom->Integral()); + h_p_reco_Jet2_CR->Scale(1.0 / h_p_reco_Jet2_CR->Integral()); + h_p_reco_Jet3_Nom->Scale(1.0 / h_p_reco_Jet3_Nom->Integral()); + h_p_reco_Jet3_CR->Scale(1.0 / h_p_reco_Jet3_CR->Integral()); + h_p_reco_Jet4_Nom->Scale(1.0 / h_p_reco_Jet4_Nom->Integral()); + h_p_reco_Jet4_CR->Scale(1.0 / h_p_reco_Jet4_CR->Integral()); + + h_theta_Jet1_Jet2_Nom->Scale(1.0 / h_theta_Jet1_Jet2_Nom->Integral()); + h_theta_Jet1_Jet2_CR->Scale(1.0 / h_theta_Jet1_Jet2_CR->Integral()); + h_theta_Jet3_Jet4_Nom->Scale(1.0 / h_theta_Jet3_Jet4_Nom->Integral()); + h_theta_Jet3_Jet4_CR->Scale(1.0 / h_theta_Jet3_Jet4_CR->Integral()); + + h_phi_Jet1_Jet2_Nom->Scale(1.0 / h_phi_Jet1_Jet2_Nom->Integral()); + h_phi_Jet1_Jet2_CR->Scale(1.0 / h_phi_Jet1_Jet2_CR->Integral()); + h_phi_Jet3_Jet4_Nom->Scale(1.0 / h_phi_Jet3_Jet4_Nom->Integral()); + h_phi_Jet3_Jet4_CR->Scale(1.0 / h_phi_Jet3_Jet4_CR->Integral()); + + h_chi_Jet1_Jet2_Nom->Scale(1.0 / h_chi_Jet1_Jet2_Nom->Integral()); + h_chi_Jet1_Jet2_CR->Scale(1.0 / h_chi_Jet1_Jet2_CR->Integral()); + h_chi_Jet3_Jet4_Nom->Scale(1.0 / h_chi_Jet3_Jet4_Nom->Integral()); + h_chi_Jet3_Jet4_CR->Scale(1.0 / h_chi_Jet3_Jet4_CR->Integral()); // Ratio to Nominal TH1F *r_p_jet_const_1_CR = (TH1F*)h_p_jet_const_1_CR->Clone("r_p_jet_const_1_CR"); r_p_jet_const_1_CR->Divide(h_p_jet_const_1_Nom); @@ -158,11 +264,26 @@ void plot() { TH1F *r_theta_CR = (TH1F*)h_theta_CR->Clone("r_theta_CR"); r_theta_CR->Divide(h_theta_Nom); TH1F *r_phi_CR = (TH1F*)h_phi_CR->Clone("r_phi_CR"); r_phi_CR->Divide(h_phi_Nom); TH1F *r_chi_CR = (TH1F*)h_chi_CR->Clone("r_chi_CR"); r_chi_CR->Divide(h_chi_Nom); + TH1F *r_delR_CR = (TH1F*)h_delR_CR->Clone("r_delR_CR"); r_delR_CR->Divide(h_delR_Nom); TH1D *r_eec_CR = (TH1D*)h_eec_CR->Clone("r_eec_CR"); r_eec_CR->Divide(h_eec_Nom); - TH1F *r_p_reco_cJet_CR = (TH1F*)h_p_reco_cJet_CR->Clone("r_p_reco_cJet_CR"); r_p_reco_cJet_CR->Divide(h_p_reco_cJet_Nom); - TH1F *r_p_reco_lJet0_CR = (TH1F*)h_p_reco_lJet0_CR->Clone("r_p_reco_lJet0_CR"); r_p_reco_lJet0_CR->Divide(h_p_reco_lJet0_Nom); - TH1F *r_p_reco_lJet1_CR = (TH1F*)h_p_reco_lJet1_CR->Clone("r_p_reco_lJet1_CR"); r_p_reco_lJet1_CR->Divide(h_p_reco_lJet1_Nom); - TH1F *r_p_reco_lJet2_CR = (TH1F*)h_p_reco_lJet2_CR->Clone("r_p_reco_lJet2_CR"); r_p_reco_lJet2_CR->Divide(h_p_reco_lJet2_Nom); + + TH1F *r_mass_W1_CR = (TH1F*)h_mass_W1_CR->Clone("r_mass_W1_CR"); r_mass_W1_CR->Divide(h_mass_W1_Nom); + TH1F *r_mass_W2_CR = (TH1F*)h_mass_W2_CR->Clone("r_mass_W2_CR"); r_mass_W2_CR->Divide(h_mass_W2_Nom); + TH1F *r_p_W1_CR = (TH1F*)h_p_W1_CR->Clone("r_p_W1_CR"); r_p_W1_CR->Divide(h_p_W1_Nom); + TH1F *r_p_W2_CR = (TH1F*)h_p_W2_CR->Clone("r_p_W2_CR"); r_p_W2_CR->Divide(h_p_W2_Nom); + TH1F *r_e_W1_CR = (TH1F*)h_e_W1_CR->Clone("r_e_W1_CR"); r_e_W1_CR->Divide(h_e_W1_Nom); + TH1F *r_e_W2_CR = (TH1F*)h_e_W2_CR->Clone("r_e_W2_CR"); r_e_W2_CR->Divide(h_e_W2_Nom); + + TH1F *r_p_reco_Jet1_CR = (TH1F*)h_p_reco_Jet1_CR->Clone("r_p_reco_Jet1_CR"); r_p_reco_Jet1_CR->Divide(h_p_reco_Jet1_Nom); + TH1F *r_p_reco_Jet2_CR = (TH1F*)h_p_reco_Jet2_CR->Clone("r_p_reco_Jet2_CR"); r_p_reco_Jet2_CR->Divide(h_p_reco_Jet2_Nom); + TH1F *r_p_reco_Jet3_CR = (TH1F*)h_p_reco_Jet3_CR->Clone("r_p_reco_Jet3_CR"); r_p_reco_Jet3_CR->Divide(h_p_reco_Jet3_Nom); + TH1F *r_p_reco_Jet4_CR = (TH1F*)h_p_reco_Jet4_CR->Clone("r_p_reco_Jet4_CR"); r_p_reco_Jet4_CR->Divide(h_p_reco_Jet4_Nom); + TH1F *r_theta_Jet1_Jet2_CR = (TH1F*)h_theta_Jet1_Jet2_CR->Clone("r_theta_Jet1_Jet2_CR"); r_theta_Jet1_Jet2_CR->Divide(h_theta_Jet1_Jet2_Nom); + TH1F *r_theta_Jet3_Jet4_CR = (TH1F*)h_theta_Jet3_Jet4_CR->Clone("r_theta_Jet3_Jet4_CR"); r_theta_Jet3_Jet4_CR->Divide(h_theta_Jet3_Jet4_Nom); + TH1F *r_phi_Jet1_Jet2_CR = (TH1F*)h_phi_Jet1_Jet2_CR->Clone("r_phi_Jet1_Jet2_CR"); r_phi_Jet1_Jet2_CR->Divide(h_phi_Jet1_Jet2_Nom); + TH1F *r_phi_Jet3_Jet4_CR = (TH1F*)h_phi_Jet3_Jet4_CR->Clone("r_phi_Jet3_Jet4_CR"); r_phi_Jet3_Jet4_CR->Divide(h_phi_Jet3_Jet4_Nom); + TH1F *r_chi_Jet1_Jet2_CR = (TH1F*)h_chi_Jet1_Jet2_CR->Clone("r_chi_Jet1_Jet2_CR"); r_chi_Jet1_Jet2_CR->Divide(h_chi_Jet1_Jet2_Nom); + TH1F *r_chi_Jet3_Jet4_CR = (TH1F*)h_chi_Jet3_Jet4_CR->Clone("r_chi_Jet3_Jet4_CR"); r_chi_Jet3_Jet4_CR->Divide(h_chi_Jet3_Jet4_Nom); // **************************************** Jet Constituent Plots **************************************** TCanvas *c_p_jet_const_1 = new TCanvas("c_p_jet_const_1", "comparison", 1000, 800); @@ -199,7 +320,7 @@ void plot() { h_p_jet_const_1_Nom->Draw("HIST"); h_p_jet_const_1_CR->Draw("HIST SAME"); - auto leg_p_jetConst_1 = new TLegend(0.75, 0.75, 0.95, 0.88); + auto leg_p_jetConst_1 = new TLegend(0.725, 0.75, 0.88, 0.88); leg_p_jetConst_1->AddEntry(h_p_jet_const_1_Nom, "Nominal", "l"); leg_p_jetConst_1->AddEntry(h_p_jet_const_1_CR, "noCR", "l"); leg_p_jetConst_1->Draw(); @@ -258,7 +379,7 @@ void plot() { h_p_jet_const_2_Nom->Draw("HIST"); h_p_jet_const_2_CR->Draw("HIST SAME"); - auto leg_p_jetConst_2 = new TLegend(0.75, 0.75, 0.95, 0.88); + auto leg_p_jetConst_2 = new TLegend(0.725, 0.75, 0.88, 0.88); leg_p_jetConst_2->AddEntry(h_p_jet_const_2_Nom, "Nominal", "l"); leg_p_jetConst_2->AddEntry(h_p_jet_const_2_CR, "noCR", "l"); leg_p_jetConst_2->Draw(); @@ -317,7 +438,7 @@ void plot() { h_theta_Nom->Draw("HIST"); h_theta_CR->Draw("HIST SAME"); - auto leg_theta = new TLegend(0.15, 0.3, 0.35, 0.45); + auto leg_theta = new TLegend(0.15, 0.3, 0.25, 0.4); leg_theta->AddEntry(h_theta_Nom, "Nominal", "l"); leg_theta->AddEntry(h_theta_CR, "noCR", "l"); leg_theta->Draw(); @@ -376,7 +497,7 @@ void plot() { h_phi_Nom->Draw("HIST"); h_phi_CR->Draw("HIST SAME"); - auto leg_phi = new TLegend(0.15, 0.75, 0.45, 0.88); + auto leg_phi = new TLegend(0.15, 0.75, 0.25, 0.88); leg_phi->AddEntry(h_phi_Nom, "Nominal", "l"); leg_phi->AddEntry(h_phi_CR, "noCR", "l"); leg_phi->Draw(); @@ -436,7 +557,7 @@ void plot() { h_chi_Nom->Draw("HIST"); h_chi_CR->Draw("HIST SAME"); - auto leg_chi = new TLegend(0.15, 0.75, 0.45, 0.88); + auto leg_chi = new TLegend(0.15, 0.75, 0.25, 0.88); leg_chi->AddEntry(h_chi_Nom, "Nominal", "l"); leg_chi->AddEntry(h_chi_CR, "noCR", "l"); leg_chi->Draw(); @@ -462,11 +583,614 @@ void plot() { r_chi_CR->GetYaxis()->SetTitleOffset(0.55); - c_p_jet_const_1->SaveAs("b_p_jet_const_comparison_full_all.png"); - c_p_jet_const_2->SaveAs("b_p_jet2_const_comparison_full_all.png"); - c_theta->SaveAs("b_theta_corr_comparison_full_all.png"); - c_phi->SaveAs("b_phi_corr_comparison_full_all.png"); - c_chi->SaveAs("b_chi_corr_comparison_full_all.png"); + TCanvas *c_delR = new TCanvas("c_delR", "comparison", 1000, 800); + c_delR->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_delR = new TPad("topPad_delR", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_delR->SetBottomMargin(0.025); + topPad_delR->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_delR = new TPad("bottomPad_delR", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_delR->SetTopMargin(0.025); // Small top margin + bottomPad_delR->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_delR->Draw(); + + // Upper plot + topPad_delR->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_delR_Nom->SetTitle("b_delR_corr"); + h_delR_Nom->GetXaxis()->SetLabelSize(0); + h_delR_Nom->GetYaxis()->SetTitle("normalized events"); + h_delR_Nom->GetYaxis()->CenterTitle(true); + h_delR_Nom->GetXaxis()->SetTitleSize(0.08); + h_delR_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_delR_Nom->SetLineColor(kBlack); h_delR_Nom->SetLineWidth(3); + h_delR_CR->SetLineColor(kRed); h_delR_CR->SetLineWidth(3); + + h_delR_Nom->Draw("HIST"); + h_delR_CR->Draw("HIST SAME"); + + auto leg_delR = new TLegend(0.15, 0.75, 0.25, 0.88); + leg_delR->AddEntry(h_delR_Nom, "#deltaR- Nom", "l"); + leg_delR->AddEntry(h_delR_CR, "#deltaR- no CR", "l"); + leg_delR->Draw(); + + // Ratio plot + bottomPad_delR->cd(); + gPad->SetLogx(); + + r_delR_CR->SetMinimum(0.85); r_delR_CR->SetMaximum(1.1); + r_delR_CR->SetLineColor(kRed); + r_delR_CR->Draw("HIST"); + r_delR_CR->SetLineWidth(3); + + r_delR_CR->GetXaxis()->SetTitle("#deltaR (radians)"); // Axis titles + r_delR_CR->GetYaxis()->SetTitle("ratio"); + r_delR_CR->GetXaxis()->CenterTitle(true); // Center them + r_delR_CR->GetYaxis()->CenterTitle(true); + r_delR_CR->GetXaxis()->SetTitleSize(0.07); // Set the title size + r_delR_CR->GetYaxis()->SetTitleSize(0.055); + r_delR_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_delR_CR->GetYaxis()->SetLabelSize(0.05); + r_delR_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_delR_CR->GetYaxis()->SetTitleOffset(0.55); + + // **************************************** Reconstructed W Boson Plots **************************************** + TCanvas *c_mass_W = new TCanvas("c_mass_W", "comparison", 1000, 800); + c_mass_W->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_mass_W = new TPad("topPad_mass_W", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_mass_W->SetBottomMargin(0.025); + topPad_mass_W->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_mass_W = new TPad("bottomPad_mass_W", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_mass_W->SetTopMargin(0.025); // Small top margin + bottomPad_mass_W->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_mass_W->Draw(); + + // Upper plot + topPad_mass_W->cd(); + // gPad->SetLogx(); + // gPad->SetLogy(); + + h_mass_W1_Nom->SetTitle("Mass- W Bosons"); + h_mass_W1_Nom->GetXaxis()->SetLabelSize(0); + h_mass_W1_Nom->GetYaxis()->SetTitle("normalized events"); + h_mass_W1_Nom->GetYaxis()->CenterTitle(true); + h_mass_W1_Nom->GetXaxis()->SetTitleSize(0.08); + h_mass_W1_Nom->GetXaxis()->SetLabelSize(0); + h_mass_W1_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_mass_W1_Nom->SetLineColor(kBlack); h_mass_W1_Nom->SetLineWidth(3); + h_mass_W1_CR->SetLineColor(kRed); h_mass_W1_CR->SetLineWidth(3); + h_mass_W2_Nom->SetLineColor(kBlue); h_mass_W2_Nom->SetLineWidth(3); + h_mass_W2_CR->SetLineColor(kGreen); h_mass_W2_CR->SetLineWidth(3); + + h_mass_W1_Nom->Draw("HIST"); + h_mass_W1_CR->Draw("HIST SAME"); + h_mass_W2_Nom->Draw("HIST SAME"); + h_mass_W2_CR->Draw("HIST SAME"); + + auto leg_W_mass = new TLegend(0.7, 0.75, 0.88, 0.88); + leg_W_mass->AddEntry(h_mass_W1_Nom, "W1 Mass- Nom", "l"); + leg_W_mass->AddEntry(h_mass_W1_CR, "W1 Mass- No CR", "l"); + leg_W_mass->AddEntry(h_mass_W2_Nom, "W2 Mass- Nom", "l"); + leg_W_mass->AddEntry(h_mass_W2_CR, "W2 Mass- No CR", "l"); + leg_W_mass->Draw(); + + // Ratio plot + bottomPad_mass_W->cd(); + // gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_mass_W1_CR->SetLineColor(kRed); + r_mass_W1_CR->Draw("HIST"); + r_mass_W1_CR->SetLineWidth(3); + r_mass_W2_CR->SetLineColor(kBlue); + r_mass_W2_CR->Draw("HIST SAME"); + r_mass_W2_CR->SetLineWidth(3); + + r_mass_W1_CR->GetXaxis()->SetTitle("Momentum (GeV/c)"); // Axis titles + r_mass_W1_CR->GetYaxis()->SetTitle("ratio"); + r_mass_W1_CR->SetTitle(""); + r_mass_W1_CR->GetXaxis()->CenterTitle(true); // Center them + r_mass_W1_CR->GetYaxis()->CenterTitle(true); + r_mass_W1_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_mass_W1_CR->GetYaxis()->SetTitleSize(0.055); + r_mass_W1_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_mass_W1_CR->GetYaxis()->SetLabelSize(0.05); + r_mass_W1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_mass_W1_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_W_mass = new TLegend(0.15, 0.75, 0.35, 0.9); + leg_ratio_W_mass->AddEntry(r_mass_W1_CR, "W1 Mass Nominal", "l"); + leg_ratio_W_mass->AddEntry(r_mass_W2_CR, "W2 Mass noCR", "l"); + leg_ratio_W_mass->Draw(); + + + TCanvas *c_p_W = new TCanvas("c_p_W", "comparison", 1000, 800); + c_p_W->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_p_W1 = new TPad("topPad_p_W1", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_p_W1->SetBottomMargin(0.025); + topPad_p_W1->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_p_W1 = new TPad("bottomPad_p_W1", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_p_W1->SetTopMargin(0.025); // Small top margin + bottomPad_p_W1->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_p_W1->Draw(); + + // Upper plot + topPad_p_W1->cd(); + // gPad->SetLogx(); + // gPad->SetLogy(); + + h_p_W1_Nom->SetTitle("Momenta- W Bosons"); + h_p_W1_Nom->GetXaxis()->SetLabelSize(0); + h_p_W1_Nom->GetYaxis()->SetTitle("normalized events"); + h_p_W1_Nom->GetYaxis()->CenterTitle(true); + h_p_W1_Nom->GetXaxis()->SetTitleSize(0.08); + h_p_W1_Nom->GetXaxis()->SetLabelSize(0); + h_p_W1_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_p_W1_Nom->SetLineColor(kBlack); h_p_W1_Nom->SetLineWidth(3); + h_p_W1_CR->SetLineColor(kRed); h_p_W1_CR->SetLineWidth(3); + h_p_W2_Nom->SetLineColor(kBlue); h_p_W2_Nom->SetLineWidth(3); + h_p_W2_CR->SetLineColor(kGreen); h_p_W2_CR->SetLineWidth(3); + + h_p_W1_Nom->Draw("HIST"); + h_p_W1_CR->Draw("HIST SAME"); + h_p_W2_Nom->Draw("HIST SAME"); + h_p_W2_CR->Draw("HIST SAME"); + + auto leg_p_W = new TLegend(0.7, 0.75, 0.88, 0.88); + leg_p_W->AddEntry(h_p_W1_Nom, "W1 Nom", "l"); + leg_p_W->AddEntry(h_p_W1_CR, "W1 No CR", "l"); + leg_p_W->AddEntry(h_p_W2_Nom, "W2 Nom", "l"); + leg_p_W->AddEntry(h_p_W2_CR, "W2 No CR", "l"); + leg_p_W->Draw(); + + // Ratio plot + bottomPad_p_W1->cd(); + // gPad->SetLogx(); + r_p_W1_CR->SetMinimum(-0.01); r_p_W1_CR->SetMaximum(3.5); + r_p_W1_CR->SetLineColor(kRed); + r_p_W1_CR->Draw("HIST"); + r_p_W1_CR->SetLineWidth(3); + r_p_W2_CR->SetLineColor(kBlue); + r_p_W2_CR->Draw("HIST SAME"); + r_p_W2_CR->SetLineWidth(3); + + r_p_W1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles + r_p_W1_CR->GetYaxis()->SetTitle("ratio"); + r_p_W1_CR->SetTitle(""); + r_p_W1_CR->GetXaxis()->CenterTitle(true); // Center them + r_p_W1_CR->GetYaxis()->CenterTitle(true); + r_p_W1_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_p_W1_CR->GetYaxis()->SetTitleSize(0.055); + r_p_W1_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_p_W1_CR->GetYaxis()->SetLabelSize(0.05); + r_p_W1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_p_W1_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_p_mass = new TLegend(0.75, 0.75, 0.88, 0.9); + leg_ratio_p_mass->AddEntry(r_p_W1_CR, "W1 Momenta", "l"); + leg_ratio_p_mass->AddEntry(r_p_W2_CR, "W2 Momenta", "l"); + leg_ratio_p_mass->Draw(); + + + TCanvas *c_e_W = new TCanvas("c_e_W", "comparison", 1000, 800); + c_e_W->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_e_W1 = new TPad("topPad_e_W1", "Top Pad", 0.0, 0.4, 1.0, 1.0); + // topPad->SetTopMargin(0.1); // Optional + topPad_e_W1->SetBottomMargin(0.025); + topPad_e_W1->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_e_W1 = new TPad("bottomPad_e_W1", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_e_W1->SetTopMargin(0.025); // Small top margin + bottomPad_e_W1->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_e_W1->Draw(); + + // Upper plot + topPad_e_W1->cd(); + // gPad->SetLogx(); + // gPad->SetLogy(); + + h_e_W1_Nom->SetTitle("Momenta- W Bosons"); + h_e_W1_Nom->GetXaxis()->SetLabelSize(0); + h_e_W1_Nom->GetYaxis()->SetTitle("normalized events"); + h_e_W1_Nom->GetYaxis()->CenterTitle(true); + h_e_W1_Nom->GetXaxis()->SetTitleSize(0.08); + h_e_W1_Nom->GetXaxis()->SetLabelSize(0); + h_e_W1_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_e_W1_Nom->SetLineColor(kBlack); h_e_W1_Nom->SetLineWidth(3); + h_e_W1_CR->SetLineColor(kRed); h_e_W1_CR->SetLineWidth(3); + h_e_W2_Nom->SetLineColor(kBlue); h_e_W2_Nom->SetLineWidth(3); + h_e_W2_CR->SetLineColor(kGreen); h_e_W2_CR->SetLineWidth(3); + + h_e_W1_Nom->Draw("HIST"); + h_e_W1_CR->Draw("HIST SAME"); + h_e_W2_Nom->Draw("HIST SAME"); + h_e_W2_CR->Draw("HIST SAME"); + + auto leg_e_W = new TLegend(0.15, 0.7, 0.35, 0.88); + leg_e_W->AddEntry(h_e_W1_Nom, "W1- Nom", "l"); + leg_e_W->AddEntry(h_e_W1_CR, "W1- CR", "l"); + leg_e_W->AddEntry(h_e_W2_Nom, "W2- Nom", "l"); + leg_e_W->AddEntry(h_e_W2_CR, "W2- CR", "l"); + leg_e_W->Draw(); + + // Ratio plot + bottomPad_e_W1->cd(); + // gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_e_W1_CR->SetLineColor(kRed); + r_e_W1_CR->Draw("HIST"); + r_e_W1_CR->SetLineWidth(3); + r_e_W2_CR->SetLineColor(kBlue); + r_e_W2_CR->Draw("HIST SAME"); + r_e_W2_CR->SetLineWidth(3); + + r_e_W1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles + r_e_W1_CR->GetYaxis()->SetTitle("ratio"); + r_e_W1_CR->SetTitle(""); + r_e_W1_CR->GetXaxis()->CenterTitle(true); // Center them + r_e_W1_CR->GetYaxis()->CenterTitle(true); + r_e_W1_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_e_W1_CR->GetYaxis()->SetTitleSize(0.055); + r_e_W1_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_e_W1_CR->GetYaxis()->SetLabelSize(0.05); + r_e_W1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_e_W1_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_e_W = new TLegend(0.725, 0.75, 0.88, 0.9); + leg_ratio_e_W->AddEntry(r_e_W1_CR, "W1 p Ratio", "l"); + leg_ratio_e_W->AddEntry(r_e_W2_CR, "W2 p Ratio", "l"); + leg_ratio_e_W->Draw(); + + + // **************************************** Reconstructed Jet Plots **************************************** + TCanvas *c_jet_momentum = new TCanvas("c_jet_momentum", "comparison", 1000, 800); + c_jet_momentum->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_jet_momentum = new TPad("topPad_jet_momentum", "Top Pad", 0.0, 0.4, 1.0, 1.0); + topPad_jet_momentum->SetBottomMargin(0.025); + topPad_jet_momentum->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_jet_momentum = new TPad("bottomPad_jet_momentum", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_jet_momentum->SetTopMargin(0.025); // Small top margin + bottomPad_jet_momentum->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_jet_momentum->Draw(); + + // Upper plot + topPad_jet_momentum->cd(); + // gPad->SetLogx(); + // gPad->SetLogy(); + + h_p_reco_Jet1_Nom->SetTitle("Momenta- Jets"); + h_p_reco_Jet1_Nom->GetXaxis()->SetLabelSize(0); + h_p_reco_Jet1_Nom->GetYaxis()->SetTitle("normalized events"); + h_p_reco_Jet1_Nom->GetYaxis()->CenterTitle(true); + h_p_reco_Jet1_Nom->GetXaxis()->SetTitleSize(0.08); + h_p_reco_Jet1_Nom->GetXaxis()->SetLabelSize(0); + h_p_reco_Jet1_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_p_reco_Jet1_Nom->SetLineColor(kBlack); h_p_reco_Jet1_Nom->SetLineWidth(3); + h_p_reco_Jet1_CR->SetLineColor(kRed); h_p_reco_Jet1_CR->SetLineWidth(3); + h_p_reco_Jet2_Nom->SetLineColor(kBlue); h_p_reco_Jet2_Nom->SetLineWidth(3); + h_p_reco_Jet2_CR->SetLineColor(kGreen); h_p_reco_Jet2_CR->SetLineWidth(3); + + h_p_reco_Jet3_Nom->SetLineColor(kOrange+7); h_p_reco_Jet3_Nom->SetLineWidth(3); + h_p_reco_Jet3_CR->SetLineColor(kPink+7); h_p_reco_Jet3_CR->SetLineWidth(3); + h_p_reco_Jet4_Nom->SetLineColor(kAzure+7); h_p_reco_Jet4_Nom->SetLineWidth(3); + h_p_reco_Jet4_CR->SetLineColor(kGreen+3); h_p_reco_Jet4_CR->SetLineWidth(3); + + h_p_reco_Jet1_Nom->Draw("HIST"); + h_p_reco_Jet1_CR->Draw("HIST SAME"); + h_p_reco_Jet2_Nom->Draw("HIST SAME"); + h_p_reco_Jet2_CR->Draw("HIST SAME"); + h_p_reco_Jet3_Nom->Draw("HIST SAME"); + h_p_reco_Jet3_CR->Draw("HIST SAME"); + h_p_reco_Jet4_Nom->Draw("HIST SAME"); + h_p_reco_Jet4_CR->Draw("HIST SAME"); + + auto leg_reco_jets = new TLegend(0.725, 0.48, 0.88, 0.88); + leg_reco_jets->AddEntry(h_p_reco_Jet1_Nom, "Jet1- Nom", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet1_CR, "Jet1- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet2_Nom, "Jet2- Nom", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet2_CR, "Jet2- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet3_Nom, "Jet3- Nom", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet3_CR, "Jet3- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet4_Nom, "Jet4- Nom", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet4_CR, "Jet4- CR", "l"); + leg_reco_jets->Draw(); + + // Ratio plot + bottomPad_jet_momentum->cd(); + // gPad->SetLogx(); + r_p_reco_Jet1_CR->SetMinimum(0.0); r_p_jet_const_1_CR->SetMaximum(3.5); + r_p_reco_Jet1_CR->SetLineColor(kBlack); + r_p_reco_Jet1_CR->Draw("HIST"); + r_p_reco_Jet1_CR->SetLineWidth(3); + r_p_reco_Jet2_CR->SetLineColor(kRed); + r_p_reco_Jet2_CR->Draw("HIST SAME"); + r_p_reco_Jet2_CR->SetLineWidth(3); + r_p_reco_Jet3_CR->SetLineColor(kBlue); + r_p_reco_Jet3_CR->Draw("HIST SAME"); + r_p_reco_Jet3_CR->SetLineWidth(3); + r_p_reco_Jet4_CR->SetLineColor(kGreen); + r_p_reco_Jet4_CR->Draw("HIST SAME"); + r_p_reco_Jet4_CR->SetLineWidth(3); + + r_p_reco_Jet1_CR->GetXaxis()->SetTitle("Momenta (GeV/c)"); // Axis titles + r_p_reco_Jet1_CR->GetYaxis()->SetTitle("ratio"); + r_p_reco_Jet1_CR->SetTitle(""); + r_p_reco_Jet1_CR->GetXaxis()->CenterTitle(true); // Center them + r_p_reco_Jet1_CR->GetYaxis()->CenterTitle(true); + r_p_reco_Jet1_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_p_reco_Jet1_CR->GetYaxis()->SetTitleSize(0.055); + r_p_reco_Jet1_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_p_reco_Jet1_CR->GetYaxis()->SetLabelSize(0.05); + r_p_reco_Jet1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_p_reco_Jet1_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_reco_jets = new TLegend(0.68, 0.68, 0.88, 0.88); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet1_CR, "Jet1- Momenta Ratio", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet2_CR, "Jet2- Momenta Ratio", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet3_CR, "Jet3- Momenta Ratio", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet4_CR, "Jet4- Momenta Ratio", "l"); + leg_ratio_reco_jets->Draw(); + + + TCanvas *c_theta_reco_jet = new TCanvas("c_theta_reco_jet", "comparison", 1000, 800); + c_theta_reco_jet->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_theta_reco_jet = new TPad("topPad_theta_reco_jet", "Top Pad", 0.0, 0.4, 1.0, 1.0); + topPad_theta_reco_jet->SetBottomMargin(0.025); + topPad_theta_reco_jet->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_theta_reco_jet = new TPad("bottomPad_theta_reco_jet", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_theta_reco_jet->SetTopMargin(0.025); // Small top margin + bottomPad_theta_reco_jet->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_theta_reco_jet->Draw(); + + // Upper plot + topPad_theta_reco_jet->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_theta_Jet1_Jet2_Nom->SetTitle("#theta- Reconstructed Jets"); + h_theta_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_theta_Jet1_Jet2_Nom->GetYaxis()->SetTitle("normalized events"); + h_theta_Jet1_Jet2_Nom->GetYaxis()->CenterTitle(true); + h_theta_Jet1_Jet2_Nom->GetXaxis()->SetTitleSize(0.08); + h_theta_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_theta_Jet1_Jet2_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_theta_Jet1_Jet2_Nom->SetLineColor(kBlack); h_theta_Jet1_Jet2_Nom->SetLineWidth(3); + h_theta_Jet1_Jet2_CR->SetLineColor(kRed); h_theta_Jet1_Jet2_CR->SetLineWidth(3); + h_theta_Jet3_Jet4_Nom->SetLineColor(kBlue); h_theta_Jet3_Jet4_Nom->SetLineWidth(3); + h_theta_Jet3_Jet4_CR->SetLineColor(kGreen); h_theta_Jet3_Jet4_CR->SetLineWidth(3); + + h_theta_Jet1_Jet2_Nom->Draw("HIST"); + h_theta_Jet1_Jet2_CR->Draw("HIST SAME"); + h_theta_Jet3_Jet4_Nom->Draw("HIST SAME"); + h_theta_Jet3_Jet4_CR->Draw("HIST SAME"); + + auto leg_theta_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); + leg_theta_reco_jets->AddEntry(h_theta_Jet1_Jet2_Nom, "W1 Jets- Nom", "l"); + leg_theta_reco_jets->AddEntry(h_theta_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_theta_reco_jets->AddEntry(h_theta_Jet3_Jet4_Nom, "W2 Jets- Nom", "l"); + leg_theta_reco_jets->AddEntry(h_theta_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_theta_reco_jets->Draw(); + + // Ratio plot + bottomPad_theta_reco_jet->cd(); + gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_theta_Jet1_Jet2_CR->SetLineColor(kBlack); + r_theta_Jet1_Jet2_CR->Draw("HIST"); + r_theta_Jet1_Jet2_CR->SetLineWidth(3); + r_theta_Jet3_Jet4_CR->SetLineColor(kRed); + r_theta_Jet3_Jet4_CR->Draw("HIST SAME"); + r_theta_Jet3_Jet4_CR->SetLineWidth(3); + + r_theta_Jet1_Jet2_CR->GetXaxis()->SetTitle("#theta (radians)"); // Axis titles + r_theta_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); + r_theta_Jet1_Jet2_CR->SetTitle(""); + r_theta_Jet1_Jet2_CR->GetXaxis()->CenterTitle(true); // Center them + r_theta_Jet1_Jet2_CR->GetYaxis()->CenterTitle(true); + r_theta_Jet1_Jet2_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_theta_Jet1_Jet2_CR->GetYaxis()->SetTitleSize(0.055); + r_theta_Jet1_Jet2_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_theta_Jet1_Jet2_CR->GetYaxis()->SetLabelSize(0.05); + r_theta_Jet1_Jet2_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_theta_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_theta_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet1_Jet2_CR, "#theta W1 Jets", "l"); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet3_Jet4_CR, "#theta W2 Jets", "l"); + leg_ratio_theta_reco_jets->Draw(); + + + TCanvas *c_phi_reco_jet = new TCanvas("c_phi_reco_jet", "comparison", 1000, 800); + c_phi_reco_jet->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_phi_reco_jet = new TPad("topPad_phi_reco_jet", "Top Pad", 0.0, 0.4, 1.0, 1.0); + topPad_phi_reco_jet->SetBottomMargin(0.025); + topPad_phi_reco_jet->Draw(); -} + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_phi_reco_jet = new TPad("bottomPad_phi_reco_jet", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_phi_reco_jet->SetTopMargin(0.025); // Small top margin + bottomPad_phi_reco_jet->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_phi_reco_jet->Draw(); + // Upper plot + topPad_phi_reco_jet->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_phi_Jet1_Jet2_Nom->SetTitle("#phi- Reconstructed Jets"); + h_phi_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_phi_Jet1_Jet2_Nom->GetYaxis()->SetTitle("normalized events"); + h_phi_Jet1_Jet2_Nom->GetYaxis()->CenterTitle(true); + h_phi_Jet1_Jet2_Nom->GetXaxis()->SetTitleSize(0.08); + h_phi_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_phi_Jet1_Jet2_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_phi_Jet1_Jet2_Nom->SetLineColor(kBlack); h_phi_Jet1_Jet2_Nom->SetLineWidth(3); + h_phi_Jet1_Jet2_CR->SetLineColor(kRed); h_phi_Jet1_Jet2_CR->SetLineWidth(3); + h_phi_Jet3_Jet4_Nom->SetLineColor(kBlue); h_phi_Jet3_Jet4_Nom->SetLineWidth(3); + h_phi_Jet3_Jet4_CR->SetLineColor(kGreen); h_phi_Jet3_Jet4_CR->SetLineWidth(3); + + h_phi_Jet1_Jet2_Nom->Draw("HIST"); + h_phi_Jet1_Jet2_CR->Draw("HIST SAME"); + h_phi_Jet3_Jet4_Nom->Draw("HIST SAME"); + h_phi_Jet3_Jet4_CR->Draw("HIST SAME"); + + auto leg_phi_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); + leg_phi_reco_jets->AddEntry(h_phi_Jet1_Jet2_Nom, "W1 Jets- Nom", "l"); + leg_phi_reco_jets->AddEntry(h_phi_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_phi_reco_jets->AddEntry(h_phi_Jet3_Jet4_Nom, "W2 Jets- Nom", "l"); + leg_phi_reco_jets->AddEntry(h_phi_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_phi_reco_jets->Draw(); + + // Ratio plot + bottomPad_phi_reco_jet->cd(); + gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_phi_Jet1_Jet2_CR->SetLineColor(kBlack); + r_phi_Jet1_Jet2_CR->Draw("HIST"); + r_phi_Jet1_Jet2_CR->SetLineWidth(3); + r_phi_Jet3_Jet4_CR->SetLineColor(kRed); + r_phi_Jet3_Jet4_CR->Draw("HIST SAME"); + r_phi_Jet3_Jet4_CR->SetLineWidth(3); + + r_phi_Jet1_Jet2_CR->GetXaxis()->SetTitle("#phi (radians)"); // Axis titles + r_phi_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); + r_phi_Jet1_Jet2_CR->SetTitle(""); + r_phi_Jet1_Jet2_CR->GetXaxis()->CenterTitle(true); // Center them + r_phi_Jet1_Jet2_CR->GetYaxis()->CenterTitle(true); + r_phi_Jet1_Jet2_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_phi_Jet1_Jet2_CR->GetYaxis()->SetTitleSize(0.055); + r_phi_Jet1_Jet2_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_phi_Jet1_Jet2_CR->GetYaxis()->SetLabelSize(0.05); + r_phi_Jet1_Jet2_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_phi_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_phi_reco_jets = new TLegend(0.725, 0.73, 0.88, 0.88); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet1_Jet2_CR, "#phi W1 Jets", "l"); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet3_Jet4_CR, "#phi W2 Jets", "l"); + leg_ratio_phi_reco_jets->Draw(); + + + TCanvas *c_chi_reco_jet = new TCanvas("c_chi_reco_jet", "comparison", 1000, 800); + c_chi_reco_jet->Divide(1, 2); + + // Top pad (60% height): from y = 0.4 to y = 1.0 + TPad *topPad_chi_reco_jet = new TPad("topPad_chi_reco_jet", "Top Pad", 0.0, 0.4, 1.0, 1.0); + topPad_chi_reco_jet->SetBottomMargin(0.025); + topPad_chi_reco_jet->Draw(); + + // Bottom pad (40% height): from y = 0.0 to y = 0.4 + TPad *bottomPad_chi_reco_jet = new TPad("bottomPad_chi_reco_jet", "Bottom Pad", 0.0, 0.0, 1.0, 0.4); + bottomPad_chi_reco_jet->SetTopMargin(0.025); // Small top margin + bottomPad_chi_reco_jet->SetBottomMargin(0.2); // More space for x-axis label + bottomPad_chi_reco_jet->Draw(); + + // Upper plot + topPad_chi_reco_jet->cd(); + gPad->SetLogx(); + gPad->SetLogy(); + + h_chi_Jet1_Jet2_Nom->SetTitle("#chi- Reconstructed Jets"); + h_chi_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_chi_Jet1_Jet2_Nom->GetYaxis()->SetTitle("normalized events"); + h_chi_Jet1_Jet2_Nom->GetYaxis()->CenterTitle(true); + h_chi_Jet1_Jet2_Nom->GetXaxis()->SetTitleSize(0.08); + h_chi_Jet1_Jet2_Nom->GetXaxis()->SetLabelSize(0); + h_chi_Jet1_Jet2_Nom->GetYaxis()->SetTitleOffset(1.0); + + h_chi_Jet1_Jet2_Nom->SetLineColor(kBlack); h_chi_Jet1_Jet2_Nom->SetLineWidth(3); + h_chi_Jet1_Jet2_CR->SetLineColor(kRed); h_chi_Jet1_Jet2_CR->SetLineWidth(3); + h_chi_Jet3_Jet4_Nom->SetLineColor(kBlue); h_chi_Jet3_Jet4_Nom->SetLineWidth(3); + h_chi_Jet3_Jet4_CR->SetLineColor(kGreen); h_chi_Jet3_Jet4_CR->SetLineWidth(3); + + h_chi_Jet1_Jet2_Nom->Draw("HIST"); + h_chi_Jet1_Jet2_CR->Draw("HIST SAME"); + h_chi_Jet3_Jet4_Nom->Draw("HIST SAME"); + h_chi_Jet3_Jet4_CR->Draw("HIST SAME"); + + auto leg_chi_reco_jets = new TLegend(0.15, 0.7, 0.35, 0.88); + leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_Nom, "#chi W1 Jets- Nom", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_CR, "#chi W1 Jets- no CR", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_Nom, "#chi W2 Jets- Nom", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_CR, "#chi W1 Jets- no CR", "l"); + leg_chi_reco_jets->Draw(); + + // Ratio plot + bottomPad_chi_reco_jet->cd(); + gPad->SetLogx(); + // r_p_jet_const_1_CR->SetMinimum(0.85); r_p_jet_const_1_CR->SetMaximum(1.1); + r_chi_Jet1_Jet2_CR->SetLineColor(kBlack); + r_chi_Jet1_Jet2_CR->Draw("HIST"); + r_chi_Jet1_Jet2_CR->SetLineWidth(3); + r_chi_Jet3_Jet4_CR->SetLineColor(kRed); + r_chi_Jet3_Jet4_CR->Draw("HIST SAME"); + r_chi_Jet3_Jet4_CR->SetLineWidth(3); + + r_chi_Jet1_Jet2_CR->GetXaxis()->SetTitle("#chi (radians)"); // Axis titles + r_chi_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); + r_chi_Jet1_Jet2_CR->SetTitle(""); + r_chi_Jet1_Jet2_CR->GetXaxis()->CenterTitle(true); // Center them + r_chi_Jet1_Jet2_CR->GetYaxis()->CenterTitle(true); + r_chi_Jet1_Jet2_CR->GetXaxis()->SetTitleSize(0.055); // Set the title size + r_chi_Jet1_Jet2_CR->GetYaxis()->SetTitleSize(0.055); + r_chi_Jet1_Jet2_CR->GetXaxis()->SetLabelSize(0.05); // Set the label size + r_chi_Jet1_Jet2_CR->GetYaxis()->SetLabelSize(0.05); + r_chi_Jet1_Jet2_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis + r_chi_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); + + auto leg_ratio_chi_reco_jets = new TLegend(0.15, 0.75, 0.3, 0.9); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet1_Jet2_CR, "ratio- #chi W1 Jets", "l"); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet3_Jet4_CR, "ratio- #chi W2 Jets", "l"); + leg_ratio_chi_reco_jets->Draw(); + + + c_p_jet_const_1->SaveAs("Jet_const_Momenta_1.png"); + c_p_jet_const_2->SaveAs("Jet_const_Momenta_2.png"); + c_theta->SaveAs("Jet_const_theta.png"); + c_phi->SaveAs("Jet_const_phi.png"); + c_chi->SaveAs("Jet_const_chi.png"); + c_delR->SaveAs("Jet_const_delR.png"); + + c_mass_W->SaveAs("W_boson_Mass.png"); + c_p_W->SaveAs("W_boson_Momenta.png"); + c_e_W->SaveAs("W_boson_Energy.png"); + + c_jet_momentum->SaveAs("Reco_Jet_Momenta.png"); + c_theta_reco_jet->SaveAs("Reco_Jet_theta.png"); + c_phi_reco_jet->SaveAs("Reco_Jet_phi.png"); + c_chi_reco_jet->SaveAs("Reco_Jet_chi.png"); +} \ No newline at end of file From 5f03cf62cceea39f5368e86e3cb29ea0a1b5ed8e Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Tue, 5 Aug 2025 23:40:03 -0400 Subject: [PATCH 36/40] SKI_100 variables setup with all plots --- scripts/plot.C | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/scripts/plot.C b/scripts/plot.C index 59313d1..42df7c6 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -32,7 +32,6 @@ void plot() { for (int i = 0; i <= nBins; ++i) linearBins_2[i] = xMin_lin_2 + i * linearBinWidth_2; - // Logarithmic Bins double logMin = std::log10(xMin); double logMax = std::log10(xMax); @@ -69,30 +68,45 @@ void plot() { // Histograms TH1F *h_p_jet_const_1_Nom = new TH1F("h_p_jet_const_1_Nom", "Jet constituent momentum", totalBins, binsArray); TH1F *h_p_jet_const_1_CR = new TH1F("h_p_jet_const_1_CR", "", totalBins, binsArray); + TH1F *h_p_jet_const_1_SKI_kl5 = new TH1F("h_p_jet_const_1_SKI_kl5", "", totalBins, binsArray); + TH1F *h_p_jet_const_1_SKI_kl50 = new TH1F("h_p_jet_const_1_SKI_kl50", "", totalBins, binsArray); + TH1F *h_p_jet_const_1_SKI_kl100 = new TH1F("h_p_jet_const_1_SKI_kl100", "", totalBins, binsArray); TH1F *h_p_jet_const_2_Nom = new TH1F("h_p_jet_const_2_Nom", "Jet constituent momentum", totalBins, binsArray); TH1F *h_p_jet_const_2_CR = new TH1F("h_p_jet_const_2_CR", "", totalBins, binsArray); + TH1F *h_p_jet_const_2_SKI_kl5 = new TH1F("h_p_jet_const_2_SKI_kl5", "", totalBins, binsArray); + TH1F *h_p_jet_const_2_SKI_kl50 = new TH1F("h_p_jet_const_2_SKI_kl50", "", totalBins, binsArray); + TH1F *h_p_jet_const_2_SKI_kl100 = new TH1F("h_p_jet_const_2_SKI_kl100", "", totalBins, binsArray); TH1F *h_theta_Nom = new TH1F("h_theta_Nom", "#Delta#theta;#theta;Normalized Events", nBins, logBins); TH1F *h_theta_CR = new TH1F("h_theta_CR", "", nBins, logBins); + TH1F *h_theta_SKI_kl5 = new TH1F("h_theta_SKI_kl5", "", nBins, logBins); + TH1F *h_theta_SKI_kl50 = new TH1F("h_theta_SKI_kl50", "", nBins, logBins); + TH1F *h_theta_SKI_kl100 = new TH1F("h_theta_SKI_kl100", "", nBins, logBins); TH1F *h_phi_Nom = new TH1F("h_phi_Nom", "#Delta#phi;Normalized Events", nBins, logBins); TH1F *h_phi_CR = new TH1F("h_phi_CR", "", nBins, logBins); + TH1F *h_phi_SKI_kl5 = new TH1F("h_phi_SKI_kl5", "", nBins, logBins); + TH1F *h_phi_SKI_kl50 = new TH1F("h_phi_SKI_kl50", "", nBins, logBins); + TH1F *h_phi_SKI_kl100 = new TH1F("h_phi_SKI_kl100", "", nBins, logBins); TH1F *h_chi_Nom = new TH1F("h_chi_Nom", "#Delta#chi;Normalized Events", nBins, logBins); TH1F *h_chi_CR = new TH1F("h_chi_CR", "", nBins, logBins); + TH1F *h_chi_SKI_kl5 = new TH1F("h_chi_SKI_kl5", "", nBins, logBins); + TH1F *h_chi_SKI_kl50 = new TH1F("h_chi_SKI_kl50", "", nBins, logBins); + TH1F *h_chi_SKI_kl100 = new TH1F("h_chi_SKI_kl100", "", nBins, logBins); - TH1F *h_delR_Nom = new TH1F("h_delR_Nom", "#deltaR- Nominal", nBins, linearBins); - TH1F *h_delR_CR = new TH1F("h_delR_CR", "", nBins, linearBins); + // TH1F *h_delR_Nom = new TH1F("h_delR_Nom", "#deltaR- Nominal", nBins, linearBins); + // TH1F *h_delR_CR = new TH1F("h_delR_CR", "", nBins, linearBins); - TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); - TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); + // TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); + // TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); - TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); - TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", nBins, linearBins_2); + // TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + // TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", nBins, linearBins_2); - TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); - TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); + // TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + // TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); // ************************ Reconstructed W Bosons ************************ TH1F* h_mass_W1_Nom = new TH1F("h_mass_W1_Nom", "Mass", nBins, linearBins); From 6974686cb7dd414f5598de176035dfc7803d5e1c Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 6 Aug 2025 08:29:39 -0400 Subject: [PATCH 37/40] added SKI w/ kl = 100 --- scripts/plot.C | 159 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 136 insertions(+), 23 deletions(-) diff --git a/scripts/plot.C b/scripts/plot.C index 42df7c6..7d81c57 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -68,165 +68,213 @@ void plot() { // Histograms TH1F *h_p_jet_const_1_Nom = new TH1F("h_p_jet_const_1_Nom", "Jet constituent momentum", totalBins, binsArray); TH1F *h_p_jet_const_1_CR = new TH1F("h_p_jet_const_1_CR", "", totalBins, binsArray); - TH1F *h_p_jet_const_1_SKI_kl5 = new TH1F("h_p_jet_const_1_SKI_kl5", "", totalBins, binsArray); - TH1F *h_p_jet_const_1_SKI_kl50 = new TH1F("h_p_jet_const_1_SKI_kl50", "", totalBins, binsArray); - TH1F *h_p_jet_const_1_SKI_kl100 = new TH1F("h_p_jet_const_1_SKI_kl100", "", totalBins, binsArray); + TH1F *h_p_jet_const_1_SKI_100 = new TH1F("h_p_jet_const_1_SKI_100", "", totalBins, binsArray); TH1F *h_p_jet_const_2_Nom = new TH1F("h_p_jet_const_2_Nom", "Jet constituent momentum", totalBins, binsArray); TH1F *h_p_jet_const_2_CR = new TH1F("h_p_jet_const_2_CR", "", totalBins, binsArray); - TH1F *h_p_jet_const_2_SKI_kl5 = new TH1F("h_p_jet_const_2_SKI_kl5", "", totalBins, binsArray); - TH1F *h_p_jet_const_2_SKI_kl50 = new TH1F("h_p_jet_const_2_SKI_kl50", "", totalBins, binsArray); - TH1F *h_p_jet_const_2_SKI_kl100 = new TH1F("h_p_jet_const_2_SKI_kl100", "", totalBins, binsArray); + TH1F *h_p_jet_const_2_SKI_100 = new TH1F("h_p_jet_const_2_SKI_100", "", totalBins, binsArray); TH1F *h_theta_Nom = new TH1F("h_theta_Nom", "#Delta#theta;#theta;Normalized Events", nBins, logBins); TH1F *h_theta_CR = new TH1F("h_theta_CR", "", nBins, logBins); - TH1F *h_theta_SKI_kl5 = new TH1F("h_theta_SKI_kl5", "", nBins, logBins); - TH1F *h_theta_SKI_kl50 = new TH1F("h_theta_SKI_kl50", "", nBins, logBins); - TH1F *h_theta_SKI_kl100 = new TH1F("h_theta_SKI_kl100", "", nBins, logBins); + TH1F *h_theta_SKI_100 = new TH1F("h_theta_SKI_100", "", nBins, logBins); TH1F *h_phi_Nom = new TH1F("h_phi_Nom", "#Delta#phi;Normalized Events", nBins, logBins); TH1F *h_phi_CR = new TH1F("h_phi_CR", "", nBins, logBins); - TH1F *h_phi_SKI_kl5 = new TH1F("h_phi_SKI_kl5", "", nBins, logBins); - TH1F *h_phi_SKI_kl50 = new TH1F("h_phi_SKI_kl50", "", nBins, logBins); - TH1F *h_phi_SKI_kl100 = new TH1F("h_phi_SKI_kl100", "", nBins, logBins); + TH1F *h_phi_SKI_100 = new TH1F("h_phi_SKI_100", "", nBins, logBins); TH1F *h_chi_Nom = new TH1F("h_chi_Nom", "#Delta#chi;Normalized Events", nBins, logBins); TH1F *h_chi_CR = new TH1F("h_chi_CR", "", nBins, logBins); - TH1F *h_chi_SKI_kl5 = new TH1F("h_chi_SKI_kl5", "", nBins, logBins); - TH1F *h_chi_SKI_kl50 = new TH1F("h_chi_SKI_kl50", "", nBins, logBins); - TH1F *h_chi_SKI_kl100 = new TH1F("h_chi_SKI_kl100", "", nBins, logBins); + TH1F *h_chi_SKI_100 = new TH1F("h_chi_SKI_100", "", nBins, logBins); - // TH1F *h_delR_Nom = new TH1F("h_delR_Nom", "#deltaR- Nominal", nBins, linearBins); - // TH1F *h_delR_CR = new TH1F("h_delR_CR", "", nBins, linearBins); + TH1F *h_delR_Nom = new TH1F("h_delR_Nom", "#deltaR- Nominal", nBins, linearBins); + TH1F *h_delR_CR = new TH1F("h_delR_CR", "", nBins, linearBins); - // TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); - // TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); + TH1F *h_eec_theta_Nom = new TH1F("h_eec_theta_Nom", "Change Title;Normalized Events", nBins, logBins); + TH1F *h_eec_theta_CR = new TH1F("h_eec_theta_CR", "", nBins, logBins); - // TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); - // TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", nBins, linearBins_2); + TH1D* h_cos_theta_Nom = new TH1D("h_cos_theta_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + TH1D* h_cos_theta_CR = new TH1D("h_cos_theta_CR", "Cos(theta) - noCR", nBins, linearBins_2); - // TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); - // TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); + TH1D* h_eec_Nom = new TH1D("h_eec_Nom", "Cos(theta) - Nominal", nBins, linearBins_2); + TH1D* h_eec_CR = new TH1D("h_eec_CR", "Cos(theta) - noCR", nBins, linearBins_2); // ************************ Reconstructed W Bosons ************************ TH1F* h_mass_W1_Nom = new TH1F("h_mass_W1_Nom", "Mass", nBins, linearBins); TH1F* h_mass_W1_CR = new TH1F("h_mass_W1_CR", "", nBins, linearBins); + TH1F* h_mass_W1_SKI_100 = new TH1F("h_mass_W1_SKI_100", "", nBins, linearBins); TH1F* h_mass_W2_Nom = new TH1F("h_mass_W2_Nom", "Mass", nBins, linearBins); TH1F* h_mass_W2_CR = new TH1F("h_mass_W2_CR", "", nBins, linearBins); + TH1F* h_mass_W2_SKI_100 = new TH1F("h_mass_W2_SKI_100", "", nBins, linearBins); TH1F* h_p_W1_Nom = new TH1F("h_p_W1_Nom", "Momentum", nBins, linearBins); TH1F* h_p_W1_CR = new TH1F("h_p_W1_CR", "", nBins, linearBins); + TH1F* h_p_W1_SKI_100 = new TH1F("h_p_W1_SKI_100", "", nBins, linearBins); TH1F* h_p_W2_Nom = new TH1F("h_p_W2_Nom", "Momentum", nBins, linearBins); TH1F* h_p_W2_CR = new TH1F("h_p_W2_CR", "", nBins, linearBins); + TH1F* h_p_W2_SKI_100 = new TH1F("h_p_W2_SKI_100", "", nBins, linearBins); TH1F* h_e_W1_Nom = new TH1F("h_e_W1_Nom", "Energy", nBins, linearBins); TH1F* h_e_W1_CR = new TH1F("h_e_W1_CR", "", nBins, linearBins); + TH1F* h_e_W1_SKI_100 = new TH1F("h_e_W1_SKI_100", "", nBins, linearBins); TH1F* h_e_W2_Nom = new TH1F("h_e_W2_Nom", "Energy", nBins, linearBins); TH1F* h_e_W2_CR = new TH1F("h_e_W2_CR", "", nBins, linearBins); + TH1F* h_e_W2_SKI_100 = new TH1F("h_e_W2_SKI_100", "", nBins, linearBins); // ************************ Reconstructed Jets ************************ TH1F* h_p_reco_Jet1_Nom = new TH1F("h_p_reco_Jet1_Nom", "Momentum", nBins, linearBins); TH1F* h_p_reco_Jet1_CR = new TH1F("h_p_reco_Jet1_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet1_SKI_100 = new TH1F("h_p_reco_Jet1_SKI_100", "", nBins, linearBins); + TH1F* h_p_reco_Jet2_Nom = new TH1F("h_p_reco_Jet2_Nom", "Momentum", nBins, linearBins); TH1F* h_p_reco_Jet2_CR = new TH1F("h_p_reco_Jet2_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet2_SKI_100 = new TH1F("h_p_reco_Jet2_SKI_100", "", nBins, linearBins); + TH1F* h_p_reco_Jet3_Nom = new TH1F("h_p_reco_Jet3_Nom", "Momentum", nBins, linearBins); TH1F* h_p_reco_Jet3_CR = new TH1F("h_p_reco_Jet3_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet3_SKI_100 = new TH1F("h_p_reco_Jet3_SKI_100", "", nBins, linearBins); + TH1F* h_p_reco_Jet4_Nom = new TH1F("h_p_reco_Jet4_Nom", "Momentum", nBins, linearBins); TH1F* h_p_reco_Jet4_CR = new TH1F("h_p_reco_Jet4_CR", "", nBins, linearBins); + TH1F* h_p_reco_Jet4_SKI_100 = new TH1F("h_p_reco_Jet4_SKI_100", "", nBins, linearBins); TH1F* h_theta_Jet1_Jet2_Nom = new TH1F("h_theta_Jet1_Jet2_Nom", "#theta", nBins, logBins); TH1F* h_theta_Jet1_Jet2_CR = new TH1F("h_theta_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_theta_Jet1_Jet2_SKI_100 = new TH1F("h_theta_Jet1_Jet2_SKI_100", "", nBins, logBins); + TH1F* h_theta_Jet3_Jet4_Nom = new TH1F("h_theta_Jet3_Jet4_Nom", "#theta", nBins, logBins); TH1F* h_theta_Jet3_Jet4_CR = new TH1F("h_theta_Jet3_Jet4_CR", "", nBins, logBins); + TH1F* h_theta_Jet3_Jet4_SKI_100 = new TH1F("h_theta_Jet3_Jet4_SKI_100", "", nBins, logBins); TH1F* h_phi_Jet1_Jet2_Nom = new TH1F("h_phi_Jet1_Jet2_Nom", "#theta", nBins, logBins); TH1F* h_phi_Jet1_Jet2_CR = new TH1F("h_phi_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_phi_Jet1_Jet2_SKI_100 = new TH1F("h_phi_Jet1_Jet2_SKI_100", "", nBins, logBins); + TH1F* h_phi_Jet3_Jet4_Nom = new TH1F("h_phi_Jet3_Jet4_Nom", "#theta", nBins, logBins); TH1F* h_phi_Jet3_Jet4_CR = new TH1F("h_phi_Jet3_Jet4_CR", "", nBins, logBins); + TH1F* h_phi_Jet3_Jet4_SKI_100 = new TH1F("h_phi_Jet3_Jet4_SKI_100", "", nBins, logBins); TH1F* h_chi_Jet1_Jet2_Nom = new TH1F("h_chi_Jet1_Jet2_Nom", "#theta", nBins, logBins); TH1F* h_chi_Jet1_Jet2_CR = new TH1F("h_chi_Jet1_Jet2_CR", "", nBins, logBins); + TH1F* h_chi_Jet1_Jet2_SKI_100 = new TH1F("h_chi_Jet1_Jet2_SKI_100", "", nBins, logBins); + TH1F* h_chi_Jet3_Jet4_Nom = new TH1F("h_chi_Jet3_Jet4_Nom", "#theta", nBins, logBins); TH1F* h_chi_Jet3_Jet4_CR = new TH1F("h_chi_Jet3_Jet4_CR", "", nBins, logBins); + TH1F* h_chi_Jet3_Jet4_SKI_100 = new TH1F("h_chi_Jet3_Jet4_SKI_100", "", nBins, logBins); // Fill tNom->Draw("b_p_jet_const_1 >> h_p_jet_const_1_Nom", "", "goff"); tCR->Draw("b_p_jet_const_1 >> h_p_jet_const_1_CR", "", "goff"); + tSKI_kl100->Draw("b_p_jet_const_1 >> h_p_jet_const_1_SKI_100", "", "goff"); tNom->Draw("b_p_jet_const_2 >> h_p_jet_const_2_Nom", "", "goff"); tCR->Draw("b_p_jet_const_2 >> h_p_jet_const_2_CR", "", "goff"); + tSKI_kl100->Draw("b_p_jet_const_2 >> h_p_jet_const_2_SKI_100", "", "goff"); tNom->Draw("b_theta_corr >> h_theta_Nom", "", "goff"); tCR->Draw("b_theta_corr >> h_theta_CR", "", "goff"); + tSKI_kl100->Draw("b_theta_corr >> h_theta_SKI_100", "", "goff"); tNom->Draw("b_phi_corr >> h_phi_Nom", "", "goff"); tCR->Draw("b_phi_corr >> h_phi_CR", "", "goff"); + tSKI_kl100->Draw("b_phi_corr >> h_phi_SKI_100", "", "goff"); tNom->Draw("b_chi_corr >> h_chi_Nom", "", "goff"); tCR->Draw("b_chi_corr >> h_chi_CR", "", "goff"); + tSKI_kl100->Draw("b_chi_corr >> h_chi_SKI_100", "", "goff"); tNom->Draw("b_delR_corr >> h_delR_Nom", "", "goff"); tCR->Draw("b_delR_corr >> h_delR_CR", "", "goff"); + tSKI_kl100->Draw("b_delR_corr >> h_delR_SKI_100", "", "goff"); // ***************** W Bosons ***************** tNom->Draw("b_mass_W1 >> h_mass_W1_Nom", "", "goff"); tCR->Draw("b_mass_W1 >> h_mass_W1_CR", "", "goff"); + tSKI_kl100->Draw("b_mass_W1 >> h_mass_W1_SKI_100", "", "goff"); + tNom->Draw("b_mass_W2 >> h_mass_W2_Nom", "", "goff"); tCR->Draw("b_mass_W2 >> h_mass_W2_CR", "", "goff"); + tSKI_kl100->Draw("b_mass_W2 >> h_mass_W2_SKI_100", "", "goff"); tNom->Draw("b_p_W1 >> h_p_W1_Nom", "", "goff"); tCR->Draw("b_p_W1 >> h_p_W1_CR", "", "goff"); + tSKI_kl100->Draw("b_p_W1 >> h_p_W1_SKI_100", "", "goff"); + tNom->Draw("b_p_W2 >> h_p_W2_Nom", "", "goff"); tCR->Draw("b_p_W2 >> h_p_W2_CR", "", "goff"); + tSKI_kl100->Draw("b_p_W2 >> h_p_W2_SKI_100", "", "goff"); tNom->Draw("b_e_W1 >> h_e_W1_Nom", "", "goff"); tCR->Draw("b_e_W1 >> h_e_W1_CR", "", "goff"); + tSKI_kl100->Draw("b_e_W1 >> h_e_W1_SKI_100", "", "goff"); + tNom->Draw("b_e_W2 >> h_e_W2_Nom", "", "goff"); tCR->Draw("b_e_W2 >> h_e_W2_CR", "", "goff"); + tSKI_kl100->Draw("b_e_W2 >> h_e_W2_SKI_100", "", "goff"); // ***************** Reconstructed Jets ***************** tNom->Draw("b_p_reco_Jet1 >> h_p_reco_Jet1_Nom", "", "goff"); tCR->Draw("b_p_reco_Jet1 >> h_p_reco_Jet1_CR", "", "goff"); + tSKI_kl100->Draw("b_p_reco_Jet1 >> h_p_reco_Jet1_SKI_100", "", "goff"); + tNom->Draw("b_p_reco_Jet2 >> h_p_reco_Jet2_Nom", "", "goff"); tCR->Draw("b_p_reco_Jet2 >> h_p_reco_Jet2_CR", "", "goff"); + tSKI_kl100->Draw("b_p_reco_Jet2 >> h_p_reco_Jet2_SKI_100", "", "goff"); + tNom->Draw("b_p_reco_Jet3 >> h_p_reco_Jet3_Nom", "", "goff"); tCR->Draw("b_p_reco_Jet3 >> h_p_reco_Jet3_CR", "", "goff"); + tSKI_kl100->Draw("b_p_reco_Jet3 >> h_p_reco_Jet3_SKI_100", "", "goff"); + tNom->Draw("b_p_reco_Jet4 >> h_p_reco_Jet4_Nom", "", "goff"); tCR->Draw("b_p_reco_Jet4 >> h_p_reco_Jet4_CR", "", "goff"); + tSKI_kl100->Draw("b_p_reco_Jet4 >> h_p_reco_Jet4_SKI_100", "", "goff"); tNom->Draw("b_theta_Jet1_Jet2 >> h_theta_Jet1_Jet2_Nom", "", "goff"); tCR->Draw("b_theta_Jet1_Jet2 >> h_theta_Jet1_Jet2_CR", "", "goff"); + tSKI_kl100->Draw("b_theta_Jet1_Jet2 >> h_theta_Jet1_Jet2_SKI_100", "", "goff"); + tNom->Draw("b_theta_Jet3_Jet4 >> h_theta_Jet3_Jet4_Nom", "", "goff"); tCR->Draw("b_theta_Jet3_Jet4 >> h_theta_Jet3_Jet4_CR", "", "goff"); + tSKI_kl100->Draw("b_theta_Jet3_Jet4 >> h_theta_Jet3_Jet4_SKI_100", "", "goff"); tNom->Draw("b_phi_Jet1_Jet2 >> h_phi_Jet1_Jet2_Nom", "", "goff"); tCR->Draw("b_phi_Jet1_Jet2 >> h_phi_Jet1_Jet2_CR", "", "goff"); + tSKI_kl100->Draw("b_phi_Jet1_Jet2 >> h_phi_Jet1_Jet2_SKI_100", "", "goff"); + tNom->Draw("b_phi_Jet3_Jet4 >> h_phi_Jet3_Jet4_Nom", "", "goff"); tCR->Draw("b_phi_Jet3_Jet4 >> h_phi_Jet3_Jet4_CR", "", "goff"); + tSKI_kl100->Draw("b_phi_Jet3_Jet4 >> h_phi_Jet3_Jet4_SKI_100", "", "goff"); tNom->Draw("b_chi_Jet1_Jet2 >> h_chi_Jet1_Jet2_Nom", "", "goff"); tCR->Draw("b_chi_Jet1_Jet2 >> h_chi_Jet1_Jet2_CR", "", "goff"); + tSKI_kl100->Draw("b_chi_Jet1_Jet2 >> h_chi_Jet1_Jet2_SKI_100", "", "goff"); + tNom->Draw("b_chi_Jet3_Jet4 >> h_chi_Jet3_Jet4_Nom", "", "goff"); tCR->Draw("b_chi_Jet3_Jet4 >> h_chi_Jet3_Jet4_CR", "", "goff"); + tSKI_kl100->Draw("b_chi_Jet3_Jet4 >> h_chi_Jet3_Jet4_SKI_100", "", "goff"); // Normalize both histograms by their integrals h_p_jet_const_1_Nom->Scale(1.0 / h_p_jet_const_1_Nom->Integral()); h_p_jet_const_1_CR->Scale(1.0 / h_p_jet_const_1_CR->Integral()); + h_p_jet_const_1_SKI_100->Scale(1.0 / h_p_jet_const_1_SKI_100->Integral()); h_p_jet_const_2_Nom->Scale(1.0 / h_p_jet_const_2_Nom->Integral()); h_p_jet_const_2_CR->Scale(1.0 / h_p_jet_const_2_CR->Integral()); + h_p_jet_const_2_SKI_100->Scale(1.0 / h_p_jet_const_2_SKI_100->Integral()); h_theta_Nom->Scale(1.0 / h_theta_Nom->Integral()); h_theta_CR->Scale(1.0 / h_theta_CR->Integral()); + h_theta_SKI_100->Scale(1.0 / h_theta_SKI_100->Integral()); h_phi_Nom->Scale(1.0 / h_phi_Nom->Integral()); h_phi_CR->Scale(1.0 / h_phi_CR->Integral()); + h_phi_SKI_100->Scale(1.0 / h_phi_SKI_100->Integral()); h_chi_Nom->Scale(1.0 / h_chi_Nom->Integral()); h_chi_CR->Scale(1.0 / h_chi_CR->Integral()); + h_chi_SKI_100->Scale(1.0 / h_chi_SKI_100->Integral()); h_delR_Nom->Scale(1.0 / h_delR_Nom->Integral()); h_delR_CR->Scale(1.0 / h_delR_CR->Integral()); @@ -234,70 +282,135 @@ void plot() { // ***************** W Bosons ***************** h_mass_W1_Nom->Scale(1.0 / h_mass_W1_Nom->Integral()); h_mass_W1_CR->Scale(1.0 / h_mass_W1_CR->Integral()); + h_mass_W1_SKI_100->Scale(1.0 / h_mass_W1_SKI_100->Integral()); + h_mass_W2_Nom->Scale(1.0 / h_mass_W2_Nom->Integral()); h_mass_W2_CR->Scale(1.0 / h_mass_W2_CR->Integral()); + h_mass_W2_SKI_100->Scale(1.0 / h_mass_W2_SKI_100->Integral()); h_p_W1_Nom->Scale(1.0 / h_p_W1_Nom->Integral()); h_p_W1_CR->Scale(1.0 / h_p_W1_CR->Integral()); + h_p_W1_SKI_100->Scale(1.0 / h_p_W1_SKI_100->Integral()); + h_p_W2_Nom->Scale(1.0 / h_p_W2_Nom->Integral()); h_p_W2_CR->Scale(1.0 / h_p_W2_CR->Integral()); + h_p_W2_SKI_100->Scale(1.0 / h_p_W2_SKI_100->Integral()); h_e_W1_Nom->Scale(1.0 / h_e_W1_Nom->Integral()); h_e_W1_CR->Scale(1.0 / h_e_W1_CR->Integral()); + h_e_W1_SKI_100->Scale(1.0 / h_e_W1_SKI_100->Integral()); + h_e_W2_Nom->Scale(1.0 / h_e_W2_Nom->Integral()); h_e_W2_CR->Scale(1.0 / h_e_W2_CR->Integral()); + h_e_W2_SKI_100->Scale(1.0 / h_e_W2_SKI_100->Integral()); // ***************** Reconstructed Jets ***************** h_p_reco_Jet1_Nom->Scale(1.0 / h_p_reco_Jet1_Nom->Integral()); h_p_reco_Jet1_CR->Scale(1.0 / h_p_reco_Jet1_CR->Integral()); + h_p_reco_Jet1_SKI_100->Scale(1.0 / h_p_reco_Jet1_SKI_100->Integral()); + h_p_reco_Jet2_Nom->Scale(1.0 / h_p_reco_Jet2_Nom->Integral()); h_p_reco_Jet2_CR->Scale(1.0 / h_p_reco_Jet2_CR->Integral()); + h_p_reco_Jet2_SKI_100->Scale(1.0 / h_p_reco_Jet2_SKI_100->Integral()); + h_p_reco_Jet3_Nom->Scale(1.0 / h_p_reco_Jet3_Nom->Integral()); h_p_reco_Jet3_CR->Scale(1.0 / h_p_reco_Jet3_CR->Integral()); + h_p_reco_Jet3_SKI_100->Scale(1.0 / h_p_reco_Jet3_SKI_100->Integral()); + h_p_reco_Jet4_Nom->Scale(1.0 / h_p_reco_Jet4_Nom->Integral()); h_p_reco_Jet4_CR->Scale(1.0 / h_p_reco_Jet4_CR->Integral()); + h_p_reco_Jet4_SKI_100->Scale(1.0 / h_p_reco_Jet4_SKI_100->Integral()); h_theta_Jet1_Jet2_Nom->Scale(1.0 / h_theta_Jet1_Jet2_Nom->Integral()); h_theta_Jet1_Jet2_CR->Scale(1.0 / h_theta_Jet1_Jet2_CR->Integral()); + h_theta_Jet1_Jet2_SKI_100->Scale(1.0 / h_theta_Jet1_Jet2_SKI_100->Integral()); + h_theta_Jet3_Jet4_Nom->Scale(1.0 / h_theta_Jet3_Jet4_Nom->Integral()); h_theta_Jet3_Jet4_CR->Scale(1.0 / h_theta_Jet3_Jet4_CR->Integral()); + h_theta_Jet3_Jet4_SKI_100->Scale(1.0 / h_theta_Jet3_Jet4_SKI_100->Integral()); h_phi_Jet1_Jet2_Nom->Scale(1.0 / h_phi_Jet1_Jet2_Nom->Integral()); h_phi_Jet1_Jet2_CR->Scale(1.0 / h_phi_Jet1_Jet2_CR->Integral()); + h_phi_Jet1_Jet2_SKI_100->Scale(1.0 / h_phi_Jet1_Jet2_SKI_100->Integral()); + h_phi_Jet3_Jet4_Nom->Scale(1.0 / h_phi_Jet3_Jet4_Nom->Integral()); h_phi_Jet3_Jet4_CR->Scale(1.0 / h_phi_Jet3_Jet4_CR->Integral()); + h_phi_Jet3_Jet4_SKI_100->Scale(1.0 / h_phi_Jet3_Jet4_SKI_100->Integral()); h_chi_Jet1_Jet2_Nom->Scale(1.0 / h_chi_Jet1_Jet2_Nom->Integral()); h_chi_Jet1_Jet2_CR->Scale(1.0 / h_chi_Jet1_Jet2_CR->Integral()); + h_chi_Jet1_Jet2_SKI_100->Scale(1.0 / h_chi_Jet1_Jet2_SKI_100->Integral()); + h_chi_Jet3_Jet4_Nom->Scale(1.0 / h_chi_Jet3_Jet4_Nom->Integral()); h_chi_Jet3_Jet4_CR->Scale(1.0 / h_chi_Jet3_Jet4_CR->Integral()); + h_chi_Jet3_Jet4_SKI_100->Scale(1.0 / h_chi_Jet3_Jet4_SKI_100->Integral()); // Ratio to Nominal TH1F *r_p_jet_const_1_CR = (TH1F*)h_p_jet_const_1_CR->Clone("r_p_jet_const_1_CR"); r_p_jet_const_1_CR->Divide(h_p_jet_const_1_Nom); + TH1F *r_p_jet_const_1_SKI_100 = (TH1F*)h_p_jet_const_1_SKI_100->Clone("r_p_jet_const_1_SKI_100"); r_p_jet_const_1_SKI_100->Divide(h_p_jet_const_1_Nom); + TH1F *r_p_jet_const_2_CR = (TH1F*)h_p_jet_const_2_CR->Clone("r_p_jet_const_2_CR"); r_p_jet_const_2_CR->Divide(h_p_jet_const_2_Nom); + TH1F *r_p_jet_const_2_SKI_100 = (TH1F*)h_p_jet_const_2_SKI_100->Clone("r_p_jet_const_2_SKI_100"); r_p_jet_const_2_SKI_100->Divide(h_p_jet_const_2_Nom); + TH1F *r_theta_CR = (TH1F*)h_theta_CR->Clone("r_theta_CR"); r_theta_CR->Divide(h_theta_Nom); + TH1F *r_theta_SKI_100 = (TH1F*)h_theta_SKI_100->Clone("r_theta_SKI_100"); r_theta_SKI_100->Divide(h_theta_Nom); + TH1F *r_phi_CR = (TH1F*)h_phi_CR->Clone("r_phi_CR"); r_phi_CR->Divide(h_phi_Nom); + TH1F *r_phi_SKI_100 = (TH1F*)h_phi_SKI_100->Clone("r_phi_SKI_100"); r_phi_SKI_100->Divide(h_phi_Nom); + TH1F *r_chi_CR = (TH1F*)h_chi_CR->Clone("r_chi_CR"); r_chi_CR->Divide(h_chi_Nom); + TH1F *r_chi_SKI_100 = (TH1F*)h_chi_SKI_100->Clone("r_chi_SKI_100"); r_chi_SKI_100->Divide(h_chi_Nom); + TH1F *r_delR_CR = (TH1F*)h_delR_CR->Clone("r_delR_CR"); r_delR_CR->Divide(h_delR_Nom); TH1D *r_eec_CR = (TH1D*)h_eec_CR->Clone("r_eec_CR"); r_eec_CR->Divide(h_eec_Nom); TH1F *r_mass_W1_CR = (TH1F*)h_mass_W1_CR->Clone("r_mass_W1_CR"); r_mass_W1_CR->Divide(h_mass_W1_Nom); + TH1F *r_mass_W1_SKI_100 = (TH1F*)h_mass_W1_SKI_100->Clone("r_mass_W1_SKI_100"); r_mass_W1_SKI_100->Divide(h_mass_W1_Nom); + TH1F *r_mass_W2_CR = (TH1F*)h_mass_W2_CR->Clone("r_mass_W2_CR"); r_mass_W2_CR->Divide(h_mass_W2_Nom); + TH1F *r_mass_W2_SKI_100 = (TH1F*)h_mass_W2_SKI_100->Clone("r_mass_W2_SKI_100"); r_mass_W2_SKI_100->Divide(h_mass_W2_Nom); + TH1F *r_p_W1_CR = (TH1F*)h_p_W1_CR->Clone("r_p_W1_CR"); r_p_W1_CR->Divide(h_p_W1_Nom); + TH1F *r_p_W1_SKI_100 = (TH1F*)h_p_W1_SKI_100->Clone("r_p_W1_SKI_100"); r_p_W1_SKI_100->Divide(h_p_W1_Nom); + TH1F *r_p_W2_CR = (TH1F*)h_p_W2_CR->Clone("r_p_W2_CR"); r_p_W2_CR->Divide(h_p_W2_Nom); + TH1F *r_p_W2_SKI_100 = (TH1F*)h_p_W2_SKI_100->Clone("r_p_W2_SKI_100"); r_p_W2_SKI_100->Divide(h_p_W2_Nom); + TH1F *r_e_W1_CR = (TH1F*)h_e_W1_CR->Clone("r_e_W1_CR"); r_e_W1_CR->Divide(h_e_W1_Nom); + TH1F *r_e_W1_SKI_100 = (TH1F*)h_e_W1_SKI_100->Clone("r_e_W1_SKI_100"); r_e_W1_SKI_100->Divide(h_e_W1_Nom); + TH1F *r_e_W2_CR = (TH1F*)h_e_W2_CR->Clone("r_e_W2_CR"); r_e_W2_CR->Divide(h_e_W2_Nom); + TH1F *r_e_W2_SKI_100 = (TH1F*)h_e_W2_SKI_100->Clone("r_e_W2_SKI_100"); r_e_W2_SKI_100->Divide(h_e_W2_Nom); TH1F *r_p_reco_Jet1_CR = (TH1F*)h_p_reco_Jet1_CR->Clone("r_p_reco_Jet1_CR"); r_p_reco_Jet1_CR->Divide(h_p_reco_Jet1_Nom); + TH1F *r_p_reco_Jet1_SKI_100 = (TH1F*)h_p_reco_Jet1_SKI_100->Clone("r_p_reco_Jet1_SKI_100"); r_p_reco_Jet1_SKI_100->Divide(h_p_reco_Jet1_Nom); + TH1F *r_p_reco_Jet2_CR = (TH1F*)h_p_reco_Jet2_CR->Clone("r_p_reco_Jet2_CR"); r_p_reco_Jet2_CR->Divide(h_p_reco_Jet2_Nom); + TH1F *r_p_reco_Jet2_SKI_100 = (TH1F*)h_p_reco_Jet2_SKI_100->Clone("r_p_reco_Jet2_SKI_100"); r_p_reco_Jet2_SKI_100->Divide(h_p_reco_Jet2_Nom); + TH1F *r_p_reco_Jet3_CR = (TH1F*)h_p_reco_Jet3_CR->Clone("r_p_reco_Jet3_CR"); r_p_reco_Jet3_CR->Divide(h_p_reco_Jet3_Nom); + TH1F *r_p_reco_Jet3_SKI_100 = (TH1F*)h_p_reco_Jet3_SKI_100->Clone("r_p_reco_Jet3_SKI_100"); r_p_reco_Jet3_SKI_100->Divide(h_p_reco_Jet3_Nom); + TH1F *r_p_reco_Jet4_CR = (TH1F*)h_p_reco_Jet4_CR->Clone("r_p_reco_Jet4_CR"); r_p_reco_Jet4_CR->Divide(h_p_reco_Jet4_Nom); + TH1F *r_p_reco_Jet4_SKI_100 = (TH1F*)h_p_reco_Jet4_SKI_100->Clone("r_p_reco_Jet4_SKI_100"); r_p_reco_Jet4_SKI_100->Divide(h_p_reco_Jet4_Nom); + TH1F *r_theta_Jet1_Jet2_CR = (TH1F*)h_theta_Jet1_Jet2_CR->Clone("r_theta_Jet1_Jet2_CR"); r_theta_Jet1_Jet2_CR->Divide(h_theta_Jet1_Jet2_Nom); + TH1F *r_theta_Jet1_Jet2_SKI_100 = (TH1F*)h_theta_Jet1_Jet2_SKI_100->Clone("r_theta_Jet1_Jet2_SKI_100"); r_theta_Jet1_Jet2_SKI_100->Divide(h_theta_Jet1_Jet2_Nom); + TH1F *r_theta_Jet3_Jet4_CR = (TH1F*)h_theta_Jet3_Jet4_CR->Clone("r_theta_Jet3_Jet4_CR"); r_theta_Jet3_Jet4_CR->Divide(h_theta_Jet3_Jet4_Nom); + TH1F *r_theta_Jet3_Jet4_SKI_100 = (TH1F*)h_theta_Jet3_Jet4_SKI_100->Clone("r_theta_Jet3_Jet4_SKI_100"); r_theta_Jet3_Jet4_SKI_100->Divide(h_theta_Jet3_Jet4_Nom); + TH1F *r_phi_Jet1_Jet2_CR = (TH1F*)h_phi_Jet1_Jet2_CR->Clone("r_phi_Jet1_Jet2_CR"); r_phi_Jet1_Jet2_CR->Divide(h_phi_Jet1_Jet2_Nom); + TH1F *r_phi_Jet1_Jet2_SKI_100 = (TH1F*)h_phi_Jet1_Jet2_SKI_100->Clone("r_phi_Jet1_Jet2_SKI_100"); r_phi_Jet1_Jet2_SKI_100->Divide(h_phi_Jet1_Jet2_Nom); + TH1F *r_phi_Jet3_Jet4_CR = (TH1F*)h_phi_Jet3_Jet4_CR->Clone("r_phi_Jet3_Jet4_CR"); r_phi_Jet3_Jet4_CR->Divide(h_phi_Jet3_Jet4_Nom); + TH1F *r_phi_Jet3_Jet4_SKI_100 = (TH1F*)h_phi_Jet3_Jet4_SKI_100->Clone("r_phi_Jet3_Jet4_SKI_100"); r_phi_Jet3_Jet4_SKI_100->Divide(h_phi_Jet3_Jet4_Nom); + TH1F *r_chi_Jet1_Jet2_CR = (TH1F*)h_chi_Jet1_Jet2_CR->Clone("r_chi_Jet1_Jet2_CR"); r_chi_Jet1_Jet2_CR->Divide(h_chi_Jet1_Jet2_Nom); + TH1F *r_chi_Jet1_Jet2_SKI_100 = (TH1F*)h_chi_Jet1_Jet2_SKI_100->Clone("r_chi_Jet1_Jet2_SKI_100"); r_chi_Jet1_Jet2_SKI_100->Divide(h_chi_Jet1_Jet2_Nom); + TH1F *r_chi_Jet3_Jet4_CR = (TH1F*)h_chi_Jet3_Jet4_CR->Clone("r_chi_Jet3_Jet4_CR"); r_chi_Jet3_Jet4_CR->Divide(h_chi_Jet3_Jet4_Nom); + TH1F *r_chi_Jet3_Jet4_SKI_100 = (TH1F*)h_chi_Jet3_Jet4_SKI_100->Clone("r_chi_Jet3_Jet4_SKI_100"); r_chi_Jet3_Jet4_SKI_100->Divide(h_chi_Jet3_Jet4_Nom); // **************************************** Jet Constituent Plots **************************************** TCanvas *c_p_jet_const_1 = new TCanvas("c_p_jet_const_1", "comparison", 1000, 800); From 006c49ee57deb816533e5db21aac51e06ef6f4b2 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 6 Aug 2025 10:29:22 -0400 Subject: [PATCH 38/40] SKI w/ kl=100 added to plots --- scripts/plot.C | 129 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 115 insertions(+), 14 deletions(-) diff --git a/scripts/plot.C b/scripts/plot.C index 7d81c57..cf60217 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -443,13 +443,16 @@ void plot() { h_p_jet_const_1_Nom->SetLineColor(kBlue); h_p_jet_const_1_Nom->SetLineWidth(3); h_p_jet_const_1_CR->SetLineColor(kRed); h_p_jet_const_1_CR->SetLineWidth(3); + h_p_jet_const_1_SKI_100->SetLineColor(kViolet+1); h_p_jet_const_1_SKI_100->SetLineWidth(3); h_p_jet_const_1_Nom->Draw("HIST"); h_p_jet_const_1_CR->Draw("HIST SAME"); + h_p_jet_const_1_SKI_100->Draw("HIST SAME"); auto leg_p_jetConst_1 = new TLegend(0.725, 0.75, 0.88, 0.88); leg_p_jetConst_1->AddEntry(h_p_jet_const_1_Nom, "Nominal", "l"); leg_p_jetConst_1->AddEntry(h_p_jet_const_1_CR, "noCR", "l"); + leg_p_jetConst_1->AddEntry(h_p_jet_const_1_SKI_100, "SKI, kl = 100", "l"); leg_p_jetConst_1->Draw(); // Ratio plot @@ -459,6 +462,9 @@ void plot() { r_p_jet_const_1_CR->SetLineColor(kRed); r_p_jet_const_1_CR->Draw("HIST"); r_p_jet_const_1_CR->SetLineWidth(3); + r_p_jet_const_1_SKI_100->SetLineColor(kViolet+1); + r_p_jet_const_1_SKI_100->Draw("HIST SAME"); + r_p_jet_const_1_SKI_100->SetLineWidth(3); r_p_jet_const_1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles r_p_jet_const_1_CR->GetYaxis()->SetTitle("ratio"); @@ -472,6 +478,11 @@ void plot() { r_p_jet_const_1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_p_jet_const_1_CR->GetYaxis()->SetTitleOffset(0.55); + auto leg_ratio_p_jetConst_1 = new TLegend(0.725, 0.75, 0.88, 0.88); + leg_ratio_p_jetConst_1->AddEntry(r_p_jet_const_1_CR, "noCR", "l"); + leg_ratio_p_jetConst_1->AddEntry(r_p_jet_const_1_SKI_100, "SKI, kl = 100", "l"); + leg_ratio_p_jetConst_1->Draw(); + TCanvas *c_p_jet_const_2 = new TCanvas("c_p_jet_const_2", "comparison", 1000, 800); c_p_jet_const_2->Divide(1, 2); @@ -502,13 +513,16 @@ void plot() { h_p_jet_const_2_Nom->SetLineColor(kBlue); h_p_jet_const_2_Nom->SetLineWidth(3); h_p_jet_const_2_CR->SetLineColor(kRed); h_p_jet_const_2_CR->SetLineWidth(3); + h_p_jet_const_2_SKI_100->SetLineColor(kViolet+1); h_p_jet_const_2_SKI_100->SetLineWidth(3); h_p_jet_const_2_Nom->Draw("HIST"); h_p_jet_const_2_CR->Draw("HIST SAME"); + h_p_jet_const_2_SKI_100->Draw("HIST SAME"); auto leg_p_jetConst_2 = new TLegend(0.725, 0.75, 0.88, 0.88); leg_p_jetConst_2->AddEntry(h_p_jet_const_2_Nom, "Nominal", "l"); leg_p_jetConst_2->AddEntry(h_p_jet_const_2_CR, "noCR", "l"); + leg_p_jetConst_2->AddEntry(h_p_jet_const_2_SKI_100, "SKI, kl = 100", "l"); leg_p_jetConst_2->Draw(); // Ratio plot @@ -518,6 +532,9 @@ void plot() { r_p_jet_const_2_CR->SetLineColor(kRed); r_p_jet_const_2_CR->Draw("HIST"); r_p_jet_const_2_CR->SetLineWidth(3); + r_p_jet_const_2_SKI_100->SetLineColor(kViolet+1); + r_p_jet_const_2_SKI_100->Draw("HIST SAME"); + r_p_jet_const_2_SKI_100->SetLineWidth(3); r_p_jet_const_2_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles r_p_jet_const_2_CR->GetYaxis()->SetTitle("ratio"); @@ -531,6 +548,11 @@ void plot() { r_p_jet_const_2_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_p_jet_const_2_CR->GetYaxis()->SetTitleOffset(0.55); + auto leg_ratio_p_jetConst_2 = new TLegend(0.725, 0.75, 0.88, 0.88); + leg_ratio_p_jetConst_2->AddEntry(r_p_jet_const_2_CR, "noCR", "l"); + leg_ratio_p_jetConst_2->AddEntry(r_p_jet_const_2_SKI_100, "SKI, kl = 100", "l"); + leg_ratio_p_jetConst_2->Draw(); + TCanvas *c_theta = new TCanvas("c_theta", "comparison", 1000, 800); c_theta->Divide(1, 2); @@ -561,13 +583,16 @@ void plot() { h_theta_Nom->SetLineColor(kBlack); h_theta_Nom->SetLineWidth(3); h_theta_CR->SetLineColor(kRed); h_theta_CR->SetLineWidth(3); + h_theta_SKI_100->SetLineColor(kViolet+1); h_theta_SKI_100->SetLineWidth(3); h_theta_Nom->Draw("HIST"); h_theta_CR->Draw("HIST SAME"); + h_theta_SKI_100->Draw("HIST SAME"); auto leg_theta = new TLegend(0.15, 0.3, 0.25, 0.4); leg_theta->AddEntry(h_theta_Nom, "Nominal", "l"); leg_theta->AddEntry(h_theta_CR, "noCR", "l"); + leg_theta->AddEntry(h_theta_SKI_100, "SKI, kl = 100", "l"); leg_theta->Draw(); // Ratio plot @@ -577,6 +602,9 @@ void plot() { r_theta_CR->SetLineColor(kRed); r_theta_CR->Draw("HIST"); r_theta_CR->SetLineWidth(3); + r_theta_SKI_100->SetLineColor(kViolet+1); + r_theta_SKI_100->Draw("HIST SAME"); + r_theta_SKI_100->SetLineWidth(3); r_theta_CR->GetXaxis()->SetTitle("#theta (radians)"); // Axis titles r_theta_CR->GetYaxis()->SetTitle("ratio"); @@ -589,6 +617,11 @@ void plot() { r_theta_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_theta_CR->GetYaxis()->SetTitleOffset(0.55); + auto leg_ratio_theta = new TLegend(0.15, 0.3, 0.25, 0.4); + leg_ratio_theta->AddEntry(r_theta_CR, "noCR", "l"); + leg_ratio_theta->AddEntry(r_theta_SKI_100, "SKI, kl = 100", "l"); + leg_ratio_theta->Draw(); + // Canvas 2 TCanvas *c_phi = new TCanvas("c_phi", "comparison", 1000, 800); @@ -620,13 +653,16 @@ void plot() { h_phi_Nom->SetLineColor(kBlack); h_phi_Nom->SetLineWidth(3); h_phi_CR->SetLineColor(kRed); h_phi_CR->SetLineWidth(3); + h_phi_SKI_100->SetLineColor(kViolet+1); h_phi_SKI_100->SetLineWidth(3); h_phi_Nom->Draw("HIST"); h_phi_CR->Draw("HIST SAME"); + h_phi_SKI_100->Draw("HIST SAME"); auto leg_phi = new TLegend(0.15, 0.75, 0.25, 0.88); leg_phi->AddEntry(h_phi_Nom, "Nominal", "l"); leg_phi->AddEntry(h_phi_CR, "noCR", "l"); + leg_phi->AddEntry(h_phi_SKI_100, "SKI, kl = 100", "l"); leg_phi->Draw(); // Ratio plot @@ -637,6 +673,9 @@ void plot() { r_phi_CR->SetLineColor(kRed); r_phi_CR->Draw("HIST"); r_phi_CR->SetLineWidth(3); + r_phi_SKI_100->SetLineColor(kViolet+1); + r_phi_SKI_100->Draw("HIST SAME"); + r_phi_SKI_100->SetLineWidth(3); r_phi_CR->GetXaxis()->SetTitle("#phi (radians)"); // Axis titles r_phi_CR->GetYaxis()->SetTitle("ratio"); @@ -649,6 +688,11 @@ void plot() { r_phi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_phi_CR->GetYaxis()->SetTitleOffset(0.55); + auto leg_ratio_phi = new TLegend(0.15, 0.75, 0.25, 0.88); + leg_ratio_phi->AddEntry(r_phi_CR, "noCR", "l"); + leg_ratio_phi->AddEntry(r_phi_SKI_100, "SKI, kl = 100", "l"); + leg_ratio_phi->Draw(); + // Canvas 3 TCanvas *c_chi = new TCanvas("c_chi", "comparison", 1000, 800); @@ -680,13 +724,16 @@ void plot() { h_chi_Nom->SetLineColor(kBlack); h_chi_Nom->SetLineWidth(3); h_chi_CR->SetLineColor(kRed); h_chi_CR->SetLineWidth(3); + h_chi_SKI_100->SetLineColor(kViolet+1); h_chi_SKI_100->SetLineWidth(3); h_chi_Nom->Draw("HIST"); h_chi_CR->Draw("HIST SAME"); + h_chi_SKI_100->Draw("HIST SAME"); auto leg_chi = new TLegend(0.15, 0.75, 0.25, 0.88); leg_chi->AddEntry(h_chi_Nom, "Nominal", "l"); leg_chi->AddEntry(h_chi_CR, "noCR", "l"); + leg_chi->AddEntry(h_chi_SKI_100, "SKI, kl=100", "l"); leg_chi->Draw(); // Ratio plot @@ -697,6 +744,9 @@ void plot() { r_chi_CR->SetLineColor(kRed); r_chi_CR->Draw("HIST"); r_chi_CR->SetLineWidth(3); + r_chi_SKI_100->SetLineColor(kViolet+1); + r_chi_SKI_100->Draw("HIST SAME"); + r_chi_SKI_100->SetLineWidth(3); r_chi_CR->GetXaxis()->SetTitle("#chi (radians)"); // Axis titles r_chi_CR->GetYaxis()->SetTitle("ratio"); @@ -709,6 +759,11 @@ void plot() { r_chi_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_chi_CR->GetYaxis()->SetTitleOffset(0.55); + auto leg_ratio_chi = new TLegend(0.15, 0.75, 0.25, 0.88); + leg_ratio_chi->AddEntry(r_chi_CR, "noCR", "l"); + leg_ratio_chi->AddEntry(r_chi_SKI_100, "SKI, kl=100", "l"); + leg_ratio_chi->Draw(); + TCanvas *c_delR = new TCanvas("c_delR", "comparison", 1000, 800); c_delR->Divide(1, 2); @@ -799,19 +854,25 @@ void plot() { h_mass_W1_Nom->SetLineColor(kBlack); h_mass_W1_Nom->SetLineWidth(3); h_mass_W1_CR->SetLineColor(kRed); h_mass_W1_CR->SetLineWidth(3); + h_mass_W1_SKI_100->SetLineColor(kViolet+1); h_mass_W1_SKI_100->SetLineWidth(3); h_mass_W2_Nom->SetLineColor(kBlue); h_mass_W2_Nom->SetLineWidth(3); - h_mass_W2_CR->SetLineColor(kGreen); h_mass_W2_CR->SetLineWidth(3); + h_mass_W2_CR->SetLineColor(kGreen+2); h_mass_W2_CR->SetLineWidth(3); + h_mass_W2_SKI_100->SetLineColor(kPink+8); h_mass_W2_SKI_100->SetLineWidth(3); h_mass_W1_Nom->Draw("HIST"); h_mass_W1_CR->Draw("HIST SAME"); + h_mass_W1_SKI_100->Draw("HIST SAME"); h_mass_W2_Nom->Draw("HIST SAME"); h_mass_W2_CR->Draw("HIST SAME"); + h_mass_W2_SKI_100->Draw("HIST SAME"); - auto leg_W_mass = new TLegend(0.7, 0.75, 0.88, 0.88); + auto leg_W_mass = new TLegend(0.7, 0.6, 0.88, 0.88); leg_W_mass->AddEntry(h_mass_W1_Nom, "W1 Mass- Nom", "l"); leg_W_mass->AddEntry(h_mass_W1_CR, "W1 Mass- No CR", "l"); + leg_W_mass->AddEntry(h_mass_W1_SKI_100, "W1 Mass- SKI, kl=100", "l"); leg_W_mass->AddEntry(h_mass_W2_Nom, "W2 Mass- Nom", "l"); leg_W_mass->AddEntry(h_mass_W2_CR, "W2 Mass- No CR", "l"); + leg_W_mass->AddEntry(h_mass_W2_SKI_100, "W2 Mass- SKI, kl=100", "l"); leg_W_mass->Draw(); // Ratio plot @@ -821,9 +882,15 @@ void plot() { r_mass_W1_CR->SetLineColor(kRed); r_mass_W1_CR->Draw("HIST"); r_mass_W1_CR->SetLineWidth(3); + r_mass_W1_SKI_100->SetLineColor(kViolet+1); + r_mass_W1_SKI_100->Draw("HIST SAME"); + r_mass_W1_SKI_100->SetLineWidth(3); r_mass_W2_CR->SetLineColor(kBlue); r_mass_W2_CR->Draw("HIST SAME"); r_mass_W2_CR->SetLineWidth(3); + r_mass_W2_SKI_100->SetLineColor(kPink+8); + r_mass_W2_SKI_100->Draw("HIST SAME"); + r_mass_W2_SKI_100->SetLineWidth(3); r_mass_W1_CR->GetXaxis()->SetTitle("Momentum (GeV/c)"); // Axis titles r_mass_W1_CR->GetYaxis()->SetTitle("ratio"); @@ -837,9 +904,11 @@ void plot() { r_mass_W1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_mass_W1_CR->GetYaxis()->SetTitleOffset(0.55); - auto leg_ratio_W_mass = new TLegend(0.15, 0.75, 0.35, 0.9); + auto leg_ratio_W_mass = new TLegend(0.15, 0.75, 0.35, 0.88); leg_ratio_W_mass->AddEntry(r_mass_W1_CR, "W1 Mass Nominal", "l"); + leg_ratio_W_mass->AddEntry(r_mass_W1_SKI_100, "W1 Mass- SKI, kl=100", "l"); leg_ratio_W_mass->AddEntry(r_mass_W2_CR, "W2 Mass noCR", "l"); + leg_ratio_W_mass->AddEntry(r_mass_W2_SKI_100, "W2 Mass- SKI, kl=100", "l"); leg_ratio_W_mass->Draw(); @@ -873,19 +942,25 @@ void plot() { h_p_W1_Nom->SetLineColor(kBlack); h_p_W1_Nom->SetLineWidth(3); h_p_W1_CR->SetLineColor(kRed); h_p_W1_CR->SetLineWidth(3); + h_p_W1_SKI_100->SetLineColor(kViolet+1); h_p_W1_SKI_100->SetLineWidth(3); h_p_W2_Nom->SetLineColor(kBlue); h_p_W2_Nom->SetLineWidth(3); h_p_W2_CR->SetLineColor(kGreen); h_p_W2_CR->SetLineWidth(3); + h_p_W2_SKI_100->SetLineColor(kPink+8); h_p_W2_SKI_100->SetLineWidth(3); h_p_W1_Nom->Draw("HIST"); h_p_W1_CR->Draw("HIST SAME"); + h_p_W1_SKI_100->Draw("HIST SAME"); h_p_W2_Nom->Draw("HIST SAME"); h_p_W2_CR->Draw("HIST SAME"); - - auto leg_p_W = new TLegend(0.7, 0.75, 0.88, 0.88); - leg_p_W->AddEntry(h_p_W1_Nom, "W1 Nom", "l"); - leg_p_W->AddEntry(h_p_W1_CR, "W1 No CR", "l"); - leg_p_W->AddEntry(h_p_W2_Nom, "W2 Nom", "l"); - leg_p_W->AddEntry(h_p_W2_CR, "W2 No CR", "l"); + h_p_W2_SKI_100->Draw("HIST SAME"); + + auto leg_p_W = new TLegend(0.7, 0.6, 0.88, 0.88); + leg_p_W->AddEntry(h_p_W1_Nom, "W1- Nom", "l"); + leg_p_W->AddEntry(h_p_W1_CR, "W1- No CR", "l"); + leg_p_W->AddEntry(h_p_W1_SKI_100, "W1- SKI, kl=100", "l"); + leg_p_W->AddEntry(h_p_W2_Nom, "W2- Nom", "l"); + leg_p_W->AddEntry(h_p_W2_CR, "W2- No CR", "l"); + leg_p_W->AddEntry(h_p_W2_SKI_100, "W2- SKI, kl=100", "l"); leg_p_W->Draw(); // Ratio plot @@ -895,9 +970,15 @@ void plot() { r_p_W1_CR->SetLineColor(kRed); r_p_W1_CR->Draw("HIST"); r_p_W1_CR->SetLineWidth(3); + r_p_W1_SKI_100->SetLineColor(kViolet+1); + r_p_W1_SKI_100->Draw("HIST SAME"); + r_p_W1_SKI_100->SetLineWidth(3); r_p_W2_CR->SetLineColor(kBlue); r_p_W2_CR->Draw("HIST SAME"); r_p_W2_CR->SetLineWidth(3); + r_p_W2_SKI_100->SetLineColor(kPink+8); + r_p_W2_SKI_100->Draw("HIST SAME"); + r_p_W2_SKI_100->SetLineWidth(3); r_p_W1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles r_p_W1_CR->GetYaxis()->SetTitle("ratio"); @@ -911,10 +992,12 @@ void plot() { r_p_W1_CR->GetXaxis()->SetTitleOffset(1.0); // Set the title offset to the axis r_p_W1_CR->GetYaxis()->SetTitleOffset(0.55); - auto leg_ratio_p_mass = new TLegend(0.75, 0.75, 0.88, 0.9); - leg_ratio_p_mass->AddEntry(r_p_W1_CR, "W1 Momenta", "l"); - leg_ratio_p_mass->AddEntry(r_p_W2_CR, "W2 Momenta", "l"); - leg_ratio_p_mass->Draw(); + auto leg_ratio_p_W = new TLegend(0.75, 0.75, 0.88, 0.9); + leg_ratio_p_W->AddEntry(r_p_W1_CR, "W1 Momenta", "l"); + leg_ratio_p_W->AddEntry(r_p_W1_SKI_100, "W1- SKI, kl=100", "l"); + leg_ratio_p_W->AddEntry(r_p_W2_CR, "W2 Momenta", "l"); + leg_ratio_p_W->AddEntry(r_p_W2_SKI_100, "W2- SKI, kl=100", "l"); + leg_ratio_p_W->Draw(); TCanvas *c_e_W = new TCanvas("c_e_W", "comparison", 1000, 800); @@ -947,19 +1030,25 @@ void plot() { h_e_W1_Nom->SetLineColor(kBlack); h_e_W1_Nom->SetLineWidth(3); h_e_W1_CR->SetLineColor(kRed); h_e_W1_CR->SetLineWidth(3); + h_e_W1_SKI_100->SetLineColor(kViolet+1); h_e_W1_SKI_100->SetLineWidth(3); h_e_W2_Nom->SetLineColor(kBlue); h_e_W2_Nom->SetLineWidth(3); h_e_W2_CR->SetLineColor(kGreen); h_e_W2_CR->SetLineWidth(3); + h_e_W2_SKI_100->SetLineColor(kPink+8); h_e_W2_SKI_100->SetLineWidth(3); h_e_W1_Nom->Draw("HIST"); h_e_W1_CR->Draw("HIST SAME"); + h_e_W1_SKI_100->Draw("HIST SAME"); h_e_W2_Nom->Draw("HIST SAME"); h_e_W2_CR->Draw("HIST SAME"); + h_e_W2_SKI_100->Draw("HIST SAME"); - auto leg_e_W = new TLegend(0.15, 0.7, 0.35, 0.88); + auto leg_e_W = new TLegend(0.7, 0.6, 0.88, 0.88); leg_e_W->AddEntry(h_e_W1_Nom, "W1- Nom", "l"); leg_e_W->AddEntry(h_e_W1_CR, "W1- CR", "l"); + leg_e_W->AddEntry(h_e_W1_SKI_100, "W1- SKI, kl=100", "l"); leg_e_W->AddEntry(h_e_W2_Nom, "W2- Nom", "l"); leg_e_W->AddEntry(h_e_W2_CR, "W2- CR", "l"); + leg_e_W->AddEntry(h_e_W2_SKI_100, "W2- SKI, kl=100", "l"); leg_e_W->Draw(); // Ratio plot @@ -969,9 +1058,15 @@ void plot() { r_e_W1_CR->SetLineColor(kRed); r_e_W1_CR->Draw("HIST"); r_e_W1_CR->SetLineWidth(3); + r_e_W1_SKI_100->SetLineColor(kViolet+1); + r_e_W1_SKI_100->Draw("HIST SAME"); + r_e_W1_SKI_100->SetLineWidth(3); r_e_W2_CR->SetLineColor(kBlue); r_e_W2_CR->Draw("HIST SAME"); r_e_W2_CR->SetLineWidth(3); + r_e_W2_SKI_100->SetLineColor(kPink+8); + r_e_W2_SKI_100->Draw("HIST SAME"); + r_e_W2_SKI_100->SetLineWidth(3); r_e_W1_CR->GetXaxis()->SetTitle("momenta (GeV/c)"); // Axis titles r_e_W1_CR->GetYaxis()->SetTitle("ratio"); @@ -987,7 +1082,9 @@ void plot() { auto leg_ratio_e_W = new TLegend(0.725, 0.75, 0.88, 0.9); leg_ratio_e_W->AddEntry(r_e_W1_CR, "W1 p Ratio", "l"); + leg_ratio_e_W->AddEntry(r_e_W1_SKI_100, "W1- SKI, kl=100", "l"); leg_ratio_e_W->AddEntry(r_e_W2_CR, "W2 p Ratio", "l"); + leg_ratio_e_W->AddEntry(r_e_W1_SKI_100, "W1- SKI, kl=100", "l"); leg_ratio_e_W->Draw(); @@ -1021,13 +1118,17 @@ void plot() { h_p_reco_Jet1_Nom->SetLineColor(kBlack); h_p_reco_Jet1_Nom->SetLineWidth(3); h_p_reco_Jet1_CR->SetLineColor(kRed); h_p_reco_Jet1_CR->SetLineWidth(3); + h_p_reco_Jet1_SKI_100->SetLineColor(kViolet+1); h_p_reco_Jet1_SKI_100->SetLineWidth(3); h_p_reco_Jet2_Nom->SetLineColor(kBlue); h_p_reco_Jet2_Nom->SetLineWidth(3); h_p_reco_Jet2_CR->SetLineColor(kGreen); h_p_reco_Jet2_CR->SetLineWidth(3); + h_p_reco_Jet2_SKI_100->SetLineColor(kMagenta-4); h_p_reco_Jet2_SKI_100->SetLineWidth(3); h_p_reco_Jet3_Nom->SetLineColor(kOrange+7); h_p_reco_Jet3_Nom->SetLineWidth(3); h_p_reco_Jet3_CR->SetLineColor(kPink+7); h_p_reco_Jet3_CR->SetLineWidth(3); + h_p_reco_Jet3_SKI_100->SetLineColor(kGray+2); h_p_reco_Jet3_SKI_100->SetLineWidth(3); h_p_reco_Jet4_Nom->SetLineColor(kAzure+7); h_p_reco_Jet4_Nom->SetLineWidth(3); h_p_reco_Jet4_CR->SetLineColor(kGreen+3); h_p_reco_Jet4_CR->SetLineWidth(3); + h_p_reco_Jet4_SKI_100->SetLineColor(kPink); h_p_reco_Jet4_SKI_100->SetLineWidth(3); h_p_reco_Jet1_Nom->Draw("HIST"); h_p_reco_Jet1_CR->Draw("HIST SAME"); From 3c897b9fd7ea0bb848c9a5c5391da5124a4787cb Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Wed, 6 Aug 2025 11:51:15 -0400 Subject: [PATCH 39/40] SKI w/ kl=100 added to all plots --- scripts/plot.C | 117 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 22 deletions(-) diff --git a/scripts/plot.C b/scripts/plot.C index cf60217..c91518c 100644 --- a/scripts/plot.C +++ b/scripts/plot.C @@ -66,13 +66,13 @@ void plot() { // Create histograms // Histograms - TH1F *h_p_jet_const_1_Nom = new TH1F("h_p_jet_const_1_Nom", "Jet constituent momentum", totalBins, binsArray); - TH1F *h_p_jet_const_1_CR = new TH1F("h_p_jet_const_1_CR", "", totalBins, binsArray); - TH1F *h_p_jet_const_1_SKI_100 = new TH1F("h_p_jet_const_1_SKI_100", "", totalBins, binsArray); + TH1F *h_p_jet_const_1_Nom = new TH1F("h_p_jet_const_1_Nom", "Jet constituent momentum", nBins, linearBins); + TH1F *h_p_jet_const_1_CR = new TH1F("h_p_jet_const_1_CR", "", nBins, linearBins); + TH1F *h_p_jet_const_1_SKI_100 = new TH1F("h_p_jet_const_1_SKI_100", "", nBins, linearBins); - TH1F *h_p_jet_const_2_Nom = new TH1F("h_p_jet_const_2_Nom", "Jet constituent momentum", totalBins, binsArray); - TH1F *h_p_jet_const_2_CR = new TH1F("h_p_jet_const_2_CR", "", totalBins, binsArray); - TH1F *h_p_jet_const_2_SKI_100 = new TH1F("h_p_jet_const_2_SKI_100", "", totalBins, binsArray); + TH1F *h_p_jet_const_2_Nom = new TH1F("h_p_jet_const_2_Nom", "Jet constituent momentum", nBins, linearBins); + TH1F *h_p_jet_const_2_CR = new TH1F("h_p_jet_const_2_CR", "", nBins, linearBins); + TH1F *h_p_jet_const_2_SKI_100 = new TH1F("h_p_jet_const_2_SKI_100", "", nBins, linearBins); TH1F *h_theta_Nom = new TH1F("h_theta_Nom", "#Delta#theta;#theta;Normalized Events", nBins, logBins); TH1F *h_theta_CR = new TH1F("h_theta_CR", "", nBins, logBins); @@ -1132,22 +1132,30 @@ void plot() { h_p_reco_Jet1_Nom->Draw("HIST"); h_p_reco_Jet1_CR->Draw("HIST SAME"); + h_p_reco_Jet1_SKI_100->Draw("HIST SAME"); h_p_reco_Jet2_Nom->Draw("HIST SAME"); h_p_reco_Jet2_CR->Draw("HIST SAME"); + h_p_reco_Jet2_SKI_100->Draw("HIST SAME"); h_p_reco_Jet3_Nom->Draw("HIST SAME"); h_p_reco_Jet3_CR->Draw("HIST SAME"); + h_p_reco_Jet3_SKI_100->Draw("HIST SAME"); h_p_reco_Jet4_Nom->Draw("HIST SAME"); h_p_reco_Jet4_CR->Draw("HIST SAME"); + h_p_reco_Jet4_SKI_100->Draw("HIST SAME"); auto leg_reco_jets = new TLegend(0.725, 0.48, 0.88, 0.88); leg_reco_jets->AddEntry(h_p_reco_Jet1_Nom, "Jet1- Nom", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet1_CR, "Jet1- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet1_SKI_100, "Jet1- SKI, kl=100", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet2_Nom, "Jet2- Nom", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet2_CR, "Jet2- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet2_SKI_100, "Jet2- SKI, kl=100", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet3_Nom, "Jet3- Nom", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet3_CR, "Jet3- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet3_SKI_100, "Jet3- SKI, kl=100", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet4_Nom, "Jet4- Nom", "l"); leg_reco_jets->AddEntry(h_p_reco_Jet4_CR, "Jet4- CR", "l"); + leg_reco_jets->AddEntry(h_p_reco_Jet4_SKI_100, "Jet4- SKI, kl=100", "l"); leg_reco_jets->Draw(); // Ratio plot @@ -1157,15 +1165,30 @@ void plot() { r_p_reco_Jet1_CR->SetLineColor(kBlack); r_p_reco_Jet1_CR->Draw("HIST"); r_p_reco_Jet1_CR->SetLineWidth(3); + r_p_reco_Jet1_SKI_100->SetLineColor(kViolet+1); + r_p_reco_Jet1_SKI_100->Draw("HIST SAME"); + r_p_reco_Jet1_SKI_100->SetLineWidth(3); + r_p_reco_Jet2_CR->SetLineColor(kRed); r_p_reco_Jet2_CR->Draw("HIST SAME"); r_p_reco_Jet2_CR->SetLineWidth(3); + r_p_reco_Jet2_SKI_100->SetLineColor(kMagenta-4); + r_p_reco_Jet2_SKI_100->Draw("HIST SAME"); + r_p_reco_Jet2_SKI_100->SetLineWidth(3); + r_p_reco_Jet3_CR->SetLineColor(kBlue); r_p_reco_Jet3_CR->Draw("HIST SAME"); r_p_reco_Jet3_CR->SetLineWidth(3); + r_p_reco_Jet3_SKI_100->SetLineColor(kGray+2); + r_p_reco_Jet3_SKI_100->Draw("HIST SAME"); + r_p_reco_Jet3_SKI_100->SetLineWidth(3); + r_p_reco_Jet4_CR->SetLineColor(kGreen); r_p_reco_Jet4_CR->Draw("HIST SAME"); r_p_reco_Jet4_CR->SetLineWidth(3); + r_p_reco_Jet4_SKI_100->SetLineColor(kOrange+7); + r_p_reco_Jet4_SKI_100->Draw("HIST SAME"); + r_p_reco_Jet4_SKI_100->SetLineWidth(3); r_p_reco_Jet1_CR->GetXaxis()->SetTitle("Momenta (GeV/c)"); // Axis titles r_p_reco_Jet1_CR->GetYaxis()->SetTitle("ratio"); @@ -1180,10 +1203,14 @@ void plot() { r_p_reco_Jet1_CR->GetYaxis()->SetTitleOffset(0.55); auto leg_ratio_reco_jets = new TLegend(0.68, 0.68, 0.88, 0.88); - leg_ratio_reco_jets->AddEntry(r_p_reco_Jet1_CR, "Jet1- Momenta Ratio", "l"); - leg_ratio_reco_jets->AddEntry(r_p_reco_Jet2_CR, "Jet2- Momenta Ratio", "l"); - leg_ratio_reco_jets->AddEntry(r_p_reco_Jet3_CR, "Jet3- Momenta Ratio", "l"); - leg_ratio_reco_jets->AddEntry(r_p_reco_Jet4_CR, "Jet4- Momenta Ratio", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet1_CR, "Jet1- noCR", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet1_SKI_100, "Jet1- SKI, kl=100", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet2_CR, "Jet2- noCR", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet2_SKI_100, "Jet2- SKI, kl=100", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet3_CR, "Jet3- noCR", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet3_SKI_100, "Jet3- SKI, kl=100", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet4_CR, "Jet4- noCR", "l"); + leg_ratio_reco_jets->AddEntry(r_p_reco_Jet4_SKI_100, "Jet4- SKI, kl=100", "l"); leg_ratio_reco_jets->Draw(); @@ -1216,19 +1243,27 @@ void plot() { h_theta_Jet1_Jet2_Nom->SetLineColor(kBlack); h_theta_Jet1_Jet2_Nom->SetLineWidth(3); h_theta_Jet1_Jet2_CR->SetLineColor(kRed); h_theta_Jet1_Jet2_CR->SetLineWidth(3); + h_theta_Jet1_Jet2_SKI_100->SetLineColor(kViolet+1); h_theta_Jet1_Jet2_SKI_100->SetLineWidth(3); + h_theta_Jet3_Jet4_Nom->SetLineColor(kBlue); h_theta_Jet3_Jet4_Nom->SetLineWidth(3); h_theta_Jet3_Jet4_CR->SetLineColor(kGreen); h_theta_Jet3_Jet4_CR->SetLineWidth(3); + h_theta_Jet3_Jet4_SKI_100->SetLineColor(kPink-8); h_theta_Jet3_Jet4_SKI_100->SetLineWidth(3); + h_theta_Jet1_Jet2_Nom->Draw("HIST"); h_theta_Jet1_Jet2_CR->Draw("HIST SAME"); + h_theta_Jet1_Jet2_SKI_100->Draw("HIST SAME"); h_theta_Jet3_Jet4_Nom->Draw("HIST SAME"); h_theta_Jet3_Jet4_CR->Draw("HIST SAME"); + h_theta_Jet3_Jet4_SKI_100->Draw("HIST SAME"); auto leg_theta_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); leg_theta_reco_jets->AddEntry(h_theta_Jet1_Jet2_Nom, "W1 Jets- Nom", "l"); leg_theta_reco_jets->AddEntry(h_theta_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_theta_reco_jets->AddEntry(h_theta_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); leg_theta_reco_jets->AddEntry(h_theta_Jet3_Jet4_Nom, "W2 Jets- Nom", "l"); leg_theta_reco_jets->AddEntry(h_theta_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_theta_reco_jets->AddEntry(h_theta_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_theta_reco_jets->Draw(); // Ratio plot @@ -1238,9 +1273,15 @@ void plot() { r_theta_Jet1_Jet2_CR->SetLineColor(kBlack); r_theta_Jet1_Jet2_CR->Draw("HIST"); r_theta_Jet1_Jet2_CR->SetLineWidth(3); + r_theta_Jet1_Jet2_SKI_100->SetLineColor(kBlue); + r_theta_Jet1_Jet2_SKI_100->Draw("HIST"); + r_theta_Jet1_Jet2_SKI_100->SetLineWidth(3); r_theta_Jet3_Jet4_CR->SetLineColor(kRed); r_theta_Jet3_Jet4_CR->Draw("HIST SAME"); r_theta_Jet3_Jet4_CR->SetLineWidth(3); + r_theta_Jet3_Jet4_SKI_100->SetLineColor(kViolet+1); + r_theta_Jet3_Jet4_SKI_100->Draw("HIST SAME"); + r_theta_Jet3_Jet4_SKI_100->SetLineWidth(3); r_theta_Jet1_Jet2_CR->GetXaxis()->SetTitle("#theta (radians)"); // Axis titles r_theta_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); @@ -1255,8 +1296,10 @@ void plot() { r_theta_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); auto leg_ratio_theta_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); - leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet1_Jet2_CR, "#theta W1 Jets", "l"); - leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet3_Jet4_CR, "#theta W2 Jets", "l"); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_ratio_theta_reco_jets->AddEntry(r_theta_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_ratio_theta_reco_jets->Draw(); @@ -1289,19 +1332,26 @@ void plot() { h_phi_Jet1_Jet2_Nom->SetLineColor(kBlack); h_phi_Jet1_Jet2_Nom->SetLineWidth(3); h_phi_Jet1_Jet2_CR->SetLineColor(kRed); h_phi_Jet1_Jet2_CR->SetLineWidth(3); + h_phi_Jet1_Jet2_SKI_100->SetLineColor(kViolet+1); h_phi_Jet1_Jet2_SKI_100->SetLineWidth(3); + h_phi_Jet3_Jet4_Nom->SetLineColor(kBlue); h_phi_Jet3_Jet4_Nom->SetLineWidth(3); h_phi_Jet3_Jet4_CR->SetLineColor(kGreen); h_phi_Jet3_Jet4_CR->SetLineWidth(3); + h_phi_Jet3_Jet4_SKI_100->SetLineColor(kPink-8); h_phi_Jet3_Jet4_SKI_100->SetLineWidth(3); h_phi_Jet1_Jet2_Nom->Draw("HIST"); h_phi_Jet1_Jet2_CR->Draw("HIST SAME"); + h_phi_Jet1_Jet2_SKI_100->Draw("HIST SAME"); h_phi_Jet3_Jet4_Nom->Draw("HIST SAME"); h_phi_Jet3_Jet4_CR->Draw("HIST SAME"); + h_phi_Jet3_Jet4_SKI_100->Draw("HIST SAME"); auto leg_phi_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); leg_phi_reco_jets->AddEntry(h_phi_Jet1_Jet2_Nom, "W1 Jets- Nom", "l"); leg_phi_reco_jets->AddEntry(h_phi_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_phi_reco_jets->AddEntry(h_phi_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); leg_phi_reco_jets->AddEntry(h_phi_Jet3_Jet4_Nom, "W2 Jets- Nom", "l"); leg_phi_reco_jets->AddEntry(h_phi_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_phi_reco_jets->AddEntry(h_phi_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_phi_reco_jets->Draw(); // Ratio plot @@ -1311,9 +1361,15 @@ void plot() { r_phi_Jet1_Jet2_CR->SetLineColor(kBlack); r_phi_Jet1_Jet2_CR->Draw("HIST"); r_phi_Jet1_Jet2_CR->SetLineWidth(3); + r_phi_Jet1_Jet2_SKI_100->SetLineColor(kBlue); + r_phi_Jet1_Jet2_SKI_100->Draw("HIST"); + r_phi_Jet1_Jet2_SKI_100->SetLineWidth(3); r_phi_Jet3_Jet4_CR->SetLineColor(kRed); r_phi_Jet3_Jet4_CR->Draw("HIST SAME"); r_phi_Jet3_Jet4_CR->SetLineWidth(3); + r_phi_Jet3_Jet4_SKI_100->SetLineColor(kViolet+1); + r_phi_Jet3_Jet4_SKI_100->Draw("HIST SAME"); + r_phi_Jet3_Jet4_SKI_100->SetLineWidth(3); r_phi_Jet1_Jet2_CR->GetXaxis()->SetTitle("#phi (radians)"); // Axis titles r_phi_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); @@ -1328,8 +1384,10 @@ void plot() { r_phi_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); auto leg_ratio_phi_reco_jets = new TLegend(0.725, 0.73, 0.88, 0.88); - leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet1_Jet2_CR, "#phi W1 Jets", "l"); - leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet3_Jet4_CR, "#phi W2 Jets", "l"); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_ratio_phi_reco_jets->AddEntry(r_phi_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_ratio_phi_reco_jets->Draw(); @@ -1362,19 +1420,26 @@ void plot() { h_chi_Jet1_Jet2_Nom->SetLineColor(kBlack); h_chi_Jet1_Jet2_Nom->SetLineWidth(3); h_chi_Jet1_Jet2_CR->SetLineColor(kRed); h_chi_Jet1_Jet2_CR->SetLineWidth(3); + h_chi_Jet1_Jet2_SKI_100->SetLineColor(kViolet+1); h_chi_Jet1_Jet2_SKI_100->SetLineWidth(3); + h_chi_Jet3_Jet4_Nom->SetLineColor(kBlue); h_chi_Jet3_Jet4_Nom->SetLineWidth(3); h_chi_Jet3_Jet4_CR->SetLineColor(kGreen); h_chi_Jet3_Jet4_CR->SetLineWidth(3); + h_chi_Jet3_Jet4_SKI_100->SetLineColor(kPink-8); h_chi_Jet3_Jet4_SKI_100->SetLineWidth(3); h_chi_Jet1_Jet2_Nom->Draw("HIST"); h_chi_Jet1_Jet2_CR->Draw("HIST SAME"); + h_chi_Jet1_Jet2_SKI_100->Draw("HIST SAME"); h_chi_Jet3_Jet4_Nom->Draw("HIST SAME"); h_chi_Jet3_Jet4_CR->Draw("HIST SAME"); - - auto leg_chi_reco_jets = new TLegend(0.15, 0.7, 0.35, 0.88); - leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_Nom, "#chi W1 Jets- Nom", "l"); - leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_CR, "#chi W1 Jets- no CR", "l"); - leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_Nom, "#chi W2 Jets- Nom", "l"); - leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_CR, "#chi W1 Jets- no CR", "l"); + h_chi_Jet3_Jet4_SKI_100->Draw("HIST SAME"); + + auto leg_chi_reco_jets = new TLegend(0.15, 0.73, 0.35, 0.88); + leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_Nom, "W1 Jets- Nom", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_Nom, "W2 Jets- Nom", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_chi_reco_jets->AddEntry(h_chi_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_chi_reco_jets->Draw(); // Ratio plot @@ -1384,9 +1449,15 @@ void plot() { r_chi_Jet1_Jet2_CR->SetLineColor(kBlack); r_chi_Jet1_Jet2_CR->Draw("HIST"); r_chi_Jet1_Jet2_CR->SetLineWidth(3); + r_chi_Jet1_Jet2_SKI_100->SetLineColor(kBlue); + r_chi_Jet1_Jet2_SKI_100->Draw("HIST"); + r_chi_Jet1_Jet2_SKI_100->SetLineWidth(3); r_chi_Jet3_Jet4_CR->SetLineColor(kRed); r_chi_Jet3_Jet4_CR->Draw("HIST SAME"); r_chi_Jet3_Jet4_CR->SetLineWidth(3); + r_chi_Jet3_Jet4_SKI_100->SetLineColor(kViolet+1); + r_chi_Jet3_Jet4_SKI_100->Draw("HIST SAME"); + r_chi_Jet3_Jet4_SKI_100->SetLineWidth(3); r_chi_Jet1_Jet2_CR->GetXaxis()->SetTitle("#chi (radians)"); // Axis titles r_chi_Jet1_Jet2_CR->GetYaxis()->SetTitle("ratio"); @@ -1401,8 +1472,10 @@ void plot() { r_chi_Jet1_Jet2_CR->GetYaxis()->SetTitleOffset(0.55); auto leg_ratio_chi_reco_jets = new TLegend(0.15, 0.75, 0.3, 0.9); - leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet1_Jet2_CR, "ratio- #chi W1 Jets", "l"); - leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet3_Jet4_CR, "ratio- #chi W2 Jets", "l"); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet1_Jet2_CR, "W1 Jets- CR", "l"); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet1_Jet2_SKI_100, "W1 Jets- SKI, kl=100", "l"); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet3_Jet4_CR, "W2 Jets- CR", "l"); + leg_ratio_chi_reco_jets->AddEntry(r_chi_Jet3_Jet4_SKI_100, "W2 Jets- SKI, kl=100", "l"); leg_ratio_chi_reco_jets->Draw(); From b4dbf58cba927122a7eb735bc109a51b4465cbb1 Mon Sep 17 00:00:00 2001 From: Kristen M Leibensperger Date: Thu, 7 Aug 2025 18:47:00 -0400 Subject: [PATCH 40/40] all histograms saved as branches --- PostCutCode/Root/AnalysisWWCR.cxx | 171 +++++++++++++++++++++--------- 1 file changed, 121 insertions(+), 50 deletions(-) diff --git a/PostCutCode/Root/AnalysisWWCR.cxx b/PostCutCode/Root/AnalysisWWCR.cxx index 3fc440f..713f59b 100644 --- a/PostCutCode/Root/AnalysisWWCR.cxx +++ b/PostCutCode/Root/AnalysisWWCR.cxx @@ -166,7 +166,7 @@ void AnalysisWWCR::run() { my_tree->Branch("b_theta_corr", &theta_corr); my_tree->Branch("b_phi_corr", &phi_corr); my_tree->Branch("b_chi_corr", &chi_corr); - // my_tree->Branch("b_delR_corr", &delR_corr); + my_tree->Branch("b_delR_corr", &delR_corr); my_tree->Branch("b_p_reco_Jet1", &p_reco_Jet1); my_tree->Branch("b_p_reco_Jet2", &p_reco_Jet2); @@ -174,10 +174,22 @@ void AnalysisWWCR::run() { my_tree->Branch("b_p_reco_Jet4", &p_reco_Jet4); my_tree->Branch("b_theta_Jet1_Jet2", &theta_Jet1_Jet2); my_tree->Branch("b_theta_Jet3_Jet4", &theta_Jet3_Jet4); + my_tree->Branch("b_theta_Jet1_Jet3", &theta_Jet1_Jet3); + my_tree->Branch("b_theta_Jet2_Jet4", &theta_Jet2_Jet4); + my_tree->Branch("b_theta_Jet1_Jet4", &theta_Jet1_Jet2); + my_tree->Branch("b_theta_Jet2_Jet3", &theta_Jet3_Jet4); my_tree->Branch("b_phi_Jet1_Jet2", &phi_Jet1_Jet2); my_tree->Branch("b_phi_Jet3_Jet4", &phi_Jet3_Jet4); + my_tree->Branch("b_phi_Jet1_Jet3", &phi_Jet1_Jet3); + my_tree->Branch("b_phi_Jet2_Jet4", &phi_Jet2_Jet4); + my_tree->Branch("b_phi_Jet1_Jet4", &phi_Jet1_Jet2); + my_tree->Branch("b_phi_Jet2_Jet3", &phi_Jet3_Jet4); my_tree->Branch("b_chi_Jet1_Jet2", &chi_Jet1_Jet2); my_tree->Branch("b_chi_Jet3_Jet4", &chi_Jet3_Jet4); + my_tree->Branch("b_chi_Jet1_Jet3", &chi_Jet1_Jet3); + my_tree->Branch("b_chi_Jet2_Jet4", &chi_Jet2_Jet4); + my_tree->Branch("b_chi_Jet1_Jet4", &chi_Jet1_Jet2); + my_tree->Branch("b_chi_Jet2_Jet3", &chi_Jet3_Jet4); my_tree->Branch("b_mass_W1", &mass_W1); my_tree->Branch("b_mass_W2", &mass_W2); @@ -270,23 +282,23 @@ void AnalysisWWCR::run() { if(i % 10000 == 0) std::cout<<"Done i: "<size(); ++i) { - int pdg_code = Wm_jet_truth->at(i); - std::cout << "W_1 daughter " << i << " PDG code: " << pdg_code << std::endl; - } + // for (size_t i = 0; i < Wm_jet_truth->size(); ++i) { + // int pdg_code = Wm_jet_truth->at(i); + // std::cout << "W_1 daughter " << i << " PDG code: " << pdg_code << std::endl; + // } - for (size_t i = 0; i < Wp_jet_truth->size(); ++i) { - int pdg_code = Wp_jet_truth->at(i); - std::cout << "W_2 daughter " << i << " PDG code: " << pdg_code << std::endl; - } + // for (size_t i = 0; i < Wp_jet_truth->size(); ++i) { + // int pdg_code = Wp_jet_truth->at(i); + // std::cout << "W_2 daughter " << i << " PDG code: " << pdg_code << std::endl; + // } - std::cout << " " << std::endl; + // std::cout << " " << std::endl; - nPrinted++; - } + // nPrinted++; + // } eventNum++; @@ -333,7 +345,7 @@ void AnalysisWWCR::run() { std::vector vec_theta_corr; std::vector vec_phi_corr; std::vector vec_chi_corr; - // std::vector vec_delR_corr; + std::vector vec_delR_corr; std::vector vec_ee_corr; std::vector vec_p_reco_Jet1; @@ -342,10 +354,22 @@ void AnalysisWWCR::run() { std::vector vec_p_reco_Jet4; std::vector vec_theta_Jet1_Jet2; std::vector vec_theta_Jet3_Jet4; + std::vector vec_theta_Jet1_Jet3; + std::vector vec_theta_Jet2_Jet4; + std::vector vec_theta_Jet1_Jet4; + std::vector vec_theta_Jet2_Jet3; std::vector vec_phi_Jet1_Jet2; std::vector vec_phi_Jet3_Jet4; + std::vector vec_phi_Jet1_Jet3; + std::vector vec_phi_Jet2_Jet4; + std::vector vec_phi_Jet1_Jet4; + std::vector vec_phi_Jet2_Jet3; std::vector vec_chi_Jet1_Jet2; std::vector vec_chi_Jet3_Jet4; + std::vector vec_chi_Jet1_Jet3; + std::vector vec_chi_Jet2_Jet4; + std::vector vec_chi_Jet1_Jet4; + std::vector vec_chi_Jet2_Jet3; std::vector vec_mass_W1; std::vector vec_mass_W2; @@ -416,21 +440,21 @@ void AnalysisWWCR::run() { std::vector flavLabels = {"b", "c", "s", "l", "g", "tau"}; - if (do_debug && nPrinted < maxPrint) { - for (const auto& [jetIdx, flavVec] : jetFlavScores) { - std::cout << "Jet " << jetIdx << " flavor scores:\n"; - for (size_t i = 0; i < flavVec.size(); ++i) { - std::cout << " " << flavLabels[i] << ": "; - if (std::abs(flavVec[i]) < 1e-6) { - std::cout << std::scientific << std::setprecision(2) << flavVec[i]; - } else { - std::cout << std::fixed << std::setprecision(6) << flavVec[i]; - } - std::cout << "\n"; - } - std::cout << std::endl; - } - } + // if (do_debug && nPrinted < maxPrint) { + // for (const auto& [jetIdx, flavVec] : jetFlavScores) { + // std::cout << "Jet " << jetIdx << " flavor scores:\n"; + // for (size_t i = 0; i < flavVec.size(); ++i) { + // std::cout << " " << flavLabels[i] << ": "; + // if (std::abs(flavVec[i]) < 1e-6) { + // std::cout << std::scientific << std::setprecision(2) << flavVec[i]; + // } else { + // std::cout << std::fixed << std::setprecision(6) << flavVec[i]; + // } + // std::cout << "\n"; + // } + // std::cout << std::endl; + // } + // } // Get the max flavor scores auto j0_MaxScoreIt = std::max_element(j0_flav.begin(), j0_flav.end()); @@ -443,24 +467,24 @@ void AnalysisWWCR::run() { int j2_maxScoreIdx = std::distance(j2_flav.begin(), j2_MaxScoreIt); int j3_maxScoreIdx = std::distance(j3_flav.begin(), j3_MaxScoreIt); - if (do_debug && nPrinted < maxPrint) { - std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; - std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; - std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; - std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; - std::cout << " " << std::endl; - } + // if (do_debug && nPrinted < maxPrint) { + // std::cout << "Jet 0: " << flavLabels[j0_maxScoreIdx] << " = " << *j0_MaxScoreIt << "\n"; + // std::cout << "Jet 1: " << flavLabels[j1_maxScoreIdx] << " = " << *j1_MaxScoreIt << "\n"; + // std::cout << "Jet 2: " << flavLabels[j2_maxScoreIdx] << " = " << *j2_MaxScoreIt << "\n"; + // std::cout << "Jet 3: " << flavLabels[j3_maxScoreIdx] << " = " << *j3_MaxScoreIt << "\n"; + // std::cout << " " << std::endl; + // } std::array maxScoreIdx {j0_maxScoreIdx,j1_maxScoreIdx,j2_maxScoreIdx,j3_maxScoreIdx}; - if (nPrinted < maxPrint) { - std::cout << "maxScoreIdx: "; - for (int ScoreIdx : maxScoreIdx) { - std::cout << ScoreIdx << " "; - } - std::cout << std::endl; - std::cout << " " << std::endl; - } + // if (nPrinted < maxPrint) { + // std::cout << "maxScoreIdx: "; + // for (int ScoreIdx : maxScoreIdx) { + // std::cout << ScoreIdx << " "; + // } + // std::cout << std::endl; + // std::cout << " " << std::endl; + // } std::map> jetFlavMaxScore; for (std::size_t i = 0; i < maxScoreIdx.size(); ++i){ @@ -558,14 +582,14 @@ void AnalysisWWCR::run() { double jetSub_cos_phi_4 = cos(jetSub_phi_4); double eec_jetSub_phi_4 = 0.5 * (1 - jetSub_cos_phi_4); - // double jetSub_delR = sqrt(jetSub_eta_3 * jetSub_eta_3 + jetSub_phi_4 * jetSub_phi_4); + double jetSub_delR = sqrt(jetSub_eta_3 * jetSub_eta_3 + jetSub_phi_4 * jetSub_phi_4); vec_p_jet_const_1.push_back(subJet_1.P()); vec_p_jet_const_2.push_back(subJet_2.P()); vec_theta_corr.push_back(jetSub_theta_2); vec_phi_corr.push_back(jetSub_phi_4); vec_chi_corr.push_back(jetSub_chi_1); - // vec_delR_corr.push_back(jetSub_delR); + vec_delR_corr.push_back(jetSub_delR); vec_ee_corr.push_back(eec_jetSub_theta_2); h_chi_subjet->Fill(jetSub_chi_1); @@ -864,6 +888,10 @@ void AnalysisWWCR::run() { double chi_c_l0 = W1_j1.Angle(W1_j2.Vect()); double chi_l1_l2 = W2_j1.Angle(W2_j2.Vect()); + double chi_c_l1 = W1_j1.Angle(W2_j1.Vect()); + double chi_l0_l2 = W1_j2.Angle(W2_j2.Vect()); + double chi_c_l2 = W1_j1.Angle(W2_j2.Vect()); + double chi_l0_l1 = W1_j2.Angle(W2_j1.Vect()); // double cos_chi_c_l0 = cos(chi_c_l0); // double cos_chi_l1_l2 = cos(chi_l1_l2); // double ee_correlation_chi_c_l0 = 0.5 * (1 - cos_chi_c_l0); @@ -871,6 +899,10 @@ void AnalysisWWCR::run() { double theta_c_l0 = std::fabs(W1_j1.Theta() - W1_j2.Theta()); double theta_l1_l2 = std::fabs(W2_j1.Theta() - W2_j2.Theta()); + double theta_c_l1 = std::fabs(W1_j1.Theta() - W2_j1.Theta()); + double theta_l0_l2 = std::fabs(W1_j2.Theta() - W2_j2.Theta()); + double theta_c_l2 = std::fabs(W1_j1.Theta() - W2_j2.Theta()); + double theta_l0_l1 = std::fabs(W1_j2.Theta() - W2_j1.Theta()); // double cos_theta_c_l0 = cos(theta_c_l0); // double cos_theta_l1_l2 = cos(theta_l1_l2); // double ee_correlation_theta_c_l0 = 0.5 * (1 - cos_theta_c_l0); @@ -881,6 +913,10 @@ void AnalysisWWCR::run() { double phi_c_l0 = W1_j1.Phi() - W1_j2.Phi(); double phi_l1_l2 = W2_j1.Phi() - W2_j2.Phi(); + double phi_c_l1 = W1_j1.Phi() - W2_j1.Phi(); + double phi_l0_l2 = W1_j2.Phi() - W2_j2.Phi(); + double phi_c_l2 = W1_j1.Phi() - W2_j2.Phi(); + double phi_l0_l1 = W1_j2.Phi() - W2_j1.Phi(); // double cos_phi_c_l0 = cos(phi_c_l0); // double cos_phi_l1_l2 = cos(phi_l1_l2); // double ee_correlation_phi_c_l0 = 0.5 * (1 - cos_phi_c_l0); @@ -888,30 +924,65 @@ void AnalysisWWCR::run() { vec_theta_Jet1_Jet2.push_back(theta_c_l0); vec_theta_Jet3_Jet4.push_back(theta_l1_l2); + vec_theta_Jet1_Jet3.push_back(theta_c_l1); + vec_theta_Jet2_Jet4.push_back(theta_l0_l2); + vec_theta_Jet1_Jet4.push_back(theta_c_l2); + vec_theta_Jet2_Jet3.push_back(theta_l0_l1); + vec_phi_Jet1_Jet2.push_back(phi_c_l0); vec_phi_Jet3_Jet4.push_back(phi_l1_l2); + vec_phi_Jet1_Jet3.push_back(phi_c_l1); + vec_phi_Jet2_Jet4.push_back(phi_l0_l2); + vec_phi_Jet1_Jet4.push_back(phi_c_l2); + vec_phi_Jet2_Jet3.push_back(phi_l0_l1); + vec_chi_Jet1_Jet2.push_back(chi_c_l0); vec_chi_Jet3_Jet4.push_back(chi_l1_l2); + vec_chi_Jet1_Jet3.push_back(chi_c_l1); + vec_chi_Jet2_Jet4.push_back(chi_l0_l2); + vec_chi_Jet1_Jet4.push_back(chi_c_l2); + vec_phi_Jet2_Jet3.push_back(chi_l0_l1); mc_weight = norm_weight; ee_corr = vec_ee_corr; p_jet_const_1 = vec_p_jet_const_1; p_jet_const_2 = vec_p_jet_const_2; theta_corr = vec_theta_corr; - phi_corr= vec_phi_corr; - chi_corr=vec_chi_corr; - // delR_corr = vec_delR_corr; + phi_corr = vec_phi_corr; + chi_corr = vec_chi_corr; + delR_corr = vec_delR_corr; + + // if (!vec_delR_corr.empty()) { + // std::cout << "vec_delR_corr[0] = " << vec_delR_corr[0] << std::endl; + // } + + // std::cout << "Assigned delR_corr, size: " << delR_corr.size() << std::endl; p_reco_Jet1 = vec_p_reco_Jet1; p_reco_Jet2 = vec_p_reco_Jet2; p_reco_Jet3 = vec_p_reco_Jet3; p_reco_Jet4 = vec_p_reco_Jet4; + theta_Jet1_Jet2 = vec_theta_Jet1_Jet2; theta_Jet3_Jet4 = vec_theta_Jet3_Jet4; + theta_Jet1_Jet3 = vec_theta_Jet1_Jet3; + theta_Jet2_Jet4 = vec_theta_Jet2_Jet4; + theta_Jet1_Jet4 = vec_theta_Jet1_Jet4; + theta_Jet2_Jet3 = vec_theta_Jet2_Jet3; + phi_Jet1_Jet2 = vec_phi_Jet1_Jet2; phi_Jet3_Jet4 = vec_phi_Jet3_Jet4; + phi_Jet1_Jet3 = vec_phi_Jet1_Jet3; + phi_Jet2_Jet4 = vec_phi_Jet2_Jet4; + phi_Jet1_Jet4 = vec_phi_Jet1_Jet4; + phi_Jet2_Jet3 = vec_phi_Jet2_Jet3; + chi_Jet1_Jet2 = vec_chi_Jet1_Jet2; chi_Jet3_Jet4 = vec_chi_Jet3_Jet4; + chi_Jet1_Jet3 = vec_chi_Jet1_Jet3; + chi_Jet2_Jet4 = vec_chi_Jet2_Jet4; + chi_Jet1_Jet4 = vec_chi_Jet1_Jet4; + chi_Jet2_Jet3 = vec_chi_Jet2_Jet3; mass_W1 = vec_mass_W1; mass_W2 = vec_mass_W2;