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
EvtSSSCPpng.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/EvtId.hh"
27#include "EvtGenBase/EvtPDL.hh"
31
32#include <stdlib.h>
33#include <string>
34
35std::string EvtSSSCPpng::getName() const
36{
37 return "SSS_CP_PNG";
38}
39
41{
42 return new EvtSSSCPpng;
43}
44
46{
47 // check that there are 7 arguments
48 checkNArg( 7 );
49 checkNDaug( 2 );
50
52
55}
56
58{
59 const double ASq = getArg( 5 ) * getArg( 5 ) + getArg( 6 ) * getArg( 6 );
60 const double max = ASq * ( 1.0 + getArg( 4 ) * getArg( 4 ) );
61 setProbMax( max );
62}
63
65{
66 //added by Lange Jan4,2000
67 static const EvtId B0 = EvtPDL::getId( "B0" );
68 static const EvtId B0B = EvtPDL::getId( "anti-B0" );
69
70 double t;
71 EvtId other_b;
72
74
75 EvtComplex amp;
76
77 EvtComplex A, Abar;
78 //EvtComplex ACC, AbarCC;
79
80 // assume single (top) quark dominance for the penguin.
81
82 // old: a0=alpha, a1=dm, a2=1, a3=1, a4=0, a5=1, a6=0
83 // new: a0=beta, a1=gamma, a2=delta, a3=dm, a4=1, a5=1=A_{T}, a6=A_{P}/A_{T}
84
85 // e.g., for B -> pi pi
86 // A_{T} = |V_{ub} V_{ud}| T
87 // A_{P} = |V_{tb} V_{td}| P
88 // P and T are purely hadronic matrix elements
89 // P/T = 0.055, A_{P}/A_{T} = 0.2 (see Marrocchesi and Paver, hep-ph/9702353)
90
91 // A = A_{T}( exp(i(beta+gamma)) + (A_{P}/A_{T}) exp(i(delta))
92 // A_bar = same, except for the sign of the weak phases
93 // here, delta = delta_{p}-delta_{t} (rel. strong phase)
94
95 A = getArg( 5 ) *
96 ( EvtComplex( cos( -getArg( 0 ) - getArg( 1 ) ),
97 sin( -getArg( 0 ) - getArg( 1 ) ) ) +
98 getArg( 6 ) * EvtComplex( cos( getArg( 2 ) ), sin( getArg( 2 ) ) ) );
99
100 Abar = getArg( 5 ) * ( EvtComplex( cos( getArg( 0 ) + getArg( 1 ) ),
101 sin( getArg( 0 ) + getArg( 1 ) ) ) +
102 getArg( 6 ) * EvtComplex( cos( getArg( 2 ) ),
103 sin( getArg( 2 ) ) ) );
104
105 // get fraction of B0 tags with these amplitudes
106
107 //double xd = 0.65;
108 const double ratio = 1 / ( 1 + 0.65 * 0.65 );
109
110 EvtComplex rf, rbarf;
111
112 rf = EvtComplex( cos( 2.0 * getArg( 0 ) ), sin( 2.0 * getArg( 0 ) ) ) *
113 Abar / A;
114 rbarf = EvtComplex( 1.0 ) / rf;
115
116 const double A2 = real( A ) * real( A ) + imag( A ) * imag( A );
117 const double Abar2 = real( Abar ) * real( Abar ) +
118 imag( Abar ) * imag( Abar );
119
120 const double rf2 = real( rf ) * real( rf ) + imag( rf ) * imag( rf );
121 const double rbarf2 = real( rbarf ) * real( rbarf ) +
122 imag( rbarf ) * imag( rbarf );
123
124 //fraction of B0 _tags_
125 const double fract = ( Abar2 * ( 1 + rbarf2 + ( 1 - rbarf2 ) * ratio ) ) /
126 ( Abar2 * ( 1 + rbarf2 + ( 1 - rbarf2 ) * ratio ) +
127 A2 * ( 1 + rf2 + ( 1 - rf2 ) * ratio ) );
128
129 EvtCPUtil::getInstance()->OtherB( p, t, other_b, fract );
130
131 //this method works just as well -- NK
132 //randomly generate the tag (B0 or B0B)
133
134 // double tag = EvtRandom::Flat(0.0,1.0);
135 // if (tag < 0.5) {
136 //
137 // EvtCPUtil::OtherB(p,t,other_b,1.0);
138 // other_b = B0;
139 // }
140 // else {
141 //
142 // EvtCPUtil::OtherB(p,t,other_b,0.0);
143 // other_b = B0B;
144 // }
145
146 //mixing angle = -beta
147
148 if ( other_b == B0B ) {
149 amp = A * cos( getArg( 3 ) * t / ( 2 * EvtConst::c ) ) +
150 EvtComplex( cos( 2.0 * getArg( 0 ) ), sin( 2.0 * getArg( 0 ) ) ) *
151 getArg( 4 ) * EvtComplex( 0.0, 1.0 ) * Abar *
152 sin( getArg( 3 ) * t / ( 2 * EvtConst::c ) );
153 }
154 if ( other_b == B0 ) {
155 amp = A *
156 EvtComplex( cos( -2.0 * getArg( 0 ) ),
157 sin( -2.0 * getArg( 0 ) ) ) *
158 EvtComplex( 0.0, 1.0 ) *
159 sin( getArg( 3 ) * t / ( 2 * EvtConst::c ) ) +
160 getArg( 4 ) * Abar * cos( getArg( 3 ) * t / ( 2 * EvtConst::c ) );
161 }
162
163 vertex( amp );
164
165 return;
166}
double imag(const EvtComplex &c)
double real(const EvtComplex &c)
static EvtCPUtil * getInstance()
Definition EvtCPUtil.cpp:42
void OtherB(EvtParticle *p, double &t, EvtId &otherb)
static const double c
Definition EvtConst.hh:30
void vertex(const EvtComplex &amp)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
double getArg(unsigned int j)
void setProbMax(double prbmx)
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
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)
EvtDecayBase * clone() const override
std::string getName() const override
void initProbMax() override
void decay(EvtParticle *p) override
void init() override