BOSS 7.0.8
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//
26#include "EvtGenBase/EvtPDL.hh"
32#include "EvtGenBase/EvtId.hh"
33#include "EvtGenBase/EvtAmp.hh"
37
39 EvtId lepton, EvtId nudaug,
40 EvtSemiLeptonicFF *FormFactors ) {
41
42 //This routine takes the arguements parent, meson, and lepton
43 //number, and a form factor model, and returns a maximum
44 //probability for this semileptonic form factor model. A
45 //brute force method is used. The 2D cos theta lepton and
46 //q2 phase space is probed.
47
48 //Start by declaring a particle at rest.
49
50 //It only makes sense to have a scalar parent. For now.
51 //This should be generalized later.
52
53 EvtScalarParticle *scalar_part;
54 EvtParticle *root_part;
55
56 scalar_part=new EvtScalarParticle;
57
58 //cludge to avoid generating random numbers!
59 scalar_part->noLifeTime();
60
61 EvtVector4R p_init;
62
63 p_init.set(EvtPDL::getMass(parent),0.0,0.0,0.0);
64 scalar_part->init(parent,p_init);
65 root_part=(EvtParticle *)scalar_part;
66// root_part->set_type(EvtSpinType::SCALAR);
67 root_part->setDiagonalSpinDensity();
68
69 EvtParticle *daughter, *lep, *trino;
70
71 EvtAmp amp;
72
73 EvtId listdaug[3];
74 listdaug[0] = meson;
75 listdaug[1] = lepton;
76 listdaug[2] = nudaug;
77
78 amp.init(parent,3,listdaug);
79
80 root_part->makeDaughters(3,listdaug);
81 daughter=root_part->getDaug(0);
82 lep=root_part->getDaug(1);
83 trino=root_part->getDaug(2);
84
85 //cludge to avoid generating random numbers!
86 daughter->noLifeTime();
87 lep->noLifeTime();
88 trino->noLifeTime();
89
90
91 //Initial particle is unpolarized, well it is a scalar so it is
92 //trivial
94 rho.SetDiag(root_part->getSpinStates());
95
96 double mass[3];
97
98 double m = root_part->mass();
99
100 EvtVector4R p4meson, p4lepton, p4nu, p4w;
101 double q2max;
102
103 double q2, elepton, plepton;
104 int i,j;
105 double erho,prho,costl;
106
107 double maxfoundprob = 0.0;
108 double prob = -10.0;
109 int massiter;
110
111 for (massiter=0;massiter<3;massiter++){
112
113 mass[0] = EvtPDL::getMeanMass(meson);
114 mass[1] = EvtPDL::getMeanMass(lepton);
115 mass[2] = EvtPDL::getMeanMass(nudaug);
116 if ( massiter==1 ) {
117 mass[0] = EvtPDL::getMinMass(meson);
118 }
119 if ( massiter==2 ) {
120 mass[0] = EvtPDL::getMaxMass(meson);
121 if ( (mass[0]+mass[1]+mass[2])>m) mass[0]=m-mass[1]-mass[2]-0.00001;
122 }
123
124 q2max = (m-mass[0])*(m-mass[0]);
125
126 //loop over q2
127
128 for (i=0;i<25;i++) {
129 q2 = ((i+0.5)*q2max)/25.0;
130
131 erho = ( m*m + mass[0]*mass[0] - q2 )/(2.0*m);
132
133 prho = sqrt(erho*erho-mass[0]*mass[0]);
134
135 p4meson.set(erho,0.0,0.0,-1.0*prho);
136 p4w.set(m-erho,0.0,0.0,prho);
137
138 //This is in the W rest frame
139 elepton = (q2+mass[1]*mass[1])/(2.0*sqrt(q2));
140 plepton = sqrt(elepton*elepton-mass[1]*mass[1]);
141
142 double probctl[3];
143
144 for (j=0;j<3;j++) {
145
146 costl = 0.99*(j - 1.0);
147
148 //These are in the W rest frame. Need to boost out into
149 //the B frame.
150 p4lepton.set(elepton,0.0,
151 plepton*sqrt(1.0-costl*costl),plepton*costl);
152 p4nu.set(plepton,0.0,
153 -1.0*plepton*sqrt(1.0-costl*costl),-1.0*plepton*costl);
154
155 EvtVector4R boost((m-erho),0.0,0.0,1.0*prho);
156 p4lepton=boostTo(p4lepton,boost);
157 p4nu=boostTo(p4nu,boost);
158
159 //Now initialize the daughters...
160
161 daughter->init(meson,p4meson);
162 lep->init(lepton,p4lepton);
163 trino->init(nudaug,p4nu);
164
165 CalcAmp(root_part,amp,FormFactors);
166
167 //Now find the probability at this q2 and cos theta lepton point
168 //and compare to maxfoundprob.
169
170 //Do a little magic to get the probability!!
171 prob = rho.NormalizedProb(amp.getSpinDensity());
172
173 probctl[j]=prob;
174 }
175
176 //probclt contains prob at ctl=-1,0,1.
177 //prob=a+b*ctl+c*ctl^2
178
179 double a=probctl[1];
180 double b=0.5*(probctl[2]-probctl[0]);
181 double c=0.5*(probctl[2]+probctl[0])-probctl[1];
182
183 prob=probctl[0];
184 if (probctl[1]>prob) prob=probctl[1];
185 if (probctl[2]>prob) prob=probctl[2];
186
187 if (fabs(c)>1e-20){
188 double ctlx=-0.5*b/c;
189 if (fabs(ctlx)<1.0){
190 double probtmp=a+b*ctlx+c*ctlx*ctlx;
191 if (probtmp>prob) prob=probtmp;
192 }
193
194 }
195
196 //report(DEBUG,"EvtGen") << "prob,probctl:"<<prob<<" "
197 // << probctl[0]<<" "
198 // << probctl[1]<<" "
199 // << probctl[2]<<endl;
200
201 if ( prob > maxfoundprob ) {
202 maxfoundprob = prob;
203 }
204
205 }
206 if ( EvtPDL::getWidth(meson) <= 0.0 ) {
207 //if the particle is narrow dont bother with changing the mass.
208 massiter = 4;
209 }
210
211 }
212 root_part->deleteTree();
213
214 maxfoundprob *=1.1;
215 return maxfoundprob;
216
217}
218
double mass
EvtDiracSpinor boostTo(const EvtDiracSpinor &sp, const EvtVector4R p4)
Definition: EvtAmp.hh:30
void init(EvtId p, int ndaug, EvtId *daug)
Definition: EvtAmp.cc:70
EvtSpinDensity getSpinDensity()
Definition: EvtAmp.cc:149
Definition: EvtId.hh:27
static double getWidth(EvtId i)
Definition: EvtPDL.hh:54
static double getMeanMass(EvtId i)
Definition: EvtPDL.hh:45
static double getMinMass(EvtId i)
Definition: EvtPDL.hh:51
static double getMaxMass(EvtId i)
Definition: EvtPDL.hh:50
static double getMass(EvtId i)
Definition: EvtPDL.hh:46
void noLifeTime()
Definition: EvtParticle.hh:362
void makeDaughters(int ndaug, EvtId *id)
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
int getSpinStates() const
Definition: EvtParticle.cc:118
void setDiagonalSpinDensity()
Definition: EvtParticle.cc:133
EvtParticle * getDaug(int i)
Definition: EvtParticle.cc:85
double mass() const
Definition: EvtParticle.cc:127
void deleteTree()
Definition: EvtParticle.cc:557
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)
Definition: EvtVector4R.hh:183
const double b
Definition: slope.cxx:9