Geant4 Cross Reference |
1 // -*- C++ -*- 1 2 // ------------------------------------------- 3 // 4 // This file is a part of the CLHEP - a Class 5 // 6 // This is the implementation of the subset of 7 // class which originated from the ZOOM SpaceV 8 // the esoteric concepts of polar/azimuthal an 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 vecto 20 // 21 //-******************************************* 22 23 24 double Hep3Vector::polarAngle (const Hep3Vecto 25 return std::fabs(v2.getTheta() - getTheta()) 26 } /* polarAngle */ 27 28 double Hep3Vector::polarAngle (const Hep3Vecto 29 const Hep3Vector & ref) const { 30 return std::fabs( v2.angle(ref) - angle(ref) 31 } /* polarAngle (v2, ref) */ 32 33 // double Hep3Vector::azimAngle (const Hep3Vec 34 // is now in the .icc file as deltaPhi(v2) 35 36 double Hep3Vector::azimAngle (const Hep3Vecto 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 ref 43 << "vector 1 -- will return zero" << std 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 ref 51 << "vector 2 -- will return zero" << std 52 return 0; 53 } 54 55 double ang = vperp.angle(v2perp); 56 57 // Now compute the sign of the answer: that 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 67 //-| depending on whether vperp is aligned o 68 //-| The computed angle() expression does th 69 70 } /* azimAngle (v2, ref) */ 71 72 } // namespace CLHEP 73