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.
EvtSLDiBaryonAmp.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/EvtIdSet.hh"
25 #include "EvtGenBase/EvtPDL.hh"
27 #include "EvtGenBase/EvtPatches.hh"
29 #include "EvtGenBase/EvtReport.hh"
31 
33  ffModel_( formFactors )
34 {
35 }
36 
37 void EvtSLDiBaryonAmp::CalcAmp( EvtParticle* parent, EvtAmp& amp ) const
38 {
39  static EvtId EM = EvtPDL::getId( "e-" );
40  static EvtId MUM = EvtPDL::getId( "mu-" );
41  static EvtId TAUM = EvtPDL::getId( "tau-" );
42  static EvtId EP = EvtPDL::getId( "e+" );
43  static EvtId MUP = EvtPDL::getId( "mu+" );
44  static EvtId TAUP = EvtPDL::getId( "tau+" );
45 
46  // The amplitude assumes B- -> p+ p- l- nubar ordering
47  // i.e. the B- decay is the "particle" mode
48 
49  // B charge (x3) to check for antiparticle mode and baryon daughter ordering
50  EvtId BId = parent->getId();
51  int qB3 = EvtPDL::chg3( BId );
52 
53  bool particleMode( true );
54  // Check if we have B+ instead (antiparticle mode)
55  if ( qB3 > 0 ) {
56  particleMode = false;
57  }
58 
59  // The baryon, charged lepton and neutrino daughters
60 
61  // Make sure the first baryon has a charge opposite to the B, since the
62  // amplitude expressions assume this order
63  EvtParticle* baryon1 = parent->getDaug( 0 );
64  EvtParticle* baryon2 = parent->getDaug( 1 );
65 
66  // Check if we need to reverse the baryon ordering
67  if ( EvtPDL::chg3( baryon1->getId() ) == qB3 ) {
68  baryon1 = parent->getDaug( 1 );
69  baryon2 = parent->getDaug( 0 );
70  }
71 
72  EvtParticle* lepton = parent->getDaug( 2 );
73  EvtParticle* neutrino = parent->getDaug( 3 );
74 
75  // 4-momenta in B rest frame
76  EvtVector4R p0( parent->mass(), 0.0, 0.0, 0.0 );
77  EvtVector4R p1 = baryon1->getP4();
78  EvtVector4R p2 = baryon2->getP4();
79 
80  EvtVector4R pSum = p1 + p2;
81  EvtVector4R p = p0 - pSum;
82  EvtVector4R pDiff = p2 - p1;
83 
84  // Particle id's: retrieve 1st baryon again in case order has changed
85  EvtId Id1 = baryon1->getId();
86  EvtId Id2 = baryon2->getId();
87  EvtId l_num = lepton->getId();
88 
91 
92  // Parity of B+- = -1. Check if the parity of the dibaryon state is the same.
93  // If so, set the sameParity integer to 1. Otherwise set it to -1,
94  // i.e. the dibaryon system has opposite parity to the B meson
95  int J1 = EvtSpinType::getSpin2( type1 );
96  int J2 = EvtSpinType::getSpin2( type2 );
97  int sameParity = this->checkDibaryonParity( Id1, Id2, J1, J2 );
98 
99  // Number of chiral components of the baryon spinors
100  int N1 = EvtSpinType::getSpinStates( type1 );
101  int N2 = EvtSpinType::getSpinStates( type2 );
102 
103  // Invariant mass of the two baryon particle system
104  double m_dibaryon = sqrt( pSum.mass2() );
105 
106  // Complex number i
107  EvtComplex I( 0, 1 );
108 
109  // Lepton currents, same for all baryon options
110  EvtVector4C l1, l2;
111 
112  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
113  // B-
114  l1 = EvtLeptonVACurrent( lepton->spParent( 0 ),
115  neutrino->spParentNeutrino() );
116 
117  l2 = EvtLeptonVACurrent( lepton->spParent( 1 ),
118  neutrino->spParentNeutrino() );
119 
120  } else if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
121  // B+
122  l1 = EvtLeptonVACurrent( neutrino->spParentNeutrino(),
123  lepton->spParent( 0 ) );
124 
125  l2 = EvtLeptonVACurrent( neutrino->spParentNeutrino(),
126  lepton->spParent( 1 ) );
127 
128  } else {
129  EvtGenReport( EVTGEN_ERROR, "EvtSLDiBaryonAmp" )
130  << "Wrong lepton number" << std::endl;
131  }
132 
133  // Parity multiplication factors for the antiparticle mode hadronic currents
134  double sign1 = ( particleMode == true ) ? 1.0 : 1.0 * sameParity;
135  double sign2 = ( particleMode == true ) ? 1.0 : 1.0 * sameParity;
136  double sign3 = ( particleMode == true ) ? 1.0 : -1.0 * sameParity;
137  double sign4 = ( particleMode == true ) ? 1.0 : -1.0 * sameParity;
138  double sign5 = ( particleMode == true ) ? 1.0 : -1.0 * sameParity;
139  double sign6 = ( particleMode == true ) ? 1.0 : 1.0 * sameParity;
140 
141  // Define form factor coeff variables
142  double f1( 0.0 ), f2( 0.0 ), f3( 0.0 ), f4( 0.0 ), f5( 0.0 );
143  double g1( 0.0 ), g2( 0.0 ), g3( 0.0 ), g4( 0.0 ), g5( 0.0 );
144 
145  // Handle case of two Dirac-type daughters, e.g. p pbar, p N(1440)
146  if ( type1 == EvtSpinType::DIRAC && type2 == EvtSpinType::DIRAC ) {
147  // Form factor parameters
149  ffModel_.getDiracFF( parent, m_dibaryon, FF );
150 
151  if ( sameParity == 1 ) {
152  f1 = FF.F1;
153  f2 = FF.F2;
154  f3 = FF.F3;
155  f4 = FF.F4;
156  f5 = FF.F5;
157  g1 = FF.G1;
158  g2 = FF.G2;
159  g3 = FF.G3;
160  g4 = FF.G4;
161  g5 = FF.G5;
162  } else {
163  // Swap coeffs: f_i <--> g_i
164  f1 = FF.G1;
165  f2 = FF.G2;
166  f3 = FF.G3;
167  f4 = FF.G4;
168  f5 = FF.G5;
169  g1 = FF.F1;
170  g2 = FF.F2;
171  g3 = FF.F3;
172  g4 = FF.F4;
173  g5 = FF.F5;
174  }
175 
176  EvtVector4R gMtmTerms = g3 * p + g4 * pSum + g5 * pDiff;
177  EvtVector4R fMtmTerms = f3 * p + f4 * pSum + f5 * pDiff;
178 
179  // First baryon
180  for ( int i = 0; i < N1; i++ ) {
181  // Get the baryon spinor in the B rest frame. Also just use u and not i*u,
182  // since the imaginary constant factor is not needed for the probability
183  EvtDiracSpinor u = baryon1->spParent( i );
184 
185  // Second baryon
186  for ( int j = 0; j < N2; j++ ) {
187  EvtDiracSpinor v = baryon2->spParent( j );
188 
189  // Hadronic currents
190  std::vector<EvtVector4C> hadCurrents =
191  this->getHadronicCurrents( u, v, p, gMtmTerms, fMtmTerms );
192 
193  // First amplitude terms: 3rd current already has the form factor coeffs applied (gMtmTerms)
194  EvtVector4C amp1 = g1 * sign1 * hadCurrents[0] +
195  g2 * sign2 * hadCurrents[1] +
196  sign3 * hadCurrents[2];
197 
198  // Second amplitude terms: 6th current already has the form factor coeffs applied (fMtmTerms)
199  EvtVector4C amp2 = f1 * sign4 * hadCurrents[3] +
200  f2 * sign5 * hadCurrents[4] +
201  sign6 * hadCurrents[5];
202 
203  EvtVector4C hadAmp;
204  if ( sameParity == 1 ) {
205  hadAmp = amp1 - amp2;
206  } else {
207  hadAmp = amp2 - amp1;
208  }
209 
210  amp.vertex( i, j, 0, l1 * hadAmp );
211  amp.vertex( i, j, 1, l2 * hadAmp );
212 
213  } // j
214 
215  } // i
216 
217  } else if ( ( type1 == EvtSpinType::DIRAC &&
218  type2 == EvtSpinType::RARITASCHWINGER ) ||
219  ( type1 == EvtSpinType::RARITASCHWINGER &&
220  type2 == EvtSpinType::DIRAC ) ) {
221  // Handle the case of one Dirac-type daughter (not including the leptons), e.g. one proton, and one
222  // Rarita-Schwinger-type (spin 3/2) daughter e.g. B -> p N(1520) l nu
223 
224  // Form factor parameters
226  ffModel_.getRaritaFF( parent, m_dibaryon, FF );
227 
228  if ( sameParity == 1 ) {
229  f1 = FF.F1;
230  f2 = FF.F2;
231  f3 = FF.F3;
232  f4 = FF.F4;
233  f5 = FF.F5;
234  g1 = FF.G1;
235  g2 = FF.G2;
236  g3 = FF.G3;
237  g4 = FF.G4;
238  g5 = FF.G5;
239  } else {
240  // Swap coeffs: f_i <--> g_i
241  f1 = FF.G1;
242  f2 = FF.G2;
243  f3 = FF.G3;
244  f4 = FF.G4;
245  f5 = FF.G5;
246  g1 = FF.F1;
247  g2 = FF.F2;
248  g3 = FF.F3;
249  g4 = FF.F4;
250  g5 = FF.F5;
251  }
252 
253  EvtVector4R gMtmTerms = g3 * p + g4 * pSum + g5 * pDiff;
254  EvtVector4R fMtmTerms = f3 * p + f4 * pSum + f5 * pDiff;
255 
256  if ( type1 == EvtSpinType::DIRAC ) {
257  // First baryon is Dirac
258  for ( int i = 0; i < N1; i++ ) {
259  // Get the baryon spinor in the B rest frame. Also just use u and not i*u,
260  // since the imaginary constant factor is not needed for the probability
261  EvtDiracSpinor u = baryon1->spParent( i );
262 
263  // Second baryon is RS-type
264  for ( int j = 0; j < N2; j++ ) {
265  EvtRaritaSchwinger vRS = baryon2->spRSParent( j );
266 
267  EvtDiracSpinor v;
268  for ( int k = 0; k < 4; k++ ) {
269  v.set_spinor( k, vRS.getVector( k ) * p0 );
270  }
271 
272  // Hadronic currents
273  std::vector<EvtVector4C> hadCurrents =
274  this->getHadronicCurrents( u, v, p, gMtmTerms, fMtmTerms );
275 
276  // First amplitude terms: 3rd current already has the form factor coeffs applied (gMtmTerms)
277  EvtVector4C amp1 = g1 * sign1 * hadCurrents[0] +
278  g2 * sign2 * hadCurrents[1] +
279  sign3 * hadCurrents[2];
280 
281  // Second amplitude terms: 6th current already has the form factor coeffs applied (fMtmTerms)
282  EvtVector4C amp2 = f1 * sign4 * hadCurrents[3] +
283  f2 * sign5 * hadCurrents[4] +
284  sign6 * hadCurrents[5];
285 
286  EvtVector4C hadAmp;
287  if ( sameParity == 1 ) {
288  hadAmp = amp1 - amp2;
289  } else {
290  hadAmp = amp2 - amp1;
291  }
292 
293  amp.vertex( i, j, 0, l1 * hadAmp );
294  amp.vertex( i, j, 1, l2 * hadAmp );
295 
296  } // j
297 
298  } // i
299 
300  } else if ( type2 == EvtSpinType::DIRAC ) {
301  // Same as before, but where the first daughter is RS-type, e.g. B -> N(1520) p l nu
302 
303  // First baryon is RS
304  for ( int i = 0; i < N1; i++ ) {
305  // Get the baryon spinor in the B rest frame
306  EvtRaritaSchwinger uRS = baryon1->spRSParent( i );
307 
308  EvtDiracSpinor u;
309  for ( int k = 0; k < 4; k++ ) {
310  u.set_spinor( k, uRS.getVector( k ) * p0 );
311  }
312 
313  // Second baryon is Dirac
314  for ( int j = 0; j < N2; j++ ) {
315  EvtDiracSpinor v = baryon2->spParent( j );
316 
317  // Hadronic currents
318  std::vector<EvtVector4C> hadCurrents =
319  this->getHadronicCurrents( u, v, p, gMtmTerms, fMtmTerms );
320 
321  // First amplitude terms: 3rd current already has the form factor coeffs applied (gMtmTerms)
322  EvtVector4C amp1 = g1 * sign1 * hadCurrents[0] +
323  g2 * sign2 * hadCurrents[1] +
324  sign3 * hadCurrents[2];
325 
326  // Second amplitude terms: 6th current already has the form factor coeffs applied (fMtmTerms)
327  EvtVector4C amp2 = f1 * sign4 * hadCurrents[3] +
328  f2 * sign5 * hadCurrents[4] +
329  sign6 * hadCurrents[5];
330 
331  EvtVector4C hadAmp;
332  if ( sameParity == 1 ) {
333  hadAmp = amp1 - amp2;
334  } else {
335  hadAmp = amp2 - amp1;
336  }
337 
338  amp.vertex( i, j, 0, l1 * hadAmp );
339  amp.vertex( i, j, 1, l2 * hadAmp );
340 
341  } // j
342 
343  } // i
344 
345  } // RS daughter check
346 
347  } // Have Dirac and RS baryons
348 }
349 
350 std::vector<EvtVector4C> EvtSLDiBaryonAmp::getHadronicCurrents(
351  const EvtDiracSpinor& u, const EvtDiracSpinor& v, const EvtVector4R& p,
352  const EvtVector4R& gMtmTerms, const EvtVector4R& fMtmTerms ) const
353 {
354  // Store the currents used in Eq 6 (in order of appearance)
355  std::vector<EvtVector4C> currents;
356  currents.reserve( 6 );
357 
359 
360  // ubar*gamma*gamma5*v
361  EvtVector4C current1 = EvtLeptonACurrent( u, v );
362  currents.push_back( current1 );
363 
364  // ubar*sigma*p*gamma5*v -> [ubar*sigma*(gamma5*v)]*p
365  EvtTensor4C TC1 = EvtLeptonTCurrent( u, g5v );
366  // Contract tensor with 4-momentum
367  EvtVector4C current2 = TC1.cont2( p );
368  currents.push_back( current2 );
369 
370  // ubar*p*gamma5*v; "p" = p, pSum and pDiff
371  EvtComplex PC1 = EvtLeptonPCurrent( u, v );
372  EvtVector4C current3 = PC1 * gMtmTerms;
373  currents.push_back( current3 );
374 
375  // ubar*gamma*v
376  EvtVector4C current4 = EvtLeptonVCurrent( u, v );
377  currents.push_back( current4 );
378 
379  // ubar*sigma*p*v -> [ubar*sigma*v]*p
380  EvtTensor4C TC2 = EvtLeptonTCurrent( u, v );
381  // Contract tensor with 4-momentum
382  EvtVector4C current5 = TC2.cont2( p );
383  currents.push_back( current5 );
384 
385  // ubar*p*v; "p" = p, pSum and pDiff
386  EvtComplex S1 = EvtLeptonSCurrent( u, v );
387  EvtVector4C current6 = S1 * fMtmTerms;
388  currents.push_back( current6 );
389 
390  return currents;
391 }
392 
394  const int J1, const int J2 ) const
395 {
396  // Get intrisic parities of the two baryons, then multiply by (-1)^|J1 - J2|.
397  // Note here that the J1 and J2 function arguments = 2*spin
398  int par1 = this->getBaryonParity( id1 );
399  int par2 = this->getBaryonParity( id2 );
400 
401  // mult should be either 0 or 1 for allowed Dirac/RS baryon pairs
402  int mult = static_cast<int>( pow( -1.0, 0.5 * fabs( J1 - J2 ) ) );
403 
404  int dbParity = par1 * par2 * mult;
405 
406  // Initialise result to 1, i.e. dibaryon parity = B parity = -1
407  int result( 1 );
408 
409  // Dibaryon parity is opposite to the negative B parity
410  if ( dbParity > 0 ) {
411  result = -1;
412  }
413 
414  return result;
415 }
416 
418 {
419  // Initialise parity to +1
420  int parity( 1 );
421 
422  // List of baryons with parity = +1
423  static EvtIdSet posParity( "p+", "Delta+", "Lambda_c+",
424  "anti-Lambda_c(2593)-", "anti-Lambda_c(2625)-",
425  "N(1440)+", "anti-N(1520)-", "anti-N(1535)-",
426  "anti-N(1650)-", "anti-N(1700)-", "N(1710)+",
427  "N(1720)+" );
428 
429  // If the baryon id is not in the list, set the parity to -1
430  if ( !posParity.contains( id ) ) {
431  parity = -1;
432  }
433 
434  return parity;
435 }
void getRaritaFF(EvtParticle *parent, double dibaryonMass, EvtBToDiBaryonlnupQCDFF::FormFactors &FF) const
int checkDibaryonParity(const EvtId &id1, const EvtId &id2, const int J1, const int J2) const
void CalcAmp(EvtParticle *parent, EvtAmp &amp) const
virtual EvtRaritaSchwinger spRSParent(int) const
EvtTensor4C EvtLeptonTCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
static EvtSpinType::spintype getSpinType(EvtId i)
Definition: EvtPDL.cpp:377
EvtComplex EvtLeptonPCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtVector4C cont2(const EvtVector4C &v4) const
void set_spinor(int i, const EvtComplex &sp)
EvtId getId() const
static int getSpinStates(spintype stype)
Definition: EvtSpinType.cpp:57
static int chg3(EvtId i)
Definition: EvtPDL.cpp:372
virtual EvtDiracSpinor spParent(int) const
Definition: EvtId.hh:27
EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void vertex(const EvtComplex &amp)
Definition: EvtAmp.cpp:454
Definition: EvtAmp.hh:30
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
static int getSpin2(spintype stype)
Definition: EvtSpinType.cpp:26
EvtSLDiBaryonAmp(const EvtBToDiBaryonlnupQCDFF &)
std::vector< EvtVector4C > getHadronicCurrents(const EvtDiracSpinor &u, const EvtDiracSpinor &v, const EvtVector4R &p, const EvtVector4R &gMtmTerms, const EvtVector4R &fMtmTerms) const
double mass() const
virtual EvtDiracSpinor spParentNeutrino() const
int getBaryonParity(const EvtId &id) const
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C getVector(int i) const
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void getDiracFF(EvtParticle *parent, double dibaryonMass, EvtBToDiBaryonlnupQCDFF::FormFactors &FF) const
const EvtComplex I
Definition: EvtBsMuMuKK.cpp:38
int contains(const EvtId id)
Definition: EvtIdSet.cpp:422
EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
static const EvtGammaMatrix & g5()
EvtBToDiBaryonlnupQCDFF ffModel_