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
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
22
28
29#include <assert.h>
30#include <iostream>
31#include <math.h>
32
35using std::endl;
36
38 EvtSpinType::spintype spin, const EvtPropagator& prop,
39 NumType typeN ) :
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
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
71{
72 if ( m_prop )
73 delete m_prop;
74}
75
76void EvtPto3PAmp::set_fd( double R )
77{
78 m_vd.set_f( R );
79}
80
81void EvtPto3PAmp::set_fb( double R )
82{
83 m_vb.set_f( R );
84}
85
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
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
120{
121 EvtComplex ret( 0., 0. );
122 double m = sqrt( x.q( 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)
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
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
203double 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}
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_INFO
Definition EvtReport.hh:52
double bigM() const
double m(EvtCyclic3::Index) const
double q(EvtCyclic3::Pair) const
double cosTh(EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes) const
double angDep(const EvtDalitzPoint &p) const
EvtAmplitude< EvtDalitzPoint > * clone() const override
EvtPropagator * m_prop
EvtComplex amplitude(const EvtDalitzPoint &p) const override
EvtTwoBodyVertex m_vb
void set_fb(double R)
void set_fd(double R)
EvtCyclic3::Pair m_pairRes
EvtTwoBodyVertex m_vd
EvtCyclic3::Pair m_pairAng
EvtComplex numerator(const EvtDalitzPoint &p) const
EvtSpinType::spintype m_spin
virtual EvtComplex evalPropagator(double m) const
NumType m_typeN
EvtPto3PAmp(EvtDalitzPlot dp, EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes, EvtSpinType::spintype spin, const EvtPropagator &prop, NumType typeN)
static int getSpin2(spintype stype)
static double d(int j, int m1, int m2, double theta)
Index common(Pair i, Pair j)
Pair combine(Index i, Index j)
Index second(Pair i)
Index other(Index i, Index j)
Index first(Pair i)