]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenBase/EvtDiracSpinor.cxx
New plots for trending injector efficiencies (Melinda)
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtDiracSpinor.cxx
1 //--------------------------------------------------------------------------
2 //
3 // Environment:
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.
7 //
8 // Copyright Information: See EvtGen/COPYRIGHT
9 //      Copyright (C) 1998      Caltech, UCSB
10 //
11 // Module: EvtDiracSpinor.cc
12 //
13 // Description:  Class to describe (EvtDiracParticle) spinors.
14 //
15 // Modification history:
16 //
17 //    DJL/RYD     September 25, 1996         Module created
18 //
19 //------------------------------------------------------------------------
20 // 
21 #include "EvtGenBase/EvtPatches.hh"
22 #include <math.h>
23 #include <assert.h>
24 #include "EvtGenBase/EvtDiracSpinor.hh"
25 #include "EvtGenBase/EvtGammaMatrix.hh"
26 #include "EvtGenBase/EvtComplex.hh"
27 #include "EvtGenBase/EvtReport.hh"
28 #include "EvtGenBase/EvtVector4C.hh"
29 #include "EvtGenBase/EvtTensor4C.hh"
30 using std::ostream;
31
32
33 EvtDiracSpinor::~EvtDiracSpinor(){}
34
35 EvtDiracSpinor::EvtDiracSpinor(const EvtComplex& sp0,const EvtComplex& sp1,
36                                     const EvtComplex& sp2,const EvtComplex& sp3){
37   set(sp0,sp1,sp2,sp3);
38 }
39
40 void EvtDiracSpinor::set(const EvtComplex& sp0,const EvtComplex& sp1,
41                          const EvtComplex& sp2,const EvtComplex& sp3){
42
43   spinor[0]=sp0;spinor[1]=sp1;spinor[2]=sp2;spinor[3]=sp3;
44 }
45
46 void EvtDiracSpinor::set_spinor(int i,const EvtComplex& sp){
47
48   spinor[i]=sp;
49 }
50
51 ostream& operator<<(ostream& s, const EvtDiracSpinor& sp){
52
53   s <<"["<<sp.spinor[0]<<","<<sp.spinor[1]<<","
54     <<sp.spinor[2]<<","<<sp.spinor[3]<<"]";
55   return s;
56
57 }
58
59
60 const EvtComplex& EvtDiracSpinor::get_spinor(int i) const { 
61    
62   return spinor[i];
63
64 }
65
66 EvtDiracSpinor rotateEuler(const EvtDiracSpinor& sp,
67                            double alpha,double beta,double gamma){
68
69   EvtDiracSpinor tmp(sp);
70   tmp.applyRotateEuler(alpha,beta,gamma);
71   return tmp;
72
73 }
74
75 EvtDiracSpinor boostTo(const EvtDiracSpinor& sp,
76                        const EvtVector4R p4){
77
78   EvtDiracSpinor tmp(sp);
79   tmp.applyBoostTo(p4);
80   return tmp;
81
82 }
83
84 EvtDiracSpinor boostTo(const EvtDiracSpinor& sp,
85                        const EvtVector3R boost){
86
87   EvtDiracSpinor tmp(sp);
88   tmp.applyBoostTo(boost);
89   return tmp;
90
91 }
92
93 void EvtDiracSpinor::applyBoostTo(const EvtVector4R& p4){
94
95   double e=p4.get(0);
96
97   EvtVector3R boost(p4.get(1)/e,p4.get(2)/e,p4.get(3)/e);
98
99   applyBoostTo(boost);
100
101   return;
102
103 }
104
105
106
107 void EvtDiracSpinor::applyBoostTo(const EvtVector3R& boost) {
108
109   double bx,by,bz,gamma,b2,f1,f2;
110   EvtComplex spinorp[4];
111
112   bx=boost.get(0);
113   by=boost.get(1);
114   bz=boost.get(2);
115   b2=bx*bx+by*by+bz*bz;
116
117   if (b2==0.0){
118     return;
119   }
120
121   assert(b2<1.0);
122
123   gamma=1.0/sqrt(1-b2);
124   
125   f1=sqrt((gamma+1.0)/2.0);
126   f2=f1*gamma/(gamma+1.0);
127
128   spinorp[0]=f1*spinor[0]+f2*bz*spinor[2]+
129     f2*EvtComplex(bx,-by)*spinor[3];
130   spinorp[1]=f1*spinor[1]+f2*EvtComplex(bx,by)*spinor[2]-
131     f2*bz*spinor[3];
132   spinorp[2]=f2*bz*spinor[0]+f2*EvtComplex(bx,-by)*spinor[1]+
133     f1*spinor[2];
134   spinorp[3]=f2*EvtComplex(bx,by)*spinor[0]-
135     f2*bz*spinor[1]+f1*spinor[3];
136   
137   spinor[0]=spinorp[0];
138   spinor[1]=spinorp[1];
139   spinor[2]=spinorp[2];
140   spinor[3]=spinorp[3];
141
142   return;
143 }
144
145 void EvtDiracSpinor::applyRotateEuler(double alpha,double beta,
146                                       double gamma) {
147
148   EvtComplex retVal[4];
149   
150   double cb2=cos(0.5*beta);
151   double sb2=sin(0.5*beta);
152   double capg2=cos(0.5*(alpha+gamma));
153   double camg2=cos(0.5*(alpha-gamma));
154   double sapg2=sin(0.5*(alpha+gamma));
155   double samg2=sin(0.5*(alpha-gamma));
156
157   EvtComplex m11(cb2*capg2,-cb2*sapg2);
158   EvtComplex m12(-sb2*camg2,sb2*samg2);
159   EvtComplex m21(sb2*camg2,sb2*samg2);
160   EvtComplex m22(cb2*capg2,cb2*sapg2);
161
162   retVal[0]=m11*spinor[0]+m12*spinor[1];
163   retVal[1]=m21*spinor[0]+m22*spinor[1];
164   retVal[2]=m11*spinor[2]+m12*spinor[3];
165   retVal[3]=m21*spinor[2]+m22*spinor[3];
166
167   spinor[0]=retVal[0];
168   spinor[1]=retVal[1];
169   spinor[2]=retVal[2];
170   spinor[3]=retVal[3];
171
172   return;
173 }
174
175
176
177 EvtDiracSpinor EvtDiracSpinor::conj() const {
178
179   EvtDiracSpinor sp;
180
181   for ( int i=0; i<4; i++)
182     sp.set_spinor(i,::conj(spinor[i]));
183   
184   return sp;
185 }
186
187 EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
188
189   //Old code; below is a new specialized code that does it more efficiently.
190   //EvtGammaMatrix mat;
191   //EvtVector4C temp;
192   //mat.va0();
193   //temp.set(0,d*(mat*dp));
194   //mat.va1();
195   //temp.set(1,d*(mat*dp));
196   //mat.va2();
197   //temp.set(2,d*(mat*dp));
198   //mat.va3();
199   //temp.set(3,d*(mat*dp));
200   //return temp;
201  
202
203   EvtComplex u02=::conj(d.spinor[0]-d.spinor[2]);  
204   EvtComplex u13=::conj(d.spinor[1]-d.spinor[3]);  
205
206   EvtComplex v02=dp.spinor[0]-dp.spinor[2];
207   EvtComplex v13=dp.spinor[1]-dp.spinor[3];
208
209   EvtComplex a=u02*v02;
210   EvtComplex b=u13*v13;
211
212   EvtComplex c=u02*v13;
213   EvtComplex e=u13*v02;
214
215   return EvtVector4C(a+b,-(c+e),EvtComplex(0,1)*(c-e),b-a);
216
217   
218 }
219
220 EvtVector4C EvtLeptonVCurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
221
222   EvtVector4C temp;
223
224   // no conjugate here; done in the multiplication
225   // yes this is stupid and fooled me to for a long time (ryd)
226
227   temp.set(0,d*(EvtGammaMatrix::v0()*dp));
228   temp.set(1,d*(EvtGammaMatrix::v1()*dp));
229   temp.set(2,d*(EvtGammaMatrix::v2()*dp));
230   temp.set(3,d*(EvtGammaMatrix::v3()*dp));
231   
232   return temp;
233 }
234
235
236 EvtVector4C EvtLeptonACurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
237
238   EvtVector4C temp;
239
240   EvtGammaMatrix mat;
241
242   // no conjugate here; done in the multiplication
243   // yes this is stupid and fooled me to for a long time (ryd)
244
245   mat = EvtGammaMatrix::v0()-EvtGammaMatrix::va0();
246   temp.set(0,d*(mat*dp));
247
248   mat = EvtGammaMatrix::v1()-EvtGammaMatrix::va1();
249   temp.set(1,d*(mat*dp));
250
251   mat = EvtGammaMatrix::v2()-EvtGammaMatrix::va2();
252   temp.set(2,d*(mat*dp));
253
254   mat = EvtGammaMatrix::v3()-EvtGammaMatrix::va3();
255   temp.set(3,d*(mat*dp));
256   
257   return temp;
258 }
259
260 EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
261
262   EvtComplex temp;
263
264   // no conjugate here; done in the multiplication
265   // yes this is stupid and fooled me to for a long time (ryd)
266
267   temp=d*(EvtGammaMatrix::g0()*dp);
268   
269   return temp;
270 }
271
272 EvtComplex EvtLeptonPCurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
273
274   EvtComplex temp;
275
276   // no conjugate here; done in the multiplication
277   // yes this is stupid and fooled me to for a long time (ryd)
278   static EvtGammaMatrix m=EvtGammaMatrix::g0()*EvtGammaMatrix::g5();
279   temp=d*(m*dp);
280   
281   return temp;
282 }
283
284 EvtTensor4C EvtLeptonTCurrent(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
285
286   EvtTensor4C temp;
287   temp.zero();
288   EvtComplex i2(0,0.5);
289
290   static EvtGammaMatrix mat01=EvtGammaMatrix::g0()*
291     (EvtGammaMatrix::g0()*EvtGammaMatrix::g1()-
292      EvtGammaMatrix::g1()*EvtGammaMatrix::g0());
293   static EvtGammaMatrix mat02=EvtGammaMatrix::g0()*
294     (EvtGammaMatrix::g0()*EvtGammaMatrix::g2()-
295      EvtGammaMatrix::g2()*EvtGammaMatrix::g0());
296   static EvtGammaMatrix mat03=EvtGammaMatrix::g0()*
297     (EvtGammaMatrix::g0()*EvtGammaMatrix::g3()-
298     EvtGammaMatrix::g3()*EvtGammaMatrix::g0());
299   static EvtGammaMatrix mat12=EvtGammaMatrix::g0()*
300     (EvtGammaMatrix::g1()*EvtGammaMatrix::g2()-
301     EvtGammaMatrix::g2()*EvtGammaMatrix::g1());
302   static EvtGammaMatrix mat13=EvtGammaMatrix::g0()*
303     (EvtGammaMatrix::g1()*EvtGammaMatrix::g3()-
304      EvtGammaMatrix::g3()*EvtGammaMatrix::g1());
305   static EvtGammaMatrix mat23=EvtGammaMatrix::g0()*
306     (EvtGammaMatrix::g2()*EvtGammaMatrix::g3()-
307      EvtGammaMatrix::g3()*EvtGammaMatrix::g2());
308
309  
310   temp.set(0,1,i2*(d*(mat01*dp)));
311   temp.set(1,0,-temp.get(0,1));
312
313   temp.set(0,2,i2*(d*(mat02*dp)));
314   temp.set(2,0,-temp.get(0,2));
315
316   temp.set(0,3,i2*(d*(mat03*dp)));
317   temp.set(3,0,-temp.get(0,3));
318
319   temp.set(1,2,i2*(d*(mat12*dp)));
320   temp.set(2,1,-temp.get(1,2));
321
322   temp.set(1,3,i2*(d*(mat13*dp)));
323   temp.set(3,1,-temp.get(1,3));
324
325   temp.set(2,3,i2*(d*(mat23*dp)));
326   temp.set(3,2,-temp.get(2,3));
327   
328   return temp;
329 }
330
331
332 EvtDiracSpinor operator*(const EvtComplex& c, const EvtDiracSpinor& d) {
333      EvtDiracSpinor result;
334      result.spinor[0] = c*d.spinor[0];
335      result.spinor[1] = c*d.spinor[1];
336      result.spinor[2] = c*d.spinor[2];
337      result.spinor[3] = c*d.spinor[3];
338      return result;
339  }
340
341
342 EvtComplex operator*(const EvtDiracSpinor& d,const EvtDiracSpinor& dp){
343
344   int i;
345   EvtComplex temp;
346
347   temp=EvtComplex(0.0,0.0);
348
349   for(i=0;i<4;i++){
350     temp+=::conj(d.get_spinor(i))*dp.get_spinor(i);
351   }
352   return temp;
353 }
354
355
356 EvtDiracSpinor EvtDiracSpinor::adjoint() const
357 {
358     EvtDiracSpinor d = this->conj(); // first conjugate, then multiply with gamma0
359     EvtGammaMatrix g0 = EvtGammaMatrix::g0();
360     EvtDiracSpinor result; // automatically initialized to 0
361
362     for (int i=0; i<4; ++i)
363         for (int j=0; j<4; ++j)
364             result.spinor[i] += d.spinor[j] * g0._gamma[i][j];
365
366     return result;
367 }