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
EvtBcVPPHad.cpp
Go to the documentation of this file.
1/***********************************************************************
2* Copyright 1998-2023 CERN for the benefit of the EvtGen authors *
3* *
4* This file is part of EvtGen. *
5* *
6* EvtGen is free software: you can redistribute it and/or modify *
7* it under the terms of the GNU General Public License as published by *
8* the Free Software Foundation, either version 3 of the License, or *
9* (at your option) any later version. *
10* *
11* EvtGen is distributed in the hope that it will be useful, *
12* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14* GNU General Public License for more details. *
15* *
16* You should have received a copy of the GNU General Public License *
17* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
18***********************************************************************/
19
21
24#include "EvtGenBase/EvtPDL.hh"
30
31#include <iostream>
32
33std::string EvtBcVPPHad::getName() const
34{
35 return "BC_VPPHAD";
36}
37
39{
40 return new EvtBcVPPHad;
41}
42
43//======================================================
44
46{
47 checkNArg( 1 );
52 for ( int i = 3; i <= ( getNDaug() - 1 ); i++ ) {
54 }
55
56 m_idVector = getDaug( 0 ).getId();
57 m_whichFit = int( getArg( 0 ) + 0.1 );
58 m_FFModel = std::make_unique<EvtBCVFF2>( m_idVector, m_whichFit );
59
60 m_WCurr = std::make_unique<EvtWHad>();
61
62 // determine the code of final hadronic state
63 const EvtIdSet thePis{ "pi+", "pi-", "pi0" };
64 const EvtIdSet theK{ "K+", "K-", "K_S0" };
65 const EvtIdSet thePs{ "p+", "anti-p-" };
66
67 if ( getNDaug() == 4 && thePs.contains( getDaug( 1 ) ) &&
68 thePs.contains( getDaug( 2 ) ) && thePis.contains( getDaug( 3 ) ) ) {
69 m_outCode = 1; // p+ p- pi+
70 } else {
71 EvtGenReport( EVTGEN_ERROR, "EvtBcPPHad::init has unknown decay mode" );
72 }
73 EvtGenReport( EVTGEN_INFO, "EvtBcVPPHad" )
74 << ": m_outCode = " << m_outCode << ", m_whichFit = " << m_whichFit
75 << std::endl;
76}
77
78//======================================================
79
81{
82 if ( m_outCode == 1 ) {
83 // p+ p- pi+
84 if ( m_idVector == EvtPDL::getId( "J/psi" ).getId() ) {
85 if ( m_whichFit == 2 ) {
86 setProbMax( 550.0 );
87 } else {
88 setProbMax( 1100.0 );
89 }
90 } else if ( m_idVector == EvtPDL::getId( "psi(2S)" ).getId() ) {
91 if ( m_whichFit == 2 ) {
92 setProbMax( 7.0 );
93 } else {
94 setProbMax( 50.0 );
95 }
96 }
97 } else {
100 "probmax: Have not yet implemented this final state in BC_VPPHAD model, m_outCode = " )
101 << m_outCode << std::endl;
102 }
103}
104
105//======================================================
106EvtVector4C EvtBcVPPHad::hardCurrPP( EvtParticle* parent, int i1, int i2 ) const
107{
108 EvtVector4C hardCur;
109 const EvtVector4R p1 = parent->getDaug( 1 )->getP4();
110 const EvtDiracSpinor sp1 = parent->getDaug( 1 )->spParent( i1 );
111
112 const EvtVector4R p2 = parent->getDaug( 2 )->getP4();
113 const EvtDiracSpinor sp2 = parent->getDaug( 2 )->spParent( i2 );
114
115 if ( m_outCode == 1 ) {
116 const EvtVector4R k = parent->getDaug( 3 )->getP4();
117 hardCur = m_WCurr->WCurrent_ppPi( p1, sp1, p2, sp2, k );
118 }
119 return hardCur;
120}
121
122//======================================================
124{
125 parent->initializePhaseSpace( getNDaug(), getDaugs() );
126
127 EvtParticle* Jpsi = parent->getDaug( 0 );
128
129 const EvtVector4R p4b( parent->mass(), 0., 0., 0. ), // Bc momentum
130 p4meson = Jpsi->getP4(), // J/psi momenta
131 Q = p4b - p4meson, p4Sum = p4meson + p4b;
132 const double Q2 = Q.mass2();
133
134 // Calculate Bc -> V W form-factors
135 double a1f( 0.0 ), a2f( 0.0 ), vf( 0.0 ), a0f( 0.0 );
136
137 const double mMeson = Jpsi->mass();
138 const double mB = parent->mass();
139 const double mVar = mB + mMeson;
140
141 m_FFModel->getvectorff( parent->getId(), Jpsi->getId(), Q2, mMeson, &a1f,
142 &a2f, &vf, &a0f );
143
144 const double a3f = ( mVar / ( 2.0 * mMeson ) ) * a1f -
145 ( ( mB - mMeson ) / ( 2.0 * mMeson ) ) * a2f;
146
147 // Calculate Bc -> V W current
148 EvtTensor4C H = a1f * mVar * EvtTensor4C::g();
149 H.addDirProd( ( -a2f / mVar ) * p4b, p4Sum );
150 H += EvtComplex( 0.0, vf / mVar ) *
151 dual( EvtGenFunctions::directProd( p4Sum, Q ) );
152 H.addDirProd( ( a0f - a3f ) * 2.0 * ( mMeson / Q2 ) * p4b, Q );
153
154 for ( int i1 = 0; i1 < 2; ++i1 ) {
155 for ( int i2 = 0; i2 < 2; ++i2 ) {
156 const EvtVector4C hardCur = hardCurrPP( parent, i1, i2 );
157 const EvtVector4C Heps = H.cont2( hardCur );
158 for ( int i = 0; i < 3; i++ ) {
159 // psi-meson polarization vector
160 const EvtVector4C eps = Jpsi->epsParent( i ).conj();
161 const EvtComplex amp = eps * Heps;
162 vertex( i, i1, i2, amp );
163 }
164 }
165 }
166}
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_INFO
Definition EvtReport.hh:52
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtTensor4C dual(const EvtTensor4C &t2)
void decay(EvtParticle *parent) override
void init() override
void initProbMax() override
std::unique_ptr< EvtWHad > m_WCurr
std::string getName() const override
std::unique_ptr< EvtBCVFF2 > m_FFModel
EvtDecayBase * clone() const override
EvtVector4C hardCurrPP(EvtParticle *parent, int i1, int i2) const
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
bool contains(const EvtId &id) const
Definition EvtIdSet.cpp:46
int getId() const
Definition EvtId.hh:41
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
virtual EvtDiracSpinor spParent(int) 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)