Belle II Software  release-06-00-14
UtrepsB.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <TLorentzVector.h>
10 #include <generators/treps/UtrepsB.h>
11 
12 using namespace Belle2;
13 
14 
15 UtrepsB::UtrepsB(void) : TrepsB()
16 {
17 }
18 
19 void UtrepsB::initg(void)
20 {
21  B2DEBUG(20, " UtrepsB initg Pmodel " << TrepsB::pmodel);
22 
23  if (TrepsB::pmodel == 251) {
24  // pi+pi-
25 
26  //parametrization of pi+pi- partial waves
27 
28  static double data001[21] = { 20., 15., 9., 8., 8., 7., 5.3, 5.2, 5.2, 5.2, 5.2, 4., 3., 2., 2., 2., 2., 2., 1., 0., 0. };
29  static double data201[21] = { 1., 5., 5, 5., 4., 4., 4., 4., 3., 3., 3., 2., 1., 1., 1., 1., 0., 0., 0., 1., 1. };
30  static double data221[21] = { 1., 5., 5., 6., 7., 7.18, 6.68, 6.27, 5.91, 5.61, 5., 5., 4., 3., 2., 2., 2., 1., 0., 0., 0. };
31  b00 = Interps(0.3, 2.3, 20, data001);
32  b20 = Interps(0.3, 2.3, 20, data201);
33  b22 = Interps(0.3, 2.3, 20, data221);
34  }
35 
36  if (TrepsB::pmodel == 252) {
37  // K+K-
38  static double data002[15] = { 2., 2., 2., 2., 2., 2., 3., 4., 4.5, 5., 5., 5., 4.5, 4.5, 4.3 };
39  static double data202[15] = { 1., 2., 3., 4., 5., 5., 5., 5., 5., 5., 5., 4., 3.0, 2.2, 1. };
40  static double data222[15] = { 0., 0., 0., 0., 0., 0., -1., -3., -3., -3., -3., -4., -3.5, -3., -2.5 };
41  b00 = Interps(1.0, 2.4, 14, data002);
42  b20 = Interps(1.0, 2.4, 14, data202);
43  b22 = Interps(1.0, 2.4, 14, data222);
44  }
45 
46  if (TrepsB::pmodel == 253) {
47  // ppbar
48  static double data003[9] = { 2.3, 2.3, 7.26, 7.94, 8.53, 7.38, 3.25, 1.98, 2.30};
49  static double data203[9] = { 9.63, 9.63, 10.73, 8.02, 6.18, 3.37, 0.63, 0.10, 0.66};
50  static double data223[9] = { 1.48, 1.48, -4.62, -6.12, -6.78, -5.35, -1.82, -1.02, -1.63};
51  b00 = Interps(2.05, 2.85, 8, data003);
52  b20 = Interps(2.05, 2.85, 8, data203);
53  b22 = Interps(2.05, 2.85, 8, data223);
54  }
55 
56 
57  return;
58 }
59 
60 double UtrepsB::d2func(double y) const
61 {
62  return 1. / (9. + 3.*y * y + y * y * y * y);
63 }
64 
65 double UtrepsB::qfunc(double y, double mm) const
66 {
67  return sqrt(0.25 * y - mm * mm);
68 }
69 
70 //form factor effect
71 double UtrepsB::tpform(double _q2, double _w) const
72 {
73  double dis = 1. / pow((1.0 + _q2 / (_w * _w)), 2);
74  if (TrepsB::fmodel == 1) {
75  // rho form factor
76  dis = 1. / pow((1.0 + _q2 / (0.77 * 0.77)), 2);
77  }
78  if (TrepsB::fmodel == 2) {
79  // J/psi form factor
80  dis = 1. / pow((1.0 + _q2 / (3.097 * 3.097)), 2);
81  }
82 
83  return dis;
84 }
85 
86 
87 //angular distribution for final 2-body case
88 double UtrepsB::tpangd(double _z, double _w)
89 {
90  // no normalization is necessary
91 
92  double ww = _w;
93  double zz = _z;
94 
95  double dcs;
96 
97  dcs = 1.;
98 
99  if (TrepsB::pmodel == 201) {
100  // 2+(0) --> PP
101  dcs = 3.*zz * zz - 1.;
102  return dcs;
103  }
104 
105  if (TrepsB::pmodel == 202) {
106  // 2+(2) --> PP
107  dcs = pow(1. - zz * zz, 2);
108  return dcs;
109  }
110 
111  if (TrepsB::pmodel == 251) {
112  // pi+pi-
113  double mr = 1.2755;
114  double gtot = 0.1859;
115  double br = 0.561;
116  double sr = 3.62;
117  double ggg = 2.62e-6;
118  double phas = 22.8 / 180.*3.14159;
119  double gtot0 = 0.03;
120 
121  double v00 = 0., v20 = 0., v22 = 0. ;
122 
123  if (ww < 0.295) {
124  v00 = v20 = v22 = 0.0 ;
125  } else if (ww < 2.3) {
126  v00 = b00.get_val(ww);
127  v20 = b20.get_val(ww);
128  v22 = b22.get_val(ww);
129  }
130 
131  double dcs2 = 0.;
132 
133  if (ww < 2.3) {
134  double mr0 = 0.98;
135  double speak = 18.3;
136  double mm = 0.1396;
137  double gf = pow(qfunc(ww * ww, mm) / qfunc(mr * mr, mm), 5) *
138  d2func(qfunc(ww * ww, mm) * sr) / d2func(qfunc(mr * mr, mm) * sr);
139  std::complex<double> imagu(0.0, 1.0);
140  std::complex<double> rbr = sqrt(40.*3.14159 * mr / ww * ggg * gtot * br) * gf /
141  ((-ww * ww + mr * mr) - imagu * mr * gtot * gf) *
142  sqrt(389000.);
143  rbr = (cos(phas) + imagu * sin(phas)) * rbr;
144 
145  dcs2 = pow(v00 + v20 * sqrt(5.) * 0.5 * (3.*zz * zz - 1.), 2) +
146  (v22 * v22 + 2.*v22 * rbr.real() + pow(std::abs(rbr), 2)) *
147  15. / 8.*pow(1. - zz * zz, 2)
148  + speak * 0.25 * gtot0 * gtot0 / (pow(ww - mr0, 2) + 0.25 * gtot0 * gtot0);
149  } else {
150  if (abs(zz) < 0.8) dcs2 = 263. / pow(ww, 6) / pow(1. - zz * zz, 2);
151  else dcs2 = 263. / pow(ww, 6) / pow(1. - 0.8 * 0.8, 2);
152  }
153  return dcs2 * 0.5;
154  }
155 
156  if (TrepsB::pmodel == 252) {
157  //K+K-
158  double mr = 1.522;
159  double gtot = 0.0814;
160  double br = 0.45;
161  double sr = 3.62;
162  double ggg = 0.081e-6;
163  double gtotfa = 0.13;
164 
165  double s00 = 0., s20 = 0., s22 = 0. ;
166 
167  if (ww < 1.1) {
168  s00 = s20 = s22 = 0.0 ;
169  } else if (ww < 2.4) {
170  s00 = b00.get_val(ww);
171  s20 = b20.get_val(ww);
172  s22 = b22.get_val(ww);
173  }
174 
175  double dcs2 = 0.;
176 
177  if (ww < 2.4) {
178  double mrfa = 1.29;
179  double speak = 40.;
180  double mm = 0.4937;
181  double gf = pow(qfunc(ww * ww, mm) / qfunc(mr * mr, mm), 5) *
182  d2func(qfunc(ww * ww, mm) * sr) / d2func(qfunc(mr * mr, mm) * sr);
183  std::complex<double> imagu(0.0, 1.0);
184  std::complex<double> rbr = sqrt(40.*3.14159 * mr / ww * ggg * gtot * br) * gf /
185  ((-ww * ww + mr * mr) - imagu * mr * gtot * gf) *
186  sqrt(389000.);
187 
188  dcs2 = s00 + s20 * pow(sqrt(5.) * 0.5 * (3.*zz * zz - 1.), 2) +
189  (s22 + pow(std::abs(rbr), 2)
190  + speak * 0.25 * gtotfa * gtotfa / (pow(ww - mrfa, 2) + 0.25 * gtotfa * gtotfa)) *
191  15. / 8.*pow(1. - zz * zz, 2) ;
192  } else {
193  if (abs(zz) < 0.8) dcs2 = 241. / pow(ww, 6) / pow(1. - zz * zz, 2);
194  else dcs2 = 241. / pow(ww, 6) / pow(1. - 0.8 * 0.8, 2);
195  }
196  return dcs2 * 0.5;
197  }
198 
199  if (TrepsB::pmodel == 253) {
200  //ppbar
201  double s00 = 0., s20 = 0., s22 = 0. ;
202 
203  if (ww < 2.85) {
204  s00 = b00.get_val(ww);
205  s20 = b20.get_val(ww);
206  s22 = b22.get_val(ww);
207  } else {
208  double ww0 = 2.85;
209  s00 = b00.get_val(ww0) * pow(ww0 / ww, 12);
210  s20 = b20.get_val(ww0) * pow(ww0 / ww, 12);
211  s22 = b22.get_val(ww0) * pow(ww0 / ww, 12);
212  }
213  double dcs2 = 0.;
214 
215  // eta_c resonance
216  double mr = 2.984;
217  double gtot = 0.032;
218  double gggbr ; gggbr = 0.00152 * 0.000005;
219 
220  double sigr = 8.*3.14159 * mr / ww * gggbr * gtot / (pow(mr * mr - ww * ww, 2) + mr * mr * gtot * gtot)
221  * 389000.;
222 
223  if (ww > 2.0)
224  dcs2 = s00 + sigr + s20 * (5. / 4.) * pow(3.*zz * zz - 1, 2) + s22 * (15. / 8.) * pow(1. - zz * zz, 2);
225 
226  return dcs2 * 0.5;
227  }
228 
229 
230  return dcs;
231 
232 }
233 
234 int UtrepsB::tpuser(TLorentzVector _pe, TLorentzVector _pp,
235  Part_gen* part, int _npart)
236 {
237  // user decision routine for extra generation conditions.
238  // Return positive integer for the generation, otherwise, this event will
239  // be canceled.
240  // CAUTION!: The 4-momenta of particles are in e+e- cms
241  B2DEBUG(20, " _pe(" << _pe.Px() << "," << _pe.Py() << "," << _pe.Pz() << ") and "
242  << " _pp(" << _pp.Px() << "," << _pp.Py() << "," << _pp.Pz() << ") are given but not used");
243 
244 
245  int iret = 1;
246 
247  // 3-body physics models
248 
249  if (_npart == 3 && TrepsB::pmodel >= 301 && TrepsB::pmodel <= 399) {
250 
251  int index1 = 0, index2 = 1, index3 = 2;
252  double z, m12, zp, phip, zs, phis, phi0;
253 
254  tpkin3(part, index1, index2, index3, z, m12, zp,
255  phip, zs, phis, phi0);
256 
257  double u = sqrt(1. - z * z);
258  double up = sqrt(1. - zp * zp);
259  double us = sqrt(1. - zs * zs);
260 
261  double wei = 0., weimax = 0.;
262 
263 
264 
265  if (TrepsB::pmodel == 301) {
266  // 0- -> VP -> 3P
267  wei = zs * zs;
268  weimax = 1.;
269  }
270  if (TrepsB::pmodel == 302) {
271  // 2+(0) -> VP -> 3P
272  wei = z * z * u * u * up * up * pow(sin(phip), 2);
273  weimax = 1.;
274  }
275  if (TrepsB::pmodel == 303) {
276  // 2+(2) -> VP -> 3P
277  wei = u * u * (u * u * zp * zp + z * z * up * up - 2.*u * z * up * zp * cos(phip));
278  weimax = 2.5;
279  }
280  if (TrepsB::pmodel == 304) {
281  // 0- -> TP -> 3P
282  wei = pow(3.*zs * zs - 1., 2);
283  weimax = 4.;
284  }
285  if (TrepsB::pmodel == 305) {
286  // 2+(0) -> TP -> 3P
287  wei = u * u * up * up * zp * zp * pow(sin(phip), 2);
288  weimax = 1.;
289  }
290  if (TrepsB::pmodel == 306) {
291  // 2+(2) -> TP -> 3P
292  wei = up * up * (z * z * up * up + u * u * zp * zp - 2.*z * u * zp * up * cos(phip));
293  weimax = 2.5;
294  }
295  if (TrepsB::pmodel == 307) {
296  // 2- -> SP -> 3P
297  wei = pow(3.*zp * zp - 1., 2);
298  weimax = 2.;
299  }
300  if (TrepsB::pmodel == 308) {
301  // 2- -> VP -> 3P
302  wei = z * zp - 0.5 * u * up * cos(phip);
303  weimax = 1.5;
304  }
305  if (TrepsB::pmodel == 309) {
306  // 2- -> TP -> 3P
307  wei = pow(3.*zs * zs - 1., 2);
308  weimax = 4.;
309  }
310 
311  if (TrepsB::pmodel == 331) {
312  // 2+(0) -> VP -> PgP
313  wei = u * u * (1. - us * us * pow(cos(phis), 2));
314  weimax = 1.;
315  }
316  if (TrepsB::pmodel == 332) {
317  // 2+(2) -> VP -> PgP
318  wei = u * u * (1. + z * z * zs * zs - u * u * us * us * pow(cos(phis), 2));
319  weimax = 2.;
320  }
321  if (TrepsB::pmodel == 333) {
322  // 0+/- -> Vg -> PPg
323  wei = us * us;
324  weimax = 1.;
325  }
326  if (TrepsB::pmodel == 334) {
327  // 0+ -> Vg (E1) --> llg
328  wei = 1. + zs * zs;
329  weimax = 2.;
330  }
331  if (TrepsB::pmodel == 335) {
332  // 2+(0) -> Vg (E1) --> llg
333  wei = (9.*z * z * z * z - 12.*z * z + 5.) / 24.*(1. + zs * zs)
334  + 0.75 * z * z * (1. - z * z) * (1. - zs * zs) + 0.5 * z * u * zs * us * (-3.*z * z + 2.) * cos(phis)
335  + 0.125 * (1. - z * z) * (3.*z * z - 1.) * (1. - zs * zs) * cos(2.*phis);
336  weimax = 13. / 12. + 0.75 + 1.0 + 0.25;
337  }
338  if (TrepsB::pmodel == 336) {
339  // 2+(2) -> Vg (E1) --> llg
340  wei = 0.125 * pow(1. + z * z, 2) * (1. + zs * zs)
341  + 0.25 * (1. - z * z * z * z) * (1. - zs * zs) - 0.5 * z * u * zs * us * (1. + z * z) * cos(phis)
342  + 0.125 * (1. - z * z * z * z) * (1. - zs * zs) * cos(2.*phis);
343  weimax = 13. / 8.;
344  }
345  if (weimax * gRandom->Uniform() > wei) iret = 0;
346 
347  B2DEBUG(20, " $$ 3B $$ " << wei << " " << iret);
348  }
349 
350 
351  if (_npart == 4 && TrepsB::pmodel >= 401 && TrepsB::pmodel <= 499) {
352 
353  int index1 = 0, index2 = 1, index3 = 2, index4 = 3;
354  double z, m12, zp, phip, zs, phis, m34, zpp, phipp, zss, phiss, phi0;
355 
356  tpkin4(part,
357  index1, index2, index3, index4, z, m12, zp,
358  phip, zs, phis, m34, zpp, phipp, zss, phiss, phi0) ;
359 
360  }
361 
362  return iret ;
363 }
Abstract base class for different kinds of events.