]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenModels/EvtLNuGamma.cxx
If default parameters are allowed and runNumber is provided, search first for the...
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenModels / EvtLNuGamma.cxx
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) 2001      Caltech
10 //
11 // Module: EvtLNuGamma.cc
12 //
13 // Description: B+ -> l+ nu gamma
14 //             
15 //
16 // Modification history:
17 //
18 //    Edward Chen   April 24, 2001           Module created
19 //
20 //------------------------------------------------------------------------
21 //
22 #include "EvtGenBase/EvtPatches.hh"
23 #include <stdlib.h>
24 #include <iostream>
25 #include <string>
26 #include "EvtGenBase/EvtParticle.hh"
27 #include "EvtGenBase/EvtPDL.hh"
28 #include "EvtGenBase/EvtGenKine.hh"
29 #include "EvtGenModels/EvtLNuGamma.hh"
30 #include "EvtGenBase/EvtDiracSpinor.hh"
31 #include "EvtGenBase/EvtReport.hh"
32 #include "EvtGenBase/EvtComplex.hh"
33 #include "EvtGenBase/EvtVector4C.hh"
34 #include "EvtGenBase/EvtVector4R.hh"
35 #include "EvtGenBase/EvtTensor4C.hh"
36
37 EvtLNuGamma::EvtLNuGamma(){
38   _fafvzero = false;
39 }
40
41 EvtLNuGamma::~EvtLNuGamma() {}
42
43 std::string EvtLNuGamma::getName(){
44
45   return "LNUGAMMA";     
46
47 }
48
49
50 EvtDecayBase* EvtLNuGamma::clone(){
51
52   return new EvtLNuGamma;
53
54 }
55
56 void EvtLNuGamma::init(){
57
58   // check that there are 3 or 4 arguments
59   checkNArg(3,4);
60   checkNDaug(3);
61
62   if (getNArg() == 4){
63     //      Argv[3] is a flag set to 0 if abs(f_a/f_v) is 1 
64     //       and not set to 0 if f_a/f_v is set to 0.
65     if (getArg(3) > 0){      
66       _fafvzero = true;
67     }
68     else{
69       _fafvzero = false;
70     }
71   }
72   else{
73     _fafvzero = false;
74   }
75
76   checkSpinParent(EvtSpinType::SCALAR);
77
78   checkSpinDaughter(0,EvtSpinType::DIRAC);
79   checkSpinDaughter(1,EvtSpinType::NEUTRINO);
80   checkSpinDaughter(2,EvtSpinType::PHOTON);
81 }
82
83 void EvtLNuGamma::initProbMax(){
84
85
86   setProbMax(7000.0);
87
88 }
89
90 void EvtLNuGamma::decay(EvtParticle *p){
91
92   static EvtId BM=EvtPDL::getId("B-");
93   static EvtId DM=EvtPDL::getId("D-");
94   p->initializePhaseSpace(getNDaug(),getDaugs());
95
96   EvtComplex myI(0,1);
97
98   EvtParticle *lept, *neut,*phot;
99   lept=p->getDaug(0);
100   neut=p->getDaug(1);
101   phot=p->getDaug(2);
102
103   EvtVector4C lept1,lept2,photon1,photon2;
104
105   if (p->getId()==BM||p->getId()==DM) {
106     lept1=EvtLeptonVACurrent(lept->spParent(0),neut->spParentNeutrino());
107     lept2=EvtLeptonVACurrent(lept->spParent(1),neut->spParentNeutrino());
108   }
109   else{
110     lept1=EvtLeptonVACurrent(neut->spParentNeutrino(),lept->spParent(0));
111     lept2=EvtLeptonVACurrent(neut->spParentNeutrino(),lept->spParent(1));
112   }
113
114
115
116   EvtVector4R photp = phot->getP4();  // Photon 4-momentum in parent rest frame
117   double photE = photp.get(0);  // Photon energy in parent rest frame
118
119   EvtVector4C photone1 = phot->epsParentPhoton(0).conj();
120   EvtVector4C photone2 = phot->epsParentPhoton(1).conj();
121
122   EvtVector4R parVelocity(1,0,0,0);  // Parent velocity in parent rest-frame
123
124   double fv,fa;
125
126   fv = getFormFactor(photE);
127   if (_fafvzero){
128     fa = 0.0;
129   }
130   else if (p->getId()==BM||p->getId()==DM) {
131     fa = - fv;
132   }
133   else{
134     fa = fv;
135   }
136
137   EvtVector4C temp1a = dual(directProd(parVelocity,photp)).cont2(photone1);
138   EvtVector4C temp2a = dual(directProd(parVelocity,photp)).cont2(photone2);
139
140   EvtVector4C temp1b = (photone1)*(parVelocity*photp);
141   EvtVector4C temp1c = (photp)*(photone1*parVelocity);
142
143   EvtVector4C temp2b = (photone2)*(parVelocity*photp);
144   EvtVector4C temp2c = (photp)*(photone2*parVelocity);
145
146   photon1 = (temp1a*fv) + (myI*fa*(temp1b - temp1c));
147   photon2 = (temp2a*fv) + (myI*fa*(temp2b - temp2c));
148
149   vertex(0,0,lept1.cont(photon1));
150   vertex(0,1,lept1.cont(photon2));
151   vertex(1,0,lept2.cont(photon1));
152   vertex(1,1,lept2.cont(photon2));
153   
154   return;
155
156 }
157
158 double EvtLNuGamma::getFormFactor(double photonEnergy){
159   // Arg[0] = photon mass cutoff (GeV)
160   // Arg[1] = R (GeV^(-1))
161   // Arg[2] = m_b (GeV)
162   // Using Korchemsky et al. Phy Rev D 61 (2000) 114510
163   // Up to a constant
164   
165   double formFactor = 0;
166   double qu = 2./3.;
167   double qb = -1./3.;
168
169   if (photonEnergy > getArg(0)){
170     formFactor = (1/photonEnergy) * ((qu*getArg(1)) - (qb/getArg(2)));
171   }
172   return formFactor;
173 }