00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "EvtGenBase/EvtPatches.hh"
00022 #include <stdlib.h>
00023 #include <iostream>
00024 #include <math.h>
00025 #include "EvtGenBase/EvtComplex.hh"
00026 #include "EvtGenBase/EvtRaritaSchwingerParticle.hh"
00027 #include "EvtGenBase/EvtDiracSpinor.hh"
00028 #include "EvtGenBase/EvtVector4R.hh"
00029 #include "EvtGenBase/EvtPDL.hh"
00030 #include "EvtGenBase/EvtReport.hh"
00031 #include "EvtGenBase/EvtSpinDensity.hh"
00032 using std::endl;
00033
00034 EvtRaritaSchwingerParticle::~EvtRaritaSchwingerParticle(){
00035 }
00036
00037
00038 EvtRaritaSchwingerParticle::EvtRaritaSchwingerParticle(){
00039
00040 return;
00041
00042 }
00043
00044 void EvtRaritaSchwingerParticle::init(EvtId id,const EvtVector4R& p4){
00045
00046 _validP4=true;
00047 setp(p4);
00048 setpart_num(id);
00049
00050 if (EvtPDL::getStdHep(id)==0){
00051 report(ERROR,"EvtGen") << "Error in EvtRaritaSchwingerParticle::init, part_n="
00052 << id.getId()<<endl;
00053 ::abort();
00054 }
00055
00056 static EvtVector4R e1(0.0,1.0,0.0,0.0);
00057 static EvtVector4R e2(0.0,0.0,1.0,0.0);
00058 static EvtVector4R e3(0.0,0.0,0.0,1.0);
00059
00060
00061 if (EvtPDL::getStdHep(id)>0){
00062
00063 EvtDiracSpinor u1,u2;
00064
00065 u1.set(EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0),
00066 EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
00067 u2.set(EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0),
00068 EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
00069
00070
00071
00072 _spinorRest[0]=dirProd(e3,u1+u2);
00073 _spinorRest[1]=dirProd(e1+EvtComplex(0.0,1.0)*e2,u1);
00074 _spinorRest[2]=dirProd(e1-EvtComplex(0.0,1.0)*e2,u2);
00075 _spinorRest[3]=dirProd(e1,(u1+u2))+dirProd(EvtComplex(0.0,1.0)*e2,(u1-u2));
00076
00077 _spinor[0]=boostTo(_spinorRest[0],p4);
00078 _spinor[1]=boostTo(_spinorRest[1],p4);
00079 _spinor[2]=boostTo(_spinorRest[2],p4);
00080 _spinor[3]=boostTo(_spinorRest[3],p4);
00081
00082 }
00083 else{
00084
00085 EvtDiracSpinor u1,u2;
00086
00087 u1.set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
00088 EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0));
00089 u2.set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
00090 EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0));
00091
00092
00093
00094 _spinorRest[0]=dirProd(e3,(u1+u2));
00095 _spinorRest[1]=dirProd(e1+EvtComplex(0.0,1.0)*e2,u1);
00096 _spinorRest[2]=dirProd(e1-EvtComplex(0.0,1.0)*e2,u2);
00097 _spinorRest[3]=dirProd(e1,(u1+u2))+dirProd(EvtComplex(0.0,1.0)*e2,(u1-u2));
00098
00099 _spinor[0]=boostTo(_spinorRest[0],p4);
00100 _spinor[1]=boostTo(_spinorRest[1],p4);
00101 _spinor[2]=boostTo(_spinorRest[2],p4);
00102 _spinor[3]=boostTo(_spinorRest[3],p4);
00103
00104 }
00105
00106 setLifetime();
00107 }
00108
00109
00110 EvtRaritaSchwinger EvtRaritaSchwingerParticle::spRSParent(int i) const {
00111
00112 return _spinor[i];
00113
00114 }
00115
00116 EvtRaritaSchwinger EvtRaritaSchwingerParticle::spRS(int i) const {
00117
00118 return _spinorRest[i];
00119
00120 }
00121
00122
00123
00124 EvtSpinDensity EvtRaritaSchwingerParticle::rotateToHelicityBasis() const{
00125
00126 double sqmt2=sqrt(2.0*(this->getP4().mass()));
00127
00128 EvtDiracSpinor spplus;
00129 EvtDiracSpinor spminus;
00130
00131 if (EvtPDL::getStdHep(getId())>0){
00132 spplus.set(1.0,0.0,0.0,0.0);
00133 spminus.set(0.0,1.0,0.0,0.0);
00134 } else {
00135 spplus.set(0.0,0.0,1.0,0.0);
00136 spminus.set(0.0,0.0,0.0,1.0);
00137 }
00138
00139 EvtVector4C eplus(0.0,-1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
00140 EvtVector4C ezero(0.0,0.0,0.0,1.0);
00141 EvtVector4C eminus(0.0,1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
00142
00143 EvtRaritaSchwinger sppp=dirProd(eplus,spplus);
00144 EvtRaritaSchwinger spp=dirProd(sqrt(2.0/3.0)*ezero,spplus)+
00145 dirProd(sqrt(1.0/3.0)*eplus,spminus);
00146 EvtRaritaSchwinger spm=dirProd(sqrt(2.0/3.0)*ezero,spminus)+
00147 dirProd(sqrt(1.0/3.0)*eminus,spplus);
00148 EvtRaritaSchwinger spmm=dirProd(eminus,spminus);
00149
00150
00151
00152 EvtSpinDensity R;
00153 R.SetDim(4);
00154
00155
00156 for ( int i=0; i<4; i++) {
00157 R.Set(0,i,(sppp*_spinorRest[i])/sqmt2);
00158 R.Set(1,i,(spp*_spinorRest[i])/sqmt2);
00159 R.Set(2,i,(spm*_spinorRest[i])/sqmt2);
00160 R.Set(3,i,(spmm*_spinorRest[i])/sqmt2);
00161 }
00162
00163 return R;
00164
00165 }
00166
00167
00168 EvtSpinDensity EvtRaritaSchwingerParticle::rotateToHelicityBasis(double alpha,
00169 double beta,
00170 double gamma) const{
00171
00172 EvtDiracSpinor spplus;
00173 EvtDiracSpinor spminus;
00174
00175 if (EvtPDL::getStdHep(getId())>0){
00176 spplus.set(1.0,0.0,0.0,0.0);
00177 spminus.set(0.0,1.0,0.0,0.0);
00178 } else {
00179 spplus.set(0.0,0.0,1.0,0.0);
00180 spminus.set(0.0,0.0,0.0,1.0);
00181 }
00182
00183 EvtVector4C eplus(0.0,-1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
00184 EvtVector4C ezero(0.0,0.0,0.0,1.0);
00185 EvtVector4C eminus(0.0,1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
00186
00187 EvtRaritaSchwinger sppp=dirProd(eplus,spplus);
00188 EvtRaritaSchwinger spp=dirProd(sqrt(2.0/3.0)*ezero,spplus)+
00189 dirProd(sqrt(1.0/3.0)*eplus,spminus);
00190 EvtRaritaSchwinger spm=dirProd(sqrt(2.0/3.0)*ezero,spminus)+
00191 dirProd(sqrt(1.0/3.0)*eminus,spplus);
00192 EvtRaritaSchwinger spmm=dirProd(eminus,spminus);
00193
00194
00195 sppp.applyRotateEuler(alpha,beta,gamma);
00196 spp.applyRotateEuler(alpha,beta,gamma);
00197 spm.applyRotateEuler(alpha,beta,gamma);
00198 spmm.applyRotateEuler(alpha,beta,gamma);
00199
00200 EvtSpinDensity R;
00201 R.SetDim(4);
00202
00203 double sqmt2=sqrt(2.0*(this->getP4().mass()));
00204
00205 for ( int i=0; i<4; i++) {
00206 R.Set(0,i,(sppp*_spinorRest[i])/sqmt2);
00207 R.Set(1,i,(spp*_spinorRest[i])/sqmt2);
00208 R.Set(2,i,(spm*_spinorRest[i])/sqmt2);
00209 R.Set(3,i,(spmm*_spinorRest[i])/sqmt2);
00210 }
00211
00212 return R;
00213
00214 }
00215