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