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.
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 
23 #include "EvtGenBase/EvtComplex.hh"
28 
29 #include <cmath>
30 
32  tree( false ),
33  phi( 0.0 ),
34  cosPhi( 1.0 ),
35  cos2Phi( 1.0 ),
36  sinPhi( 0.0 ),
37  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  c0[0] = 1.21214;
47  c0[1] = -2.517;
48  c0[2] = 4.66947;
49  c0[3] = 15.0853;
50  c0[4] = -49.7381;
51  c0[5] = 35.5604;
52 
53  c1[0] = -6.74237;
54  c1[1] = 84.2391;
55  c1[2] = -389.74;
56  c1[3] = 823.902;
57  c1[4] = -808.538;
58  c1[5] = 299.1;
59 
60  c2[0] = -1.25073;
61  c2[1] = 16.2666;
62  c2[2] = -74.6453;
63  c2[3] = 156.789;
64  c2[4] = -154.185;
65  c2[5] = 57.5711;
66 
67  s1[0] = -8.01579;
68  s1[1] = 93.9513;
69  s1[2] = -451.713;
70  s1[3] = 1049.67;
71  s1[4] = -1162.9;
72  s1[5] = 492.364;
73 
74  s2[0] = 3.04459;
75  s2[1] = -26.0901;
76  s2[2] = 81.1557;
77  s2[3] = -112.875;
78  s2[4] = 66.0432;
79  s2[5] = -10.0446;
80 }
81 
83 {
84  return "PSI2JPSIPIPI";
85 }
86 
88 {
89  return new EvtPsi2JpsiPiPi;
90 }
91 
93 {
94  // Should be OK for all phi values
95  setProbMax( 1.1 );
96 }
97 
99 {
100  checkNArg( 0, 1 );
101 
102  if ( getNArg() == 0 ) {
103  tree = true;
104  phi = 0.0;
105 
106  } else {
107  tree = false;
108  phi = getArg( 0 ); // LO vs NLO mixing angle in radians
109  }
110 
111  double twoPhi = 2.0 * phi;
112  cosPhi = cos( phi );
113  cos2Phi = cos( twoPhi );
114  sinPhi = sin( phi );
115  sin2Phi = sin( twoPhi );
116 }
117 
119 {
120  root->initializePhaseSpace( getNDaug(), getDaugs() );
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 ( !tree ) {
134  // Calculate NLO corrections
135  corr = 0.0;
136  for ( int iq = 0; iq < nQ; ++iq ) {
137  corr += ( c0[iq] + c1[iq] * cosPhi + c2[iq] * cos2Phi +
138  s1[iq] * sinPhi + s2[iq] * 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 directProd(const EvtVector3C &c1, const EvtVector3C &c2)
std::array< double, nQ > c2
void decay(EvtParticle *p) override
EvtTensor3C cont22(const EvtTensor3C &t1, const EvtTensor3C &t2)
EvtComplex trace() const
Definition: EvtTensor4C.hh:117
static const EvtTensor4C & g()
Definition: EvtTensor4C.cpp:44
double getArg(unsigned int j)
std::array< double, nQ > s1
EvtTensor4C dual(const EvtTensor4C &t2)
double mass() const
Definition: EvtVector4R.cpp:49
std::array< double, nQ > s2
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
std::array< double, nQ > c1
void setProbMax(double prbmx)
std::array< double, nQ > c0
double mass2() const
Definition: EvtVector4R.hh:100
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void initProbMax() override
virtual EvtVector4C epsParent(int i) const
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtVector4R & getP4() const
EvtDecayBase * clone() override
virtual EvtTensor4C epsTensor(int i) const
int getNDaug() const
Definition: EvtDecayBase.hh:65
std::string getName() override
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
static const int nQ
void init() override
int getNArg() const
Definition: EvtDecayBase.hh:68