14 map<string, double> Variables;
15 Variables[
"ThrustMin"] = -999. * 1000.;
16 Variables[
"ThrustMaj"] = -999. * 1000.;
19 if(clusters.size() < 2)
return Variables;
21 const bool useThreeD =
true;
40 double thrust_major = -1;
41 double thrust_minor = -1;
43 if(clusters.size() < 4)
return Variables;
45 std::vector<fastjet::PseudoJet>::const_iterator iBeg = clusters.begin();
46 std::vector<fastjet::PseudoJet>::const_iterator iEnd = clusters.end();
48 TVector3 thrust(0,0,0);
54 short add0[20] = { 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,-1,-1,-1,-1,-1,-1 };
55 short add1[20] = { 0, 1, 0, 0, 1, 1, 1, 1,-1,-1,-1,-1, 1, 1, 1, 1,-1,-1,-1,-1 };
56 short add2[20] = { 0, 0, 1, 0, 1, 1,-1,-1, 1, 1,-1,-1, 1, 1,-1,-1, 1, 1,-1,-1 };
57 short add3[20] = { 0, 0, 0, 1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1 };
59 std::vector<fastjet::PseudoJet> clusters_Esorted = fastjet::sorted_by_E(clusters);
60 std::vector<fastjet::PseudoJet> v_copy(4);
61 for(
int i=0; i<4; i++) {
62 v_copy[i] = clusters_Esorted[i];
66 int max_tests =
min<int>(20, distance(iBeg, iEnd));
68 n_0[n_tests]=TVector3(0,0,0);
72 add0[n_tests] * TVector3(v_copy.at(0).px(), v_copy.at(0).py(), v_copy.at(0).pz()) +
73 add1[n_tests] * TVector3(v_copy.at(1).px(), v_copy.at(1).py(), v_copy.at(1).pz()) +
74 add2[n_tests] * TVector3(v_copy.at(2).px(), v_copy.at(2).py(), v_copy.at(2).pz()) +
75 add3[n_tests] * TVector3(v_copy.at(3).px(), v_copy.at(3).py(), v_copy.at(3).pz());
81 if (n_0[n_tests].Mag() > 0)
82 n_0[n_tests] *= 1/n_0[n_tests].Mag();
88 for (std::vector<fastjet::PseudoJet>::const_iterator i = iBeg; i != iEnd; ++i) {
89 const fastjet::PseudoJet &itr = *i;
90 if ((itr).px() * n_0[n_tests].
x() +
91 (itr).py() * n_0[n_tests].
y() +
92 (itr).pz() * n_0[n_tests].
z() > 0)
93 n_1 += TVector3((itr).px(), (itr).py(), (itr).pz());
95 n_1 -= TVector3((itr).px(), (itr).py(), (itr).pz());
106 run = (n_0[n_tests] != n_1) && (-n_0[n_tests] != n_1) && loop++ < 10;
112 if (n_tests > 0 && (n_0[0] == n_0[n_tests] || n_0[0] == -n_0[n_tests])) agree++;
113 if (n_tests > 0 && n_0[0] != n_0[n_tests] && n_0[0] != -n_0[n_tests]) disagree++;
117 }
while ((disagree > 0 || agree < 4) && ++n_tests < max_tests);
126 double denominator = 0;
127 double numerator_t = 0;
128 double numerator_m = 0;
129 for(std::vector<fastjet::PseudoJet>::const_iterator i = iBeg; i != iEnd; ++i) {
130 const fastjet::PseudoJet & itr = *i;
132 TLorentzVector v((itr).px(), (itr).py(), (itr).pz(), (itr).e());
133 TVector3 c(v.Vect());
134 numerator_t += fabs(c.Dot(n_0[n_tests]));
135 numerator_m += (c.Cross(n_0[n_tests])).Mag();
136 denominator += c.Mag();
139 if(denominator < 1e-20) {
143 if (numerator_t / denominator > thrust_major) {
144 thrust_major = numerator_t / denominator;
145 thrust_minor = numerator_m / denominator;
148 }
while (disagree > 0 && ++n_tests < max_tests);
150 Variables[
"ThrustMin"] = thrust_minor;
151 Variables[
"ThrustMaj"] = thrust_major;