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.
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 
78 std::string EvtEtaLLPiPi::getName()
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 
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 
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 }
void setProb(double prob)
Definition: EvtDecayProb.hh:32
double m_piMass
Definition: EvtEtaLLPiPi.hh:75
double EvtDecayAngleChi(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition: EvtKine.cpp:49
double m_4PiMassSq
Definition: EvtEtaLLPiPi.hh:78
double getArg(unsigned int j)
double rhoWidth(double s, double m) const
void decay(EvtParticle *p) override
void updateMassPars(double mLep, double mPi)
std::string getName() override
double m_rhoGamma
Definition: EvtEtaLLPiPi.hh:72
void init() override
void initProbMax() override
static double getMeanMass(EvtId i)
Definition: EvtPDL.cpp:314
double m_4LepMassSq
Definition: EvtEtaLLPiPi.hh:77
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
double m_rhoMassSq
Definition: EvtEtaLLPiPi.hh:71
double m_mixSq
Definition: EvtEtaLLPiPi.hh:63
static const double pi
Definition: EvtConst.hh:26
double F0(double sLL, double sPiPi) const
double mass2() const
Definition: EvtVector4R.hh:100
double m_lepMassSq
Definition: EvtEtaLLPiPi.hh:74
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void checkSpinParent(EvtSpinType::spintype sp)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
double ampSquared(EvtParticle *p) const
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
double m_parLL
Definition: EvtEtaLLPiPi.hh:68
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
double mass() const
int getId() const
Definition: EvtId.hh:42
static double getWidth(EvtId i)
Definition: EvtPDL.cpp:352
double EvtDecayAngle(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition: EvtKine.cpp:33
int getNDaug() const
Definition: EvtDecayBase.hh:65
double m_lepMass
Definition: EvtEtaLLPiPi.hh:73
double m_thetaMix
Definition: EvtEtaLLPiPi.hh:62
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
double m_rhoMass
Definition: EvtEtaLLPiPi.hh:70
double m_parPiPi
Definition: EvtEtaLLPiPi.hh:69
double lambda(double a, double b, double c) const
EvtEtaLLPiPi()=default
int getNArg() const
Definition: EvtDecayBase.hh:68
double m_piMassSq
Definition: EvtEtaLLPiPi.hh:76
EvtDecayBase * clone() override
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67