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
EvtTensorParticle.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
28
29#include <cassert>
30#include <iostream>
31#include <math.h>
32#include <stdlib.h>
33
34void EvtTensorParticle::init( EvtId part_n, const EvtVector4R& p4 )
35{
36 init( part_n, p4.get( 0 ), p4.get( 1 ), p4.get( 2 ), p4.get( 3 ) );
37
39}
40
41void EvtTensorParticle::init( EvtId part_n, double e, double px, double py,
42 double pz )
43{
44 m_validP4 = true;
45 setp( e, px, py, pz );
46 setpart_num( part_n );
47
48 m_eps[0].setdiag( 0.0, -1.0 / sqrt( 6.0 ), -1.0 / sqrt( 6.0 ),
49 2.0 / sqrt( 6.0 ) );
50 m_eps[1].setdiag( 0.0, 1.0 / sqrt( 2.0 ), -1.0 / sqrt( 2.0 ), 0.0 );
51 m_eps[2].setdiag( 0.0, 0.0, 0.0, 0.0 );
52 m_eps[3].setdiag( 0.0, 0.0, 0.0, 0.0 );
53 m_eps[4].setdiag( 0.0, 0.0, 0.0, 0.0 );
54
55 m_eps[2].set( 1, 2, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
56 m_eps[2].set( 2, 1, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
57 m_eps[3].set( 1, 3, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
58 m_eps[3].set( 3, 1, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
59 m_eps[4].set( 2, 3, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
60 m_eps[4].set( 3, 2, EvtComplex( 1.0 / sqrt( 2.0 ), 0.0 ) );
61
63}
64
66 const EvtTensor4C& epsin1,
67 const EvtTensor4C& epsin2,
68 const EvtTensor4C& epsin3,
69 const EvtTensor4C& epsin4,
70 const EvtTensor4C& epsin5 )
71{
72 m_validP4 = true;
73 setp( p4 );
74 setpart_num( part_n );
75
76 m_eps[0] = epsin1;
77 m_eps[1] = epsin2;
78 m_eps[2] = epsin3;
79 m_eps[3] = epsin4;
80 m_eps[4] = epsin5;
81
83}
84
86{
87 assert( i >= 0 && static_cast<std::size_t>( i ) < m_eps.size() );
88
89 return boostTo( m_eps[i], this->getP4() );
90}
91
93{
94 assert( i >= 0 && static_cast<std::size_t>( i ) < m_eps.size() );
95 return m_eps[i];
96}
97
99{
100 static const EvtVector4C eplus( 0.0, -1.0 / sqrt( 2.0 ),
101 EvtComplex( 0.0, -1.0 / sqrt( 2.0 ) ), 0.0 );
102 static const EvtVector4C ezero( 0.0, 0.0, 0.0, 1.0 );
103 static const EvtVector4C eminus( 0.0, 1.0 / sqrt( 2.0 ),
104 EvtComplex( 0.0, -1.0 / sqrt( 2.0 ) ), 0.0 );
105
106 static const EvtTensor4C dPpp( EvtGenFunctions::directProd( eplus, eplus ) );
107 static const EvtTensor4C dPp0( EvtGenFunctions::directProd( eplus, ezero ) );
108 static const EvtTensor4C dP0p( EvtGenFunctions::directProd( ezero, eplus ) );
109 static const EvtTensor4C dPpm( EvtGenFunctions::directProd( eplus, eminus ) );
110 static const EvtTensor4C dP00( EvtGenFunctions::directProd( ezero, ezero ) );
111 static const EvtTensor4C dPmp( EvtGenFunctions::directProd( eminus, eplus ) );
112 static const EvtTensor4C dPmm( EvtGenFunctions::directProd( eminus, eminus ) );
113 static const EvtTensor4C dPm0( EvtGenFunctions::directProd( eminus, ezero ) );
114 static const EvtTensor4C dP0m( EvtGenFunctions::directProd( ezero, eminus ) );
115
116 static const EvtTensor4C es0( conj( dPpp ) );
117 static const EvtTensor4C es1(
118 conj( ( 1 / sqrt( 2.0 ) ) * dPp0 + ( 1 / sqrt( 2.0 ) ) * dP0p ) );
119 static const EvtTensor4C es2( conj( ( 1 / sqrt( 6.0 ) ) * dPpm +
120 ( 2 / sqrt( 6.0 ) ) * dP00 +
121 ( 1 / sqrt( 6.0 ) ) * dPmp ) );
122 static const EvtTensor4C es3(
123 conj( ( 1 / sqrt( 2.0 ) ) * dPm0 + ( 1 / sqrt( 2.0 ) ) * dP0m ) );
124 static const EvtTensor4C es4( conj( dPmm ) );
125
127 R.setDim( 5 );
128
129 for ( int j = 0; j < 5; j++ ) {
130 R.set( 0, j, cont( es0, m_eps[j] ) );
131 R.set( 1, j, cont( es1, m_eps[j] ) );
132 R.set( 2, j, cont( es2, m_eps[j] ) );
133 R.set( 3, j, cont( es3, m_eps[j] ) );
134 R.set( 4, j, cont( es4, m_eps[j] ) );
135 }
136 return R;
137}
138
140 double beta,
141 double gamma ) const
142{
143 EvtTensor4C es[5];
144
145 EvtVector4C eplus( 0.0, -1.0 / sqrt( 2.0 ),
146 EvtComplex( 0.0, -1.0 / sqrt( 2.0 ) ), 0.0 );
147 EvtVector4C ezero( 0.0, 0.0, 0.0, 1.0 );
148 EvtVector4C eminus( 0.0, 1.0 / sqrt( 2.0 ),
149 EvtComplex( 0.0, -1.0 / sqrt( 2.0 ) ), 0.0 );
150
151 eplus.applyRotateEuler( alpha, beta, gamma );
152 ezero.applyRotateEuler( alpha, beta, gamma );
153 eminus.applyRotateEuler( alpha, beta, gamma );
154
155 for ( int i = 0; i < 5; i++ )
156 es[i].zero();
157
158 es[0] = EvtGenFunctions::directProd( eplus, eplus );
159 es[1] = ( 1 / sqrt( 2.0 ) ) * EvtGenFunctions::directProd( eplus, ezero ) +
160 ( 1 / sqrt( 2.0 ) ) * EvtGenFunctions::directProd( ezero, eplus );
161 es[2] = ( 1 / sqrt( 6.0 ) ) * EvtGenFunctions::directProd( eplus, eminus ) +
162 ( 2 / sqrt( 6.0 ) ) * EvtGenFunctions::directProd( ezero, ezero ) +
163 ( 1 / sqrt( 6.0 ) ) * EvtGenFunctions::directProd( eminus, eplus );
164 es[3] = ( 1 / sqrt( 2.0 ) ) * EvtGenFunctions::directProd( eminus, ezero ) +
165 ( 1 / sqrt( 2.0 ) ) * EvtGenFunctions::directProd( ezero, eminus );
166 es[4] = EvtGenFunctions::directProd( eminus, eminus );
167
168 for ( int i = 0; i < 5; i++ )
169 es[i] = conj( es[i] );
170
172 R.setDim( 5 );
173
174 for ( int i = 0; i < 5; i++ )
175 for ( int j = 0; j < 5; j++ )
176 R.set( i, j, cont( es[i], m_eps[j] ) );
177
178 return R;
179}
EvtComplex conj(const EvtComplex &c)
EvtRaritaSchwinger boostTo(const EvtRaritaSchwinger &rs, const EvtVector4R p4)
EvtComplex cont(const EvtTensor4C &t1, const EvtTensor4C &t2)
Definition EvtId.hh:27
void setLifetime()
const EvtVector4R & getP4() const
void setp(double e, double px, double py, double pz)
void setpart_num(EvtId particle_number)
void setDim(int n)
void set(int i, int j, const EvtComplex &rhoij)
EvtSpinDensity rotateToHelicityBasis() const override
EvtTensor4C epsTensorParent(int i) const override
EvtTensor4C epsTensor(int i) const override
void init(EvtId part_n, double e, double px, double py, double pz)
std::array< EvtTensor4C, 5 > m_eps
void applyRotateEuler(double alpha, double beta, double gamma)
double get(int i) const
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)