14 #pragma implementation
17 #include "CLHEP/Vector/ThreeVector.h"
18 #include "CLHEP/Units/PhysicalConstants.h"
25 void Hep3Vector::setMag(
double ma) {
28 std::cerr <<
"Hep3Vector::setMag() - "
29 <<
"zero vector can't be stretched" << std::endl;
38 Hep3Vector & Hep3Vector::rotateUz(
const Hep3Vector& NewUzVector) {
41 double u1 = NewUzVector.x();
42 double u2 = NewUzVector.y();
43 double u3 = NewUzVector.z();
44 double up = u1*u1 + u2*u2;
48 double px = dx, py = dy, pz = dz;
49 dx = (u1*u3*px - u2*py)/up + u1*pz;
50 dy = (u2*u3*px + u1*py)/up + u2*pz;
53 else if (u3 < 0.) { dx = -dx; dz = -dz; }
58 double Hep3Vector::pseudoRapidity()
const {
60 if ( m1== 0 )
return 0.0;
61 if ( m1==
z() )
return 1.0E72;
62 if ( m1== -
z() )
return -1.0E72;
63 return 0.5*std::log( (m1+
z())/(m1-
z()) );
66 std::ostream &
operator<< (std::ostream & os,
const Hep3Vector & v) {
67 return os <<
"(" << v.x() <<
"," << v.y() <<
"," << v.z() <<
")";
71 double & x,
double & y,
double &
z );
73 std::istream &
operator>>(std::istream & is, Hep3Vector & v) {
80 const Hep3Vector
HepXHat(1.0, 0.0, 0.0);
81 const Hep3Vector
HepYHat(0.0, 1.0, 0.0);
82 const Hep3Vector
HepZHat(0.0, 0.0, 1.0);
90 Hep3Vector & Hep3Vector::rotateX (
double phi1) {
91 double sinphi = std::sin(phi1);
92 double cosphi = std::cos(phi1);
94 ty = dy * cosphi - dz * sinphi;
95 dz = dz * cosphi + dy * sinphi;
100 Hep3Vector & Hep3Vector::rotateY (
double phi1) {
101 double sinphi = std::sin(phi1);
102 double cosphi = std::cos(phi1);
104 tz = dz * cosphi - dx * sinphi;
105 dx = dx * cosphi + dz * sinphi;
110 Hep3Vector & Hep3Vector::rotateZ (
double phi1) {
111 double sinphi = std::sin(phi1);
112 double cosphi = std::cos(phi1);
114 tx = dx * cosphi - dy * sinphi;
115 dy = dy * cosphi + dx * sinphi;
120 bool Hep3Vector::isNear(
const Hep3Vector & v,
double epsilon)
const {
121 double limit = dot(v)*epsilon*epsilon;
122 return ( (*
this - v).mag2() <= limit );
125 double Hep3Vector::howNear(
const Hep3Vector & v )
const {
127 double d = (*
this - v).mag2();
129 if ( (vdv > 0) && (d < vdv) ) {
130 return std::sqrt (d/vdv);
131 }
else if ( (vdv == 0) && (d == 0) ) {
138 double Hep3Vector::deltaPhi (
const Hep3Vector & v2)
const {
139 double dphi = v2.getPhi() - getPhi();
141 dphi -= CLHEP::twopi;
143 dphi += CLHEP::twopi;
148 double Hep3Vector::deltaR (
const Hep3Vector & v )
const {
149 double a = eta() - v.eta();
150 double b = deltaPhi(v);
151 return std::sqrt ( a*a + b*b );
154 double Hep3Vector::cosTheta(
const Hep3Vector & q)
const {
156 double ptot2 = mag2()*q.mag2();
160 arg = dot(q)/std::sqrt(ptot2);
161 if(arg > 1.0) arg = 1.0;
162 if(arg < -1.0) arg = -1.0;
167 double Hep3Vector::cos2Theta(
const Hep3Vector & q)
const {
169 double ptot2 = mag2();
170 double qtot2 = q.mag2();
171 if ( ptot2 == 0 || qtot2 == 0 ) {
175 arg = (pdq/ptot2) * (pdq/qtot2);
178 if(arg > 1.0) arg = 1.0;
183 void Hep3Vector::setEta (
double eta1) {
186 if ( (dx == 0) && (dy == 0) ) {
188 std::cerr <<
"Hep3Vector::setEta() - "
189 <<
"Attempt to set eta of zero vector -- vector is unchanged"
193 std::cerr <<
"Hep3Vector::setEta() - "
194 <<
"Attempt to set eta of vector along Z axis -- will use phi = 0"
201 double tanHalfTheta = std::exp ( -eta1 );
203 (1 - tanHalfTheta*tanHalfTheta) / (1 + tanHalfTheta*tanHalfTheta);
205 double rho1 = r1*std::sqrt(1 - cosTheta1*cosTheta1);
206 dy = rho1 * std::sin (phi1);
207 dx = rho1 * std::cos (phi1);
211 void Hep3Vector::setCylTheta (
double theta1) {
215 if ( (dx == 0) && (dy == 0) ) {
217 std::cerr <<
"Hep3Vector::setCylTheta() - "
218 <<
"Attempt to set cylTheta of zero vector -- vector is unchanged"
230 std::cerr <<
"Hep3Vector::setCylTheta() - "
231 <<
"Attempt set cylindrical theta of vector along Z axis "
232 <<
"to a non-trivial value, while keeping rho fixed -- "
233 <<
"will return zero vector" << std::endl;
237 if ( (theta1 < 0) || (theta1 >
CLHEP::pi) ) {
238 std::cerr <<
"Hep3Vector::setCylTheta() - "
239 <<
"Setting Cyl theta of a vector based on a value not in [0, PI]"
243 double phi1 (getPhi());
244 double rho1 = getRho();
245 if ( (theta1 == 0) || (theta1 ==
CLHEP::pi) ) {
246 std::cerr <<
"Hep3Vector::setCylTheta() - "
247 <<
"Attempt to set cylindrical theta to 0 or PI "
248 <<
"while keeping rho fixed -- infinite Z will be computed"
250 dz = (theta1==0) ? 1.0E72 : -1.0E72;
253 dz = rho1 / std::tan (theta1);
254 dy = rho1 * std::sin (phi1);
255 dx = rho1 * std::cos (phi1);
259 void Hep3Vector::setCylEta (
double eta1) {
263 double theta1 = 2 * std::atan ( std::exp (-eta1) );
270 if ( (dx == 0) && (dy == 0) ) {
272 std::cerr <<
"Hep3Vector::setCylEta() - "
273 <<
"Attempt to set cylEta of zero vector -- vector is unchanged"
285 std::cerr <<
"Hep3Vector::setCylEta() - "
286 <<
"Attempt set cylindrical eta of vector along Z axis "
287 <<
"to a non-trivial value, while keeping rho fixed -- "
288 <<
"will return zero vector" << std::endl;
292 double phi1 (getPhi());
293 double rho1 = getRho();
294 dz = rho1 / std::tan (theta1);
295 dy = rho1 * std::sin (phi1);
296 dx = rho1 * std::cos (phi1);
301 Hep3Vector
operator/ (
const Hep3Vector & v1,
double c ) {
307 double oneOverC = 1.0/c;
308 return Hep3Vector ( v1.x() * oneOverC,
313 Hep3Vector & Hep3Vector::operator/= (
double c) {
320 double oneOverC = 1.0/c;
HepLorentzVector operator/(const HepLorentzVector &w, double c)
const Hep3Vector HepYHat(0.0, 1.0, 0.0)
static const G4double tolerance
const Hep3Vector HepXHat(1.0, 0.0, 0.0)
std::istream & operator>>(std::istream &is, HepAxisAngle &aa)
static const G4double factor
std::ostream & operator<<(std::ostream &os, const HepAxisAngle &aa)
const Hep3Vector HepZHat(0.0, 0.0, 1.0)
void ZMinput3doubles(std::istream &is, const char *type, double &x, double &y, double &z)