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