Calculate the outgoing leptons and the event weight for one single radiative Bhabha scattering.
156{
157
158 double z;
159 if (gRandom->Uniform() <
ac) {
160 double temp1 = gRandom->Uniform();
161
162
163 z = 1.0 / (temp1 * (expm1(
a1 * gRandom->Uniform())));
164 } else {
165 z =
z0 / gRandom->Uniform();
166 }
167
168
169 double y =
rme2s * z;
171 double temp1 =
pb *
pb -
eb * q0;
172 double temp2 = temp1 * temp1 -
rme2 - q0 * q0;
173
174
175 if (temp2 < 0.0) {
176 B2WARNING("BBBrem: y too large: delta_t^2 = " << temp2 << " !!!");
178 } else {
179 double tmin = -2.0 * (temp1 +
sqrt(temp2));
180 double tmax =
rme2 *
s * y * y / tmin;
181
182
184 double w2 = sy +
rme2;
185 temp1 = sy + tmax;
186 double rlamx =
sqrt(temp1 * temp1 - 4.0 * w2 * tmax);
187
188 if (temp1 <= 0.0) {
189 temp1 = rlamx - temp1;
190 } else {
191 temp1 = -4.0 * w2 * tmax / (rlamx + temp1);
192 }
193
194 double t = 0.0;
195 do {
196 double b;
197
198
199 b = exp(gRandom->Uniform() * log1p(2.0 * sy / temp1));
200 t = -b * z * z *
rme2 / ((b - 1) * (b * z + b - 1));
201 } while (t <= tmin);
202
203
204 double rlam =
sqrt((sy - t) * (sy - t) - 4 *
rme2 * t);
205 double eps = 4 *
rme2 * w2 / (rlam * (rlam + w2 +
rme2 - t));
206 double rl = log((2 + eps) / eps);
207
208
209 double vgam = eps * (expm1(gRandom->Uniform() * rl));
210 double cgam = 1.0 - vgam;
211 double sgam =
sqrt(vgam * (2 - vgam));
212
213
214 double phi =
twopi * gRandom->Uniform();
215 double phig =
twopi * gRandom->Uniform();
216
217
218 double ql = (2.0 *
eb * q0 - t) *
rin2pb;
219 double qt =
sqrt((tmax - t) * (t - tmin)) *
rin2pb;
220 double q[4];
221 q[0] = qt * sin(phi);
222 q[1] = qt * cos(phi);
223 q[2] = ql;
224 q[3] = q0;
225
226
227 q2[0] =
q1[0] - q[0];
228 q2[1] =
q1[1] - q[1];
229 q2[2] =
q1[2] - q[2];
230 q2[3] =
q1[3] - q[3];
231
232
235 double rin2w = 0.5 / w;
236 double rinr0w = 1.0 / (r0 + w);
237 double eta = -(sy + 2 * w * q0 + t) * rin2w * rinr0w;
238 double phat1 = -q[0] * (1 + eta);
239 double phat2 = -q[1] * (1 + eta);
240 double phat3 =
pb * eta - ql * (1 + eta);
241 double phatl = rlam * rin2w;
242 double phatt =
sqrt(phat1 * phat1 + phat2 * phat2);
243 double sfhat = phat1 / phatt;
244 double cfhat = phat2 / phatt;
245 double sthat = phatt / phatl;
246 double vthat;
247 if (phat3 > 0.0) {
248 vthat = sthat * sthat / (1 -
sqrt(1 - sthat * sthat));
249 } else {
250 vthat = sthat * sthat / (1 +
sqrt(1 - sthat * sthat));
251 }
252 double cthat = vthat - 1.0;
253
254
255 double sfg = sin(phig);
256 double cfg = cos(phig);
257 temp1 = sgam * sfg;
258 temp2 = cthat * sgam * cfg + sthat * cgam;
259 double veg = vthat + vgam - vthat * vgam - sthat * sgam * cfg;
260 double qkhat[4];
261 qkhat[3] = sy * rin2w;
262 qkhat[0] = qkhat[3] * (cfhat * temp1 + sfhat * temp2);
263 qkhat[1] = qkhat[3] * (-sfhat * temp1 + cfhat * temp2);
264 qkhat[2] = qkhat[3] * (veg - 1.0);
265
266
267 temp1 =
pb * qkhat[2];
268 if (temp1 > 0.0) {
269 temp2 = (
rme2 * qkhat[3] * qkhat[3] +
pb *
pb * (qkhat[0] * qkhat[0] + qkhat[1] * qkhat[1])) / (
eb * qkhat[3] + temp1);
270 } else {
271 temp2 =
eb * qkhat[3] - temp1;
272 }
273
274 qk[3] = (temp2 + qkhat[3] * q[3] + qkhat[0] * q[0] + qkhat[1] * q[1] + qkhat[2] * q[2]) / w;
275 temp1 = (
qk[3] + qkhat[3]) * rinr0w;
276 qk[0] = qkhat[0] + temp1 * q[0];
277 qk[1] = qkhat[1] + temp1 * q[1];
278 qk[2] = qkhat[2] + temp1 * (-
pb + ql);
279
280
285
286
289 } else {
290
291
292
293
294 double c1 = log1p(z) / log((2.0 + eps) / eps);
295
296
297 temp1 = sy - tmax;
298 double vnumx =
sqrt(temp1 * temp1 - 4.0 *
rme2 * tmax) + temp1;
299 temp1 = sy + tmax;
300
301 double vdenx;
302 if (temp1 < 0.0) {
303 vdenx =
sqrt(temp1 * temp1 - 4.0 * w2 * tmax) - temp1;
304 } else {
305 vdenx = -4.0 * w2 * tmax / (
sqrt(temp1 * temp1 - 4.0 * w2 * tmax) + temp1);
306 }
307 temp1 = sy - tmin;
308 double vnumn =
sqrt(temp1 * temp1 - 4.0 *
rme2 * tmin) + temp1;
309 temp1 = sy + tmin;
310
311 double vdenn;
312 if (temp1 < 0.0) {
313 vdenn =
sqrt(temp1 * temp1 - 4.0 * w2 * tmin) - temp1;
314 } else {
315 vdenn = -4.0 * w2 * tmin / (
sqrt(temp1 * temp1 - 4.0 * w2 * tmin) + temp1);
316 }
317 double c2 = 2.0 *
rls / log((vnumx * vdenn) / (vdenx * vnumn));
318
319
321 double rhat4 = -(2.0 *
rme2 * y + (1 - y) * t) * rin2w;
322 double etar = rhat4 * rinr0w;
323 double rhat1 = -q[0] * (1 + etar);
324 double rhat2 = -q[1] * (1 + etar);
325 double rhat3 = rlabl + (
pb - ql) * etar;
326 double zz =
s * (rhat4 * qkhat[3] - rhat1 * qkhat[0] - rhat2 * qkhat[1] - rhat3 * qkhat[2]);
327
328
329 double s1 = 4.0 *
eb * (
eb -
qk[3]);
330 double d1 = sy * rlam * (eps + vgam) * rin2w * rin2w;
331 double d2 = 0.5 * sy;
332
333
334
335 double rind1 = 1.0 / d1;
336 double rind12 = rind1 * rind1;
337 double rind2 = 1.0 / d2;
338 double rind22 = rind2 * rind2;
339 temp1 =
s + t - 2 * d2;
340 temp2 = s1 + t + 2 * d1;
341 double aa0 = (
s *
s + s1 * s1 + temp1 * temp1 + temp2 * temp2) * rind1 * rind2 * (-t);
342 double aa1 = -4.0 *
rme2 * zz * zz * rind12 * rind22;
343 double aa2 = -8.0 *
rme2 * (d1 * d1 + d2 * d2) * rind1 * rind2;
344 double aa3 = 16.0 *
rme2 *
rme2 * (d1 - d2) * zz * rind12 * rind22;
345 double aa4 = -16.0 *
rme2 *
rme2 *
rme2 * (d1 - d2) * (d1 - d2) * rind12 * rind22;
346 double rmex = aa0 + aa1 + aa2 + aa3 + aa4;
347
348
349 double rmap = 4.0 *
s *
s * rind1 * rind2 * (-t) * c1 * c2;
350
351
353
354
356 B2WARNING("BBBrem: Weight is nan! Setting the weight to zero.");
358 }
359
360
361
362
363
364
365
366
367
369
371 if (abs(t) < tc)
weight = 0.0;
373 if (t != tc)
weight *= t * t / (t - tc) / (t - tc);
374 }
375
376
377 }
378 }
379}
static constexpr double twopi
2*pi.
double sqrt(double a)
sqrt for double