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: EvtDiracParticle.cc
13 // Description: Class to describe spin 1/2 particles.
15 // Modification history:
17 // DJL/RYD September 25, 1996 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
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"
34 EvtDiracParticle::~EvtDiracParticle(){}
37 EvtDiracParticle::EvtDiracParticle(){
43 void EvtDiracParticle::init(EvtId part_n,const EvtVector4R& p4){
49 if (EvtPDL::getStdHep(part_n)==0){
50 report(ERROR,"EvtGen") << "Error in EvtDiracParticle::init, part_n="
51 << part_n.getId()<<endl;
55 if (EvtPDL::getStdHep(part_n)>0){
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));
62 _spinorParent[0]=boostTo(_spinorRest[0],p4);
63 _spinorParent[1]=boostTo(_spinorRest[1],p4);
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));
74 _spinorParent[0]=boostTo(_spinorRest[0],p4);
75 _spinorParent[1]=boostTo(_spinorRest[1],p4);
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){
95 if (EvtPDL::getStdHep(part_n)==0){
96 report(ERROR,"EvtGen") << "Error in EvtDiracParticle::init, part_n="
97 << part_n.getId()<<std::endl;
100 _spinorRest[0]=rest1;
101 _spinorRest[1]=rest2;
102 _spinorParent[0]=prod1;
103 _spinorParent[1]=prod2;
110 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis() const{
112 EvtDiracSpinor spplus;
113 EvtDiracSpinor spminus;
115 double sqmt2=sqrt(2.*(getP4().mass()));
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);
121 spplus.set(0.0,0.0,0.0,1.0);
122 spminus.set(0.0,0.0,1.0,0.0);
129 for (int i=0; i<2; i++) {
130 if (EvtPDL::getStdHep(getId())>0){
131 R.set(0,i,(EvtComplex)(spplus*_spinorRest[i])/sqmt2);
132 R.set(1,i,(EvtComplex)(spminus*_spinorRest[i])/sqmt2);
134 R.set(0,i,(EvtComplex)(_spinorRest[i]*spplus)/sqmt2);
135 R.set(1,i,(EvtComplex)(_spinorRest[i]*spminus)/sqmt2);
144 EvtSpinDensity EvtDiracParticle::rotateToHelicityBasis(double alpha,
149 EvtDiracSpinor spplus;
150 EvtDiracSpinor spminus;
152 double sqmt2=sqrt(2.*(getP4().mass()));
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);
158 spplus.set(0.0,0.0,0.0,1.0);
159 spminus.set(0.0,0.0,1.0,0.0);
162 spplus.applyRotateEuler(alpha,beta,gamma);
163 spminus.applyRotateEuler(alpha,beta,gamma);
168 for (int i=0; i<2; i++) {
169 if (EvtPDL::getStdHep(getId())>0){
170 R.set(0,i,(EvtComplex)(spplus*_spinorRest[i])/sqmt2);
171 R.set(1,i,(EvtComplex)(spminus*_spinorRest[i])/sqmt2);
173 R.set(0,i,(EvtComplex)(_spinorRest[i]*spplus)/sqmt2);
174 R.set(1,i,(EvtComplex)(_spinorRest[i]*spminus)/sqmt2);