CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

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