Belle II Software  release-08-01-10
BBBrem Class Reference

Generator for low scattering angle radiative Bhabha events (Beam-Beam Bremsstrahlung). More...

#include <BBBrem.h>

Public Member Functions

 BBBrem ()
 Constructor.
 
 ~BBBrem ()
 Destructor.
 
void init (double cmsEnergy, double minPhotonEFrac, bool unweighted=true, double maxWeight=2000.0, int densitymode=1, double densityparameter=1.68e-17)
 Initializes the generator. More...
 
double generateEvent (MCParticleGraph &mcGraph, ROOT::Math::XYZVector vertex, ROOT::Math::LorentzRotation boost)
 Generates one single event. More...
 
double getCrossSection ()
 Returns the total cross section of the generated process in millibarn. More...
 
double getCrossSectionError ()
 Returns the error on the total cross section of the generated process in millibarn. More...
 
double getCrossSectionOver ()
 Returns the total overweight bias cross section of the generated process in millibarn. More...
 
double getCrossSectionErrorOver ()
 Returns the error on the total overweight bias cross section of the generated process in millibarn. More...
 
double getMaxWeightDelivered ()
 Returns the maximum weight given by the BBBrem generation. More...
 
double getSumWeightDelivered ()
 Returns the sum of all weights returned by the BBBrem generation. More...
 
void term ()
 Terminates the generator.
 

Protected Member Functions

void calcOutgoingLeptonsAndWeight ()
 Calculate the outgoing leptons and the event weight for one single radiative Bhabha scattering. More...
 
void storeParticle (MCParticleGraph &mcGraph, const double *mom, int pdg, ROOT::Math::XYZVector vertex, ROOT::Math::LorentzRotation boost, bool isVirtual=false, bool isInitial=false)
 Store a single generated particle into the MonteCarlo graph. More...
 

Protected Attributes

int m_eventCount
 Internal event counter. More...
 
bool m_unweighted
 True if BBBrem should produce unweighted events.
 
long m_weightCount
 Internal weighted event counter. More...
 
long m_weightCountOver
 Internal overweighted event counter. More...
 
double m_maxWeight
 The maximum weight. More...
 
double m_maxWeightDelivered
 The maximum weight given by the BBBrem generation.
 
double m_sumWeightDelivered
 The sum of all weights returned by the BBBrem generation.
 
double m_sumWeightDeliveredSqr
 The square of the sum of all weights returned by the BBBrem generation.
 
double m_sumWeightDeliveredOver
 The sum of all overweights.
 
double m_sumWeightDeliveredSqrOver
 The square of the sum of all overweights.
 
double m_cmsEnergy
 Center of mass energy (sqrt(s)).
 
double m_photonEFrac
 Minimum photon energy fraction.
 
double m_crossSection
 The cross-section in millibarns.
 
double m_crossSectionError
 The error on the cross-section in millibarns.
 
double m_crossSectionOver
 The overweight bias cross-section in millibarns.
 
double m_crossSectionErrorOver
 The overweight bias error on the cross-section in millibarns.
 
int m_densityCorrectionMode
 Mode for bunch density correction.
 
double m_densityCorrectionParameter
 Density correction parameter tc.
 

Private Attributes

double alpha
 variable

 
double rme
 in MeV
 
double s
 variable

 
double rme2
 variable

 
double rme2s
 variable

 
double rls
 variable

 
double z0
 variable

 
double a1
 variable

 
double a2
 variable

 
double ac
 variable

 
double sigapp
 variable

 
double eb
 variable

 
double pb
 variable

 
double rin2pb
 variable

 
double p1 [4]
 variable

 
double p2 [4]
 variable

 
double q1 [4]
 variable

 
double q2 [4]
 variable

 
double qk [4]
 variable

 
double weight
 variable

 

Static Private Attributes

static constexpr double tomb = 3.8937966e5 / 1e6
 Conversion factor (hc)^2.
 
static constexpr double twopi = 2.0 * M_PI
 2*pi. More...
 

Detailed Description

Generator for low scattering angle radiative Bhabha events (Beam-Beam Bremsstrahlung).

Based on the FORTRAN source code from R. Kleiss. In order to be consistent with the original source code, the variable names are kept and might therefore violate the coding conventions.

Original authors: r. Kleiss and h. Burkhardt Reference: [arXiv:hep-ph/9401333v1]

Definition at line 31 of file BBBrem.h.

Member Function Documentation

◆ calcOutgoingLeptonsAndWeight()

void calcOutgoingLeptonsAndWeight ( )
protected

Calculate the outgoing leptons and the event weight for one single radiative Bhabha scattering.

The main method. A direct translation from the BBBrem Fortran source code.

Definition at line 155 of file BBBrem.cc.

