1 #ifndef _utl_BasicVector_h_
2 #define _utl_BasicVector_h_
12 #include <CLHEP/Geometry/Normal3D.h>
13 #include <CLHEP/Geometry/Point3D.h>
14 #include <CLHEP/Geometry/Vector3D.h>
15 #include <boost/tuple/tuple.hpp>
16 #include <utl/CoordinateSystem.h>
17 #include <utl/unconfig.h>
18 #include <utl/config.h>
19 #include <utl/GeometryException.h>
20 #include <utl/ConsecutiveEnumFactory.h>
21 #include <utl/ThrowPolicy.h>
41 template<
class HepVector>
51 virtual double X(
double p1,
double p2,
double p3)
const = 0;
52 virtual double Y(
double p1,
double p2,
double p3)
const = 0;
53 virtual double Z(
double p1,
double p2,
double p3)
const = 0;
95 e <<
"No conversion from enum value " << k <<
" to utl::BasicVector<HepVector>::CoordinateType";
118 virtual double X(
double x,
double ,
double )
const override {
return x; }
119 virtual double Y(
double ,
double y,
double )
const override {
return y; }
120 virtual double Z(
double ,
double ,
double z)
const override {
return z; }
129 virtual double X(
double rho,
double phi,
double z)
const override;
130 virtual double Y(
double rho,
double phi,
double z)
const override;
131 virtual double Z(
double rho,
double phi,
double z)
const override;
140 virtual double X(
double r,
double theta,
double phi)
const override;
141 virtual double Y(
double r,
double theta,
double phi)
const override;
142 virtual double Z(
double r,
double theta,
double phi)
const override;
147 typedef typename boost::tuple<double, double, double>
Triple;
194 fVector(t.X(p1, p2, p3), t.Y(p1, p2, p3), t.Z(p1, p2, p3))
204 {
return !(*
this == v); }
207 { TransformTo(coordinateSystem);
return fVector.x(); }
210 { TransformTo(coordinateSystem);
return fVector.y(); }
213 { TransformTo(coordinateSystem);
return fVector.z(); }
220 TransformTo(coordinateSystem);
249 { TransformTo(coordinateSystem);
return fVector.theta(); }
252 { TransformTo(coordinateSystem);
return fVector.cosTheta(); }
255 { TransformTo(coordinateSystem);
return fVector.phi(); }
258 { TransformTo(coordinateSystem);
return fVector.mag(); }
261 { TransformTo(coordinateSystem);
return fVector.mag2(); }
264 { TransformTo(coordinateSystem);
return fVector.perp(); }
267 { TransformTo(coordinateSystem);
return fVector.perp2(); }
274 TransformTo(coordinateSystem);
283 TransformTo(coordinateSystem);
307 return d / (
fVector.mag2() + v.fVector.mag2()) < eps*eps;
320 if (!SameCoordinateSystem(newCoordinateSystem)) {
333 static const CCartesian kCartesian;
Simple factory to create an enumerator for a given enumeration.
virtual double X(double rho, double phi, double z) const override
virtual double Z(double p1, double p2, double p3) const =0
virtual ~CoordinateType()=default
BasicVector< HepGeom::Point3D< double > > PointBase
BasicVector(const double x, const double y, const double z, const CoordinateSystemPtr &coordinateSystem)
Construct a point from cartesian coordinates.
BasicVector< HepGeom::Vector3D< double > > VectorBase
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
double GetR(const CoordinateSystemPtr &coordinateSystem) const
radius r in spherical coordinates coordinates (distance to origin)
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
void Normalize()
normalize the vector
CoordinateSystemPtr GetCoordinateSystem() const
Get the coordinate system of the current internal representation.
BasicVector & operator*=(const double a)
Multiply by number.
double GetCosTheta(const CoordinateSystemPtr &coordinateSystem) const
cos of zenith (theta) angle
static const double fgEpsilon
~BasicVector()=default
Destructor - NOT virtual since class is NEVER used polymorphically.
virtual double Z(double rho, double phi, double z) const override
virtual double Z(double, double, double z) const override
bool operator!=(const BasicVector &v) const
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
Kind
Coordinate type integral typification.
Basic vector class template for geometry.
DataType TransformedVector(const CoordinateSystemPtr &newCoordinateSystem) const
double GetX(const CoordinateSystemPtr &coordinateSystem) const
static const CCylindrical kCylindrical
virtual double Y(double, double y, double) const override
static const CoordinateType & Create(const Kind k)
Factory method via enumeration.
static const CSpherical kSpherical
double GetR2(const CoordinateSystemPtr &coordinateSystem) const
radius r^2 in spherical coordinates coordinates (distance to origin)^2
double GetRho(const CoordinateSystemPtr &coordinateSystem) const
radius r in cylindrical coordinates (distance to z axis)
BasicVector(const DataType &v, const CoordinateSystemPtr &coordinateSystem)
Constructor from internal components for use by operators.
virtual double Z(double r, double theta, double phi) const override
utl::ConsecutiveEnumFactory< Kind, eSpherical, fgKindTags, utl::ThrowPolicy< Kind, CoordinateSystemException > > KindCreator
Convenience typedef for creation of Kind enumerators.
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Class to have a type for indicating cylindrical coordinate components.
return boost::make_tuple(fVector.x(), fVector.y(), fVector.z())
CoordinateSystemPtr fCoordinateSystem
BasicVector< HepGeom::Normal3D< double > > AxialVectorBase
static const char *const fgKindTags[3]
Base class for classes indicating coordinate types.
double GetRho2(const CoordinateSystemPtr &coordinateSystem) const
radius r^2 in cylindrical coordinates (distance to z axis)^2
virtual double X(double p1, double p2, double p3) const =0
bool operator==(const BasicVector &v) const
Exception dealing with coordinate systems.
virtual double X(double x, double, double) const override
Class to have a type for indicating spherical coordinate components.
void CoordinateSystemValid(const CoordinateSystemPtr &theCoordinateSystem)
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
BasicVector & operator/=(const double a)
Divide by number.
virtual double Y(double rho, double phi, double z) const override
virtual double X(double r, double theta, double phi) const override
virtual double Y(double r, double theta, double phi) const override
virtual double Y(double p1, double p2, double p3) const =0
BasicVector(double p1, double p2, double p3, const CoordinateSystemPtr &coordinateSystem, const CoordinateType &t)
Construct a point from coordinates in arbitrary representation.
Class to have a type for indicating cartesian coordinate components.