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
EvtBsquark.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
28#include "EvtGenBase/EvtPDL.hh"
31
32#include <iostream>
33#include <string>
34
35std::string EvtBsquark::getName() const
36{
37 return "BSQUARK";
38}
39
41{
42 return new EvtBsquark;
43}
44
46{
47 // check that there are 5 arguments
48 checkNArg( 5 );
49}
50
52{
53 setProbMax( 1e-6 );
54}
55
57{
58 static const EvtId cquark = EvtPDL::getId( "c" );
59 static const EvtId anticquark = EvtPDL::getId( "anti-c" );
60
61 static const EvtIdSet leptons{ "e-", "mu-", "tau-" };
62
64
65 int charge = 1;
66
67 EvtParticle* lepton;
68 lepton = p->getDaug( 1 );
69 if ( leptons.contains( lepton->getId() ) ) {
70 charge = -1;
71 }
72
73 EvtDiracParticle charmquark;
74
75 //this is a very crude approximation...
76 if ( charge == -1 ) {
77 charmquark.init( cquark, p->getDaug( 0 )->getP4() );
78 } else {
79 charmquark.init( anticquark, p->getDaug( 0 )->getP4() );
80 }
81
82 EvtVector4R p4c = p->getDaug( 0 )->getP4();
83
84 EvtVector4R p4sn = p->getDaug( 2 )->getP4();
85
86 EvtVector4R p4b( p->mass(), 0.0, 0.0, 0.0 );
87
88 EvtComplex M[2][2];
89
90 int il, ic;
91
92 //project out the right handed current
94
95 double tanbeta = getArg( 1 );
96 double cosbeta = cos( atan( tanbeta ) );
97 double sinbeta = sin( atan( tanbeta ) );
98
99 double mb = 4.9;
100 double mc = 1.3;
101 double mw = 80.4;
102
103 double Mass = getArg( 2 );
104 double mu = getArg( 3 );
105 double mchargino = getArg( 4 );
106
107 double tan2phim = 2 * sqrt( 2.0 ) * mw * ( mu * cosbeta + Mass * sinbeta ) /
108 ( Mass * Mass - mu * mu +
109 2 * mw * mw * cos( 2 * atan( tanbeta ) ) );
110
111 double phim = 0.5 * atan( tan2phim );
112
113 EvtComplex U11 = cos( phim );
114 EvtComplex U12 = sin( phim );
115 EvtComplex U21 = -sin( phim );
116 EvtComplex U22 = cos( phim );
117
118 double tan2phip = 2 * sqrt( 2.0 ) * mw * ( mu * cosbeta + Mass * sinbeta ) /
119 ( Mass * Mass - mu * mu -
120 2 * mw * mw * cos( 2 * atan( tanbeta ) ) );
121
122 double phip = 0.5 * atan( tan2phip );
123
124 EvtComplex V11 = cos( phip );
125 EvtComplex V12 = sin( phip );
126 EvtComplex V21 = -sin( phip );
127 EvtComplex V22 = cos( phip );
128
129 double theta = getArg( 0 );
130 double ctheta = cos( theta );
131 double stheta = sin( theta );
132
133 double vcsb = 0.08;
134 double mchi1 = mchargino;
135 double mchi2 = mchargino;
136
137 //overall scale factor
138 double g = 1.0;
139
140 EvtComplex a1 = mchi1 * ( U11 * ctheta - mb * U12 * stheta /
141 ( sqrt( 2.0 ) * mw * cosbeta ) );
142 EvtComplex a2 = mchi2 * ( U21 * ctheta - mb * U22 * stheta /
143 ( sqrt( 2.0 ) * mw * cosbeta ) );
144
145 EvtComplex b1 = mc * conj( V12 ) * ctheta / ( sqrt( 2.0 ) * mw * sinbeta );
146 EvtComplex b2 = mc * conj( V22 ) * ctheta / ( sqrt( 2.0 ) * mw * sinbeta );
147
148 EvtComplex f1 = -( g * g * V11 * vcsb ) /
149 ( ( p4b - p4c ).mass2() - mchi1 * mchi1 );
150 EvtComplex f2 = -( g * g * V21 * vcsb ) /
151 ( ( p4b - p4c ).mass2() - mchi1 * mchi2 );
152
153 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<g<<" "<<V11<<" "<<FL<<" "<<vcsb<<" "<<mchi1<<endl;
154 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "f1:"<<f1<<" "<<(p4b-p4c).mass2()<<endl;
155 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "f2:"<<f2<<" "<<(p4b-p4c).mass2()<<endl;
156
157 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "p4sn:"<<p4sn<<endl;
158
159 EvtGammaMatrix pslash = p4sn.get( 0 ) * EvtGammaMatrix::g0() -
160 p4sn.get( 1 ) * EvtGammaMatrix::g1() -
161 p4sn.get( 2 ) * EvtGammaMatrix::g2() -
162 p4sn.get( 3 ) * EvtGammaMatrix::g3();
163
164 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "pslash:"<<pslash<<endl;
165
166 for ( il = 0; il < 2; il++ ) {
167 for ( ic = 0; ic < 2; ic++ ) {
168 EvtComplex a = 0.0;
169 EvtComplex b = 0.0;
170
171 if ( charge == -1 ) {
172 a = charmquark.spParent( ic ) * ( PR * lepton->spParent( il ) );
173 b = charmquark.spParent( ic ) *
174 ( ( pslash * PR ) * lepton->spParent( il ) );
175 } else {
176 a = lepton->spParent( il ) * ( PR * charmquark.spParent( ic ) );
177 b = lepton->spParent( il ) *
178 ( ( pslash * PR ) * charmquark.spParent( ic ) );
179 }
180
181 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"pslash*PR:"<<pslash*PR<<endl;
182 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"sp charm:"<<charmquark.spParent(ic)<<endl;
183 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"sp lepton:"<<lepton->spParent(il)<<endl;
184
185 M[ic][il] = f1 * ( a1 * a + b1 * b ) + f2 * ( a2 * a + b2 * b );
186
187 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "Contr1:"<<a1<<" "<<a<<" "<<b1<<" "<<b<<endl;
188 //EvtGenReport(EVTGEN_INFO,"EvtGen") << "Contr2:"<<a2<<" "<<a<<" "<<b2<<" "<<b<<endl;
189
190 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"case1:"<<f1<<" "<<a1<<" "<<b1<<" "<<a<<" "<<b<<endl;
191 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"case2:"<<f2<<" "<<a2<<" "<<b2<<" "<<a<<" "<<b<<endl;
192 }
193 }
194
195 double prob = real( M[0][0] * conj( M[0][0] ) + M[1][0] * conj( M[1][0] ) +
196 M[0][1] * conj( M[0][1] ) + M[1][1] * conj( M[1][1] ) );
197
198 //EvtGenReport(EVTGEN_INFO,"EvtGen") <<"prob:"<<prob<<endl;
199
200 setProb( prob );
201
202 return;
203}
EvtComplex conj(const EvtComplex &c)
double real(const EvtComplex &c)
const double a2
const double a1
std::string getName() const override
EvtDecayBase * clone() const override
void decay(EvtParticle *p) override
void initProbMax() override
void init() override
EvtDecayBase()=default
int getNDaug() const
double getArg(unsigned int j)
void setProbMax(double prbmx)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
void setProb(double prob)
EvtDiracSpinor spParent(int i) const override
void init(EvtId part_n, const EvtVector4R &p4) override
static const EvtGammaMatrix & id()
static const EvtGammaMatrix & g0()
static const EvtGammaMatrix & g2()
static const EvtGammaMatrix & g1()
static const EvtGammaMatrix & g3()
static const EvtGammaMatrix & g5()
bool contains(const EvtId &id) const
Definition EvtIdSet.cpp:46
Definition EvtId.hh:27
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)
EvtId getId() const
virtual EvtDiracSpinor spParent(int) const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
double get(int i) const