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) 1998 Caltech, UCSB
11 // Module: EvtBcVNpi.cc
13 // Description: Module to implement Bc -> psi + (n pi) decays
15 // Modification history:
17 // AVL July 6, 2012 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
28 #include "EvtGenBase/EvtParticle.hh"
29 #include "EvtGenBase/EvtPDL.hh"
30 #include "EvtGenBase/EvtGenKine.hh"
31 #include "EvtGenModels/EvtTauHadnu.hh"
32 #include "EvtGenBase/EvtDiracSpinor.hh"
33 #include "EvtGenBase/EvtReport.hh"
34 #include "EvtGenBase/EvtVector4C.hh"
35 #include "EvtGenBase/EvtTensor4C.hh"
36 #include "EvtGenBase/EvtIdSet.hh"
37 #include "EvtGenBase/EvtParser.hh"
39 #include "EvtGenModels/EvtBcVNpi.hh"
40 #include "EvtGenModels/EvtWnPi.hh"
44 EvtBcVNpi::~EvtBcVNpi() {
45 // cout<<"BcVNpi::destructor : nCall = "<<nCall<<" getProbMax(-1) = "<<getProbMax(-1)<<endl;
49 std::string EvtBcVNpi::getName(){ return "BC_VNPI";}
51 EvtDecayBase* EvtBcVNpi::clone() { return new EvtBcVNpi;}
53 //======================================================
54 void EvtBcVNpi::init(){
55 //cout<<"BcVNpi::init()"<<endl;
58 checkSpinParent(EvtSpinType::SCALAR);
59 checkSpinDaughter(0,EvtSpinType::VECTOR);
60 for (int i=1; i<=(getNDaug()-1);i++) {
61 checkSpinDaughter(i,EvtSpinType::SCALAR);
64 if(getNDaug()<2 || getNDaug()>6) {
65 report(ERROR,"EvtGen") << "Have not yet implemented this final state in BcVNpi model" << endl;
66 report(ERROR,"EvtGen") << "Ndaug="<<getNDaug() << endl;
67 for ( int id=0; id<(getNDaug()-1); id++ )
68 report(ERROR,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
73 // for(int i=0; i<getNDaug(); i++)
74 // cout<<"BcVNpi::init \t\t daughter "<<i<<" : "<<getDaug(i).getId()<<" "<<EvtPDL::name(getDaug(i)).c_str()<<endl;
76 idVector = getDaug(0).getId();
77 whichfit = int(getArg(0)+0.1);
78 // cout<<"BcVNpi: whichfit ="<<whichfit<<" idVector="<<idVector<<endl;
79 ffmodel = new EvtBCVFF(idVector,whichfit);
81 wcurr = new EvtWnPi();
86 //======================================================
87 void EvtBcVNpi::initProbMax() {
88 // cout<<"BcVNpi::initProbMax()"<<endl;
89 if(idVector == EvtPDL::getId("J/psi").getId() && whichfit == 1 && getNDaug()==6) setProbMax(720000.);
90 else if(idVector == EvtPDL::getId("J/psi").getId() && whichfit == 2 && getNDaug()==6) setProbMax(471817.);
91 else if(idVector == EvtPDL::getId("J/psi").getId() && whichfit == 1 && getNDaug()==4) setProbMax(42000.);
92 else if(idVector == EvtPDL::getId("J/psi").getId() && whichfit == 2 && getNDaug()==4) setProbMax(16000.);
94 else if(idVector == EvtPDL::getId("psi(2S)").getId() && whichfit == 1 && getNDaug()==4) setProbMax(1200.);
95 else if(idVector == EvtPDL::getId("psi(2S)").getId() && whichfit == 2 && getNDaug()==4) setProbMax(2600.);
96 else if(idVector == EvtPDL::getId("psi(2S)").getId() && whichfit == 1 && getNDaug()==6) setProbMax(40000.);
97 else if(idVector == EvtPDL::getId("psi(2S)").getId() && whichfit == 2 && getNDaug()==6) setProbMax(30000.);
100 //======================================================
101 void EvtBcVNpi::decay( EvtParticle *root_particle ) {
103 // cout<<"BcVNpi::decay()"<<endl;
104 root_particle->initializePhaseSpace(getNDaug(),getDaugs());
107 p4b(root_particle->mass(), 0., 0., 0.), // Bc momentum
108 p4meson=root_particle->getDaug(0)->getP4(), // J/psi momenta
113 // check pi-mesons and calculate hadronic current
115 // bool foundHadCurr=false;
116 if( getNDaug() == 2) {
117 hardCur = wcurr->WCurrent( root_particle->getDaug(1)->getP4() );
118 // foundHadCurr=true;
120 else if( getNDaug() == 3) {
121 hardCur = wcurr->WCurrent( root_particle->getDaug(1)->getP4() ,
122 root_particle->getDaug(2)->getP4()
124 // foundHadCurr=true;
126 else if( getNDaug() == 4) {
127 hardCur = wcurr->WCurrent( root_particle->getDaug(1)->getP4() ,
128 root_particle->getDaug(2)->getP4(),
129 root_particle->getDaug(3)->getP4()
131 // foundHadCurr=true;
133 else if( getNDaug() == 6) // Bc -> psi pi+ pi+ pi- pi- pi+ from [Kuhn, Was, hep-ph/0602162
136 hardCur = wcurr->WCurrent(root_particle->getDaug(1)->getP4(),
137 root_particle->getDaug(2)->getP4(),
138 root_particle->getDaug(3)->getP4(),
139 root_particle->getDaug(4)->getP4(),
140 root_particle->getDaug(5)->getP4()
142 // foundHadCurr=true;
145 report(ERROR,"EvtGen") << "Have not yet implemented this final state in BCNPI model" << endl;
146 report(ERROR,"EvtGen") << "Ndaug="<<getNDaug() << endl;
148 for ( id=0; id<(getNDaug()-1); id++ )
149 report(ERROR,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
153 // calculate Bc -> V W form-factors
154 double a1f, a2f, vf, a0f;
155 double m_meson = root_particle->getDaug(0)->mass();
156 double m_b = root_particle->mass();
157 ffmodel->getvectorff(root_particle->getId(),
158 root_particle->getDaug(0)->getId(),
165 double a3f = ((m_b+m_meson)/(2.0*m_meson))*a1f -
166 ((m_b-m_meson)/(2.0*m_meson))*a2f;
168 // calculate Bc -> V W current
170 H = a1f*(m_b+m_meson)*EvtTensor4C::g();
171 H.addDirProd((-a2f/(m_b+m_meson))*p4b,p4b+p4meson);
172 H+=EvtComplex(0.0,vf/(m_b+m_meson))*dual(EvtGenFunctions::directProd(p4meson+p4b,p4b-p4meson));
173 H.addDirProd((a0f-a3f)*2.0*(m_meson/Q2)*p4b,p4b-p4meson);
174 EvtVector4C Heps=H.cont2(hardCur);
176 for(int i=0; i<4; i++) {
177 EvtVector4C eps=root_particle->getDaug(0)->epsParent(i).conj(); // psi-meson polarization vector
178 EvtComplex amp=eps*Heps;