Files
geant4/source/externals/clhep/src/SpaceVectorD.cc
T
2016-06-09 16:46:55 +02:00

77 lines
2.1 KiB
C++

// -*- C++ -*-
// ---------------------------------------------------------------------------
//
// This file is a part of the CLHEP - a Class Library for High Energy Physics.
//
// This is the implementation of the subset of those methods of the Hep3Vector
// class which originated from the ZOOM SpaceVector class *and* which involve
// the esoteric concepts of polar/azimuthal angular decomposition.
//
#ifdef GNUPRAGMA
#pragma implementation
#endif
#include "CLHEP/Vector/ThreeVector.h"
#include <cmath>
namespace CLHEP {
//-*********************************************
// - 6 -
// Decomposition of an angle between two vectors
//
//-*********************************************
double Hep3Vector::polarAngle (const Hep3Vector & v2) const {
return std::fabs(v2.getTheta() - getTheta());
} /* polarAngle */
double Hep3Vector::polarAngle (const Hep3Vector & v2,
const Hep3Vector & ref) const {
return std::fabs( v2.angle(ref) - angle(ref) );
} /* polarAngle (v2, ref) */
// double Hep3Vector::azimAngle (const Hep3Vector & v2) const
// is now in the .icc file as deltaPhi(v2)
double Hep3Vector::azimAngle (const Hep3Vector & v2,
const Hep3Vector & ref) const {
Hep3Vector vperp ( perpPart(ref) );
if ( vperp.mag2() == 0 ) {
std::cerr << "Hep3Vector::azimAngle() - "
<< "Cannot find azimuthal angle with reference direction parallel to "
<< "vector 1 -- will return zero" << std::endl;
return 0;
}
Hep3Vector v2perp ( v2.perpPart(ref) );
if ( v2perp.mag2() == 0 ) {
std::cerr << "Hep3Vector::azimAngle() - "
<< "Cannot find azimuthal angle with reference direction parallel to "
<< "vector 2 -- will return zero" << std::endl;
return 0;
}
double ang = vperp.angle(v2perp);
// Now compute the sign of the answer: that of U*(VxV2) or
// the equivalent expression V*(V2xU).
if ( dot(v2.cross(ref)) >= 0 ) {
return ang;
} else {
return -ang;
}
//-| Note that if V*(V2xU) is zero, we want to return 0 or PI
//-| depending on whether vperp is aligned or antialigned with v2perp.
//-| The computed angle() expression does this properly.
} /* azimAngle (v2, ref) */
} // namespace CLHEP