1 //--------------------------------------------------------------------------
4 // This software is part of the EvtGen package developed jointly
5 // for the BaBar and CLEO collaborations. If you use all or part
6 // of it, please give an appropriate acknowledgement.
8 // Copyright Information: See EvtGen/COPYRIGHT
9 // Copyright (C) 1998 Caltech, UCSB
11 // Module: EvtGammaMatrix.cc
13 // Description: Make gamma matrices availible for the calc. of amplitudes, etc.
15 // Modification history:
17 // DJL/RYD September 25, 1996 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
25 #include "EvtGenBase/EvtComplex.hh"
26 #include "EvtGenBase/EvtGammaMatrix.hh"
27 #include "EvtGenBase/EvtDiracSpinor.hh"
28 #include "EvtGenBase/EvtReport.hh"
29 #include "EvtGenBase/EvtTensor4C.hh"
30 #include "EvtGenBase/EvtVector4C.hh"
35 EvtGammaMatrix::EvtGammaMatrix(){
38 static EvtComplex zero(0.0,0.0);
47 EvtGammaMatrix operator*(const EvtGammaMatrix& g, const EvtComplex& c)
53 EvtGammaMatrix operator*(const EvtComplex& c,const EvtGammaMatrix& g){
60 temp._gamma[i][j]=g._gamma[i][j]*c;
69 ostream& operator<<(ostream& s, const EvtGammaMatrix& g){
72 s<<"["<<g._gamma[0][0]<<","<<g._gamma[0][1]<<","<<g._gamma[0][2]<<","<<g._gamma[0][3]<<"]"<<endl;
73 s<<"["<<g._gamma[1][0]<<","<<g._gamma[1][1]<<","<<g._gamma[1][2]<<","<<g._gamma[1][3]<<"]"<<endl;
74 s<<"["<<g._gamma[2][0]<<","<<g._gamma[2][1]<<","<<g._gamma[2][2]<<","<<g._gamma[2][3]<<"]"<<endl;
75 s<<"["<<g._gamma[3][0]<<","<<g._gamma[3][1]<<","<<g._gamma[3][2]<<","<<g._gamma[3][3]<<"]"<<endl;
83 EvtGammaMatrix::EvtGammaMatrix(const EvtGammaMatrix& gm){
88 _gamma[i][j]=gm._gamma[i][j];
93 EvtGammaMatrix::~EvtGammaMatrix() {}
95 EvtGammaMatrix& EvtGammaMatrix::operator=(const EvtGammaMatrix& gm){
100 _gamma[i][j]=gm._gamma[i][j];
106 void EvtGammaMatrix::init(){
109 static EvtComplex zero(0.0,0.0);
118 const EvtGammaMatrix& EvtGammaMatrix::va0(){
120 static EvtGammaMatrix g;
125 g._gamma[0][0]=EvtComplex(1.0,0.0);
126 g._gamma[0][1]=EvtComplex(0.0,0.0);
127 g._gamma[0][2]=EvtComplex(-1.0,0.0);
128 g._gamma[0][3]=EvtComplex(0.0,0.0);
129 g._gamma[1][0]=EvtComplex(0.0,0.0);
130 g._gamma[1][1]=EvtComplex(1.0,0.0);
131 g._gamma[1][2]=EvtComplex(0.0,0.0);
132 g._gamma[1][3]=EvtComplex(-1.0,0.0);
133 g._gamma[2][0]=EvtComplex(-1.0,0.0);
134 g._gamma[2][1]=EvtComplex(0.0,0.0);
135 g._gamma[2][2]=EvtComplex(1.0,0.0);
136 g._gamma[2][3]=EvtComplex(0.0,0.0);
137 g._gamma[3][0]=EvtComplex(0.0,0.0);
138 g._gamma[3][1]=EvtComplex(-1.0,0.0);
139 g._gamma[3][2]=EvtComplex(0.0,0.0);
140 g._gamma[3][3]=EvtComplex(1.0,0.0);
148 const EvtGammaMatrix& EvtGammaMatrix::va1(){
150 static EvtGammaMatrix g;
155 g._gamma[0][0]=EvtComplex(0.0,0.0);
156 g._gamma[0][1]=EvtComplex(-1.0,0.0);
157 g._gamma[0][2]=EvtComplex(0.0,0.0);
158 g._gamma[0][3]=EvtComplex(1.0,0.0);
159 g._gamma[1][0]=EvtComplex(-1.0,0.0);
160 g._gamma[1][1]=EvtComplex(0.0,0.0);
161 g._gamma[1][2]=EvtComplex(1.0,0.0);
162 g._gamma[1][3]=EvtComplex(0.0,0.0);
163 g._gamma[2][0]=EvtComplex(0.0,0.0);
164 g._gamma[2][1]=EvtComplex(1.0,0.0);
165 g._gamma[2][2]=EvtComplex(0.0,0.0);
166 g._gamma[2][3]=EvtComplex(-1.0,0.0);
167 g._gamma[3][0]=EvtComplex(1.0,0.0);
168 g._gamma[3][1]=EvtComplex(0.0,0.0);
169 g._gamma[3][2]=EvtComplex(-1.0,0.0);
170 g._gamma[3][3]=EvtComplex(0.0,0.0);
179 const EvtGammaMatrix& EvtGammaMatrix::va2(){
181 static EvtGammaMatrix g;
186 g._gamma[0][0]=EvtComplex(0.0,0.0);
187 g._gamma[0][1]=EvtComplex(0.0,1.0);
188 g._gamma[0][2]=EvtComplex(0.0,0.0);
189 g._gamma[0][3]=EvtComplex(0.0,-1.0);
190 g._gamma[1][0]=EvtComplex(0.0,-1.0);
191 g._gamma[1][1]=EvtComplex(0.0,0.0);
192 g._gamma[1][2]=EvtComplex(0.0,1.0);
193 g._gamma[1][3]=EvtComplex(0.0,0.0);
194 g._gamma[2][0]=EvtComplex(0.0,0.0);
195 g._gamma[2][1]=EvtComplex(0.0,-1.0);
196 g._gamma[2][2]=EvtComplex(0.0,0.0);
197 g._gamma[2][3]=EvtComplex(0.0,1.0);
198 g._gamma[3][0]=EvtComplex(0.0,1.0);
199 g._gamma[3][1]=EvtComplex(0.0,0.0);
200 g._gamma[3][2]=EvtComplex(0.0,-1.0);
201 g._gamma[3][3]=EvtComplex(0.0,0.0);
211 const EvtGammaMatrix& EvtGammaMatrix::va3(){
213 static EvtGammaMatrix g;
218 g._gamma[0][0]=EvtComplex(-1.0,0.0);
219 g._gamma[0][1]=EvtComplex(0.0,0.0);
220 g._gamma[0][2]=EvtComplex(1.0,0.0);
221 g._gamma[0][3]=EvtComplex(0.0,0.0);
222 g._gamma[1][0]=EvtComplex(0.0,0.0);
223 g._gamma[1][1]=EvtComplex(1.0,0.0);
224 g._gamma[1][2]=EvtComplex(0.0,0.0);
225 g._gamma[1][3]=EvtComplex(-1.0,0.0);
226 g._gamma[2][0]=EvtComplex(1.0,0.0);
227 g._gamma[2][1]=EvtComplex(0.0,0.0);
228 g._gamma[2][2]=EvtComplex(-1.0,0.0);
229 g._gamma[2][3]=EvtComplex(0.0,0.0);
230 g._gamma[3][0]=EvtComplex(0.0,0.0);
231 g._gamma[3][1]=EvtComplex(-1.0,0.0);
232 g._gamma[3][2]=EvtComplex(0.0,0.0);
233 g._gamma[3][3]=EvtComplex(1.0,0.0);
244 const EvtGammaMatrix& EvtGammaMatrix::g0(){
246 static EvtGammaMatrix g;
257 g._gamma[i][j]=EvtComplex(0.0,0.0);
261 g._gamma[0][0]=EvtComplex(1.0,0.0);
262 g._gamma[1][1]=EvtComplex(1.0,0.0);
263 g._gamma[2][2]=EvtComplex(-1.0,0.0);
264 g._gamma[3][3]=EvtComplex(-1.0,0.0);
274 const EvtGammaMatrix& EvtGammaMatrix::g1(){
276 static EvtGammaMatrix g;
285 g._gamma[i][j]=EvtComplex(0.0,0.0);
289 g._gamma[0][3]=EvtComplex(1.0,0.0);
290 g._gamma[1][2]=EvtComplex(1.0,0.0);
291 g._gamma[2][1]=EvtComplex(-1.0,0.0);
292 g._gamma[3][0]=EvtComplex(-1.0,0.0);
302 const EvtGammaMatrix& EvtGammaMatrix::g2(){
304 static EvtGammaMatrix g;
313 g._gamma[i][j]=EvtComplex(0.0,0.0);
317 g._gamma[0][3]=EvtComplex(0.0,-1.0);
318 g._gamma[1][2]=EvtComplex(0.0,1.0);
319 g._gamma[2][1]=EvtComplex(0.0,1.0);
320 g._gamma[3][0]=EvtComplex(0.0,-1.0);
331 const EvtGammaMatrix& EvtGammaMatrix::g3(){
333 static EvtGammaMatrix g;
342 g._gamma[i][j]=EvtComplex(0.0,0.0);
346 g._gamma[0][2]=EvtComplex(1.0,0.0);
347 g._gamma[1][3]=EvtComplex(-1.0,0.0);
348 g._gamma[2][0]=EvtComplex(-1.0,0.0);
349 g._gamma[3][1]=EvtComplex(1.0,0.0);
359 const EvtGammaMatrix& EvtGammaMatrix::g5(){
361 static EvtGammaMatrix g;
370 g._gamma[i][j]=EvtComplex(0.0,0.0);
374 g._gamma[0][2]=EvtComplex(1.0,0.0);
375 g._gamma[1][3]=EvtComplex(1.0,0.0);
376 g._gamma[2][0]=EvtComplex(1.0,0.0);
377 g._gamma[3][1]=EvtComplex(1.0,0.0);
387 const EvtGammaMatrix& EvtGammaMatrix::g(int index) {
400 report(ERROR, "EvtGen") << "Invalid index for four vector: " << index << endl;
407 const EvtGammaMatrix& EvtGammaMatrix::v0(){
409 static EvtGammaMatrix g;
418 g._gamma[i][j]=EvtComplex(0.0,0.0);
422 g._gamma[0][0]=EvtComplex(1.0,0.0);
423 g._gamma[1][1]=EvtComplex(1.0,0.0);
424 g._gamma[2][2]=EvtComplex(1.0,0.0);
425 g._gamma[3][3]=EvtComplex(1.0,0.0);
436 const EvtGammaMatrix& EvtGammaMatrix::v1(){
438 static EvtGammaMatrix g;
447 g._gamma[i][j]=EvtComplex(0.0,0.0);
451 g._gamma[0][3]=EvtComplex(1.0,0.0);
452 g._gamma[1][2]=EvtComplex(1.0,0.0);
453 g._gamma[2][1]=EvtComplex(1.0,0.0);
454 g._gamma[3][0]=EvtComplex(1.0,0.0);
464 const EvtGammaMatrix& EvtGammaMatrix::v2(){
466 static EvtGammaMatrix g;
475 g._gamma[i][j]=EvtComplex(0.0,0.0);
479 g._gamma[0][3]=EvtComplex(0.0,-1.0);
480 g._gamma[1][2]=EvtComplex(0.0,1.0);
481 g._gamma[2][1]=EvtComplex(0.0,-1.0);
482 g._gamma[3][0]=EvtComplex(0.0,1.0);
492 const EvtGammaMatrix& EvtGammaMatrix::v3(){
494 static EvtGammaMatrix g;
503 g._gamma[i][j]=EvtComplex(0.0,0.0);
507 g._gamma[0][2]=EvtComplex(1.0,0.0);
508 g._gamma[1][3]=EvtComplex(-1.0,0.0);
509 g._gamma[2][0]=EvtComplex(1.0,0.0);
510 g._gamma[3][1]=EvtComplex(-1.0,0.0);
521 const EvtGammaMatrix& EvtGammaMatrix::id(){
523 static EvtGammaMatrix g;
532 g._gamma[i][j]=EvtComplex(0.0,0.0);
536 g._gamma[0][0]=EvtComplex(1.0,0.0);
537 g._gamma[1][1]=EvtComplex(1.0,0.0);
538 g._gamma[2][2]=EvtComplex(1.0,0.0);
539 g._gamma[3][3]=EvtComplex(1.0,0.0);
549 EvtGammaMatrix& EvtGammaMatrix::operator+=(const EvtGammaMatrix &g){
555 _gamma[i][j]+=g._gamma[i][j];
565 EvtGammaMatrix& EvtGammaMatrix::operator-=(const EvtGammaMatrix &g){
571 _gamma[i][j]-=g._gamma[i][j];
579 EvtGammaMatrix& EvtGammaMatrix::operator*=(const EvtGammaMatrix &g){
586 temp._gamma[i][j]=EvtComplex(0.0,0.0);
588 temp._gamma[i][j]+=_gamma[i][k]*g._gamma[k][j];
595 _gamma[i][j]=temp._gamma[i][j];
603 EvtDiracSpinor operator*(const EvtGammaMatrix& g,const EvtDiracSpinor& d){
609 temp.set_spinor(i,EvtComplex(0.0,0.0));
611 temp.set_spinor(i,temp.get_spinor(i)+g._gamma[i][j]*d.get_spinor(j));
619 const EvtGammaMatrix& EvtGammaMatrix::sigmaUpper(unsigned int mu, unsigned int nu)
622 static const EvtTensor4C eta = EvtTensor4C::g(); //metric
623 static EvtGammaMatrix sigma[4][4];
624 static bool hasBeenCalled = false;
628 for (int i=0; i<4; ++i)
629 sigma[i][i].init(); // set to 0
631 EvtGammaMatrix s01 = I/2 * (g0()*g1() - g1()*g0());
632 EvtGammaMatrix s02 = I/2 * (g0()*g2() - g2()*g0());
633 EvtGammaMatrix s03 = I/2 * (g0()*g3() - g3()*g0());
634 EvtGammaMatrix s12 = I/2 * (g1()*g2() - g2()*g1());
635 EvtGammaMatrix s13 = I/2 * (g1()*g3() - g3()*g1());
636 EvtGammaMatrix s23 = I/2 * (g2()*g3() - g3()*g2());
638 sigma[1][0] = -1*s01;
640 sigma[2][0] = -1*s02;
642 sigma[3][0] = -1*s03;
644 sigma[2][1] = -1*s12;
646 sigma[3][1] = -1*s13;
648 sigma[3][2] = -1*s23;
650 hasBeenCalled = true;
652 if (mu > 3 || nu > 3)
654 report(ERROR, "EvtSigmaTensor") << "Expected index between 0 and 3, but found " << nu << "!" << endl;
657 return sigma[mu][nu];
661 const EvtGammaMatrix& EvtGammaMatrix::sigmaLower(unsigned int mu, unsigned int nu)
663 const EvtComplex I(0, 1);
665 static EvtGammaMatrix sigma[4][4];
666 static bool hasBeenCalled = false;
667 static const EvtTensor4C eta = EvtTensor4C::g();
669 if (!hasBeenCalled) // has to be initialized only at the first call
672 for (int i=0; i<4; ++i)
674 a = eta.get(i, 0)*g0() + eta.get(i, 1)*g1() + eta.get(i, 2)*g2() + eta.get(i, 3)*g3();
675 for (int j=0; j<4; ++j)
677 b = eta.get(j, 0)*g0() + eta.get(j, 1)*g1() + eta.get(j, 2)*g2() + eta.get(j, 3)*g3();
678 sigma[i][j] = I/2 * (a*b - b*a);
682 return sigma[mu][nu];
686 EvtGammaMatrix EvtGenFunctions::slash(const EvtVector4C& p)
688 return EvtGammaMatrix::g0()*p.get(0) +
689 EvtGammaMatrix::g1()*p.get(1) +
690 EvtGammaMatrix::g2()*p.get(2) +
691 EvtGammaMatrix::g3()*p.get(3);
694 EvtGammaMatrix EvtGenFunctions::slash(const EvtVector4R& p)
696 return EvtGammaMatrix::g0()*p.get(0) +
697 EvtGammaMatrix::g1()*p.get(1) +
698 EvtGammaMatrix::g2()*p.get(2) +
699 EvtGammaMatrix::g3()*p.get(3);