#include <mt2_bisect.hh>
Public Member Functions | |
mt2 () | |
void | mt2_bisect () |
void | mt2_massless () |
void | set_momenta (double *pa0, double *pb0, double *pmiss0) |
void | set_mn (double mn) |
double | get_mt2 () |
Public Attributes | |
int | nevt |
Private Member Functions | |
int | nsols (double Dsq) |
int | nsols_massless (double Dsq) |
int | signchange_n (long double t1, long double t2, long double t3, long double t4, long double t5) |
int | signchange_p (long double t1, long double t2, long double t3, long double t4, long double t5) |
int | scan_high (double &Deltasq_high) |
int | find_high (double &Deltasq_high) |
Private Attributes | |
bool | solved |
bool | momenta_set |
double | mt2_b |
double | pax |
double | pay |
double | ma |
double | Ea |
double | pmissx |
double | pmissy |
double | pbx |
double | pby |
double | mb |
double | Eb |
double | mn |
double | mn_unscale |
double | masq |
double | Easq |
double | mbsq |
double | Ebsq |
double | pmissxsq |
double | pmissysq |
double | mnsq |
double | a1 |
double | b1 |
double | c1 |
double | a2 |
double | b2 |
double | c2 |
double | d1 |
double | e1 |
double | f1 |
double | d2 |
double | e2 |
double | f2 |
double | d11 |
double | e11 |
double | f12 |
double | f10 |
double | d21 |
double | d20 |
double | e21 |
double | e20 |
double | f22 |
double | f21 |
double | f20 |
double | scale |
double | precision |
Definition at line 37 of file mt2_bisect.hh.
mt2 | ( | ) |
Definition at line 41 of file mt2_bisect.cc.
00042 { 00043 00044 namespace mt2_bisect 00045 { 00046 using namespace std; 00047
int find_high | ( | double & | Deltasq_high | ) | [private] |
Definition at line 479 of file mt2_bisect.cc.
00487 { 00488 double x0,y0; 00489 x0 = (c1*d1-b1*e1)/(b1*b1-a1*c1); 00490 y0 = (a1*e1-b1*d1)/(b1*b1-a1*c1); 00491 double Deltasq_low = (mn + ma)*(mn + ma) - mnsq; 00492 do 00493 { 00494 double Deltasq_mid = (Deltasq_high + Deltasq_low)/2.; 00495 int nsols_mid = nsols(Deltasq_mid); 00496 if ( nsols_mid == 2 ) 00497 { 00498 Deltasq_high = Deltasq_mid; 00499 return 1; 00500 } 00501 else if (nsols_mid == 4) 00502 { 00503 Deltasq_high = Deltasq_mid; 00504 continue; 00505 } 00506 else if (nsols_mid ==0) 00507 { 00508 d1 = -pax*(Deltasq_mid-masq)/(2*Easq); 00509 e1 = -pay*(Deltasq_mid-masq)/(2*Easq); 00510 d2 = -pmissx + pbx*(Deltasq_mid - mbsq)/(2*Ebsq) 00511 + pbx*(pbx*pmissx+pby*pmissy)/(Ebsq); 00512 e2 = -pmissy + pby*(Deltasq_mid - mbsq)/(2*Ebsq) 00513 + pby*(pbx*pmissx+pby*pmissy)/(Ebsq); 00514 f2 = pmissx*pmissx+pmissy*pmissy-((Deltasq_mid-mbsq)/(2*Eb)+ 00515 (pbx*pmissx+pby*pmissy)/Eb)*((Deltasq_mid-mbsq)/(2*Eb)+ 00516 (pbx*pmissx+pby*pmissy)/Eb)+mnsq; 00517 // Does the larger ellipse contain the smaller one? 00518 double dis = a2*x0*x0 + 2*b2*x0*y0 + c2*y0*y0 + 2*d2*x0 + 2*e2*y0 + f2;
double get_mt2 | ( | ) |
Definition at line 49 of file mt2_bisect.cc.
References mt2::momenta_set, mt2::mt2_b, mt2::scale, and mt2::solved.
Referenced by Rivet::mT2::mT2().
00049 { 00050 solved = false; 00051 momenta_set = false; 00052 mt2_b = 0.; 00053 scale = 1.; 00054 }
void mt2_bisect | ( | ) |
Definition at line 329 of file mt2_bisect.cc.
Referenced by mt2::set_momenta().
00337 { 00338 solved = true; 00339 00340 //if masses are very small, use code for massless case. 00341 if(masq < MIN_MASS && mbsq < MIN_MASS) 00342 { 00343 mt2_massless(); 00344 return; 00345 } 00346 00347 00348 double Deltasq0; 00349 Deltasq0 = ma*(ma + 2*mn); //The minimum mass square to have two ellipses 00350 00351 // find the coefficients for the two quadratic equations when Deltasq=Deltasq0. 00352 00353 a1 = 1-pax*pax/(Easq); 00354 b1 = -pax*pay/(Easq); 00355 c1 = 1-pay*pay/(Easq); 00356 d1 = -pax*(Deltasq0-masq)/(2*Easq); 00357 e1 = -pay*(Deltasq0-masq)/(2*Easq); 00358 a2 = 1-pbx*pbx/(Ebsq); 00359 b2 = -pbx*pby/(Ebsq); 00360 c2 = 1-pby*pby/(Ebsq); 00361 d2 = -pmissx+pbx*(Deltasq0-mbsq)/(2*Ebsq)+pbx*(pbx*pmissx+pby*pmissy)/(Ebsq); 00362 e2 = -pmissy+pby*(Deltasq0-mbsq)/(2*Ebsq)+pby*(pbx*pmissx+pby*pmissy)/(Ebsq); 00363 f2 = pmissx*pmissx+pmissy*pmissy-((Deltasq0-mbsq)/(2*Eb)+ 00364 (pbx*pmissx+pby*pmissy)/Eb)*((Deltasq0-mbsq)/(2*Eb)+ 00365 (pbx*pmissx+pby*pmissy)/Eb)+mnsq; 00366 00367 // find the center of the smaller ellipse 00368 double x0,y0; 00369 x0 = (c1*d1-b1*e1)/(b1*b1-a1*c1); 00370 y0 = (a1*e1-b1*d1)/(b1*b1-a1*c1); 00371 00372 00373 // Does the larger ellipse contain the smaller one? 00374 double dis=a2*x0*x0+2*b2*x0*y0+c2*y0*y0+2*d2*x0+2*e2*y0+f2; 00375 00376 if(dis<=0.01) 00377 { 00378 mt2_b = (double) sqrt(mnsq+Deltasq0); 00379 return; 00380 } 00381 00382 00383 /* find the coefficients for the two quadratic equations */ 00384 /* coefficients for quadratic terms do not change */ 00385 /* coefficients for linear and constant terms are polynomials of */ 00386 /* delta=(Deltasq-m7sq)/(2 E7sq) */ 00387 d11 = -pax; 00388 e11 = -pay; 00389 f10 = mnsq; 00390 f12 = -Easq; 00391 d21 = (Easq*pbx)/Ebsq; 00392 d20 = ((masq - mbsq)*pbx)/(2.*Ebsq) - pmissx + 00393 (pbx*(pbx*pmissx + pby*pmissy))/Ebsq; 00394 e21 = (Easq*pby)/Ebsq; 00395 e20 = ((masq - mbsq)*pby)/(2.*Ebsq) - pmissy + 00396 (pby*(pbx*pmissx + pby*pmissy))/Ebsq; 00397 f22 = -Easq*Easq/Ebsq; 00398 f21 = (-2*Easq*((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb))/Eb; 00399 f20 = mnsq + pmissx*pmissx + pmissy*pmissy - 00400 ((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb) 00401 *((masq - mbsq)/(2.*Eb) + (pbx*pmissx + pby*pmissy)/Eb); 00402 00403 //Estimate upper bound of mT2 00404 //when Deltasq > Deltasq_high1, the larger encloses the center of the smaller 00405 double p2x0,p2y0; 00406 double Deltasq_high1; 00407 p2x0 = pmissx-x0; 00408 p2y0 = pmissy-y0; 00409 Deltasq_high1 = 2*Eb*sqrt(p2x0*p2x0+p2y0*p2y0+mnsq)-2*pbx*p2x0-2*pby*p2y0+mbsq; 00410 00411 //Another estimate, if both ellipses enclose the origin, Deltasq > mT2 00412 00413 double Deltasq_high2, Deltasq_high21, Deltasq_high22; 00414 Deltasq_high21 = 2*Eb*sqrt(pmissx*pmissx+pmissy*pmissy+mnsq)-2*pbx*pmissx-2*pby*pmissy+mbsq; 00415 Deltasq_high22 = 2*Ea*mn+masq; 00416 00417 if ( Deltasq_high21 < Deltasq_high22 ) Deltasq_high2 = Deltasq_high22; 00418 else Deltasq_high2 = Deltasq_high21; 00419 00420 //pick the smaller upper bound 00421 double Deltasq_high; 00422 if(Deltasq_high1 < Deltasq_high2) Deltasq_high = Deltasq_high1; 00423 else Deltasq_high = Deltasq_high2; 00424 00425 00426 double Deltasq_low; //lower bound 00427 Deltasq_low = Deltasq0; 00428 00429 //number of solutions at Deltasq_low should not be larger than zero 00430 if( nsols(Deltasq_low) > 0 ) 00431 { 00432 //cout << "nsolutions(Deltasq_low) > 0"<<endl; 00433 mt2_b = (double) sqrt(mnsq+Deltasq0); 00434 return; 00435 } 00436 00437 int nsols_high, nsols_low; 00438 00439 nsols_low = nsols(Deltasq_low); 00440 int foundhigh; 00441 00442 00443 //if nsols_high=nsols_low, we missed the region where the two ellipse overlap 00444 //if nsols_high=4, also need a scan because we may find the wrong tangent point. 00445 00446 nsols_high = nsols(Deltasq_high); 00447 00448 if(nsols_high == nsols_low || nsols_high == 4) 00449 { 00450 //foundhigh = scan_high(Deltasq_high); 00451 foundhigh = find_high(Deltasq_high); 00452 if(foundhigh == 0) 00453 { 00454 Log::getLog("Rivet.Tools.mt2") 00455 << Log::WARN 00456 << "Deltasq_high not found at event " << nevt << '\n'; 00457 mt2_b = sqrt( Deltasq_low + mnsq ); 00458 return; 00459 } 00460 00461 } 00462 00463 while(sqrt(Deltasq_high+mnsq) - sqrt(Deltasq_low+mnsq) > precision) 00464 { 00465 double Deltasq_mid,nsols_mid; 00466 //bisect 00467 Deltasq_mid = (Deltasq_high+Deltasq_low)/2.; 00468 nsols_mid = nsols(Deltasq_mid); 00469 // if nsols_mid = 4, rescan for Deltasq_high 00470 if ( nsols_mid == 4 ) 00471 { 00472 Deltasq_high = Deltasq_mid; 00473 //scan_high(Deltasq_high); 00474 find_high(Deltasq_high); 00475 continue; 00476 } 00477
void mt2_massless | ( | ) |
Definition at line 141 of file mt2_bisect.cc.
References mt2::a2, mt2::b2, mt2::c2, mt2::d20, mt2::d21, mt2::e20, mt2::e21, mt2::Ea, mt2::Easq, mt2::Eb, mt2::Ebsq, Log::ERROR, mt2::f20, mt2::f21, mt2::f22, Log::getLog(), Rivet::mass(), mt2::mnsq, mt2::mt2_b, mt2::nevt, mt2::nsols_massless(), mt2::pax, mt2::pbx, mt2::pmissxsq, mt2::pmissysq, mt2::precision, Rivet::s, Rivet::mt2_bisect::SCANSTEP, Rivet::theta(), and Log::WARN.
00149 { 00150 00151 //rotate so that pay = 0 00152 double theta,s,c; 00153 theta = atan(pay/pax); 00154 s = sin(theta); 00155 c = cos(theta); 00156 00157 double pxtemp,pytemp; 00158 Easq = pax*pax+pay*pay; 00159 Ebsq = pbx*pbx+pby*pby; 00160 Ea = sqrt(Easq); 00161 Eb = sqrt(Ebsq); 00162 00163 pxtemp = pax*c+pay*s; 00164 pax = pxtemp; 00165 pay = 0; 00166 pxtemp = pbx*c+pby*s; 00167 pytemp = -s*pbx+c*pby; 00168 pbx = pxtemp; 00169 pby = pytemp; 00170 pxtemp = pmissx*c+pmissy*s; 00171 pytemp = -s*pmissx+c*pmissy; 00172 pmissx = pxtemp; 00173 pmissy = pytemp; 00174 00175 a2 = 1-pbx*pbx/(Ebsq); 00176 b2 = -pbx*pby/(Ebsq); 00177 c2 = 1-pby*pby/(Ebsq); 00178 00179 d21 = (Easq*pbx)/Ebsq; 00180 d20 = - pmissx + (pbx*(pbx*pmissx + pby*pmissy))/Ebsq; 00181 e21 = (Easq*pby)/Ebsq; 00182 e20 = - pmissy + (pby*(pbx*pmissx + pby*pmissy))/Ebsq; 00183 f22 = -(Easq*Easq/Ebsq); 00184 f21 = -2*Easq*(pbx*pmissx + pby*pmissy)/Ebsq; 00185 f20 = mnsq + pmissxsq + pmissysq - (pbx*pmissx + pby*pmissy)*(pbx*pmissx + pby*pmissy)/Ebsq; 00186 00187 double Deltasq0 = 0; 00188 double Deltasq_low, Deltasq_high; 00189 int nsols_high, nsols_low; 00190 00191 Deltasq_low = Deltasq0 + precision; 00192 nsols_low = nsols_massless(Deltasq_low); 00193 00194 if(nsols_low > 1) 00195 { 00196 mt2_b = (double) sqrt(Deltasq0+mnsq); 00197 return; 00198 } 00199 00200 /* 00201 if( nsols_massless(Deltasq_high) > 0 ) 00202 { 00203 mt2_b = (double) sqrt(mnsq+Deltasq0); 00204 return; 00205 }*/ 00206 00207 //look for when both parablos contain origin 00208 double Deltasq_high1, Deltasq_high2; 00209 Deltasq_high1 = 2*Eb*sqrt(pmissx*pmissx+pmissy*pmissy+mnsq)-2*pbx*pmissx-2*pby*pmissy; 00210 Deltasq_high2 = 2*Ea*mn; 00211 00212 if(Deltasq_high1 < Deltasq_high2) Deltasq_high = Deltasq_high2; 00213 else Deltasq_high = Deltasq_high1; 00214 00215 nsols_high=nsols_massless(Deltasq_high); 00216 00217 int foundhigh; 00218 if (nsols_high == nsols_low) 00219 { 00220 00221 00222 foundhigh=0; 00223 00224 double minmass, maxmass; 00225 minmass = mn ; 00226 maxmass = sqrt(mnsq + Deltasq_high); 00227 for(double mass = minmass + SCANSTEP; mass < maxmass; mass += SCANSTEP) 00228 { 00229 Deltasq_high = mass*mass - mnsq; 00230 00231 nsols_high = nsols_massless(Deltasq_high); 00232 if(nsols_high>0) 00233 { 00234 foundhigh=1; 00235 Deltasq_low = (mass-SCANSTEP)*(mass-SCANSTEP) - mnsq; 00236 break; 00237 } 00238 } 00239 if(foundhigh==0) 00240 { 00241 00242 Log::getLog("Rivet.Tools.mt2") 00243 << Log::WARN 00244 << "Deltasq_high not found at event " << nevt << '\n'; 00245 00246 mt2_b = (double)sqrt(Deltasq_low+mnsq); 00247 return; 00248 } 00249 } 00250 00251 if(nsols_high == nsols_low) 00252 { 00253 Log::getLog("Rivet.Tools.mt2") 00254 << Log::ERROR 00255 << "error: nsols_low=nsols_high=" << nsols_high << '\n' 00256 << "Deltasq_high=" << Deltasq_high << '\n' 00257 << "Deltasq_low= "<< Deltasq_low << '\n'; 00258 00259 mt2_b = sqrt(mnsq + Deltasq_low); 00260 return; 00261 } 00262 double minmass, maxmass; 00263 minmass = sqrt(Deltasq_low+mnsq); 00264 maxmass = sqrt(Deltasq_high+mnsq); 00265 while(maxmass - minmass > precision) 00266 { 00267 double Delta_mid, midmass, nsols_mid; 00268 midmass = (minmass+maxmass)/2.; 00269 Delta_mid = midmass * midmass - mnsq;
int nsols | ( | double | Dsq | ) | [private] |
Definition at line 545 of file mt2_bisect.cc.
00545 { 00546 foundhigh = 1; 00547 break; 00548 } 00549 } 00550 return foundhigh; 00551 } 00552 int mt2::nsols( double Dsq) 00553 { 00554 double delta = (Dsq-masq)/(2*Easq); 00555 00556 //calculate coefficients for the two quadratic equations 00557 d1 = d11*delta; 00558 e1 = e11*delta; 00559 f1 = f12*delta*delta+f10; 00560 d2 = d21*delta+d20; 00561 e2 = e21*delta+e20; 00562 f2 = f22*delta*delta+f21*delta+f20; 00563 00564 //obtain the coefficients for the 4th order equation 00565 //devided by Ea^n to make the variable dimensionless 00566 long double A4, A3, A2, A1, A0; 00567 00568 A4 = 00569 -4*a2*b1*b2*c1 + 4*a1*b2*b2*c1 +a2*a2*c1*c1 + 00570 4*a2*b1*b1*c2 - 4*a1*b1*b2*c2 - 2*a1*a2*c1*c2 + 00571 a1*a1*c2*c2; 00572 00573 A3 = 00574 (-4*a2*b2*c1*d1 + 8*a2*b1*c2*d1 - 4*a1*b2*c2*d1 - 4*a2*b1*c1*d2 + 00575 8*a1*b2*c1*d2 - 4*a1*b1*c2*d2 - 8*a2*b1*b2*e1 + 8*a1*b2*b2*e1 + 00576 4*a2*a2*c1*e1 - 4*a1*a2*c2*e1 + 8*a2*b1*b1*e2 - 8*a1*b1*b2*e2 - 00577 4*a1*a2*c1*e2 + 4*a1*a1*c2*e2)/Ea; 00578 00579 00580 A2 = 00581 (4*a2*c2*d1*d1 - 4*a2*c1*d1*d2 - 4*a1*c2*d1*d2 + 4*a1*c1*d2*d2 - 00582 8*a2*b2*d1*e1 - 8*a2*b1*d2*e1 + 16*a1*b2*d2*e1 + 00583 4*a2*a2*e1*e1 + 16*a2*b1*d1*e2 - 8*a1*b2*d1*e2 - 00584 8*a1*b1*d2*e2 - 8*a1*a2*e1*e2 + 4*a1*a1*e2*e2 - 4*a2*b1*b2*f1 + 00585 4*a1*b2*b2*f1 + 2*a2*a2*c1*f1 - 2*a1*a2*c2*f1 + 00586 4*a2*b1*b1*f2 - 4*a1*b1*b2*f2 - 2*a1*a2*c1*f2 + 2*a1*a1*c2*f2)/Easq; 00587 00588 A1 = 00589 (-8*a2*d1*d2*e1 + 8*a1*d2*d2*e1 + 8*a2*d1*d1*e2 - 8*a1*d1*d2*e2 - 00590 4*a2*b2*d1*f1 - 4*a2*b1*d2*f1 + 8*a1*b2*d2*f1 + 4*a2*a2*e1*f1 - 00591 4*a1*a2*e2*f1 + 8*a2*b1*d1*f2 - 4*a1*b2*d1*f2 - 4*a1*b1*d2*f2 - 00592 4*a1*a2*e1*f2 + 4*a1*a1*e2*f2)/(Easq*Ea); 00593 00594 A0 = 00595 (-4*a2*d1*d2*f1 + 4*a1*d2*d2*f1 + a2*a2*f1*f1 + 00596 4*a2*d1*d1*f2 - 4*a1*d1*d2*f2 - 2*a1*a2*f1*f2 + 00597 a1*a1*f2*f2)/(Easq*Easq); 00598 00599 long double B3, B2, B1, B0; 00600 B3 = 4*A4; 00601 B2 = 3*A3; 00602 B1 = 2*A2; 00603 B0 = A1; 00604 00605 long double C2, C1, C0; 00606 C2 = -(A2/2 - 3*A3*A3/(16*A4)); 00607 C1 = -(3*A1/4. -A2*A3/(8*A4)); 00608 C0 = -A0 + A1*A3/(16*A4); 00609 00610 long double D1, D0; 00611 D1 = -B1 - (B3*C1*C1/C2 - B3*C0 -B2*C1)/C2; 00612 D0 = -B0 - B3 *C0 *C1/(C2*C2)+ B2*C0/C2; 00613 00614 long double E0; 00615 E0 = -C0 - C2*D0*D0/(D1*D1) + C1*D0/D1; 00616 00617 long double t1,t2,t3,t4,t5; 00618 //find the coefficients for the leading term in the Sturm sequence 00619 t1 = A4; 00620 t2 = A4; 00621 t3 = C2; 00622 t4 = D1; 00623 t5 = E0; 00624 00625 00626 //The number of solutions depends on diffence of number of sign changes for x->Inf and x->-Inf 00627 int nsol; 00628 nsol = signchange_n(t1,t2,t3,t4,t5) - signchange_p(t1,t2,t3,t4,t5);
int nsols_massless | ( | double | Dsq | ) | [private] |
Definition at line 271 of file mt2_bisect.cc.
Referenced by mt2::mt2_massless().
00279 { 00280 double delta; 00281 delta = Dsq/(2*Easq); 00282 d1 = d11*delta; 00283 e1 = e11*delta; 00284 f1 = f12*delta*delta+f10; 00285 d2 = d21*delta+d20; 00286 e2 = e21*delta+e20; 00287 f2 = f22*delta*delta+f21*delta+f20; 00288 00289 double a,b; 00290 if (pax > 0) a = Ea/Dsq; 00291 else a = -Ea/Dsq; 00292 if (pax > 0) b = -Dsq/(4*Ea)+mnsq*Ea/Dsq; 00293 else b = Dsq/(4*Ea)-mnsq*Ea/Dsq; 00294 00295 double A4,A3,A2,A1,A0; 00296 00297 A4 = a*a*a2; 00298 A3 = 2*a*b2/Ea; 00299 A2 = (2*a*a2*b+c2+2*a*d2)/(Easq); 00300 A1 = (2*b*b2+2*e2)/(Easq*Ea); 00301 A0 = (a2*b*b+2*b*d2+f2)/(Easq*Easq); 00302 00303 long double B3, B2, B1, B0; 00304 B3 = 4*A4; 00305 B2 = 3*A3; 00306 B1 = 2*A2; 00307 B0 = A1; 00308 long double C2, C1, C0; 00309 C2 = -(A2/2 - 3*A3*A3/(16*A4)); 00310 C1 = -(3*A1/4. -A2*A3/(8*A4)); 00311 C0 = -A0 + A1*A3/(16*A4); 00312 long double D1, D0; 00313 D1 = -B1 - (B3*C1*C1/C2 - B3*C0 -B2*C1)/C2; 00314 D0 = -B0 - B3 *C0 *C1/(C2*C2)+ B2*C0/C2; 00315 00316 long double E0; 00317 E0 = -C0 - C2*D0*D0/(D1*D1) + C1*D0/D1; 00318 00319 long double t1,t2,t3,t4,t5; 00320 00321 //find the coefficients for the leading term in the Sturm sequence 00322 t1 = A4; 00323 t2 = A4; 00324 t3 = C2; 00325 t4 = D1; 00326 t5 = E0; 00327
int scan_high | ( | double & | Deltasq_high | ) | [private] |
Definition at line 519 of file mt2_bisect.cc.
00527 { 00528 int foundhigh = 0 ; 00529 int nsols_high; 00530 00531 00532 double tempmass, maxmass; 00533 tempmass = mn + ma; 00534 maxmass = sqrt(mnsq + Deltasq_high); 00535 // if (nevt == 32334) { 00536 00537 // cout << "Deltasq_high = " << Deltasq_high << endl; 00538 // } 00539 for(double mass = tempmass + SCANSTEP; mass < maxmass; mass += SCANSTEP) 00540 { 00541 Deltasq_high = mass*mass - mnsq; 00542 nsols_high = nsols(Deltasq_high); 00543 00544 if( nsols_high > 0)
void set_mn | ( | double | mn | ) |
Definition at line 124 of file mt2_bisect.cc.
Referenced by Rivet::mT2::mT2().
void set_momenta | ( | double * | pa0, | |
double * | pb0, | |||
double * | pmiss0 | |||
) |
Definition at line 56 of file mt2_bisect.cc.
References mt2::momenta_set, mt2::mt2_b, mt2::mt2_bisect(), mt2::scale, and mt2::solved.
Referenced by Rivet::mT2::mT2().
00057 { 00058 assert(momenta_set); 00059 if (!solved) mt2_bisect(); 00060 return mt2_b*scale; 00061 } 00062 00063 void mt2::set_momenta(double* pa0, double* pb0, double* pmiss0) 00064 { 00065 solved = false; //reset solved tag when momenta are changed. 00066 momenta_set = true; 00067 00068 ma = fabs(pa0[0]); // mass cannot be negative 00069 00070 if (ma < ZERO_MASS) ma = ZERO_MASS; 00071 00072 pax = pa0[1]; 00073 pay = pa0[2]; 00074 masq = ma*ma; 00075 Easq = masq+pax*pax+pay*pay; 00076 Ea = sqrt(Easq); 00077 00078 mb = fabs(pb0[0]); 00079 00080 if (mb < ZERO_MASS) mb = ZERO_MASS; 00081 00082 pbx = pb0[1]; 00083 pby = pb0[2]; 00084 mbsq = mb*mb; 00085 Ebsq = mbsq+pbx*pbx+pby*pby; 00086 Eb = sqrt(Ebsq); 00087 00088 pmissx = pmiss0[1]; pmissy = pmiss0[2]; 00089 pmissxsq = pmissx*pmissx; 00090 pmissysq = pmissy*pmissy; 00091 00092 // set ma>= mb 00093 if(masq < mbsq) 00094 { 00095 double temp; 00096 temp = pax; pax = pbx; pbx = temp; 00097 temp = pay; pay = pby; pby = temp; 00098 temp = Ea; Ea = Eb; Eb = temp; 00099 temp = Easq; Easq = Ebsq; Ebsq = temp; 00100 temp = masq; masq = mbsq; mbsq = temp; 00101 temp = ma; ma = mb; mb = temp; 00102 } 00103 //normalize max{Ea, Eb} to 100 00104 if (Ea > Eb) scale = Ea/100.; 00105 else scale = Eb/100.; 00106 00107 if (sqrt(pmissxsq+pmissysq)/100 > scale) scale = sqrt(pmissxsq+pmissysq)/100; 00108 //scale = 1; 00109 double scalesq = scale * scale; 00110 ma = ma/scale; 00111 mb = mb/scale; 00112 masq = masq/scalesq; 00113 mbsq = mbsq/scalesq; 00114 pax = pax/scale; pay = pay/scale; 00115 pbx = pbx/scale; pby = pby/scale; 00116 Ea = Ea/scale; Eb = Eb/scale; 00117 00118 Easq = Easq/scalesq; 00119 Ebsq = Ebsq/scalesq; 00120 pmissx = pmissx/scale; 00121 pmissy = pmissy/scale; 00122 pmissxsq = pmissxsq/scalesq;
int signchange_n | ( | long double | t1, | |
long double | t2, | |||
long double | t3, | |||
long double | t4, | |||
long double | t5 | |||
) | [inline, private] |
Definition at line 630 of file mt2_bisect.cc.
int signchange_p | ( | long double | t1, | |
long double | t2, | |||
long double | t3, | |||
long double | t4, | |||
long double | t5 | |||
) | [inline, private] |
Definition at line 640 of file mt2_bisect.cc.
double a1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double a2 [private] |
Definition at line 74 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double b1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double b2 [private] |
Definition at line 74 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double c1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double c2 [private] |
Definition at line 74 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double d1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double d11 [private] |
Definition at line 75 of file mt2_bisect.hh.
double d2 [private] |
Definition at line 74 of file mt2_bisect.hh.
double d20 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double d21 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double e1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double e11 [private] |
Definition at line 75 of file mt2_bisect.hh.
double e2 [private] |
Definition at line 74 of file mt2_bisect.hh.
double e20 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double e21 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double Ea [private] |
Definition at line 62 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double Easq [private] |
Definition at line 68 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double Eb [private] |
Definition at line 64 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double Ebsq [private] |
Definition at line 69 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double f1 [private] |
Definition at line 74 of file mt2_bisect.hh.
double f10 [private] |
Definition at line 75 of file mt2_bisect.hh.
double f12 [private] |
Definition at line 75 of file mt2_bisect.hh.
double f2 [private] |
Definition at line 74 of file mt2_bisect.hh.
double f20 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double f21 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double f22 [private] |
Definition at line 75 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double ma [private] |
Definition at line 62 of file mt2_bisect.hh.
double masq [private] |
Definition at line 68 of file mt2_bisect.hh.
double mb [private] |
Definition at line 64 of file mt2_bisect.hh.
double mbsq [private] |
Definition at line 69 of file mt2_bisect.hh.
double mn [private] |
Definition at line 65 of file mt2_bisect.hh.
double mn_unscale [private] |
Definition at line 65 of file mt2_bisect.hh.
double mnsq [private] |
Definition at line 71 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
bool momenta_set [private] |
Definition at line 52 of file mt2_bisect.hh.
Referenced by mt2::get_mt2(), and mt2::set_momenta().
double mt2_b [private] |
Definition at line 53 of file mt2_bisect.hh.
Referenced by mt2::get_mt2(), mt2::mt2_massless(), and mt2::set_momenta().
int nevt |
Definition at line 48 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double pax [private] |
Definition at line 62 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double pay [private] |
Definition at line 62 of file mt2_bisect.hh.
double pbx [private] |
Definition at line 64 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double pby [private] |
Definition at line 64 of file mt2_bisect.hh.
double pmissx [private] |
Definition at line 63 of file mt2_bisect.hh.
double pmissxsq [private] |
Definition at line 70 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double pmissy [private] |
Definition at line 63 of file mt2_bisect.hh.
double pmissysq [private] |
Definition at line 70 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double precision [private] |
Definition at line 78 of file mt2_bisect.hh.
Referenced by mt2::mt2_massless().
double scale [private] |
Definition at line 77 of file mt2_bisect.hh.
Referenced by mt2::get_mt2(), and mt2::set_momenta().
bool solved [private] |
Definition at line 51 of file mt2_bisect.hh.
Referenced by mt2::get_mt2(), and mt2::set_momenta().