EvtGen
2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Toggle main menu visibility
Loading...
Searching...
No Matches
src
EvtGenBase
EvtPto3PAmp.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
21
#include "
EvtGenBase/EvtPto3PAmp.hh
"
22
23
#include "
EvtGenBase/EvtComplex.hh
"
24
#include "
EvtGenBase/EvtCyclic3.hh
"
25
#include "
EvtGenBase/EvtDalitzCoord.hh
"
26
#include "
EvtGenBase/EvtReport.hh
"
27
#include "
EvtGenBase/EvtdFunction.hh
"
28
29
#include <assert.h>
30
#include <iostream>
31
#include <math.h>
32
33
using
EvtCyclic3::Index
;
34
using
EvtCyclic3::Pair
;
35
using
std::endl;
36
37
EvtPto3PAmp::EvtPto3PAmp
(
EvtDalitzPlot
dp,
Pair
pairAng,
Pair
pairRes,
38
EvtSpinType::spintype
spin,
const
EvtPropagator
& prop,
39
NumType
typeN ) :
40
EvtAmplitude
<
EvtDalitzPoint
>(),
41
m_pairAng
( pairAng ),
42
m_pairRes
( pairRes ),
43
m_spin
( spin ),
44
m_typeN
( typeN ),
45
m_prop
( (
EvtPropagator
*)prop.
clone
() ),
46
m_g0
( prop.g0() ),
47
m_min
( 0 ),
48
m_max
( 0 ),
49
m_vb
( prop.m0(), dp.m(
EvtCyclic3
::other( pairRes ) ), dp.bigM(), spin ),
50
m_vd
( dp.m(
EvtCyclic3
::first( pairRes ) ),
51
dp.m(
EvtCyclic3
::second( pairRes ) ), prop.m0(), spin )
52
{
53
}
54
55
EvtPto3PAmp::EvtPto3PAmp
(
const
EvtPto3PAmp
& other ) :
56
EvtAmplitude
<
EvtDalitzPoint
>( other ),
57
m_pairAng
( other.
m_pairAng
),
58
m_pairRes
( other.
m_pairRes
),
59
m_spin
( other.
m_spin
),
60
m_typeN
( other.
m_typeN
),
61
m_prop
( ( other.
m_prop
) ? (
EvtPropagator
*)other.
m_prop
->
clone
() : nullptr ),
62
m_g0
( other.
m_g0
),
63
m_min
( other.
m_min
),
64
m_max
( other.
m_max
),
65
m_vb
( other.
m_vb
),
66
m_vd
( other.
m_vd
)
67
{
68
}
69
70
EvtPto3PAmp::~EvtPto3PAmp
()
71
{
72
if
(
m_prop
)
73
delete
m_prop
;
74
}
75
76
void
EvtPto3PAmp::set_fd
(
double
R )
77
{
78
m_vd
.set_f( R );
79
}
80
81
void
EvtPto3PAmp::set_fb
(
double
R )
82
{
83
m_vb
.set_f( R );
84
}
85
86
EvtComplex
EvtPto3PAmp::amplitude
(
const
EvtDalitzPoint
& x )
const
87
{
88
EvtComplex
amp( 1.0, 0.0 );
89
90
double
m = sqrt( x.
q
(
m_pairRes
) );
91
92
if
( (
m_max
> 0 && m >
m_max
) || (
m_min
> 0 && m <
m_min
) )
93
return
EvtComplex
( 0.0, 0.0 );
94
95
EvtTwoBodyKine
vd( x.
m
(
EvtCyclic3::first
(
m_pairRes
) ),
96
x.
m
(
EvtCyclic3::second
(
m_pairRes
) ), m );
97
EvtTwoBodyKine
vb( m, x.
m
(
EvtCyclic3::other
(
m_pairRes
) ), x.
bigM
() );
98
99
// Compute mass-dependent width for relativistic propagators
100
101
if
(
m_typeN
!=
NBW
&&
m_typeN
!=
FLATTE
) {
102
m_prop
->set_g0(
m_g0
*
m_vd
.widthFactor( vd ) );
103
}
104
105
// Compute propagator
106
107
amp *=
evalPropagator
( m );
108
109
// Compute form-factors
110
111
amp *=
m_vd
.formFactor( vd );
112
amp *=
m_vb
.formFactor( vb );
113
114
amp *=
numerator
( x );
115
116
return
amp;
117
}
118
119
EvtComplex
EvtPto3PAmp::numerator
(
const
EvtDalitzPoint
& x )
const
120
{
121
EvtComplex
ret( 0., 0. );
122
double
m = sqrt( x.
q
(
m_pairRes
) );
123
EvtTwoBodyKine
vd( x.
m
(
EvtCyclic3::first
(
m_pairRes
) ),
124
x.
m
(
EvtCyclic3::second
(
m_pairRes
) ), m );
125
EvtTwoBodyKine
vb( m, x.
m
(
EvtCyclic3::other
(
m_pairRes
) ), x.
bigM
() );
126
127
// Non-relativistic Breit-Wigner
128
129
if
(
NBW
==
m_typeN
) {
130
ret =
angDep
( x );
131
}
132
133
// Standard relativistic Zemach propagator
134
135
else
if
(
RBW_ZEMACH
==
m_typeN
) {
136
ret =
m_vd
.phaseSpaceFactor( vd,
EvtTwoBodyKine::AB
) *
angDep
( x );
137
}
138
139
// Kuehn-Santamaria normalization:
140
141
else
if
(
RBW_KUEHN
==
m_typeN
) {
142
ret =
m_prop
->m0() *
m_prop
->m0() *
angDep
( x );
143
}
144
145
// CLEO amplitude is not factorizable
146
//
147
// The CLEO amplitude numerator is proportional to:
148
//
149
// m2_AC - m2_BC + (m2_D - m2_C)(m2_B - m2_A)/m2_0
150
//
151
// m2_AC = (eA + eC)^2 + (P - P_C cosTh(BC))^2
152
// m2_BC = (eB + eC)^2 + (P + P_C cosTh(BC))^2
153
//
154
// The first term m2_AB-m2_BC is therefore a p-wave term
155
// - 4PP_C cosTh(BC)
156
// The second term is an s-wave, the amplitude
157
// does not factorize!
158
//
159
// The first term is just Zemach. However, the sign is flipped!
160
// Let's consistently use the convention in which the amplitude
161
// is proportional to +cosTh(BC). In the CLEO expressions, I will
162
// therefore exchange AB to get rid of the sign flip.
163
164
if
(
RBW_CLEO
==
m_typeN
||
FLATTE
==
m_typeN
||
GS
==
m_typeN
) {
165
Index
iA =
EvtCyclic3::other
(
m_pairAng
);
// A = other(BC)
166
Index
iB =
EvtCyclic3::common
(
m_pairRes
,
167
m_pairAng
);
// B = common(AB,BC)
168
Index
iC =
EvtCyclic3::other
(
m_pairRes
);
// C = other(AB)
169
170
double
M = x.
bigM
();
171
double
mA = x.
m
( iA );
172
double
mB = x.
m
( iB );
173
double
mC = x.
m
( iC );
174
double
qAB = x.
q
(
EvtCyclic3::combine
( iA, iB ) );
175
double
qBC = x.
q
(
EvtCyclic3::combine
( iB, iC ) );
176
double
qCA = x.
q
(
EvtCyclic3::combine
( iC, iA ) );
177
178
//double m0 = m_prop->m0();
179
180
if
(
m_spin
==
EvtSpinType::SCALAR
)
181
ret =
EvtComplex
( 1., 0. );
182
else
if
(
m_spin
==
EvtSpinType::VECTOR
) {
183
//ret = qCA - qBC - (M*M - mC*mC)*(mA*mA - mB*mB)/m0/m0;
184
ret = qCA - qBC - ( M * M - mC * mC ) * ( mA * mA - mB * mB ) / qAB;
185
}
else
if
(
m_spin
==
EvtSpinType::TENSOR
) {
186
//double x1 = qBC - qCA + (M*M - mC*mC)*(mA*mA - mB*mB)/m0/m0;
187
double
x1 = qBC - qCA +
188
( M * M - mC * mC ) * ( mA * mA - mB * mB ) / qAB;
189
double
x2 = M * M - mC * mC;
190
//double x3 = qAB - 2*M*M - 2*mC*mC + x2*x2/m0/m0;
191
double
x3 = qAB - 2 * M * M - 2 * mC * mC + x2 * x2 / qAB;
192
double
x4 = mB * mB - mA * mA;
193
//double x5 = qAB - 2*mB*mB - 2*mA*mA + x4*x4/m0/m0;
194
double
x5 = qAB - 2 * mB * mB - 2 * mA * mA + x4 * x4 / qAB;
195
ret = ( x1 * x1 - 1. / 3. * x3 * x5 );
196
}
else
197
assert( 0 );
198
}
199
200
return
ret;
201
}
202
203
double
EvtPto3PAmp::angDep
(
const
EvtDalitzPoint
& x )
const
204
{
205
// Angular dependece for factorizable amplitudes
206
// unphysical cosines indicate we are in big trouble
207
208
double
cosTh = x.
cosTh
(
m_pairAng
,
m_pairRes
);
209
if
( fabs( cosTh ) > 1. ) {
210
EvtGenReport
(
EVTGEN_INFO
,
"EvtGen"
) <<
"cosTh "
<< cosTh << endl;
211
assert( 0 );
212
}
213
214
// in units of half-spin
215
216
return
EvtdFunction::d
(
EvtSpinType::getSpin2
(
m_spin
), 2 * 0, 2 * 0,
217
acos( cosTh ) );
218
}
EvtComplex.hh
EvtCyclic3.hh
EvtDalitzCoord.hh
EvtPto3PAmp.hh
EvtReport.hh
EvtGenReport
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition
EvtReport.cpp:32
EVTGEN_INFO
@ EVTGEN_INFO
Definition
EvtReport.hh:52
EvtdFunction.hh
EvtAmplitude< EvtDalitzPoint >::EvtAmplitude
EvtAmplitude()=default
EvtComplex
Definition
EvtComplex.hh:29
EvtDalitzPlot
Definition
EvtDalitzPlot.hh:30
EvtDalitzPoint
Definition
EvtDalitzPoint.hh:38
EvtDalitzPoint::bigM
double bigM() const
Definition
EvtDalitzPoint.cpp:204
EvtDalitzPoint::m
double m(EvtCyclic3::Index) const
Definition
EvtDalitzPoint.cpp:102
EvtDalitzPoint::q
double q(EvtCyclic3::Pair) const
Definition
EvtDalitzPoint.cpp:91
EvtDalitzPoint::cosTh
double cosTh(EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes) const
Definition
EvtDalitzPoint.cpp:164
EvtPropagator
Definition
EvtPropagator.hh:32
EvtPto3PAmp::angDep
double angDep(const EvtDalitzPoint &p) const
Definition
EvtPto3PAmp.cpp:203
EvtPto3PAmp::clone
EvtAmplitude< EvtDalitzPoint > * clone() const override
Definition
EvtPto3PAmp.hh:69
EvtPto3PAmp::m_prop
EvtPropagator * m_prop
Definition
EvtPto3PAmp.hh:105
EvtPto3PAmp::amplitude
EvtComplex amplitude(const EvtDalitzPoint &p) const override
Definition
EvtPto3PAmp.cpp:86
EvtPto3PAmp::m_vb
EvtTwoBodyVertex m_vb
Definition
EvtPto3PAmp.hh:112
EvtPto3PAmp::~EvtPto3PAmp
~EvtPto3PAmp()
Definition
EvtPto3PAmp.cpp:70
EvtPto3PAmp::set_fb
void set_fb(double R)
Definition
EvtPto3PAmp.cpp:81
EvtPto3PAmp::set_fd
void set_fd(double R)
Definition
EvtPto3PAmp.cpp:76
EvtPto3PAmp::m_min
double m_min
Definition
EvtPto3PAmp.hh:107
EvtPto3PAmp::m_g0
double m_g0
Definition
EvtPto3PAmp.hh:106
EvtPto3PAmp::m_pairRes
EvtCyclic3::Pair m_pairRes
Definition
EvtPto3PAmp.hh:93
EvtPto3PAmp::NumType
NumType
Definition
EvtPto3PAmp.hh:41
EvtPto3PAmp::RBW_ZEMACH
@ RBW_ZEMACH
Definition
EvtPto3PAmp.hh:43
EvtPto3PAmp::GS
@ GS
Definition
EvtPto3PAmp.hh:58
EvtPto3PAmp::FLATTE
@ FLATTE
Definition
EvtPto3PAmp.hh:46
EvtPto3PAmp::NBW
@ NBW
Definition
EvtPto3PAmp.hh:42
EvtPto3PAmp::RBW_KUEHN
@ RBW_KUEHN
Definition
EvtPto3PAmp.hh:44
EvtPto3PAmp::RBW_CLEO
@ RBW_CLEO
Definition
EvtPto3PAmp.hh:45
EvtPto3PAmp::m_vd
EvtTwoBodyVertex m_vd
Definition
EvtPto3PAmp.hh:113
EvtPto3PAmp::m_pairAng
EvtCyclic3::Pair m_pairAng
Definition
EvtPto3PAmp.hh:92
EvtPto3PAmp::numerator
EvtComplex numerator(const EvtDalitzPoint &p) const
Definition
EvtPto3PAmp.cpp:119
EvtPto3PAmp::m_spin
EvtSpinType::spintype m_spin
Definition
EvtPto3PAmp.hh:97
EvtPto3PAmp::evalPropagator
virtual EvtComplex evalPropagator(double m) const
Definition
EvtPto3PAmp.hh:84
EvtPto3PAmp::m_typeN
NumType m_typeN
Definition
EvtPto3PAmp.hh:101
EvtPto3PAmp::EvtPto3PAmp
EvtPto3PAmp(EvtDalitzPlot dp, EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes, EvtSpinType::spintype spin, const EvtPropagator &prop, NumType typeN)
Definition
EvtPto3PAmp.cpp:37
EvtPto3PAmp::m_max
double m_max
Definition
EvtPto3PAmp.hh:108
EvtSpinType::getSpin2
static int getSpin2(spintype stype)
Definition
EvtSpinType.cpp:25
EvtSpinType::spintype
spintype
Definition
EvtSpinType.hh:29
EvtSpinType::SCALAR
@ SCALAR
Definition
EvtSpinType.hh:30
EvtSpinType::TENSOR
@ TENSOR
Definition
EvtSpinType.hh:32
EvtSpinType::VECTOR
@ VECTOR
Definition
EvtSpinType.hh:31
EvtTwoBodyKine
Definition
EvtTwoBodyKine.hh:28
EvtTwoBodyKine::AB
@ AB
Definition
EvtTwoBodyKine.hh:34
EvtdFunction::d
static double d(int j, int m1, int m2, double theta)
Definition
EvtdFunction.cpp:30
EvtCyclic3
Definition
EvtCyclic3.hh:28
EvtCyclic3::Pair
Pair
Definition
EvtCyclic3.hh:37
EvtCyclic3::common
Index common(Pair i, Pair j)
Definition
EvtCyclic3.cpp:291
EvtCyclic3::combine
Pair combine(Index i, Index j)
Definition
EvtCyclic3.cpp:207
EvtCyclic3::second
Index second(Pair i)
Definition
EvtCyclic3.cpp:263
EvtCyclic3::Index
Index
Definition
EvtCyclic3.hh:31
EvtCyclic3::other
Index other(Index i, Index j)
Definition
EvtCyclic3.cpp:155
EvtCyclic3::first
Index first(Pair i)
Definition
EvtCyclic3.cpp:249
Generated by
1.17.0