evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Evtbs2llGammaAmp.cpp
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
22 
23 #include "EvtGenBase/EvtAmp.hh"
24 #include "EvtGenBase/EvtComplex.hh"
26 #include "EvtGenBase/EvtGenKine.hh"
27 #include "EvtGenBase/EvtId.hh"
28 #include "EvtGenBase/EvtIdSet.hh"
29 #include "EvtGenBase/EvtPDL.hh"
31 #include "EvtGenBase/EvtPatches.hh"
32 #include "EvtGenBase/EvtReport.hh"
37 
40 
41 #include <cstdlib>
42 
43 // input: *parent - the pointer to the parent particle (B-meson, the
44 // object of the EvtParticle class);
45 // *formFactors - the pointer to instance of EvtbTosllGammaFF class object;
46 // *WilsCoeff - the pointer to the Standart Model Wilson Coefficients class;
47 // mu - the scale parameter, GeV;
48 // Nf - number of "effective" flavors (for b-quark Nf=5);
49 // res_swch - resonant switching parameter:
50 // = 0 the resonant contribution switched OFF,
51 // = 1 the resonant contribution switched ON;
52 // ias - switching parameter for \alpha_s(M_Z) value:
53 // = 0 PDG 1sigma minimal alpha_s(M_Z),
54 // = 1 PDG average value alpha_s(M_Z),
55 // = 2 PDG 1sigma maximal alpha_s(M_Z).
56 // Egamma_min - photon energy cut, GeV;
57 // Wolfenstein parameterization for CKM matrix
58 // CKM_A, CKM_lambda, CKM_barrho, CKM_bareta
59 
61  Evtbs2llGammaFF* formFactors,
62  EvtbTosllWilsCoeffNLO* WilsCoeff, double mu,
63  int Nf, int res_swch, int ias, double Egamma_min,
64  double CKM_A, double CKM_lambda,
65  double CKM_barrho, double CKM_bareta )
66 {
67  // FILE *mytest;
68 
69  int iG = 0; // photon is the first daughter particle
70  int il1 = 1,
71  il2 = 2; // leptons are the second and thirds daughter particles
72 
73  EvtComplex unit1( 1.0, 0.0 ); // real unit
74  EvtComplex uniti( 0.0, 1.0 ); // imaginary unit
75 
76  double M1 = parent->mass(); // B - meson mass, GeV
77  double ml = parent->getDaug( il1 )->mass(); // leptonic mass, GeV
78  double mq = 0.0; // light quark mass from the dispersion QM, GeV
79  double mc = formFactors->getQuarkMass(
80  4 ); // m_c mass from the dispersion QM, GeV
81  double mb = formFactors->getQuarkMass(
82  5 ); // m_b mass from the dispersion QM, GeV
83  double Mw = 80.403; // GeV W-boson mass, GeV
84  double mt = 174.2; // GeV t-quark mass, GeV
85  double fb = 0.0; // leptonic decay constant of B-meson, Gev
86 
87  EvtComplex Vtb, Vtq, Vub, Vuq, Vcb,
88  Vcq; // V_{tb}, V_{tq}, V_{ub}, V_{uq}, V_{cb}, V_{cq}
89  EvtComplex CKM_factor; // V^*_{tq}*V_{tb}, where q={d,s}
90  EvtComplex lambda_qu; // V^*_{uq}*V_{ub}/V^*_{tq}*V_{tb}, where q={d,s}
91  EvtComplex lambda_qc; // V^*_{cq}*V_{cb}/V^*_{tq}*V_{tb}, where q={d,s}
92  double Relambda_qu, Imlambda_qu;
93 
94  // to find charges of ell^+ and ell^- in the B-meson daughters
95  int charge1 = EvtPDL::chg3( parent->getDaug( il1 )->getId() );
96  int charge2 = EvtPDL::chg3( parent->getDaug( il2 )->getId() );
97  if ( charge1 == 0 || charge2 == 0 ) {
98  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
99  << "\n\n The function EvtbsTollGammaAmp::CalcAmp(...)"
100  << "\n Error in the leptonic charge getting!"
101  << "\n charge1 =" << charge1
102  << "\n charge2 =" << charge2 << "\n charge gamma ="
103  << EvtPDL::chg3( parent->getDaug( iG )->getId() )
104  << "\n number of daughters =" << parent->getNDaug() << std::endl;
105  ::abort();
106  }
107 
108  EvtParticle* lepPlus = 0;
109  EvtParticle* lepMinus = 0;
110 
111  lepPlus = ( charge1 > charge2 )
112  ? parent->getDaug( il1 )
113  : parent->getDaug( il2 ); // positive charged
114  lepMinus = ( charge1 < charge2 )
115  ? parent->getDaug( il1 )
116  : parent->getDaug( il2 ); // negative charged
117 
118  EvtVector4R p = parent->getP4Restframe(); // B-meson momentum in the B-rest frame
119  EvtVector4R k =
120  parent->getDaug( iG )->getP4(); // 4-momentum of photon in the B-rest frame
121  EvtVector4R q = p - k; // transition 4-momentum q=p-k in the B-rest frame
122  EvtVector4R p_1; // 4-momentum of ell^+ in the B-rest frame
123  EvtVector4R p_2; // 4-momentum of ell^- in the B-rest frame
124 
125  // the preparation of the leptonic 4-momentums in the B-rest frame
126  if ( charge1 > charge2 ) {
127  p_1 = parent->getDaug( il1 )->getP4();
128  p_2 = parent->getDaug( il2 )->getP4();
129  } else {
130  p_1 = parent->getDaug( il2 )->getP4();
131  p_2 = parent->getDaug( il1 )->getP4();
132  }
133 
134  EvtVector4R p_minus_p_1 =
135  p - p_1; // transition momentum of the B-meson and antilepton p-p_1
136  EvtVector4R p_minus_p_2 =
137  p - p_2; // transition momentum of the B-meson and lepton p-p_2
138 
139  double q2 = q.mass2(); // Mandelstam variable s=q^2
140  double p2 = p.mass2(); // p^2=M1^2
141  double t = p_minus_p_1.mass2(); // Mandelstam variable t=(p-p_1)^2
142  double u = p_minus_p_2.mass2(); // Mandelstam variable u=(p-p_2)^2
143 
144  // scalar products
145  double pk = 0.5 * ( p2 - q2 ); // (p*k)
146  double p1k = 0.5 * ( pow( ml, 2.0 ) - u ); // (p1*k)
147  double p2k = 0.5 * ( pow( ml, 2.0 ) - t ); // (p2*k)
148 
149  double hatq2 = q2 / ( M1 * M1 ); // \hat s = q^2/M_1^2
150  double Egam = 0.5 * M1 *
151  ( 1 - hatq2 ); // photon energy in the B-meson rest frame
152 
153  EvtVector4R hatp = p / M1;
154  EvtVector4R hatk = k / M1;
155 
156  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
157  // << "\n\n The function EvtbsTollGammaAmp::CalcAmp(...)"
158  // << "\n q = p-k =" << p-k << " q^2 = " << (p-k).mass2()
159  // << "\n q = p1+p2 =" << p_1+p_2 << " q^2 = " << (p_1+p_2).mass2()
160  // << "\n m_ell =" << parent->getDaug(il1)->mass()
161  // << "\n m_ell =" << parent->getDaug(il2)->mass()
162  // << "\n m_gamma =" << parent->getDaug(iG)->mass()
163  // << std::endl;
164 
165  EvtId idparent = parent->getId(); // B-meson Id
166 
167  if ( idparent == EvtPDL::getId( std::string( "B_s0" ) ) ||
168  idparent == EvtPDL::getId( std::string( "anti-B_s0" ) ) ) {
169  mq = formFactors->getQuarkMass( 3 ); // m_s mass from the dispersion QM
170  fb = 0.24; // leptonic decay constant
171  // V_{ts}
172  Vtq = unit1 * ( 1.0 - 0.5 * pow( CKM_lambda, 2.0 ) ) +
173  pow( CKM_lambda, 2.0 ) *
174  ( CKM_barrho * unit1 + CKM_bareta * uniti ) /
175  sqrt( 1.0 - pow( CKM_lambda, 2.0 ) );
176  Vtq = -CKM_A * pow( CKM_lambda, 2.0 ) * Vtq;
177  // V_{us}
178  Vuq = CKM_lambda * unit1;
179  // V_{cs}
180  Vcq = unit1 - 0.5 * pow( CKM_lambda, 2.0 ) -
181  0.125 * pow( CKM_lambda, 4.0 ) * ( 1.0 + 4.0 * pow( CKM_A, 2.0 ) );
182  }
183 
184  if ( idparent == EvtPDL::getId( std::string( "B0" ) ) ||
185  idparent == EvtPDL::getId( std::string( "anti-B0" ) ) ) {
186  mq = formFactors->getQuarkMass( 2 ); // m_d mass from the dispersion QM
187  fb = 0.20; // leptonic decay constant
188  // V_{td}
189  Vtq = unit1 - ( 1.0 - 0.5 * pow( CKM_lambda, 2.0 ) ) *
190  ( CKM_barrho * unit1 + CKM_bareta * uniti ) /
191  sqrt( 1.0 - pow( CKM_lambda, 2.0 ) );
192  Vtq = CKM_A * pow( CKM_lambda, 3.0 ) * Vtq;
193  // V_{ud}
194  Vuq = unit1 * ( 1.0 - 0.5 * pow( CKM_lambda, 2.0 ) -
195  0.125 * pow( CKM_lambda, 4.0 ) );
196  // V_{cd}
197  Vcq = unit1 *
198  ( -CKM_lambda +
199  0.5 * pow( CKM_A, 2.0 ) * pow( CKM_lambda, 5.0 ) *
200  ( 1.0 - 2.0 * ( CKM_barrho * unit1 + CKM_bareta * uniti ) /
201  sqrt( 1.0 - pow( CKM_lambda, 2.0 ) ) ) );
202  }
203 
204  if ( mq < 0.001 ) {
205  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
206  << "\n\n The function EvtbsTollGammaAmp::CalcAmp(..// 4-momentum of ell^+.)"
207  << "\n Error in the model set!"
208  << " mq = " << mq << std::endl;
209  ::abort();
210  }
211 
212  Vtb = unit1 * ( 1.0 - 0.5 * pow( CKM_A * CKM_lambda * CKM_lambda,
213  2.0 ) ); // V_{tb}
214  Vub = CKM_A * pow( CKM_lambda, 3.0 ) *
215  ( CKM_barrho * unit1 - CKM_bareta * uniti ) /
216  sqrt( 1.0 - pow( CKM_lambda, 2.0 ) ); // V_{ub}
217  Vcb = unit1 * CKM_A * pow( CKM_lambda, 2.0 ); // V_{cb}
218 
219  CKM_factor = conj( Vtq ) * Vtb; // V^*_{tq}*V_{tb}
220 
221  lambda_qu = conj( Vuq ) * Vub /
222  CKM_factor; // V^*_{uq}*V_{ub}/V^*_{tq}*V_{tb}
223  Relambda_qu = real( lambda_qu );
224  Imlambda_qu = imag( lambda_qu );
225 
226  lambda_qc = conj( Vcq ) * Vcb /
227  CKM_factor; // V^*_{cq}*V_{cb}/V^*_{tq}*V_{tb}
228 
229  // The Wilson Coefficients preparation according to the paper
230  // A.J.Buras, M.Munz, Phys.Rev.D52, p.189 (1995)
231  double c1, c2;
232  EvtComplex a1, c7gam, c9eff_b2q, c9eff_barb2barq, c10a;
233 
234  // foton energy cut and removal of the J/psi amd psi' resonant area
235  if ( Egam < Egamma_min || ( res_swch == 1 && q2 >= 9.199 && q2 <= 15.333 ) ) {
236  c1 = 0.0;
237  c2 = 0.0;
238  a1 = unit1 * 0.0;
239  c7gam = unit1 * 0.0;
240  c9eff_b2q = unit1 * 0.0;
241  c9eff_barb2barq = unit1 * 0.0;
242  c10a = unit1 * 0.0;
243  } else {
244  c1 = WilsCoeff->C1( mu, Mw, Nf, ias );
245  c2 = WilsCoeff->C2( mu, Mw, Nf, ias );
246  a1 = unit1 * ( c1 + c2 / 3.0 );
247  c7gam = WilsCoeff->GetC7Eff( mu, Mw, mt, Nf, ias );
248  c9eff_b2q = WilsCoeff->GetC9Eff( 0, res_swch, ias, Nf, q2, mb, mq, mc, mu,
249  mt, Mw, ml, Relambda_qu, Imlambda_qu );
250  c9eff_barb2barq = WilsCoeff->GetC9Eff( 1, res_swch, ias, Nf, q2, mb, mq,
251  mc, mu, mt, Mw, ml, Relambda_qu,
252  Imlambda_qu );
253  c10a = WilsCoeff->GetC10Eff( mt, Mw );
254  }
255 
256  EvtComplex Fv,
257  Fa; // The change of the sign is included in the amplitudes definition!
258  EvtComplex Ftv_b2q, Ftv_barb2barq;
259  EvtComplex Fta_b2q, Fta_barb2barq;
260 
261  // foton energy cut and removal of the J/psi amd psi' resonant area
262  if ( Egam < Egamma_min || ( res_swch == 1 && q2 >= 9.199 && q2 <= 15.333 ) ) {
263  fb = 0.0;
264  Fa = unit1 * 0.0;
265  Fv = unit1 * 0.0;
266  Fta_b2q = unit1 * 0.0;
267  Fta_barb2barq = unit1 * 0.0;
268  Ftv_b2q = unit1 * 0.0;
269  Ftv_barb2barq = unit1 * 0.0;
270  } else {
271  if ( fb < 0.01 ) {
272  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
273  << "\n\n The function EvtbsTollGammaAmp::CalcAmp(...)"
274  << "\n Leptonic decay constant fb is not uninitialized in this function!"
275  << " fb = " << fb << std::endl;
276  ::abort();
277  }
278 
279  // For \bar B^0_q -> l^+ l^- gamma
280  formFactors->getPhotonFF( 0, fb, parent->getId(), q2, M1, mb, mq, c7gam,
281  a1, lambda_qu, lambda_qc, Fv, Fa, Ftv_b2q,
282  Fta_b2q );
283 
284  // For B^0_q -> l^+ l^- gamma
285  formFactors->getPhotonFF( 1, fb, parent->getId(), q2, M1, mb, mq, c7gam,
286  a1, lambda_qu, lambda_qc, Fv, Fa,
287  Ftv_barb2barq, Fta_barb2barq );
288  }
289 
290  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
291  // << "\n ============================================================================"
292  // << "\n ============================================================================"
293  // << "\n\n The function Evtbs2llGammaAmp::CalcAmp(...) passed."
294  // << "\n Particle masses:"
295  // << "\n B - meson mass M1 = " << M1
296  // << "\n photon minimum E = " << Egamma_min
297  // << "\n q2 = " << q2
298  // << "\n leptonic mass ml = " << ml
299  // << "\n light quark mass = " << mq
300  // << "\n c - quark mass mc = " << mc
301  // << "\n b - quark mass mb = " << mb
302  // << "\n t - quark mass mt = " << mt
303  // << "\n W - boson mass Mw = " << Mw
304  // << "\n ============================================================================"
305  // << "\n Input parameters:"
306  // << "\n scale parameter mu = " << mu
307  // << "\n number of flavors Nf = " << Nf
308  // << "\n resonant switching = " << res_swch
309  // << "\n parameter for alpha_s(M_Z) = " << ias
310  // << "\n photon energy cut (GeV) = " << Egamma_min
311  // << "\n ============================================================================"
312  // << "\n Form-factors"
313  // << "\n Egam = " << Egam
314  // << "\n Egamma_min = " << Egamma_min
315  // << "\n Fv = " << Fv
316  // << "\n Fa = " << Fa
317  // << "\n Ftv_b2q = " << Ftv_b2q
318  // << "\n Fta_b2q = " << Fta_b2q
319  // << "\n Ftv_barb2barq = " << Ftv_barb2barq
320  // << "\n Fta_barb2barq = " << Fta_barb2barq
321  // << "\n ============================================================================"
322  // << "\n Wilson Coefficients:"
323  // << "\n Egam = " << Egam
324  // << "\n Egamma_min = " << Egamma_min
325  // << "\n Re(c7gam) = " << real(c7gam)
326  // << " Im(c7gam) = " << imag(c7gam)
327  // << "\n Re(c9eff_b2q) = " << real(c9eff_b2q)
328  // << " Im(c9eff_b2q) = " << imag(c9eff_b2q)
329  // << "\n Re(c9eff_barb2barq) = " << real(c9eff_barb2barq)
330  // << " Im(c9eff_barb2barq) = " << imag(c9eff_barb2barq)
331  // << "\n Re(c10a) = " << real(c10a)
332  // << " Im(c10a) = " << imag(c10a)
333  // << std::endl;
334 
335  // Hadronic matrix element coefficients
336  EvtComplex a_b2q, a_barb2barq, b_b2q, b_barb2barq, e_b2q, e_barb2barq,
337  f_b2q, f_barb2barq;
338  EvtComplex brammS, brammT;
339 
340  a_b2q = c9eff_b2q * Fv + 2.0 * c7gam * Ftv_b2q * mb * M1 / q2;
341  a_barb2barq = c9eff_barb2barq * Fv +
342  2.0 * c7gam * Ftv_barb2barq * mb * M1 / q2;
343 
344  b_b2q = ( c9eff_b2q * Fa + 2.0 * c7gam * Fta_b2q * mb * M1 / q2 ) * pk /
345  ( M1 * M1 );
346  b_barb2barq = ( c9eff_barb2barq * Fa +
347  2.0 * c7gam * Fta_barb2barq * mb * M1 / q2 ) *
348  pk / ( M1 * M1 );
349 
350  e_b2q = c10a * Fv;
351  e_barb2barq = e_b2q;
352 
353  f_b2q = c10a * Fa * pk / ( M1 * M1 );
354  f_barb2barq = f_b2q;
355 
356  brammS = 0.0; // in the Bq-meson rest frame!
357  brammT = 0.5 * c10a * ml * fb *
358  ( 1.0 / p2k + 1.0 / p1k ); // for Bramsstrahlung
359 
360  EvtTensor4C T1, T2; // hadronic matrix element tensor structures
361  EvtVector4C E1, E2;
362  EvtComplex E3;
363 
364  EvtVector4C epsG; // photon polarisation vector
365 
366  int i; // photon polarisations counter
367 
368  EvtVector4C lvc11, lvc12; // spin structures for
369  EvtVector4C lvc21, lvc22; // the leptonic vector current
370 
371  EvtVector4C lac11, lac12; // spin structures for
372  EvtVector4C lac21, lac22; // the leptonic axial current
373 
374  EvtComplex lsc11, lsc12; // spin structures for
375  EvtComplex lsc21, lsc22; // the leptonic scalar current
376 
377  EvtTensor4C ltc11, ltc12; // spin structures for
378  EvtTensor4C ltc21, ltc22; // the leptonic tensor current
379 
380  // B - and barB - mesons descriptors
381  static EvtIdSet bmesons( "anti-B0", "anti-B_s0" );
382  static EvtIdSet bbarmesons( "B0", "B_s0" );
383 
384  EvtId parentID = parent->getId();
385 
386  if ( bmesons.contains( parentID ) ) {
387  // The amplitude for the decay barB -> gamma ell^+ ell^- or
388  // b \bar q -> gamma ell^+ ell^-
389 
390  T1 = -a_b2q * unit1 * dual( EvtGenFunctions::directProd( hatp, hatk ) ) -
391  b_b2q * uniti * EvtTensor4C::g();
392 
393  T2 = -e_b2q * unit1 * dual( EvtGenFunctions::directProd( hatp, hatk ) ) -
394  f_b2q * uniti * EvtTensor4C::g();
395 
396  // spin combinations for vector lepton current
397  lvc11 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
398  lepMinus->spParent( 0 ) );
399  lvc21 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
400  lepMinus->spParent( 0 ) );
401  lvc12 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
402  lepMinus->spParent( 1 ) );
403  lvc22 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
404  lepMinus->spParent( 1 ) );
405 
406  lac11 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
407  lepMinus->spParent( 0 ) );
408  lac21 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
409  lepMinus->spParent( 0 ) );
410  lac12 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
411  lepMinus->spParent( 1 ) );
412  lac22 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
413  lepMinus->spParent( 1 ) );
414 
415  lsc11 = EvtLeptonSCurrent( lepPlus->spParent( 0 ),
416  lepMinus->spParent( 0 ) );
417  lsc21 = EvtLeptonSCurrent( lepPlus->spParent( 1 ),
418  lepMinus->spParent( 0 ) );
419  lsc12 = EvtLeptonSCurrent( lepPlus->spParent( 0 ),
420  lepMinus->spParent( 1 ) );
421  lsc22 = EvtLeptonSCurrent( lepPlus->spParent( 1 ),
422  lepMinus->spParent( 1 ) );
423 
424  // \epsilon^{\alpha\beta\mu\nu}*TCurrent_{\mu\nu}
425  ltc11 = dual( EvtLeptonTCurrent( lepPlus->spParent( 0 ),
426  lepMinus->spParent( 0 ) ) );
427  ltc21 = dual( EvtLeptonTCurrent( lepPlus->spParent( 1 ),
428  lepMinus->spParent( 0 ) ) );
429  ltc12 = dual( EvtLeptonTCurrent( lepPlus->spParent( 0 ),
430  lepMinus->spParent( 1 ) ) );
431  ltc22 = dual( EvtLeptonTCurrent( lepPlus->spParent( 1 ),
432  lepMinus->spParent( 1 ) ) );
433 
434  // summing up photon polarisations
435  for ( i = 0; i < 2; i++ ) {
436  // conjaction of epsG (photon polarization vector)
437  EvtVector4C epsG = parent->getDaug( 0 )->epsParentPhoton( i ).conj();
438 
439  // de-escalation T with epsG
440  E1 = T1.cont2( epsG );
441  E2 = T2.cont2( epsG );
442  E3 = ( epsG * hatp ) * brammS;
443 
444  // foton energy cut and removal of the J/psi amd psi' resonant area
445  if ( Egam < Egamma_min ||
446  ( res_swch == 1 && q2 >= 9.199 && q2 <= 15.333 ) ) {
447  CKM_factor = 0.0 * unit1;
448  }
449 
450  // 1
451  amp.vertex( i, 0, 0,
452  CKM_factor *
453  ( lvc11 * E1 + lac11 * E2 + uniti * lsc11 * E3 +
454  uniti * ( ( ltc11.cont2( hatp ) ) * epsG ) *
455  brammT ) );
456  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
457  // << "\n 1" << CKM_factor*(lvc11*E1+lac11*E2+uniti*lsc11*E3+uniti*((ltc11.cont2(hatp))*epsG)*brammT)
458  // << std::endl;
459 
460  // 2
461  amp.vertex( i, 0, 1,
462  CKM_factor *
463  ( lvc12 * E1 + lac12 * E2 + uniti * lsc12 * E3 +
464  uniti * ( ( ltc12.cont2( hatp ) ) * epsG ) *
465  brammT ) );
466  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
467  // << "\n 2" << CKM_factor*(lvc12*E1+lac12*E2+uniti*lsc12*E3+uniti*((ltc12.cont2(hatp))*epsG)*brammT)
468  // << std::endl;
469 
470  // 3
471  amp.vertex( i, 1, 0,
472  CKM_factor *
473  ( lvc21 * E1 + lac21 * E2 + uniti * lsc21 * E3 +
474  uniti * ( ( ltc21.cont2( hatp ) ) * epsG ) *
475  brammT ) );
476  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
477  // << "\n 3" << CKM_factor*(lvc21*E1+lac21*E2+uniti*lsc21*E3+uniti*((ltc21.cont2(hatp))*epsG)*brammT)
478  // << std::endl;
479 
480  // 4
481  amp.vertex( i, 1, 1,
482  CKM_factor *
483  ( lvc22 * E1 + lac22 * E2 + uniti * lsc22 * E3 +
484  uniti * ( ( ltc22.cont2( hatp ) ) * epsG ) *
485  brammT ) );
486  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
487  // << "\n 4" << CKM_factor*(lvc22*E1+lac22*E2+uniti*lsc22*E3+uniti*((ltc22.cont2(hatp))*epsG)*brammT)
488  // << std::endl;
489  }
490 
491  } else {
492  if ( bbarmesons.contains( parentID ) ) {
493  // The amplitude for the decay B -> gamma ell^+ ell^- or
494  // q bar b -> gamma ell^+ ell^-
495 
496  T1 = -a_barb2barq * unit1 *
497  dual( EvtGenFunctions::directProd( hatp, hatk ) ) +
498  b_barb2barq * uniti * EvtTensor4C::g();
499 
500  T2 = -e_barb2barq * unit1 *
501  dual( EvtGenFunctions::directProd( hatp, hatk ) ) +
502  f_barb2barq * uniti * EvtTensor4C::g();
503 
504  lvc11 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
505  lepMinus->spParent( 1 ) );
506  lvc21 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
507  lepMinus->spParent( 1 ) );
508  lvc12 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
509  lepMinus->spParent( 0 ) );
510  lvc22 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
511  lepMinus->spParent( 0 ) );
512 
513  lac11 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
514  lepMinus->spParent( 1 ) );
515  lac21 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
516  lepMinus->spParent( 1 ) );
517  lac12 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
518  lepMinus->spParent( 0 ) );
519  lac22 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
520  lepMinus->spParent( 0 ) );
521 
522  lsc11 = EvtLeptonSCurrent( lepPlus->spParent( 1 ),
523  lepMinus->spParent( 1 ) );
524  lsc21 = EvtLeptonSCurrent( lepPlus->spParent( 0 ),
525  lepMinus->spParent( 1 ) );
526  lsc12 = EvtLeptonSCurrent( lepPlus->spParent( 1 ),
527  lepMinus->spParent( 0 ) );
528  lsc22 = EvtLeptonSCurrent( lepPlus->spParent( 0 ),
529  lepMinus->spParent( 0 ) );
530 
531  // \epsilon^{\alpha\beta\mu\nu}*TCurrent_{\mu\nu}
532  ltc11 = dual( EvtLeptonTCurrent( lepPlus->spParent( 1 ),
533  lepMinus->spParent( 1 ) ) );
534  ltc21 = dual( EvtLeptonTCurrent( lepPlus->spParent( 0 ),
535  lepMinus->spParent( 1 ) ) );
536  ltc12 = dual( EvtLeptonTCurrent( lepPlus->spParent( 1 ),
537  lepMinus->spParent( 0 ) ) );
538  ltc22 = dual( EvtLeptonTCurrent( lepPlus->spParent( 0 ),
539  lepMinus->spParent( 0 ) ) );
540 
541  // summing up photon polarisations
542  for ( i = 0; i < 2; i++ ) {
543  EvtVector4C barepsG = parent->getDaug( 0 )->epsParentPhoton( i );
544 
545  E1 = T1.cont2( barepsG );
546  E2 = T2.cont2( barepsG );
547  E3 = ( barepsG * hatp ) * brammS;
548 
549  // foton energy cut and removal of the J/psi amd psi' resonant area
550  if ( Egam < Egamma_min ||
551  ( res_swch == 1 && q2 >= 9.199 && q2 <= 15.333 ) ) {
552  CKM_factor = 0.0 * unit1;
553  }
554 
555  amp.vertex(
556  i, 1, 1,
557  conj( CKM_factor ) *
558  ( lvc11 * E1 + lac11 * E2 + uniti * lsc11 * E3 + // -?
559  uniti * ( ( ltc11.cont2( hatp ) ) * epsG ) * brammT ) );
560  amp.vertex(
561  i, 1, 0,
562  conj( CKM_factor ) *
563  ( lvc12 * E1 + lac12 * E2 + uniti * lsc12 * E3 + // -?
564  uniti * ( ( ltc12.cont2( hatp ) ) * epsG ) * brammT ) );
565  amp.vertex(
566  i, 0, 1,
567  conj( CKM_factor ) *
568  ( lvc21 * E1 + lac21 * E2 + uniti * lsc21 * E3 + // -?
569  uniti * ( ( ltc21.cont2( hatp ) ) * epsG ) * brammT ) );
570  amp.vertex(
571  i, 0, 0,
572  conj( CKM_factor ) *
573  ( lvc22 * E1 + lac22 * E2 + uniti * lsc22 * E3 + // -?
574  uniti * ( ( ltc22.cont2( hatp ) ) * epsG ) * brammT ) );
575  }
576 
577  } else {
578  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
579  << "\n\n The function Evtbs2llGammaAmp::CalcAmp(...)"
580  << "\n Wrong B-meson number" << std::endl;
581  ::abort();
582  }
583  }
584 }
585 
586 //
587 // The decays B -> Gamma ell^+ ell^- maximum probability calculation for the
588 // d^2\Gamma/dq^2 d\cos\theta distribution.
589 //
590 // \theta - the angle between the photon and ell^- directions in the
591 // B-meson rest frame.
592 //
593 // If ias=0 (nonresonant case), the maximum is achieved at q2
594 // B0s: q2 = 4*ml^2, Mphi^2, q_max^2;
595 // B0d: q2 = 4*ml^2, Mrho^2, Momega^2, q_max^2;
596 // If ias=1 (resonant case), the maximum in the same points, because the
597 // resonat area is remove
598 //
599 double Evtbs2llGammaAmp::CalcMaxProb( EvtId parnum, EvtId photnum, EvtId l1num,
600  EvtId l2num, Evtbs2llGammaFF* formFactors,
601  EvtbTosllWilsCoeffNLO* WilsCoeff,
602  double mu, int Nf, int res_swch, int ias,
603  double Egamma_min, double CKM_A,
604  double CKM_lambda, double CKM_barrho,
605  double CKM_bareta )
606 {
607  double maxfoundprob = -100.0; // maximum of the probability
608  // int ijk_atmax = 1000000;
609 
610  double M1 = EvtPDL::getMeanMass( parnum ); // B - meson mass
611  double ml = EvtPDL::getMeanMass( l1num ); // leptonic mass
612 
613  double Mrho = EvtPDL::getMeanMass(
614  EvtPDL::getId( std::string( "rho0" ) ) ); // mass of the rho-meson, MeV
615  double Momega = EvtPDL::getMeanMass( EvtPDL::getId(
616  std::string( "omega" ) ) ); // mass of the omega-meson, MeV
617  double Mphi = EvtPDL::getMeanMass(
618  EvtPDL::getId( std::string( "phi" ) ) ); // mass of the phi-meson, MeV
619 
620  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
621  // << "\n M1 = " << M1
622  // << "\n ml = " << ml
623  // << "\n Mrho = " << Mrho
624  // << "\n Momega = " << Momega
625  // << "\n Mphi = " << Mphi
626  // << "\n Egamma_min = " << Egamma_min
627  // << std::endl;
628 
629  double list_of_max_q2_points[5];
630  list_of_max_q2_points[0] = pow( 2.0 * ml, 2.0 );
631  list_of_max_q2_points[1] = pow( Mrho, 2.0 );
632  list_of_max_q2_points[2] = pow( Momega, 2.0 );
633  list_of_max_q2_points[3] = pow( Mphi, 2.0 );
634  list_of_max_q2_points[4] =
635  pow( M1, 2.0 ) - 2.0 * M1 * Egamma_min; // q^2_max at photon energy cut
636 
637  // if(list_of_max_points[4]<0){
638  // EvtGenReport(EVTGEN_ERROR,"EvtGen")
639  // << "\n\n In the function EvtbsTollGammaAmp::CalcScalarMaxProb(...)"
640  // << "\n Bad photon energy cut: Egamma_min > M1 in the rest frame of B-meson!"
641  // << "\n q2_max = " << list_of_max_points[4]
642  // << "\n M1 = " << M1
643  // << "\n Egamma_min = " << Egamma_min
644  // << std::endl;
645  // ::abort();
646  // }
647 
648  if ( Egamma_min > Mrho ) {
649  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
650  << "\n\n In the function EvtbsTollGammaAmp::CalcScalarMaxProb(...)"
651  << "\n Bad photon energy cut: Egamma_min > M_rho0 in the rest frame of B-meson."
652  << "\n Mrho = " << Mrho << "\n Egamma_min = " << Egamma_min
653  << std::endl;
654  ::abort();
655  }
656 
657  if ( Egamma_min <= 0 ) {
658  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
659  << "\n\n In the function EvtbsTollGammaAmp::CalcScalarMaxProb(...)"
660  << "\n Bad photon energy cut: Egamma_min <= 0 in the rest frame of B-meson."
661  << "\n Egamma_min = " << Egamma_min << std::endl;
662  ::abort();
663  }
664 
665  if ( res_swch == 0 || res_swch == 1 ) {
666  int i_list;
667  for ( i_list = 0; i_list <= 4; i_list++ ) {
668  double s; // mandelstam variable "s";
669  double t_minus; // minimum and maximum of the mandelstam variable "t"
670  double t_plus; // as function of the mandelstam variable "s=q2";
671  double t_for_s;
672  int ijk; // counter for variable "t";
673  int max_ijk; // maximal value of this counter;
674 
675  s = list_of_max_q2_points[i_list];
676 
677  t_plus = pow( M1, 2.0 ) + 2.0 * pow( ml, 2.0 ) - s;
678  t_plus = t_plus + sqrt( 1.0 - 4.0 * pow( ml, 2.0 ) / s ) *
679  ( pow( M1, 2.0 ) - s );
680  t_plus *= 0.5;
681 
682  t_minus = pow( M1, 2.0 ) + 2.0 * pow( ml, 2.0 ) - s;
683  t_minus = t_minus - sqrt( 1.0 - 4.0 * pow( ml, 2.0 ) / s ) *
684  ( pow( M1, 2.0 ) - s );
685  t_minus *= 0.5;
686 
687  if ( fabs( t_plus - t_minus ) < 0.000001 )
688  t_minus = t_plus;
689 
690  max_ijk = 1000;
691  double dt = ( t_plus - t_minus ) / ( (double)max_ijk );
692  if ( fabs( dt ) < 0.00001 )
693  dt = 0.0;
694 
695  if ( dt < 0.0 ) {
696  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
697  << "\n\n In the function EvtbsTollGammaAmp::CalcScalarMaxProb(...)"
698  << "\n dt = " << dt << " < 0."
699  << "\n s = " << s << "\n t_plus = " << t_plus
700  << "\n t_minus = " << t_minus << "\n M1 = " << M1
701  << "\n ml = " << ml << std::endl;
702  ::abort();
703  }
704 
705  for ( ijk = 0; ijk <= max_ijk; ijk++ ) {
706  t_for_s = t_minus + dt * ( (double)ijk );
707 
708  // B-meson rest frame particles and they kinematics inicialization
709  double Eg, El2;
710  Eg = ( pow( M1, 2.0 ) - s ) / ( 2.0 * M1 ); // photon energy
711  El2 = ( s + t_for_s - pow( ml, 2.0 ) ) /
712  ( 2.0 * M1 ); // ell^- energy
713 
714  double modl2;
715  modl2 = sqrt( pow( El2, 2.0 ) - pow( ml, 2.0 ) );
716 
717  double cosBellminus; // angle between the B-meson and ell^- directions
718  cosBellminus = ( pow( ml, 2.0 ) + 2.0 * Eg * El2 - t_for_s ) /
719  ( 2.0 * Eg * modl2 );
720 
721  if ( ( fabs( cosBellminus ) > 1.0 ) &&
722  ( fabs( cosBellminus ) <= 1.0001 ) ) {
723  EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
724  << "\n Debug in the function EvtbsTollGammaAmp::CalcMaxProb(...):"
725  << "\n cos(theta) = " << cosBellminus << std::endl;
726  cosBellminus = cosBellminus / fabs( cosBellminus );
727  }
728  if ( fabs( cosBellminus ) > 1.0001 ) {
729  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
730  << "\n\n In the function EvtbsTollGammaAmp::CalcMaxProb(...)"
731  << "\n |cos(theta)| = " << fabs( cosBellminus ) << " > 1"
732  << "\n s = " << s << "\n t_for_s = " << t_for_s
733  << "\n t_plus = " << t_plus << "\n t_minus = " << t_minus
734  << "\n dt = " << dt << "\n Eg = " << Eg
735  << "\n El2 = " << El2 << "\n modl2 = " << modl2
736  << "\n ml = " << ml << std::endl;
737  ::abort();
738  }
739 
740  EvtVector4R p, k, p1, p2;
741  p.set( M1, 0.0, 0.0, 0.0 );
742  k.set( Eg, Eg, 0.0, 0.0 );
743  p2.set( El2, modl2 * cosBellminus,
744  -modl2 * sqrt( 1.0 - pow( cosBellminus, 2.0 ) ), 0.0 );
745  p1 = p - k - p2;
746 
747  // B-meson state preparation at the rest frame of B-meson
748  EvtScalarParticle* scalar_part;
749  EvtParticle* root_part;
750  scalar_part = new EvtScalarParticle;
751 
752  scalar_part->noLifeTime();
753  scalar_part->init( parnum, p );
754  root_part = (EvtParticle*)scalar_part;
755  root_part->setDiagonalSpinDensity();
756 
757  // Amplitude initialization
758  EvtId listdaug[3];
759  listdaug[0] = photnum;
760  listdaug[1] = l1num;
761  listdaug[2] = l2num;
762 
763  EvtAmp amp;
764  amp.init( parnum, 3, listdaug );
765 
766  // Daughters states preparation at the rest frame of B-meson
767  root_part->makeDaughters( 3, listdaug );
768 
769  EvtParticle *gamm, *lep1, *lep2;
770  gamm = root_part->getDaug( 0 );
771  lep1 = root_part->getDaug( 1 );
772  lep2 = root_part->getDaug( 2 );
773 
774  gamm->noLifeTime();
775  lep1->noLifeTime();
776  lep2->noLifeTime();
777 
778  gamm->init( photnum, k );
779  lep1->init( l1num, p1 );
780  lep2->init( l2num, p2 );
781 
782  EvtSpinDensity rho;
783  rho.setDiag( root_part->getSpinStates() );
784 
785  // The amplitude calculation at the
786  // "maximum amplitude" kinematical configuration
787  CalcAmp( root_part, amp, formFactors, WilsCoeff, mu, Nf,
788  res_swch, ias, Egamma_min, CKM_A, CKM_lambda,
789  CKM_barrho, CKM_bareta );
790 
791  // Now find the probability at this q2 and cos theta lepton point
792  double nikmax = rho.normalizedProb( amp.getSpinDensity() );
793 
794  if ( nikmax > maxfoundprob ) {
795  maxfoundprob = nikmax;
796  EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
797  << "\n maxfoundprob ( s =" << s << ", t = " << t_for_s
798  << " ) = " << maxfoundprob << "\n ijk =" << ijk
799  << std::endl;
800  }
801 
802  delete scalar_part;
803  // delete root_part;
804  delete gamm;
805  delete lep1;
806  delete lep2;
807 
808  } // for(ijk=0; ijk<=max_ijk; ijk++)
809  } // i_list - variable loop
810  } // if(res_swch==0||res_swch==1)
811  else {
812  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
813  << "\n\n In the function EvtbsTollVectorAmpNew::CalcMaxProb(...)"
814  << "\n Unexpected value of the variable res_swch !!!"
815  << "\n res_swch = " << res_swch << std::endl;
816  ::abort();
817  }
818 
819  if ( maxfoundprob <= 0.0 ) {
820  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
821  << "\n\n In the function EvtbsTollVectorAmpNew::CalcMaxProb(...)"
822  << "\n maxfoundprob = " << maxfoundprob << " <0 or =0!"
823  << "\n res_swch = " << res_swch << std::endl;
824  ::abort();
825  }
826 
827  maxfoundprob *= 1.01;
828 
829  // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
830  // << "\n **********************************************************************"
831  // << "\n The function Evtbs2llGammaAmp::CalcMaxProb(...) passed with arguments:"
832  // << "\n mu =" << mu << " Nf =" << Nf
833  // << " res_swch =" << res_swch
834  // << " ias =" << ias
835  // << "\n CKM_A = " << CKM_A
836  // << " CKM_lambda = " << CKM_lambda
837  // << "\n CKM_barrho = " << CKM_barrho
838  // << " CKM_bareta = " << CKM_bareta
839  // << "\n The distribution maximum maxfoundprob =" << maxfoundprob
840  // << "\n ijk = " << ijk_atmax
841  // << "\n **********************************************************************"
842  // << std::endl;
843 
844  return maxfoundprob;
845 }
846 
847 // Triangular function
848 double Evtbs2llGammaAmp::lambda( double a, double b, double c )
849 {
850  double l;
851 
852  l = pow( a, 2.0 ) + pow( b, 2.0 ) + pow( c, 2.0 ) - 2.0 * a * b -
853  2.0 * a * c - 2.0 * b * c;
854 
855  return l;
856 }
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)
void CalcAmp(EvtParticle *parent, EvtAmp &amp, Evtbs2llGammaFF *formFactors, EvtbTosllWilsCoeffNLO *WilsCoeff, double mu, int Nf, int res_swch, int ias, double Egamma_min, double CKM_A, double CKM_lambda, double CKM_barrho, double CKM_bareta)
void setDiag(int n)
EvtTensor4C EvtLeptonTCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
static const EvtTensor4C & g()
Definition: EvtTensor4C.cpp:44
EvtComplex GetC7Eff(double mu, double Mw, double mt, int Nf, int ias)
double lambda(double a, double b, double c)
EvtTensor4C dual(const EvtTensor4C &t2)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
Evt3Rank3C conj(const Evt3Rank3C &t2)
Definition: Evt3Rank3C.cpp:172
virtual void getPhotonFF(int, double, EvtId, double, double, double, double, EvtComplex, EvtComplex, EvtComplex, EvtComplex, EvtComplex &, EvtComplex &, EvtComplex &, EvtComplex &)
EvtVector4C cont2(const EvtVector4C &v4) const
double CalcMaxProb(EvtId parnum, EvtId photnum, EvtId l1num, EvtId l2num, Evtbs2llGammaFF *formFactors, EvtbTosllWilsCoeffNLO *WilsCoeff, double mu, int Nf, int res_swch, int ias, double Egamma_min, double CKM_A, double CKM_lambda, double CKM_barrho, double CKM_bareta)
static double getMeanMass(EvtId i)
Definition: EvtPDL.cpp:314
int getSpinStates() const
virtual EvtVector4C epsParentPhoton(int i)
EvtId getId() const
void makeDaughters(unsigned int ndaug, EvtId *id)
const double a1
void set(int i, double d)
Definition: EvtVector4R.hh:167
EvtSpinDensity getSpinDensity()
Definition: EvtAmp.cpp:142
static int chg3(EvtId i)
Definition: EvtPDL.cpp:372
virtual EvtDiracSpinor spParent(int) const
Definition: EvtId.hh:27
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
size_t getNDaug() const
void vertex(const EvtComplex &amp)
Definition: EvtAmp.cpp:454
double C2(double mu, double Mw, int Nf, int ias)
double mass2() const
Definition: EvtVector4R.hh:100
EvtComplex GetC9Eff(int decay_id, int res_swch, int ias, int Nf, double q2, double m2, double md, double mc, double mu, double mt, double Mw, double ml, double Relambda_qu, double Imlambda_qu)
Definition: EvtAmp.hh:30
EvtComplex GetC10Eff(double mt, double Mw)
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
double imag(const EvtComplex &c)
Definition: EvtComplex.hh:235
void init(EvtId part_n, double e, double px, double py, double pz)
double mass() const
double C1(double mu, double Mw, int Nf, int ias)
void setDiagonalSpinDensity()
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void noLifeTime()
Definition: EvtParticle.hh:382
EvtVector4C conj() const
Definition: EvtVector4C.hh:202
int contains(const EvtId id)
Definition: EvtIdSet.cpp:422
EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtVector4R getP4Restframe() const
void init(EvtId p, int ndaug, EvtId *daug)
Definition: EvtAmp.cpp:68
double real(const EvtComplex &c)
Definition: EvtComplex.hh:230
virtual double getQuarkMass(int)
double normalizedProb(const EvtSpinDensity &d)