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 subset of 6 // This is the implementation of the subset of those methods of the Hep3Vector 7 // class which originated from the ZOOM SpaceV 7 // class which originated from the ZOOM SpaceVector class *and* which involve 8 // the esoteric concepts of polar/azimuthal an 8 // the esoteric concepts of polar/azimuthal angular decomposition. 9 // 9 // 10 10 >> 11 #ifdef GNUPRAGMA >> 12 #pragma implementation >> 13 #endif >> 14 11 #include "CLHEP/Vector/ThreeVector.h" 15 #include "CLHEP/Vector/ThreeVector.h" 12 16 13 #include <cmath> 17 #include <cmath> 14 18 15 namespace CLHEP { 19 namespace CLHEP { 16 20 17 //-******************************************* 21 //-********************************************* 18 // - 6 - 22 // - 6 - 19 // Decomposition of an angle between two vecto 23 // Decomposition of an angle between two vectors 20 // 24 // 21 //-******************************************* 25 //-********************************************* 22 26 23 27 24 double Hep3Vector::polarAngle (const Hep3Vecto 28 double Hep3Vector::polarAngle (const Hep3Vector & v2) const { 25 return std::fabs(v2.getTheta() - getTheta()) 29 return std::fabs(v2.getTheta() - getTheta()); 26 } /* polarAngle */ 30 } /* polarAngle */ 27 31 28 double Hep3Vector::polarAngle (const Hep3Vecto 32 double Hep3Vector::polarAngle (const Hep3Vector & v2, 29 const Hep3Vector & ref) const { 33 const Hep3Vector & ref) const { 30 return std::fabs( v2.angle(ref) - angle(ref) 34 return std::fabs( v2.angle(ref) - angle(ref) ); 31 } /* polarAngle (v2, ref) */ 35 } /* polarAngle (v2, ref) */ 32 36 33 // double Hep3Vector::azimAngle (const Hep3Vec 37 // double Hep3Vector::azimAngle (const Hep3Vector & v2) const 34 // is now in the .icc file as deltaPhi(v2) 38 // is now in the .icc file as deltaPhi(v2) 35 39 36 double Hep3Vector::azimAngle (const Hep3Vecto 40 double Hep3Vector::azimAngle (const Hep3Vector & v2, 37 const Hep3Vector & ref) const { 41 const Hep3Vector & ref) const { 38 42 39 Hep3Vector vperp ( perpPart(ref) ); 43 Hep3Vector vperp ( perpPart(ref) ); 40 if ( vperp.mag2() == 0 ) { 44 if ( vperp.mag2() == 0 ) { 41 std::cerr << "Hep3Vector::azimAngle() - " 45 std::cerr << "Hep3Vector::azimAngle() - " 42 << "Cannot find azimuthal angle with ref 46 << "Cannot find azimuthal angle with reference direction parallel to " 43 << "vector 1 -- will return zero" << std 47 << "vector 1 -- will return zero" << std::endl; 44 return 0; 48 return 0; 45 } 49 } 46 50 47 Hep3Vector v2perp ( v2.perpPart(ref) ); 51 Hep3Vector v2perp ( v2.perpPart(ref) ); 48 if ( v2perp.mag2() == 0 ) { 52 if ( v2perp.mag2() == 0 ) { 49 std::cerr << "Hep3Vector::azimAngle() - " 53 std::cerr << "Hep3Vector::azimAngle() - " 50 << "Cannot find azimuthal angle with ref 54 << "Cannot find azimuthal angle with reference direction parallel to " 51 << "vector 2 -- will return zero" << std 55 << "vector 2 -- will return zero" << std::endl; 52 return 0; 56 return 0; 53 } 57 } 54 58 55 double ang = vperp.angle(v2perp); 59 double ang = vperp.angle(v2perp); 56 60 57 // Now compute the sign of the answer: that 61 // Now compute the sign of the answer: that of U*(VxV2) or 58 // the equivalent expression V*(V2xU). 62 // the equivalent expression V*(V2xU). 59 63 60 if ( dot(v2.cross(ref)) >= 0 ) { 64 if ( dot(v2.cross(ref)) >= 0 ) { 61 return ang; 65 return ang; 62 } else { 66 } else { 63 return -ang; 67 return -ang; 64 } 68 } 65 69 66 //-| Note that if V*(V2xU) is zero, we want 70 //-| Note that if V*(V2xU) is zero, we want to return 0 or PI 67 //-| depending on whether vperp is aligned o 71 //-| depending on whether vperp is aligned or antialigned with v2perp. 68 //-| The computed angle() expression does th 72 //-| The computed angle() expression does this properly. 69 73 70 } /* azimAngle (v2, ref) */ 74 } /* azimAngle (v2, ref) */ 71 75 72 } // namespace CLHEP 76 } // namespace CLHEP 73 77