CGEM BOSS 6.6.5.i
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtVub Class Reference

#include <EvtVub.hh>

+ Inheritance diagram for EvtVub:

Public Member Functions

 EvtVub ()
 
virtual ~EvtVub ()
 
void getName (std::string &name)
 
EvtDecayBaseclone ()
 
void initProbMax ()
 
void init ()
 
void decay (EvtParticle *p)
 
- Public Member Functions inherited from EvtDecayIncoherent
void makeDecay (EvtParticle *p)
 
virtual ~EvtDecayIncoherent ()
 
void setDaughterSpinDensity (int daughter)
 
int isDaughterSpinDensitySet (int daughter)
 
- Public Member Functions inherited from EvtDecayBase
virtual std::string commandName ()
 
virtual void command (std::string cmd)
 
double getProbMax (double prob)
 
double resetProbMax (double prob)
 
 EvtDecayBase ()
 
virtual ~EvtDecayBase ()
 
virtual bool matchingDecay (const EvtDecayBase &other) const
 
EvtId getParentId ()
 
double getBranchingFraction ()
 
void disableCheckQ ()
 
void checkQ ()
 
int getNDaug ()
 
EvtIdgetDaugs ()
 
EvtId getDaug (int i)
 
int getNArg ()
 
int getPHOTOS ()
 
void setPHOTOS ()
 
void setVerbose ()
 
void setSummary ()
 
double * getArgs ()
 
std::string * getArgsStr ()
 
double getArg (int j)
 
std::string getArgStr (int j)
 
std::string getModelName ()
 
int getDSum ()
 
int summary ()
 
int verbose ()
 
void saveDecayInfo (EvtId ipar, int ndaug, EvtId *daug, int narg, std::vector< std::string > &args, std::string name, double brfr)
 
void printSummary ()
 
void setProbMax (double prbmx)
 
void noProbMax ()
 
void checkNArg (int a1, int a2=-1, int a3=-1, int a4=-1)
 
void checkNDaug (int d1, int d2=-1)
 
void checkSpinParent (EvtSpinType::spintype sp)
 
void checkSpinDaughter (int d1, EvtSpinType::spintype sp)
 
virtual int nRealDaughters ()
 

Additional Inherited Members

- Static Public Member Functions inherited from EvtDecayBase
static void findMasses (EvtParticle *p, int ndaugs, EvtId daugs[10], double masses[10])
 
static void findMass (EvtParticle *p)
 
static double findMaxMass (EvtParticle *p)
 
- Protected Member Functions inherited from EvtDecayBase
bool daugsDecayedByParentModel ()
 
- Protected Attributes inherited from EvtDecayBase
bool _daugsDecayedByParentModel
 

Detailed Description

Definition at line 34 of file EvtVub.hh.

Constructor & Destructor Documentation

◆ EvtVub()

EvtVub::EvtVub ( )
inline

Definition at line 38 of file EvtVub.hh.

38{}

Referenced by clone().

◆ ~EvtVub()

EvtVub::~EvtVub ( )
virtual

Definition at line 43 of file EvtVub.cc.

43 {
44 delete _dGamma;
45 delete [] _masses;
46 delete [] _weights;
47}

Member Function Documentation

◆ clone()

EvtDecayBase * EvtVub::clone ( )
virtual

Implements EvtDecayBase.

Definition at line 55 of file EvtVub.cc.

55 {
56
57 return new EvtVub;
58
59}
EvtVub()
Definition EvtVub.hh:38

◆ decay()

void EvtVub::decay ( EvtParticle * p)
virtual

Implements EvtDecayBase.

Definition at line 169 of file EvtVub.cc.

