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/EvtDiracParticle.hh"
00027 #include "EvtGenBase/EvtVector4R.hh"
00028 #include "EvtGenBase/EvtPDL.hh"
00029 #include "EvtGenBase/EvtReport.hh"
00030 #include "EvtGenBase/EvtSpinDensity.hh"
00031 #include "EvtGenBase/EvtGammaMatrix.hh"
00032
00033 using std::endl;
00034
00035 EvtDiracParticle::~EvtDiracParticle(){}
00036
00037
00038 EvtDiracParticle::EvtDiracParticle(){
00039
00040 return;
00041
00042 }
00043
00044 void EvtDiracParticle::init(EvtId part_n,const EvtVector4R& p4){
00045
00046 _validP4=true;
00047 setp(p4);
00048 setpart_num(part_n);
00049
00050 if (EvtPDL::getStdHep(part_n)==0){
00051 report(ERROR,"EvtGen") << "Error in EvtDiracParticle::init, part_n="
00052 << part_n.getId()<<endl;
00053 ::abort();
00054 }
00055
00056 if (EvtPDL::getStdHep(part_n)>0){
00057
00058 _spinorRest[0].set(EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0),
00059 EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
00060 _spinorRest[1].set(EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0),
00061 EvtComplex(0.0,0.0),EvtComplex(0.0,0.0));
00062
00063 _spinorParent[0]=boostTo(_spinorRest[0],p4);
00064 _spinorParent[1]=boostTo(_spinorRest[1],p4);
00065
00066
00067 }
00068 else{
00069
00070 _spinorRest[0].set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
00071 EvtComplex(sqrt(2.0*mass()),0.0),EvtComplex(0.0,0.0));
00072 _spinorRest[1].set(EvtComplex(0.0,0.0),EvtComplex(0.0,0.0),
00073 EvtComplex(0.0,0.0),EvtComplex(sqrt(2.0*mass()),0.0));
00074
00075 _spinorParent[0]=boostTo(_spinorRest[0],p4);
00076 _spinorParent[1]=boostTo(_spinorRest[1],p4);
00077
00078
00079
00080 }
00081
00082 setLifetime();
00083 }
00084
00085
00086
00087
00088 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis() const{
00089
00090 EvtDiracSpinor spplus;
00091 EvtDiracSpinor spminus;
00092
00093 double sqmt2=sqrt(2.*(getP4().mass()));
00094
00095 if (EvtPDL::getStdHep(getId())>0){
00096 spplus.set(1.0,0.0,0.0,0.0);
00097 spminus.set(0.0,1.0,0.0,0.0);
00098 } else {
00099 spplus.set(0.0,0.0,1.0,0.0);
00100 spminus.set(0.0,0.0,0.0,1.0);
00101 }
00102
00103
00104 EvtSpinDensity R;
00105 R.SetDim(2);
00106
00107 for (int i=0; i<2; i++) {
00108 R.Set(0,i,(spplus*_spinorRest[i])/sqmt2);
00109 R.Set(1,i,(spminus*_spinorRest[i])/sqmt2);
00110 }
00111
00112 return R;
00113
00114 }
00115
00116
00117 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis(double alpha,
00118 double beta,
00119 double gamma) const{
00120
00121
00122 EvtDiracSpinor spplus;
00123 EvtDiracSpinor spminus;
00124
00125 double sqmt2=sqrt(2.*(getP4().mass()));
00126
00127 if (EvtPDL::getStdHep(getId())>0){
00128 spplus.set(1.0,0.0,0.0,0.0);
00129 spminus.set(0.0,1.0,0.0,0.0);
00130 } else {
00131 spplus.set(0.0,0.0,1.0,0.0);
00132 spminus.set(0.0,0.0,0.0,1.0);
00133 }
00134
00135 spplus.applyRotateEuler(alpha,beta,gamma);
00136 spminus.applyRotateEuler(alpha,beta,gamma);
00137
00138 EvtSpinDensity R;
00139 R.SetDim(2);
00140
00141 for (int i=0; i<2; i++) {
00142 R.Set(0,i,(spplus*_spinorRest[i])/sqmt2);
00143 R.Set(1,i,(spminus*_spinorRest[i])/sqmt2);
00144 }
00145
00146 return R;
00147
00148 }
00149
00150
00151