1 #include "../inc/vector3.h"
2 #include "../inc/projection.h"
3 #include <boost/version.hpp>
16 void Vector3::operator=(
const Base_Vector &r)
18 Base_Vector::operator=(r);
21 bool Vector3::operator!=(
const Vector3 &r)
23 return (r.x()!=x() || r.y()!=y() || r.z()!=z());
27 Vector3::Vector3(
const double &c1,
const double &c2,
const double &c3)
29 #if BOOST_VERSION>=103300
40 double Vector3::x()
const
44 double Vector3::y()
const
48 double Vector3::z()
const
64 double Vector3::px()
const
68 double Vector3::py()
const
72 double Vector3::pz()
const
76 double & Vector3::px()
80 double & Vector3::py()
84 double & Vector3::pz()
88 double Vector3::mag2()
const
90 return boost::numeric::ublas::inner_prod(*
this,*
this);
92 double Vector3::mag()
const
94 return std::sqrt(boost::numeric::ublas::inner_prod(*
this,*
this));
101 return std::sqrt(boost::numeric::ublas::inner_prod(*
this,*
this));
103 return std::sqrt(pow(this->x(),2) + pow(this->y(),2));
105 return fabs(this->z());
115 return boost::numeric::ublas::inner_prod(*
this,*
this);
117 return pow(this->x(),2) + pow(this->y(),2);
119 return pow(this->z(),2);
125 double Vector3::p2()
const
129 double Vector3::p()
const
134 double Vector3::r()
const
138 double Vector3::theta()
const
140 return operator()(0) == 0.0 && operator()(1) == 0.0 && operator()(2) == 0.0 ? 0.0 : std::atan2(perp(),
operator()(2));
142 double Vector3::phi()
const
144 return operator()(0) == 0.0 && operator()(1) == 0.0 ? 0.0 : std::atan2(
operator()(1),
operator()(0));
146 double Vector3::cosTheta()
const
148 const double ptot = mag();
149 return ptot == 0.0 ? 1.0 : operator()(2)/ptot;
152 double Vector3::perp2()
const
154 return operator()(0)*operator()(0)+operator()(1)*operator()(1);
156 double Vector3::perp()
const
158 return std::sqrt(perp2());
161 double Vector3::pt2()
const
165 double Vector3::pt()
const
170 double Vector3::eta()
const
172 const double m = mag();
173 if (m == 0.0)
return 0.0;
174 const double tz = z();
175 if (m == tz)
return 1.0E72;
176 if (m == -tz)
return -1.0E72;
177 return 0.5*std::log( (m+tz)/(m-tz) );
181 void Vector3::makeUnit()
183 const double m = mag();
192 Vector3 Vector3::unit()
const
194 const double m = mag();
196 return Vector3(x() / m,y() / m,z() / m);
198 return Vector3(x(),y(),z());
202 double Vector3::dot(
const Vector3 &v)
const
204 return boost::numeric::ublas::inner_prod(*
this,v);
208 Vector3 Vector3::cross(
const Vector3 &v)
const
210 return Vector3(y()*v.z()-z()*v.y(),z()*v.x()-x()*v.z(),x()*v.y()-y()*v.x());
213 Vector3 Vector3::subtract(
const Vector3 &v)
const
215 return Vector3(x()-v.x(), y()-v.y(), z()-v.z());
218 Vector3 Vector3::add(
const Vector3 &v)
const
220 return Vector3(x()+v.x(), y()+v.y(), z()+v.z());
223 Vector3 Vector3::mult(
double k)
const
225 return Vector3(x()*k, y()*k, z()*k);
228 double Vector3::distanceTo(
const Vector3 &v)
const
230 return (this->subtract(v)).mag();
233 double Vector3::distanceTo2(
const Vector3 &v)
const
235 return (this->subtract(v)).mag2();
238 double Vector3::distanceToLine(
const Vector3 &Point,
const Vector3 &Direction)
const
240 return std::sqrt(distanceToLine2(Point, Direction));
243 double Vector3::distanceToLine2(
const Vector3 &Point,
const Vector3 &Direction)
const
245 if (Direction.mag()==0)
249 Vector3 P2 = Point+Direction;
250 Vector3 P3 = Vector3(x(),y(),z());
253 double u = (((P3.x()-P1.x())*(P2.x()-P1.x())) + ((P3.y()-P1.y())*(P2.y()-P1.y())) + ((P3.z()-P1.z())*(P2.z()-P1.z()))) / (P2.subtract(P1)).mag2();
254 Vector3 PerpPoint = P1+((P2-P1)*u);
256 return PerpPoint.distanceTo2(P3);
259 std::vector<double> Vector3::stlVector()
const
261 std::vector<double> out;
Projection
Projection Type.