19 using namespace ROOT::VecOps;
20 using RNode = ROOT::RDF::RNode;
21 using rvec_f =
const RVec<float> &;
22 using rvec_i =
const RVec<int> &;
23 const auto z_mass = 91.2;
26 RVec<RVec<size_t>> reco_zz_to_4l(rvec_f pt, rvec_f eta, rvec_f phi, rvec_f mass, rvec_i charge)
28 RVec<RVec<size_t>> idx(2);
29 idx[0].reserve(2); idx[1].reserve(2);
32 auto idx_cmb = Combinations(pt, 2);
34 size_t best_i1 = 0;
size_t best_i2 = 0;
35 for (
size_t i = 0; i < idx_cmb[0].size(); i++) {
36 const auto i1 = idx_cmb[0][i];
37 const auto i2 = idx_cmb[1][i];
38 if (charge[i1] != charge[i2]) {
39 ROOT::Math::PtEtaPhiMVector p1(pt[i1], eta[i1], phi[i1], mass[i1]);
40 ROOT::Math::PtEtaPhiMVector p2(pt[i2], eta[i2], phi[i2], mass[i2]);
41 const auto this_mass = (p1 + p2).M();
42 if (std::abs(z_mass - this_mass) < std::abs(z_mass - best_mass)) {
43 best_mass = this_mass;
49 idx[0].emplace_back(best_i1);
50 idx[0].emplace_back(best_i2);
53 for (
size_t i = 0; i < 4; i++) {
54 if (i != best_i1 && i != best_i2) {
55 idx[1].emplace_back(i);
64 RVec<float> compute_z_masses_4l(
const RVec<RVec<size_t>> &idx, rvec_f pt, rvec_f eta, rvec_f phi, rvec_f mass)
66 RVec<float> z_masses(2);
67 for (
size_t i = 0; i < 2; i++) {
68 const auto i1 = idx[i][0];
const auto i2 = idx[i][1];
69 ROOT::Math::PtEtaPhiMVector p1(pt[i1], eta[i1], phi[i1], mass[i1]);
70 ROOT::Math::PtEtaPhiMVector p2(pt[i2], eta[i2], phi[i2], mass[i2]);
71 z_masses[i] = (p1 + p2).M();
73 if (std::abs(z_masses[0] - z_mass) < std::abs(z_masses[1] - z_mass)) {
76 return Reverse(z_masses);
81 float compute_higgs_mass_4l(
const RVec<RVec<size_t>> &idx, rvec_f pt, rvec_f eta, rvec_f phi, rvec_f mass)
83 const auto i1 = idx[0][0];
const auto i2 = idx[0][1];
84 const auto i3 = idx[1][0];
const auto i4 = idx[1][1];
85 ROOT::Math::PtEtaPhiMVector p1(pt[i1], eta[i1], phi[i1], mass[i1]);
86 ROOT::Math::PtEtaPhiMVector p2(pt[i2], eta[i2], phi[i2], mass[i2]);
87 ROOT::Math::PtEtaPhiMVector p3(pt[i3], eta[i3], phi[i3], mass[i3]);
88 ROOT::Math::PtEtaPhiMVector p4(pt[i4], eta[i4], phi[i4], mass[i4]);
89 return (p1 + p2 + p3 + p4).M();
93 RVec<float> compute_z_masses_2el2mu(rvec_f el_pt, rvec_f el_eta, rvec_f el_phi, rvec_f el_mass, rvec_f mu_pt,
94 rvec_f mu_eta, rvec_f mu_phi, rvec_f mu_mass)
96 ROOT::Math::PtEtaPhiMVector p1(mu_pt[0], mu_eta[0], mu_phi[0], mu_mass[0]);
97 ROOT::Math::PtEtaPhiMVector p2(mu_pt[1], mu_eta[1], mu_phi[1], mu_mass[1]);
98 ROOT::Math::PtEtaPhiMVector p3(el_pt[0], el_eta[0], el_phi[0], el_mass[0]);
99 ROOT::Math::PtEtaPhiMVector p4(el_pt[1], el_eta[1], el_phi[1], el_mass[1]);
100 auto mu_z = (p1 + p2).M();
101 auto el_z = (p3 + p4).M();
102 RVec<float> z_masses(2);
103 if (std::abs(mu_z - z_mass) < std::abs(el_z - z_mass)) {
114 float compute_higgs_mass_2el2mu(rvec_f el_pt, rvec_f el_eta, rvec_f el_phi, rvec_f el_mass, rvec_f mu_pt, rvec_f mu_eta,
115 rvec_f mu_phi, rvec_f mu_mass)
117 ROOT::Math::PtEtaPhiMVector p1(mu_pt[0], mu_eta[0], mu_phi[0], mu_mass[0]);
118 ROOT::Math::PtEtaPhiMVector p2(mu_pt[1], mu_eta[1], mu_phi[1], mu_mass[1]);
119 ROOT::Math::PtEtaPhiMVector p3(el_pt[0], el_eta[0], el_phi[0], el_mass[0]);
120 ROOT::Math::PtEtaPhiMVector p4(el_pt[1], el_eta[1], el_phi[1], el_mass[1]);
121 return (p1 + p2 + p3 + p4).M();
124 bool filter_z_dr(
const RVec<RVec<size_t>> &idx, rvec_f eta, rvec_f phi)
126 for (
size_t i = 0; i < 2; i++) {
127 const auto i1 = idx[i][0];
128 const auto i2 = idx[i][1];
129 const auto dr = DeltaR(eta[i1], eta[i2], phi[i1], phi[i2]);
137 bool pt_cuts(rvec_f mu_pt, rvec_f el_pt)
139 auto mu_pt_sorted = Reverse(Sort(mu_pt));
140 if (mu_pt_sorted[0] > 20 && mu_pt_sorted[1] > 10) {
143 auto el_pt_sorted = Reverse(Sort(el_pt));
144 if (el_pt_sorted[0] > 20 && el_pt_sorted[1] > 10) {
150 bool dr_cuts(rvec_f mu_eta, rvec_f mu_phi, rvec_f el_eta, rvec_f el_phi)
152 auto mu_dr = DeltaR(mu_eta[0], mu_eta[1], mu_phi[0], mu_phi[1]);
153 auto el_dr = DeltaR(el_eta[0], el_eta[1], el_phi[0], el_phi[1]);
154 if (mu_dr < 0.02 || el_dr < 0.02) {