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: EvtRaritaSchwingerParticle.cc
13 // Description: Class to describe spin 1/2 particles.
15 // Modification history:
17 // RYD August 9, 2000 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
25 #include "EvtGenBase/EvtComplex.hh"
26 #include "EvtGenBase/EvtRaritaSchwingerParticle.hh"
27 #include "EvtGenBase/EvtDiracSpinor.hh"
28 #include "EvtGenBase/EvtVector4R.hh"
29 #include "EvtGenBase/EvtPDL.hh"
30 #include "EvtGenBase/EvtReport.hh"
33 EvtRaritaSchwingerParticle::~EvtRaritaSchwingerParticle(){}
36 EvtRaritaSchwingerParticle::EvtRaritaSchwingerParticle(){
42 void EvtRaritaSchwingerParticle::init(EvtId id,const EvtVector4R& p4){
48 if (EvtPDL::getStdHep(id)==0){
49 report(ERROR,"EvtGen") << "Error in EvtRaritaSchwingerParticle::init, part_n="
56 double sqmt2=sqrt(2.0*(this->getP4().mass()));
58 EvtDiracSpinor spplus;
59 EvtDiracSpinor spminus;
61 if (EvtPDL::getStdHep(getId())>0){
62 spplus.set(sqmt2,0.0,0.0,0.0);
63 spminus.set(0.0,sqmt2,0.0,0.0);
65 spplus.set(0.0,0.0,sqmt2,0.0);
66 spminus.set(0.0,0.0,0.0,sqmt2);
69 static EvtVector4C eplus(0.0,-1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
70 static EvtVector4C ezero(0.0,0.0,0.0,1.0);
71 static EvtVector4C eminus(0.0,1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
73 _spinorRest[0]=dirProd(eplus,spplus);
74 _spinorRest[1]=dirProd(sqrt(2.0/3.0)*ezero,spplus)+
75 dirProd(sqrt(1.0/3.0)*eplus,spminus);
76 _spinorRest[2]=dirProd(sqrt(2.0/3.0)*ezero,spminus)+
77 dirProd(sqrt(1.0/3.0)*eminus,spplus);
78 _spinorRest[3]=dirProd(eminus,spminus);
80 _spinor[0]=boostTo(_spinorRest[0],p4);
81 _spinor[1]=boostTo(_spinorRest[1],p4);
82 _spinor[2]=boostTo(_spinorRest[2],p4);
83 _spinor[3]=boostTo(_spinorRest[3],p4);
90 void EvtRaritaSchwingerParticle::init(EvtId id,const EvtVector4R& p4,
91 const EvtRaritaSchwinger & prod1,
92 const EvtRaritaSchwinger & prod2,
93 const EvtRaritaSchwinger & prod3,
94 const EvtRaritaSchwinger & prod4,
95 const EvtRaritaSchwinger & rest1,
96 const EvtRaritaSchwinger & rest2,
97 const EvtRaritaSchwinger & rest3,
98 const EvtRaritaSchwinger & rest4){
104 if (EvtPDL::getStdHep(id)==0){
105 report(ERROR,"EvtGen") << "Error in EvtRaritaSchwingerParticle::init, part_n="
106 << id.getId()<<std::endl;
109 _spinorRest[0]=rest1;
110 _spinorRest[1]=rest2;
111 _spinorRest[2]=rest3;
112 _spinorRest[3]=rest4;
124 EvtRaritaSchwinger EvtRaritaSchwingerParticle::spRSParent(int i) const {
130 EvtRaritaSchwinger EvtRaritaSchwingerParticle::spRS(int i) const {
132 return _spinorRest[i];
138 EvtSpinDensity EvtRaritaSchwingerParticle::rotateToHelicityBasis() const{
140 double sqmt2=sqrt(2.0*(this->getP4().mass()));
142 EvtDiracSpinor spplus;
143 EvtDiracSpinor spminus;
145 if (EvtPDL::getStdHep(getId())>0){
146 spplus.set(1.0,0.0,0.0,0.0);
147 spminus.set(0.0,1.0,0.0,0.0);
149 spplus.set(0.0,0.0,1.0,0.0);
150 spminus.set(0.0,0.0,0.0,1.0);
153 EvtVector4C eplus(0.0,-1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
154 EvtVector4C ezero(0.0,0.0,0.0,1.0);
155 EvtVector4C eminus(0.0,1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
157 EvtRaritaSchwinger sppp=dirProd(eplus,spplus);
158 EvtRaritaSchwinger spp=dirProd(sqrt(2.0/3.0)*ezero,spplus)+
159 dirProd(sqrt(1.0/3.0)*eplus,spminus);
160 EvtRaritaSchwinger spm=dirProd(sqrt(2.0/3.0)*ezero,spminus)+
161 dirProd(sqrt(1.0/3.0)*eminus,spplus);
162 EvtRaritaSchwinger spmm=dirProd(eminus,spminus);
169 for ( int i=0; i<4; i++) {
170 R.set(0,i,(sppp*_spinorRest[i])/sqmt2);
171 R.set(1,i,(spp*_spinorRest[i])/sqmt2);
172 R.set(2,i,(spm*_spinorRest[i])/sqmt2);
173 R.set(3,i,(spmm*_spinorRest[i])/sqmt2);
181 EvtSpinDensity EvtRaritaSchwingerParticle::rotateToHelicityBasis(double alpha,
185 EvtDiracSpinor spplus;
186 EvtDiracSpinor spminus;
188 if (EvtPDL::getStdHep(getId())>0){
189 spplus.set(1.0,0.0,0.0,0.0);
190 spminus.set(0.0,1.0,0.0,0.0);
192 spplus.set(0.0,0.0,1.0,0.0);
193 spminus.set(0.0,0.0,0.0,1.0);
196 EvtVector4C eplus(0.0,-1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
197 EvtVector4C ezero(0.0,0.0,0.0,1.0);
198 EvtVector4C eminus(0.0,1.0/sqrt(2.0),EvtComplex(0.0,-1.0/sqrt(2.0)),0.0);
200 EvtRaritaSchwinger sppp=dirProd(eplus,spplus);
201 EvtRaritaSchwinger spp=dirProd(sqrt(2.0/3.0)*ezero,spplus)+
202 dirProd(sqrt(1.0/3.0)*eplus,spminus);
203 EvtRaritaSchwinger spm=dirProd(sqrt(2.0/3.0)*ezero,spminus)+
204 dirProd(sqrt(1.0/3.0)*eminus,spplus);
205 EvtRaritaSchwinger spmm=dirProd(eminus,spminus);
208 sppp.applyRotateEuler(alpha,beta,gamma);
209 spp.applyRotateEuler(alpha,beta,gamma);
210 spm.applyRotateEuler(alpha,beta,gamma);
211 spmm.applyRotateEuler(alpha,beta,gamma);
216 double sqmt2=sqrt(2.0*(this->getP4().mass()));
218 for ( int i=0; i<4; i++) {
219 R.set(0,i,(sppp*_spinorRest[i])/sqmt2);
220 R.set(1,i,(spp*_spinorRest[i])/sqmt2);
221 R.set(2,i,(spm*_spinorRest[i])/sqmt2);
222 R.set(3,i,(spmm*_spinorRest[i])/sqmt2);