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
EvtPsi2JpsiPiPi.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
28
29#include <cmath>
30
32 m_tree( false ),
33 m_phi( 0.0 ),
34 m_cosPhi( 1.0 ),
35 m_cos2Phi( 1.0 ),
36 m_sinPhi( 0.0 ),
37 m_sin2Phi( 0.0 )
38{
39 this->setNLOArrays();
40}
41
43{
44 // Parameters for NLO corrections obtained by fitting distributions
45 // shown in Fig 2 of the article
46 m_c0[0] = 1.21214;
47 m_c0[1] = -2.517;
48 m_c0[2] = 4.66947;
49 m_c0[3] = 15.0853;
50 m_c0[4] = -49.7381;
51 m_c0[5] = 35.5604;
52
53 m_c1[0] = -6.74237;
54 m_c1[1] = 84.2391;
55 m_c1[2] = -389.74;
56 m_c1[3] = 823.902;
57 m_c1[4] = -808.538;
58 m_c1[5] = 299.1;
59
60 m_c2[0] = -1.25073;
61 m_c2[1] = 16.2666;
62 m_c2[2] = -74.6453;
63 m_c2[3] = 156.789;
64 m_c2[4] = -154.185;
65 m_c2[5] = 57.5711;
66
67 m_s1[0] = -8.01579;
68 m_s1[1] = 93.9513;
69 m_s1[2] = -451.713;
70 m_s1[3] = 1049.67;
71 m_s1[4] = -1162.9;
72 m_s1[5] = 492.364;
73
74 m_s2[0] = 3.04459;
75 m_s2[1] = -26.0901;
76 m_s2[2] = 81.1557;
77 m_s2[3] = -112.875;
78 m_s2[4] = 66.0432;
79 m_s2[5] = -10.0446;
80}
81
82std::string EvtPsi2JpsiPiPi::getName() const
83{
84 return "PSI2JPSIPIPI";
85}
86
88{
89 return new EvtPsi2JpsiPiPi;
90}
91
93{
94 // Should be OK for all m_phi values
95 setProbMax( 1.1 );
96}
97
99{
100 checkNArg( 0, 1 );
101
102 if ( getNArg() == 0 ) {
103 m_tree = true;
104 m_phi = 0.0;
105
106 } else {
107 m_tree = false;
108 m_phi = getArg( 0 ); // LO vs NLO mixing angle in radians
109 }
110
111 double twoPhi = 2.0 * m_phi;
112 m_cosPhi = cos( m_phi );
113 m_cos2Phi = cos( twoPhi );
114 m_sinPhi = sin( m_phi );
115 m_sin2Phi = sin( twoPhi );
116}
117
119{
121
122 EvtVector4R p4 =
123 root->getDaug( 0 )->getP4(); // J-psi momentum in psi2 rest frame
124 EvtVector4R k1 = root->getDaug( 1 )->getP4(); // pi+ momentum in psi2 rest frame
125 double mPiSq = k1.mass2(); // squared pion mass
126 EvtVector4R k2 = root->getDaug( 2 )->getP4(); // pi- momentum in psi2 rest frame
127 EvtVector4R tq = k1 - k2;
128 EvtVector4R p3 = k1 + k2;
129 double p3Sq = p3.mass2();
130 double mpipi = p3.mass();
131 double corr( 1.0 );
132
133 if ( !m_tree ) {
134 // Calculate NLO corrections
135 corr = 0.0;
136 for ( int iq = 0; iq < m_nQ; ++iq ) {
137 corr += ( m_c0[iq] + m_c1[iq] * m_cosPhi + m_c2[iq] * m_cos2Phi +
138 m_s1[iq] * m_sinPhi + m_s2[iq] * m_sin2Phi ) *
139 std::pow( mpipi, iq );
140 }
141 }
142
143 double mSqTerm = 2.0 * mPiSq / p3Sq;
144 EvtTensor4C p3Prod = EvtGenFunctions::directProd( p3, p3 );
145
146 // Eq 14 from the article
148 ( ( 1.0 - 2.0 * mSqTerm ) / 3.0 ) *
149 ( p3Sq * EvtTensor4C::g() - p3Prod );
150
151 EvtTensor4C T = ( 2.0 / 3.0 ) * ( 1.0 + mSqTerm ) * p3Prod - L;
152
153 for ( int iPsi2 = 0; iPsi2 < 5; ++iPsi2 ) {
154 EvtTensor4C epsX = root->epsTensor(
155 iPsi2 ); // psi2 polarization tensor in psi2 rest frame
156 EvtTensor4C epsXT = cont22( epsX, T );
157
158 for ( int iPsi = 0; iPsi < 3; ++iPsi ) {
159 EvtVector4C epsPsi = root->getDaug( 0 )->epsParent(
160 iPsi ); // Jpsi polarization vector in psi2 rest frame
161 EvtTensor4C epeps = dual( EvtGenFunctions::directProd( epsPsi, p4 ) );
162 EvtTensor4C ttt = cont22( epeps, epsXT );
163
164 // Eq 13 from the article
165 EvtComplex amp = ttt.trace();
166
167 // NLO corrections
168 amp *= corr;
169
170 // Set vertex amplitude component
171 vertex( iPsi2, iPsi, amp );
172 }
173 }
174}
EvtTensor3C cont22(const EvtTensor3C &t1, const EvtTensor3C &t2)
EvtTensor4C dual(const EvtTensor4C &t2)
void vertex(const EvtComplex &amp)
EvtDecayBase()=default
int getNDaug() const
int getNArg() const
double getArg(unsigned int j)
void setProbMax(double prbmx)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
virtual EvtVector4C epsParent(int i) const
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
virtual EvtTensor4C epsTensor(int i) const
std::array< double, m_nQ > m_c2
std::array< double, m_nQ > m_s2
void initProbMax() override
std::array< double, m_nQ > m_c1
static const int m_nQ
EvtDecayBase * clone() const override
std::array< double, m_nQ > m_s1
std::string getName() const override
void init() override
void decay(EvtParticle *p) override
std::array< double, m_nQ > m_c0
EvtComplex trace() const
static const EvtTensor4C & g()
double mass() const
double mass2() const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)