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
EvtTensor4C.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
26#include <assert.h>
27#include <iostream>
28#include <math.h>
29using std::endl;
30using std::ostream;
31
33{
34 int i, j;
35
36 for ( i = 0; i < 4; i++ ) {
37 for ( j = 0; j < 4; j++ ) {
38 m_t[i][j] = t1.m_t[i][j];
39 }
40 }
41}
42
44{
45 static const EvtTensor4C g_metric( 1.0, -1.0, -1.0, -1.0 );
46
47 return g_metric;
48}
49
51{
52 int i, j;
53
54 for ( i = 0; i < 4; i++ ) {
55 for ( j = 0; j < 4; j++ ) {
56 m_t[i][j] = t1.m_t[i][j];
57 }
58 }
59 return *this;
60}
61
63{
64 EvtTensor4C temp;
65
66 int i, j;
67
68 for ( i = 0; i < 4; i++ ) {
69 for ( j = 0; j < 4; j++ ) {
70 temp.set( j, i, ::conj( m_t[i][j] ) );
71 }
72 }
73 return temp;
74}
75
76EvtTensor4C rotateEuler( const EvtTensor4C& rs, double alpha, double beta,
77 double gamma )
78{
79 EvtTensor4C tmp( rs );
80 tmp.applyRotateEuler( alpha, beta, gamma );
81 return tmp;
82}
83
85{
86 EvtTensor4C tmp( rs );
87 tmp.applyBoostTo( p4 );
88 return tmp;
89}
90
91EvtTensor4C boostTo( const EvtTensor4C& rs, const EvtVector3R boost )
92{
93 EvtTensor4C tmp( rs );
94 tmp.applyBoostTo( boost );
95 return tmp;
96}
97
99{
100 double e = p4.get( 0 );
101
102 EvtVector3R boost( p4.get( 1 ) / e, p4.get( 2 ) / e, p4.get( 3 ) / e );
103
104 applyBoostTo( boost );
105
106 return;
107}
108
110{
111 double bx, by, bz, gamma, b2;
112 double lambda[4][4];
113 EvtComplex tt[4][4];
114
115 bx = boost.get( 0 );
116 by = boost.get( 1 );
117 bz = boost.get( 2 );
118
119 double bxx = bx * bx;
120 double byy = by * by;
121 double bzz = bz * bz;
122
123 b2 = bxx + byy + bzz;
124
125 if ( b2 == 0.0 ) {
126 return;
127 }
128
129 assert( b2 < 1.0 );
130
131 gamma = 1.0 / sqrt( 1 - b2 );
132
133 int i, j, k;
134
135 if ( b2 == 0.0 ) {
136 return;
137 }
138
139 lambda[0][0] = gamma;
140 lambda[0][1] = gamma * bx;
141 lambda[1][0] = gamma * bx;
142 lambda[0][2] = gamma * by;
143 lambda[2][0] = gamma * by;
144 lambda[0][3] = gamma * bz;
145 lambda[3][0] = gamma * bz;
146
147 lambda[1][1] = 1.0 + ( gamma - 1.0 ) * bx * bx / b2;
148 lambda[2][2] = 1.0 + ( gamma - 1.0 ) * by * by / b2;
149 lambda[3][3] = 1.0 + ( gamma - 1.0 ) * bz * bz / b2;
150
151 lambda[1][2] = ( gamma - 1.0 ) * bx * by / b2;
152 lambda[2][1] = ( gamma - 1.0 ) * bx * by / b2;
153
154 lambda[1][3] = ( gamma - 1.0 ) * bx * bz / b2;
155 lambda[3][1] = ( gamma - 1.0 ) * bx * bz / b2;
156
157 lambda[3][2] = ( gamma - 1.0 ) * bz * by / b2;
158 lambda[2][3] = ( gamma - 1.0 ) * bz * by / b2;
159
160 for ( i = 0; i < 4; i++ ) {
161 for ( j = 0; j < 4; j++ ) {
162 tt[i][j] = EvtComplex( 0.0 );
163 for ( k = 0; k < 4; k++ ) {
164 tt[i][j] = tt[i][j] + lambda[j][k] * m_t[i][k];
165 }
166 }
167 }
168
169 for ( i = 0; i < 4; i++ ) {
170 for ( j = 0; j < 4; j++ ) {
171 m_t[i][j] = EvtComplex( 0.0 );
172 for ( k = 0; k < 4; k++ ) {
173 m_t[i][j] = m_t[i][j] + lambda[i][k] * tt[k][j];
174 }
175 }
176 }
177}
178
180{
181 int i, j;
182 for ( i = 0; i < 4; i++ ) {
183 for ( j = 0; j < 4; j++ ) {
184 m_t[i][j] = EvtComplex( 0.0, 0.0 );
185 }
186 }
187}
188
189ostream& operator<<( ostream& s, const EvtTensor4C& t )
190{
191 int i, j;
192 s << endl;
193 for ( i = 0; i < 4; i++ ) {
194 for ( j = 0; j < 4; j++ ) {
195 s << t.m_t[i][j];
196 }
197 s << endl;
198 }
199 return s;
200}
201
202void EvtTensor4C::setdiag( double g00, double g11, double g22, double g33 )
203{
204 m_t[0][0] = EvtComplex( g00 );
205 m_t[1][1] = EvtComplex( g11 );
206 m_t[2][2] = EvtComplex( g22 );
207 m_t[3][3] = EvtComplex( g33 );
208 m_t[0][1] = EvtComplex( 0.0 );
209 m_t[0][2] = EvtComplex( 0.0 );
210 m_t[0][3] = EvtComplex( 0.0 );
211 m_t[1][0] = EvtComplex( 0.0 );
212 m_t[1][2] = EvtComplex( 0.0 );
213 m_t[1][3] = EvtComplex( 0.0 );
214 m_t[2][0] = EvtComplex( 0.0 );
215 m_t[2][1] = EvtComplex( 0.0 );
216 m_t[2][3] = EvtComplex( 0.0 );
217 m_t[3][0] = EvtComplex( 0.0 );
218 m_t[3][1] = EvtComplex( 0.0 );
219 m_t[3][2] = EvtComplex( 0.0 );
220}
221
223{
224 int i, j;
225
226 for ( i = 0; i < 4; i++ ) {
227 for ( j = 0; j < 4; j++ ) {
228 m_t[i][j] += t2.get( i, j );
229 }
230 }
231 return *this;
232}
233
235{
236 int i, j;
237
238 for ( i = 0; i < 4; i++ ) {
239 for ( j = 0; j < 4; j++ ) {
240 m_t[i][j] -= t2.get( i, j );
241 }
242 }
243 return *this;
244}
245
247{
248 int i, j;
249
250 for ( i = 0; i < 4; i++ ) {
251 for ( j = 0; j < 4; j++ ) {
252 m_t[i][j] *= c;
253 }
254 }
255 return *this;
256}
257
259{
260 return EvtTensor4C( t1 ) *= c;
261}
262
264{
265 return EvtTensor4C( t1 ) *= c;
266}
267
269{
270 int i, j;
271
272 for ( i = 0; i < 4; i++ ) {
273 for ( j = 0; j < 4; j++ ) {
274 m_t[i][j] *= EvtComplex( d, 0.0 );
275 }
276 }
277 return *this;
278}
279
280EvtTensor4C operator*( const EvtTensor4C& t1, double d )
281{
282 return EvtTensor4C( t1 ) *= EvtComplex( d, 0.0 );
283}
284
285EvtTensor4C operator*( double d, const EvtTensor4C& t1 )
286{
287 return EvtTensor4C( t1 ) *= EvtComplex( d, 0.0 );
288}
289
290EvtComplex cont( const EvtTensor4C& t1, const EvtTensor4C& t2 )
291{
292 EvtComplex sum( 0.0, 0.0 );
293 int i, j;
294
295 for ( i = 0; i < 4; i++ ) {
296 for ( j = 0; j < 4; j++ ) {
297 if ( ( i == 0 && j != 0 ) || ( j == 0 && i != 0 ) ) {
298 sum -= t1.m_t[i][j] * t2.m_t[i][j];
299 } else {
300 sum += t1.m_t[i][j] * t2.m_t[i][j];
301 }
302 }
303 }
304
305 return sum;
306}
307
309 const EvtVector4C& c2 )
310{
311 EvtTensor4C temp;
312 int i, j;
313
314 for ( i = 0; i < 4; i++ ) {
315 for ( j = 0; j < 4; j++ ) {
316 temp.set( i, j, c1.get( i ) * c2.get( j ) );
317 }
318 }
319 return temp;
320}
321
323 const EvtVector4R& c2 )
324{
325 EvtTensor4C temp;
326 int i, j;
327
328 for ( i = 0; i < 4; i++ ) {
329 for ( j = 0; j < 4; j++ ) {
330 temp.set( i, j, c1.get( i ) * c2.get( j ) );
331 }
332 }
333 return temp;
334}
335
337 const EvtVector4R& c2 )
338{
339 EvtTensor4C temp;
340 int i, j;
341
342 for ( i = 0; i < 4; i++ ) {
343 for ( j = 0; j < 4; j++ ) {
344 temp.m_t[i][j] = EvtComplex( c1.get( i ) * c2.get( j ), 0.0 );
345 }
346 }
347 return temp;
348}
349
351 const EvtVector4R& p2 )
352{
353 int i, j;
354
355 for ( i = 0; i < 4; i++ ) {
356 for ( j = 0; j < 4; j++ ) {
357 m_t[i][j] += p1.get( i ) * p2.get( j );
358 }
359 }
360 return *this;
361}
362
364{
365 EvtTensor4C temp;
366
367 temp.set( 0, 0, EvtComplex( 0.0, 0.0 ) );
368 temp.set( 1, 1, EvtComplex( 0.0, 0.0 ) );
369 temp.set( 2, 2, EvtComplex( 0.0, 0.0 ) );
370 temp.set( 3, 3, EvtComplex( 0.0, 0.0 ) );
371
372 temp.set( 0, 1, t2.get( 3, 2 ) - t2.get( 2, 3 ) );
373 temp.set( 0, 2, -t2.get( 3, 1 ) + t2.get( 1, 3 ) );
374 temp.set( 0, 3, t2.get( 2, 1 ) - t2.get( 1, 2 ) );
375
376 temp.set( 1, 2, -t2.get( 3, 0 ) + t2.get( 0, 3 ) );
377 temp.set( 1, 3, t2.get( 2, 0 ) - t2.get( 0, 2 ) );
378
379 temp.set( 2, 3, -t2.get( 1, 0 ) + t2.get( 0, 1 ) );
380
381 temp.set( 1, 0, -temp.get( 0, 1 ) );
382 temp.set( 2, 0, -temp.get( 0, 2 ) );
383 temp.set( 3, 0, -temp.get( 0, 3 ) );
384
385 temp.set( 2, 1, -temp.get( 1, 2 ) );
386 temp.set( 3, 1, -temp.get( 1, 3 ) );
387
388 temp.set( 3, 2, -temp.get( 2, 3 ) );
389
390 return temp;
391}
392
394{
395 EvtTensor4C temp;
396
397 int i, j;
398
399 for ( i = 0; i < 4; i++ ) {
400 for ( j = 0; j < 4; j++ ) {
401 temp.set( i, j, ::conj( ( t2.get( i, j ) ) ) );
402 }
403 }
404
405 return temp;
406}
407
409{
410 EvtTensor4C temp;
411
412 int i, j;
413 EvtComplex c;
414
415 for ( i = 0; i < 4; i++ ) {
416 for ( j = 0; j < 4; j++ ) {
417 c = t1.get( i, 0 ) * t2.get( j, 0 ) -
418 t1.get( i, 1 ) * t2.get( j, 1 ) -
419 t1.get( i, 2 ) * t2.get( j, 2 ) - t1.get( i, 3 ) * t2.get( j, 3 );
420 temp.set( i, j, c );
421 }
422 }
423
424 return temp;
425}
426
428{
429 EvtTensor4C temp;
430
431 int i, j;
432 EvtComplex c;
433
434 for ( i = 0; i < 4; i++ ) {
435 for ( j = 0; j < 4; j++ ) {
436 c = t1.get( 0, i ) * t2.get( 0, j ) -
437 t1.get( 1, i ) * t2.get( 1, j ) -
438 t1.get( 2, i ) * t2.get( 2, j ) - t1.get( 3, i ) * t2.get( 3, j );
439 temp.set( i, j, c );
440 }
441 }
442
443 return temp;
444}
445
447{
448 EvtVector4C temp;
449
450 int i;
451
452 for ( i = 0; i < 4; i++ ) {
453 temp.set( i, m_t[0][i] * v4.get( 0 ) - m_t[1][i] * v4.get( 1 ) -
454 m_t[2][i] * v4.get( 2 ) - m_t[3][i] * v4.get( 3 ) );
455 }
456
457 return temp;
458}
459
461{
462 EvtVector4C temp;
463
464 int i;
465
466 for ( i = 0; i < 4; i++ ) {
467 temp.set( i, m_t[i][0] * v4.get( 0 ) - m_t[i][1] * v4.get( 1 ) -
468 m_t[i][2] * v4.get( 2 ) - m_t[i][3] * v4.get( 3 ) );
469 }
470
471 return temp;
472}
473
475{
476 EvtVector4C temp;
477
478 int i;
479
480 for ( i = 0; i < 4; i++ ) {
481 temp.set( i, m_t[0][i] * v4.get( 0 ) - m_t[1][i] * v4.get( 1 ) -
482 m_t[2][i] * v4.get( 2 ) - m_t[3][i] * v4.get( 3 ) );
483 }
484
485 return temp;
486}
487
489{
490 EvtVector4C temp;
491
492 int i;
493
494 for ( i = 0; i < 4; i++ ) {
495 temp.set( i, m_t[i][0] * v4.get( 0 ) - m_t[i][1] * v4.get( 1 ) -
496 m_t[i][2] * v4.get( 2 ) - m_t[i][3] * v4.get( 3 ) );
497 }
498
499 return temp;
500}
501
502void EvtTensor4C::applyRotateEuler( double phi, double theta, double ksi )
503{
504 EvtComplex tt[4][4];
505 double sp, st, sk, cp, ct, ck;
506 double lambda[4][4];
507
508 sp = sin( phi );
509 st = sin( theta );
510 sk = sin( ksi );
511 cp = cos( phi );
512 ct = cos( theta );
513 ck = cos( ksi );
514
515 lambda[0][0] = 1.0;
516 lambda[0][1] = 0.0;
517 lambda[1][0] = 0.0;
518 lambda[0][2] = 0.0;
519 lambda[2][0] = 0.0;
520 lambda[0][3] = 0.0;
521 lambda[3][0] = 0.0;
522
523 lambda[1][1] = ck * ct * cp - sk * sp;
524 lambda[1][2] = -sk * ct * cp - ck * sp;
525 lambda[1][3] = st * cp;
526
527 lambda[2][1] = ck * ct * sp + sk * cp;
528 lambda[2][2] = -sk * ct * sp + ck * cp;
529 lambda[2][3] = st * sp;
530
531 lambda[3][1] = -ck * st;
532 lambda[3][2] = sk * st;
533 lambda[3][3] = ct;
534
535 int i, j, k;
536
537 for ( i = 0; i < 4; i++ ) {
538 for ( j = 0; j < 4; j++ ) {
539 tt[i][j] = EvtComplex( 0.0 );
540 for ( k = 0; k < 4; k++ ) {
541 tt[i][j] += lambda[j][k] * m_t[i][k];
542 }
543 }
544 }
545
546 for ( i = 0; i < 4; i++ ) {
547 for ( j = 0; j < 4; j++ ) {
548 m_t[i][j] = EvtComplex( 0.0 );
549 for ( k = 0; k < 4; k++ ) {
550 m_t[i][j] += lambda[i][k] * tt[k][j];
551 }
552 }
553 }
554}
double lambda(double q, double m1, double m2)
Definition EvtFlatQ2.cpp:30
EvtTensor4C dual(const EvtTensor4C &t2)
ostream & operator<<(ostream &s, const EvtTensor4C &t)
EvtComplex cont(const EvtTensor4C &t1, const EvtTensor4C &t2)
EvtTensor4C rotateEuler(const EvtTensor4C &rs, double alpha, double beta, double gamma)
EvtTensor4C cont22(const EvtTensor4C &t1, const EvtTensor4C &t2)
EvtTensor4C cont11(const EvtTensor4C &t1, const EvtTensor4C &t2)
EvtTensor4C boostTo(const EvtTensor4C &rs, const EvtVector4R p4)
EvtTensor4C operator*(const EvtTensor4C &t1, const EvtComplex &c)
EvtTensor4C conj(const EvtTensor4C &t2)
void setdiag(double t00, double t11, double t22, double t33)
void set(int i, int j, const EvtComplex &c)
const EvtComplex & get(int i, int j) const
EvtTensor4C & operator=(const EvtTensor4C &t1)
EvtTensor4C & operator-=(const EvtTensor4C &t2)
EvtVector4C cont1(const EvtVector4C &v4) const
static const EvtTensor4C & g()
void applyBoostTo(const EvtVector4R &p4)
EvtTensor4C conj() const
EvtTensor4C & addDirProd(const EvtVector4R &p1, const EvtVector4R &p2)
EvtTensor4C & operator*=(const EvtComplex &c)
EvtVector4C cont2(const EvtVector4C &v4) const
EvtComplex m_t[4][4]
EvtTensor4C & operator+=(const EvtTensor4C &t2)
void applyRotateEuler(double alpha, double beta, double gamma)
friend EvtTensor4C conj(const EvtTensor4C &t2)
double get(int i) const
void set(int, const EvtComplex &)
const EvtComplex & get(int) const
double get(int i) const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)