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