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