156 {
157  //Generate z
158  double z;
159  if (gRandom->Uniform() < ac) {
160  double temp1 = gRandom->Uniform();
161 // z = 1.0 / (temp1 * (exp(a1 * gRandom->Uniform()) - 1.0));
162 // Expression 'exp(x) - 1' is replaced by 'expm1(x)' to avoid loss of precision.
163  z = 1.0 / (temp1 * (expm1(a1 * gRandom->Uniform())));
164  } else {
165  z = z0 / gRandom->Uniform();
166  }
167 
168  //Bounds on t
169  double y = rme2s * z;
170  double q0 = eb * y;
171  double temp1 = pb * pb - eb * q0;
172  double temp2 = temp1 * temp1 - rme2 - q0 * q0;
173 
174  //If temp2<0 (very very rare): set weight to 0
175  if (temp2 < 0.0) {
176  B2WARNING("BBBrem: y too large: delta_t^2 = " << temp2 << " !!!");
177  weight = 0.0;
178  } else {
179  double tmin = -2.0 * (temp1 + sqrt(temp2));
180  double tmax = rme2 * s * y * y / tmin;
181 
182  //Generate t
183  double sy = s * y;
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 // b = exp(gRandom->Uniform() * log(1.0 + 2.0 * sy / temp1));
198 // Expression 'log(1 + x)' is replaced by 'log1p(x)' to avoid loss of precision.
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  //Generate cgam
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 // double vgam = eps * (exp(gRandom->Uniform() * rl) - 1.0);
208 // Expression 'exp(x) - 1' is replaced by 'expm1(x)' to avoid loss of precision.
209  double vgam = eps * (expm1(gRandom->Uniform() * rl));
210  double cgam = 1.0 - vgam;
211  double sgam = sqrt(vgam * (2 - vgam));
212 
213  //Generate azimuthal angles
214  double phi = twopi * gRandom->Uniform();
215  double phig = twopi * gRandom->Uniform();
216 
217  //Construct momentum transfer q(mu)
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  //Construct momentum of outgoing positron in lab frame
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  //Find euler angles of p1(mu) in cm frame
233  double r0 = eb + q0;
234  double w = sqrt(w2);
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  //Rotate using these euler angles to get the qk direction in the cm
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  //Boost the photon momentum to the lab frame
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  //Construct p2 by momentum conservation
281  p2[0] = -q2[0] - qk[0];
282  p2[1] = -q2[1] - qk[1];
283  p2[2] = -q2[2] - qk[2];
284  p2[3] = -q2[3] - qk[3] + m_cmsEnergy;
285 
286  //Impose cut on the photon energy: qk[3]>eb*rk0
287  if (qk[3] < eb * m_photonEFrac) {
288  weight = 0.0;
289  } else {
290  //The event is now accepted: compute matrix element and weight
291  //Compute fudge factor c1
292 // double c1 = log(1 + z) / log((2 + eps) / eps);
293 // Expression 'log(1 + x)' is replaced by 'log1p(x)' to avoid loss of precision.
294  double c1 = log1p(z) / log((2.0 + eps) / eps);
295 
296  //Compute fudge factor c2
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  //Compute vector (small) r in cm frame, and (big) z
320  double rlabl = (t - 2.0 * rme2 * y) * rin2pb;
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  //The other invariants
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  //The exact matrix element
334  //Kleiss-burkhardt cross section multiplied by t^2
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  //The approximate matrix element without c1,2, multiplied by t^2
349  double rmap = 4.0 * s * s * rind1 * rind2 * (-t) * c1 * c2;
350 
351  //The weight
352  weight = rmex / rmap * sigapp;
353 
354  //Isnan check (not sure if this is ok)
355  if (std::isnan(weight)) {
356  B2WARNING("BBBrem: Weight is nan! Setting the weight to zero.");
357  weight = 0.0;
358  }
359 
360 
361  //========================================================
362  // beam size effect (or density effect)
363  // ref: arxiv:hep-ph/9401333
364 
365  // tc = (hbarc/simga_y)^2
366 // double tc = 1.68e-17; //SuperKEKB LER (sigma_y*=48nm)
367  //double tc = 9.81e-18; //SuperKEKB HER (sigma_y*=63nm)
368  double tc = m_densityCorrectionParameter;
369 // int cutflag = 0 ; // 0: no cut, 1: hard cut, 2: soft cut
370  if (m_densityCorrectionMode == 1) {
371  if (abs(t) < tc) weight = 0.0;
372  } else if (m_densityCorrectionMode == 2) {
373  if (t != tc) weight *= t * t / (t - tc) / (t - tc); // t<0<tc, always t!=tc
374  }
375  //========================================================
376 
377  }
378  }
379 }
double rme2
variable
Definition: BBBrem.h:184
double sigapp
variable
Definition: BBBrem.h:191
double rme2s
variable
Definition: BBBrem.h:185
double m_cmsEnergy
Center of mass energy (sqrt(s)).
Definition: BBBrem.h:146
double rin2pb
variable
Definition: BBBrem.h:194
double m_densityCorrectionParameter
Density correction parameter tc.
Definition: BBBrem.h:155
static constexpr double twopi
2*pi.
Definition: BBBrem.h:178
double pb
variable
Definition: BBBrem.h:193
double a1
variable
Definition: BBBrem.h:188
double z0
variable
Definition: BBBrem.h:187
double p2[4]
variable
Definition: BBBrem.h:196
double eb
variable
Definition: BBBrem.h:192
double weight
variable
Definition: BBBrem.h:200
double q1[4]
variable
Definition: BBBrem.h:197
double ac
variable
Definition: BBBrem.h:190
double q2[4]
variable
Definition: BBBrem.h:198
double qk[4]
variable
Definition: BBBrem.h:199
double m_photonEFrac
Minimum photon energy fraction.
Definition: BBBrem.h:147
int m_densityCorrectionMode
Mode for bunch density correction.
Definition: BBBrem.h:154
double s
variable
Definition: BBBrem.h:183
double rls
variable
Definition: BBBrem.h:186
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28

