Geant4 Cross Reference |
1 // -*- C++ -*- 1 2 // CLASSDOC OFF 3 // ------------------------------------------- 4 // CLASSDOC ON 5 // 6 // This file is a part of the CLHEP - a Class 7 // 8 // Hep2Vector is a general 2-vector class defi 9 // dimension using double components. It com 10 // PlaneVector class (the PhysicsVectors Plane 11 // PlaneVector to Hep2Vector). 12 // 13 // .SS See Also 14 // ThreeVector.h 15 // 16 // .SS Authors 17 // John Marraffino and Mark Fischler 18 // 19 20 #ifndef HEP_TWOVECTOR_H 21 #define HEP_TWOVECTOR_H 22 23 #include <iostream> 24 25 #include "CLHEP/Vector/ThreeVector.h" 26 27 namespace CLHEP { 28 29 // Declarations of classes and global methods 30 class Hep2Vector; 31 std::ostream & operator << (std::ostream &, co 32 std::istream & operator >> (std::istream &, He 33 inline double operator * (const Hep2Vector & a 34 inline Hep2Vector operator * (const Hep2Vector 35 inline Hep2Vector operator * (double a, const 36 Hep2Vector operator / (const Hep2Vector 37 inline Hep2Vector operator + (const Hep2Vector 38 inline Hep2Vector operator - (const Hep2Vector 39 40 /** 41 * @author 42 * @ingroup vector 43 */ 44 class Hep2Vector { 45 46 public: 47 48 enum { X=0, Y=1, NUM_COORDINATES=2, SIZE=NUM 49 // Safe indexing of the coordinates when usi 50 51 inline Hep2Vector( double x = 0.0, double y 52 // The constructor. 53 54 inline Hep2Vector(const Hep2Vector & p); 55 inline Hep2Vector(Hep2Vector && p) = default 56 // The copy and move constructors. 57 58 explicit Hep2Vector( const Hep3Vector & ); 59 // "demotion" constructor" 60 // WARNING -- THIS IGNORES THE Z COMPONENT O 61 // SO IN GENERAL, Hep2Vector(v)==v WILL N 62 63 inline ~Hep2Vector(); 64 // The destructor. 65 66 inline double x() const; 67 inline double y() const; 68 // The components in cartesian coordinate sy 69 70 double operator () (int i) const; 71 inline double operator [] (int i) const; 72 // Get components by index. 0-based. 73 74 double & operator () (int i); 75 inline double & operator [] (int i); 76 // Set components by index. 0-based. 77 78 inline void setX(double x); 79 inline void setY(double y); 80 inline void set (double x, double y); 81 // Set the components in cartesian coordinat 82 83 inline double phi() const; 84 // The azimuth angle. 85 86 inline double mag2() const; 87 // The magnitude squared. 88 89 inline double mag() const; 90 // The magnitude. 91 92 inline double r() const; 93 // r in polar coordinates (r, phi): equal t 94 95 inline void setPhi(double phi); 96 // Set phi keeping mag constant. 97 98 inline void setMag(double r); 99 // Set magnitude keeping phi constant. 100 101 inline void setR(double r); 102 // Set R keeping phi constant. Same as setM 103 104 inline void setPolar(double r, double phi); 105 // Set by polar coordinates. 106 107 inline Hep2Vector & operator = (const Hep2Ve 108 inline Hep2Vector & operator = (Hep2Vector & 109 // The copy and move assignment operators. 110 111 inline bool operator == (const Hep2Vector & 112 inline bool operator != (const Hep2Vector & 113 // Comparisons. 114 115 int compare (const Hep2Vector & v) const; 116 bool operator > (const Hep2Vector & v) const 117 bool operator < (const Hep2Vector & v) const 118 bool operator>= (const Hep2Vector & v) const 119 bool operator<= (const Hep2Vector & v) const 120 // dictionary ordering according to y, then 121 122 static inline double getTolerance(); 123 static double setTolerance(double tol); 124 125 double howNear (const Hep2Vector &p) const; 126 bool isNear (const Hep2Vector & p, double e 127 128 double howParallel (const Hep2Vector &p) con 129 bool isParallel 130 (const Hep2Vector & p, double epsilon=tole 131 132 double howOrthogonal (const Hep2Vector &p) c 133 bool isOrthogonal 134 (const Hep2Vector & p, double epsilon=tole 135 136 inline Hep2Vector & operator += (const Hep2V 137 // Addition. 138 139 inline Hep2Vector & operator -= (const Hep2V 140 // Subtraction. 141 142 inline Hep2Vector operator - () const; 143 // Unary minus. 144 145 inline Hep2Vector & operator *= (double a); 146 // Scaling with real numbers. 147 148 inline Hep2Vector unit() const; 149 // Unit vector parallel to this. 150 151 inline Hep2Vector orthogonal() const; 152 // Vector orthogonal to this. 153 154 inline double dot(const Hep2Vector &p) const 155 // Scalar product. 156 157 inline double angle(const Hep2Vector &) cons 158 // The angle w.r.t. another 2-vector. 159 160 void rotate(double); 161 // Rotates the Hep2Vector. 162 163 operator Hep3Vector () const; 164 // Cast a Hep2Vector as a Hep3Vector. 165 166 // The remaining methods are friends, thus d 167 // - - - - - - - - - - - - - - - - - - - - - 168 169 friend std::ostream & operator<< (std::ostre 170 // Output to a stream. 171 172 inline friend double operator * (const Hep2V 173 const Hep2Vector & b); 174 // Scalar product. 175 176 inline friend Hep2Vector operator * (const H 177 // v*c 178 179 inline friend Hep2Vector operator * (double 180 // c*v 181 182 friend Hep2Vector operator / (const H 183 // v/c 184 185 inline friend Hep2Vector operator + (const H 186 const Hep2Vector & b); 187 // v1+v2 188 189 inline friend Hep2Vector operator - (const H 190 const Hep2Vector & b); 191 // v1-v2 192 193 static const int ZMpvToleranceTicks = 100; 194 195 private: 196 197 double dx; 198 double dy; 199 // The components. 200 201 static double tolerance; 202 // default tolerance criterion for isNear() 203 204 }; // Hep2Vector 205 206 static const Hep2Vector X_HAT2(1.0, 0.0); 207 static const Hep2Vector Y_HAT2(0.0, 1.0); 208 209 } // namespace CLHEP 210 211 #include "CLHEP/Vector/TwoVector.icc" 212 213 #endif /* HEP_TWOVECTOR_H */ 214