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
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
22
23#include "EvtGenBase/EvtId.hh"
24#include "EvtGenBase/EvtKine.hh"
25#include "EvtGenBase/EvtPDL.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
36{
37 // Check for 0 or 1 (maxProb) arguments
38 checkNArg( 0, 1 );
39
40 // Check particle types
46
47 // Mass and width of rho0 from particle properties file
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
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
78std::string EvtEtaLLPiPi::getName() const
79{
80 return "ETA_LLPIPI";
81}
82
84{
85 return new EvtEtaLLPiPi();
86}
87
89{
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
101void EvtEtaLLPiPi::updateMassPars( double mLep, double mPi )
102{
103 // Update mass parameters used in various functions
104 m_lepMass = mLep;
105 m_lepMassSq = mLep * mLep;
107
108 m_piMass = mPi;
109 m_piMassSq = mPi * mPi;
110 m_4PiMassSq = 4.0 * m_piMassSq;
111}
112
113double 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
129double 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
166double 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
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}
double EvtDecayAngleChi(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition EvtKine.cpp:48
double EvtDecayAngle(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition EvtKine.cpp:32
static const double pi
Definition EvtConst.hh:26
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
int getNArg() const
double getArg(unsigned int j)
void setProbMax(double prbmx)
EvtId getDaug(int i) const
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
void setProb(double prob)
double m_piMassSq
double lambda(double a, double b, double c) const
void decay(EvtParticle *p) override
double F0(double sLL, double sPiPi) const
EvtEtaLLPiPi()=default
void init() override
double ampSquared(EvtParticle *p) const
double rhoWidth(double s, double m) const
double m_4LepMassSq
void initProbMax() override
double m_rhoMassSq
double m_lepMassSq
double m_4PiMassSq
std::string getName() const override
EvtDecayBase * clone() const override
double m_thetaMix
double m_rhoGamma
void updateMassPars(double mLep, double mPi)
int getId() const
Definition EvtId.hh:41
static double getWidth(EvtId i)
Definition EvtPDL.cpp:346
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
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)
double mass() const
double mass2() const