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