evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtBcVNpi.cpp
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
22 
24 #include "EvtGenBase/EvtGenKine.hh"
25 #include "EvtGenBase/EvtIdSet.hh"
26 #include "EvtGenBase/EvtPDL.hh"
27 #include "EvtGenBase/EvtParser.hh"
29 #include "EvtGenBase/EvtPatches.hh"
30 #include "EvtGenBase/EvtReport.hh"
33 
35 #include "EvtGenModels/EvtWnPi.hh"
36 
37 #include <ctype.h>
38 #include <stdlib.h>
39 
40 std::string EvtBcVNpi::getName()
41 {
42  return "BC_VNPI";
43 }
44 
46 {
47  return new EvtBcVNpi;
48 }
49 
50 //======================================================
52 {
53  //cout<<"BcVNpi::init()"<<endl;
54 
55  checkNArg( 1 );
58  for ( int i = 1; i <= ( getNDaug() - 1 ); i++ ) {
60  };
61 
62  if ( getNDaug() < 2 || getNDaug() > 6 ) {
63  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
64  << "Have not yet implemented this final state in BcVNpi model"
65  << endl;
66  EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
67  for ( int id = 0; id < ( getNDaug() - 1 ); id++ )
68  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
69  << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
70  << endl;
71  return;
72  }
73 
74  // for(int i=0; i<getNDaug(); i++)
75  // cout<<"BcVNpi::init \t\t daughter "<<i<<" : "<<getDaug(i).getId()<<" "<<EvtPDL::name(getDaug(i)).c_str()<<endl;
76 
77  idVector = getDaug( 0 ).getId();
78  whichfit = int( getArg( 0 ) + 0.1 );
79  // cout<<"BcVNpi: whichfit ="<<whichfit<<" idVector="<<idVector<<endl;
80  ffmodel = std::make_unique<EvtBCVFF>( idVector, whichfit );
81 
82  wcurr = std::make_unique<EvtWnPi>();
83 
84  nCall = 0;
85 }
86 
87 //======================================================
89 {
90  // cout<<"BcVNpi::initProbMax()"<<endl;
91  if ( idVector == EvtPDL::getId( "J/psi" ).getId() && whichfit == 1 &&
92  getNDaug() == 6 )
93  setProbMax( 720000. );
94  else if ( idVector == EvtPDL::getId( "J/psi" ).getId() && whichfit == 2 &&
95  getNDaug() == 6 )
96  setProbMax( 471817. );
97  else if ( idVector == EvtPDL::getId( "J/psi" ).getId() && whichfit == 1 &&
98  getNDaug() == 4 )
99  setProbMax( 42000. );
100  else if ( idVector == EvtPDL::getId( "J/psi" ).getId() && whichfit == 2 &&
101  getNDaug() == 4 )
102  setProbMax( 16000. );
103 
104  else if ( idVector == EvtPDL::getId( "psi(2S)" ).getId() && whichfit == 1 &&
105  getNDaug() == 4 )
106  setProbMax( 1200. );
107  else if ( idVector == EvtPDL::getId( "psi(2S)" ).getId() && whichfit == 2 &&
108  getNDaug() == 4 )
109  setProbMax( 2600. );
110  else if ( idVector == EvtPDL::getId( "psi(2S)" ).getId() && whichfit == 1 &&
111  getNDaug() == 6 )
112  setProbMax( 40000. );
113  else if ( idVector == EvtPDL::getId( "psi(2S)" ).getId() && whichfit == 2 &&
114  getNDaug() == 6 )
115  setProbMax( 30000. );
116 }
117 
118 //======================================================
119 void EvtBcVNpi::decay( EvtParticle* root_particle )
120 {
121  ++nCall;
122  // cout<<"BcVNpi::decay()"<<endl;
123  root_particle->initializePhaseSpace( getNDaug(), getDaugs() );
124 
125  EvtVector4R p4b( root_particle->mass(), 0., 0., 0. ), // Bc momentum
126  p4meson = root_particle->getDaug( 0 )->getP4(), // J/psi momenta
127  Q = p4b - p4meson;
128  double Q2 = Q.mass2();
129 
130  // check pi-mesons and calculate hadronic current
131  EvtVector4C hardCur;
132  // bool foundHadCurr=false;
133  if ( getNDaug() == 2 ) {
134  hardCur = wcurr->WCurrent( root_particle->getDaug( 1 )->getP4() );
135  // foundHadCurr=true;
136  } else if ( getNDaug() == 3 ) {
137  hardCur = wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
138  root_particle->getDaug( 2 )->getP4() );
139  // foundHadCurr=true;
140  } else if ( getNDaug() == 4 ) {
141  hardCur = wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
142  root_particle->getDaug( 2 )->getP4(),
143  root_particle->getDaug( 3 )->getP4() );
144  // foundHadCurr=true;
145  } else if ( getNDaug() ==
146  6 ) // Bc -> psi pi+ pi+ pi- pi- pi+ from [Kuhn, Was, hep-ph/0602162
147  {
148  hardCur = wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
149  root_particle->getDaug( 2 )->getP4(),
150  root_particle->getDaug( 3 )->getP4(),
151  root_particle->getDaug( 4 )->getP4(),
152  root_particle->getDaug( 5 )->getP4() );
153  // foundHadCurr=true;
154  } else {
155  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
156  << "Have not yet implemented this final state in BCNPI model"
157  << endl;
158  EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
159  int id;
160  for ( id = 0; id < ( getNDaug() - 1 ); id++ )
161  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
162  << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
163  << endl;
164  ::abort();
165  };
166 
167  // calculate Bc -> V W form-factors
168  double a1f, a2f, vf, a0f;
169  double m_meson = root_particle->getDaug( 0 )->mass();
170  double m_b = root_particle->mass();
171  ffmodel->getvectorff( root_particle->getId(),
172  root_particle->getDaug( 0 )->getId(), Q2, m_meson,
173  &a1f, &a2f, &vf, &a0f );
174  double a3f = ( ( m_b + m_meson ) / ( 2.0 * m_meson ) ) * a1f -
175  ( ( m_b - m_meson ) / ( 2.0 * m_meson ) ) * a2f;
176 
177  // calculate Bc -> V W current
178  EvtTensor4C H;
179  H = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
180  H.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
181  H += EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
182  dual( EvtGenFunctions::directProd( p4meson + p4b, p4b - p4meson ) );
183  H.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / Q2 ) * p4b, p4b - p4meson );
184  EvtVector4C Heps = H.cont2( hardCur );
185 
186  for ( int i = 0; i < 4; i++ ) {
187  EvtVector4C eps = root_particle->getDaug( 0 )
188  ->epsParent( i )
189  .conj(); // psi-meson polarization vector
190  EvtComplex amp = eps * Heps;
191  vertex( i, amp );
192  };
193 }
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)
void initProbMax() override
Definition: EvtBcVNpi.cpp:88
static std::string name(EvtId i)
Definition: EvtPDL.cpp:382
std::string getName() override
Definition: EvtBcVNpi.cpp:40
static const EvtTensor4C & g()
Definition: EvtTensor4C.cpp:44
double getArg(unsigned int j)
EvtTensor4C dual(const EvtTensor4C &t2)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
std::unique_ptr< EvtBCVFF > ffmodel
Definition: EvtBcVNpi.hh:49
std::unique_ptr< EvtWnPi > wcurr
Definition: EvtBcVNpi.hh:50
EvtVector4C cont2(const EvtVector4C &v4) const
EvtId getId() const
int idVector
Definition: EvtBcVNpi.hh:48
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
double mass2() const
Definition: EvtVector4R.hh:100
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
virtual EvtVector4C epsParent(int i) const
void checkSpinParent(EvtSpinType::spintype sp)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
void decay(EvtParticle *p) override
Definition: EvtBcVNpi.cpp:119
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
EvtTensor3C eps(const EvtVector3R &v)
int whichfit
Definition: EvtBcVNpi.hh:48
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
double mass() const
int getId() const
Definition: EvtId.hh:42
int getNDaug() const
Definition: EvtDecayBase.hh:65
void init() override
Definition: EvtBcVNpi.cpp:51
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtDecayBase * clone() override
Definition: EvtBcVNpi.cpp:45
EvtVector4C conj() const
Definition: EvtVector4C.hh:202
int nCall
Definition: EvtBcVNpi.hh:47
EvtTensor4C & addDirProd(const EvtVector4R &p1, const EvtVector4R &p2)
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67