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