BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtPto3PAmp.cc
Go to the documentation of this file.
1#include "EvtPatches.hh"
2/*******************************************************************************
3 * Project: BaBar detector at the SLAC PEP-II B-factory
4 * Package: EvtGenBase
5 * File: $Id: EvtPto3PAmp.cc,v 1.1.1.2 2007/10/26 05:03:14 pingrg Exp $
6 * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
7 *
8 * Copyright (C) 2002 Caltech
9 *******************************************************************************/
10
11#include "EvtComplex.hh"
12#include "EvtCyclic3.hh"
13#include "EvtDalitzCoord.hh"
14#include "EvtPto3PAmp.hh"
15#include "EvtdFunction.hh"
16#include <assert.h>
17#include <iostream>
18#include <math.h>
21using std::endl;
22
24 EvtSpinType::spintype spin, const EvtPropagator& prop,
25 NumType typeN )
27 , _pairAng( pairAng )
28 , _pairRes( pairRes )
29 , _spin( spin )
30 , _typeN( typeN )
31 , _prop( (EvtPropagator*)prop.clone() )
32 , _g0( prop.g0() )
33 , _vb( prop.m0(), dp.m( EvtCyclic3::other( pairRes ) ), dp.bigM(), spin )
34 , _vd( dp.m( EvtCyclic3::first( pairRes ) ), dp.m( EvtCyclic3::second( pairRes ) ),
35 prop.m0(), spin ) {}
36
39 , _pairAng( other._pairAng )
40 , _pairRes( other._pairRes )
41 , _spin( other._spin )
42 , _typeN( other._typeN )
43 , _prop( ( other._prop ) ? (EvtPropagator*)other._prop->clone() : 0 )
44 , _g0( other._g0 )
45 , _vb( other._vb )
46 , _vd( other._vd ) {}
47
49 if ( _prop ) delete _prop;
50}
51
52void EvtPto3PAmp::set_fd( double R ) { _vd.set_f( R ); }
53
54void EvtPto3PAmp::set_fb( double R ) { _vb.set_f( R ); }
55
57 EvtComplex amp( 1.0, 0.0 );
58
59 double m = sqrt( x.q( _pairRes ) );
60 EvtTwoBodyKine vd( x.m( EvtCyclic3::first( _pairRes ) ),
61 x.m( EvtCyclic3::second( _pairRes ) ), m );
62 EvtTwoBodyKine vb( m, x.m( EvtCyclic3::other( _pairRes ) ), x.bigM() );
63
64 // Compute mass-dependent width for relativistic propagators
65
66 if ( _typeN != NBW ) { _prop->set_g0( _g0 * _vd.widthFactor( vd ) ); }
67
68 // Compute propagator
69
70 amp *= _prop->evaluate( m );
71
72 // Compute form-factors
73
74 amp *= _vd.formFactor( vd );
75 amp *= _vb.formFactor( vb );
76
77 amp *= numerator( x );
78
79 return amp;
80}
81
83 EvtComplex ret( 0., 0. );
84 double m = sqrt( x.q( _pairRes ) );
85 EvtTwoBodyKine vd( x.m( EvtCyclic3::first( _pairRes ) ),
86 x.m( EvtCyclic3::second( _pairRes ) ), m );
87 EvtTwoBodyKine vb( m, x.m( EvtCyclic3::other( _pairRes ) ), x.bigM() );
88
89 // Non-relativistic Breit-Wigner
90
91 if ( NBW == _typeN ) { ret = angDep( x ); }
92
93 // Standard relativistic Zemach propagator
94
95 else if ( RBW_ZEMACH == _typeN )
96 { ret = _vd.phaseSpaceFactor( vd, EvtTwoBodyKine::AB ) * angDep( x ); }
97
98 // Kuehn-Santamaria normalization:
99
100 else if ( RBW_KUEHN == _typeN ) { ret = _prop->m0() * _prop->m0() * angDep( x ); }
101
102 // CLEO amplitude is not factorizable
103 //
104 // The CLEO amplitude numerator is proportional to:
105 //
106 // m2_AC - m2_BC + (m2_D - m2_C)(m2_B - m2_A)/m2_0
107 //
108 // m2_AC = (eA + eC)^2 + (P - P_C cosTh(BC))^2
109 // m2_BC = (eB + eC)^2 + (P + P_C cosTh(BC))^2
110 //
111 // The first term m2_AB-m2_BC is therefore a p-wave term
112 // - 4PP_C cosTh(BC)
113 // The second term is an s-wave, the amplitude
114 // does not factorize!
115 //
116 // The first term is just Zemach. However, the sign is flipped!
117 // Let's consistently use the convention in which the amplitude
118 // is proportional to +cosTh(BC). In the CLEO expressions, I will
119 // therefore exchange AB to get rid of the sign flip.
120
121 if ( RBW_CLEO == _typeN )
122 {
123
124 Index iA = other( _pairAng ); // A = other(BC)
125 Index iB = common( _pairRes, _pairAng ); // B = common(AB,BC)
126 Index iC = other( _pairRes ); // C = other(AB)
127
128 double M = x.bigM();
129 double mA = x.m( iA );
130 double mB = x.m( iB );
131 double mC = x.m( iC );
132 double qAB = x.q( combine( iA, iB ) );
133 double qBC = x.q( combine( iB, iC ) );
134 double qCA = x.q( combine( iC, iA ) );
135
136 double m0 = _prop->m0();
137
138 if ( _spin == EvtSpinType::SCALAR ) ret = EvtComplex( 1., 0. );
139 else if ( _spin == EvtSpinType::VECTOR )
140 {
141
142 ret = qBC - qCA + ( M * M - mC * mC ) * ( mA * mA - mB * mB ) / m0 / m0;
143 ;
144 }
145 else if ( _spin == EvtSpinType::TENSOR )
146 {
147
148 double x1 = qBC - qCA + ( M * M - mC * mC ) * ( mA * mA - mB * mB ) / m0 / m0;
149 double x2 = M * M - mC * mC;
150 double x3 = qAB - 2 * M * M - 2 * mC * mC + x2 * x2 / m0 / m0;
151 double x4 = mB * mB - mA * mA;
152 double x5 = qAB - 2 * mB * mB - 2 * mA * mA + x4 * x4 / m0 / m0;
153 ret = ( x1 * x1 - 1. / 3. * x3 * x5 );
154 }
155 else assert( 0 );
156 }
157
158 return ret;
159}
160
161double EvtPto3PAmp::angDep( const EvtDalitzPoint& x ) const {
162 // Angular dependece for factorizable amplitudes
163 // unphysical cosines indicate we are in big trouble
164
165 double cosTh = x.cosTh( _pairAng, _pairRes );
166 if ( fabs( cosTh ) > 1. )
167 {
168
169 report( INFO, "EvtGen" ) << "cosTh " << cosTh << endl;
170 assert( 0 );
171 }
172
173 // in units of half-spin
174
175 return EvtdFunction::d( EvtSpinType::getSpin2( _spin ), 2 * 0, 2 * 0, acos( cosTh ) );
176}
ostream & report(Severity severity, const char *facility)
Definition EvtReport.cc:34
@ INFO
Definition EvtReport.hh:52
double angDep(const EvtDalitzPoint &p) const
void set_fb(double R)
void set_fd(double R)
virtual EvtAmplitude< EvtDalitzPoint > * clone() const
EvtComplex numerator(const EvtDalitzPoint &p) const
virtual EvtComplex amplitude(const EvtDalitzPoint &p) const
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 second(Pair i)
Index other(Index i, Index j)
Index first(Pair i)