54 cout <<
" Please set momenta first!" << endl;
62 void mt2::set_momenta(
double* pa0,
double* pb0,
double* pmiss0)
74 Easq = masq+pax*pax+pay*pay;
84 Ebsq = mbsq+pbx*pbx+pby*pby;
87 pmissx = pmiss0[1]; pmissy = pmiss0[2];
88 pmissxsq = pmissx*pmissx;
89 pmissysq = pmissy*pmissy;
95 temp = pax; pax = pbx; pbx = temp;
96 temp = pay; pay = pby; pby = temp;
97 temp = Ea; Ea = Eb; Eb = temp;
98 temp = Easq; Easq = Ebsq; Ebsq = temp;
99 temp = masq; masq = mbsq; mbsq = temp;
100 temp = ma; ma = mb; mb = temp;
103 if (Ea > Eb) scale = Ea/100.;
104 else scale = Eb/100.;
106 if (sqrt(pmissxsq+pmissysq)/100 > scale) scale = sqrt(pmissxsq+pmissysq)/100;
108 double scalesq = scale * scale;
113 pax = pax/scale; pay = pay/scale;
114 pbx = pbx/scale; pby = pby/scale;
115 Ea = Ea/scale; Eb = Eb/scale;
119 pmissx = pmissx/scale;
120 pmissy = pmissy/scale;
121 pmissxsq = pmissxsq/scalesq;
122 pmissysq = pmissysq/scalesq;
123 mn = mn_unscale/scale;
130 void mt2::set_mn(
double mn0)
133 mn_unscale = fabs(mn0);
134 mn = mn_unscale/scale;
140 cout <<
" pax = " << pax*scale <<
"; pay = " << pay*scale <<
"; ma = " << ma*scale <<
";"<< endl;
141 cout <<
" pbx = " << pbx*scale <<
"; pby = " << pby*scale <<
"; mb = " << mb*scale <<
";"<< endl;
142 cout <<
" pmissx = " << pmissx*scale <<
"; pmissy = " << pmissy*scale <<
";"<< endl;
143 cout <<
" mn = " << mn_unscale<<
";" << endl;
147 void mt2::mt2_massless()
152 theta = atan(pay/pax);
156 double pxtemp,pytemp;
157 Easq = pax*pax+pay*pay;
158 Ebsq = pbx*pbx+pby*pby;
162 pxtemp = pax*c+pay*s;
165 pxtemp = pbx*c+pby*s;
166 pytemp = -s*pbx+c*pby;
169 pxtemp = pmissx*c+pmissy*s;
170 pytemp = -s*pmissx+c*pmissy;
174 a2 = 1-pbx*pbx/(Ebsq);
175 b2 = -pbx*pby/(Ebsq);
176 c2 = 1-pby*pby/(Ebsq);
178 d21 = (Easq*pbx)/Ebsq;
179 d20 = - pmissx + (pbx*(pbx*pmissx + pby*pmissy))/Ebsq;
180 e21 = (Easq*pby)/Ebsq;
181 e20 = - pmissy + (pby*(pbx*pmissx + pby*pmissy))/Ebsq;
182 f22 = -(Easq*Easq/Ebsq);
183 f21 = -2*Easq*(pbx*pmissx + pby*pmissy)/Ebsq;
184 f20 = mnsq + pmissxsq + pmissysq - (pbx*pmissx + pby*pmissy)*(pbx*pmissx + pby*pmissy)/Ebsq;
187 double Deltasq_low, Deltasq_high;
188 int nsols_high, nsols_low;
190 Deltasq_low = Deltasq0 + precision;
191 nsols_low = nsols_massless(Deltasq_low);
195 mt2_b = (
double) sqrt(Deltasq0+mnsq);
207 double Deltasq_high1, Deltasq_high2;
208 Deltasq_high1 = 2*Eb*sqrt(pmissx*pmissx+pmissy*pmissy+mnsq)-2*pbx*pmissx-2*pby*pmissy;
209 Deltasq_high2 = 2*Ea*mn;
211 if(Deltasq_high1 < Deltasq_high2) Deltasq_high = Deltasq_high2;
212 else Deltasq_high = Deltasq_high1;
214 nsols_high=nsols_massless(Deltasq_high);
217 if (nsols_high == nsols_low)
223 double minmass, maxmass;
225 maxmass = sqrt(mnsq + Deltasq_high);
228 Deltasq_high = mass*mass - mnsq;
230 nsols_high = nsols_massless(Deltasq_high);
244 mt2_b = (
double)sqrt(Deltasq_low+mnsq);
249 if(nsols_high == nsols_low)
251 cout <<
"error: nsols_low=nsols_high=" << nsols_high << endl;
252 cout <<
"Deltasq_high=" << Deltasq_high << endl;
253 cout <<
"Deltasq_low= "<< Deltasq_low << endl;
255 mt2_b = sqrt(mnsq + Deltasq_low);
258 double minmass, maxmass;
259 minmass = sqrt(Deltasq_low+mnsq);
260 maxmass = sqrt(Deltasq_high+mnsq);
261 while(maxmass - minmass > precision)
263 double Delta_mid, midmass, nsols_mid;
264 midmass = (minmass+maxmass)/2.;
265 Delta_mid = midmass * midmass - mnsq;
266 nsols_mid = nsols_massless(Delta_mid);
267 if(nsols_mid != nsols_low) maxmass = midmass;
268 if(nsols_mid == nsols_low) minmass = midmass;
274 int mt2::nsols_massless(
double Dsq)
277 delta = Dsq/(2*Easq);
280 f1 = f12*delta*delta+f10;
283 f2 = f22*delta*delta+f21*delta+f20;
286 if (pax > 0) a = Ea/Dsq;
288 if (pax > 0) b = -Dsq/(4*Ea)+mnsq*Ea/Dsq;
289 else b = Dsq/(4*Ea)-mnsq*Ea/Dsq;
291 double A4,A3,A2,A1,A0;
295 A2 = (2*a*a2*b+c2+2*a*d2)/(Easq);
296 A1 = (2*b*b2+2*e2)/(Easq*Ea);
297 A0 = (a2*b*b+2*b*d2+f2)/(Easq*Easq);
299 long double B3, B2,
B1,
B0;
304 long double C2, C1,
C0;
305 C2 = -(A2/2 - 3*A3*A3/(16*A4));
306 C1 = -(3*A1/4. -A2*A3/(8*A4));
307 C0 = -A0 + A1*A3/(16*A4);
309 D1 = -B1 - (B3*C1*C1/C2 - B3*C0 -B2*C1)/C2;
310 D0 = -B0 - B3 *C0 *C1/(C2*C2)+ B2*C0/C2;
313 E0 = -C0 - C2*D0*D0/(D1*D1) + C1*D0/D1;
315 long double t1,t2,t3,t4,t5;
325 nsol = signchange_n(t1,t2,t3,t4,t5)-signchange_p(t1,t2,t3,t4,t5);
326 if( nsol < 0 ) nsol=0;
332 void mt2::mt2_bisect()
348 Deltasq0 = ma*(ma + 2*mn);
352 a1 = 1-pax*pax/(Easq);
353 b1 = -pax*pay/(Easq);
354 c1 = 1-pay*pay/(Easq);
355 d1 = -pax*(Deltasq0-masq)/(2*Easq);
356 e1 = -pay*(Deltasq0-masq)/(2*Easq);
357 a2 = 1-pbx*pbx/(Ebsq);
358 b2 = -pbx*pby/(Ebsq);
359 c2 = 1-pby*pby/(Ebsq);
360 d2 = -pmissx+pbx*(Deltasq0-mbsq)/(2*Ebsq)+pbx*(pbx*pmissx+pby*pmissy)/(Ebsq);
361 e2 = -pmissy+pby*(Deltasq0-mbsq)/(2*Ebsq)+pby*(pbx*pmissx+pby*pmissy)/(Ebsq);
362 f2 = pmissx*pmissx+pmissy*pmissy-((Deltasq0-mbsq)/(2*Eb)+
363 (pbx*pmissx+pby*pmissy)/Eb)*((Deltasq0-mbsq)/(2*Eb)+
364 (pbx*pmissx+pby*pmissy)/Eb)+mnsq;
368 x0 = (c1*d1-b1*e1)/(b1*b1-a1*c1);
369 y0 = (a1*e1-b1*d1)/(b1*b1-a1*c1);
373 double dis=a2*x0*x0+2*b2*x0*y0+c2*y0*y0+2*d2*x0+2*e2*y0+f2;
377 mt2_b = (
double) sqrt(mnsq+Deltasq0);
390 d21 = (Easq*pbx)/Ebsq;
391 d20 = ((masq - mbsq)*pbx)/(2.*Ebsq) - pmissx +
392 (pbx*(pbx*pmissx + pby*pmissy))/Ebsq;
393 e21 = (Easq*pby)/Ebsq;
394 e20 = ((masq - mbsq)*pby)/(2.*Ebsq) - pmissy +
395 (pby*(pbx*pmissx + pby*pmissy))/Ebsq;
396 f22 = -Easq*Easq/Ebsq;
397 f21 = (-2*Easq*((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb))/Eb;
398 f20 = mnsq + pmissx*pmissx + pmissy*pmissy -
399 ((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb)
400 *((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb);
405 double Deltasq_high1;
408 Deltasq_high1 = 2*Eb*sqrt(p2x0*p2x0+p2y0*p2y0+mnsq)-2*pbx*p2x0-2*pby*p2y0+mbsq;
412 double Deltasq_high2, Deltasq_high21, Deltasq_high22;
413 Deltasq_high21 = 2*Eb*sqrt(pmissx*pmissx+pmissy*pmissy+mnsq)-2*pbx*pmissx-2*pby*pmissy+mbsq;
414 Deltasq_high22 = 2*Ea*mn+masq;
416 if ( Deltasq_high21 < Deltasq_high22 ) Deltasq_high2 = Deltasq_high22;
417 else Deltasq_high2 = Deltasq_high21;
421 if(Deltasq_high1 < Deltasq_high2) Deltasq_high = Deltasq_high1;
422 else Deltasq_high = Deltasq_high2;
426 Deltasq_low = Deltasq0;
429 if( nsols(Deltasq_low) > 0 )
432 mt2_b = (
double) sqrt(mnsq+Deltasq0);
436 int nsols_high, nsols_low;
438 nsols_low = nsols(Deltasq_low);
445 nsols_high = nsols(Deltasq_high);
447 if(nsols_high == nsols_low || nsols_high == 4)
450 foundhigh = find_high(Deltasq_high);
453 cout <<
"Deltasq_high not found at event " << nevt << endl;
454 mt2_b = sqrt( Deltasq_low + mnsq );
460 while(sqrt(Deltasq_high+mnsq) - sqrt(Deltasq_low+mnsq) > precision)
462 double Deltasq_mid,nsols_mid;
464 Deltasq_mid = (Deltasq_high+Deltasq_low)/2.;
465 nsols_mid = nsols(Deltasq_mid);
467 if ( nsols_mid == 4 )
469 Deltasq_high = Deltasq_mid;
471 find_high(Deltasq_high);
476 if(nsols_mid != nsols_low) Deltasq_high = Deltasq_mid;
477 if(nsols_mid == nsols_low) Deltasq_low = Deltasq_mid;
479 mt2_b = (
double) sqrt( mnsq + Deltasq_high);
483 int mt2::find_high(
double & Deltasq_high)
486 x0 = (c1*d1-b1*e1)/(b1*b1-a1*c1);
487 y0 = (a1*e1-b1*d1)/(b1*b1-a1*c1);
488 double Deltasq_low = (mn + ma)*(mn + ma) - mnsq;
491 double Deltasq_mid = (Deltasq_high + Deltasq_low)/2.;
492 int nsols_mid = nsols(Deltasq_mid);
493 if ( nsols_mid == 2 )
495 Deltasq_high = Deltasq_mid;
498 else if (nsols_mid == 4)
500 Deltasq_high = Deltasq_mid;
503 else if (nsols_mid ==0)
505 d1 = -pax*(Deltasq_mid-masq)/(2*Easq);
506 e1 = -pay*(Deltasq_mid-masq)/(2*Easq);
507 d2 = -pmissx + pbx*(Deltasq_mid - mbsq)/(2*Ebsq)
508 + pbx*(pbx*pmissx+pby*pmissy)/(Ebsq);
509 e2 = -pmissy + pby*(Deltasq_mid - mbsq)/(2*Ebsq)
510 + pby*(pbx*pmissx+pby*pmissy)/(Ebsq);
511 f2 = pmissx*pmissx+pmissy*pmissy-((Deltasq_mid-mbsq)/(2*Eb)+
512 (pbx*pmissx+pby*pmissy)/Eb)*((Deltasq_mid-mbsq)/(2*Eb)+
513 (pbx*pmissx+pby*pmissy)/Eb)+mnsq;
515 double dis = a2*x0*x0 + 2*b2*x0*y0 + c2*y0*y0 + 2*d2*x0 + 2*e2*y0 + f2;
516 if (dis < 0) Deltasq_high = Deltasq_mid;
517 else Deltasq_low = Deltasq_mid;
520 }
while ( Deltasq_high - Deltasq_low > 0.001);
523 int mt2::scan_high(
double & Deltasq_high)
528 double tempmass, maxmass;
530 maxmass = sqrt(mnsq + Deltasq_high);
531 if (nevt == 32334) cout <<
"Deltasq_high = " << Deltasq_high << endl;
534 Deltasq_high = mass*mass - mnsq;
535 nsols_high = nsols(Deltasq_high);
545 int mt2::nsols(
double Dsq)
547 double delta = (Dsq-masq)/(2*Easq);
552 f1 = f12*delta*delta+f10;
555 f2 = f22*delta*delta+f21*delta+f20;
559 long double A4, A3, A2, A1, A0;
562 -4*a2*b1*b2*c1 + 4*a1*b2*b2*c1 +a2*a2*c1*c1 +
563 4*a2*b1*b1*c2 - 4*a1*b1*b2*c2 - 2*a1*a2*c1*c2 +
567 (-4*a2*b2*c1*d1 + 8*a2*b1*c2*d1 - 4*a1*b2*c2*d1 - 4*a2*b1*c1*d2 +
568 8*a1*b2*c1*d2 - 4*a1*b1*c2*d2 - 8*a2*b1*b2*e1 + 8*a1*b2*b2*e1 +
569 4*a2*a2*c1*e1 - 4*a1*a2*c2*e1 + 8*a2*b1*b1*e2 - 8*a1*b1*b2*e2 -
570 4*a1*a2*c1*e2 + 4*a1*a1*c2*e2)/Ea;
574 (4*a2*c2*d1*d1 - 4*a2*c1*d1*d2 - 4*a1*c2*d1*d2 + 4*a1*c1*d2*d2 -
575 8*a2*b2*d1*e1 - 8*a2*b1*d2*e1 + 16*a1*b2*d2*e1 +
576 4*a2*a2*e1*e1 + 16*a2*b1*d1*e2 - 8*a1*b2*d1*e2 -
577 8*a1*b1*d2*e2 - 8*a1*a2*e1*e2 + 4*a1*a1*e2*e2 - 4*a2*b1*b2*f1 +
578 4*a1*b2*b2*f1 + 2*a2*a2*c1*f1 - 2*a1*a2*c2*f1 +
579 4*a2*b1*b1*f2 - 4*a1*b1*b2*f2 - 2*a1*a2*c1*f2 + 2*a1*a1*c2*f2)/Easq;
582 (-8*a2*d1*d2*e1 + 8*a1*d2*d2*e1 + 8*a2*d1*d1*e2 - 8*a1*d1*d2*e2 -
583 4*a2*b2*d1*f1 - 4*a2*b1*d2*f1 + 8*a1*b2*d2*f1 + 4*a2*a2*e1*f1 -
584 4*a1*a2*e2*f1 + 8*a2*b1*d1*f2 - 4*a1*b2*d1*f2 - 4*a1*b1*d2*f2 -
585 4*a1*a2*e1*f2 + 4*a1*a1*e2*f2)/(Easq*Ea);
588 (-4*a2*d1*d2*f1 + 4*a1*d2*d2*f1 + a2*a2*f1*f1 +
589 4*a2*d1*d1*f2 - 4*a1*d1*d2*f2 - 2*a1*a2*f1*f2 +
590 a1*a1*f2*f2)/(Easq*Easq);
592 long double B3, B2,
B1,
B0;
598 long double C2, C1,
C0;
599 C2 = -(A2/2 - 3*A3*A3/(16*A4));
600 C1 = -(3*A1/4. -A2*A3/(8*A4));
601 C0 = -A0 + A1*A3/(16*A4);
604 D1 = -B1 - (B3*C1*C1/C2 - B3*C0 -B2*C1)/C2;
605 D0 = -B0 - B3 *C0 *C1/(C2*C2)+ B2*C0/C2;
608 E0 = -C0 - C2*D0*D0/(D1*D1) + C1*D0/D1;
610 long double t1,t2,t3,t4,t5;
621 nsol = signchange_n(t1,t2,t3,t4,t5) - signchange_p(t1,t2,t3,t4,t5);
624 if (nsol < 0) nsol = 0;
630 inline int mt2::signchange_n(
long double t1,
long double t2,
long double t3,
long double t4,
long double t5)
640 inline int mt2::signchange_p(
long double t1,
long double t2,
long double t3,
long double t4,
long double t5)
void print(MixMatrix A)
Helper function to print a matrix.
DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry DecayTable::Entry double
Funk delta(std::string arg, double pos, double width)
double D0(const double a, const double b, const double c, const double d)
double C0(const double a, const double b, const double c)
#define RELATIVE_PRECISION
double B0(const double a, const double b, const double Q)
#define ABSOLUTE_PRECISION
double B1(const double a, const double b, const double Q)