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
EvtbTosllVectorAmpNewExt.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
40
41#include <cstdlib>
42
43//
44// The main functiom for the amplitude calculation
45//
46// input: *parent - the pointer to the parent particle (B-meson, the
47// object of the EvtParticle class);
48// *formFactors - the pointer to instance of EvtbTosllFFNew class object;
49// *WilsCoeff - the pointer to the Standart Model Wilson Coefficients class;
50// mu - the scale parameter, GeV;
51// Nf - number of "effective" flavors (for b-quark Nf=5);
52// res_swch - resonant switching parameter:
53// = 0 the resonant contribution switched OFF,
54// = 1 the resonant contribution switched ON;
55// ias - switching parameter for \alpha_s(M_Z) value:
56// = 0 PDG 1sigma minimal alpha_s(M_Z),
57// = 1 PDG average value alpha_s(M_Z),
58// = 2 PDG 1sigma maximal alpha_s(M_Z).
59// Wolfenstein parameterization for CKM matrix
60// CKM_A, CKM_lambda, CKM_barrho, CKM_bareta
61// Multiplication coefficients
62// A7 = ReA7 + i*ImA7
63// A10 = ReA10 + i*ImA10
64//
65// return: amp - amplitude for the decay B -> V ell^+ ell^-
66//
67// Note: in our calculations we assume, that V-meson is the first
68// daughter particle (iV=0) and leptons are the second and thirds
69// daughter particles (il1=1 and il2=2).
70//
72 EvtParticle* parent, EvtAmp& amp, EvtbTosllFFNew* formFactors,
73 EvtbTosllWilsCoeffNLO* WilsCoeff, double mu, int Nf, int res_swch, int ias,
74 double CKM_A, double CKM_lambda, double CKM_barrho, double CKM_bareta,
75 double ReA7, double ImA7, double ReA10, double ImA10 )
76{
77 // FILE *mytest;
78
79 EvtComplex unit1( 1.0, 0.0 ); // real unit
80 EvtComplex uniti( 0.0, 1.0 ); // imaginary unit
81
82 EvtComplex A7 = ReA7 * unit1 + ImA7 * uniti;
83 EvtComplex A10 = ReA10 * unit1 + ImA10 * uniti;
84
85 int iV = 0; // V-meson is the first daughter particle
86 int il1 = 1,
87 il2 = 2; // leptons are the second and thirds daughter particles
88
89 // transition momentum of the leptonic pair q=k1+k2 or q=p1-p2
90 EvtVector4R q = parent->getDaug( il1 )->getP4() +
91 parent->getDaug( il2 )->getP4();
92
93 // Mandelstam variable t=q^2
94 double q2 = q.mass2();
95
96 double M1 = parent->mass(); // B - meson mass
97 double M2 = parent->getDaug( iV )->mass(); // V - meson mass
98 double ml = parent->getDaug( il1 )->mass(); // leptonic mass
99 double ms = 0.0; // light quark mass from the dispersion QM
100 double mc = formFactors->getQuarkMass( 4 ); // m_c mass from the dispersion QM
101 double mb = formFactors->getQuarkMass( 5 ); // m_b mass from the dispersion QM
102 // double Mw = EvtPDL::getNominalMass("W+"); // W-boson mass
103 // double mt = EvtPDL::getNominalMass("t"); // t-quark mass
104 double Mw = 80.403; // GeV W-boson mass
105 double mt = 174.2; // GeV t-quark mass
106
107 EvtComplex Vtb, Vtq, Vub, Vuq; // V_{tb}, V_{tq}, V_{ub} and V_{uq}
108 EvtComplex CKM_factor; // V^*_{tq}*V_{tb}, where q={d,s}
109 EvtComplex lambda_qu; // V^*_{uq}*V_{ub}/V^*_{tq}*V_{tb}, where q={d,s}
110 double Relambda_qu, Imlambda_qu;
111
112 EvtId idparent = parent->getId(); // B-meson Id
113 EvtId iddaught = parent->getDaug( iV )->getId(); // The vector meson Id
114
115 // set of the light quark mass value
116 if ( ( idparent == EvtPDL::getId( std::string( "B+" ) ) &&
117 iddaught == EvtPDL::getId( std::string( "K*+" ) ) ) ||
118 ( idparent == EvtPDL::getId( std::string( "B-" ) ) &&
119 iddaught == EvtPDL::getId( std::string( "K*-" ) ) ) ||
120 ( idparent == EvtPDL::getId( std::string( "B0" ) ) &&
121 iddaught == EvtPDL::getId( std::string( "K*0" ) ) ) ||
122 ( idparent == EvtPDL::getId( std::string( "anti-B0" ) ) &&
123 iddaught == EvtPDL::getId( std::string( "anti-K*0" ) ) ) ||
124 ( idparent == EvtPDL::getId( std::string( "B_s0" ) ) &&
125 iddaught == EvtPDL::getId( std::string( "phi" ) ) ) ||
126 ( idparent == EvtPDL::getId( std::string( "anti-B_s0" ) ) &&
127 iddaught == EvtPDL::getId( std::string( "phi" ) ) ) ||
128 ( idparent == EvtPDL::getId( std::string( "B+" ) ) &&
129 iddaught == EvtPDL::getId( std::string( "K_1+" ) ) ) ||
130 ( idparent == EvtPDL::getId( std::string( "B-" ) ) &&
131 iddaught == EvtPDL::getId( std::string( "K_1-" ) ) ) ||
132 ( idparent == EvtPDL::getId( std::string( "B0" ) ) &&
133 iddaught == EvtPDL::getId( std::string( "K_10" ) ) ) ||
134 ( idparent == EvtPDL::getId( std::string( "anti-B0" ) ) &&
135 iddaught == EvtPDL::getId( std::string( "anti-K_10" ) ) ) ||
136 ( idparent == EvtPDL::getId( std::string( "B+" ) ) &&
137 iddaught == EvtPDL::getId( std::string( "K'_1+" ) ) ) ||
138 ( idparent == EvtPDL::getId( std::string( "B-" ) ) &&
139 iddaught == EvtPDL::getId( std::string( "K'_1-" ) ) ) ||
140 ( idparent == EvtPDL::getId( std::string( "B0" ) ) &&
141 iddaught == EvtPDL::getId( std::string( "K'_10" ) ) ) ||
142 ( idparent == EvtPDL::getId( std::string( "anti-B0" ) ) &&
143 iddaught == EvtPDL::getId( std::string( "anti-K'_10" ) ) ) ) {
144 ms = formFactors->getQuarkMass( 3 ); // m_s mass from the dispersion QM
145 // V_{ts}
146 Vtq = unit1 * ( 1.0 - 0.5 * pow( CKM_lambda, 2.0 ) ) +
147 pow( CKM_lambda, 2.0 ) *
148 ( CKM_barrho * unit1 + CKM_bareta * uniti ) /
149 sqrt( 1.0 - pow( CKM_lambda, 2.0 ) );
150 Vtq = -CKM_A * pow( CKM_lambda, 2.0 ) * Vtq;
151 // V_{us}
152 Vuq = CKM_lambda * unit1;
153 }
154
155 if ( ( idparent == EvtPDL::getId( std::string( "B+" ) ) &&
156 iddaught == EvtPDL::getId( std::string( "rho+" ) ) ) ||
157 ( idparent == EvtPDL::getId( std::string( "B-" ) ) &&
158 iddaught == EvtPDL::getId( std::string( "rho-" ) ) ) ||
159 ( idparent == EvtPDL::getId( std::string( "B0" ) ) &&
160 iddaught == EvtPDL::getId( std::string( "rho0" ) ) ) ||
161 ( idparent == EvtPDL::getId( std::string( "anti-B0" ) ) &&
162 iddaught == EvtPDL::getId( std::string( "rho0" ) ) ) ||
163 ( idparent == EvtPDL::getId( std::string( "B0" ) ) &&
164 iddaught == EvtPDL::getId( std::string( "omega" ) ) ) ||
165 ( idparent == EvtPDL::getId( std::string( "anti-B0" ) ) &&
166 iddaught == EvtPDL::getId( std::string( "omega" ) ) ) ||
167 ( idparent == EvtPDL::getId( std::string( "B_s0" ) ) &&
168 iddaught == EvtPDL::getId( std::string( "anti-K*0" ) ) ) ||
169 ( idparent == EvtPDL::getId( std::string( "anti-B_s0" ) ) &&
170 iddaught == EvtPDL::getId( std::string( "K*0" ) ) ) ) {
171 ms = formFactors->getQuarkMass( 2 ); // m_d mass from the dispersion QM
172 // V_{td}
173 Vtq = unit1 - ( 1.0 - 0.5 * 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, 3.0 ) * Vtq;
177 // V_{ud}
178 Vuq = unit1 * ( 1.0 - 0.5 * pow( CKM_lambda, 2.0 ) -
179 0.125 * pow( CKM_lambda, 4.0 ) );
180 }
181
182 if ( ms < 0.001 ) {
183 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
184 << "\n\n The function EvtbTosllVectorAmpNew::CalcAmp(...)"
185 << "\n Error in the model set!"
186 << " ms = " << ms << std::endl;
187 ::abort();
188 }
189
190 Vtb = unit1 * ( 1.0 - 0.5 * pow( CKM_A * CKM_lambda * CKM_lambda,
191 2.0 ) ); // V_{tb}
192 Vub = CKM_A * pow( CKM_lambda, 3.0 ) *
193 ( CKM_barrho * unit1 - CKM_bareta * uniti ) /
194 sqrt( 1.0 - pow( CKM_lambda, 2.0 ) ); // V_{ub}
195
196 CKM_factor = conj( Vtq ) * Vtb; // V^*_{tq}*V_{tb}
197
198 lambda_qu = conj( Vuq ) * Vub /
199 CKM_factor; // V^*_{uq}*V_{ub}/V^*_{tq}*V_{tb}
200 Relambda_qu = real( lambda_qu );
201 Imlambda_qu = imag( lambda_qu );
202
203 double a1, a2, a0, v, t1, t2, t3; // B -> V transition form-factors
204
205 // To get the B -> V transition form-factors
206 formFactors->getVectorFF( parent->getId(), parent->getDaug( iV )->getId(),
207 q2, a1, a2, a0, v, t1, t2, t3 );
208
209 // The Wilson Coefficients preparation according to the paper
210 // A.J.Buras, M.Munz, Phys.Rev.D52, p.189 (1995)
211 EvtComplex c7gam = WilsCoeff->GetC7Eff( mu, Mw, mt, Nf, ias );
212 c7gam = c7gam * A7;
213 EvtComplex c9eff_b2q = WilsCoeff->GetC9Eff( 0, res_swch, ias, Nf, q2, mb,
214 ms, mc, mu, mt, Mw, ml,
215 Relambda_qu, Imlambda_qu );
216 EvtComplex c9eff_barb2barq = WilsCoeff->GetC9Eff( 1, res_swch, ias, Nf, q2,
217 mb, ms, mc, mu, mt, Mw, ml,
218 Relambda_qu, Imlambda_qu );
219 EvtComplex c10a = WilsCoeff->GetC10Eff( mt, Mw );
220 c10a = c10a * A10;
221
222 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << "\n\n The function EvtbTosllVectorAmpNew::CalcAmp(...) passed."
223 // << "\n Particle masses:"
224 // << "\n B - meson mass M1 = " << M1
225 // << "\n V - meson mass M2 = " << M2
226 // << "\n leptonic mass ml = " << ml
227 // << "\n light quark mass = " << ms
228 // << "\n c - quark mass mc = " << mc
229 // << "\n b - quark mass mb = " << mb
230 // << "\n t - quark mass mt = " << mt
231 // << "\n W - boson mass Mw = " << Mw
232 // << "\n ============================================================================"
233 // << "\n Input parameters:"
234 // << "\n scale parameter mu = " << mu
235 // << "\n number of flavors Nf = " << Nf
236 // << "\n resonant switching = " << res_swch
237 // << "\n parameter for alpha_s(M_Z) = " << ias
238 // << "\n ============================================================================"
239 // << "\n Vector form-factors at q^2 = " << q2
240 // << " for B -> V transition:"
241 // << "\n v = " << v
242 // << "\n a0 = " << a0
243 // << "\n a1 = " << a1
244 // << "\n a2 = " << a2
245 // << "\n t1 = " << t1
246 // << "\n t2 = " << t2
247 // << "\n t3 = " << t3
248 // << "\n ============================================================================"
249 // << "\n Wilson Coefficients:"
250 // << "\n Re(c7gam) = " << real(c7gam) << " Im(c7gam) = " << imag(c7gam)
251 // << "\n Re(c9eff_b2q) = " << real(c9eff_b2q)
252 // << " Im(c9eff_b2q) = " << imag(c9eff_b2q)
253 // << "\n Re(c9eff_barb2barq) = " << real(c9eff_barb2barq)
254 // << " Im(c9eff_barb2barq) = " << imag(c9eff_barb2barq)
255 // << "\n Re(c10a) = " << real(c10a) << " Im(c10a) = " << imag(c10a)
256 // << std::endl;
257
258 // mytest = fopen("output.txt","a");
259 //
260 // if(mytest != NULL){
261 // fprintf(mytest,"%lf\n",q2);
262 // fclose(mytest);
263 // }
264 // else{
265 // EvtGenReport(EVTGEN_ERROR,"EvtGen") << "\n Error in writing to file.\n"
266 // << std::endl;
267 // return;
268 // }
269
270 // 4- momentum of the B-meson in the the B-meson rest frame
271 EvtVector4R p1 = parent->getP4Restframe();
272 EvtVector4R hatp1 = p1 / M1;
273 // 4-momentum of the V-meson in the B-meson rest frame
274 EvtVector4R p2 = parent->getDaug( 0 )->getP4();
275 EvtVector4R hatp2 = p2 / M1;
276
277 double hats = q2 / pow( M1, 2 );
278 double hatM2 = M2 / M1;
279 double hatmb = mb / M1;
280 double hatms = ms / M1;
281
282 // Hadronic matrix element coefficients according to the paper
283 // A. Ali, A. Salim Safir, Eur.Phys.J.C25, pp.583-601 (2002)
284 // with m_s.NE.0
285 EvtComplex a_b2q, a_barb2barq, b_b2q, b_barb2barq, c_b2q, c_barb2barq, e, f,
286 g, h;
287
288 a_b2q = 2.0 * c9eff_b2q * v / ( 1.0 + hatM2 ) +
289 4.0 * ( hatmb + hatms ) * c7gam * t1 / hats;
290 a_barb2barq = 2.0 * c9eff_barb2barq * v / ( 1.0 + hatM2 ) +
291 4.0 * ( hatmb + hatms ) * c7gam * t1 / hats;
292
293 b_b2q = ( c9eff_b2q * a1 +
294 2.0 * ( hatmb - hatms ) * ( 1.0 - hatM2 ) * c7gam * t2 / hats ) *
295 ( 1.0 + hatM2 );
296 b_barb2barq = ( c9eff_barb2barq * a1 + 2.0 * ( hatmb - hatms ) *
297 ( 1.0 - hatM2 ) * c7gam * t2 /
298 hats ) *
299 ( 1.0 + hatM2 );
300
301 c_b2q = ( c9eff_b2q * ( 1.0 - hatM2 ) * a2 +
302 2.0 * ( hatmb - hatms ) * ( 1.0 - pow( hatM2, 2 ) ) * c7gam * t2 /
303 hats +
304 2.0 * ( hatmb - hatms ) * c7gam * t3 ) /
305 ( 1 - pow( hatM2, 2 ) );
306
307 c_barb2barq = ( c9eff_barb2barq * ( 1.0 - hatM2 ) * a2 +
308 2.0 * ( hatmb - hatms ) * ( 1.0 - pow( hatM2, 2 ) ) *
309 c7gam * t2 / hats +
310 2.0 * ( hatmb - hatms ) * c7gam * t3 ) /
311 ( 1 - pow( hatM2, 2 ) );
312
313 e = 2.0 * c10a * v / ( 1 + hatM2 );
314
315 f = ( 1.0 + hatM2 ) * c10a * a1;
316
317 g = c10a * a2 / ( 1 + hatM2 );
318
319 h = ( ( 1.0 + hatM2 ) * a1 - ( 1.0 - hatM2 ) * a2 - 2.0 * hatM2 * a0 ) *
320 c10a / hats;
321
322 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << " a_b2q = " << a_b2q
323 // << " a_barb2barq = " << a_barb2barq
324 // << " b_b2q = " << b_b2q
325 // << " b_barb2barq = " << b_barb2barq
326 // << " c_b2q = " << c_b2q
327 // << " c_barb2barq = " << c_barb2barq
328 // << " e = " << e
329 // << " f = " << f
330 // << " g = " << g
331 // << " h = " << h
332 // << std::endl;
333
334 // to find ell^+ and ell^- in the B-meson daughters
335 int charge1 = EvtPDL::chg3( parent->getDaug( 1 )->getId() );
336 int charge2 = EvtPDL::chg3( parent->getDaug( 2 )->getId() );
337
338 EvtParticle* lepPlus = nullptr;
339 EvtParticle* lepMinus = nullptr;
340
341 lepPlus = ( charge1 > charge2 ) ? parent->getDaug( 1 ) : parent->getDaug( 2 );
342 lepMinus = ( charge1 < charge2 ) ? parent->getDaug( 1 )
343 : parent->getDaug( 2 );
344
345 EvtTensor4C T1, T2; // hadronic matrix element tensor structures
346
347 int i; // vector meson polarisations counter
348
349 EvtVector4C lvc11, lvc12; // spin structures for
350 EvtVector4C lvc21, lvc22; // the leptonic vector current
351
352 EvtVector4C lac11, lac12; // spin structures for
353 EvtVector4C lac21, lac22; // the leptonic axial current
354
355 // B - and barB - mesons descriptors
356 EvtIdSet bmesons{ "B-", "anti-B0", "anti-B_s0", "B_c-" };
357 EvtIdSet bbarmesons{ "B+", "B0", "B_s0", "B_c+" };
358
359 EvtId parentID = parent->getId();
360
361 if ( bmesons.contains( parentID ) ) {
362 // The amplitude for the decay barB -> barV ell^+ ell^-
363 // (b -> q ell^+ ell^- transition)
364
365 T1 = -a_b2q * unit1 * dual( EvtGenFunctions::directProd( hatp1, hatp2 ) ) -
366 b_b2q * uniti * EvtTensor4C::g() +
367 c_b2q * uniti *
368 EvtGenFunctions::directProd( ( hatp1 + hatp2 ), hatp1 );
369
370 T2 = -e * unit1 * dual( EvtGenFunctions::directProd( hatp1, hatp2 ) ) -
371 f * uniti * EvtTensor4C::g() +
372 g * uniti * EvtGenFunctions::directProd( ( hatp1 + hatp2 ), hatp1 ) +
373 h * uniti * EvtGenFunctions::directProd( ( hatp1 - hatp2 ), hatp1 );
374
375 lvc11 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
376 lepMinus->spParent( 0 ) );
377 lvc21 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
378 lepMinus->spParent( 0 ) );
379 lvc12 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
380 lepMinus->spParent( 1 ) );
381 lvc22 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
382 lepMinus->spParent( 1 ) );
383
384 lac11 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
385 lepMinus->spParent( 0 ) );
386 lac21 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
387 lepMinus->spParent( 0 ) );
388 lac12 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
389 lepMinus->spParent( 1 ) );
390 lac22 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
391 lepMinus->spParent( 1 ) );
392
393 // summing up vector meson polarisations \epsilon^*_{\nu}(i)
394 for ( i = 0; i < 3; i++ ) {
395 EvtVector4C epsV = parent->getDaug( 0 )->epsParent( i ).conj();
396
397 EvtVector4C E1 = M1 * T1.cont2( epsV );
398 EvtVector4C E2 = M1 * T2.cont2( epsV );
399
400 amp.vertex( i, 0, 0, CKM_factor * ( lvc11 * E1 + lac11 * E2 ) );
401 amp.vertex( i, 0, 1, CKM_factor * ( lvc12 * E1 + lac12 * E2 ) );
402 amp.vertex( i, 1, 0, CKM_factor * ( lvc21 * E1 + lac21 * E2 ) );
403 amp.vertex( i, 1, 1, CKM_factor * ( lvc22 * E1 + lac22 * E2 ) );
404 }
405
406 } else {
407 if ( bbarmesons.contains( parentID ) ) {
408 // The amplitude for the decay B -> V ell^+ ell^-
409 // (barb -> barq ell^+ ell^- transition)
410
411 T1 = a_barb2barq * unit1 *
412 dual( EvtGenFunctions::directProd( hatp1, hatp2 ) ) -
413 b_barb2barq * uniti * EvtTensor4C::g() +
414 c_barb2barq * uniti *
415 EvtGenFunctions::directProd( ( hatp1 + hatp2 ), hatp1 );
416
417 T2 = e * unit1 * dual( EvtGenFunctions::directProd( hatp1, hatp2 ) ) -
418 f * uniti * EvtTensor4C::g() +
419 g * uniti *
420 EvtGenFunctions::directProd( ( hatp1 + hatp2 ), hatp1 ) +
421 h * uniti *
422 EvtGenFunctions::directProd( ( hatp1 - hatp2 ), hatp1 );
423
424 lvc11 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
425 lepMinus->spParent( 1 ) );
426 lvc21 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
427 lepMinus->spParent( 1 ) );
428 lvc12 = EvtLeptonVCurrent( lepPlus->spParent( 1 ),
429 lepMinus->spParent( 0 ) );
430 lvc22 = EvtLeptonVCurrent( lepPlus->spParent( 0 ),
431 lepMinus->spParent( 0 ) );
432
433 lac11 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
434 lepMinus->spParent( 1 ) );
435 lac21 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
436 lepMinus->spParent( 1 ) );
437 lac12 = EvtLeptonACurrent( lepPlus->spParent( 1 ),
438 lepMinus->spParent( 0 ) );
439 lac22 = EvtLeptonACurrent( lepPlus->spParent( 0 ),
440 lepMinus->spParent( 0 ) );
441
442 // summing up vector meson polarisations \epsilon^*_{\nu}(i)
443 for ( i = 0; i < 3; i++ ) {
444 EvtVector4C barepsV = parent->getDaug( 0 )->epsParent( i ).conj();
445
446 EvtVector4C E3 = M1 * T1.cont2( barepsV );
447 EvtVector4C E4 = M1 * T2.cont2( barepsV );
448
449 amp.vertex( i, 0, 0,
450 conj( CKM_factor ) * ( lvc11 * E3 + lac11 * E4 ) );
451 amp.vertex( i, 0, 1,
452 conj( CKM_factor ) * ( lvc12 * E3 + lac12 * E4 ) );
453 amp.vertex( i, 1, 0,
454 conj( CKM_factor ) * ( lvc21 * E3 + lac21 * E4 ) );
455 amp.vertex( i, 1, 1,
456 conj( CKM_factor ) * ( lvc22 * E3 + lac22 * E4 ) );
457 }
458
459 } else {
460 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
461 << "\n\n The function EvtbTosllVectorAmpNew::CalcAmp(...)"
462 << "\n Wrong B-meson number" << std::endl;
463 ::abort();
464 }
465 }
466
467 // Test of the signature for Levi-Civita tensor
468 // EvtVector4C Vec0, Vec1, Vec2, Vec3;
469 // EvtTensor4C Ttest;
470 // Vec0.set(1.0,0.0,0.0,0.0);
471 // Vec1.set(0.0,1.0,0.0,0.0);
472 // Vec2.set(0.0,0.0,1.0,0.0);
473 // Vec3.set(0.0,0.0,0.0,1.0);
474 // Ttest=dual(directProd(Vec2,Vec3));
475 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << "\n\n\n e^{0123} =" << Ttest.get(0,1) << std::endl;
476 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << " e^{1023} =" << Ttest.get(1,0) << std::endl;
477 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << " e^{1123} =" << Ttest.get(1,1) << "\n" << std::endl;
478 // EvtVector4C Vtest=Ttest.cont2(Vec1);
479 // for(i=0;i<=3;i++){
480 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << " Vtest =" << Vtest.get(i) << std::endl;
481 // }
482 // EvtComplex Atest;
483 // Atest=Vec0*Vtest;
484 // EvtGenReport(EVTGEN_NOTICE,"EvtGen") << "\n Atest =" << Atest << "\n\n\n" << std::endl;
485}
486
487//
488// The decays B -> V ell^+ ell^- maximum probability calculation for the
489// d^2\Gamma/dq^2 d\cos\theta distribution.
490//
491// \theta - the angle between the vector meson and ell^- directions in the
492// B-meson rest frame.
493//
494// If ias=0 (nonresonant case), the maximum is achieved at q2=q2_min=4*ml^2.
495// If ias=1 (resonant case), the maximum is achieved at q2=M^2_{J/\psi}.
496//
498 EvtId parnum, EvtId mesnum, EvtId l1num, EvtId l2num,
499 EvtbTosllFFNew* formFactors, EvtbTosllWilsCoeffNLO* WilsCoeff, double mu,
500 int Nf, int res_swch, int ias, double CKM_A, double CKM_lambda,
501 double CKM_barrho, double CKM_bareta, double ReA7, double ImA7,
502 double ReA10, double ImA10 )
503{
504 double maxfoundprob = -100.0; // maximum of the probability
505 int katmax = 0;
506
507 double M1 = EvtPDL::getMeanMass( parnum ); // B - meson mass
508 double M2 = EvtPDL::getMeanMass( mesnum ); // V - meson mass
509 double ml = EvtPDL::getMeanMass( l1num ); // leptonic mass
510
511 if ( res_swch == 0 ) {
512 // B-meson rest frame particles and they kinematics inicialization
513 double s_min, t_for_s;
514 s_min = 4.0 * pow( ml, 2.0 );
515 t_for_s = 0.5 *
516 ( pow( M1, 2.0 ) + pow( M2, 2.0 ) - 2.0 * pow( ml, 2.0 ) );
517
518 double EV, El2;
519 EV = ( pow( M1, 2.0 ) + pow( M2, 2.0 ) - s_min ) /
520 ( 2.0 * M1 ); // V-meson energy
521 El2 = ( s_min + t_for_s - pow( M2, 2.0 ) - pow( ml, 2.0 ) ) /
522 ( 2.0 * M1 ); // ell^- energy
523
524 double modV, modl2;
525 modV = sqrt( pow( EV, 2.0 ) - pow( M2, 2.0 ) );
526 modl2 = sqrt( pow( El2, 2.0 ) - pow( ml, 2.0 ) );
527
528 double cosVellminus; // angle between the vector meson and ell^- directions
529 cosVellminus = ( pow( M2, 2.0 ) + pow( ml, 2.0 ) + 2.0 * EV * El2 -
530 t_for_s ) /
531 ( 2.0 * modV * modl2 );
532 if ( ( fabs( cosVellminus ) > 1.0 ) &&
533 ( fabs( cosVellminus ) <= 1.0001 ) ) {
534 // EvtGenReport(EVTGEN_DEBUG,"EvtGen")
535 // << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
536 // << "\n cos(theta) = " << cosVellminus
537 // << std::endl;
538 cosVellminus = cosVellminus / fabs( cosVellminus );
539 }
540 if ( ( modV <= 0.000001 ) || ( modl2 <= 0.000001 ) ) {
541 cosVellminus = cosVellminus / fabs( cosVellminus );
542 EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
543 << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
544 << "\n modV = " << modV << "\n modl2 = " << modl2
545 << "\n cos(theta) = " << cosVellminus
546 << "\n t_for_s = " << t_for_s << "\n s_min = " << s_min
547 << "\n EV = " << EV << "\n El2 = " << El2
548 << "\n M2 = " << M2 << "\n ml = " << ml
549 << std::endl;
550 }
551 if ( fabs( cosVellminus ) > 1.0001 ) {
552 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
553 << "\n\n In the function EvtbTosllVectorAmpNew::CalcMaxProb(...)"
554 << "\n |cos(theta)| = " << fabs( cosVellminus ) << " > 1"
555 << "\n s_min = " << s_min << "\n t_for_s = " << t_for_s
556 << "\n EV = " << EV << "\n El2 = " << El2
557 << "\n modV = " << modV << "\n modl2 = " << modl2
558 << "\n M2 = " << M2 << "\n ml = " << ml << std::endl;
559 ::abort();
560 }
561
562 EvtVector4R p1, p2, k1, k2;
563 p1.set( M1, 0.0, 0.0, 0.0 );
564 p2.set( EV, modV, 0.0, 0.0 );
565 k2.set( El2, modl2 * cosVellminus,
566 -modl2 * sqrt( 1.0 - pow( cosVellminus, 2.0 ) ), 0.0 );
567 k1 = p1 - p2 - k2;
568
569 // EvtGenReport(EVTGEN_DEBUG,"EvtGen")
570 // << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
571 // << "\n mu =" << mu << " Nf =" << Nf
572 // << " res_swch =" << res_swch
573 // << " ias =" << ias
574 // << "\n CKM_A = " << CKM_A
575 // << " CKM_lambda = " << CKM_lambda
576 // << "\n CKM_barrho = " << CKM_barrho
577 // << " CKM_bareta = " << CKM_bareta
578 // << "\n M1 = " << M1
579 // << "\n M2 = " << M2
580 // << "\n ml = " << ml
581 // << "\n s_min = " << s_min
582 // << "\n t_for_s = " << t_for_s
583 // << "\n EV = " << EV
584 // << "\n El1 = " << El1
585 // << "\n El2 = " << El2
586 // << "\n modV = " << modV
587 // << "\n modl1 = " << modl1
588 // << "\n modl2 = " << modl2
589 // << "\n cos(theta) = " << cosVellminus
590 // << "\n p1 =" << p1
591 // << "\n p2 =" << p2
592 // << "\n k1 =" << k1
593 // << "\n k2 =" << k2
594 // << std::endl;
595
596 // B-meson state preparation at the rest frame of B-meson
597 EvtScalarParticle* scalar_part;
598 EvtParticle* root_part;
599 scalar_part = new EvtScalarParticle;
600
601 scalar_part->noLifeTime();
602 scalar_part->init( parnum, p1 );
603 root_part = (EvtParticle*)scalar_part;
604 root_part->setDiagonalSpinDensity();
605
606 // Amplitude initialization
607 EvtId listdaug[3];
608 listdaug[0] = mesnum;
609 listdaug[1] = l1num;
610 listdaug[2] = l2num;
611
612 EvtAmp amp;
613 amp.init( parnum, 3, listdaug );
614
615 // Daughters states preparation at the rest frame of B-meson
616 root_part->makeDaughters( 3, listdaug );
617
618 EvtParticle *vect, *lep1, *lep2;
619 vect = root_part->getDaug( 0 );
620 lep1 = root_part->getDaug( 1 );
621 lep2 = root_part->getDaug( 2 );
622
623 vect->noLifeTime();
624 lep1->noLifeTime();
625 lep2->noLifeTime();
626
627 vect->init( mesnum, p2 );
628 lep1->init( l1num, k1 );
629 lep2->init( l2num, k2 );
630
631 EvtSpinDensity rho;
632 rho.setDiag( root_part->getSpinStates() );
633
634 // The amplitude calculation at the
635 // "maximum amplitude" kinematical configuration
636 CalcAmp( root_part, amp, formFactors, WilsCoeff, mu, Nf, res_swch, ias,
637 CKM_A, CKM_lambda, CKM_barrho, CKM_bareta, ReA7, ImA7, ReA10,
638 ImA10 );
639
640 // Now find the probability at this q2 and cos theta lepton point
641 maxfoundprob = rho.normalizedProb( amp.getSpinDensity() );
642
643 delete scalar_part;
644 // delete root_part;
645 delete vect;
646 delete lep1;
647 delete lep2;
648
649 } // if(res_swch==0)
650
651 if ( res_swch == 1 ) {
652 double s, t_for_s; // Mandelstam variables
653 double t_plus, t_minus; // t-variable boundaries for current s-variable
654 double dt;
655 int k;
656
657 s = pow( 3.09688, 2.0 ); // s = (M_{J/\psi})^2
658
659 t_plus = pow( M1, 2.0 ) + pow( M2, 2.0 ) + 2.0 * pow( ml, 2.0 ) - s;
660 t_plus = t_plus + sqrt( 1.0 - 4.0 * pow( ml, 2.0 ) / s ) *
661 sqrt( lambda( s, pow( M1, 2.0 ), pow( M2, 2.0 ) ) );
662 t_plus *= 0.5;
663
664 t_minus = pow( M1, 2.0 ) + pow( M2, 2.0 ) + 2.0 * pow( ml, 2.0 ) - s;
665 t_minus = t_minus -
666 sqrt( 1.0 - 4.0 * pow( ml, 2.0 ) / s ) *
667 sqrt( lambda( s, pow( M1, 2.0 ), pow( M2, 2.0 ) ) );
668 t_minus *= 0.5;
669
670 dt = ( t_plus - t_minus ) / 1000.0;
671
672 // The maximum probability calculation
673 for ( k = 0; k <= 1000; k++ ) {
674 t_for_s = t_plus - dt * ( (double)k );
675
676 if ( ( t_for_s < t_minus ) && ( t_for_s >= ( 0.9999 * t_minus ) ) ) {
677 t_for_s = t_minus;
678 }
679 if ( t_for_s < ( 0.9999 * t_minus ) ) {
680 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
681 << "\n\n In the function EvtbTosllVectorAmpNew::CalcMaxProb(...)"
682 << "\n t_for_s = " << t_for_s << " < t_minus = " << t_minus
683 << " ! "
684 << "\n t_plus = " << t_plus << "\n dt = " << dt
685 << "\n k = " << k << "\n s = " << s
686 << "\n M1 = " << M1 << "\n M2 = " << M2
687 << "\n ml = " << ml << std::endl;
688 ::abort();
689 }
690
691 // B-meson rest frame particles and they kinematics inicialization
692 double EV, El2;
693 EV = ( pow( M1, 2.0 ) + pow( M2, 2.0 ) - s ) /
694 ( 2.0 * M1 ); // V-meson energy
695 El2 = ( s + t_for_s - pow( M2, 2.0 ) - pow( ml, 2.0 ) ) /
696 ( 2.0 * M1 ); // ell^- energy
697
698 double modV, modl2;
699 modV = sqrt( pow( EV, 2.0 ) - pow( M2, 2.0 ) );
700 modl2 = sqrt( pow( El2, 2.0 ) - pow( ml, 2.0 ) );
701
702 double cosVellminus; // angle between the vector meson and ell^- directions
703 cosVellminus = ( pow( M2, 2.0 ) + pow( ml, 2.0 ) + 2.0 * EV * El2 -
704 t_for_s ) /
705 ( 2.0 * modV * modl2 );
706 if ( ( fabs( cosVellminus ) > 1.0 ) &&
707 ( fabs( cosVellminus ) <= 1.0001 ) ) {
708 // EvtGenReport(EVTGEN_DEBUG,"EvtGen")
709 // << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
710 // << "\n cos(theta) = " << cosVellminus
711 // << std::endl;
712 cosVellminus = cosVellminus / fabs( cosVellminus );
713 }
714 if ( ( modV <= 0.000001 ) || ( modl2 <= 0.000001 ) ) {
715 cosVellminus = cosVellminus / fabs( cosVellminus );
716 EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
717 << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
718 << "\n modV = " << modV << "\n modl2 = " << modl2
719 << "\n cos(theta) = " << cosVellminus
720 << "\n s = " << s << "\n t_for_s = " << t_for_s
721 << "\n t_plus = " << t_plus
722 << "\n t_minus = " << t_minus << "\n dt = " << dt
723 << "\n EV = " << EV << "\n El2 = " << El2
724 << "\n M2 = " << M2 << "\n ml = " << ml
725 << std::endl;
726 }
727 if ( fabs( cosVellminus ) > 1.0001 ) {
728 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
729 << "\n\n In the function EvtbTosllVectorAmpNew::CalcMaxProb(...)"
730 << "\n |cos(theta)| = " << fabs( cosVellminus ) << " > 1"
731 << "\n s = " << s << "\n t_for_s = " << t_for_s
732 << "\n EV = " << EV << "\n El2 = " << El2
733 << "\n modV = " << modV << "\n modl2 = " << modl2
734 << "\n M2 = " << M2 << "\n ml = " << ml
735 << std::endl;
736 ::abort();
737 }
738
739 EvtVector4R p1, p2, k1, k2;
740 p1.set( M1, 0.0, 0.0, 0.0 );
741 p2.set( EV, modV, 0.0, 0.0 );
742 k2.set( El2, modl2 * cosVellminus,
743 -modl2 * sqrt( 1.0 - pow( cosVellminus, 2.0 ) ), 0.0 );
744 k1 = p1 - p2 - k2;
745
746 // EvtGenReport(EVTGEN_DEBUG,"EvtGen")
747 // << "\n Debug in the function EvtbTosllVectorAmpNew::CalcMaxProb(...):"
748 // << "\n mu =" << mu << " Nf =" << Nf
749 // << " res_swch =" << res_swch
750 // << " ias =" << ias
751 // << "\n CKM_A = " << CKM_A
752 // << " CKM_lambda = " << CKM_lambda
753 // << "\n CKM_barrho = " << CKM_barrho
754 // << " CKM_bareta = " << CKM_bareta
755 // << "\n M1 = " << M1
756 // << "\n M2 = " << M2
757 // << "\n ml = " << ml
758 // << "\n s = " << s
759 // << "\n t_for_s = " << t_for_s
760 // << "\n EV = " << EV
761 // << "\n El1 = " << El1
762 // << "\n El2 = " << El2
763 // << "\n modV = " << modV
764 // << "\n modl1 = " << modl1
765 // << "\n modl2 = " << modl2
766 // << "\n cos(theta) = " << cosVellminus
767 // << "\n p1 =" << p1
768 // << "\n p2 =" << p2
769 // << "\n k1 =" << k1
770 // << "\n k2 =" << k2
771 // << std::endl;
772
773 // B-meson state preparation at the rest frame of B-meson
774 EvtScalarParticle* scalar_part;
775 EvtParticle* root_part;
776 scalar_part = new EvtScalarParticle;
777
778 scalar_part->noLifeTime();
779 scalar_part->init( parnum, p1 );
780 root_part = (EvtParticle*)scalar_part;
781 root_part->setDiagonalSpinDensity();
782
783 // Amplitude initialization
784 EvtId listdaug[3];
785 listdaug[0] = mesnum;
786 listdaug[1] = l1num;
787 listdaug[2] = l2num;
788
789 EvtAmp amp;
790 amp.init( parnum, 3, listdaug );
791
792 // Daughters states preparation at the rest frame of B-meson
793 root_part->makeDaughters( 3, listdaug );
794
795 EvtParticle *vect, *lep1, *lep2;
796 vect = root_part->getDaug( 0 );
797 lep1 = root_part->getDaug( 1 );
798 lep2 = root_part->getDaug( 2 );
799
800 vect->noLifeTime();
801 lep1->noLifeTime();
802 lep2->noLifeTime();
803
804 vect->init( mesnum, p2 );
805 lep1->init( l1num, k1 );
806 lep2->init( l2num, k2 );
807
808 EvtSpinDensity rho;
809 rho.setDiag( root_part->getSpinStates() );
810
811 // The amplitude calculation at the
812 // "maximum amplitude" kinematical configuration
813 CalcAmp( root_part, amp, formFactors, WilsCoeff, mu, Nf, res_swch,
814 ias, CKM_A, CKM_lambda, CKM_barrho, CKM_bareta, ReA7, ImA7,
815 ReA10, ImA10 );
816
817 // Now find the probability at this q2 and cos theta lepton point
818 double nikmax = rho.normalizedProb( amp.getSpinDensity() );
819
820 if ( nikmax > maxfoundprob ) {
821 maxfoundprob = nikmax;
822 katmax = k;
823 EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
824 << "\n maxfoundprob ( s =" << s << ", t = " << t_for_s
825 << " ) = " << maxfoundprob << "\n k =" << katmax
826 << std::endl;
827 }
828
829 delete scalar_part;
830 // delete root_part;
831 delete vect;
832 delete lep1;
833 delete lep2;
834
835 } // for(k=0; k<=1000; k++)
836
837 } // if(res_swch==1)
838
839 if ( maxfoundprob <= 0.0 ) {
840 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
841 << "\n\n In the function EvtbTosllVectorAmpNew::CalcMaxProb(...)"
842 << "\n maxfoundprob = " << maxfoundprob << " <0 or =0!"
843 << "\n res_swch = " << res_swch << std::endl;
844 ::abort();
845 }
846
847 EvtGenReport( EVTGEN_NOTICE, "EvtGen" )
848 << "\n maxfoundprob (...) = " << maxfoundprob << std::endl;
849
850 maxfoundprob *= 1.01;
851
852 // EvtGenReport(EVTGEN_NOTICE,"EvtGen")
853 // << "\n ***************************************************************************"
854 // << "\n The function EvtbTosllVectorAmpNew::CalcMaxProb(...) passed with arguments:"
855 // << "\n mu =" << mu << " Nf =" << Nf
856 // << " res_swch =" << res_swch
857 // << " ias =" << ias
858 // << "\n CKM_A = " << CKM_A
859 // << " CKM_lambda = " << CKM_lambda
860 // << "\n CKM_barrho = " << CKM_barrho
861 // << " CKM_bareta = " << CKM_bareta
862 // << "\n The distribution maximum maxfoundprob =" << maxfoundprob
863 // << "\n k = " << katmax
864 // << "\n ***************************************************************************"
865 // << std::endl;
866
867 return maxfoundprob;
868}
869
870// Triangular function
871double EvtbTosllVectorAmpNewExt::lambda( double a, double b, double c )
872{
873 double l;
874
875 l = pow( a, 2.0 ) + pow( b, 2.0 ) + pow( c, 2.0 ) - 2.0 * a * b -
876 2.0 * a * c - 2.0 * b * c;
877
878 return l;
879}
EvtComplex conj(const EvtComplex &c)
double imag(const EvtComplex &c)
double real(const EvtComplex &c)
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
const double a2
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 EvtVector4C epsParent(int i) const
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
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)
virtual void getVectorFF(EvtId, EvtId, double, double &, double &, double &, double &, double &, double &, double &)
virtual double getQuarkMass(int)
double CalcMaxProb(EvtId parnum, EvtId mesnum, EvtId l1num, EvtId l2num, EvtbTosllFFNew *formFactors, EvtbTosllWilsCoeffNLO *WilsCoeff, double mu, int Nf, int res_swch, int ias, double CKM_A, double CKM_lambda, double CKM_barrho, double CKM_bareta, double ReA7, double ImA7, double ReA10, double ImA10) override
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtbTosllFFNew *formFactors, EvtbTosllWilsCoeffNLO *WilsCoeff, double mu, int Nf, int res_swch, int ias, double CKM_A, double CKM_lambda, double CKM_barrho, double CKM_bareta, double ReA7, double ImA7, double ReA10, double ImA10) override
double lambda(double a, double b, double c) override
EvtComplex GetC10Eff(double mt, double Mw)
EvtComplex GetC7Eff(double mu, double Mw, double mt, 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)
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)