21 const TLorentzVector& me_t_b,
22 double mass_t,
double mass_wp,
23 const TLorentzVector& me_tbar_lm,
24 const TLorentzVector& me_tbar_bbar,
25 double mass_tbar,
double mass_wm,
27 double me_mey)
const {
28 std::vector<std::pair<TLorentzVector, TLorentzVector> > lvs;
31 std::cout <<
"Starting SOLVE\n";
32 std::cout <<
"lp " << me_t_lp <<
"\n";
33 std::cout <<
"lm " << me_tbar_lm <<
"\n";
34 std::cout <<
"b " << me_t_b <<
"\n";
35 std::cout <<
"bbar " << me_tbar_bbar <<
"\n";
36 std::cout <<
"met_ex " << me_mex <<
"\n";
37 std::cout <<
"met_ey " << me_mey <<
"\n";
38 std::cout <<
"mt " <<
mass_t <<
"\n";
39 std::cout <<
"mtbar " << mass_tbar <<
"\n";
40 std::cout <<
"mWp " << mass_wp <<
"\n";
41 std::cout <<
"mWm " << mass_wm <<
"\n";
44 const double Elp = me_t_lp.E();
45 const double mlp = me_t_lp.M();
46 const double plpx = me_t_lp.Px();
47 const double plpy = me_t_lp.Py();
48 const double plpz = me_t_lp.Pz();
49 const TVector3
plp = 1. * me_t_lp.Vect();
51 const double Eb = me_t_b.E();
52 const double pbx = me_t_b.Px();
53 const double pby = me_t_b.Py();
54 const double pbz = me_t_b.Pz();
55 const double mb = me_t_b.M();
56 const TVector3
pb = 1. * me_t_b.Vect();
59 const double Elm = me_tbar_lm.E();
60 const double mlm = me_tbar_lm.M();
61 const double plmx = me_tbar_lm.Px();
62 const double plmy = me_tbar_lm.Py();
63 const double plmz = me_tbar_lm.Pz();
64 const TVector3 plm = me_tbar_lm.Vect();
66 const double Ebbar = me_tbar_bbar.E();
67 const double pbbarx = me_tbar_bbar.Px();
68 const double pbbary = me_tbar_bbar.Py();
69 const double pbbarz = me_tbar_bbar.Pz();
70 const double mbbar = me_tbar_bbar.M();
71 const TVector3 pbbar = me_tbar_bbar.Vect();
74 std::cout <<
"mex and mey " << me_mex <<
" " << me_mey <<
"\n";
75 std::cout <<
"Starting Calculation\n";
76 std::cout <<
"Calculating a\n";
79 double a1 = (Eb + Elp) * (mass_wp * mass_wp - mlp * mlp)
81 + 2 * Eb * Elp * Elp - 2 * Elp *
pb *
plp;
83 double a2 = 2 * (Eb * plpx - Elp * pbx);
84 double a3 = 2 * (Eb * plpy - Elp * pby);
85 double a4 = 2 * (Eb * plpz - Elp * pbz);
88 std::cout <<
"a1 : " << a1 <<
"\n";
89 std::cout <<
"a2 : " << a2 <<
"\n";
90 std::cout <<
"a3 : " << a3 <<
"\n";
91 std::cout <<
"a4 : " << a4 <<
"\n";
99 double b1 = (Ebbar + Elm) * (mass_wm * mass_wm - mlm * mlm)
100 - Elm * (mass_tbar * mass_tbar - mbbar * mbbar - mlm * mlm)
101 + 2 * Ebbar * Elm * Elm - 2 * Elm * pbbar * plm;
103 double b2 = 2 * (Ebbar * plmx - Elm * pbbarx);
104 double b3 = 2 * (Ebbar * plmy - Elm * pbbary);
105 double b4 = 2 * (Ebbar * plmz - Elm * pbbarz);
108 std::cout <<
"Calculating b\n";
109 std::cout <<
"b1 : " << b1 <<
"\n";
110 std::cout <<
"b2 : " << b2 <<
"\n";
111 std::cout <<
"b3 : " << b3 <<
"\n";
112 std::cout <<
"b4 : " << b4 <<
"\n";
122 std::cout <<
"Calculating c\n";
125 double c22 = (mass_wp * mass_wp - mlp * mlp) * (mass_wp * mass_wp - mlp * mlp)
126 - 4 * (Elp * Elp - plpz * plpz) * (a1 / a4) * (a1 / a4)
127 - 4 * (mass_wp * mass_wp - mlp * mlp) * plpz * a1 / a4;
129 double c21 = 4 * (mass_wp * mass_wp - mlp * mlp) * (plpx - plpz * a2 / a4)
130 - 8 * (Elp * Elp - plpz * plpz) * a1 * a2 / (a4 * a4)
131 - 8 * plpx * plpz * a1 / a4;
133 double c20 = -4 * (Elp * Elp - plpx * plpx)
134 - 4 * (Elp * Elp - plpz * plpz) * (a2 / a4) * (a2 / a4)
135 - 8 * plpx * plpz * a2 / a4;
137 double c11 = 4 * (mass_wp * mass_wp - mlp * mlp) * (plpy - plpz * a3 / a4)
138 - 8 * (Elp * Elp - plpz * plpz) * a1 * a3 / (a4 * a4)
139 - 8 * plpy * plpz * a1 / a4;
141 double c10 = -8 * (Elp * Elp - plpz * plpz) * a2 * a3 / (a4 * a4)
143 - 8 * plpx * plpz * a3 / a4
144 - 8 * plpy * plpz * a2 / a4;
146 double c00 = -4 * (Elp * Elp - plpy * plpy)
147 - 4 * (Elp * Elp - plpz * plpz) * (a3 / a4) * (a3 / a4)
148 - 8 * plpy * plpz * a3 / a4;
162 std::cout <<
"c22 : " << c22 <<
"\n";
163 std::cout <<
"c21 : " << c21 <<
"\n";
164 std::cout <<
"c20 : " << c20 <<
"\n";
165 std::cout <<
"c11 : " << c11 <<
"\n";
166 std::cout <<
"c10 : " << c10 <<
"\n";
167 std::cout <<
"c00 : " << c00 <<
"\n";
178 std::cout <<
"Calculating d'\n";
181 double dp22 =
pow(mass_wm * mass_wm - mlm * mlm, 2)
182 - 4 * (Elm * Elm - plmz * plmz) * (b1 / b4) * (b1 / b4)
183 - 4 * (mass_wm * mass_wm - mlm * mlm) * plmz * b1 / b4;
185 double dp21 = 4 * (mass_wm * mass_wm - mlm * mlm) * (plmx - plmz * b2 / b4)
186 - 8 * (Elm * Elm - plmz * plmz) * b1 * b2 / (b4 * b4)
187 - 8 * plmx * plmz * b1 / b4;
189 double dp20 = -4 * (Elm * Elm - plmx * plmx)
190 - 4 * (Elm * Elm - plmz * plmz) * (b2 / b4) * (b2 / b4)
191 - 8 * plmx * plmz * b2 / b4;
193 double dp11 = 4 * (mass_wm * mass_wm - mlm * mlm) * (plmy - plmz * b3 / b4)
194 - 8 * (Elm * Elm - plmz * plmz) * b1 * b3 / (b4 * b4)
195 - 8 * plmy * plmz * b1 / b4;
197 double dp10 = -8 * (Elm * Elm - plmz * plmz) * b2 * b3 / (b4 * b4)
199 - 8 * plmx * plmz * b3 / b4
200 - 8 * plmy * plmz * b2 / b4;
202 double dp00 = -4 * (Elm * Elm - plmy * plmy)
203 - 4 * (Elm * Elm - plmz * plmz) * (b3 / b4) * (b3 / b4)
204 - 8 * plmy * plmz * b3 / b4;
206 dp22 = b4 * b4 * dp22;
207 dp21 = b4 * b4 * dp21;
208 dp20 = b4 * b4 * dp20;
209 dp11 = b4 * b4 * dp11;
210 dp10 = b4 * b4 * dp10;
211 dp00 = b4 * b4 * dp00;
214 std::cout <<
"dp22 : " << dp22 <<
"\n";
215 std::cout <<
"dp21 : " << dp21 <<
"\n";
216 std::cout <<
"dp20 : " << dp20 <<
"\n";
217 std::cout <<
"dp11 : " << dp11 <<
"\n";
218 std::cout <<
"dp10 : " << dp10 <<
"\n";
219 std::cout <<
"dp00 : " << dp00 <<
"\n";
231 std::cout <<
"Calculating d\n";
234 const double d22 = dp22
235 + me_mex * me_mex * dp20
236 + me_mey * me_mey * dp00
237 + me_mex * me_mey * dp10
241 const double d21 = -1 * dp21
245 const double d20 = dp20;
246 const double d11 = -1 * dp11
250 const double d10 = dp10;
251 const double d00 = dp00;
254 std::cout <<
"d22 : " << d22 <<
"\n";
255 std::cout <<
"d21 : " << d21 <<
"\n";
256 std::cout <<
"d20 : " << d20 <<
"\n";
257 std::cout <<
"d11 : " << d11 <<
"\n";
258 std::cout <<
"d10 : " << d10 <<
"\n";
259 std::cout <<
"d00 : " << d00 <<
"\n";
270 std::cout <<
"Calculating h\n";
273 const double h4 = c00 * c00 * d22 * d22
274 + c11 * d22 * (c11 * d00 - c00 * d11)
275 + c00 * c22 * (d11 * d11 - 2 * d00 * d22)
276 + c22 * d00 * (c22 * d00 - c11 * d11);
278 const double h3 = c00 * d21 * (2 * c00 * d22 - c11 * d11)
279 + c00 * d11 * (2 * c22 * d10 + c21 * d11)
280 + c22 * d00 * (2 * c21 * d00 - c11 * d10)
281 - c00 * d22 * (c11 * d10 + c10 * d11)
282 - 2 * c00 * d00 * (c22 * d21 + c21 * d22)
283 - d00 * d11 * (c11 * c21 + c10 * c22)
284 + c11 * d00 * (c11 * d21 + 2 * c10 * d22);
286 const double h2 = c00 * c00 * (2 * d22 * d20 + d21 * d21)
287 - c00 * d21 * (c11 * d10 + c10 * d11)
288 + c11 * d20 * (c11 * d00 - c00 * d11)
289 + c00 * d10 * (c22 * d10 - c10 * d22)
290 + c00 * d11 * (2 * c21 * d10 + c20 * d11)
291 + (2 * c22 * c20 + c21 * c21) * d00 * d00
292 - 2 * c00 * d00 * (c22 * d20 + c21 * d21 + c20 * d22)
293 + c10 * d00 * (2 * c11 * d21 + c10 * d22)
294 - d00 * d10 * (c11 * c21 + c10 * c22)
295 - d00 * d11 * (c11 * c20 + c10 * c21);
310 const double h1 = c00 * d21 * (2 * c00 * d20 - c10 * d10)
311 - c00 * d20 * (c11 * d10 + c10 * d11)
312 + c00 * d10 * (c21 * d10 + 2 * c20 * d11)
313 - 2 * c00 * d00 * (c21 * d20 + c20 * d21)
314 + c10 * d00 * (2 * c11 * d20 + c10 * d21)
315 + c20 * d00 * (2 * c21 * d00 - c10 * d11)
316 - d00 * d10 * (c11 * c20 + c10 * c21);
318 const double h0 = c00 * c00 * d20 * d20
319 + c10 * d20 * (c10 * d00 - c00 * d10)
320 + c20 * d10 * (c00 * d10 - c10 * d00)
321 + c20 * d00 * (c20 * d00 - 2 * c00 * d20);
324 std::cout <<
"h4 : " << h4 <<
"\n";
325 std::cout <<
"h3 : " << h3 <<
"\n";
326 std::cout <<
"h2 : " << h2 <<
"\n";
327 std::cout <<
"h1 : " <<
h1 <<
"\n";
328 std::cout <<
"h0 : " <<
h0 <<
"\n";
330 std::cout <<
"Messy Calculate Over\n";
334 std::cout <<
"gnuplot command\n";
337 s <<
h0 /
h0 <<
"*x*x*x*x + " <<
338 h1 /
h0 <<
"*x*x*x + " <<
339 h2 /
h0 <<
"*x*x + " <<
340 h3 /
h0 <<
"*x + " << h4 /
h0;
342 std::string
fn =
s.str();
344 std::cout <<
"plot " <<
fn <<
"\n";
350 std::cout <<
"--------------------------\n";
351 std::cout <<
"Kinematic Solutions\n";
356 for (std::vector<double>::const_iterator
it = pvxs.begin();
it != pvxs.end(); ++
it, ++
num) {
359 double pvbarx = me_mex - *
it;
364 double c1 = c10 * pvx + c11;
365 double c2 = c20 * pvx * pvx + c21 * pvx + c22;
367 double d1 = d10 * pvx + d11;
368 double d2 = d20 * pvx * pvx + d21 * pvx + d22;
371 double pvbary = me_mey - pvy;
373 double pvz = (a1 + a2 * pvx + a3 * pvy) / (-a4);
374 double pvbarz = (b1 + b2 * pvbarx + b3 * pvbary) / (-b4);
376 double pvE = sqrt(pvx * pvx + pvy * pvy + pvz * pvz);
377 double pvbarE = sqrt(pvbarx * pvbarx + pvbary * pvbary + pvbarz * pvbarz);
379 TLorentzVector tlv1(pvx, pvy, pvz, pvE);
380 TLorentzVector tlv2(pvbarx, pvbary, pvbarz, pvbarE);
383 std::cout <<
"Solution " <<
num <<
"\n";
384 std::cout << tlv1 << std::endl;
385 std::cout << tlv2 << std::endl;
386 std::cout <<
"----------" <<
"\n";
389 std::pair<TLorentzVector, TLorentzVector>
p(tlv1, tlv2);
394 if (
m_debug) std::cout <<
"Finished Kinematic Solution" <<
"\n";
400 if (
m_debug) std::cout <<
"Solve Quartic\n";
403 const double nh1 =
h1 /
h0;
404 const double nh2 = h2 /
h0;
405 const double nh3 = h3 /
h0;
406 const double nh4 = h4 /
h0;
409 const double k1 = nh2 - 3 * nh1 * nh1 / 8.;
410 const double k2 = nh3 + nh1 * nh1 * nh1 / 8. - nh1 * nh2 / 2.;
411 const double k3 = nh4 - 3 *
pow(nh1, 4) / 256. + nh1 * nh1 * nh2 / 16. - nh1 * nh3 / 4.;
414 std::cout <<
"e " << k1 <<
"\n";
415 std::cout <<
"f " << k2 <<
"\n";
416 std::cout <<
"g " << k3 <<
"\n";
419 std::vector<double> sols =
solveCubic(2. * k1, k1 * k1 - 4. * k3, -k2 * k2);
424 for (std::vector<double>::const_iterator
it = sols.begin();
it != sols.end(); ++
it) {
425 if (*
it > 0.)
t1 = sqrt(*
it);
430 double t2 = (k1 +
t1 *
t1 - k2 /
t1) / 2.;
432 if (
m_debug) std::cout <<
"first quadratic\n";
436 std::vector<double> pvxs;
438 for (std::vector<double>::const_iterator
it = s1.begin();
it != s1.end(); ++
it) {
439 if (
m_debug) std::cout <<
"pvx " << *
it - nh1 / 4. <<
"\n";
441 pvxs.push_back(*
it - nh1 / 4.);
445 if (
m_debug) std::cout <<
"second quadratic\n";
449 for (std::vector<double>::const_iterator
it =
s2.begin();
it !=
s2.end(); ++
it) {
450 if (
m_debug) std::cout <<
"pvx " << *
it - nh1 / 4. <<
"\n";
452 pvxs.push_back(*
it - nh1 / 4.);
459 std::vector<double> sols;
461 const double q = (s1 * s1 - 3 *
s2) / 9.;
462 const double r = (2 * s1 * s1 * s1 - 9 * s1 *
s2 + 27 *
s3) / 54.;
465 std::cout <<
"Solve Cubic\n";
466 std::cout <<
"q " <<
q <<
"\n";
467 std::cout <<
"r " <<
r <<
"\n";
470 if (
r *
r <
q *
q *
q) {
471 const double theta = acos(
r / sqrt(
q *
q *
q));
472 const double z1_1 = -2 * sqrt(
q) *
cos(
theta / 3.) - s1 / 3.;
473 const double z1_2 = -2 * sqrt(
q) *
cos((
theta + 2 *
M_PI) / 3.) - s1 / 3.;
474 const double z1_3 = -2 * sqrt(
q) *
cos((
theta - 2 *
M_PI) / 3.) - s1 / 3.;
477 std::cout <<
"r^2 < q^3 -> 3 solutions\n";
478 std::cout <<
"z1_1 " << z1_1 <<
"\n";
479 std::cout <<
"z1_2 " << z1_2 <<
"\n";
480 std::cout <<
"z1_3 " << z1_3 <<
"\n";
483 sols.push_back(z1_1);
484 sols.push_back(z1_2);
485 sols.push_back(z1_3);
487 if (
m_debug) std::cout <<
"r^2 >= q^3 -> 1 solution" <<
"\n";
489 const double radicant = -
r + sqrt(
r *
r -
q *
q *
q);
490 const double powthrd =
pow(fabs(radicant), 1. / 3.);
491 const double a =
sign(radicant) * powthrd;
493 const double b =
q /
a;
495 const double z1_1 =
a +
b - s1 / 3.;
498 sols.push_back(z1_1);
505 std::vector<double> sols;
507 if (
m_debug) std::cout <<
"Solve Quadratic\n";
509 const double b2m4ac =
b *
b - 4. *
a *
c;
512 const double sol1 = (-
b + sqrt(b2m4ac)) / 2. *
a;
513 const double sol2 = (-
b - sqrt(b2m4ac)) / 2. *
a;
516 std::cout <<
"Quadratic sol1 : " << sol1 <<
"\n";
517 std::cout <<
"Quadratic sol2 : " << sol2 <<
"\n";
520 sols.push_back(sol1);
521 sols.push_back(sol2);
522 }
else if (
m_debug) std::cout <<
"Quadratic has no solutions\n";
528 return (
a < 0) ? -1 : (
a > 0) ? 1 : 0;