◆ generateEvent()

double generateEvent ( MCParticleGraph mcGraph,
ROOT::Math::XYZVector  vertex,
ROOT::Math::LorentzRotation  boost 
)

Generates one single event.

Parameters
mcGraphReference to the MonteCarlo graph into which the generated particles will be stored.
vertexProduction vertex.
boostLorentz boost vector.
Returns
Returns the weight of the event.

Definition at line 80 of file BBBrem.cc.

◆ getCrossSection()

double getCrossSection ( )
inline

Returns the total cross section of the generated process in millibarn.

Returns
The total cross section.

Definition at line 101 of file BBBrem.h.

101 { return m_crossSection; }
double m_crossSection
The cross-section in millibarns.
Definition: BBBrem.h:149

◆ getCrossSectionError()

double getCrossSectionError ( )
inline

Returns the error on the total cross section of the generated process in millibarn.

Returns
The error on the total cross section.

Definition at line 106 of file BBBrem.h.

◆ getCrossSectionErrorOver()

double getCrossSectionErrorOver ( )
inline

Returns the error on the total overweight bias cross section of the generated process in millibarn.

Returns
The error on the total overweight bias cross section.

Definition at line 116 of file BBBrem.h.

◆ getCrossSectionOver()

double getCrossSectionOver ( )
inline

Returns the total overweight bias cross section of the generated process in millibarn.

Returns
The total overweight bias cross section.

Definition at line 111 of file BBBrem.h.

◆ getMaxWeightDelivered()

double getMaxWeightDelivered ( )
inline

Returns the maximum weight given by the BBBrem generation.

Returns
The maximum weight given by the BBBrem generation.

Definition at line 121 of file BBBrem.h.

◆ getSumWeightDelivered()

double getSumWeightDelivered ( )
inline

Returns the sum of all weights returned by the BBBrem generation.

Returns
The sum of all weights returned by the BBBrem generation.

Definition at line 126 of file BBBrem.h.

◆ init()

void init ( double  cmsEnergy,
double  minPhotonEFrac,
bool  unweighted = true,
double  maxWeight = 2000.0,
int  densitymode = 1,
double  densityparameter = 1.68e-17 
)

Initializes the generator.

Parameters
cmsEnergyThe center of mass energy in [GeV].
minPhotonEFracThe minimum photon energy fraction. The min. photon energy is this fraction * beam energy.
unweightedSet to true to generate unweighted events (e.g. for detector simulation), set to false for weighted events.
maxWeightThe maximum weight. Only required in the case of unweighted events.
densitymodeTODO
densityparameterTODO

Definition at line 21 of file BBBrem.cc.

◆ storeParticle()

void storeParticle ( MCParticleGraph mcGraph,
const double *  mom,
int  pdg,
ROOT::Math::XYZVector  vertex,
ROOT::Math::LorentzRotation  boost,
bool  isVirtual = false,
bool  isInitial = false 
)
protected

Store a single generated particle into the MonteCarlo graph.

Parameters
mcGraphReference to the MonteCarlo graph into which the particle should be stored.
momThe 3-momentum of the particle in [GeV].
pdgThe PDG code of the particle.
vertexThe vertex of the particle in [mm].
boostLorentz boost vector.
isVirtualIf the particle is a virtual particle, such as the incoming particles, set this to true.
isInitialIf the particle is a initial particle for ISR, set this to true.

Definition at line 382 of file BBBrem.cc.

Member Data Documentation

◆ m_eventCount

int m_eventCount
protected

Internal event counter.

Used to calculate the cross-section.

Definition at line 136 of file BBBrem.h.

◆ m_maxWeight

double m_maxWeight
protected

The maximum weight.

Used for the event rejection procedure to produce unweighted events.

Definition at line 140 of file BBBrem.h.

◆ m_weightCount

long m_weightCount
protected

Internal weighted event counter.

Used to calculate the cross-section.

Definition at line 138 of file BBBrem.h.

◆ m_weightCountOver

long m_weightCountOver
protected

Internal overweighted event counter.

Used to calculate the cross-section.

Definition at line 139 of file BBBrem.h.

◆ twopi

constexpr double twopi = 2.0 * M_PI
staticconstexprprivate

2*pi.

To keep things short.

Definition at line 178 of file BBBrem.h.


The documentation for this class was generated from the following files: