Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
SpaceVectorP.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// SpaceVector
7//
8// This is the implementation of the subset of those methods of the Hep3Vector
9// class which originated from the ZOOM SpaceVector class *and* which involve
10// intrinsic properties or propeties relative to a second vector.
11//
12
13#ifdef GNUPRAGMA
14#pragma implementation
15#endif
16
18
19#include <cmath>
20
21namespace CLHEP {
22
23//-********************************
24// - 5 -
25// Intrinsic properties of a vector
26// and properties relative to a direction
27//
28//-********************************
29
30double Hep3Vector::beta() const {
31 double b = std::sqrt(mag2());
32// if (b >= 1) {
33// std::cerr << "Hep3Vector::beta() - "
34// << "Beta taken for Hep3Vector of at least unit length" << std::endl;
35// }
36 return b;
37}
38
39double Hep3Vector::gamma() const {
40 double bbeta = std::sqrt(mag2());
41// if (bbeta == 1) {
42// std::cerr << "Hep3Vector::gamma() - "
43// << "Gamma taken for Hep3Vector of unit magnitude -- infinite result"
44// << std::endl;
45// }
46// if (bbeta > 1) {
47// std::cerr << "Hep3Vector::gamma() - "
48// << "Gamma taken for Hep3Vector of more than unit magnitude -- \n"
49// << "the sqrt function would return NAN" << std::endl;
50// }
51 return 1/std::sqrt(1-bbeta*bbeta);
52}
53
54double Hep3Vector::rapidity() const {
55// if (std::fabs(dz) == 1) {
56// std::cerr << "Hep3Vector::rapidity() - "
57// << "Rapidity in Z direction taken for Hep3Vector with |Z| = 1 -- \n"
58// << "the log should return infinity" <, std::endl;
59// }
60// if (std::fabs(dz) > 1) {
61// std::cerr << "Hep3Vector::rapidity() - "
62// << "Rapidity in Z direction taken for Hep3Vector with |Z| > 1 -- \n"
63// << "the log would return a NAN" << std::endl;
64// }
65 // Want inverse std::tanh(dz):
66 return (.5 * std::log((1+dz)/(1-dz)) );
67}
68
70 double b = beta();
71// if (b == 1) {
72// std::cerr << "Hep3Vector::coLinearRapidity() - "
73// << "Co-linear Rapidity taken for Hep3Vector of unit length -- \n"
74// << "the log should return infinity" << std::endl;
75// }
76// if (b > 1) {
77// std::cerr << "Hep3Vector::coLinearRapidity() - "
78// << "Co-linear Rapidity taken for Hep3Vector of more than unit length -- \n"
79// << "the log would return a NAN" << std::endl;
80// }
81 // Want inverse std::tanh(b):
82 return (.5 * std::log((1+b)/(1-b)) );
83}
84
85//-***********************************************
86// Other properties relative to a reference vector
87//-***********************************************
88
90 double mag2v2 = v2.mag2();
91 if (mag2v2 == 0) {
92 std::cerr << "Hep3Vector::project() - "
93 << "Attempt to take projection of vector against zero reference vector"
94 << std::endl;
95 return project();
96 }
97 return ( v2 * (dot(v2)/mag2v2) );
98}
99
100double Hep3Vector::rapidity(const Hep3Vector & v2) const {
101 double vmag = v2.mag();
102 if ( vmag == 0 ) {
103 std::cerr << "Hep3Vector::rapidity() - "
104 << "Rapidity taken with respect to zero vector" << std::endl;
105 return 0;
106 }
107 double z1 = dot(v2)/vmag;
108// if (std::fabs(z1) >= 1) {
109// std::cerr << "Hep3Vector::rapidity() - "
110// << "Rapidity taken for too large a Hep3Vector "
111// << "-- would return infinity or NAN" << std::endl;
112// }
113 // Want inverse std::tanh(z):
114 return (.5 * std::log((1+z1)/(1-z1)) );
115}
116
117double Hep3Vector::eta(const Hep3Vector & v2) const {
118 // Defined as -std::log ( std::tan ( .5* theta(u) ) );
119 //
120 // Quicker is to use cosTheta:
121 // std::tan (theta/2) = std::sin(theta)/(1 + std::cos(theta))
122
123 double r1 = getR();
124 double v2r = v2.mag();
125 if ( (r1 == 0) || (v2r == 0) ) {
126 std::cerr << "Hep3Vector::eta() - "
127 << "Cannot find pseudorapidity of a zero vector relative to a vector"
128 << std::endl;
129 return 0.;
130 }
131 double c = dot(v2)/(r1*v2r);
132 if ( c >= 1 ) {
133 c = 1; //-| We don't want to return NAN because of roundoff
134 std::cerr << "Hep3Vector::eta() - "
135 << "Pseudorapidity of vector relative to parallel vector -- \n"
136 << "will give infinite result" << std::endl;
137 // We can just go on; tangent will be 0, so
138 // std::log (tangent) will be -INFINITY, so result
139 // will be +INFINITY.
140 }
141 if ( c <= -1 ) {
142 std::cerr << "Hep3Vector::eta() - "
143 << "Pseudorapidity of vector relative to anti-parallel vector -- \n"
144 << "will give negative infinite result"<< std::endl;
145 //-| We don't want to return NAN because of roundoff
146 return ( negativeInfinity() );
147 // If we just went on, the tangent would be NAN
148 // so return would be NAN. But the proper limit
149 // of tan is +Infinity, so the return should be
150 // -INFINITY.
151 }
152
153 double tangent = std::sqrt (1-c*c) / ( 1 + c );
154 return (- std::log (tangent));
155
156} /* eta (u) */
157
158
159} // namespace CLHEP
double beta() const
Definition: SpaceVectorP.cc:30
double eta() const
double mag2() const
double getR() const
double dot(const Hep3Vector &) const
double negativeInfinity() const
Definition: SpaceVector.cc:283
double mag() const
double rapidity() const
Definition: SpaceVectorP.cc:54
double coLinearRapidity() const
Definition: SpaceVectorP.cc:69
double gamma() const
Definition: SpaceVectorP.cc:39
Hep3Vector project() const
Definition: DoubConv.h:17