00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "EvtGenBase/EvtPatches.hh"
00023 #include "EvtGenBase/EvtPatches.hh"
00024 #include "EvtGenBase/EvtParticle.hh"
00025 #include "EvtGenBase/EvtGenKine.hh"
00026 #include "EvtGenBase/EvtPDL.hh"
00027 #include "EvtGenBase/EvtReport.hh"
00028 #include "EvtGenBase/EvtTensor4C.hh"
00029 #include "EvtGenBase/EvtVector4C.hh"
00030 #include "EvtGenBase/EvtDiracSpinor.hh"
00031 #include "EvtGenBase/EvtSemiLeptonicVectorAmp.hh"
00032 #include "EvtGenBase/EvtId.hh"
00033 #include "EvtGenBase/EvtAmp.hh"
00034 #include "EvtGenBase/EvtSemiLeptonicFF.hh"
00035 using std::endl;
00036
00037 void EvtSemiLeptonicVectorAmp::CalcAmp( EvtParticle *parent,
00038 EvtAmp& amp,
00039 EvtSemiLeptonicFF *FormFactors ) {
00040
00041 static EvtId EM=EvtPDL::getId("e-");
00042 static EvtId MUM=EvtPDL::getId("mu-");
00043 static EvtId TAUM=EvtPDL::getId("tau-");
00044 static EvtId EP=EvtPDL::getId("e+");
00045 static EvtId MUP=EvtPDL::getId("mu+");
00046 static EvtId TAUP=EvtPDL::getId("tau+");
00047
00048 static EvtId D0=EvtPDL::getId("D0");
00049 static EvtId D0B=EvtPDL::getId("anti-D0");
00050 static EvtId DP=EvtPDL::getId("D+");
00051 static EvtId DM=EvtPDL::getId("D-");
00052 static EvtId DSM=EvtPDL::getId("D_s-");
00053 static EvtId DSP=EvtPDL::getId("D_s+");
00054
00055
00056
00057 EvtVector4R q = parent->getDaug(1)->getP4()
00058 + parent->getDaug(2)->getP4();
00059 double q2 = (q.mass2());
00060
00061 double a1f,a2f,vf,a0f,a3f;
00062 double m_meson = parent->getDaug(0)->mass();
00063
00064 FormFactors->getvectorff(parent->getId(),
00065 parent->getDaug(0)->getId(),
00066 q2,
00067 m_meson,
00068 &a1f,
00069 &a2f,
00070 &vf,
00071 &a0f);
00072
00073 double costhl_flag = 1.0;
00074
00075 if(parent->getId()==D0||parent->getId()==D0B||
00076 parent->getId()==DP||parent->getId()==DM) {
00077 costhl_flag = -1.0;
00078 }
00079 if(parent->getId()==DSP||parent->getId()==DSM) {
00080 costhl_flag = -1.0;
00081 }
00082 vf = vf * costhl_flag;
00083
00084 EvtVector4R p4b;
00085 p4b.set(parent->mass(),0.0,0.0,0.0);
00086
00087 EvtVector4R p4meson = parent->getDaug(0)->getP4();
00088
00089 EvtVector4C l1,l2;
00090
00091 EvtId l_num = parent->getDaug(1)->getId();
00092 double m_b = parent->mass();
00093
00094 a3f = ((m_b+m_meson)/(2.0*m_meson))*a1f -
00095 ((m_b-m_meson)/(2.0*m_meson))*a2f;
00096
00097 EvtTensor4C tds;
00098 if (l_num==EM||l_num==MUM||l_num==TAUM){
00099
00100 tds = a1f*(m_b+m_meson)*EvtTensor4C::g();
00101
00102 tds.addDirProd((-a2f/(m_b+m_meson))*p4b,p4b+p4meson);
00103 tds+=EvtComplex(0.0,vf/(m_b+m_meson))
00104 *dual(directProd(p4meson+p4b,p4b-p4meson));
00105
00106 tds.addDirProd((a0f-a3f)*2.0*(m_meson/q2)*p4b,p4b-p4meson);
00107
00108 l1=EvtLeptonVACurrent(parent->getDaug(1)->spParent(0),
00109 parent->getDaug(2)->spParentNeutrino());
00110 l2=EvtLeptonVACurrent(parent->getDaug(1)->spParent(1),
00111 parent->getDaug(2)->spParentNeutrino());
00112 }
00113 else{
00114 if (l_num==EP||l_num==MUP||l_num==TAUP){
00115 tds = a1f*(m_b+m_meson)*EvtTensor4C::g();
00116
00117 tds.addDirProd((-a2f/(m_b+m_meson))*p4b,p4b+p4meson);
00118 tds-=EvtComplex(0.0,vf/(m_b+m_meson))
00119 *dual(directProd(p4meson+p4b,p4b-p4meson));
00120
00121 tds.addDirProd((a0f-a3f)*2.0*(m_meson/q2)*p4b,p4b-p4meson);
00122
00123 l1=EvtLeptonVACurrent(parent->getDaug(2)->spParentNeutrino(),
00124 parent->getDaug(1)->spParent(0));
00125 l2=EvtLeptonVACurrent(parent->getDaug(2)->spParentNeutrino(),
00126 parent->getDaug(1)->spParent(1));
00127 }
00128 else{
00129 report(ERROR,"EvtGen") << "Wrong lepton number"<<endl;
00130 }
00131 }
00132
00133 EvtVector4C et0=tds.cont1( parent->getDaug(0)->epsParent(0).conj() );
00134 EvtVector4C et1=tds.cont1( parent->getDaug(0)->epsParent(1).conj() );
00135 EvtVector4C et2=tds.cont1( parent->getDaug(0)->epsParent(2).conj() );
00136
00137
00138 amp.vertex(0,0,l1.cont(et0));
00139 amp.vertex(0,1,l2.cont(et0));
00140
00141 amp.vertex(1,0,l1.cont(et1));
00142 amp.vertex(1,1,l2.cont(et1));
00143
00144 amp.vertex(2,0,l1.cont(et2));
00145 amp.vertex(2,1,l2.cont(et2));
00146
00147 return;
00148 }
00149