BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtSemiLeptonicAmp.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2//
3// Environment:
4// This software is part of the EvtGen package developed jointly
5// for the BaBar and CLEO collaborations. If you use all or part
6// of it, please give an appropriate acknowledgement.
7//
8// Copyright Information: See EvtGen/COPYRIGHT
9// Copyright (C) 1998 Caltech, UCSB
10//
11// Module: EvtSemiLeptonicAmp.cc
12//
13// Description: Routine to implement semileptonic decays to pseudo-scalar
14// mesons.
15//
16// Modification history:
17//
18// DJL April 17,1998 Module created
19//
20//------------------------------------------------------------------------
21//
22#include "EvtAmp.hh"
23#include "EvtDiracSpinor.hh"
24#include "EvtGenKine.hh"
25#include "EvtId.hh"
26#include "EvtPDL.hh"
27#include "EvtParticle.hh"
28#include "EvtPatches.hh"
29#include "EvtReport.hh"
30#include "EvtScalarParticle.hh"
32#include "EvtTensor4C.hh"
33#include "EvtTensorParticle.hh"
34#include "EvtVector4C.hh"
35#include "EvtVectorParticle.hh"
36
37double EvtSemiLeptonicAmp::CalcMaxProb( EvtId parent, EvtId meson, EvtId lepton, EvtId nudaug,
38 EvtSemiLeptonicFF* FormFactors ) {
39
40 // This routine takes the arguements parent, meson, and lepton
41 // number, and a form factor model, and returns a maximum
42 // probability for this semileptonic form factor model. A
43 // brute force method is used. The 2D cos theta lepton and
44 // q2 phase space is probed.
45
46 // Start by declaring a particle at rest.
47
48 // It only makes sense to have a scalar parent. For now.
49 // This should be generalized later.
50
51 EvtScalarParticle* scalar_part;
52 EvtParticle* root_part;
53
54 scalar_part = new EvtScalarParticle;
55
56 // cludge to avoid generating random numbers!
57 scalar_part->noLifeTime();
58
59 EvtVector4R p_init;
60
61 p_init.set( EvtPDL::getMass( parent ), 0.0, 0.0, 0.0 );
62 scalar_part->init( parent, p_init );
63 root_part = (EvtParticle*)scalar_part;
64 // root_part->set_type(EvtSpinType::SCALAR);
65 root_part->setDiagonalSpinDensity();
66
67 EvtParticle *daughter, *lep, *trino;
68
69 EvtAmp amp;
70
71 EvtId listdaug[3];
72 listdaug[0] = meson;
73 listdaug[1] = lepton;
74 listdaug[2] = nudaug;
75
76 amp.init( parent, 3, listdaug );
77
78 root_part->makeDaughters( 3, listdaug );
79 daughter = root_part->getDaug( 0 );
80 lep = root_part->getDaug( 1 );
81 trino = root_part->getDaug( 2 );
82
83 // cludge to avoid generating random numbers!
84 daughter->noLifeTime();
85 lep->noLifeTime();
86 trino->noLifeTime();
87
88 // Initial particle is unpolarized, well it is a scalar so it is
89 // trivial
91 rho.SetDiag( root_part->getSpinStates() );
92
93 double mass[3];
94
95 double m = root_part->mass();
96
97 EvtVector4R p4meson, p4lepton, p4nu, p4w;
98 double q2max;
99
100 double q2, elepton, plepton;
101 int i, j;
102 double erho, prho, costl;
103
104 double maxfoundprob = 0.0;
105 double prob = -10.0;
106 int massiter;
107
108 for ( massiter = 0; massiter < 3; massiter++ )
109 {
110
111 mass[0] = EvtPDL::getMeanMass( meson );
112 mass[1] = EvtPDL::getMeanMass( lepton );
113 mass[2] = EvtPDL::getMeanMass( nudaug );
114 if ( massiter == 1 ) { mass[0] = EvtPDL::getMinMass( meson ); }
115 if ( massiter == 2 )
116 {
117 mass[0] = EvtPDL::getMaxMass( meson );
118 if ( ( mass[0] + mass[1] + mass[2] ) > m ) mass[0] = m - mass[1] - mass[2] - 0.00001;
119 }
120
121 q2max = ( m - mass[0] ) * ( m - mass[0] );
122
123 // loop over q2
124
125 for ( i = 0; i < 25; i++ )
126 {
127 q2 = ( ( i + 0.5 ) * q2max ) / 25.0;
128
129 erho = ( m * m + mass[0] * mass[0] - q2 ) / ( 2.0 * m );
130
131 prho = sqrt( erho * erho - mass[0] * mass[0] );
132
133 p4meson.set( erho, 0.0, 0.0, -1.0 * prho );
134 p4w.set( m - erho, 0.0, 0.0, prho );
135
136 // This is in the W rest frame
137 elepton = ( q2 + mass[1] * mass[1] ) / ( 2.0 * sqrt( q2 ) );
138 plepton = sqrt( elepton * elepton - mass[1] * mass[1] );
139
140 double probctl[3];
141
142 for ( j = 0; j < 3; j++ )
143 {
144
145 costl = 0.99 * ( j - 1.0 );
146
147 // These are in the W rest frame. Need to boost out into
148 // the B frame.
149 p4lepton.set( elepton, 0.0, plepton * sqrt( 1.0 - costl * costl ), plepton * costl );
150 p4nu.set( plepton, 0.0, -1.0 * plepton * sqrt( 1.0 - costl * costl ),
151 -1.0 * plepton * costl );
152
153 EvtVector4R boost( ( m - erho ), 0.0, 0.0, 1.0 * prho );
154 p4lepton = boostTo( p4lepton, boost );
155 p4nu = boostTo( p4nu, boost );
156
157 // Now initialize the daughters...
158
159 daughter->init( meson, p4meson );
160 lep->init( lepton, p4lepton );
161 trino->init( nudaug, p4nu );
162
163 CalcAmp( root_part, amp, FormFactors );
164
165 // Now find the probability at this q2 and cos theta lepton point
166 // and compare to maxfoundprob.
167
168 // Do a little magic to get the probability!!
169 prob = rho.NormalizedProb( amp.getSpinDensity() );
170
171 probctl[j] = prob;
172 }
173
174 // probclt contains prob at ctl=-1,0,1.
175 // prob=a+b*ctl+c*ctl^2
176
177 double a = probctl[1];
178 double b = 0.5 * ( probctl[2] - probctl[0] );
179 double c = 0.5 * ( probctl[2] + probctl[0] ) - probctl[1];
180
181 prob = probctl[0];
182 if ( probctl[1] > prob ) prob = probctl[1];
183 if ( probctl[2] > prob ) prob = probctl[2];
184
185 if ( fabs( c ) > 1e-20 )
186 {
187 double ctlx = -0.5 * b / c;
188 if ( fabs( ctlx ) < 1.0 )
189 {
190 double probtmp = a + b * ctlx + c * ctlx * ctlx;
191 if ( probtmp > prob ) prob = probtmp;
192 }
193 }
194
195 // report(DEBUG,"EvtGen") << "prob,probctl:"<<prob<<" "
196 // << probctl[0]<<" "
197 // << probctl[1]<<" "
198 // << probctl[2]<<endl;
199
200 if ( prob > maxfoundprob ) { maxfoundprob = prob; }
201 }
202 if ( EvtPDL::getWidth( meson ) <= 0.0 )
203 {
204 // if the particle is narrow dont bother with changing the mass.
205 massiter = 4;
206 }
207 }
208 root_part->deleteTree();
209
210 maxfoundprob *= 1.1;
211 return maxfoundprob;
212}
double mass
EvtDiracSpinor boostTo(const EvtDiracSpinor &sp, const EvtVector4R p4)
void init(EvtId p, int ndaug, EvtId *daug)
Definition EvtAmp.cc:65
EvtSpinDensity getSpinDensity()
Definition EvtAmp.cc:135
Definition EvtId.hh:27
static double getWidth(EvtId i)
Definition EvtPDL.hh:59
static double getMeanMass(EvtId i)
Definition EvtPDL.hh:43
static double getMinMass(EvtId i)
Definition EvtPDL.hh:56
static double getMaxMass(EvtId i)
Definition EvtPDL.hh:55
static double getMass(EvtId i)
Definition EvtPDL.hh:44
void noLifeTime()
void makeDaughters(int ndaug, EvtId *id)
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
int getSpinStates() const
void setDiagonalSpinDensity()
EvtParticle * getDaug(int i)
double mass() const
void deleteTree()
void init(EvtId part_n, double e, double px, double py, double pz)
virtual void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors)
double CalcMaxProb(EvtId parent, EvtId meson, EvtId lepton, EvtId nudaug, EvtSemiLeptonicFF *FormFactors)
double NormalizedProb(const EvtSpinDensity &d)
void SetDiag(int n)
void set(int i, double d)