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.
EvtSemiLeptonicBaryonAmp.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/EvtAmp.hh"
27 #include "EvtGenBase/EvtGenKine.hh"
28 #include "EvtGenBase/EvtId.hh"
29 #include "EvtGenBase/EvtPDL.hh"
31 #include "EvtGenBase/EvtPatches.hh"
33 #include "EvtGenBase/EvtReport.hh"
37 
38 #include <stdlib.h>
39 
40 using std::endl;
41 
43  EvtSemiLeptonicFF* FormFactors )
44 {
45  static EvtId EM = EvtPDL::getId( "e-" );
46  static EvtId MUM = EvtPDL::getId( "mu-" );
47  static EvtId TAUM = EvtPDL::getId( "tau-" );
48  static EvtId EP = EvtPDL::getId( "e+" );
49  static EvtId MUP = EvtPDL::getId( "mu+" );
50  static EvtId TAUP = EvtPDL::getId( "tau+" );
51 
52  //Add the lepton and neutrino 4 momenta to find q2
53 
54  EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
55  double q2 = ( q.mass2() );
56 
57  double f1v, f1a, f2v, f2a;
58  double m_meson = parent->getDaug( 0 )->mass();
59 
60  FormFactors->getbaryonff( parent->getId(), parent->getDaug( 0 )->getId(),
61  q2, m_meson, &f1v, &f1a, &f2v, &f2a );
62 
63  EvtVector4R p4b;
64  p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
65 
66  EvtVector4C temp_00_term1;
67  EvtVector4C temp_00_term2;
68 
69  EvtVector4C temp_01_term1;
70  EvtVector4C temp_01_term2;
71 
72  EvtVector4C temp_10_term1;
73  EvtVector4C temp_10_term2;
74 
75  EvtVector4C temp_11_term1;
76  EvtVector4C temp_11_term2;
77 
78  EvtDiracSpinor p0 = parent->sp( 0 );
79  EvtDiracSpinor p1 = parent->sp( 1 );
80 
81  EvtDiracSpinor d0 = parent->getDaug( 0 )->spParent( 0 );
82  EvtDiracSpinor d1 = parent->getDaug( 0 )->spParent( 1 );
83 
84  temp_00_term1.set( 0, f1v * ( d0 * ( EvtGammaMatrix::g0() * p0 ) ) );
85  temp_00_term2.set(
86  0,
87  f1a * ( d0 * ( ( EvtGammaMatrix::g0() * EvtGammaMatrix::g5() ) * p0 ) ) );
88  temp_01_term1.set( 0, f1v * ( d0 * ( EvtGammaMatrix::g0() * p1 ) ) );
89  temp_01_term2.set(
90  0,
91  f1a * ( d0 * ( ( EvtGammaMatrix::g0() * EvtGammaMatrix::g5() ) * p1 ) ) );
92  temp_10_term1.set( 0, f1v * ( d1 * ( EvtGammaMatrix::g0() * p0 ) ) );
93  temp_10_term2.set(
94  0,
95  f1a * ( d1 * ( ( EvtGammaMatrix::g0() * EvtGammaMatrix::g5() ) * p0 ) ) );
96  temp_11_term1.set( 0, f1v * ( d1 * ( EvtGammaMatrix::g0() * p1 ) ) );
97  temp_11_term2.set(
98  0,
99  f1a * ( d1 * ( ( EvtGammaMatrix::g0() * EvtGammaMatrix::g5() ) * p1 ) ) );
100 
101  temp_00_term1.set( 1, f1v * ( d0 * ( EvtGammaMatrix::g1() * p0 ) ) );
102  temp_00_term2.set(
103  1,
104  f1a * ( d0 * ( ( EvtGammaMatrix::g1() * EvtGammaMatrix::g5() ) * p0 ) ) );
105  temp_01_term1.set( 1, f1v * ( d0 * ( EvtGammaMatrix::g1() * p1 ) ) );
106  temp_01_term2.set(
107  1,
108  f1a * ( d0 * ( ( EvtGammaMatrix::g1() * EvtGammaMatrix::g5() ) * p1 ) ) );
109  temp_10_term1.set( 1, f1v * ( d1 * ( EvtGammaMatrix::g1() * p0 ) ) );
110  temp_10_term2.set(
111  1,
112  f1a * ( d1 * ( ( EvtGammaMatrix::g1() * EvtGammaMatrix::g5() ) * p0 ) ) );
113  temp_11_term1.set( 1, f1v * ( d1 * ( EvtGammaMatrix::g1() * p1 ) ) );
114  temp_11_term2.set(
115  1,
116  f1a * ( d1 * ( ( EvtGammaMatrix::g1() * EvtGammaMatrix::g5() ) * p1 ) ) );
117 
118  temp_00_term1.set( 2, f1v * ( d0 * ( EvtGammaMatrix::g2() * p0 ) ) );
119  temp_00_term2.set(
120  2,
121  f1a * ( d0 * ( ( EvtGammaMatrix::g2() * EvtGammaMatrix::g5() ) * p0 ) ) );
122  temp_01_term1.set( 2, f1v * ( d0 * ( EvtGammaMatrix::g2() * p1 ) ) );
123  temp_01_term2.set(
124  2,
125  f1a * ( d0 * ( ( EvtGammaMatrix::g2() * EvtGammaMatrix::g5() ) * p1 ) ) );
126  temp_10_term1.set( 2, f1v * ( d1 * ( EvtGammaMatrix::g2() * p0 ) ) );
127  temp_10_term2.set(
128  2,
129  f1a * ( d1 * ( ( EvtGammaMatrix::g2() * EvtGammaMatrix::g5() ) * p0 ) ) );
130  temp_11_term1.set( 2, f1v * ( d1 * ( EvtGammaMatrix::g2() * p1 ) ) );
131  temp_11_term2.set(
132  2,
133  f1a * ( d1 * ( ( EvtGammaMatrix::g2() * EvtGammaMatrix::g5() ) * p1 ) ) );
134 
135  temp_00_term1.set( 3, f1v * ( d0 * ( EvtGammaMatrix::g3() * p0 ) ) );
136  temp_00_term2.set(
137  3,
138  f1a * ( d0 * ( ( EvtGammaMatrix::g3() * EvtGammaMatrix::g5() ) * p0 ) ) );
139  temp_01_term1.set( 3, f1v * ( d0 * ( EvtGammaMatrix::g3() * p1 ) ) );
140  temp_01_term2.set(
141  3,
142  f1a * ( d0 * ( ( EvtGammaMatrix::g3() * EvtGammaMatrix::g5() ) * p1 ) ) );
143  temp_10_term1.set( 3, f1v * ( d1 * ( EvtGammaMatrix::g3() * p0 ) ) );
144  temp_10_term2.set(
145  3,
146  f1a * ( d1 * ( ( EvtGammaMatrix::g3() * EvtGammaMatrix::g5() ) * p0 ) ) );
147  temp_11_term1.set( 3, f1v * ( d1 * ( EvtGammaMatrix::g3() * p1 ) ) );
148  temp_11_term2.set(
149  3,
150  f1a * ( d1 * ( ( EvtGammaMatrix::g3() * EvtGammaMatrix::g5() ) * p1 ) ) );
151 
152  EvtVector4C l1, l2;
153 
154  EvtId l_num = parent->getDaug( 1 )->getId();
155  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
156  l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
157  parent->getDaug( 2 )->spParentNeutrino() );
158  l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
159  parent->getDaug( 2 )->spParentNeutrino() );
160  } else {
161  if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
162  l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
163  parent->getDaug( 1 )->spParent( 0 ) );
164  l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
165  parent->getDaug( 1 )->spParent( 1 ) );
166  } else {
167  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
168  << "Wrong lepton number" << endl;
169  }
170  }
171 
172  amp.vertex( 0, 0, 0, l1.cont( temp_00_term1 + temp_00_term2 ) );
173  amp.vertex( 0, 0, 1, l2.cont( temp_00_term1 + temp_00_term2 ) );
174 
175  amp.vertex( 0, 1, 0, l1.cont( temp_01_term1 + temp_01_term2 ) );
176  amp.vertex( 0, 1, 1, l2.cont( temp_01_term1 + temp_01_term2 ) );
177 
178  amp.vertex( 1, 0, 0, l1.cont( temp_10_term1 + temp_10_term2 ) );
179  amp.vertex( 1, 0, 1, l2.cont( temp_10_term1 + temp_10_term2 ) );
180 
181  amp.vertex( 1, 1, 0, l1.cont( temp_11_term1 + temp_11_term2 ) );
182  amp.vertex( 1, 1, 1, l2.cont( temp_11_term1 + temp_11_term2 ) );
183 
184  return;
185 }
186 
188  EvtId lepton, EvtId nudaug,
189  EvtSemiLeptonicFF* FormFactors,
190  EvtComplex r00, EvtComplex r01,
191  EvtComplex r10, EvtComplex r11 )
192 {
193  //This routine takes the arguements parent, baryon, and lepton
194  //number, and a form factor model, and returns a maximum
195  //probability for this semileptonic form factor model. A
196  //brute force method is used. The 2D cos theta lepton and
197  //q2 phase space is probed.
198 
199  //Start by declaring a particle at rest.
200 
201  //It only makes sense to have a scalar parent. For now.
202  //This should be generalized later.
203 
204  // EvtScalarParticle *scalar_part;
205  // scalar_part=new EvtScalarParticle;
206 
207  EvtDiracParticle* dirac_part;
208  EvtParticle* root_part;
209  dirac_part = new EvtDiracParticle;
210 
211  //cludge to avoid generating random numbers!
212  // scalar_part->noLifeTime();
213  dirac_part->noLifeTime();
214 
215  EvtVector4R p_init;
216 
217  p_init.set( EvtPDL::getMass( parent ), 0.0, 0.0, 0.0 );
218  // scalar_part->init(parent,p_init);
219  // root_part=(EvtParticle *)scalar_part;
220  // root_part->set_type(EvtSpinType::SCALAR);
221 
222  dirac_part->init( parent, p_init );
223  root_part = (EvtParticle*)dirac_part;
224  root_part->setDiagonalSpinDensity();
225 
226  EvtParticle *daughter, *lep, *trino;
227 
228  EvtAmp amp;
229 
230  EvtId listdaug[3];
231  listdaug[0] = baryon;
232  listdaug[1] = lepton;
233  listdaug[2] = nudaug;
234 
235  amp.init( parent, 3, listdaug );
236 
237  root_part->makeDaughters( 3, listdaug );
238  daughter = root_part->getDaug( 0 );
239  lep = root_part->getDaug( 1 );
240  trino = root_part->getDaug( 2 );
241 
242  //cludge to avoid generating random numbers!
243  daughter->noLifeTime();
244  lep->noLifeTime();
245  trino->noLifeTime();
246 
247  //Initial particle is unpolarized, well it is a scalar so it is
248  //trivial
249  EvtSpinDensity rho;
250  rho.setDiag( root_part->getSpinStates() );
251 
252  double mass[3];
253 
254  double m = root_part->mass();
255 
256  EvtVector4R p4baryon, p4lepton, p4nu, p4w;
257  double q2max;
258 
259  double q2, elepton, plepton;
260  int i, j;
261  double erho, prho, costl;
262 
263  double maxfoundprob = 0.0;
264  double prob = -10.0;
265  int massiter;
266 
267  for ( massiter = 0; massiter < 3; massiter++ ) {
268  mass[0] = EvtPDL::getMass( baryon );
269  mass[1] = EvtPDL::getMass( lepton );
270  mass[2] = EvtPDL::getMass( nudaug );
271  if ( massiter == 1 ) {
272  mass[0] = EvtPDL::getMinMass( baryon );
273  }
274  if ( massiter == 2 ) {
275  mass[0] = EvtPDL::getMaxMass( baryon );
276  }
277 
278  q2max = ( m - mass[0] ) * ( m - mass[0] );
279 
280  //loop over q2
281 
282  for ( i = 0; i < 25; i++ ) {
283  q2 = ( ( i + 0.5 ) * q2max ) / 25.0;
284 
285  erho = ( m * m + mass[0] * mass[0] - q2 ) / ( 2.0 * m );
286 
287  prho = sqrt( erho * erho - mass[0] * mass[0] );
288 
289  p4baryon.set( erho, 0.0, 0.0, -1.0 * prho );
290  p4w.set( m - erho, 0.0, 0.0, prho );
291 
292  //This is in the W rest frame
293  elepton = ( q2 + mass[1] * mass[1] ) / ( 2.0 * sqrt( q2 ) );
294  plepton = sqrt( elepton * elepton - mass[1] * mass[1] );
295 
296  double probctl[3];
297 
298  for ( j = 0; j < 3; j++ ) {
299  costl = 0.99 * ( j - 1.0 );
300 
301  //These are in the W rest frame. Need to boost out into
302  //the B frame.
303  p4lepton.set( elepton, 0.0, plepton * sqrt( 1.0 - costl * costl ),
304  plepton * costl );
305  p4nu.set( plepton, 0.0,
306  -1.0 * plepton * sqrt( 1.0 - costl * costl ),
307  -1.0 * plepton * costl );
308 
309  EvtVector4R boost( ( m - erho ), 0.0, 0.0, 1.0 * prho );
310  p4lepton = boostTo( p4lepton, boost );
311  p4nu = boostTo( p4nu, boost );
312 
313  //Now initialize the daughters...
314 
315  daughter->init( baryon, p4baryon );
316  lep->init( lepton, p4lepton );
317  trino->init( nudaug, p4nu );
318 
319  CalcAmp( root_part, amp, FormFactors, r00, r01, r10, r11 );
320 
321  //Now find the probability at this q2 and cos theta lepton point
322  //and compare to maxfoundprob.
323 
324  //Do a little magic to get the probability!!
325  prob = rho.normalizedProb( amp.getSpinDensity() );
326 
327  probctl[j] = prob;
328  }
329 
330  //probclt contains prob at ctl=-1,0,1.
331  //prob=a+b*ctl+c*ctl^2
332 
333  double a = probctl[1];
334  double b = 0.5 * ( probctl[2] - probctl[0] );
335  double c = 0.5 * ( probctl[2] + probctl[0] ) - probctl[1];
336 
337  prob = probctl[0];
338  if ( probctl[1] > prob )
339  prob = probctl[1];
340  if ( probctl[2] > prob )
341  prob = probctl[2];
342 
343  if ( fabs( c ) > 1e-20 ) {
344  double ctlx = -0.5 * b / c;
345  if ( fabs( ctlx ) < 1.0 ) {
346  double probtmp = a + b * ctlx + c * ctlx * ctlx;
347  if ( probtmp > prob )
348  prob = probtmp;
349  }
350  }
351 
352  //EvtGenReport(EVTGEN_DEBUG,"EvtGen") << "prob,probctl:"<<prob<<" "
353  // << probctl[0]<<" "
354  // << probctl[1]<<" "
355  // << probctl[2]<<std::endl;
356 
357  if ( prob > maxfoundprob ) {
358  maxfoundprob = prob;
359  }
360  }
361  if ( EvtPDL::getWidth( baryon ) <= 0.0 ) {
362  //if the particle is narrow dont bother with changing the mass.
363  massiter = 4;
364  }
365  }
366  root_part->deleteTree();
367 
368  maxfoundprob *= 1.1;
369  return maxfoundprob;
370 }
372  EvtSemiLeptonicFF* FormFactors,
373  EvtComplex r00, EvtComplex r01,
374  EvtComplex r10, EvtComplex r11 )
375 {
376  // Leptons
377  static EvtId EM = EvtPDL::getId( "e-" );
378  static EvtId MUM = EvtPDL::getId( "mu-" );
379  static EvtId TAUM = EvtPDL::getId( "tau-" );
380  // Anti-Leptons
381  static EvtId EP = EvtPDL::getId( "e+" );
382  static EvtId MUP = EvtPDL::getId( "mu+" );
383  static EvtId TAUP = EvtPDL::getId( "tau+" );
384 
385  // Baryons
386  static EvtId LAMCP = EvtPDL::getId( "Lambda_c+" );
387  static EvtId LAMC1P = EvtPDL::getId( "Lambda_c(2593)+" );
388  static EvtId LAMC2P = EvtPDL::getId( "Lambda_c(2625)+" );
389  static EvtId LAMB = EvtPDL::getId( "Lambda_b0" );
390 
391  // Anti-Baryons
392  static EvtId LAMCM = EvtPDL::getId( "anti-Lambda_c-" );
393  static EvtId LAMC1M = EvtPDL::getId( "anti-Lambda_c(2593)-" );
394  static EvtId LAMC2M = EvtPDL::getId( "anti-Lambda_c(2625)-" );
395  static EvtId LAMBB = EvtPDL::getId( "anti-Lambda_b0" );
396 
397  // Set the spin density matrix of the parent baryon
398  EvtSpinDensity rho;
399  rho.setDim( 2 );
400  rho.set( 0, 0, r00 );
401  rho.set( 0, 1, r01 );
402 
403  rho.set( 1, 0, r10 );
404  rho.set( 1, 1, r11 );
405 
406  EvtVector4R vector4P = parent->getP4Lab();
407  double pmag = vector4P.d3mag();
408  double cosTheta = vector4P.get( 3 ) / pmag;
409 
410  double theta = acos( cosTheta );
411  double phi = atan2( vector4P.get( 2 ), vector4P.get( 1 ) );
412 
413  parent->setSpinDensityForwardHelicityBasis( rho, phi, theta, 0.0 );
414  //parent->setSpinDensityForward(rho);
415 
416  // Set the four momentum of the parent baryon in it's rest frame
417  EvtVector4R p4b;
418  p4b.set( parent->mass(), 0.0, 0.0, 0.0 );
419 
420  // Get the four momentum of the daughter baryon in the parent's rest frame
421  EvtVector4R p4daught = parent->getDaug( 0 )->getP4();
422 
423  // Add the lepton and neutrino 4 momenta to find q (q^2)
424  EvtVector4R q = parent->getDaug( 1 )->getP4() + parent->getDaug( 2 )->getP4();
425 
426  double q2 = q.mass2();
427 
428  EvtId l_num = parent->getDaug( 1 )->getId();
429  EvtId bar_num = parent->getDaug( 0 )->getId();
430  EvtId par_num = parent->getId();
431 
432  double baryonmass = parent->getDaug( 0 )->mass();
433 
434  // Handle spin-1/2 daughter baryon Dirac spinor cases
435  if ( EvtPDL::getSpinType( parent->getDaug( 0 )->getId() ) ==
437  // Set the form factors
438  double f1, f2, f3, g1, g2, g3;
439  FormFactors->getdiracff( par_num, bar_num, q2, baryonmass, &f1, &f2,
440  &f3, &g1, &g2, &g3 );
441 
442  const double form_fact[6] = {f1, f2, f3, g1, g2, g3};
443 
444  EvtVector4C b11, b12, b21, b22, l1, l2;
445 
446  // Lepton Current
447  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
448  l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
449  parent->getDaug( 2 )->spParentNeutrino() );
450  l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
451  parent->getDaug( 2 )->spParentNeutrino() );
452 
453  } else if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
454  l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
455  parent->getDaug( 1 )->spParent( 0 ) );
456  l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
457  parent->getDaug( 1 )->spParent( 1 ) );
458 
459  } else {
460  EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Wrong lepton number \n";
461  ::abort();
462  }
463 
464  // Baryon current
465 
466  // Flag for particle/anti-particle parent, daughter with same/opp. parity
467  // pflag = 0 => particle, same parity parent, daughter
468  // pflag = 1 => particle, opp. parity parent, daughter
469  // pflag = 2 => anti-particle, same parity parent, daughter
470  // pflag = 3 => anti-particle, opp. parity parent, daughter
471 
472  int pflag = 0;
473 
474  // Handle 1/2+ -> 1/2+ first
475  if ( ( par_num == LAMB && bar_num == LAMCP ) ||
476  ( par_num == LAMBB && bar_num == LAMCM ) ) {
477  // Set particle/anti-particle flag
478  if ( bar_num == LAMCP )
479  pflag = 0;
480  else if ( bar_num == LAMCM )
481  pflag = 2;
482 
483  b11 = EvtBaryonVACurrent( parent->getDaug( 0 )->spParent( 0 ),
484  parent->sp( 0 ), p4b, p4daught, form_fact,
485  pflag );
486  b21 = EvtBaryonVACurrent( parent->getDaug( 0 )->spParent( 0 ),
487  parent->sp( 1 ), p4b, p4daught, form_fact,
488  pflag );
489  b12 = EvtBaryonVACurrent( parent->getDaug( 0 )->spParent( 1 ),
490  parent->sp( 0 ), p4b, p4daught, form_fact,
491  pflag );
492  b22 = EvtBaryonVACurrent( parent->getDaug( 0 )->spParent( 1 ),
493  parent->sp( 1 ), p4b, p4daught, form_fact,
494  pflag );
495  }
496 
497  // Handle 1/2+ -> 1/2- second
498  else if ( ( par_num == LAMB && bar_num == LAMC1P ) ||
499  ( par_num == LAMBB && bar_num == LAMC1M ) ) {
500  // Set particle/anti-particle flag
501  if ( bar_num == LAMC1P )
502  pflag = 1;
503  else if ( bar_num == LAMC1M )
504  pflag = 3;
505 
506  b11 = EvtBaryonVACurrent( ( parent->getDaug( 0 )->spParent( 0 ) ),
507  ( EvtGammaMatrix::g5() * parent->sp( 0 ) ),
508  p4b, p4daught, form_fact, pflag );
509  b21 = EvtBaryonVACurrent( ( parent->getDaug( 0 )->spParent( 0 ) ),
510  ( EvtGammaMatrix::g5() * parent->sp( 1 ) ),
511  p4b, p4daught, form_fact, pflag );
512  b12 = EvtBaryonVACurrent( ( parent->getDaug( 0 )->spParent( 1 ) ),
513  ( EvtGammaMatrix::g5() * parent->sp( 0 ) ),
514  p4b, p4daught, form_fact, pflag );
515  b22 = EvtBaryonVACurrent( ( parent->getDaug( 0 )->spParent( 1 ) ),
516  ( EvtGammaMatrix::g5() * parent->sp( 1 ) ),
517  p4b, p4daught, form_fact, pflag );
518 
519  }
520 
521  else {
522  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
523  << "Dirac semilep. baryon current "
524  << "not implemented for this decay sequence." << std::endl;
525  ::abort();
526  }
527 
528  amp.vertex( 0, 0, 0, l1 * b11 );
529  amp.vertex( 0, 0, 1, l2 * b11 );
530 
531  amp.vertex( 1, 0, 0, l1 * b21 );
532  amp.vertex( 1, 0, 1, l2 * b21 );
533 
534  amp.vertex( 0, 1, 0, l1 * b12 );
535  amp.vertex( 0, 1, 1, l2 * b12 );
536 
537  amp.vertex( 1, 1, 0, l1 * b22 );
538  amp.vertex( 1, 1, 1, l2 * b22 );
539 
540  }
541 
542  // Need special handling for the spin-3/2 daughter baryon
543  // Rarita-Schwinger spinor cases
544  else if ( EvtPDL::getSpinType( parent->getDaug( 0 )->getId() ) ==
546  // Set the form factors
547  double f1, f2, f3, f4, g1, g2, g3, g4;
548  FormFactors->getraritaff( par_num, bar_num, q2, baryonmass, &f1, &f2,
549  &f3, &f4, &g1, &g2, &g3, &g4 );
550 
551  const double form_fact[8] = {f1, f2, f3, f4, g1, g2, g3, g4};
552 
553  EvtId l_num = parent->getDaug( 1 )->getId();
554 
555  EvtVector4C b11, b12, b21, b22, b13, b23, b14, b24, l1, l2;
556 
557  // Lepton Current
558  if ( l_num == EM || l_num == MUM || l_num == TAUM ) {
559  // Lepton Current
560  l1 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 0 ),
561  parent->getDaug( 2 )->spParentNeutrino() );
562  l2 = EvtLeptonVACurrent( parent->getDaug( 1 )->spParent( 1 ),
563  parent->getDaug( 2 )->spParentNeutrino() );
564  } else if ( l_num == EP || l_num == MUP || l_num == TAUP ) {
565  l1 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
566  parent->getDaug( 1 )->spParent( 0 ) );
567  l2 = EvtLeptonVACurrent( parent->getDaug( 2 )->spParentNeutrino(),
568  parent->getDaug( 1 )->spParent( 1 ) );
569 
570  } else {
571  EvtGenReport( EVTGEN_ERROR, "EvtGen" ) << "Wrong lepton number \n";
572  }
573 
574  // Baryon Current
575  // Declare particle, anti-particle flag, same/opp. parity
576  // pflag = 0 => particle
577  // pflag = 1 => anti-particle
578  int pflag = 0;
579 
580  // Handle cases of 1/2+ -> 3/2-
581  if ( par_num == LAMB && bar_num == LAMC2P ) {
582  // Set flag for particle case
583  pflag = 0;
584  } else if ( par_num == LAMBB && bar_num == LAMC2M ) {
585  // Set flag for anti-particle case
586  pflag = 1;
587  } else {
588  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
589  << "Rarita-Schwinger semilep. baryon current "
590  << "not implemented for this decay sequence." << std::endl;
591  ::abort();
592  }
593 
594  // Baryon current
595  b11 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 0 ),
596  parent->sp( 0 ), p4b, p4daught,
597  form_fact, pflag );
598  b21 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 0 ),
599  parent->sp( 1 ), p4b, p4daught,
600  form_fact, pflag );
601 
602  b12 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 1 ),
603  parent->sp( 0 ), p4b, p4daught,
604  form_fact, pflag );
605  b22 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 1 ),
606  parent->sp( 1 ), p4b, p4daught,
607  form_fact, pflag );
608 
609  b13 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 2 ),
610  parent->sp( 0 ), p4b, p4daught,
611  form_fact, pflag );
612  b23 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 2 ),
613  parent->sp( 1 ), p4b, p4daught,
614  form_fact, pflag );
615 
616  b14 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 3 ),
617  parent->sp( 0 ), p4b, p4daught,
618  form_fact, pflag );
619  b24 = EvtBaryonVARaritaCurrent( parent->getDaug( 0 )->spRSParent( 3 ),
620  parent->sp( 1 ), p4b, p4daught,
621  form_fact, pflag );
622 
623  amp.vertex( 0, 0, 0, l1 * b11 );
624  amp.vertex( 0, 0, 1, l2 * b11 );
625 
626  amp.vertex( 1, 0, 0, l1 * b21 );
627  amp.vertex( 1, 0, 1, l2 * b21 );
628 
629  amp.vertex( 0, 1, 0, l1 * b12 );
630  amp.vertex( 0, 1, 1, l2 * b12 );
631 
632  amp.vertex( 1, 1, 0, l1 * b22 );
633  amp.vertex( 1, 1, 1, l2 * b22 );
634 
635  amp.vertex( 0, 2, 0, l1 * b13 );
636  amp.vertex( 0, 2, 1, l2 * b13 );
637 
638  amp.vertex( 1, 2, 0, l1 * b23 );
639  amp.vertex( 1, 2, 1, l2 * b23 );
640 
641  amp.vertex( 0, 3, 0, l1 * b14 );
642  amp.vertex( 0, 3, 1, l2 * b14 );
643 
644  amp.vertex( 1, 3, 0, l1 * b24 );
645  amp.vertex( 1, 3, 1, l2 * b24 );
646  }
647 }
648 
650  const EvtDiracSpinor& Bf, const EvtDiracSpinor& Bi, EvtVector4R parent,
651  EvtVector4R daught, const double* ff, int pflag )
652 {
653  // flag == 0 => particle, same parity
654  // flag == 1 => particle, opposite parity
655  // flag == 2 => anti-particle, same parity
656  // flag == 3 => anti-particle, opposite parity
657 
658  // particle
659  EvtComplex cv = EvtComplex( 1.0, 0. );
660  EvtComplex ca = EvtComplex( 1.0, 0. );
661 
662  EvtComplex cg0 = EvtComplex( 1.0, 0. );
663  EvtComplex cg5 = EvtComplex( 1.0, 0. );
664 
665  // antiparticle- same parity parent & daughter
666  if ( pflag == 2 ) {
667  cv = EvtComplex( -1.0, 0. );
668  ca = EvtComplex( 1.0, 0. );
669 
670  cg0 = EvtComplex( 1.0, 0.0 );
671  cg5 = EvtComplex( 0.0, -1.0 );
672  }
673  // antiparticle- opposite parity parent & daughter
674  else if ( pflag == 3 ) {
675  cv = EvtComplex( 1.0, 0. );
676  ca = EvtComplex( -1.0, 0. );
677 
678  cg0 = EvtComplex( 0.0, -1.0 );
679  cg5 = EvtComplex( 1.0, 0.0 );
680  }
681 
682  EvtVector4C t[6];
683 
684  // Term 1 = \bar{u}(p',s')*(F_1(q^2)*\gamma_{mu})*u(p,s)
685  t[0] = cv * EvtLeptonVCurrent( Bf, Bi );
686 
687  // Term 2 = \bar{u}(p',s')*(F_2(q^2)*(p_{mu}/m_{\Lambda_Q}))*u(p,s)
688  t[1] = cg0 * EvtLeptonSCurrent( Bf, Bi ) * ( parent / parent.mass() );
689 
690  // Term 3 = \bar{u}(p',s')*(F_3(q^2)*(p'_{mu}/m_{\Lambda_q}))*u(p,s)
691  t[2] = cg0 * EvtLeptonSCurrent( Bf, Bi ) * ( daught / daught.mass() );
692 
693  // Term 4 = \bar{u}(p',s')*(G_1(q^2)*\gamma_{mu}*\gamma_5)*u(p,s)
694  t[3] = ca * EvtLeptonACurrent( Bf, Bi );
695 
696  // Term 5 = \bar{u}(p',s')*(G_2(q^2)*(p_{mu}/m_{\Lambda_Q})*\gamma_5)*u(p,s)
697  t[4] = cg5 * EvtLeptonPCurrent( Bf, Bi ) * ( parent / parent.mass() );
698 
699  // Term 6 = \bar{u}(p',s')*(G_3(q^2)*(p'_{mu}/m_{\Lambda_q})*\gamma_5)*u(p,s)
700  t[5] = cg5 * EvtLeptonPCurrent( Bf, Bi ) * ( daught / daught.mass() );
701 
702  // Sum the individual terms
703  EvtVector4C current = ( ff[0] * t[0] + ff[1] * t[1] + ff[2] * t[2] -
704  ff[3] * t[3] - ff[4] * t[4] - ff[5] * t[5] );
705 
706  return current;
707 }
708 
710  const EvtRaritaSchwinger& Bf, const EvtDiracSpinor& Bi, EvtVector4R parent,
711  EvtVector4R daught, const double* ff, int pflag )
712 {
713  // flag == 0 => particle
714  // flag == 1 => anti-particle
715 
716  // particle
717  EvtComplex cv = EvtComplex( 1.0, 0. );
718  EvtComplex ca = EvtComplex( 1.0, 0. );
719 
720  EvtComplex cg0 = EvtComplex( 1.0, 0. );
721  EvtComplex cg5 = EvtComplex( 1.0, 0. );
722 
723  // antiparticle
724  if ( pflag == 1 ) {
725  cv = EvtComplex( -1.0, 0. );
726  ca = EvtComplex( 1.0, 0. );
727 
728  cg0 = EvtComplex( 1.0, 0.0 );
729  cg5 = EvtComplex( 0.0, -1.0 );
730  }
731 
732  EvtVector4C t[8];
733  EvtTensor4C id;
734  id.setdiag( 1.0, 1.0, 1.0, 1.0 );
735 
736  EvtDiracSpinor tmp;
737  for ( int i = 0; i < 4; i++ ) {
738  tmp.set_spinor( i, Bf.getVector( i ) * parent );
739  }
740 
741  EvtVector4C v1, v2;
742  for ( int i = 0; i < 4; i++ ) {
743  v1.set( i, EvtLeptonSCurrent( Bf.getSpinor( i ), Bi ) );
744  v2.set( i, EvtLeptonPCurrent( Bf.getSpinor( i ), Bi ) );
745  }
746 
747  // Term 1 = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})*(F_1(q^2)*\gamma_{mu})*u(p,s)
748  t[0] = ( cv / parent.mass() ) * EvtLeptonVCurrent( tmp, Bi );
749 
750  // Term 2
751  // = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})*(F_2(q^2)*(p_{mu}/m_{\Lambda_Q}))*u(p,s)
752  t[1] = ( ( cg0 / parent.mass() ) * EvtLeptonSCurrent( tmp, Bi ) ) *
753  ( parent / parent.mass() );
754 
755  // Term 3
756  // = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})*(F_3(q^2)*(p'_{mu}/m_{\Lambda_q}))*u(p,s)
757  t[2] = ( ( cg0 / parent.mass() ) * EvtLeptonSCurrent( tmp, Bi ) ) *
758  ( daught / daught.mass() );
759 
760  // Term 4 = \bar{u}^{\alpha}(p',s')*(F_4(q^2)*g_{\alpha,\mu})*u(p,s)
761  t[3] = cg0 * ( id.cont2( v1 ) );
762 
763  // Term 5
764  // = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})*(G_1(q^2)*\gamma_{mu}*\gamma_5)*u(p,s)
765  t[4] = ( ca / parent.mass() ) * EvtLeptonACurrent( tmp, Bi );
766 
767  // Term 6
768  // = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})
769  // *(G_2(q^2)*(p_{mu}/m_{\Lambda_Q})*\gamma_5)*u(p,s)
770  t[5] = ( ( cg5 / parent.mass() ) * EvtLeptonPCurrent( tmp, Bi ) ) *
771  ( parent / parent.mass() );
772 
773  // Term 7
774  // = \bar{u}^{\alpha}(p',s')*(p_{\alpha}/m_{\Lambda_Q})
775  // *(G_3(q^2)*(p'_{mu}/m_{\Lambda_q})*\gamma_5)*u(p,s)
776  t[6] = ( ( cg5 / parent.mass() ) * EvtLeptonPCurrent( tmp, Bi ) ) *
777  ( daught / daught.mass() );
778 
779  // Term 8 = \bar{u}^{\alpha}(p',s')*(G_4(q^2)*g_{\alpha,\mu}*\gamma_5))*u(p,s)
780  t[7] = cg5 * ( id.cont2( v2 ) );
781 
782  // Sum the individual terms
783  EvtVector4C current = ( ff[0] * t[0] + ff[1] * t[1] + ff[2] * t[2] +
784  ff[3] * t[3] - ff[4] * t[4] - ff[5] * t[5] -
785  ff[6] * t[6] - ff[7] * t[7] );
786 
787  return current;
788 }
EvtVector4C EvtBaryonVACurrent(const EvtDiracSpinor &Bf, const EvtDiracSpinor &Bi, EvtVector4R parent, EvtVector4R daught, const double *ff, int pflag)
virtual EvtRaritaSchwinger spRSParent(int) const
void setdiag(double t00, double t11, double t22, double t33)
double CalcMaxProb(EvtId parent, EvtId meson, EvtId lepton, EvtId nudaug, EvtSemiLeptonicFF *FormFactors, EvtComplex r00, EvtComplex r01, EvtComplex r10, EvtComplex r11)
virtual void getraritaff(EvtId parent, EvtId daught, double q2, double mass, double *f1, double *f2, double *f3, double *f4, double *g1, double *g2, double *g3, double *g4)=0
void CalcAmp(EvtParticle *parent, EvtAmp &amp, EvtSemiLeptonicFF *FormFactors) override
void setDiag(int n)
virtual EvtDiracSpinor sp(int) const
static EvtSpinType::spintype getSpinType(EvtId i)
Definition: EvtPDL.cpp:377
EvtVector4R getP4Lab() const
void set(int, const EvtComplex &)
Definition: EvtVector4C.hh:98
static const EvtGammaMatrix & g0()
EvtComplex EvtLeptonPCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
double mass() const
Definition: EvtVector4R.cpp:49
void set_spinor(int i, const EvtComplex &sp)
int getSpinStates() const
EvtId getId() const
void makeDaughters(unsigned int ndaug, EvtId *id)
void set(int i, double d)
Definition: EvtVector4R.hh:167
EvtRaritaSchwinger boostTo(const EvtRaritaSchwinger &rs, const EvtVector4R p4)
void init(EvtId part_n, const EvtVector4R &p4) override
EvtSpinDensity getSpinDensity()
Definition: EvtAmp.cpp:142
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
double mass2() const
Definition: EvtVector4R.hh:100
static const EvtGammaMatrix & g1()
double get(int i) const
Definition: EvtVector4R.hh:162
void deleteTree()
Definition: EvtAmp.hh:30
EvtVector4C EvtBaryonVARaritaCurrent(const EvtRaritaSchwinger &Bf_vect, const EvtDiracSpinor &Bi, EvtVector4R parent, EvtVector4R daught, const double *ff, int pflag)
static double getMinMass(EvtId i)
Definition: EvtPDL.cpp:342
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
static const EvtGammaMatrix & g2()
double mass() const
void setSpinDensityForwardHelicityBasis(const EvtSpinDensity &rho)
static double getWidth(EvtId i)
Definition: EvtPDL.cpp:352
static const EvtGammaMatrix & g3()
virtual EvtDiracSpinor spParentNeutrino() const
double d3mag() const
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void setDiagonalSpinDensity()
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
EvtVector4C getVector(int i) const
EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void noLifeTime()
Definition: EvtParticle.hh:382
void set(int i, int j, const EvtComplex &rhoij)
EvtDiracSpinor getSpinor(int i) const
EvtComplex cont(const EvtVector4C &v4) const
Definition: EvtVector4C.hh:140
static double getMass(EvtId i)
Definition: EvtPDL.cpp:319
EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
void setDim(int n)
void init(EvtId p, int ndaug, EvtId *daug)
Definition: EvtAmp.cpp:68
static const EvtGammaMatrix & g5()
virtual void getbaryonff(EvtId parent, EvtId daught, double t, double m_meson, double *f1v, double *f1a, double *f2v, double *f2a)=0
static double getMaxMass(EvtId i)
Definition: EvtPDL.cpp:337
virtual void getdiracff(EvtId parent, EvtId daught, double q2, double mass, double *f1, double *f2, double *f3, double *g1, double *g2, double *g3)=0
double normalizedProb(const EvtSpinDensity &d)