EvtGen
2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Toggle main menu visibility
Loading...
Searching...
No Matches
src
EvtGenModels
EvtEtaLLPiPi.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
21
#include "
EvtGenModels/EvtEtaLLPiPi.hh
"
22
23
#include "
EvtGenBase/EvtId.hh
"
24
#include "
EvtGenBase/EvtKine.hh
"
25
#include "
EvtGenBase/EvtPDL.hh
"
26
#include "
EvtGenBase/EvtParticle.hh
"
27
#include "
EvtGenBase/EvtSpinType.hh
"
28
#include "
EvtGenBase/EvtVector4R.hh
"
29
30
#include <cmath>
31
32
// eta' -> mu+ mu- pi+ pi- or e+ e- pi+ pi-
33
// From Zhang Zhen-Yu et al, Chinese Phys. C 36, p926, 2012
34
35
void
EvtEtaLLPiPi::init
()
36
{
37
// Check for 0 or 1 (maxProb) arguments
38
checkNArg
( 0, 1 );
39
40
// Check particle types
41
checkSpinParent
(
EvtSpinType::SCALAR
);
42
checkSpinDaughter
( 0,
EvtSpinType::DIRAC
);
43
checkSpinDaughter
( 1,
EvtSpinType::DIRAC
);
44
checkSpinDaughter
( 2,
EvtSpinType::SCALAR
);
45
checkSpinDaughter
( 3,
EvtSpinType::SCALAR
);
46
47
// Mass and width of rho0 from particle properties file
48
m_rhoMass
=
EvtPDL::getMeanMass
(
EvtPDL::getId
(
"rho0"
) );
49
m_rhoMassSq
=
m_rhoMass
*
m_rhoMass
;
50
m_rhoGamma
=
EvtPDL::getWidth
(
EvtPDL::getId
(
"rho0"
) );
51
52
// Mixing parameter squared, using Eq 6
53
const
double
denom = 8.0 * pow(
EvtConst::pi
*
m_fPi
, 2 );
54
const
double
factor =
m_eSq
/ ( denom * denom * 3.0 );
55
const
double
fTerm8 = sin(
m_thetaMix
) /
m_f8
;
56
const
double
fTerm0 = 2.0 * sqrt( 2.0 ) * cos(
m_thetaMix
) /
m_f0
;
57
m_mixSq
= factor * pow( fTerm8 + fTerm0, 2 );
58
}
59
60
void
EvtEtaLLPiPi::initProbMax
()
61
{
62
if
(
getNArg
() == 1 ) {
63
setProbMax
(
getArg
( 0 ) );
64
65
}
else
{
66
int
lepId =
getDaug
( 0 ).
getId
();
67
if
( lepId ==
EvtPDL::getId
(
"e-"
).getId() ||
68
lepId ==
EvtPDL::getId
(
"e+"
).getId() ) {
69
setProbMax
( 27500.0 );
70
71
}
else
if
( lepId ==
EvtPDL::getId
(
"mu-"
).getId() ||
72
lepId ==
EvtPDL::getId
(
"mu+"
).getId() ) {
73
setProbMax
( 20.0 );
74
}
75
}
76
}
77
78
std::string
EvtEtaLLPiPi::getName
()
const
79
{
80
return
"ETA_LLPIPI"
;
81
}
82
83
EvtDecayBase
*
EvtEtaLLPiPi::clone
()
const
84
{
85
return
new
EvtEtaLLPiPi
();
86
}
87
88
void
EvtEtaLLPiPi::decay
(
EvtParticle
* p )
89
{
90
p->
initializePhaseSpace
(
getNDaug
(),
getDaugs
() );
91
92
const
double
mLep = p->
getDaug
( 0 )->
mass
();
93
const
double
mPi = p->
getDaug
( 2 )->
mass
();
94
95
updateMassPars
( mLep, mPi );
96
97
const
double
prob =
ampSquared
( p );
98
setProb
( prob );
99
}
100
101
void
EvtEtaLLPiPi::updateMassPars
(
double
mLep,
double
mPi )
102
{
103
// Update mass parameters used in various functions
104
m_lepMass
= mLep;
105
m_lepMassSq
= mLep * mLep;
106
m_4LepMassSq
= 4.0 *
m_lepMassSq
;
107
108
m_piMass
= mPi;
109
m_piMassSq
= mPi * mPi;
110
m_4PiMassSq
= 4.0 *
m_piMassSq
;
111
}
112
113
double
EvtEtaLLPiPi::rhoWidth
(
double
s,
double
m )
const
114
{
115
// Define width of rho using modified vector meson dynamics, Eq 8
116
double
gamma( 0.0 );
117
118
if
( s >=
m_4PiMassSq
) {
119
const
double
mSq = m * m;
120
const
double
num = 1.0 - ( 4.0 * mSq / s );
121
const
double
denom = 1.0 - ( 4.0 * mSq /
m_rhoMassSq
);
122
const
double
ratio = denom > 0.0 ? num / denom : 0.0;
123
gamma =
m_rhoGamma
* ( s /
m_rhoMassSq
) * pow( ratio, 1.5 );
124
}
125
126
return
gamma;
127
}
128
129
double
EvtEtaLLPiPi::F0
(
double
sLL,
double
sPiPi )
const
130
{
131
// Equation 7
132
double
ampSq( 0.0 );
133
134
const
double
rhoWidthL =
rhoWidth
( sLL,
m_lepMass
);
135
const
double
rhoWidthPi =
rhoWidth
( sPiPi,
m_piMass
);
136
137
const
double
mSqDiffL =
m_rhoMassSq
- sLL;
138
const
double
mRhoWidthL =
m_rhoMass
* rhoWidthL;
139
140
const
double
mSqDiffPi =
m_rhoMassSq
- sPiPi;
141
const
double
mRhoWidthPi =
m_rhoMass
* rhoWidthPi;
142
143
const
double
denomLL = mSqDiffL * mSqDiffL + mRhoWidthL * mRhoWidthL;
144
const
double
denomPiPi = mSqDiffPi * mSqDiffPi + mRhoWidthPi * mRhoWidthPi;
145
146
if
( denomLL > 0.0 && denomPiPi > 0.0 ) {
147
const
double
mRho4 =
m_rhoMassSq
*
m_rhoMassSq
;
148
const
double
denomProd = denomLL * denomPiPi;
149
150
double
realAmp =
m_par1
+
m_parLL
* (
m_rhoMassSq
* mSqDiffL / denomLL );
151
realAmp +=
m_parPiPi
* mRho4 *
152
( ( mSqDiffPi * mSqDiffL ) - mRhoWidthL * mRhoWidthPi ) /
153
denomProd;
154
155
double
imagAmp =
m_parLL
* (
m_rhoMassSq
* mRhoWidthL / denomLL );
156
imagAmp +=
m_parPiPi
* mRho4 *
157
( mRhoWidthPi * mSqDiffL + mRhoWidthL * mSqDiffPi ) /
158
denomProd;
159
160
ampSq = realAmp * realAmp + imagAmp * imagAmp;
161
}
162
163
return
ampSq;
164
}
165
166
double
EvtEtaLLPiPi::lambda
(
double
a,
double
b,
double
c )
const
167
{
168
const
double
sumSq = a * a + b * b + c * c;
169
const
double
prod = a * b + b * c + c * a;
170
const
double
L = sumSq - 2.0 * prod;
171
return
L;
172
}
173
174
double
EvtEtaLLPiPi::ampSquared
(
EvtParticle
* p )
const
175
{
176
// Equation 3
177
const
double
zeroProb( 0.0 );
178
179
// Mass of eta' meson
180
const
double
mEta = p->
mass
();
181
182
const
EvtVector4R
pL1 = p->
getDaug
( 0 )->
getP4
();
183
const
EvtVector4R
pL2 = p->
getDaug
( 1 )->
getP4
();
184
const
EvtVector4R
pPi1 = p->
getDaug
( 2 )->
getP4
();
185
const
EvtVector4R
pPi2 = p->
getDaug
( 3 )->
getP4
();
186
187
const
EvtVector4R
pLL = pL1 + pL2;
188
const
double
sLL = pLL.
mass2
();
189
const
EvtVector4R
pPiPi = pPi1 + pPi2;
190
const
double
sPiPi = pPiPi.
mass2
();
191
192
if
( sLL < 1e-4 || sPiPi <
m_4PiMassSq
|| sLL <
m_4LepMassSq
) {
193
// To avoid negative square roots etc
194
return
zeroProb;
195
}
196
197
// Angles theta_p, theta_k and phi defined in Fig 1
198
const
EvtVector4R
pSum = pLL + pPiPi;
199
// Helicity angle of first lepton
200
const
double
cosThp = -
EvtDecayAngle
( pSum, pLL, pL1 );
201
const
double
sinThp = sqrt( 1.0 - cosThp * cosThp );
202
// Helicity angle of first pion
203
const
double
cosThk = -
EvtDecayAngle
( pSum, pPiPi, pPi2 );
204
const
double
sinThk = sqrt( 1.0 - cosThk * cosThk );
205
// Angle between the dilepton and dipion decay planes
206
const
double
phi =
EvtDecayAngleChi
( pSum, pL1, pL2, pPi1, pPi2 );
207
const
double
sinPhi = sin( phi );
208
209
const
double
betaLL = sqrt( 1.0 - (
m_4LepMassSq
/ sLL ) );
210
const
double
betaPiPi = sqrt( 1.0 - (
m_4PiMassSq
/ sPiPi ) );
211
212
const
double
betaProd = ( 1.0 - pow( betaLL * sinThp * sinPhi, 2 ) ) *
213
sPiPi * pow( betaPiPi * sinThk, 2 );
214
const
double
L =
lambda
( mEta * mEta, sLL, sPiPi );
215
const
double
ampSq =
m_eSq
*
F0
( sLL, sPiPi ) *
m_mixSq
* L * betaProd /
216
( 8.0 * sLL );
217
218
return
ampSq;
219
}
EvtEtaLLPiPi.hh
EvtId.hh
EvtKine.hh
EvtDecayAngleChi
double EvtDecayAngleChi(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition
EvtKine.cpp:48
EvtDecayAngle
double EvtDecayAngle(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition
EvtKine.cpp:32
EvtPDL.hh
EvtParticle.hh
EvtSpinType.hh
EvtVector4R.hh
EvtConst::pi
static const double pi
Definition
EvtConst.hh:26
EvtDecayBase::checkSpinDaughter
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
Definition
EvtDecayBase.cpp:547
EvtDecayBase::EvtDecayBase
EvtDecayBase()=default
EvtDecayBase::getNDaug
int getNDaug() const
Definition
EvtDecayBase.hh:64
EvtDecayBase::checkSpinParent
void checkSpinParent(EvtSpinType::spintype sp)
Definition
EvtDecayBase.cpp:534
EvtDecayBase::getNArg
int getNArg() const
Definition
EvtDecayBase.hh:67
EvtDecayBase::getArg
double getArg(unsigned int j)
Definition
EvtDecayBase.cpp:578
EvtDecayBase::setProbMax
void setProbMax(double prbmx)
Definition
EvtDecayBase.cpp:295
EvtDecayBase::getDaug
EvtId getDaug(int i) const
Definition
EvtDecayBase.hh:66
EvtDecayBase::checkNArg
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
Definition
EvtDecayBase.cpp:492
EvtDecayBase::getDaugs
const EvtId * getDaugs() const
Definition
EvtDecayBase.hh:65
EvtDecayProb::setProb
void setProb(double prob)
Definition
EvtDecayProb.hh:32
EvtEtaLLPiPi::m_piMassSq
double m_piMassSq
Definition
EvtEtaLLPiPi.hh:76
EvtEtaLLPiPi::lambda
double lambda(double a, double b, double c) const
Definition
EvtEtaLLPiPi.cpp:166
EvtEtaLLPiPi::decay
void decay(EvtParticle *p) override
Definition
EvtEtaLLPiPi.cpp:88
EvtEtaLLPiPi::m_mixSq
double m_mixSq
Definition
EvtEtaLLPiPi.hh:63
EvtEtaLLPiPi::m_rhoMass
double m_rhoMass
Definition
EvtEtaLLPiPi.hh:70
EvtEtaLLPiPi::F0
double F0(double sLL, double sPiPi) const
Definition
EvtEtaLLPiPi.cpp:129
EvtEtaLLPiPi::EvtEtaLLPiPi
EvtEtaLLPiPi()=default
EvtEtaLLPiPi::init
void init() override
Definition
EvtEtaLLPiPi.cpp:35
EvtEtaLLPiPi::m_par1
double m_par1
Definition
EvtEtaLLPiPi.hh:67
EvtEtaLLPiPi::ampSquared
double ampSquared(EvtParticle *p) const
Definition
EvtEtaLLPiPi.cpp:174
EvtEtaLLPiPi::rhoWidth
double rhoWidth(double s, double m) const
Definition
EvtEtaLLPiPi.cpp:113
EvtEtaLLPiPi::m_lepMass
double m_lepMass
Definition
EvtEtaLLPiPi.hh:73
EvtEtaLLPiPi::m_piMass
double m_piMass
Definition
EvtEtaLLPiPi.hh:75
EvtEtaLLPiPi::m_parLL
double m_parLL
Definition
EvtEtaLLPiPi.hh:68
EvtEtaLLPiPi::m_fPi
double m_fPi
Definition
EvtEtaLLPiPi.hh:59
EvtEtaLLPiPi::m_f0
double m_f0
Definition
EvtEtaLLPiPi.hh:61
EvtEtaLLPiPi::m_4LepMassSq
double m_4LepMassSq
Definition
EvtEtaLLPiPi.hh:77
EvtEtaLLPiPi::initProbMax
void initProbMax() override
Definition
EvtEtaLLPiPi.cpp:60
EvtEtaLLPiPi::m_rhoMassSq
double m_rhoMassSq
Definition
EvtEtaLLPiPi.hh:71
EvtEtaLLPiPi::m_lepMassSq
double m_lepMassSq
Definition
EvtEtaLLPiPi.hh:74
EvtEtaLLPiPi::m_eSq
double m_eSq
Definition
EvtEtaLLPiPi.hh:58
EvtEtaLLPiPi::m_4PiMassSq
double m_4PiMassSq
Definition
EvtEtaLLPiPi.hh:78
EvtEtaLLPiPi::m_parPiPi
double m_parPiPi
Definition
EvtEtaLLPiPi.hh:69
EvtEtaLLPiPi::getName
std::string getName() const override
Definition
EvtEtaLLPiPi.cpp:78
EvtEtaLLPiPi::clone
EvtDecayBase * clone() const override
Definition
EvtEtaLLPiPi.cpp:83
EvtEtaLLPiPi::m_thetaMix
double m_thetaMix
Definition
EvtEtaLLPiPi.hh:62
EvtEtaLLPiPi::m_f8
double m_f8
Definition
EvtEtaLLPiPi.hh:60
EvtEtaLLPiPi::m_rhoGamma
double m_rhoGamma
Definition
EvtEtaLLPiPi.hh:72
EvtEtaLLPiPi::updateMassPars
void updateMassPars(double mLep, double mPi)
Definition
EvtEtaLLPiPi.cpp:101
EvtId::getId
int getId() const
Definition
EvtId.hh:41
EvtPDL::getWidth
static double getWidth(EvtId i)
Definition
EvtPDL.cpp:346
EvtPDL::getMeanMass
static double getMeanMass(EvtId i)
Definition
EvtPDL.cpp:306
EvtPDL::getId
static EvtId getId(const std::string &name)
Definition
EvtPDL.cpp:283
EvtParticle
Definition
EvtParticle.hh:45
EvtParticle::initializePhaseSpace
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
Definition
EvtParticle.cpp:1100
EvtParticle::getP4
const EvtVector4R & getP4() const
Definition
EvtParticle.cpp:144
EvtParticle::getDaug
EvtParticle * getDaug(const int i)
Definition
EvtParticle.hh:173
EvtParticle::mass
double mass() const
Definition
EvtParticle.cpp:159
EvtSpinType::SCALAR
@ SCALAR
Definition
EvtSpinType.hh:30
EvtSpinType::DIRAC
@ DIRAC
Definition
EvtSpinType.hh:33
EvtVector4R
Definition
EvtVector4R.hh:29
EvtVector4R::mass2
double mass2() const
Definition
EvtVector4R.hh:100
Generated by
1.17.0