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.
EvtKStopizmumu.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/EvtConst.hh"
25 #include "EvtGenBase/EvtGenKine.hh"
26 #include "EvtGenBase/EvtPDL.hh"
28 #include "EvtGenBase/EvtPatches.hh"
29 #include "EvtGenBase/EvtReport.hh"
33 
35 {
36  // 5 arguments
37  checkNArg( 5 );
38 
39  // Only 3 daughters
40  checkNDaug( 3 );
41 
42  // Spin-0 parent
44 
45  // Spin-0 daughters
49 
50  // KS parent
51  const EvtId p = getParentId();
52 
53  if ( p != EvtPDL::getId( "K_S0" ) ) {
54  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
55  << "EvtKStopizmumu: Parent must be K_S0" << std::endl;
56  assert( 0 );
57  }
58 
59  // Daughter types and ordering
60  const EvtId d1 = getDaug( 0 );
61  const EvtId d2 = getDaug( 1 );
62  const EvtId d3 = getDaug( 2 );
63 
64  if ( !( d1 == EvtPDL::getId( "pi0" ) && d2 == EvtPDL::getId( "mu+" ) &&
65  d3 == EvtPDL::getId( "mu-" ) ) ) {
66  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
67  << "EvtKStopizmumu: Daughter sequence should be pi0, mu+, mu-"
68  << std::endl;
69  assert( 0 );
70  }
71 }
72 
74 {
75  const double Mpiz = EvtPDL::getMass( EvtPDL::getId( "pi0" ) );
76  const double MKS = EvtPDL::getMass( EvtPDL::getId( "K_S0" ) );
77  const double MKS_Sq = MKS * MKS;
78  const double rpisq = Mpiz * Mpiz / MKS_Sq;
79  const double z0 = 1.0 / 3.0 + rpisq;
80 
81  // Generate 4-vectors in phase space
83 
84  // Daughter momenta
85  const EvtVector4R p4piz = p->getDaug( 0 )->getP4();
86 
87  // Input parameters
88  const double as = getArg( 0 );
89  // bs value from G8/30GF in here: http://arxiv.org/pdf/hep-ph/0404136.pdf would be 0.017
90  const double bs = getArg( 1 );
91  const double b2 = getArg( 2 ) * 1e-8;
92  const double d2 = getArg( 3 ) * 1e-8;
93  const double rvsq = getArg( 4 );
94  const double GF = EvtConst::Fermi;
95  const double alpha_s = 4.0 * b2 / 3.0;
96  const double beta_s = -8.0 * d2 / 3.0;
97 
98  // Calculate p4KS momentum
99  EvtVector4R p4KS( MKS, 0.0, 0.0, 0.0 );
100 
101  const EvtVector4R q = p4KS - p4piz;
102 
103  const double z = ( q.get( 0 ) * q.get( 0 ) - q.get( 1 ) * q.get( 1 ) -
104  q.get( 2 ) * q.get( 2 ) - q.get( 3 ) * q.get( 3 ) ) /
105  MKS_Sq;
106 
107  // Calculate line shape
108  const EvtComplex line_shape = GF * MKS_Sq * Wpol_z( z, as, bs ) +
109  Wpipi_z( z, alpha_s, beta_s, rvsq, rpisq, z0 );
110 
111  // Calculate spin
112  const EvtVector4R mom_sum = p4KS + p4piz;
113 
114  EvtVector4C l11, l12, l21, l22;
115 
116  l11 = EvtLeptonVCurrent( p->getDaug( 1 )->spParent( 0 ),
117  p->getDaug( 2 )->spParent( 0 ) );
118 
119  l21 = EvtLeptonVCurrent( p->getDaug( 1 )->spParent( 0 ),
120  p->getDaug( 2 )->spParent( 1 ) );
121 
122  l12 = EvtLeptonVCurrent( p->getDaug( 1 )->spParent( 1 ),
123  p->getDaug( 2 )->spParent( 0 ) );
124 
125  l22 = EvtLeptonVCurrent( p->getDaug( 1 )->spParent( 1 ),
126  p->getDaug( 2 )->spParent( 1 ) );
127 
128  vertex( 0, 0, mom_sum * l11 * line_shape );
129  vertex( 0, 1, mom_sum * l12 * line_shape );
130  vertex( 1, 0, mom_sum * l21 * line_shape );
131  vertex( 1, 1, mom_sum * l22 * line_shape );
132 }
133 
134 double EvtKStopizmumu::F_z( const double& z, const double& rvsq )
135 {
136  double F_z = 1.0 + ( z / rvsq );
137  return F_z;
138 }
139 
140 EvtComplex EvtKStopizmumu::G_z( const double& z )
141 {
142  EvtComplex G_z;
143 
144  if ( z <= 4.0 ) {
145  G_z = sqrt( ( 4.0 / z ) - 1.0 ) * asin( sqrt( z ) / 2.0 );
146  } else {
147  double z4 = 4.0 / z;
148  G_z = -0.5 * sqrt( 1.0 - z4 ) *
149  ( log( ( 1.0 - sqrt( 1.0 - z4 ) ) / ( 1.0 + sqrt( 1.0 + z4 ) ) ) +
150  EvtComplex( 0, EvtConst::pi ) );
151  }
152 
153  return G_z;
154 }
155 
156 EvtComplex EvtKStopizmumu::chi_z( const double& z, const double& rpisq )
157 {
158  double z_prime = z / rpisq;
159  EvtComplex chi = 4.0 / 9.0 - 4.0 * rpisq / ( 3.0 * z ) -
160  ( 1.0 - 4.0 * rpisq / z ) * G_z( z_prime ) / 3.0;
161  return chi;
162 }
163 
164 double EvtKStopizmumu::Wpol_z( const double& z, const double& as,
165  const double& bs )
166 {
167  double Wpol = ( as + bs * z );
168  return Wpol;
169 }
170 
171 EvtComplex EvtKStopizmumu::Wpipi_z( const double& z, const double& alpha_s,
172  const double& beta_s, const double& rvsq,
173  const double& rpisq, const double& z0 )
174 {
175  EvtComplex Wpipi = ( alpha_s + beta_s * ( z - z0 ) / rpisq ) *
176  F_z( z, rvsq ) * chi_z( z, rpisq ) / rpisq;
177  return Wpipi;
178 }
EvtComplex chi_z(const double &z, const double &rpisq)
double getArg(unsigned int j)
double Wpol_z(const double &z, const double &as, const double &bs)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtComplex G_z(const double &z)
EvtComplex Wpipi_z(const double &z, const double &alpha_s, const double &beta_s, const double &rvsq, const double &rpisq, const double &z0)
virtual EvtDiracSpinor spParent(int) const
double F_z(const double &z, const double &rvsq)
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
Definition: EvtId.hh:27
static const double pi
Definition: EvtConst.hh:26
EvtId getParentId() const
Definition: EvtDecayBase.hh:61
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
double get(int i) const
Definition: EvtVector4R.hh:162
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void checkNDaug(int d1, int d2=-1)
void checkSpinParent(EvtSpinType::spintype sp)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
void decay(EvtParticle *p) override
void init() override
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
int getNDaug() const
Definition: EvtDecayBase.hh:65
static const double Fermi
Definition: EvtConst.hh:31
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
static double getMass(EvtId i)
Definition: EvtPDL.cpp:319
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67