]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenBase/EvtDiracParticle.cpp
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtDiracParticle.cpp
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: EvtDiracParticle.cc
12 //
13 // Description: Class to describe spin 1/2 particles.
14 //
15 // Modification history:
16 //
17 //    DJL/RYD     September 25, 1996         Module created
18 //
19 //------------------------------------------------------------------------
20 // 
21 #include "EvtGenBase/EvtPatches.hh"
22 #include <stdlib.h>
23 #include <iostream>
24 #include <math.h>
25 #include "EvtGenBase/EvtComplex.hh"
26 #include "EvtGenBase/EvtDiracParticle.hh"
27 #include "EvtGenBase/EvtVector4R.hh"
28 #include "EvtGenBase/EvtPDL.hh"
29 #include "EvtGenBase/EvtReport.hh"
30 #include "EvtGenBase/EvtSpinDensity.hh"
31 #include "EvtGenBase/EvtGammaMatrix.hh"
32 using std::endl;
33
34 EvtDiracParticle::~EvtDiracParticle(){}
35
36
37 EvtDiracParticle::EvtDiracParticle(){
38
39   return;
40   
41 }
42
43 void EvtDiracParticle::init(EvtId part_n,const EvtVector4R& p4){
44
45   _validP4=true; 
46   setp(p4);
47   setpart_num(part_n);
48
49   if (EvtPDL::getStdHep(part_n)==0){
50     report(ERROR,"EvtGen") << "Error in EvtDiracParticle::init, part_n="
51                            << part_n.getId()<<endl;
52     ::abort();
53   }
54
55   if (EvtPDL::getStdHep(part_n)>0){  
56
57     _spinorRest[0].set(EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0),
58                        EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
59     _spinorRest[1].set(EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0),
60                        EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
61   
62     _spinorParent[0]=boostTo(_spinorRest[0],p4);
63     _spinorParent[1]=boostTo(_spinorRest[1],p4);
64
65
66   }
67   else{
68
69     _spinorRest[0].set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
70                      EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0));
71     _spinorRest[1].set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
72                      EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0));
73   
74     _spinorParent[0]=boostTo(_spinorRest[0],p4);
75     _spinorParent[1]=boostTo(_spinorRest[1],p4);
76
77
78
79   }
80
81   setLifetime();
82 }
83
84
85 void EvtDiracParticle::init(EvtId part_n,const EvtVector4R& p4,
86                             const EvtDiracSpinor & prod1, 
87                             const EvtDiracSpinor & prod2,
88                             const EvtDiracSpinor & rest1, 
89                             const EvtDiracSpinor & rest2){
90   
91   _validP4=true; 
92   setp(p4);
93   setpart_num(part_n);
94   
95   if (EvtPDL::getStdHep(part_n)==0){
96     report(ERROR,"EvtGen") << "Error in EvtDiracParticle::init, part_n="
97                            << part_n.getId()<<std::endl;
98     ::abort();
99   }
100   _spinorRest[0]=rest1;
101   _spinorRest[1]=rest2;
102   _spinorParent[0]=prod1;
103   _spinorParent[1]=prod2;
104   
105   setLifetime();
106 }
107  
108
109
110 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis() const{
111
112   EvtDiracSpinor spplus;
113   EvtDiracSpinor spminus;
114       
115   double sqmt2=sqrt(2.*(getP4().mass()));
116       
117   if (EvtPDL::getStdHep(getId())>0){  
118     spplus.set(1.0,0.0,0.0,0.0);
119     spminus.set(0.0,1.0,0.0,0.0);
120   } else {
121     spplus.set(0.0,0.0,0.0,1.0);
122     spminus.set(0.0,0.0,1.0,0.0);
123   }
124
125       
126   EvtSpinDensity R;
127   R.setDim(2);
128       
129   for (int i=0; i<2; i++) {
130     if (EvtPDL::getStdHep(getId())>0){  
131       R.set(0,i,(spplus*_spinorRest[i])/sqmt2);
132       R.set(1,i,(spminus*_spinorRest[i])/sqmt2);
133     } else {
134       R.set(0,i,(_spinorRest[i]*spplus)/sqmt2);
135       R.set(1,i,(_spinorRest[i]*spminus)/sqmt2);
136     } 
137   }
138
139   return R;
140
141 }
142
143
144 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis(double alpha,
145                                                        double beta,
146                                                        double gamma) const{
147
148
149   EvtDiracSpinor spplus;
150   EvtDiracSpinor spminus;
151       
152   double sqmt2=sqrt(2.*(getP4().mass()));
153       
154   if (EvtPDL::getStdHep(getId())>0){  
155     spplus.set(1.0,0.0,0.0,0.0);
156     spminus.set(0.0,1.0,0.0,0.0);
157   } else {
158     spplus.set(0.0,0.0,0.0,1.0);
159     spminus.set(0.0,0.0,1.0,0.0);
160   }
161       
162   spplus.applyRotateEuler(alpha,beta,gamma);
163   spminus.applyRotateEuler(alpha,beta,gamma);
164
165   EvtSpinDensity R;
166   R.setDim(2);
167       
168   for (int i=0; i<2; i++) {
169     if (EvtPDL::getStdHep(getId())>0){  
170       R.set(0,i,(spplus*_spinorRest[i])/sqmt2);
171       R.set(1,i,(spminus*_spinorRest[i])/sqmt2);
172     } else {
173       R.set(0,i,(_spinorRest[i]*spplus)/sqmt2);
174       R.set(1,i,(_spinorRest[i]*spminus)/sqmt2);
175     } 
176   }
177
178   return R;
179
180 }
181
182
183