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