1 //--------------------------------------------------------------------------
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.
8 // Copyright Information: See EvtGen/COPYRIGHT
9 // Copyright (C) 2001 Caltech
11 // Module: EvtLNuGamma.cc
13 // Description: B+ -> l+ nu gamma
16 // Modification history:
18 // Edward Chen April 24, 2001 Module created
20 //------------------------------------------------------------------------
22 #include "EvtGenBase/EvtPatches.hh"
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"
37 EvtLNuGamma::EvtLNuGamma(){
41 EvtLNuGamma::~EvtLNuGamma() {}
43 std::string EvtLNuGamma::getName(){
50 EvtDecayBase* EvtLNuGamma::clone(){
52 return new EvtLNuGamma;
56 void EvtLNuGamma::init(){
58 // check that there are 3 or 4 arguments
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.
76 checkSpinParent(EvtSpinType::SCALAR);
78 checkSpinDaughter(0,EvtSpinType::DIRAC);
79 checkSpinDaughter(1,EvtSpinType::NEUTRINO);
80 checkSpinDaughter(2,EvtSpinType::PHOTON);
83 void EvtLNuGamma::initProbMax(){
90 void EvtLNuGamma::decay(EvtParticle *p){
92 static EvtId BM=EvtPDL::getId("B-");
93 static EvtId DM=EvtPDL::getId("D-");
94 p->initializePhaseSpace(getNDaug(),getDaugs());
98 EvtParticle *lept, *neut,*phot;
103 EvtVector4C lept1,lept2,photon1,photon2;
105 if (p->getId()==BM||p->getId()==DM) {
106 lept1=EvtLeptonVACurrent(lept->spParent(0),neut->spParentNeutrino());
107 lept2=EvtLeptonVACurrent(lept->spParent(1),neut->spParentNeutrino());
110 lept1=EvtLeptonVACurrent(neut->spParentNeutrino(),lept->spParent(0));
111 lept2=EvtLeptonVACurrent(neut->spParentNeutrino(),lept->spParent(1));
116 EvtVector4R photp = phot->getP4(); // Photon 4-momentum in parent rest frame
117 double photE = photp.get(0); // Photon energy in parent rest frame
119 EvtVector4C photone1 = phot->epsParentPhoton(0).conj();
120 EvtVector4C photone2 = phot->epsParentPhoton(1).conj();
122 EvtVector4R parVelocity(1,0,0,0); // Parent velocity in parent rest-frame
126 fv = getFormFactor(photE);
130 else if (p->getId()==BM||p->getId()==DM) {
137 EvtVector4C temp1a = dual(directProd(parVelocity,photp)).cont2(photone1);
138 EvtVector4C temp2a = dual(directProd(parVelocity,photp)).cont2(photone2);
140 EvtVector4C temp1b = (photone1)*(parVelocity*photp);
141 EvtVector4C temp1c = (photp)*(photone1*parVelocity);
143 EvtVector4C temp2b = (photone2)*(parVelocity*photp);
144 EvtVector4C temp2c = (photp)*(photone2*parVelocity);
146 photon1 = (temp1a*fv) + (myI*fa*(temp1b - temp1c));
147 photon2 = (temp2a*fv) + (myI*fa*(temp2b - temp2c));
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));
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
165 double formFactor = 0;
169 if (photonEnergy > getArg(0)){
170 formFactor = (1/photonEnergy) * ((qu*getArg(1)) - (qb/getArg(2)));