169 {
170
171 int j;
172 // B+ -> u-bar specflav l+ nu
173
174 EvtParticle *xuhad, *lepton, *neutrino;
175 EvtVector4R p4;
176 // R. Faccini 21/02/03
177 // move the reweighting up , before also shooting the fermi distribution
178 double x,z,p2;
179 double sh=0.0;
180 double mB,ml,xlow,xhigh,qplus;
181 double El=0.0;
182 double Eh=0.0;
183 double kplus;
184 const double lp2epsilon=-10;
185 bool rew(true);
186 while(rew){
187
189
190 xuhad=p->getDaug(0);
191 lepton=p->getDaug(1);
192 neutrino=p->getDaug(2);
193
194 mB = p->mass();
195 ml = lepton->mass();
196
197 xlow = -_mb;
198 xhigh = mB-_mb;
199
200
201 // Fermi motion does not need to be computed inside the
202 // tryit loop as m_b in Gamma0 does not need to be replaced by (m_b+kplus).
203 // The difference however should be of the Order (lambda/m_b)^2 which is
204 // beyond the considered orders in the paper anyway ...
205
206 // for alpha_S = 0 and a mass cut on X_u not all values of kplus are
207 // possible. The maximum value is mB/2-_mb + sqrt(mB^2/4-_masses[0]^2)
208 kplus = 2*xhigh;
209
210 while( kplus >= xhigh || kplus <= xlow
211 || (_alphas == 0 && kplus >= mB/2-_mb
212 + sqrt(mB*mB/4-_masses[0]*_masses[0]))) {
213 kplus = findPFermi(); //_pFermi->shoot();
214 kplus = xlow + kplus*(xhigh-xlow);
215 }
216 qplus = mB-_mb-kplus;
217 if( (mB-qplus)/2.<=ml)continue;
218
219 int tryit = 1;
220 while (tryit) {
221
222 x = EvtRandom::Flat();
223 z = EvtRandom::Flat(0,2);
224 p2=EvtRandom::Flat();
225 p2 = pow(10,lp2epsilon*p2);
226
227 El = x*(mB-qplus)/2;
228 if ( El > ml && El < mB/2) {
229
230 Eh = z*(mB-qplus)/2+qplus;
231 if ( Eh > 0 && Eh < mB ) {
232
233 sh = p2*pow(mB-qplus,2)+2*qplus*(Eh-qplus)+qplus*qplus;
234 if ( sh > _masses[0]*_masses[0]
235 && mB*mB + sh - 2*mB*Eh > ml*ml) {
236
237 double xran = EvtRandom::Flat();
238
239 double y = _dGamma->getdGdxdzdp(x,z,p2)/_dGMax*p2;
240
241 if ( y > 1 ) report(WARNING,"EvtGen")<<"EvtVub decay probability > 1 found: " << y << endl;
242 if ( y >= xran ) tryit = 0;
243 }
244 }
245 }
246 }
247 // reweight the Mx distribution
248 if(_nbins>0){
249 double xran1 = EvtRandom::Flat();
250 double m = sqrt(sh);j=0;
251 while ( j < _nbins && m > _masses[j] ) j++;
252 double w = _weights[j-1];
253 if ( w >= xran1 ) rew = false;
254 } else {
255 rew = false;
256 }
257
258 }
259
260 // o.k. we have the three kineamtic variables
261 // now calculate a flat cos Theta_H [-1,1] distribution of the
262 // hadron flight direction w.r.t the B flight direction
263 // because the B is a scalar and should decay isotropic.
264 // Then chose a flat Phi_H [0,2Pi] w.r.t the B flight direction
265 // and and a flat Phi_L [0,2Pi] in the W restframe w.r.t the
266 // W flight direction.
267
268 double ctH = EvtRandom::Flat(-1,1);
269 double phH = EvtRandom::Flat(0,2*M_PI);
270 double phL = EvtRandom::Flat(0,2*M_PI);
271
272 // now compute the four vectors in the B Meson restframe
273
274 double ptmp,sttmp;
275 // calculate the hadron 4 vector in the B Meson restframe
276
277 sttmp = sqrt(1-ctH*ctH);
278 ptmp = sqrt(Eh*Eh-sh);
279 double pHB[4] = {Eh,ptmp*sttmp*cos(phH),ptmp*sttmp*sin(phH),ptmp*ctH};
280 p4.set(pHB[0],pHB[1],pHB[2],pHB[3]);
281 xuhad->init( getDaug(0), p4);
282
283 if (_storeQplus ) {
284 // cludge to store the hidden parameter q+ with the decay;
285 // the lifetime of the Xu is abused for this purpose.
286 // tau = 1 ps corresponds to ctau = 0.3 mm -> in order to
287 // stay well below BaBars sensitivity we take q+/(10000 GeV) which
288 // goes up to 0.0005 in the most extreme cases as ctau in mm.
289 // To extract q+ back from the StdHepTrk its necessary to get
290 // delta_ctau = Xu->anyDaughter->getVertexTime()-Xu->getVertexTime()
291 // where these pseudo calls refere to the StdHep time stored at
292 // the production vertex in the lab for each particle. The boost
293 // has to be reversed and the result is:
294 //
295 // q+ = delta_ctau * 10000 GeV/mm * Mass_Xu/Energy_Xu
296 //
297 xuhad->setLifetime(qplus/10000.);
298 }
299
300 // calculate the W 4 vector in the B Meson restrframe
301
302 double apWB = ptmp;
303 double pWB[4] = {mB-Eh,-pHB[1],-pHB[2],-pHB[3]};
304
305 // first go in the W restframe and calculate the lepton and
306 // the neutrino in the W frame
307
308 double mW2 = mB*mB + sh - 2*mB*Eh;
309 double beta = ptmp/pWB[0];
310 double gamma = pWB[0]/sqrt(mW2);
311
312 double pLW[4];
313
314 ptmp = (mW2-ml*ml)/2/sqrt(mW2);
315 pLW[0] = sqrt(ml*ml + ptmp*ptmp);
316
317 double ctL = (El - gamma*pLW[0])/beta/gamma/ptmp;
318 if ( ctL < -1 ) ctL = -1;
319 if ( ctL > 1 ) ctL = 1;
320 sttmp = sqrt(1-ctL*ctL);
321
322 // eX' = eZ x eW
323 double xW[3] = {-pWB[2],pWB[1],0};
324 // eZ' = eW
325 double zW[3] = {pWB[1]/apWB,pWB[2]/apWB,pWB[3]/apWB};
326
327 double lx = sqrt(xW[0]*xW[0]+xW[1]*xW[1]);
328 for (j=0;j<2;j++)
329 xW[j] /= lx;
330
331 // eY' = eZ' x eX'
332 double yW[3] = {-pWB[1]*pWB[3],-pWB[2]*pWB[3],pWB[1]*pWB[1]+pWB[2]*pWB[2]};
333 double ly = sqrt(yW[0]*yW[0]+yW[1]*yW[1]+yW[2]*yW[2]);
334 for (j=0;j<3;j++)
335 yW[j] /= ly;
336
337 // p_lep = |p_lep| * ( sin(Theta) * cos(Phi) * eX'
338 // + sin(Theta) * sin(Phi) * eY'
339 // + cos(Theta) * eZ')
340 for (j=0;j<3;j++)
341 pLW[j+1] = sttmp*cos(phL)*ptmp*xW[j]
342 + sttmp*sin(phL)*ptmp*yW[j]
343 + ctL *ptmp*zW[j];
344
345 double apLW = ptmp;
346 // calculate the neutrino 4 vector in the W restframe
347 //double pNW[4] = {sqrt(mW2)-pLW[0],-pLW[1],-pLW[2],-pLW[3]};
348
349 // boost them back in the B Meson restframe
350
351 double appLB = beta*gamma*pLW[0] + gamma*ctL*apLW;
352
353 ptmp = sqrt(El*El-ml*ml);
354 double ctLL = appLB/ptmp;
355
356 if ( ctLL > 1 ) ctLL = 1;
357 if ( ctLL < -1 ) ctLL = -1;
358
359 double pLB[4] = {El,0,0,0};
360 double pNB[4] = {pWB[0]-El,0,0,0};
361
362 for (j=1;j<4;j++) {
363 pLB[j] = pLW[j] + (ctLL*ptmp - ctL*apLW)/apWB*pWB[j];
364 pNB[j] = pWB[j] - pLB[j];
365 }
366
367 p4.set(pLB[0],pLB[1],pLB[2],pLB[3]);
368 lepton->init( getDaug(1), p4);
369
370 p4.set(pNB[0],pNB[1],pNB[2],pNB[3]);
371 neutrino->init( getDaug(2), p4);
372
373 return ;
374}
double sin(const BesAngle a)
Definition BesAngle.h:210
double cos(const BesAngle a)
Definition BesAngle.h:213
Double_t x[10]
ostream & report(Severity severity, const char *facility)
Definition EvtReport.cc:36
@ WARNING
Definition EvtReport.hh:50
#define M_PI
Definition TConstant.h:4
EvtId * getDaugs()
EvtId getDaug(int i)
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
void setLifetime(double tau)
EvtParticle * getDaug(int i)
double mass() const
double initializePhaseSpace(int numdaughter, EvtId *daughters, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
static double Flat()
Definition EvtRandom.cc:73
void set(int i, double d)
double getdGdxdzdp(const double &x, const double &z, const double &p2)

◆ getName()

void EvtVub::getName ( std::string & name)
virtual

Implements EvtDecayBase.

Definition at line 49 of file EvtVub.cc.

49 {
50
51 model_name="VUB";
52
53}

◆ init()

void EvtVub::init ( )
virtual

Reimplemented from EvtDecayBase.

Definition at line 62 of file EvtVub.cc.

62 {
63
64 // check that there are at least 6 arguments
65
66 if (getNArg()<6) {
67
68 report(ERROR,"EvtGen") << "EvtVub generator expected "
69 << " at least 6 arguments (mb,a,alpha_s,Nbins,m1,w1,...) but found: "
70 <<getNArg()<<endl;
71 report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
72 ::abort();
73
74 }
75
76 _mb = getArg(0);
77 _a = getArg(1);
78 _alphas = getArg(2);
79 _nbins = abs((int)getArg(3));
80 _storeQplus = (getArg(3)<0?1:0);
81 _masses = new double[_nbins];
82 _weights = new double[_nbins];
83
84 if (getNArg()-4 != 2*_nbins) {
85 report(ERROR,"EvtGen") << "EvtVub generator expected "
86 << _nbins << " masses and weights but found: "
87 <<(getNArg()-4)/2 <<endl;
88 report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
89 ::abort();
90 }
91 int i,j = 4;
92 double maxw = 0.;
93 for (i=0;i<_nbins;i++) {
94 _masses[i] = getArg(j++);
95 if (i>0 && _masses[i] <= _masses[i-1]) {
96 report(ERROR,"EvtGen") << "EvtVub generator expected "
97 << " mass bins in ascending order!"
98 << "Will terminate execution!"<<endl;
99 ::abort();
100 }
101 _weights[i] = getArg(j++);
102 if (_weights[i] < 0) {
103 report(ERROR,"EvtGen") << "EvtVub generator expected "
104 << " weights >= 0, but found: "
105 <<_weights[i] <<endl;
106 report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
107 ::abort();
108 }
109 if ( _weights[i] > maxw ) maxw = _weights[i];
110 }
111 if (maxw == 0) {
112 report(ERROR,"EvtGen") << "EvtVub generator expected at least one "
113 << " weight > 0, but found none! "
114 << "Will terminate execution!"<<endl;
115 ::abort();
116 }
117 for (i=0;i<_nbins;i++) _weights[i]/=maxw;
118
119 // the maximum dGamma*p2 value depends on alpha_s only:
120
121 const double dGMax0 = 3.;
122 _dGMax = 0.21344+8.905*_alphas;
123 if ( _dGMax < dGMax0 ) _dGMax = dGMax0;
124
125 // for the Fermi Motion we need a B-Meson mass - but it's not critical
126 // to get an exact value; in order to stay in the phase space for
127 // B+- and B0 use the smaller mass
128
129 EvtId BP=EvtPDL::getId("B+");
130 EvtId B0=EvtPDL::getId("B0");
131
132 double mB0 = EvtPDL::getMaxMass(B0);
133 double mBP = EvtPDL::getMaxMass(BP);
134
135 double mB = (mB0<mBP?mB0:mBP);
136
137 const double xlow = -_mb;
138 const double xhigh = mB-_mb;
139 const int aSize = 10000;
140
141 EvtPFermi pFermi(_a,mB,_mb);
142 // pf is the cumulative distribution
143 // normalized to 1.
144 _pf.resize(aSize);
145 for(i=0;i<aSize;i++){
146 double kplus = xlow + (double)(i+0.5)/((double)aSize)*(xhigh-xlow);
147 if ( i== 0 )
148 _pf[i] = pFermi.getFPFermi(kplus);
149 else
150 _pf[i] = _pf[i-1] + pFermi.getFPFermi(kplus);
151 }
152 for (i=0; i<_pf.size(); i++) _pf[i]/=_pf[_pf.size()-1];
153
154 // static EvtHepRandomEngine myEngine;
155
156 // _pFermi = new RandGeneral(myEngine,pf,aSize,0);
157 _dGamma = new EvtVubdGamma(_alphas);
158
159 // check that there are 3 daughters
160 checkNDaug(3);
161}
double abs(const EvtComplex &c)
@ ERROR
Definition EvtReport.hh:49
double getArg(int j)
void checkNDaug(int d1, int d2=-1)
Definition EvtId.hh:27
static double getMaxMass(EvtId i)
Definition EvtPDL.hh:50
static EvtId getId(const std::string &name)
Definition EvtPDL.cc:287

◆ initProbMax()

void EvtVub::initProbMax ( )
virtual

Reimplemented from EvtDecayBase.

Definition at line 163 of file EvtVub.cc.

163 {
164
165 noProbMax();
166
167}

The documentation for this class was generated from the following files: