File indexing completed on 2023-03-17 10:50:00
0001 #ifndef GeometryVector_Vector3DBase_h
0002 #define GeometryVector_Vector3DBase_h
0003
0004 #include "DataFormats/GeometryVector/interface/VectorTag.h"
0005 #include "DataFormats/GeometryVector/interface/PV3DBase.h"
0006
0007 template <class T, class FrameTag>
0008 class Vector3DBase : public PV3DBase<T, VectorTag, FrameTag> {
0009 public:
0010 typedef PV3DBase<T, VectorTag, FrameTag> BaseClass;
0011 typedef Vector3DBase<T, FrameTag> VectorType;
0012 typedef typename BaseClass::Cylindrical Cylindrical;
0013 typedef typename BaseClass::Spherical Spherical;
0014 typedef typename BaseClass::Polar Polar;
0015 typedef typename BaseClass::BasicVectorType BasicVectorType;
0016
0017
0018
0019
0020
0021 Vector3DBase() {}
0022
0023
0024
0025
0026 template <class U>
0027 Vector3DBase(const Vector3DBase<U, FrameTag>& v) : BaseClass(v.basicVector()) {}
0028
0029
0030 Vector3DBase(const T& x, const T& y, const T& z) : BaseClass(x, y, z) {}
0031
0032
0033
0034 explicit Vector3DBase(const Cylindrical& set) : BaseClass(set) {}
0035
0036
0037 explicit Vector3DBase(const Polar& set) : BaseClass(set) {}
0038
0039
0040
0041
0042 Vector3DBase(const Geom::Theta<T>& th, const Geom::Phi<T>& ph, const T& r) : BaseClass(th, ph, r) {}
0043
0044
0045
0046
0047
0048 template <class U>
0049 explicit Vector3DBase(const Basic3DVector<U>& v) : BaseClass(v) {}
0050
0051
0052
0053
0054 Vector3DBase unit() const { return Vector3DBase(this->basicVector().unit()); }
0055
0056
0057 bool operator==(const Vector3DBase& rh) const { return this->basicVector() == rh.basicVector(); }
0058
0059
0060
0061
0062 template <class U>
0063 Vector3DBase& operator+=(const Vector3DBase<U, FrameTag>& v) {
0064 this->theVector += v.basicVector();
0065 return *this;
0066 }
0067
0068
0069
0070
0071 template <class U>
0072 Vector3DBase& operator-=(const Vector3DBase<U, FrameTag>& v) {
0073 this->theVector -= v.basicVector();
0074 return *this;
0075 }
0076
0077
0078 Vector3DBase operator-() const { return Vector3DBase(-this->basicVector()); }
0079
0080
0081 Vector3DBase& operator*=(const T& t) {
0082 this->theVector *= t;
0083 return *this;
0084 }
0085
0086
0087 Vector3DBase& operator/=(const T& t) {
0088 this->theVector /= t;
0089 return *this;
0090 }
0091
0092
0093
0094
0095
0096
0097
0098 template <class U>
0099 typename PreciseFloatType<T, U>::Type dot(const Vector3DBase<U, FrameTag>& v) const {
0100 return this->theVector.dot(v.basicVector());
0101 }
0102
0103
0104
0105
0106
0107
0108
0109 template <class U>
0110 Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> cross(const Vector3DBase<U, FrameTag>& v) const {
0111 typedef Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> RT;
0112 return RT(this->theVector.cross(v.basicVector()));
0113 }
0114 };
0115
0116
0117 template <class T, class U, class FrameTag>
0118 inline Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> operator+(const Vector3DBase<T, FrameTag>& v1,
0119 const Vector3DBase<U, FrameTag>& v2) {
0120 typedef Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> RT;
0121 return RT(v1.basicVector() + v2.basicVector());
0122 }
0123
0124 template <class T, class U, class FrameTag>
0125 inline Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> operator-(const Vector3DBase<T, FrameTag>& v1,
0126 const Vector3DBase<U, FrameTag>& v2) {
0127 typedef Vector3DBase<typename PreciseFloatType<T, U>::Type, FrameTag> RT;
0128 return RT(v1.basicVector() - v2.basicVector());
0129 }
0130
0131
0132 template <class T, class U, class FrameTag>
0133 inline typename PreciseFloatType<T, U>::Type operator*(const Vector3DBase<T, FrameTag>& v1,
0134 const Vector3DBase<U, FrameTag>& v2) {
0135 return v1.basicVector() * v2.basicVector();
0136 }
0137
0138
0139
0140
0141 template <class T, class FrameTag, class Scalar>
0142 inline Vector3DBase<T, FrameTag> operator*(const Vector3DBase<T, FrameTag>& v, const Scalar& s) {
0143 return Vector3DBase<T, FrameTag>(v.basicVector() * s);
0144 }
0145
0146
0147 template <class T, class FrameTag, class Scalar>
0148 inline Vector3DBase<T, FrameTag> operator*(const Scalar& s, const Vector3DBase<T, FrameTag>& v) {
0149 return Vector3DBase<T, FrameTag>(v.basicVector() * s);
0150 }
0151
0152
0153
0154
0155 template <class T, class FrameTag, class Scalar>
0156 inline Vector3DBase<T, FrameTag> operator/(const Vector3DBase<T, FrameTag>& v, const Scalar& s) {
0157 return Vector3DBase<T, FrameTag>(v.basicVector() / s);
0158 }
0159
0160 #endif