Geant4 Cross Reference |
1 // -*- C++ -*- 1 // -*- C++ -*- 2 // ------------------------------------------- 2 // --------------------------------------------------------------------------- 3 // 3 // 4 // This file is a part of the CLHEP - a Class 4 // This file is a part of the CLHEP - a Class Library for High Energy Physics. 5 // 5 // 6 // This is the implementation of the HepLorent 6 // This is the implementation of the HepLorentzVector class: 7 // Those methods originating in ZOOM dealing w 7 // Those methods originating in ZOOM dealing with simple boosts and rotations. 8 // Use of one of these methods will not force 8 // Use of one of these methods will not force loading of the HepRotation or 9 // HepLorentzRotation class. 9 // HepLorentzRotation class. 10 // 10 // 11 11 12 #include "CLHEP/Vector/LorentzVector.h" << 12 #ifdef GNUPRAGMA >> 13 #pragma implementation >> 14 #endif 13 15 14 #include <cmath> << 16 #include "CLHEP/Vector/LorentzVector.h" 15 #include <iostream> << 16 17 17 namespace CLHEP { 18 namespace CLHEP { 18 19 19 //-********* 20 //-********* 20 // rotationOf() 21 // rotationOf() 21 //-********* 22 //-********* 22 23 23 // Each of these is a shell over a rotate meth 24 // Each of these is a shell over a rotate method. 24 25 25 HepLorentzVector rotationXOf 26 HepLorentzVector rotationXOf 26 (const HepLorentzVector & vec, double phi){ 27 (const HepLorentzVector & vec, double phi){ 27 HepLorentzVector vv (vec); 28 HepLorentzVector vv (vec); 28 return vv.rotateX (phi); 29 return vv.rotateX (phi); 29 } 30 } 30 31 31 HepLorentzVector rotationYOf 32 HepLorentzVector rotationYOf 32 (const HepLorentzVector & vec, double phi){ 33 (const HepLorentzVector & vec, double phi){ 33 HepLorentzVector vv (vec); 34 HepLorentzVector vv (vec); 34 return vv.rotateY (phi); 35 return vv.rotateY (phi); 35 } 36 } 36 37 37 HepLorentzVector rotationZOf 38 HepLorentzVector rotationZOf 38 (const HepLorentzVector & vec, double phi){ 39 (const HepLorentzVector & vec, double phi){ 39 HepLorentzVector vv (vec); 40 HepLorentzVector vv (vec); 40 return vv.rotateZ (phi); 41 return vv.rotateZ (phi); 41 } 42 } 42 43 43 //-******** 44 //-******** 44 // boost 45 // boost 45 //-******** 46 //-******** 46 47 47 HepLorentzVector & HepLorentzVector::boost 48 HepLorentzVector & HepLorentzVector::boost 48 ( const Hep3Vector & aaxis, double bbet 49 ( const Hep3Vector & aaxis, double bbeta ) { 49 if (bbeta==0) { 50 if (bbeta==0) { 50 return *this; // do nothing for a 0 boost 51 return *this; // do nothing for a 0 boost 51 } 52 } 52 double r2 = aaxis.mag2(); 53 double r2 = aaxis.mag2(); 53 if ( r2 == 0 ) { 54 if ( r2 == 0 ) { 54 std::cerr << "HepLorentzVector::boost() - 55 std::cerr << "HepLorentzVector::boost() - " 55 << "A zero vector used as axis defining 56 << "A zero vector used as axis defining a boost -- no boost done" 56 << std::endl; 57 << std::endl; 57 return *this; 58 return *this; 58 } 59 } 59 double b2 = bbeta*bbeta; 60 double b2 = bbeta*bbeta; 60 if (b2 >= 1) { 61 if (b2 >= 1) { 61 std::cerr << "HepLorentzVector::boost() - 62 std::cerr << "HepLorentzVector::boost() - " 62 << "LorentzVector boosted with beta >= 1 63 << "LorentzVector boosted with beta >= 1 (speed of light) -- \n" 63 << "no boost done" << std::endl; 64 << "no boost done" << std::endl; 64 } else { 65 } else { 65 Hep3Vector u = aaxis.unit(); 66 Hep3Vector u = aaxis.unit(); 66 double ggamma = std::sqrt(1./(1.-b2)); 67 double ggamma = std::sqrt(1./(1.-b2)); 67 double betaDotV = u.dot(pp)*bbeta; 68 double betaDotV = u.dot(pp)*bbeta; 68 double tt = ee; 69 double tt = ee; 69 70 70 ee = ggamma * (tt + betaDotV); 71 ee = ggamma * (tt + betaDotV); 71 pp += ( ((ggamma-1)/b2)*betaDotV*bbeta + g 72 pp += ( ((ggamma-1)/b2)*betaDotV*bbeta + ggamma*bbeta*tt ) * u; 72 // Note: I have verified the behavior of 73 // Note: I have verified the behavior of this even when beta is very 73 // small -- (gamma-1)/b2 becomes in 74 // small -- (gamma-1)/b2 becomes inaccurate by O(1), but it is then 74 // multiplied by O(beta**2) and add 75 // multiplied by O(beta**2) and added to an O(beta) term, so the 75 // inaccuracy does not affect the f 76 // inaccuracy does not affect the final result. 76 } 77 } 77 return *this; 78 return *this; 78 } /* boost (axis, beta) */ 79 } /* boost (axis, beta) */ 79 80 80 } // namespace CLHEP 81 } // namespace CLHEP 81 82