44 mt2w::mt2w(
double upper_bound,
double error_value,
double scan_step)
49 this->upper_bound = upper_bound;
50 this->error_value = error_value;
51 this->scan_step = scan_step;
54 double mt2w::get_mt2w()
58 cout <<
" Please set momenta first!" << endl;
67 void mt2w::set_momenta(
double *pl,
double *pb1,
double *pb2,
double* pmiss)
71 set_momenta(pl[0], pl[1], pl[2], pl[3],
72 pb1[0], pb1[1], pb1[2], pb1[3],
73 pb2[0], pb2[1], pb2[2], pb2[3],
79 void mt2w::set_momenta(
double El,
double plx,
double ply,
double plz,
80 double Eb1,
double pb1x,
double pb1y,
double pb1z,
81 double Eb2,
double pb2x,
double pb2y,
double pb2z,
82 double pmissx,
double pmissy)
98 msqtemp = El*El-plx*plx-ply*ply-plz*plz;
99 if (msqtemp > 0.0) {mlsq = msqtemp;}
112 msqtemp = Eb1*Eb1-pb1x*pb1x-pb1y*pb1y-pb1z*pb1z;
113 if (msqtemp > 0.0) {mb1sq = msqtemp;}
126 msqtemp = Eb2*Eb2-pb2x*pb2x-pb2y*pb2y-pb2z*pb2z;
127 if (msqtemp > 0.0) {mb2sq = msqtemp;}
135 this->pmissx = pmissx;
136 this->pmissy = pmissy;
151 void mt2w::mt2w_bisect()
159 double mtop_high = upper_bound;
162 if (mb1 >= mb2) {mtop_low =
mw + mb1;}
163 else {mtop_low =
mw + mb2;}
170 if (teco(mtop_high)==0) {mtop_high = mtop_low;}
174 while (teco(mtop_high)==0 && mtop_high < upper_bound + 2.*scan_step) {
177 mtop_high = mtop_high + scan_step;
181 if (mtop_high > upper_bound) {
182 mt2w_b = error_value;
187 while(mtop_high - mtop_low > precision)
189 double mtop_mid,teco_mid;
191 mtop_mid = (mtop_high+mtop_low)/2.;
192 teco_mid = teco(mtop_mid);
194 if(teco_mid == 0) {mtop_low = mtop_mid;}
195 else {mtop_high = mtop_mid;}
205 int mt2w::teco(
double mtop)
210 if (mtop < mb1+
mw || mtop < mb2+
mw) {
return 0;}
214 double ETb2sq = Eb2sq - pb2z*pb2z;
215 double delta = (mtop*mtop-
mw*
mw-mb2sq)/(2.*ETb2sq);
220 double del1 =
mw*
mw - mv*mv - mlsq;
221 double del2 = mtop*mtop -
mw*
mw - mb1sq - 2*(El*Eb1-plx*pb1x-ply*pb1y-plz*pb1z);
225 double aa = (El*pb1x-Eb1*plx)/(Eb1*plz-El*pb1z);
226 double bb = (El*pb1y-Eb1*ply)/(Eb1*plz-El*pb1z);
227 double cc = (El*del2-Eb1*del1)/(2.*Eb1*plz-2.*El*pb1z);
238 a1 = Eb1sq*(1.+aa*aa)-(pb1x+pb1z*aa)*(pb1x+pb1z*aa);
239 b1 = Eb1sq*aa*bb - (pb1x+pb1z*aa)*(pb1y+pb1z*bb);
240 c1 = Eb1sq*(1.+bb*bb)-(pb1y+pb1z*bb)*(pb1y+pb1z*bb);
241 d1 = Eb1sq*aa*cc - (pb1x+pb1z*aa)*(pb1z*cc+del2/2.0);
242 e1 = Eb1sq*bb*cc - (pb1y+pb1z*bb)*(pb1z*cc+del2/2.0);
243 f1 = Eb1sq*(mv*mv+cc*cc) - (pb1z*cc+del2/2.0)*(pb1z*cc+del2/2.0);
247 double det1 = (a1*(c1*f1 - e1*e1) - b1*(b1*f1 - d1*e1) + d1*(b1*e1-c1*d1))/(a1+c1);
249 if (det1 > 0.0) {
return 0;}
253 a2 = 1-pb2x*pb2x/(ETb2sq);
254 b2 = -pb2x*pb2y/(ETb2sq);
255 c2 = 1-pb2y*pb2y/(ETb2sq);
261 f2o =
mw*
mw - delta*delta*ETb2sq;
263 d2 = -d2o -a2*pmissx -b2*pmissy;
264 e2 = -e2o -c2*pmissy -b2*pmissx;
265 f2 = a2*pmissx*pmissx + 2*b2*pmissx*pmissy + c2*pmissy*pmissy + 2*d2o*pmissx + 2*e2o*pmissy + f2o;
268 double x0, h0, y0, r0;
269 x0 = (c1*d1-b1*e1)/(b1*b1-a1*c1);
270 h0 = (b1*x0 + e1)*(b1*x0 + e1) - c1*(a1*x0*x0 + 2*d1*x0 + f1);
271 if (h0 < 0.0) {
return 0;}
272 y0 = (-b1*x0 -e1 + sqrt(h0))/c1;
273 r0 = a2*x0*x0 + 2*b2*x0*y0 + c2*y0*y0 + 2*d2*x0 + 2*e2*y0 + f2;
274 if (r0 < 0.0) {
return 1;}
279 long double A4, A3, A2, A1, A0;
282 -4*a2*b1*b2*c1 + 4*a1*b2*b2*c1 +a2*a2*c1*c1 +
283 4*a2*b1*b1*c2 - 4*a1*b1*b2*c2 - 2*a1*a2*c1*c2 +
287 (-4*a2*b2*c1*d1 + 8*a2*b1*c2*d1 - 4*a1*b2*c2*d1 - 4*a2*b1*c1*d2 +
288 8*a1*b2*c1*d2 - 4*a1*b1*c2*d2 - 8*a2*b1*b2*e1 + 8*a1*b2*b2*e1 +
289 4*a2*a2*c1*e1 - 4*a1*a2*c2*e1 + 8*a2*b1*b1*e2 - 8*a1*b1*b2*e2 -
290 4*a1*a2*c1*e2 + 4*a1*a1*c2*e2)/Eb1;
294 (4*a2*c2*d1*d1 - 4*a2*c1*d1*d2 - 4*a1*c2*d1*d2 + 4*a1*c1*d2*d2 -
295 8*a2*b2*d1*e1 - 8*a2*b1*d2*e1 + 16*a1*b2*d2*e1 +
296 4*a2*a2*e1*e1 + 16*a2*b1*d1*e2 - 8*a1*b2*d1*e2 -
297 8*a1*b1*d2*e2 - 8*a1*a2*e1*e2 + 4*a1*a1*e2*e2 - 4*a2*b1*b2*f1 +
298 4*a1*b2*b2*f1 + 2*a2*a2*c1*f1 - 2*a1*a2*c2*f1 +
299 4*a2*b1*b1*f2 - 4*a1*b1*b2*f2 - 2*a1*a2*c1*f2 + 2*a1*a1*c2*f2)/Eb1sq;
302 (-8*a2*d1*d2*e1 + 8*a1*d2*d2*e1 + 8*a2*d1*d1*e2 - 8*a1*d1*d2*e2 -
303 4*a2*b2*d1*f1 - 4*a2*b1*d2*f1 + 8*a1*b2*d2*f1 + 4*a2*a2*e1*f1 -
304 4*a1*a2*e2*f1 + 8*a2*b1*d1*f2 - 4*a1*b2*d1*f2 - 4*a1*b1*d2*f2 -
305 4*a1*a2*e1*f2 + 4*a1*a1*e2*f2)/(Eb1sq*Eb1);
308 (-4*a2*d1*d2*f1 + 4*a1*d2*d2*f1 + a2*a2*f1*f1 +
309 4*a2*d1*d1*f2 - 4*a1*d1*d2*f2 - 2*a1*a2*f1*f2 +
310 a1*a1*f2*f2)/(Eb1sq*Eb1sq);
312 long double B3, B2,
B1,
B0;
318 long double C2, C1,
C0;
319 C2 = -(A2/2 - 3*A3*A3/(16*A4));
320 C1 = -(3*A1/4. -A2*A3/(8*A4));
321 C0 = -A0 + A1*A3/(16*A4);
324 D1 = -B1 - (B3*C1*C1/C2 - B3*C0 -B2*C1)/C2;
325 D0 = -B0 - B3 *C0 *C1/(C2*C2)+ B2*C0/C2;
328 E0 = -C0 - C2*D0*D0/(D1*D1) + C1*D0/D1;
330 long double t1,t2,t3,t4,t5;
341 nsol = signchange_n(t1,t2,t3,t4,t5) - signchange_p(t1,t2,t3,t4,t5);
344 if (nsol < 0) nsol = 0;
347 if (nsol == 0) {out = 0;}
354 inline int mt2w::signchange_n(
long double t1,
long double t2,
long double t3,
long double t4,
long double t5)
364 inline int mt2w::signchange_p(
long double t1,
long double t2,
long double t3,
long double t4,
long double t5)
Spectrum Spectrum Spectrum mw
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)