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