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
EvtBcToNPi.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/EvtPDL.hh"
30
31#include <iostream>
32using std::endl;
33
35{
36 m_nCall = 0;
37 m_maxAmp2 = 0;
38 if ( printAuthorInfo == true ) {
39 this->printAuthorInfo();
40 }
41}
42
43std::string EvtBcToNPi::getName() const
44{
45 return "EvtBcToNPi";
46}
47
49{
50 return new EvtBcToNPi;
51}
52
54{
55 // check spins
57
58 // the others are scalar
59 for ( int i = 1; i <= ( getNDaug() - 1 ); i++ ) {
61 };
62
63 m_beta = -0.108;
64 m_mRho = 0.775;
65 m_gammaRho = 0.149;
66 m_mRhopr = 1.364;
67 m_gammaRhopr = 0.400;
68 m_mA1 = 1.23;
69 m_gammaA1 = 0.4;
70
71 // read arguments
73 checkNArg( 10 );
74 int n = 0;
75 m_maxProb = getArg( n++ );
76 m_FA0_N = getArg( n++ );
77 m_FA0_c1 = getArg( n++ );
78 m_FA0_c2 = getArg( n++ );
79 m_FAp_N = getArg( n++ );
80 m_FAp_c1 = getArg( n++ );
81 m_FAp_c2 = getArg( n++ );
82 m_FV_N = getArg( n++ );
83 m_FV_c1 = getArg( n++ );
84 m_FV_c2 = getArg( n++ );
85 m_FAm_N = 0;
86 m_FAm_c1 = 0;
87 m_FAm_c2 = 0;
88 } else if ( EvtPDL::getSpinType( getDaug( 0 ) ) == EvtSpinType::SCALAR ) {
89 checkNArg( 4 );
90 int n = 0;
91 m_maxProb = getArg( n++ );
92 m_Fp_N = getArg( n++ );
93 m_Fp_c1 = getArg( n++ );
94 m_Fp_c2 = getArg( n++ );
95 m_Fm_N = 0;
96 m_Fm_c1 = 0;
97 m_Fm_c2 = 0;
98 } else {
99 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
100 << "Have not yet implemented this final state in BCPSINPI model"
101 << endl;
102 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
103 for ( int id = 0; id < ( getNDaug() - 1 ); id++ )
104 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
105 << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
106 << endl;
107 return;
108 };
109
110 if ( getNDaug() < 2 || getNDaug() > 4 ) {
111 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
112 << "Have not yet implemented this final state in BCPSINPI model"
113 << endl;
114 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
115 for ( int id = 0; id < ( getNDaug() - 1 ); id++ )
116 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
117 << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
118 << endl;
119 return;
120 }
121}
122
123double EvtBcToNPi::energy1( double M, double m1, double m2 )
124{
125 return ( M * M + m1 * m1 - m2 * m2 ) / ( 2 * M );
126}
127
128double EvtBcToNPi::mom1( double M, double m1, double m2 )
129{
130 double e1 = energy1( M, m1, m2 );
131 return sqrt( e1 * e1 - m1 * m1 );
132}
133
135{
136 if ( m_maxProb > 0. )
138 else {
139 EvtId id = getParentId();
141 p->init( id, EvtPDL::getMass( id ), 0., 0., 0. );
143 // add daughters
145
146 // fill the momenta
147 if ( getNDaug() == 2 ) {
148 double M = EvtPDL::getMass( id ),
149 m1 = EvtPDL::getMass( getDaug( 0 ) ),
150 m2 = EvtPDL::getMass( getDaug( 1 ) );
151 double p1 = mom1( M, m1, m2 );
152 p->getDaug( 0 )->setP4(
153 EvtVector4R( energy1( M, m1, m2 ), 0., 0., p1 ) );
154 p->getDaug( 1 )->setP4(
155 EvtVector4R( energy1( M, m2, m1 ), 0., 0., -p1 ) );
156 } else if ( getNDaug() == 3 ) {
157 double M = EvtPDL::getMass( id ),
158 m1 = EvtPDL::getMass( getDaug( 0 ) ),
159 m2 = EvtPDL::getMass( getDaug( 1 ) ),
160 m3 = EvtPDL::getMass( getDaug( 2 ) );
161 double pRho = mom1( M, m1, m_mRho ), pPi = mom1( m_mRho, m2, m3 );
162 p->getDaug( 0 )->setP4(
163 EvtVector4R( energy1( M, m1, m_mRho ), 0., 0., pRho ) );
164 EvtVector4R p4Rho( energy1( M, m_mRho, m1 ), 0., 0., -pRho );
165 EvtVector4R p4_2( energy1( m_mRho, m2, m3 ), 0., 0., pPi );
166 p4_2.applyBoostTo( p4Rho );
167 EvtVector4R p4_3( energy1( m_mRho, m2, m3 ), 0., 0., -pPi );
168 p4_3.applyBoostTo( p4Rho );
169 p->getDaug( 1 )->setP4( p4_2 );
170 p->getDaug( 2 )->setP4( p4_3 );
171
172 } else if ( getNDaug() == 4 ) {
173 double M = EvtPDL::getMass( id ),
174 m1 = EvtPDL::getMass( getDaug( 0 ) ),
175 m2 = EvtPDL::getMass( getDaug( 1 ) ),
176 m3 = EvtPDL::getMass( getDaug( 2 ) ),
177 m4 = EvtPDL::getMass( getDaug( 3 ) );
178 if ( M < m1 + m_mA1 )
179 return;
180 double pA1 = mom1( M, m1, m_mA1 ), pRho = mom1( m_mA1, m_mRho, m4 ),
181 pPi = mom1( m_mRho, m2, m3 );
182 p->getDaug( 0 )->setP4(
183 EvtVector4R( energy1( M, m1, m_mRho ), 0., 0., pA1 ) );
184 EvtVector4R p4A1( energy1( M, m_mA1, m1 ), 0., 0., -pA1 );
185 EvtVector4R p4Rho( energy1( m_mA1, m_mRho, m4 ), 0, 0, pRho );
186 p4Rho.applyBoostTo( p4A1 );
187 EvtVector4R p4_4( energy1( m_mA1, m4, m_mRho ), 0, 0, -pRho );
188 p4_4.applyBoostTo( p4A1 );
189 p->getDaug( 3 )->setP4( p4_4 );
190 EvtVector4R p4_2( energy1( m_mRho, m2, m3 ), 0, 0, pPi );
191 p4_2.applyBoostTo( p4Rho );
192 p->getDaug( 1 )->setP4( p4_2 );
193 EvtVector4R p4_3( energy1( m_mRho, m2, m3 ), 0, 0, -pPi );
194 p4_2.applyBoostTo( p4Rho );
195 p->getDaug( 2 )->setP4( p4_3 );
196 };
197
198 m_amp2.init( p->getId(), getNDaug(), getDaugs() );
199
200 decay( p );
201
202 EvtSpinDensity rho = m_amp2.getSpinDensity();
203
204 double prob = p->getSpinDensityForward().normalizedProb( rho );
205
206 if ( prob > 0 )
207 setProbMax( 0.9 * prob );
208 };
209}
210
211void EvtBcToNPi::decay( EvtParticle* root_particle )
212{
213 ++m_nCall;
214
215 EvtIdSet thePis{ "pi+", "pi-", "pi0" };
216 EvtComplex I = EvtComplex( 0.0, 1.0 );
217
218 root_particle->initializePhaseSpace( getNDaug(), getDaugs() );
219
220 EvtVector4R p( root_particle->mass(), 0., 0., 0. ), // Bc momentum
221 k = root_particle->getDaug( 0 )->getP4(), // J/psi momenta
222 Q = p - k;
223
224 double Q2 = Q.mass2();
225
226 // check pi-mesons and calculate hadronic current
227 EvtVector4C hardCur;
228 bool foundHadCurr = false;
229
230 if ( getNDaug() == 2 ) // Bc -> psi pi+
231 {
232 hardCur = Q;
233 foundHadCurr = true;
234 } else if ( getNDaug() == 3 ) // Bc -> psi pi+ pi0
235 {
236 EvtVector4R p1, p2;
237 p1 = root_particle->getDaug( 1 )->getP4(), // pi+ momenta
238 p2 = root_particle->getDaug( 2 )->getP4(), // pi0 momentum
239 hardCur = Fpi( p1, p2 ) * ( p1 - p2 );
240 foundHadCurr = true;
241 } else if ( getNDaug() == 4 ) // Bc -> psi pi+ pi pi
242 {
243 int diffPi( 0 ), samePi1( 0 ), samePi2( 0 );
244 if ( getDaug( 1 ) == getDaug( 2 ) ) {
245 diffPi = 3;
246 samePi1 = 1;
247 samePi2 = 2;
248 }
249 if ( getDaug( 1 ) == getDaug( 3 ) ) {
250 diffPi = 2;
251 samePi1 = 1;
252 samePi2 = 3;
253 }
254 if ( getDaug( 2 ) == getDaug( 3 ) ) {
255 diffPi = 1;
256 samePi1 = 2;
257 samePi2 = 3;
258 }
259
260 EvtVector4R p1 = root_particle->getDaug( samePi1 )->getP4();
261 EvtVector4R p2 = root_particle->getDaug( samePi2 )->getP4();
262 EvtVector4R p3 = root_particle->getDaug( diffPi )->getP4();
263
264 EvtComplex BA1;
265 double GA1 = m_gammaA1 * pi3G( Q2, samePi1 ) /
266 pi3G( m_mA1 * m_mA1, samePi1 );
267 EvtComplex denBA1( m_mA1 * m_mA1 - Q.mass2(), -1. * m_mA1 * GA1 );
268 BA1 = m_mA1 * m_mA1 / denBA1;
269
270 hardCur = BA1 * ( ( p1 - p3 ) -
271 ( Q * ( Q * ( p1 - p3 ) ) / Q2 ) * Fpi( p2, p3 ) +
272 ( p2 - p3 ) -
273 ( Q * ( Q * ( p2 - p3 ) ) / Q2 ) * Fpi( p1, p3 ) );
274 foundHadCurr = true;
275 }
276
277 if ( !foundHadCurr ) {
278 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
279 << "Have not yet implemented this final state in BCNPI model"
280 << endl;
281 EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Ndaug=" << getNDaug() << endl;
282 int id;
283 for ( id = 0; id < ( getNDaug() - 1 ); id++ )
284 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
285 << "Daug " << id << " " << EvtPDL::name( getDaug( id ) ).c_str()
286 << endl;
287 ::abort();
288 };
289
290 double amp2 = 0.;
291 if ( root_particle->getDaug( 0 )->getSpinType() == EvtSpinType::VECTOR ) {
292 EvtTensor4C H;
293 double FA0 = m_FA0_N * exp( m_FA0_c1 * Q2 + m_FA0_c2 * Q2 * Q2 );
294 double FAp = m_FAp_N * exp( m_FAp_c1 * Q2 + m_FAp_c2 * Q2 * Q2 );
295 double FAm = m_FAm_N * exp( m_FAm_c1 * Q2 + m_FAm_c2 * Q2 * Q2 );
296 double FV = m_FV_N * exp( m_FV_c1 * Q2 + m_FV_c2 * Q2 * Q2 );
297 H = -FA0 * EvtTensor4C::g() -
298 FAp * EvtGenFunctions::directProd( p, p + k ) +
299 FAm * EvtGenFunctions::directProd( p, p - k ) +
300 2 * I * FV * dual( EvtGenFunctions::directProd( p, k ) );
301 EvtVector4C Heps = H.cont2( hardCur );
302
303 for ( int i = 0; i < 3; i++ ) {
304 EvtVector4C eps = root_particle->getDaug( 0 )
305 ->epsParent( i )
306 .conj(); // psi-meson polarization vector
307 EvtComplex amp = eps * Heps;
308 vertex( i, amp );
309 amp2 += pow( abs( amp ), 2 );
310 }
311 } else if ( root_particle->getDaug( 0 )->getSpinType() ==
313 double Fp = m_Fp_N * exp( m_Fp_c1 * Q2 + m_Fp_c2 * Q2 * Q2 );
314 double Fm = m_Fm_N * exp( m_Fm_c1 * Q2 + m_Fm_c2 * Q2 * Q2 );
315 EvtVector4C H = Fp * ( p + k ) + Fm * ( p - k );
316 EvtComplex amp = H * hardCur;
317 vertex( amp );
318 amp2 += pow( abs( amp ), 2 );
319 };
320 if ( amp2 > m_maxAmp2 )
321 m_maxAmp2 = amp2;
322
323 return;
324}
325
327{
328 double m1 = q1.mass();
329 double m2 = q2.mass();
330
331 EvtVector4R Q = q1 + q2;
332 double mQ2 = Q * Q;
333
334 // momenta in the rho->pipi decay
335 double dRho = m_mRho * m_mRho - m1 * m1 - m2 * m2;
336 double pPiRho = ( 1.0 / m_mRho ) *
337 sqrt( ( dRho * dRho ) / 4.0 - m1 * m1 * m2 * m2 );
338
339 double dRhopr = m_mRhopr * m_mRhopr - m1 * m1 - m2 * m2;
340 double pPiRhopr = ( 1.0 / m_mRhopr ) *
341 sqrt( ( dRhopr * dRhopr ) / 4.0 - m1 * m1 * m2 * m2 );
342
343 double dQ = mQ2 - m1 * m1 - m2 * m2;
344 double pPiQ = ( 1.0 / sqrt( mQ2 ) ) *
345 sqrt( ( dQ * dQ ) / 4.0 - m1 * m1 * m2 * m2 );
346
347 double gammaRho = m_gammaRho * m_mRho / sqrt( mQ2 ) *
348 pow( ( pPiQ / pPiRho ), 3 );
349 EvtComplex BRhoDem( m_mRho * m_mRho - mQ2, -1.0 * m_mRho * gammaRho );
350 EvtComplex BRho = m_mRho * m_mRho / BRhoDem;
351
352 double gammaRhopr = m_gammaRhopr * m_mRhopr / sqrt( mQ2 ) *
353 pow( ( pPiQ / pPiRhopr ), 3 );
354 EvtComplex BRhoprDem( m_mRhopr * m_mRhopr - mQ2, -1.0 * m_mRho * gammaRhopr );
355 EvtComplex BRhopr = m_mRhopr * m_mRhopr / BRhoprDem;
356
357 return ( BRho + m_beta * BRhopr ) / ( 1 + m_beta );
358}
359
360double EvtBcToNPi::pi3G( double m2, int dupD )
361{
362 double mPi = EvtPDL::getMeanMass( getDaug( dupD ) );
363 if ( m2 > ( m_mRho + mPi ) ) {
364 return m2 * ( 1.623 + 10.38 / m2 - 9.32 / ( m2 * m2 ) +
365 0.65 / ( m2 * m2 * m2 ) );
366 } else {
367 double t1 = m2 - 9.0 * mPi * mPi;
368 return 4.1 * pow( t1, 3.0 ) * ( 1.0 - 3.3 * t1 + 5.8 * t1 * t1 );
369 }
370}
371
373{
374 EvtGenReport( EVTGEN_INFO, "EvtGen" )
375 << "Defining EvtBcToNPi model: Bc -> V + npi and Bc -> P + npi decays\n"
376 << "from A.V. Berezhnoy, A.K. Likhoded, A.V. Luchinsky: "
377 << "Phys.Rev.D 82, 014012 (2010) and arXiV:1104.0808." << endl;
378}
const EvtComplex I
EvtComplex exp(const EvtComplex &c)
double abs(const EvtComplex &c)
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)
double m_Fm_N
Definition EvtBcToNPi.hh:60
double m_FAm_N
Definition EvtBcToNPi.hh:55
void printAuthorInfo()
double energy1(double M, double m1, double m2)
double m_Fm_c1
Definition EvtBcToNPi.hh:60
EvtComplex Fpi(EvtVector4R q1, EvtVector4R q2)
double m_mRhopr
Definition EvtBcToNPi.hh:66
double m_FAm_c1
Definition EvtBcToNPi.hh:55
double m_FAp_c2
Definition EvtBcToNPi.hh:56
double m_FAp_N
Definition EvtBcToNPi.hh:56
double m_Fp_N
Definition EvtBcToNPi.hh:59
double m_gammaRho
Definition EvtBcToNPi.hh:65
double m_maxAmp2
Definition EvtBcToNPi.hh:50
double m_gammaRhopr
Definition EvtBcToNPi.hh:67
double m_FAm_c2
Definition EvtBcToNPi.hh:55
double m_FV_c2
Definition EvtBcToNPi.hh:57
double m_gammaA1
Definition EvtBcToNPi.hh:69
void init() override
double m_Fp_c2
Definition EvtBcToNPi.hh:59
double m_maxProb
Definition EvtBcToNPi.hh:53
double pi3G(double m2, int dupD)
double mom1(double M, double m1, double m2)
double m_beta
Definition EvtBcToNPi.hh:63
double m_FV_N
Definition EvtBcToNPi.hh:57
double m_FA0_c2
Definition EvtBcToNPi.hh:54
void decay(EvtParticle *p) override
void initProbMax() override
std::string getName() const override
double m_FA0_N
Definition EvtBcToNPi.hh:54
double m_FV_c1
Definition EvtBcToNPi.hh:57
EvtBcToNPi(bool printAuthorInfo=false)
double m_FAp_c1
Definition EvtBcToNPi.hh:56
double m_Fp_c1
Definition EvtBcToNPi.hh:59
EvtDecayBase * clone() const override
double m_FA0_c1
Definition EvtBcToNPi.hh:54
double m_mRho
Definition EvtBcToNPi.hh:64
double m_Fm_c2
Definition EvtBcToNPi.hh:60
double m_mA1
Definition EvtBcToNPi.hh:68
EvtAmp m_amp2
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 getParentId() const
EvtId getDaug(int i) const
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
Definition EvtId.hh:27
static EvtSpinType::spintype getSpinType(EvtId i)
Definition EvtPDL.cpp:371
static double getMass(EvtId i)
Definition EvtPDL.cpp:311
static std::string name(EvtId i)
Definition EvtPDL.cpp:376
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
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
void setDiagonalSpinDensity()
EvtSpinType::spintype getSpinType() const
const EvtVector4R & getP4() const
void setP4(const EvtVector4R &p4)
EvtParticle * getDaug(const int i)
double mass() const
void makeDaughters(size_t ndaug, const EvtId *id)
EvtSpinDensity getSpinDensityForward()
void init(EvtId part_n, double e, double px, double py, double pz)
double normalizedProb(const EvtSpinDensity &d)
static const EvtTensor4C & g()
EvtVector4C cont2(const EvtVector4C &v4) const
EvtVector4C conj() const
double mass() const
double mass2() const
void applyBoostTo(const EvtVector4R &p4, bool inverse=false)
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)