Belle II Software development
EvtbTosllNPR.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <framework/logging/Logger.h>
10#include <framework/particledb/EvtGenDatabasePDG.h>
11//#include "TDecayChannel.h"
12
13#include "generators/evtgen/EvtGenModelRegister.h"
14#include "generators/evtgen/models/EvtbTosllNPR.h"
15
16#include "EvtGenBase/EvtGenKine.hh"
17#include "EvtGenBase/EvtPDL.hh"
18#include "EvtGenBase/EvtParticle.hh"
19#include "EvtGenBase/EvtScalarParticle.hh"
20#include "EvtGenBase/EvtRandom.hh"
21
22#include "EvtGenBase/EvtAmp.hh"
23#include "EvtGenBase/EvtDiracSpinor.hh"
24#include "EvtGenBase/EvtId.hh"
25#include "EvtGenBase/EvtPDL.hh"
26#include "EvtGenBase/EvtParticle.hh"
27#include "EvtGenBase/EvtTensor4C.hh"
28#include "EvtGenBase/EvtVector4C.hh"
29
30#include "EvtGenModels/EvtbTosllAmp.hh"
31#include "EvtGenModels/EvtbTosllFF.hh"
32
33#include <algorithm>
34#include <complex>
35
38
39using std::endl;
40using namespace std::complex_literals;
42{
43 return "BTOSLLNPR";
44}
45
46EvtDecayBase* EvtbTosllNPR::clone()
47{
48 return new EvtbTosllNPR;
49}
50
55struct EvtPointf {
57 float x;
59 float y;
60};
61
62static void EvtLeptonVandACurrents(EvtVector4C&, EvtVector4C&, const EvtDiracSpinor&, const EvtDiracSpinor&);
63
73
77 explicit EvtLinSample(const std::vector<EvtPointf>& _v) { init(_v); }
78
82 void init(const std::vector<EvtPointf>& _v);
83
88 std::pair<double, double> operator()(double) const;
89
91 std::vector<EvtPointf> m_v;
92
94 std::vector<double> m_I;
95};
96
97
114static double PhaseSpacePole2(double M, double m1, double m2, double m3, EvtVector4R* p4, const EvtLinSample* ls)
115{
116 const EvtLinSample& g = *ls;
117 double m13sqmin = (m1 + m3) * (m1 + m3), m13sqmax = (M - m2) * (M - m2);
118 double d13 = m13sqmax - m13sqmin;
119 double M2 = M * M, m32 = m3 * m3, m12 = m1 * m1, m22 = m2 * m2;
120 double c0 = M2 - m32, c1 = m12 - m22, c2 = m32 + m12;
121 double m12sq, m13sq, weight;
122 do {
123 double z0 = EvtRandom::random(), z1 = EvtRandom::random();
124 m13sq = m13sqmin + z0 * d13;
125 auto t = g(z1);
126 m12sq = t.first;
127 weight = t.second;
128 double E3s = c0 - m12sq, E1s = m12sq + c1;
129 double w = 2 * m12sq, e = 4 * m12sq;
130 double A = (m13sq - c2) * w - E3s * E1s;
131 double B = (E3s * E3s - e * m32) * (E1s * E1s - e * m12);
132 if (A * A < B)
133 break;
134 } while (true);
135 double iM = 0.5 / M;
136 double E2 = (M2 + m22 - m13sq) * iM;
137 double E3 = (M2 + m32 - m12sq) * iM;
138 double E1 = M - E2 - E3;
139 double p1 = sqrt(E1 * E1 - m12);
140 double p3 = sqrt(E3 * E3 - m32);
141 double cost13 = (2.0 * E1 * E3 + (m12 + m32 - m13sq)) / (2.0 * p1 * p3);
142
143 double px = p1 * cost13;
144 double v0x = px;
145 double v1x = -px - p3;
146 double py = p1 * sqrt(1.0 - cost13 * cost13);
147 double v2x = p3;
148
149 double phi = (EvtRandom::random() - 0.5) * (2 * M_PI);
150 double x = cos(phi), y = sin(phi);
151 phi = (EvtRandom::random() - 0.5) * (2 * M_PI);
152 double c = cos(phi), s = sin(phi);
153 double u = EvtRandom::random() * 2, z = u - 1, t = sqrt(1 - z * z);
154 double Rx = s * y - c * x, Ry = c * y + s * x, ux = u * x, uy = u * y;
155 double R00 = ux * Rx + c, R01 = s - ux * Ry, R10 = uy * Rx - s,
156 R11 = c - uy * Ry, R20 = -t * Rx, R21 = t * Ry;
157 double pyx = R01 * py, pyy = R11 * py, pyz = R21 * py;
158
159 p4[0].set(E1, R00 * v0x + pyx, R10 * v0x + pyy, R20 * v0x + pyz);
160 p4[1].set(E2, R00 * v1x - pyx, R10 * v1x - pyy, R20 * v1x - pyz);
161 p4[2].set(E3, R00 * v2x, R10 * v2x, R20 * v2x);
162
163 return weight;
164}
165
166void EvtbTosllNPR::decay(EvtParticle* p)
167{
168 static EvtVector4R p4[3];
169 static double mass[3];
170 double m_b = p->mass();
171 for (int i = 0; i < 3; i++)
172 mass[i] = p->getDaug(i)->mass();
173 EvtId* daughters = getDaugs();
174 double weight = PhaseSpacePole2(m_b, mass[2], mass[1], mass[0], p4, m_ls);
175 p->getDaug(0)->init(daughters[0], p4[2]);
176 p->getDaug(1)->init(daughters[1], p4[1]);
177 p->getDaug(2)->init(daughters[2], p4[0]);
178
179 setWeight(weight);
180 CalcAmp(p, _amp2);
181}
182
187void EvtLinSample::init(const std::vector<EvtPointf>& _v)
188{
189 m_v = _v;
190 m_I.push_back(0);
191 for (unsigned i = 0; i < m_v.size() - 1; i++)
192 m_I.push_back((m_v[i + 1].y + m_v[i + 0].y) * (m_v[i + 1].x - m_v[i + 0].x) + m_I.back());
193 double norm = 1 / m_I.back();
194 for (unsigned i = 0; i < m_v.size(); i++)
195 m_I[i] *= norm;
196}
197
202std::pair<double, double> EvtLinSample::operator()(double r) const
203{
204 int j = upper_bound(m_I.begin(), m_I.end(), r) - m_I.begin();
205 double dI = m_I[j] - m_I[j - 1];
206 r = (r - m_I[j - 1]) / dI;
207 double f0 = m_v[j - 1].y, f1 = m_v[j].y, x0 = m_v[j - 1].x, x1 = m_v[j].x,
208 df = f1 - f0, dx = x1 - x0, z;
209 if (fabs(df) > f0 * 1e-3) {
210 z = (f1 * x0 - x1 * f0 + dx * sqrt(df * (f0 + f1) * r + f0 * f0)) / df;
211 } else {
212 if (f0 > f1) {
213 z = x0 + (r * dx) * (f1 - r * df) / f0;
214 } else {
215 z = x1 - (r * dx) * (f0 + r * df) / f1;
216 }
217 }
218 return std::make_pair(z, f0 + (df / dx) * (z - x0));
219}
220
224struct BW_t {
226 double Mv2;
227
229 double Gv2;
230
232 double A;
233
241 BW_t(double m, double gtot, double ghad, double bll, double alpha = 1 / 137.035999084)
242 {
243 // const double alpha = 1 / 137.035999084; // (+-21) PDG 2021
244 Mv2 = m * m;
245 Gv2 = gtot * gtot;
246 A = (9 / (alpha * alpha)) * bll * gtot * ghad;
247 }
248
252 double R(double s) const
253 {
254 double z = s - Mv2, z2 = z * z;
255 return A * s / (z2 + Mv2 * Gv2);
256 }
257
261 double Rp(double s) const
262 {
263 double z = s - Mv2, z2 = z * z, t = 1 / (z2 + Mv2 * Gv2);
264 t *= 1 - 2 * s * z * t;
265 return A * t;
266 }
267
271 double Rpp(double s) const
272 {
273 double z = s - Mv2, z2 = z * z, t = 1 / (z2 + Mv2 * Gv2);
274 t = t * t * (8 * s * z2 * t - 4 * z - 2 * s);
275 return A * t;
276 }
277
282 double DRIntegral(double s, double sp) const
283 {
284 double zp = sp - Mv2, zp2 = zp * zp;
285 double z = s - Mv2, z2 = z * z;
286 double GM2 = Mv2 * Gv2, GM = sqrt(GM2);
287 double ds = sp - s;
288 return A * (0.5 * log(ds * ds / (zp2 + GM2)) - z * atan(zp / GM) / GM) / (z2 + GM2);
289 }
290
297 void addknots(std::vector<double>& en) const
298 {
299 double Mv = sqrt(Mv2), Gv = sqrt(Gv2);
300 double w = 0.6;
301 double smin = (Mv - w * Gv) * (Mv - w * Gv);
302 double smax = (Mv + w * Gv) * (Mv + w * Gv);
303 en.push_back(Mv * Mv);
304 for (int i = 0, n = 30; i < n; i++) {
305 double s = smin + (smax - smin) * (i + 0.5) / n;
306 en.push_back(s);
307 }
308 w = 2;
309 double smin1 = (Mv - w * Gv) * (Mv - w * Gv);
310 double smax1 = (Mv + w * Gv) * (Mv + w * Gv);
311 for (int i = 0, n = 30; i < n; i++) {
312 double s = smin1 + (smax1 - smin1) * (i + 0.5) / n;
313 if (s >= smin && s <= smax)
314 continue;
315 en.push_back(s);
316 }
317 w = 8;
318 double smin2 = (Mv - w * Gv) * (Mv - w * Gv);
319 double smax2 = (Mv + w * Gv) * (Mv + w * Gv);
320 for (int i = 0, n = 30; i < n; i++) {
321 double s = smin2 + (smax2 - smin2) * (i + 0.5) / n;
322 if (s >= smin1 && s <= smax1)
323 continue;
324 en.push_back(s);
325 }
326 w = 30;
327 double smin3 = (Mv - w * Gv) * (Mv - w * Gv);
328 double smax3 = (Mv + w * Gv) * (Mv + w * Gv);
329 for (int i = 0, n = 30; i < n; i++) {
330 double s = smin3 + (smax3 - smin3) * (i + 0.5) / n;
331 if (s >= smin2 && s <= smax2)
332 continue;
333 en.push_back(s);
334 }
335 w = 100;
336 double smin4 = (Mv - w * Gv) * (Mv - w * Gv);
337 double smax4 = (Mv + w * Gv) * (Mv + w * Gv);
338 for (int i = 0, n = 20; i < n; i++) {
339 double s = smin4 + (smax4 - smin4) * (i + 0.5) / n;
340 if (s >= smin3 && s <= smax3)
341 continue;
342 en.push_back(s);
343 }
344 }
345};
346
351static double Rcont(double s)
352{
353 // const double mb = 4.18 /* +0.03 -0.02 [GeV] */, mb2 = mb * mb;
354 const double mb = 4.8 /* +0.03 -0.02 [GeV] */, mb2 = mb * mb;
355 if (s < 0.6 * mb2) return 0;
356 if (s < 0.69 * mb2)
357 return (1.02 / ((0.69 - 0.6) * mb2)) * (s - 0.6 * mb2);
358 return 1.02;
359}
360
366static double uR(double s, double wjpsi, double wpsi2s, double wrest, const std::vector<BW_t*>& res)
367{
368 double sum = 0;
369 for (unsigned i = 2; i < res.size(); i++) sum += res[i]->R(s);
370 return Rcont(s) + wjpsi * res[0]->R(s) + wpsi2s * res[1]->R(s) + wrest * sum;
371 // return Rcont(s) + wjpsi * jpsi.R(s) + wpsi2s * psi2s.R(s) + wrest * (psi3770.R(s) + psi4040.R(s) + psi4160.R(s) + psi4230.R(s));
372}
373
377static double linint(double a, double b, double s, double sp)
378{
379 double x = std::abs(sp - s);
380 return ((a * s - b) * log(x) + b * log(sp)) / s;
381}
382
386static double cnstint(double c, double s, double sp)
387{
388 double x = std::abs(sp - s);
389 return c * (log(x) - log(sp)) / s;
390}
391
395static double DRIcont(double s)
396{
397 // !!! check mb value!!!
398 // const double mb = 4.18/* +0.03 -0.02 [GeV] */, mb2 = mb*mb;
399 const double mb = 4.8/* +0.03 -0.02 [GeV] */, mb2 = mb * mb;
400 double s0 = 0.6 * mb2, s1 = 0.69 * mb2;
401 double c = 1.02, a = c / (s1 - s0), b = c * s0 / (s1 - s0);
402 return (linint(a, b, s, s1) - linint(a, b, s, s0)) - cnstint(c, s, s1);
403}
404
410static double DRInt(double s, double wjpsi, double wpsi2s, double wrest, const std::vector<BW_t*>& res)
411{
412 static const double Mpi = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("pi+")->Mass(); //charged pion mass
413 const double ct = 4 * Mpi * Mpi;
414 auto Integ = [ct, s](const BW_t * r) {return r->DRIntegral(s, 1e8) - r->DRIntegral(s, ct);};
415 double sum = 0;
416 for (unsigned i = 2; i < res.size(); i++) sum += Integ(res[i]);
417 return DRIcont(s) + wjpsi * Integ(res[0]) + wpsi2s * Integ(res[1]) + wrest * sum;
418}
419
425static std::vector<double> getgrid(const std::vector<BW_t*>& reso)
426{
427 const double m_c = 1.3, m_s = 0.2;
428
429 static const double m_e = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("e-")->Mass(); // electron mass
430 static const double MD0 = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("D0")->Mass(); // D0 mass
431
432 std::vector<double> en;
433 if (reso.size() > 0) {
434 for (const auto t : reso)
435 t->addknots(en);
436 const BW_t& jpsi = *(reso[0]);
437 en.push_back(jpsi.Mv2 + 0.1);
438 en.push_back(jpsi.Mv2 - 0.1);
439 en.push_back(jpsi.Mv2 + 0.08);
440 en.push_back(jpsi.Mv2 - 0.08);
441 en.push_back(jpsi.Mv2 + 0.065);
442 en.push_back(jpsi.Mv2 - 0.065);
443 }
444
445 double smax = 25; //4.37*4.37;
446 for (unsigned i = 0, n = 200; i < n; i++) {
447 double s = smax / n * (i + 0.5);
448 en.push_back(s);
449 }
450
451 double t0;
452 for (t0 = 4 * m_e * m_e; t0 < 0.15; t0 *= 1.5) {
453 en.push_back(t0);
454 }
455
456 for (t0 = 4 * m_e * m_e; t0 < 0.5; t0 *= 1.5) {
457 en.push_back(4 * MD0 * MD0 + t0);
458 en.push_back(4 * MD0 * MD0 - t0);
459 }
460
461 en.push_back(4 * m_c * m_c);
462 for (t0 = 0.00125; t0 < 0.05; t0 *= 1.5) {
463 en.push_back(4 * m_c * m_c + t0);
464 en.push_back(4 * m_c * m_c - t0);
465 }
466
467 en.push_back(4 * m_s * m_s);
468 for (t0 = 0.00125; t0 < 0.1; t0 *= 1.5) {
469 en.push_back(4 * m_s * m_s + t0);
470 en.push_back(4 * m_s * m_s - t0);
471 }
472
473 std::sort(en.begin(), en.end());
474
475 for (std::vector<double>::iterator it = en.begin(); it != en.end(); ++it) {
476 if (*it > smax) {
477 en.erase(it, en.end());
478 break;
479 }
480 }
481 return en;
482}
483
485{
486 EvtId pId = getParentId(), mId = getDaug(0), l1Id = getDaug(1), l2Id = getDaug(2);
487
488 std::vector<double> v;
489 std::vector<EvtPointf> pp;
490
491 EvtScalarParticle* scalar_part;
492 EvtParticle* root_part;
493
494 scalar_part = new EvtScalarParticle;
495
496 //includge to avoid generating random numbers!
497 scalar_part->noLifeTime();
498
499 EvtVector4R p_init;
500
501 p_init.set(EvtPDL::getMass(pId), 0.0, 0.0, 0.0);
502 scalar_part->init(pId, p_init);
503 root_part = (EvtParticle*)scalar_part;
504 root_part->setDiagonalSpinDensity();
505
506 EvtParticle* daughter, *lep1, *lep2;
507
508 EvtAmp amp;
509
510 EvtId listdaug[3];
511 listdaug[0] = mId;
512 listdaug[1] = l1Id;
513 listdaug[2] = l2Id;
514
515 amp.init(pId, 3, listdaug);
516
517 root_part->makeDaughters(3, listdaug);
518 daughter = root_part->getDaug(0);
519 lep1 = root_part->getDaug(1);
520 lep2 = root_part->getDaug(2);
521
522 //cludge to avoid generating random numbers!
523 daughter->noLifeTime();
524 lep1->noLifeTime();
525 lep2->noLifeTime();
526
527 //Initial particle is unpolarized, well it is a scalar so it is trivial
528 EvtSpinDensity rho;
529 rho.setDiag(root_part->getSpinStates());
530
531 double mass[3];
532
533 double m = root_part->mass();
534
535 EvtVector4R p4meson, p4lepton1, p4lepton2, p4w;
536
537 double maxprobfound = 0.0;
538
539 mass[1] = EvtPDL::getMeanMass(l1Id);
540 mass[2] = EvtPDL::getMeanMass(l2Id);
541 std::vector<double> mH;
542 mH.push_back(EvtPDL::getMeanMass(mId));
543 //if the particle is narrow dont bother with changing the mass.
544 double g = EvtPDL::getWidth(mId);
545 if (g > 0) {
546 mH.push_back(EvtPDL::getMinMass(mId));
547 mH.push_back(
548 std::min(EvtPDL::getMaxMass(mId), m - mass[1] - mass[2]));
549 mH.push_back(mH.front() - g);
550 mH.push_back(mH.front() + g);
551 }
552
553 double q2min = (mass[1] + mass[2]) * (mass[1] + mass[2]);
554
555 double m0 = EvtPDL::getMinMass(mId);
556 double q2max = (m - m0) * (m - m0);
557 v = getgrid(m_rs);
558 m0 = mH[0];
559 //loop over q2
560 for (double q2 : v) {
561 // want to avoid picking up the tail of the photon propagator
562 if (!(q2min <= q2 && q2 < q2max))
563 continue;
564 double Erho = (m * m + m0 * m0 - q2) / (2.0 * m);
565 if (Erho < m0) {
566 m0 = EvtPDL::getMinMass(mId);
567 Erho = (m * m + m0 * m0 - q2) / (2.0 * m);
568 }
569 double Prho = sqrt((Erho - m0) * (Erho + m0));
570
571 p4meson.set(Erho, 0.0, 0.0, -Prho);
572 p4w.set(m - Erho, 0.0, 0.0, Prho);
573
574 //This is in the W rest frame
575 double Elep = sqrt(q2) * 0.5,
576 Plep = sqrt((Elep - mass[1]) * (Elep + mass[1]));
577
578 const int nj = 3 + 2 + 4 + 8 + 32;
579 double cmin = -1, cmax = 1, dc = (cmax - cmin) / (nj - 1);
580 double maxprob = 0;
581 for (int j = 0; j < nj; j++) {
582 double c = cmin + dc * j;
583
584 //These are in the W rest frame. Need to boost out into the B frame.
585 double Py = Plep * sqrt(1.0 - c * c), Pz = Plep * c;
586 p4lepton1.set(Elep, 0.0, Py, Pz);
587 p4lepton2.set(Elep, 0.0, -Py, -Pz);
588
589 p4lepton1 = boostTo(p4lepton1, p4w);
590 p4lepton2 = boostTo(p4lepton2, p4w);
591
592 //Now initialize the daughters...
593 daughter->init(mId, p4meson);
594 lep1->init(l1Id, p4lepton1);
595 lep2->init(l2Id, p4lepton2);
596 CalcAmp(root_part, amp);
597 double prob = rho.normalizedProb(amp.getSpinDensity());
598 maxprob = std::max(maxprob, prob);
599 }
600 pp.push_back({ (float)q2, (float)maxprob });
601 maxprobfound = std::max(maxprobfound, maxprob);
602 }
603 root_part->deleteTree();
604
605 m_ls->init(pp);
606 maxprobfound = 4;
607 setProbMax(maxprobfound);
608}
609
610static EvtId IdB0, IdaB0, IdBp, IdBm, IdBs, IdaBs, IdRhop, IdRhom, IdRho0,
611 IdOmega, IdKst0, IdaKst0, IdKstp, IdKstm, IdK0, IdaK0, IdKp, IdKm;
612static bool cafirst = true;
613
615{
616 if (cafirst) {
617 cafirst = false;
618 IdB0 = EvtPDL::getId("B0");
619 IdaB0 = EvtPDL::getId("anti-B0");
620 IdBp = EvtPDL::getId("B+");
621 IdBm = EvtPDL::getId("B-");
622 IdBs = EvtPDL::getId("B_s0");
623 IdaBs = EvtPDL::getId("anti-B_s0");
624 IdRhop = EvtPDL::getId("rho+");
625 IdRhom = EvtPDL::getId("rho-");
626 IdRho0 = EvtPDL::getId("rho0");
627 IdOmega = EvtPDL::getId("omega");
628 IdKst0 = EvtPDL::getId("K*0");
629 IdaKst0 = EvtPDL::getId("anti-K*0");
630 IdKstp = EvtPDL::getId("K*+");
631 IdKstm = EvtPDL::getId("K*-");
632 IdK0 = EvtPDL::getId("K0");
633 IdaK0 = EvtPDL::getId("anti-K0");
634 IdKp = EvtPDL::getId("K+");
635 IdKm = EvtPDL::getId("K-");
636 }
637
638 // First choose format of NP coefficients from the .DEC file
639 // Cartesian(x,y)(0) or Polar(R,phase)(1)
640 int n = getNArg();
641 checkNDaug(3);
642
643 //We expect the parent to be a scalar
644 //and the daughters to be K(*) lepton+ lepton-
645
646 checkSpinParent(EvtSpinType::SCALAR);
647 checkSpinDaughter(1, EvtSpinType::DIRAC);
648 checkSpinDaughter(2, EvtSpinType::DIRAC);
649
650 EvtId mId = getDaug(0);
651 if (mId != IdKst0 && mId != IdaKst0 && mId != IdKstp && mId != IdKstm &&
652 mId != IdK0 && mId != IdaK0 && mId != IdKp && mId != IdKm) {
653 EvtGenReport(EVTGEN_ERROR, "EvtGen")
654 << "EvtbTosllNPR generator expected a K(*) 1st daughter, found: "
655 << EvtPDL::name(getDaug(0)) << endl;
656 EvtGenReport(EVTGEN_ERROR, "EvtGen")
657 << "Will terminate execution!" << endl;
658 ::abort();
659 }
660
661 auto getInteger = [this](int i) -> int {
662 double a = getArg(i);
663 if (a - static_cast<int>(a) != 0)
664 {
665 EvtGenReport(EVTGEN_ERROR, "EvtGen")
666 << "Parameters is not integer in the BTOSLLNPR decay model: " << i
667 << " " << a << endl;
668 EvtGenReport(EVTGEN_ERROR, "EvtGen")
669 << "Will terminate execution!" << endl;
670 ::abort();
671 }
672 return static_cast<int>(a);
673 };
674
675 double phi = 0.0, n1 = 0.0, d1 = 1.0, eta = 0.0, theta_Jpsi = 0.0, theta_psi2S = 0.0, Nr = 1.0;
676 if (n > 0) { // parse arguments
677 int i = 0, coordsyst = getInteger(i++);
678 auto getcomplex = [this, &i, coordsyst]() -> EvtComplex {
679 double a0 = getArg(i++);
680 double a1 = getArg(i++);
681 return (coordsyst) ? EvtComplex(a0 * cos(a1), a0 * sin(a1))
682 : EvtComplex(a0, a1);
683 };
684 auto getreal = [this, &i]() -> double { return getArg(i++); };
685 while (i < n) {
686 int id = getInteger(i++); // New Physics cooeficient Id
687 if (id == 0)
688 m_dc7 = getcomplex(); // delta C_7eff
689 if (id == 1)
690 m_dc9 = getcomplex(); // delta C_9eff
691 if (id == 2)
692 m_dc10 = getcomplex(); // delta C_10eff
693 if (id == 3)
694 m_c7p = getcomplex(); // C'_7eff -- right hand polarizations
695 if (id == 4)
696 m_c9p = getcomplex(); // C'_9eff -- right hand polarizations
697 if (id == 5)
698 m_c10p = getcomplex(); // c'_10eff -- right hand polarizations
699 if (id == 6)
700 m_cS = getcomplex(); // (C_S - C'_S) -- scalar right and left polarizations
701 if (id == 7)
702 m_cP = getcomplex(); // (C_P - C'_P) -- pseudo-scalar right and left polarizations
703 if (id == 10)
704 m_flag = getInteger(i++); // include resonances or not
705 if (id == 11)
706 phi = getreal(); // phase of the non-factorizable contribution
707 if (id == 12)
708 n1 = getreal(); // amplitude of the non-factorizable contribution
709 if (id == 13)
710 d1 = getreal(); // width of the non-factorizable contribution
711 if (id == 14)
712 eta = getreal(); // Eq. 47
713 if (id == 15)
714 theta_Jpsi = getreal(); // Eq. 47
715 if (id == 16)
716 theta_psi2S = getreal(); // Eq. 47
717 if (id == 17)
718 Nr = getreal(); // Eq. 47
719 }
720 }
721 m_ls = new EvtLinSample;
722
723 if (!m_flag) return;
724 // BW_t jpsi(3.0969, 0.0926 / 1000, 0.0926 / 1000 * 0.877, 0.05971);
725 // BW_t psi2s(3.6861, 0.294 / 1000, 0.294 / 1000 * 0.9785, 0.00793);
726 // BW_t psi3770(3773.7 / 1000, 27.2 / 1000, 27.2 / 1000, 1e-5);
727 // BW_t psi4040(4039 / 1000., 80 / 1000., 80 / 1000., 1.07e-5);
728 // BW_t psi4160(4191 / 1000., 70 / 1000., 70 / 1000., 6.9e-6);
729 // BW_t psi4230(4220 / 1000., 60 / 1000., 60 / 1000., 1e-5);
730
731 TParticlePDG* p_jpsi = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("J/psi");
732 // B2WARNING("extracting leptonic width"<<std::flush);
733 // TDecayChannel *c_jpsi = p_jpsi->DecayChannel(1);
734 // B2WARNING("Br = "<<c_jpsi->BranchingRatio());
735 BW_t* jpsi = new BW_t(p_jpsi->Mass(), p_jpsi->Width(), p_jpsi->Width() * 0.877, 0.05971);
736 m_rs.push_back(jpsi);
737
738 TParticlePDG* p_psi2s = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("psi(2S)");
739 BW_t* psi2s = new BW_t(p_psi2s->Mass(), p_psi2s->Width(), p_psi2s->Width() * 0.9785, 0.00793);
740 m_rs.push_back(psi2s);
741
742 TParticlePDG* p_psi3770 = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("psi(3770)");
743 BW_t* psi3770 = new BW_t(p_psi3770->Mass(), p_psi3770->Width(), p_psi3770->Width(), 1e-5);
744 m_rs.push_back(psi3770);
745
746 TParticlePDG* p_psi4040 = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("psi(4040)");
747 BW_t* psi4040 = new BW_t(p_psi4040->Mass(), p_psi4040->Width(), p_psi4040->Width(), 1.07e-5);
748 m_rs.push_back(psi4040);
749
750 TParticlePDG* p_psi4160 = Belle2::EvtGenDatabasePDG::Instance()->GetParticle("psi(4160)");
751 BW_t* psi4160 = new BW_t(p_psi4160->Mass(), p_psi4160->Width(), p_psi4160->Width(), 6.9e-6);
752 m_rs.push_back(psi4160);
753
754 BW_t* psi4230 = new BW_t(4220 / 1000., 60 / 1000., 60 / 1000., 1e-5);
755 m_rs.push_back(psi4230);
756
757 std::vector<double> v = getgrid(m_rs);
758 std::complex<double> eiphi = exp(1i * phi), pJpsi = Nr * exp(1i * theta_Jpsi), ppsi2S = Nr * exp(1i * theta_psi2S);
759
760 const double C1 = -0.257, C2 = 1.009, C3 = -0.005, C5 = 0;
761 double sc = 1.0 / (4.0 / 3.0 * C1 + C2 + 6.0 * C3 + 60.0 * C5);
762 const double m_b = 4.8, m_c = 1.3;
763 for (auto t : v) {
764 // Eq. 13, 14, and 15 in Emi's note. For the default theta_Jpsi=0 and theta_psi2S=0 it is identical to the Rahul's dispersion relation
765 double re = -8.0 / 9.0 * log(m_c / m_b) - 4.0 / 9.0 +
766 t / 3.0 * DRInt(t, real(pJpsi), real(ppsi2S), Nr, m_rs) - M_PI / 3 * uR(t, imag(pJpsi), imag(ppsi2S), 0, m_rs);
767 double im =
768 t / 3.0 * DRInt(t, imag(pJpsi), imag(ppsi2S), 0, m_rs) + M_PI / 3 * uR(t, real(pJpsi), real(ppsi2S), Nr, m_rs);
769 std::complex<double> r(re, im);
770 if (eta == 0.0) {
771 double z = t - jpsi->Mv2;
772 r += eiphi * (n1 * sc / (z * z + d1)); // bump under J/psi as a non-factorizable contribution
773 }
774 m_reso.push_back(std::make_pair(t, r));
775 }
776}
777
779{
780 for (BW_t* t : m_rs) delete t;
781 if (m_ls) delete m_ls;
782}
783
784static std::complex<double> hfun(double q2, double mq)
785{
786 const double mu = 4.8; // mu = m_b = 4.8 GeV
787 if (mq == 0.0)
788 return std::complex<double>(8. / 27 + 4. / 9 * log(mu * mu / q2), 4. / 9 * M_PI);
789 double z = 4 * mq * mq / q2;
790 std::complex<double> t;
791 if (z > 1) {
792 t = atan(1 / sqrt(z - 1));
793 } else {
794 t = std::complex<double>(log((1 + sqrt(1 - z)) / sqrt(z)), -M_PI / 2);
795 }
796 return -4 / 9. * (2 * log(mq / mu) - 2 / 3. - z) - (4 / 9. * (2 + z) * sqrt(fabs(z - 1))) * t;
797}
798
799static EvtComplex C9(double q2, std::complex<double> hReso = std::complex<double>(0, 0))
800{
801 double m_b = 4.8; // quark masses
802 double C1 = -0.257, C2 = 1.009, C3 = -0.005, C4 = -0.078, C5 = 0, C6 = 0.001;
803 std::complex<double> Y = (hReso) *
804 (4 / 3. * C1 + C2 + 6 * C3 + 60 * C5);
805 Y -= 0.5 * hfun(q2, m_b) * (7 * C3 + 4 / 3. * C4 + 76 * C5 + 64 / 3. * C6);
806 Y -= 0.5 * hfun(q2, 0.0) * (C3 + 4 / 3. * C4 + 16 * C5 + 64 / 3. * C6);
807 Y += 4 / 3. * C3 + 64 / 9. * C5 + 64 / 27. * C6;
808 return EvtComplex(4.211 + real(Y), imag(Y));
809}
810
811static std::complex<double> interpol(const hvec_t& v, double s)
812{
813 if (!v.size()) {
814 double m_c = 1.3; // quark masses
815 return hfun(s, m_c);
816 }
817 int j = std::lower_bound(v.begin(), v.end(), s, [](const helem_t& a, double b) { return a.first < b; }) - v.begin();
818
819 double dx = v[j].first - v[j - 1].first;
820 auto dy = v[j].second - v[j - 1].second;
821 return v[j - 1].second + (s - v[j - 1].first) * (dy / dx);
822}
823
824void EvtbTosllNPR::CalcAmp(EvtParticle* parent, EvtAmp& amp)
825{
826 EvtId dId = parent->getDaug(0)->getId();
827 if (dId == IdKst0 || dId == IdaKst0 || dId == IdKstp || dId == IdKstm) {
828 CalcVAmp(parent, amp);
829 }
830 if (dId == IdK0 || dId == IdaK0 || dId == IdKp || dId == IdKm) {
831 CalcSAmp(parent, amp);
832 }
833}
834
835static inline double poly(double x, int n, const double* c)
836{
837 double t = c[--n];
838 while (n--) t = c[n] + x * t;
839 return t;
840}
841
842static void getVectorFF(double q2, double mB, double mV, double& a1, double& a2, double& a0, double& v, double& t1, double& t2,
843 double& t3)
844{
845 static const double alfa[7][4] = {
846 // coefficients are from https://arxiv.org/src/1503.05534v3/anc/BKstar_LCSR-Lattice.json
847 // m_res, c0, c1, c2
848 { 5.415000, 0.376313, -1.165970, 2.424430 }, // V
849 { 5.366000, 0.369196, -1.365840, 0.128191 }, // A0
850 { 5.829000, 0.297250, 0.392378, 1.189160 }, // A1
851 { 5.829000, 0.265375, 0.533638, 0.483166 }, // A12
852 { 5.415000, 0.312055, -1.008930, 1.527200 }, // T1
853 { 5.829000, 0.312055, 0.496846, 1.614310 }, // T2
854 { 5.829000, 0.667412, 1.318120, 3.823340 } // T12
855 };
856
857 double mBaV = mB + mV, mBsV = mB - mV;
858 double tp = mBaV * mBaV; // t_{+} = (m_B + m_V)^2
859 double s0 = sqrt(2 * mBaV * sqrt(mB * mV)); // sqrt(t_{+} - t_{+}*(1 - sqrt(1 - t_{-}/t_{+})))
860 double z0 = (mBaV - s0) / (mBaV + s0); // (sqrt(t_{+}) - s0)/(sqrt(t_{+}) + s0)
861
862 double s = sqrt(tp - q2), z = (s - s0) / (s + s0), dz = z - z0, ff[7];
863 for (int j = 0; j < 7; j++) {
864 double mR = alfa[j][0], mR2 = mR * mR;
865 ff[j] = (mR2 / (mR2 - q2)) * poly(dz, 3, alfa[j] + 1);
866 }
867
868 // Källén-function
869 // arXiv:1503.05534 Eq. D.3
870 double lambda = (mBaV * mBaV - q2) * (mBsV * mBsV - q2);
871
872 v = ff[0];
873 a0 = ff[1];
874 a1 = ff[2];
875 // Eq. D.5 arXiv:1503.05534
876 // A12 = (mBaV*mBaV*(mBaV*mBsV - q2)*A1 - lambda(q2)*A2)/(16*mB*mV*mV*mBaV);
877 double a12 = ff[3];
878 a2 = mBaV * ((mBaV * (mBaV * mBsV - q2)) * a1 - (16 * mB * mV * mV) * a12) / lambda;
879 t1 = ff[4];
880 t2 = ff[5];
881 // Eq. D.5 arXiv:1503.05534
882 // T23 = mBaV*mBsV*(mB*mB + 3*mV*mV - q2)*T2 - lambda(q2)*T3)/(8*mB*mV*mV*mBsV);
883 double t23 = ff[6];
884 t3 = mBsV * (mBaV * (mB * mB + 3 * mV * mV - q2) * t2 - (8 * mB * mV * mV) * t23) / lambda;
885}
886
887static EvtTensor4C asymProd(const EvtVector4R& a, const EvtVector4R& b)
888{
889 // t_{ij} = eps_{ijkl} a^{k} b^{l}
890 // eps_{ijkl} is the Levi-Civita symbol -- antisymmetric tensor
891
892 EvtTensor4C res;
893 double t01 = a.get(2) * b.get(3) - a.get(3) * b.get(2);
894 res.set(0, 1, t01);
895 res.set(1, 0, -t01);
896 double t02 = a.get(3) * b.get(1) - a.get(1) * b.get(3);
897 res.set(0, 2, t02);
898 res.set(2, 0, -t02);
899 double t03 = a.get(1) * b.get(2) - a.get(2) * b.get(1);
900 res.set(0, 3, t03);
901 res.set(3, 0, -t03);
902 double t12 = a.get(0) * b.get(3) - a.get(3) * b.get(0);
903 res.set(1, 2, t12);
904 res.set(2, 1, -t12);
905 double t13 = a.get(2) * b.get(0) - a.get(0) * b.get(2);
906 res.set(1, 3, t13);
907 res.set(3, 1, -t13);
908 double t23 = a.get(0) * b.get(1) - a.get(1) * b.get(0);
909 res.set(2, 3, t23);
910 res.set(3, 2, -t23);
911 return res;
912}
913
914
915/*
916 * add scaled tensor
917 */
918static void addScaled(EvtTensor4C& out, EvtComplex scale, const EvtTensor4C& in)
919{
920 for (int i = 0; i < 4; i++)
921 for (int j = 0; j < 4; j++) {
922 out.set(i, j, out.get(i, j) + scale * in.get(i, j));
923 }
924}
925
926/*
927 * conj(c1)*c2 product
928 */
929static EvtComplex cprod(const EvtComplex& c1, const EvtComplex& c2)
930{
931 return EvtComplex(real(c1) * real(c2) + imag(c1) * imag(c2),
932 real(c1) * imag(c2) - imag(c1) * real(c2));
933}
934
935/*
936 * return v = \bar{x} * gamma_mu * y and a = \bar{x} * gamma_mu * gamma_5 * y currents
937 */
938static void EvtLeptonVandACurrents(EvtVector4C& v, EvtVector4C& a, const EvtDiracSpinor& x, const EvtDiracSpinor& y)
939{
940 EvtComplex w0 = cprod(x.get_spinor(0), y.get_spinor(0)), w1 = cprod(x.get_spinor(1), y.get_spinor(1)), w2 = cprod(x.get_spinor(2),
941 y.get_spinor(2)), w3 = cprod(x.get_spinor(3), y.get_spinor(3));
942 EvtComplex w02 = w0 + w2, w13 = w1 + w3;
943 EvtComplex W1 = w02 + w13, W2 = w02 - w13;
944 EvtComplex q0 = cprod(x.get_spinor(0), y.get_spinor(2)), q1 = cprod(x.get_spinor(1), y.get_spinor(3)), q2 = cprod(x.get_spinor(2),
945 y.get_spinor(0)), q3 = cprod(x.get_spinor(3), y.get_spinor(1));
946 EvtComplex q02 = q0 + q2, q13 = q1 + q3;
947 EvtComplex Q1 = q02 + q13, Q2 = q02 - q13;
948 EvtComplex e0 = cprod(x.get_spinor(0), y.get_spinor(3)), e1 = cprod(x.get_spinor(1), y.get_spinor(2)), e2 = cprod(x.get_spinor(2),
949 y.get_spinor(1)), e3 = cprod(x.get_spinor(3), y.get_spinor(0));
950 EvtComplex e20 = e0 + e2, e13 = e1 + e3;
951 EvtComplex E1 = e13 + e20, E2 = e13 - e20;
952 v.set(W1, E1, EvtComplex(-imag(E2), real(E2)), Q2);
953 EvtComplex t0 = cprod(x.get_spinor(0), y.get_spinor(1)), t1 = cprod(x.get_spinor(1), y.get_spinor(0)), t2 = cprod(x.get_spinor(2),
954 y.get_spinor(3)), t3 = cprod(x.get_spinor(3), y.get_spinor(2));
955 EvtComplex t20 = t0 + t2, t13 = t1 + t3;
956 EvtComplex T1 = t13 + t20, T2 = t13 - t20;
957 a.set(Q1, T1, EvtComplex(-imag(T2), real(T2)), W2);
958}
959
960void EvtbTosllNPR::CalcVAmp(EvtParticle* parent, EvtAmp& amp)
961{
962 // Add the lepton and neutrino 4 momenta to find q2
963 EvtId pId = parent->getId();
964
965 EvtVector4R q = parent->getDaug(1)->getP4() + parent->getDaug(2)->getP4();
966 double q2 = q.mass2();
967 double mesonmass = parent->getDaug(0)->mass();
968 double parentmass = parent->mass();
969
970 double a1, a2, a0, v, t1, t2, t3; // form factors
971 getVectorFF(q2, parentmass, mesonmass, a1, a2, a0, v, t1, t2, t3);
972
973 const EvtVector4R& p4meson = parent->getDaug(0)->getP4();
974 double pmass = parent->mass(), ipmass = 1 / pmass;
975 const EvtVector4R p4b(pmass, 0.0, 0.0, 0.0);
976 EvtVector4R pbhat = p4b * ipmass;
977 EvtVector4R qhat = q * ipmass;
978 EvtVector4R pkstarhat = p4meson * ipmass;
979 EvtVector4R phat = pbhat + pkstarhat;
980
981 EvtComplex c7 = -0.304;
982 EvtComplex c9 = C9(q2, interpol(m_reso, q2));
983 EvtComplex c10 = -4.103;
984 c7 += m_dc7;
985 c9 += m_dc9;
986 c10 += m_dc10;
987
988 EvtComplex I(0.0, 1.0);
989
990 double mb = 4.8 /*GeV/c^2*/ * ipmass, ms = 0.093 /*GeV/c^2*/ * ipmass;
991 double mH = mesonmass * ipmass, oamH = 1 + mH, osmH = 1 - mH,
992 osmH2 = oamH * osmH, iosmH2 = 1 / osmH2; // mhatkstar
993 double is = pmass * pmass / q2; // 1/shat
994 a1 *= oamH;
995 a2 *= osmH;
996 a0 *= 2 * mH;
997 double cs0 = (a1 - a2 - a0) * is;
998 a2 *= iosmH2;
999 v *= 2 / oamH;
1000
1001 EvtComplex a = (c9 + m_c9p) * v + (c7 + m_c7p) * (4 * mb * is * t1);
1002 EvtComplex b = (c9 - m_c9p) * a1 +
1003 (c7 - m_c7p) * (2 * mb * is * osmH2 * t2);
1004 EvtComplex c = (c9 - m_c9p) * a2 +
1005 (c7 - m_c7p) * (2 * mb * (t3 * iosmH2 + t2 * is));
1006 EvtComplex d = (c9 - m_c9p) * cs0 - (c7 - m_c7p) * (2 * mb * is * t3);
1007 EvtComplex e = (c10 + m_c10p) * v;
1008 EvtComplex f = (c10 - m_c10p) * a1;
1009 EvtComplex g = (c10 - m_c10p) * a2;
1010 EvtComplex h = (c10 - m_c10p) * cs0;
1011 double sscale = a0 / (mb + ms);
1012 EvtComplex hs = m_cS * sscale, hp = m_cP * sscale;
1013
1014 int charge1 = EvtPDL::chg3(parent->getDaug(1)->getId());
1015
1016 EvtParticle* lepPos = parent->getDaug(2 - (charge1 > 0));
1017 EvtParticle* lepNeg = parent->getDaug(1 + (charge1 > 0));
1018
1019 EvtDiracSpinor lp0(lepPos->spParent(0)), lp1(lepPos->spParent(1));
1020 EvtDiracSpinor lm0(lepNeg->spParent(0)), lm1(lepNeg->spParent(1));
1021
1022 EvtVector4C l11, l12, l21, l22, a11, a12, a21, a22;
1023 EvtComplex s11, s12, s21, s22, p11, p12, p21, p22;
1024 EvtTensor4C tt0 = asymProd(pbhat, pkstarhat);
1025
1026 EvtTensor4C T1(tt0), T2(tt0);
1027 const EvtTensor4C& gmn = EvtTensor4C::g();
1028 EvtTensor4C tt1(EvtGenFunctions::directProd(pbhat, phat));
1029 EvtTensor4C tt2(EvtGenFunctions::directProd(pbhat, qhat));
1030
1031 b *= I;
1032 c *= I;
1033 d *= I;
1034 f *= I;
1035 g *= I;
1036 h *= I;
1037 if (pId == IdBm || pId == IdaB0 || pId == IdaBs) {
1038 T1 *= a;
1039 addScaled(T1, -b, gmn);
1040 addScaled(T1, c, tt1);
1041 addScaled(T1, d, tt2);
1042 T2 *= e;
1043 addScaled(T2, -f, gmn);
1044 addScaled(T2, g, tt1);
1045 addScaled(T2, h, tt2);
1046
1047 EvtLeptonVandACurrents(l11, a11, lp0, lm0);
1048 EvtLeptonVandACurrents(l21, a21, lp1, lm0);
1049 EvtLeptonVandACurrents(l12, a12, lp0, lm1);
1050 EvtLeptonVandACurrents(l22, a22, lp1, lm1);
1051
1052 s11 = EvtLeptonSCurrent(lp0, lm0);
1053 p11 = EvtLeptonPCurrent(lp0, lm0);
1054 s21 = EvtLeptonSCurrent(lp1, lm0);
1055 p21 = EvtLeptonPCurrent(lp1, lm0);
1056 s12 = EvtLeptonSCurrent(lp0, lm1);
1057 p12 = EvtLeptonPCurrent(lp0, lm1);
1058 s22 = EvtLeptonSCurrent(lp1, lm1);
1059 p22 = EvtLeptonPCurrent(lp1, lm1);
1060 } else if (pId == IdBp || pId == IdB0 || pId == IdBs) {
1061 T1 *= -a;
1062 addScaled(T1, -b, gmn);
1063 addScaled(T1, c, tt1);
1064 addScaled(T1, d, tt2);
1065 T2 *= -e;
1066 addScaled(T2, -f, gmn);
1067 addScaled(T2, g, tt1);
1068 addScaled(T2, h, tt2);
1069
1070 EvtLeptonVandACurrents(l11, a11, lp1, lm1);
1071 EvtLeptonVandACurrents(l21, a21, lp0, lm1);
1072 EvtLeptonVandACurrents(l12, a12, lp1, lm0);
1073 EvtLeptonVandACurrents(l22, a22, lp0, lm0);
1074
1075 s11 = EvtLeptonSCurrent(lp1, lm1);
1076 p11 = EvtLeptonPCurrent(lp1, lm1);
1077 s21 = EvtLeptonSCurrent(lp0, lm1);
1078 p21 = EvtLeptonPCurrent(lp0, lm1);
1079 s12 = EvtLeptonSCurrent(lp1, lm0);
1080 p12 = EvtLeptonPCurrent(lp1, lm0);
1081 s22 = EvtLeptonSCurrent(lp0, lm0);
1082 p22 = EvtLeptonPCurrent(lp0, lm0);
1083 } else {
1084 EvtGenReport(EVTGEN_ERROR, "EvtGen") << "Wrong lepton number\n";
1085 T1.zero();
1086 T2.zero(); // Set all tensor terms to zero.
1087 }
1088 for (int i = 0; i < 3; i++) {
1089 EvtVector4C eps = parent->getDaug(0)->epsParent(i).conj();
1090
1091 EvtVector4C E1 = T1.cont1(eps);
1092 EvtVector4C E2 = T2.cont1(eps);
1093
1094 EvtComplex epsq = I * (eps * q), epsqs = epsq * hs, epsqp = epsq * hp;
1095
1096 amp.vertex(i, 0, 0, l11 * E1 + a11 * E2 - s11 * epsqs - p11 * epsqp);
1097 amp.vertex(i, 0, 1, l12 * E1 + a12 * E2 - s12 * epsqs - p12 * epsqp);
1098 amp.vertex(i, 1, 0, l21 * E1 + a21 * E2 - s21 * epsqs - p21 * epsqp);
1099 amp.vertex(i, 1, 1, l22 * E1 + a22 * E2 - s22 * epsqs - p22 * epsqp);
1100 }
1101}
1102
1103void getScalarFF(double q2, double& fp, double& f0, double& fT)
1104{
1105 // The form factors are taken from:
1106 // B -> K and D -> K form factors from fully relativistic lattice QCD
1107 // W. G. Parrott, C. Bouchard, C. T. H. Davies
1108 // https://arxiv.org/abs/2207.12468
1109 static const double MK = 0.495644, MB = 5.279495108051249,
1110 MBs0 = 5.729495108051249, MBsstar = 5.415766151925566,
1111 logsB = 1.3036556717286227;
1112 static const int N = 3;
1113 static const double a0B[] = { 0.2546162729845652, 0.211016713841977,
1114 0.02690776720598433, 0.2546162729845652,
1115 -0.7084710010870424, 0.3096901516968882,
1116 0.2549078414069112, -0.6549384905373116,
1117 0.36265904141973127
1118 },
1119 *apB = a0B + N, *aTB = apB + N;
1120
1121 double pole0 = 1 / (1 - q2 / (MBs0 * MBs0));
1122 double polep = 1 / (1 - q2 / (MBsstar * MBsstar));
1123 double B = MB + MK, A = sqrt(B * B - q2), z = (A - B) / (A + B),
1124 zN = z * z * z / N, zn = z;
1125 f0 = a0B[0];
1126 fp = apB[0];
1127 fT = aTB[0];
1128 for (int i = 1; i < N; i++) {
1129 f0 += a0B[i] * zn;
1130 fp += apB[i] * zn;
1131 fT += aTB[i] * zn;
1132 double izN = i * zN;
1133 if ((i - N) & 1) {
1134 fp += apB[i] * izN;
1135 fT += aTB[i] * izN;
1136 } else {
1137 fp -= apB[i] * izN;
1138 fT -= aTB[i] * izN;
1139 }
1140 zn *= z;
1141 }
1142 f0 *= pole0 * logsB;
1143 fp *= polep * logsB;
1144 fT *= polep * logsB;
1145}
1146
1147void EvtbTosllNPR::CalcSAmp(EvtParticle* parent, EvtAmp& amp)
1148{
1149 // Add the lepton and neutrino 4 momenta to find q2
1150 EvtId pId = parent->getId();
1151
1152 EvtVector4R q = parent->getDaug(1)->getP4() + parent->getDaug(2)->getP4();
1153 double q2 = q.mass2();
1154 double dmass = parent->getDaug(0)->mass();
1155
1156 double fp, f0, ft; // form factors
1157 getScalarFF(q2, fp, f0, ft);
1158 const EvtVector4R& k = parent->getDaug(0)->getP4();
1159 double pmass = parent->mass();
1160 const EvtVector4R p(pmass, 0.0, 0.0, 0.0);
1161 EvtVector4R pk = p + k;
1162
1163 EvtComplex c7 = -0.304;
1164 EvtComplex c9 = C9(q2, interpol(m_reso, q2));
1165 EvtComplex c10 = -4.103;
1166 c7 += m_dc7;
1167 c9 += m_dc9;
1168 c10 += m_dc10;
1169
1170 double mb = 4.8 /*GeV/c^2*/, ms = 0.093 /*GeV/c^2*/;
1171
1172 int charge1 = EvtPDL::chg3(parent->getDaug(1)->getId());
1173
1174 EvtParticle* lepPos = (charge1 > 0) ? parent->getDaug(1)
1175 : parent->getDaug(2);
1176 EvtParticle* lepNeg = (charge1 < 0) ? parent->getDaug(1)
1177 : parent->getDaug(2);
1178
1179 EvtDiracSpinor lp0(lepPos->spParent(0)), lp1(lepPos->spParent(1));
1180 EvtDiracSpinor lm0(lepNeg->spParent(0)), lm1(lepNeg->spParent(1));
1181
1182 EvtVector4C l11, l12, l21, l22, a11, a12, a21, a22;
1183 EvtComplex s11, s12, s21, s22, p11, p12, p21, p22;
1184
1185 if (pId == IdBm || pId == IdaB0 || pId == IdaBs) {
1186 EvtLeptonVandACurrents(l11, a11, lp0, lm0);
1187 EvtLeptonVandACurrents(l21, a21, lp1, lm0);
1188 EvtLeptonVandACurrents(l12, a12, lp0, lm1);
1189 EvtLeptonVandACurrents(l22, a22, lp1, lm1);
1190
1191 s11 = EvtLeptonSCurrent(lp0, lm0);
1192 p11 = EvtLeptonPCurrent(lp0, lm0);
1193 s21 = EvtLeptonSCurrent(lp1, lm0);
1194 p21 = EvtLeptonPCurrent(lp1, lm0);
1195 s12 = EvtLeptonSCurrent(lp0, lm1);
1196 p12 = EvtLeptonPCurrent(lp0, lm1);
1197 s22 = EvtLeptonSCurrent(lp1, lm1);
1198 p22 = EvtLeptonPCurrent(lp1, lm1);
1199 } else if (pId == IdBp || pId == IdB0 || pId == IdBs) {
1200 EvtLeptonVandACurrents(l11, a11, lp1, lm1);
1201 EvtLeptonVandACurrents(l21, a21, lp0, lm1);
1202 EvtLeptonVandACurrents(l12, a12, lp1, lm0);
1203 EvtLeptonVandACurrents(l22, a22, lp0, lm0);
1204
1205 s11 = EvtLeptonSCurrent(lp1, lm1);
1206 p11 = EvtLeptonPCurrent(lp1, lm1);
1207 s21 = EvtLeptonSCurrent(lp0, lm1);
1208 p21 = EvtLeptonPCurrent(lp0, lm1);
1209 s12 = EvtLeptonSCurrent(lp1, lm0);
1210 p12 = EvtLeptonPCurrent(lp1, lm0);
1211 s22 = EvtLeptonSCurrent(lp0, lm0);
1212 p22 = EvtLeptonPCurrent(lp0, lm0);
1213 } else {
1214 EvtGenReport(EVTGEN_ERROR, "EvtGen") << "Wrong lepton number\n";
1215 }
1216 double dm2 = pmass * pmass - dmass * dmass, t0 = dm2 / q2,
1217 t1 = 2 * mb * ft / (pmass + dmass);
1218 c7 += m_c7p;
1219 c9 += m_c9p;
1220 c10 += m_c10p;
1221 EvtVector4C E1 = (c9 * fp + c7 * t1) * pk +
1222 (t0 * (c9 * (f0 - fp) - c7 * t1)) * q;
1223 EvtVector4C E2 = (c10 * fp) * pk + (t0 * (f0 - fp)) * q;
1224 double s = dm2 / (mb - ms) * f0;
1225 amp.vertex(0, 0, l11 * E1 + a11 * E2 + (m_cS * s11 + m_cP * p11) * s);
1226 amp.vertex(0, 1, l12 * E1 + a12 * E2 + (m_cS * s12 + m_cP * p12) * s);
1227 amp.vertex(1, 0, l21 * E1 + a21 * E2 + (m_cS * s21 + m_cP * p21) * s);
1228 amp.vertex(1, 1, l22 * E1 + a22 * E2 + (m_cS * s22 + m_cP * p22) * s);
1229}
double R
typedef autogenerated by FFTW
static EvtGenDatabasePDG * Instance()
Instance method that loads the EvtGen table.
Description: Implementation of the B->K(*)l^+l^- decays with New Physics contributions and c\bar{c}...
std::vector< BW_t * > m_rs
vector with c\bar{c} resonance lineshapes
void CalcSAmp(EvtParticle *, EvtAmp &)
The method to evaluate the scalar kaon decay amplitude.
EvtDecayBase * clone() override
The function which makes a copy of the model.
void decay(EvtParticle *p) override
The method to calculate a decay amplitude.
EvtLinSample * m_ls
piece-wise interpolation of maximum of the matrix element depend on q^2
EvtComplex m_dc10
delta C_10eff – addition to NNLO SM value
hvec_t m_reso
tabulated resonance contribution
std::string getName() override
The function which returns the name of the model.
void CalcAmp(EvtParticle *, EvtAmp &)
The method to evaluate the decay amplitude.
EvtComplex m_cS
(C_S - C'_S) – scalar right and left polarizations
void CalcVAmp(EvtParticle *, EvtAmp &)
The method to evaluate the vector kaon decay amplitude.
EvtComplex m_cP
(C_P - C'_P) – pseudo-scalar right and left polarizations
virtual ~EvtbTosllNPR()
The destructor to clean up objects created during the initialization.
EvtComplex m_c9p
C'_9eff – right hand polarizations.
EvtComplex m_dc7
delta C_7eff – addition to NNLO SM value
void init() override
Initialization method.
int m_flag
flag is set nonzero to include resonances
EvtComplex m_dc9
delta C_9eff – addition to NNLO SM value
EvtComplex m_c7p
C'_7eff – right hand polarizations.
EvtComplex m_c10p
c'_10eff – right hand polarizations
void initProbMax() override
The method to evaluate the maximum amplitude.
#define B2_EVTGEN_REGISTER_MODEL(classname)
Class to register B2_EVTGEN_REGISTER_MODEL.
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
Description: The class to treat resonances, their lineshapes, and dispersion relation integral.
BW_t(double m, double gtot, double ghad, double bll, double alpha=1/137.035999084)
m is the mass of a resonance gtot is the total width of a resonance ghad is the hadronic width of a r...
double A
resonance total amplitude
void addknots(std::vector< double > &en) const
Based on the resonance parameters place knots for linear piece-wise approximation with enough precisi...
double Mv2
resonance mass squared
double R(double s) const
resonance shape
double Rp(double s) const
the first derivative of a resonance shape
double DRIntegral(double s, double sp) const
Dispersion relation indefinite integral: s is the parmeter, sp is the integration variable.
double Rpp(double s) const
the second derivative of a resonance shape
double Gv2
resonance width squared
Description: The simple helper class to generate arbitrary distribution based on a linear piece-wise ...
std::pair< double, double > operator()(double) const
The operator to return <x,weight> depend on argument in [0,1] range which represent fraction of the t...
EvtLinSample()
The default constructor.
void init(const std::vector< EvtPointf > &_v)
The method to initialize data.
std::vector< double > m_I
cumulative integral data
EvtLinSample(const std::vector< EvtPointf > &_v)
The primary constructor with an actual shape to generate.
std::vector< EvtPointf > m_v
shape data
Description: struct for 2-dimensional point in the float format instead of double to save memory.
float y
y coordinate
float x
x coordinate