evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
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 
23 #include "EvtGenBase/EvtComplex.hh"
24 #include "EvtGenBase/EvtCyclic3.hh"
26 #include "EvtGenBase/EvtPatches.hh"
27 #include "EvtGenBase/EvtReport.hh"
29 
30 #include <assert.h>
31 #include <iostream>
32 #include <math.h>
33 
34 using EvtCyclic3::Index;
35 using EvtCyclic3::Pair;
36 using std::endl;
37 
38 EvtPto3PAmp::EvtPto3PAmp( EvtDalitzPlot dp, Pair pairAng, Pair pairRes,
39  EvtSpinType::spintype spin, const EvtPropagator& prop,
40  NumType typeN ) :
42  _pairAng( pairAng ),
43  _pairRes( pairRes ),
44  _spin( spin ),
45  _typeN( typeN ),
46  _prop( (EvtPropagator*)prop.clone() ),
47  _g0( prop.g0() ),
48  _min( 0 ),
49  _max( 0 ),
50  _vb( prop.m0(), dp.m( EvtCyclic3::other( pairRes ) ), dp.bigM(), spin ),
51  _vd( dp.m( EvtCyclic3::first( pairRes ) ),
52  dp.m( EvtCyclic3::second( pairRes ) ), prop.m0(), spin )
53 {
54 }
55 
58  _pairAng( other._pairAng ),
59  _pairRes( other._pairRes ),
60  _spin( other._spin ),
61  _typeN( other._typeN ),
62  _prop( ( other._prop ) ? (EvtPropagator*)other._prop->clone() : 0 ),
63  _g0( other._g0 ),
64  _min( other._min ),
65  _max( other._max ),
66  _vb( other._vb ),
67  _vd( other._vd )
68 {
69 }
70 
72 {
73  if ( _prop )
74  delete _prop;
75 }
76 
77 void EvtPto3PAmp::set_fd( double R )
78 {
79  _vd.set_f( R );
80 }
81 
82 void EvtPto3PAmp::set_fb( double R )
83 {
84  _vb.set_f( R );
85 }
86 
88 {
89  EvtComplex amp( 1.0, 0.0 );
90 
91  double m = sqrt( x.q( _pairRes ) );
92 
93  if ( ( _max > 0 && m > _max ) || ( _min > 0 && m < _min ) )
94  return EvtComplex( 0.0, 0.0 );
95 
97  x.m( EvtCyclic3::second( _pairRes ) ), m );
98  EvtTwoBodyKine vb( m, x.m( EvtCyclic3::other( _pairRes ) ), x.bigM() );
99 
100  // Compute mass-dependent width for relativistic propagators
101 
102  if ( _typeN != NBW && _typeN != FLATTE ) {
103  _prop->set_g0( _g0 * _vd.widthFactor( vd ) );
104  }
105 
106  // Compute propagator
107 
108  amp *= evalPropagator( m );
109 
110  // Compute form-factors
111 
112  amp *= _vd.formFactor( vd );
113  amp *= _vb.formFactor( vb );
114 
115  amp *= numerator( x );
116 
117  return amp;
118 }
119 
121 {
122  EvtComplex ret( 0., 0. );
123  double m = sqrt( x.q( _pairRes ) );
125  x.m( EvtCyclic3::second( _pairRes ) ), m );
126  EvtTwoBodyKine vb( m, x.m( EvtCyclic3::other( _pairRes ) ), x.bigM() );
127 
128  // Non-relativistic Breit-Wigner
129 
130  if ( NBW == _typeN ) {
131  ret = angDep( x );
132  }
133 
134  // Standard relativistic Zemach propagator
135 
136  else if ( RBW_ZEMACH == _typeN ) {
137  ret = _vd.phaseSpaceFactor( vd, EvtTwoBodyKine::AB ) * angDep( x );
138  }
139 
140  // Kuehn-Santamaria normalization:
141 
142  else if ( RBW_KUEHN == _typeN ) {
143  ret = _prop->m0() * _prop->m0() * angDep( x );
144  }
145 
146  // CLEO amplitude is not factorizable
147  //
148  // The CLEO amplitude numerator is proportional to:
149  //
150  // m2_AC - m2_BC + (m2_D - m2_C)(m2_B - m2_A)/m2_0
151  //
152  // m2_AC = (eA + eC)^2 + (P - P_C cosTh(BC))^2
153  // m2_BC = (eB + eC)^2 + (P + P_C cosTh(BC))^2
154  //
155  // The first term m2_AB-m2_BC is therefore a p-wave term
156  // - 4PP_C cosTh(BC)
157  // The second term is an s-wave, the amplitude
158  // does not factorize!
159  //
160  // The first term is just Zemach. However, the sign is flipped!
161  // Let's consistently use the convention in which the amplitude
162  // is proportional to +cosTh(BC). In the CLEO expressions, I will
163  // therefore exchange AB to get rid of the sign flip.
164 
165  if ( RBW_CLEO == _typeN || FLATTE == _typeN || GS == _typeN ) {
166  Index iA = EvtCyclic3::other( _pairAng ); // A = other(BC)
167  Index iB = EvtCyclic3::common( _pairRes, _pairAng ); // B = common(AB,BC)
168  Index iC = EvtCyclic3::other( _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 = _prop->m0();
179 
180  if ( _spin == EvtSpinType::SCALAR )
181  ret = EvtComplex( 1., 0. );
182  else if ( _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 ( _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( _pairAng, _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( _spin ), 2 * 0, 2 * 0,
217  acos( cosTh ) );
218 }
double bigM() const
EvtPto3PAmp(EvtDalitzPlot dp, EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes, EvtSpinType::spintype spin, const EvtPropagator &prop, NumType typeN)
EvtCyclic3::Pair _pairRes
Definition: EvtPto3PAmp.hh:93
void set_f(double R)
double m(EvtCyclic3::Index) const
virtual EvtComplex evalPropagator(double m) const
Definition: EvtPto3PAmp.hh:84
void set_fd(double R)
Definition: EvtPto3PAmp.cpp:77
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
Pair combine(Index i, Index j)
Definition: EvtCyclic3.cpp:208
EvtSpinType::spintype _spin
Definition: EvtPto3PAmp.hh:97
NumType _typeN
Definition: EvtPto3PAmp.hh:101
void set_g0(double g0)
EvtPropagator * _prop
Definition: EvtPto3PAmp.hh:105
double formFactor(EvtTwoBodyKine x) const
double widthFactor(EvtTwoBodyKine x) const
EvtTwoBodyVertex _vd
Definition: EvtPto3PAmp.hh:113
double angDep(const EvtDalitzPoint &p) const
Index common(Pair i, Pair j)
Definition: EvtCyclic3.cpp:292
EvtCyclic3::Pair _pairAng
Definition: EvtPto3PAmp.hh:92
static int getSpin2(spintype stype)
Definition: EvtSpinType.cpp:26
Index second(Pair i)
Definition: EvtCyclic3.cpp:264
Index first(Pair i)
Definition: EvtCyclic3.cpp:250
double q(EvtCyclic3::Pair) const
static int first
Definition: EvtPDL.cpp:38
double cosTh(EvtCyclic3::Pair pairAng, EvtCyclic3::Pair pairRes) const
void set_fb(double R)
Definition: EvtPto3PAmp.cpp:82
static double d(int j, int m1, int m2, double theta)
double m0() const
EvtTwoBodyVertex _vb
Definition: EvtPto3PAmp.hh:112
Index other(Index i, Index j)
Definition: EvtCyclic3.cpp:156
EvtComplex numerator(const EvtDalitzPoint &p) const
EvtComplex amplitude(const EvtDalitzPoint &p) const override
Definition: EvtPto3PAmp.cpp:87
double phaseSpaceFactor(EvtTwoBodyKine x, EvtTwoBodyKine::Index) const