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