11 #include "EvtGenBase/EvtParticle.hh"
12 #include "EvtGenBase/EvtPDL.hh"
13 #include "EvtGenBase/EvtId.hh"
14 #include "EvtGenBase/EvtAmp.hh"
16 #include "framework/logging/Logger.h"
17 #include "generators/evtgen/models/EvtBSemiTauonicVectorMesonAmplitude.h"
18 #include "generators/evtgen/models/EvtBSemiTauonicHelicityAmplitudeCalculator.h"
28 EvtBSemiTauonicHelicityAmplitudeCalculator* CalcHelAmp)
30 static EvtId EM = EvtPDL::getId(
"e-");
31 static EvtId MUM = EvtPDL::getId(
"mu-");
32 static EvtId TAUM = EvtPDL::getId(
"tau-");
39 EvtVector4R p4d = p->getDaug(0)->getP4();
40 EvtVector4R p4l = p->getDaug(1)->getP4();
41 EvtVector4R p4n = p->getDaug(2)->getP4();
42 EvtVector4R p4ln(p4l + p4n);
44 EvtVector4R p4dln = boostTo(p4d, p4ln,
true);
45 EvtVector4R p4lln = boostTo(p4l, p4ln,
true);
47 const double gmB = p->getP4().mass();
48 const double gmd = p4d.mass();
49 const double gr = gmd / gmB;
51 const double q2 = (p4l + p4n).mass2();
52 const double w = (1. + gr * gr - q2 / gmB / gmB) / 2. / gr;
54 const double costau = p4dln.dot(p4lln) / p4dln.d3mag() / p4lln.d3mag();
55 const double ml = p4l.mass();
58 const double orig_mD = CalcHelAmp->getMDst();
59 CalcHelAmp->setMDst(gmd);
62 EvtComplex helamp[3][2];
63 helamp[0][0] = CalcHelAmp->helAmp(ml, 1, 1, w, costau);
64 helamp[0][1] = CalcHelAmp->helAmp(ml, -1, 1, w, costau);
65 helamp[1][0] = CalcHelAmp->helAmp(ml, 1, 0, w, costau);
66 helamp[1][1] = CalcHelAmp->helAmp(ml, -1, 0, w, costau);
67 helamp[2][0] = CalcHelAmp->helAmp(ml, 1, -1, w, costau);
68 helamp[2][1] = CalcHelAmp->helAmp(ml, -1, -1, w, costau);
86 EvtComplex l_SpFromHel[2][2];
87 EvtId l_num = p->getDaug(1)->getId();
89 l_SpFromHel[0][0] = conj(l_HelFromSp.get(0, 0));
90 l_SpFromHel[0][1] = conj(l_HelFromSp.get(1, 0));
91 l_SpFromHel[1][0] = conj(l_HelFromSp.get(0, 1));
92 l_SpFromHel[1][1] = conj(l_HelFromSp.get(1, 1));
101 const double D_theta = acos(p4d.get(3) / p4d.d3mag());
102 const double D_phi = atan2(p4d.get(2), p4d.get(1));
103 EvtSpinDensity D_HelFromSp = p->getDaug(0)->rotateToHelicityBasis(D_phi, D_theta, -D_phi);
105 EvtComplex D_SpFromHel[3][3];
106 D_SpFromHel[0][0] = conj(D_HelFromSp.get(0, 0));
107 D_SpFromHel[0][1] = conj(D_HelFromSp.get(1, 0));
108 D_SpFromHel[0][2] = conj(D_HelFromSp.get(2, 0));
109 D_SpFromHel[1][0] = conj(D_HelFromSp.get(0, 1));
110 D_SpFromHel[1][1] = conj(D_HelFromSp.get(1, 1));
111 D_SpFromHel[1][2] = conj(D_HelFromSp.get(2, 1));
112 D_SpFromHel[2][0] = conj(D_HelFromSp.get(0, 2));
113 D_SpFromHel[2][1] = conj(D_HelFromSp.get(1, 2));
114 D_SpFromHel[2][2] = conj(D_HelFromSp.get(2, 2));
117 EvtComplex spinamp[3][2];
119 for (
int dsp = 0; dsp < 3; dsp++) {
120 for (
int lsp = 0; lsp < 2; lsp++) {
121 for (
int dhel = 0; dhel < 3; dhel++) {
122 for (
int lhel = 0; lhel < 2; lhel++) {
124 if (l_num == EM || l_num == MUM || l_num == TAUM) {
125 spinamp[dsp][lsp] += l_SpFromHel[lsp][lhel] * D_SpFromHel[dsp][dhel] * helamp[dhel][lhel];
129 spinamp[dsp][lsp] += l_SpFromHel[lsp][lhel] * D_SpFromHel[dsp][dhel] * (lhel == 0 ? +1 : -1) * (dhel == 1 ? +1 : -1)
130 * conj(helamp[2 - dhel][1 - lhel]);
137 amp.vertex(0, 0, spinamp[0][0]);
138 amp.vertex(0, 1, spinamp[0][1]);
139 amp.vertex(1, 0, spinamp[1][0]);
140 amp.vertex(1, 1, spinamp[1][1]);
141 amp.vertex(2, 0, spinamp[2][0]);
142 amp.vertex(2, 1, spinamp[2][1]);
145 CalcHelAmp->setMDst(orig_mD);
148 double helprob = abs2(helamp[0][0]) + abs2(helamp[0][1]) + abs2(helamp[1][0]) + abs2(helamp[1][1]) + abs2(helamp[2][0])
149 + abs2(helamp[2][1]);
150 double spinprob = abs2(spinamp[0][0]) + abs2(spinamp[0][1]) + abs2(spinamp[1][0]) + abs2(spinamp[1][1])
151 + abs2(spinamp[2][0]) + abs2(spinamp[2][1]);
152 if (fabs(helprob - spinprob) / helprob > 1E-6 || !finite(helprob) || !finite(spinprob)) {
153 B2ERROR(
"EvtBSemiTauonicVectorMesonAmplitude total helicity prob does not match with total spin prob, or nan.");
154 B2ERROR(
"helprob: " << helprob <<
" spinprob: " << spinprob);
155 B2ERROR(
"w: " << w <<
" costau: " << costau <<
" hel probs: "
156 << abs2(helamp[0][0]) <<
"\t" << abs2(helamp[0][1]) <<
"\t"
157 << abs2(helamp[1][0]) <<
"\t" << abs2(helamp[1][1]) <<
"\t"
158 << abs2(helamp[2][0]) <<
"\t" << abs2(helamp[2][1]) <<
"\t"
159 << abs2(helamp[0][0]) + abs2(helamp[0][1]) + abs2(helamp[1][0]) + abs2(helamp[1][1]) + abs2(helamp[2][0]) + abs2(helamp[2][1])
162 B2ERROR(
"w: " << w <<
" costau: " << costau <<
" spin probs: "
163 << abs2(spinamp[0][0]) <<
"\t" << abs2(spinamp[0][1]) <<
"\t"
164 << abs2(spinamp[1][0]) <<
"\t" << abs2(spinamp[1][1]) <<
"\t"
165 << abs2(spinamp[2][0]) <<
"\t" << abs2(spinamp[2][1]) <<
"\t"
166 << abs2(spinamp[0][0]) + abs2(spinamp[0][1]) + abs2(spinamp[1][0]) + abs2(spinamp[1][1]) + abs2(spinamp[2][0]) + abs2(spinamp[2][1])