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