EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
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
26#include "EvtGenBase/EvtPDL.hh"
32
35
36#include <ctype.h>
37#include <stdlib.h>
38
39std::string EvtBcVNpi::getName() const
40{
41 return "BC_VNPI";
42}
43
45{
46 return new EvtBcVNpi;
47}
48
49//======================================================
51{
52 //cout<<"BcVNpi::init()"<<endl;
53
54 checkNArg( 1 );
57 for ( int i = 1; i <= ( getNDaug() - 1 ); i++ ) {
59 };
60
61 if ( getNDaug() < 2 || getNDaug() > 6 ) {
62 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
63 << "Have not yet implemented this final state in BcVNpi model"
64 << endl;
65 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
66 for ( int id = 0; id < ( getNDaug() - 1 ); id++ )
67 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
68 << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
69 << endl;
70 return;
71 }
72
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;
75
76 m_idVector = getDaug( 0 ).getId();
77 m_whichfit = int( getArg( 0 ) + 0.1 );
78 // cout<<"BcVNpi: m_whichfit ="<<m_whichfit<<" m_idVector="<<m_idVector<<endl;
79 m_ffmodel = std::make_unique<EvtBCVFF>( m_idVector, m_whichfit );
80
81 m_wcurr = std::make_unique<EvtWnPi>();
82
83 m_nCall = 0;
84}
85
86//======================================================
88{
89 // cout<<"BcVNpi::initProbMax()"<<endl;
90 if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() && m_whichfit == 1 &&
91 getNDaug() == 6 )
92 setProbMax( 720000. );
93 else if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() &&
94 m_whichfit == 2 && getNDaug() == 6 )
95 setProbMax( 471817. );
96 else if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() &&
97 m_whichfit == 1 && getNDaug() == 4 )
98 setProbMax( 42000. );
99 else if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() &&
100 m_whichfit == 2 && getNDaug() == 4 )
101 setProbMax( 16000. );
102
103 else if ( m_idVector == EvtPDL::getId( "psi(2S)" ).getId() &&
104 m_whichfit == 1 && getNDaug() == 4 )
105 setProbMax( 1200. );
106 else if ( m_idVector == EvtPDL::getId( "psi(2S)" ).getId() &&
107 m_whichfit == 2 && getNDaug() == 4 )
108 setProbMax( 2600. );
109 else if ( m_idVector == EvtPDL::getId( "psi(2S)" ).getId() &&
110 m_whichfit == 1 && getNDaug() == 6 )
111 setProbMax( 40000. );
112 else if ( m_idVector == EvtPDL::getId( "psi(2S)" ).getId() &&
113 m_whichfit == 2 && getNDaug() == 6 )
114 setProbMax( 30000. );
115}
116
117//======================================================
118void EvtBcVNpi::decay( EvtParticle* root_particle )
119{
120 ++m_nCall;
121 // cout<<"BcVNpi::decay()"<<endl;
122 root_particle->initializePhaseSpace( getNDaug(), getDaugs() );
123
124 EvtVector4R p4b( root_particle->mass(), 0., 0., 0. ), // Bc momentum
125 p4meson = root_particle->getDaug( 0 )->getP4(), // J/psi momenta
126 Q = p4b - p4meson;
127 double Q2 = Q.mass2();
128
129 // check pi-mesons and calculate hadronic current
130 EvtVector4C hardCur;
131 // bool foundHadCurr=false;
132 if ( getNDaug() == 2 ) {
133 hardCur = m_wcurr->WCurrent( root_particle->getDaug( 1 )->getP4() );
134 // foundHadCurr=true;
135 } else if ( getNDaug() == 3 ) {
136 hardCur = m_wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
137 root_particle->getDaug( 2 )->getP4() );
138 // foundHadCurr=true;
139 } else if ( getNDaug() == 4 ) {
140 hardCur = m_wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
141 root_particle->getDaug( 2 )->getP4(),
142 root_particle->getDaug( 3 )->getP4() );
143 // foundHadCurr=true;
144 } else if ( getNDaug() ==
145 6 ) // Bc -> psi pi+ pi+ pi- pi- pi+ from [Kuhn, Was, hep-ph/0602162
146 {
147 hardCur = m_wcurr->WCurrent( root_particle->getDaug( 1 )->getP4(),
148 root_particle->getDaug( 2 )->getP4(),
149 root_particle->getDaug( 3 )->getP4(),
150 root_particle->getDaug( 4 )->getP4(),
151 root_particle->getDaug( 5 )->getP4() );
152 // foundHadCurr=true;
153 } else {
154 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
155 << "Have not yet implemented this final state in BCNPI model"
156 << endl;
157 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
158 int id;
159 for ( id = 0; id < ( getNDaug() - 1 ); id++ )
160 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
161 << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
162 << endl;
163 ::abort();
164 };
165
166 // calculate Bc -> V W form-factors
167 double a1f, a2f, vf, a0f;
168 double m_meson = root_particle->getDaug( 0 )->mass();
169 double m_b = root_particle->mass();
170 m_ffmodel->getvectorff( root_particle->getId(),
171 root_particle->getDaug( 0 )->getId(), Q2, m_meson,
172 &a1f, &a2f, &vf, &a0f );
173 double a3f = ( ( m_b + m_meson ) / ( 2.0 * m_meson ) ) * a1f -
174 ( ( m_b - m_meson ) / ( 2.0 * m_meson ) ) * a2f;
175
176 // calculate Bc -> V W current
177 EvtTensor4C H;
178 H = a1f * ( m_b + m_meson ) * EvtTensor4C::g();
179 H.addDirProd( ( -a2f / ( m_b + m_meson ) ) * p4b, p4b + p4meson );
180 H += EvtComplex( 0.0, vf / ( m_b + m_meson ) ) *
181 dual( EvtGenFunctions::directProd( p4meson + p4b, p4b - p4meson ) );
182 H.addDirProd( ( a0f - a3f ) * 2.0 * ( m_meson / Q2 ) * p4b, p4b - p4meson );
183 EvtVector4C Heps = H.cont2( hardCur );
184
185 for ( int i = 0; i < 3; i++ ) {
186 EvtVector4C eps = root_particle->getDaug( 0 )
187 ->epsParent( i )
188 .conj(); // psi-meson polarization vector
189 EvtComplex amp = eps * Heps;
190 vertex( i, amp );
191 };
192}
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtTensor4C dual(const EvtTensor4C &t2)
std::string getName() const override
Definition EvtBcVNpi.cpp:39
void initProbMax() override
Definition EvtBcVNpi.cpp:87
int m_nCall
Definition EvtBcVNpi.hh:47
int m_whichfit
Definition EvtBcVNpi.hh:48
void decay(EvtParticle *p) override
EvtDecayBase * clone() const override
Definition EvtBcVNpi.cpp:44
int m_idVector
Definition EvtBcVNpi.hh:48
void init() override
Definition EvtBcVNpi.cpp:50
std::unique_ptr< EvtBCVFF > m_ffmodel
Definition EvtBcVNpi.hh:49
std::unique_ptr< EvtWnPi > m_wcurr
Definition EvtBcVNpi.hh:50
void vertex(const EvtComplex &amp)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
double getArg(unsigned int j)
void setProbMax(double prbmx)
EvtId getDaug(int i) const
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
int getId() const
Definition EvtId.hh:41
static std::string name(EvtId i)
Definition EvtPDL.cpp:376
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
virtual EvtVector4C epsParent(int i) const
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
EvtId getId() const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
static const EvtTensor4C & g()
EvtTensor4C & addDirProd(const EvtVector4R &p1, const EvtVector4R &p2)
EvtVector4C cont2(const EvtVector4C &v4) const
EvtVector4C conj() const
double mass2() const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)